Difference between revisions of "User:Kireji Haiku/SIMchat headset"
Kireji Haiku (talk | contribs) m (saving some script memory, causing less lag and made minor speed-improvements) |
Kireji Haiku (talk | contribs) m (→Script:) |
||
Line 27: | Line 27: | ||
==Script:== | ==Script:== | ||
<lsl> | <lsl> | ||
string | key ownerKey; | ||
string ownerName; | |||
integer | integer KEY1 = 11111111; | ||
integer KEY2 = 22222222; | |||
integer KEY3 = 33333333; | |||
integer KEY4 = 44444444; | |||
integer COMM_CHANNEL = 9; | |||
integer CYCLES = 6; | |||
list cypherkey = []; | |||
integer delta = 0x9E3779B9; | |||
integer | |||
integer | integer ord(string chr) | ||
{ | { | ||
if( | string ASCII = " \n !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"; | ||
return | |||
if(llStringLength(chr) != 1) | |||
return -1; | |||
if(chr == " ") | |||
return 32; | |||
return llSubStringIndex(ASCII, chr); | |||
} | } | ||
string | string chr(integer i) | ||
{ | { | ||
string ASCII = " \n !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"; | |||
i %= 127; | |||
return llGetSubString(ASCII, i, i); | |||
string | |||
} | } | ||
string | string DWord2Hex(integer m) | ||
{ | { | ||
string result; | |||
integer i = 0; | |||
integer index = 0; | |||
string characters = "0123456789ABCDEF"; | |||
for (i = 0; i < 8; i++) | |||
{ | { | ||
index = (m >> (i * 4)) & 0xF; | |||
result = llInsertString(result, 0, llGetSubString(characters,index,index)); | |||
} | } | ||
return result; | |||
return | |||
} | } | ||
integer Hex2DWord(string m) | |||
{ | { | ||
integer | integer result = 0; | ||
integer i = 0; | |||
string digit; | |||
integer | integer value; | ||
integer index; | |||
string characters = "0123456789ABCDEF"; | |||
for (i = 0; i < 8; i++) | |||
{ | |||
index = 8 - (i + 1); | |||
digit = llGetSubString(m,index,index); | |||
value = llSubStringIndex(characters, digit); | |||
result = result | value << (i * 4); | |||
} | |||
return result; | |||
} | |||
string Encrypt(string cleartext) | |||
{ | |||
integer dword1 = 0; | |||
integer dword2 = 0; | |||
integer cyphertext_numeric; | |||
list cypherblock; | |||
string cyphertext = ""; | |||
while(llStringLength(cleartext) & 0x7) | |||
cleartext += " "; | |||
integer stringlength = llStringLength(cleartext); | |||
integer i=0; | |||
integer character; | |||
while (i < stringlength) | |||
{ | |||
dword1 = ord(llGetSubString(cleartext,i,i)); | |||
i++; | |||
dword1 = dword1 | (ord(llGetSubString(cleartext,i,i)) << 8); | |||
i++; | |||
dword1 = dword1 | (ord(llGetSubString(cleartext,i,i)) << 16); | |||
i++; | |||
dword1 = dword1 | (ord(llGetSubString(cleartext,i,i)) << 24); | |||
i++; | |||
dword2 = ord(llGetSubString(cleartext,i,i)); | |||
i++; | |||
dword2 = dword2 | ord(llGetSubString(cleartext,i,i)) << 8; | |||
i++; | |||
dword2 = dword2 | ord(llGetSubString(cleartext,i,i)) << 16; | |||
i++; | |||
dword2 = dword2 | ord(llGetSubString(cleartext,i,i)) << 24; | |||
i++; | |||
cypherblock = TEAEncrypt(dword1,dword2,cypherkey); | |||
cyphertext = cyphertext + DWord2Hex(llList2Integer(cypherblock,0)) + DWord2Hex(llList2Integer(cypherblock,1)); | |||
dword1 = 0; | |||
dword2 = 0; | |||
cypherblock = []; | |||
} | |||
return cyphertext; | |||
} | |||
string Decrypt(string cyphertext) | |||
{ | |||
string hexvalue1 = ""; | |||
string hexvalue2 = ""; | |||
integer dword1 = 0; | |||
integer dword2 = 0; | |||
list clearblock = []; | |||
string cleartext = ""; | |||
integer i; | |||
while (i < llStringLength(cyphertext)) | |||
{ | |||
hexvalue1 += llGetSubString(cyphertext,i,i + 7); | |||
i = i + 8; | |||
hexvalue2 += llGetSubString(cyphertext,i,i + 7); | |||
i = i + 8; | |||
dword1 = Hex2DWord(hexvalue1); | |||
dword2 = Hex2DWord(hexvalue2); | |||
clearblock = TEADecrypt(dword1, dword2, cypherkey); | |||
cleartext += chr( llList2Integer(clearblock,0) & 0x000000FF); | |||
cleartext += chr( (llList2Integer(clearblock,0) & 0x0000FF00) >> 8); | |||
cleartext += chr( (llList2Integer(clearblock,0) & 0x00FF0000) >> 16); | |||
cleartext += chr( (llList2Integer(clearblock,0) & 0xFF000000) >> 24); | |||
cleartext += chr( llList2Integer(clearblock,1) & 0x000000FF); | |||
cleartext += chr( (llList2Integer(clearblock,1) & 0x0000FF00) >> 8); | |||
cleartext += chr( (llList2Integer(clearblock,1) & 0x00FF0000) >> 16); | |||
cleartext += chr( (llList2Integer(clearblock,1) & 0xFF000000) >> 24); | |||
hexvalue1 = ""; | |||
hexvalue2 = ""; | |||
dword1 = 0; | |||
dword2 = 0; | |||
clearblock = []; | |||
} | |||
return cleartext; | |||
} | } | ||
list TEAEncrypt(integer dword1, integer dword2,list cypherkey) | |||
{ | { | ||
list cryptlist = []; | |||
integer n = CYCLES; | |||
integer sum = 0; | |||
while (n-- > 0) | |||
{ | |||
dword1 = dword1 + ( ( dword2 << 4 ^ ((dword2 >> 5) & 0x07FFFFFF) ) + dword2 ^ sum + llList2Integer(cypherkey, (sum & 3) ) ); | |||
sum += delta; | |||
dword2 = dword2 + ( ( dword1 << 4 ^ ((dword1 >> 5) & 0x07FFFFFF) ) + dword1 ^ sum + llList2Integer(cypherkey, ((sum >> 11) & 3) ) ); | |||
} | |||
cryptlist = [dword1,dword2]; | |||
return cryptlist; | |||
} | } | ||
list TEADecrypt(integer dword1, integer dword2,list cypherkey) | |||
{ | { | ||
list cryptlist = []; | |||
integer n = CYCLES; | |||
integer sum = delta * CYCLES; | |||
while (n-- > 0) | |||
{ | |||
dword2 = dword2 - ( ( dword1 << 4 ^ ((dword1 >> 5) & 0x07FFFFFF) ) + dword1 ^ sum + llList2Integer(cypherkey, ((sum >> 11) & 3) ) ); | |||
sum -= delta; | |||
dword1 = dword1 - ( ( dword2 << 4 ^ ((dword2 >> 5) & 0x07FFFFFF) ) + dword2 ^ sum + llList2Integer(cypherkey, (sum & 3) ) ); | |||
} | |||
cryptlist = [dword1,dword2]; | |||
return cryptlist; | |||
} | } | ||
default | default | ||
{ | { | ||
on_rez(integer start_param) | on_rez(integer start_param) | ||
{ | { | ||
llResetScript(); | if (llGetOwner() != ownerKey) | ||
{ | |||
llReleaseControls(); | |||
llResetScript(); | |||
} | |||
} | } | ||
changed(integer change) | |||
{ | { | ||
if ( | if (change & CHANGED_OWNER) | ||
{ | { | ||
llReleaseControls(); | |||
llResetScript(); | llResetScript(); | ||
} | } | ||
} | } | ||
state_entry() | |||
{ | |||
ownerKey = llGetOwner(); | |||
ownerName = llKey2Name(ownerKey); | |||
cypherkey = [KEY1,KEY2,KEY3,KEY4]; | |||
llSetLinkPrimitiveParamsFast(LINK_THIS, [ | |||
PRIM_NAME, ownerName, | |||
PRIM_DESC, "Last reset: " + llGetTimestamp()]); | |||
llRequestPermissions(ownerKey, PERMISSION_TAKE_CONTROLS); | |||
llListen(COMM_CHANNEL, "", NULL_KEY, ""); | |||
} | |||
listen(integer channel, string name, key id, string message) | listen(integer channel, string name, key id, string message) | ||
{ | { | ||
if (channel == | if (channel != COMM_CHANNEL) | ||
return; | |||
if (id == ownerKey) | |||
{ | |||
llRegionSay(COMM_CHANNEL, Encrypt(message)); | |||
llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_NAME, ""]); | |||
llOwnerSay("/me [" + ownerName + "]: '" + message + "'"); | |||
llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_NAME, ownerName]); | |||
} | |||
else if (llGetAgentSize(id) == ZERO_VECTOR) | |||
{ | { | ||
message = Decrypt(message); | |||
llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_NAME, ""]); | |||
llOwnerSay("/me [" + name + "]: '" + message + "'"); | |||
llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_NAME, ownerName]); | |||
} | } | ||
} | |||
run_time_permissions(integer perm) | |||
{ | |||
if (perm & PERMISSION_TAKE_CONTROLS) | |||
llTakeControls(CONTROL_DOWN, TRUE, TRUE); | |||
} | |||
control(key id, integer level, integer edge) | |||
{ | |||
; | |||
} | } | ||
} | } |
Revision as of 05:39, 20 December 2011
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
Check out all my other projects!
SIMchat headset
General information:
This script is being provided "as is". It's been thoroughly tested in May 2010.
If you want to use it, you should drop it into a childprim of a linkset. This setup will give you the possibilty to forward your chat on a certain channel within the whole region your are in and encrypt it. Just make sure anybody you want to talk to has the same variables as you do.
Script:
<lsl> key ownerKey; string ownerName;
integer KEY1 = 11111111; integer KEY2 = 22222222; integer KEY3 = 33333333; integer KEY4 = 44444444;
integer COMM_CHANNEL = 9;
integer CYCLES = 6;
list cypherkey = []; integer delta = 0x9E3779B9;
integer ord(string chr) {
string ASCII = " \n !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
if(llStringLength(chr) != 1) return -1;
if(chr == " ") return 32;
return llSubStringIndex(ASCII, chr);
}
string chr(integer i) {
string ASCII = " \n !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"; i %= 127;
return llGetSubString(ASCII, i, i);
}
string DWord2Hex(integer m) {
string result; integer i = 0; integer index = 0;
string characters = "0123456789ABCDEF";
for (i = 0; i < 8; i++) { index = (m >> (i * 4)) & 0xF; result = llInsertString(result, 0, llGetSubString(characters,index,index)); }
return result;
}
integer Hex2DWord(string m) {
integer result = 0; integer i = 0; string digit; integer value; integer index;
string characters = "0123456789ABCDEF";
for (i = 0; i < 8; i++) { index = 8 - (i + 1); digit = llGetSubString(m,index,index);
value = llSubStringIndex(characters, digit);
result = result | value << (i * 4); }
return result;
}
string Encrypt(string cleartext) {
integer dword1 = 0; integer dword2 = 0; integer cyphertext_numeric; list cypherblock; string cyphertext = "";
while(llStringLength(cleartext) & 0x7) cleartext += " ";
integer stringlength = llStringLength(cleartext); integer i=0; integer character;
while (i < stringlength) { dword1 = ord(llGetSubString(cleartext,i,i)); i++; dword1 = dword1 | (ord(llGetSubString(cleartext,i,i)) << 8); i++; dword1 = dword1 | (ord(llGetSubString(cleartext,i,i)) << 16); i++; dword1 = dword1 | (ord(llGetSubString(cleartext,i,i)) << 24); i++;
dword2 = ord(llGetSubString(cleartext,i,i)); i++; dword2 = dword2 | ord(llGetSubString(cleartext,i,i)) << 8; i++; dword2 = dword2 | ord(llGetSubString(cleartext,i,i)) << 16; i++; dword2 = dword2 | ord(llGetSubString(cleartext,i,i)) << 24; i++;
cypherblock = TEAEncrypt(dword1,dword2,cypherkey);
cyphertext = cyphertext + DWord2Hex(llList2Integer(cypherblock,0)) + DWord2Hex(llList2Integer(cypherblock,1));
dword1 = 0; dword2 = 0; cypherblock = []; }
return cyphertext;
}
string Decrypt(string cyphertext) {
string hexvalue1 = ""; string hexvalue2 = ""; integer dword1 = 0; integer dword2 = 0; list clearblock = []; string cleartext = ""; integer i;
while (i < llStringLength(cyphertext)) { hexvalue1 += llGetSubString(cyphertext,i,i + 7); i = i + 8;
hexvalue2 += llGetSubString(cyphertext,i,i + 7); i = i + 8;
dword1 = Hex2DWord(hexvalue1); dword2 = Hex2DWord(hexvalue2);
clearblock = TEADecrypt(dword1, dword2, cypherkey);
cleartext += chr( llList2Integer(clearblock,0) & 0x000000FF); cleartext += chr( (llList2Integer(clearblock,0) & 0x0000FF00) >> 8); cleartext += chr( (llList2Integer(clearblock,0) & 0x00FF0000) >> 16); cleartext += chr( (llList2Integer(clearblock,0) & 0xFF000000) >> 24);
cleartext += chr( llList2Integer(clearblock,1) & 0x000000FF); cleartext += chr( (llList2Integer(clearblock,1) & 0x0000FF00) >> 8); cleartext += chr( (llList2Integer(clearblock,1) & 0x00FF0000) >> 16); cleartext += chr( (llList2Integer(clearblock,1) & 0xFF000000) >> 24);
hexvalue1 = ""; hexvalue2 = ""; dword1 = 0; dword2 = 0; clearblock = []; }
return cleartext;
}
list TEAEncrypt(integer dword1, integer dword2,list cypherkey) {
list cryptlist = [];
integer n = CYCLES;
integer sum = 0;
while (n-- > 0) { dword1 = dword1 + ( ( dword2 << 4 ^ ((dword2 >> 5) & 0x07FFFFFF) ) + dword2 ^ sum + llList2Integer(cypherkey, (sum & 3) ) ); sum += delta; dword2 = dword2 + ( ( dword1 << 4 ^ ((dword1 >> 5) & 0x07FFFFFF) ) + dword1 ^ sum + llList2Integer(cypherkey, ((sum >> 11) & 3) ) ); }
cryptlist = [dword1,dword2];
return cryptlist;
}
list TEADecrypt(integer dword1, integer dword2,list cypherkey) {
list cryptlist = [];
integer n = CYCLES;
integer sum = delta * CYCLES;
while (n-- > 0) { dword2 = dword2 - ( ( dword1 << 4 ^ ((dword1 >> 5) & 0x07FFFFFF) ) + dword1 ^ sum + llList2Integer(cypherkey, ((sum >> 11) & 3) ) ); sum -= delta; dword1 = dword1 - ( ( dword2 << 4 ^ ((dword2 >> 5) & 0x07FFFFFF) ) + dword2 ^ sum + llList2Integer(cypherkey, (sum & 3) ) ); }
cryptlist = [dword1,dword2]; return cryptlist;
}
default {
on_rez(integer start_param) { if (llGetOwner() != ownerKey) { llReleaseControls(); llResetScript(); } }
changed(integer change) { if (change & CHANGED_OWNER) { llReleaseControls(); llResetScript(); } }
state_entry() { ownerKey = llGetOwner(); ownerName = llKey2Name(ownerKey); cypherkey = [KEY1,KEY2,KEY3,KEY4];
llSetLinkPrimitiveParamsFast(LINK_THIS, [ PRIM_NAME, ownerName, PRIM_DESC, "Last reset: " + llGetTimestamp()]);
llRequestPermissions(ownerKey, PERMISSION_TAKE_CONTROLS); llListen(COMM_CHANNEL, "", NULL_KEY, ""); }
listen(integer channel, string name, key id, string message) { if (channel != COMM_CHANNEL) return;
if (id == ownerKey) { llRegionSay(COMM_CHANNEL, Encrypt(message)); llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_NAME, ""]); llOwnerSay("/me [" + ownerName + "]: '" + message + "'"); llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_NAME, ownerName]); } else if (llGetAgentSize(id) == ZERO_VECTOR) { message = Decrypt(message); llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_NAME, ""]); llOwnerSay("/me [" + name + "]: '" + message + "'"); llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_NAME, ownerName]); } }
run_time_permissions(integer perm) { if (perm & PERMISSION_TAKE_CONTROLS) llTakeControls(CONTROL_DOWN, TRUE, TRUE); }
control(key id, integer level, integer edge) { ; }
} </lsl> Go to top!