User:Kireji Haiku/SIMchat headset: Difference between revisions
Kireji Haiku (talk | contribs) |
Kireji Haiku (talk | contribs) |
||
| Line 27: | Line 27: | ||
==Script:== | ==Script:== | ||
<lsl> | <lsl> | ||
/* | |||
* | |||
* | |||
* This script includes the XTEA-LSL-Implementation by: | |||
* - Morse Dillon | |||
* - Strife Onizuka | |||
* - Dedric Mauriac | |||
* - JB Kraft | |||
* http://wiki.secondlife.com/wiki/XTEA_Strong_Encryption_Implementation | |||
* | |||
* | |||
* Setup: | |||
* 1. Make sure the object in which you want to use this script has more than one prim. | |||
* 2. Make sure the object is modifiable by you. | |||
* 3. This script must go into a childprim of your object, it doesn't matter into which one. | |||
* 4. After you have copied the script into your object, make sure everyone you want to talk to has the same | |||
* settings for KEY1, KEY2, KEY3, KEY4 and COMM_CHANNEL. You can use any valid, positive (!) integer number | |||
* for COMM_CHANNEL excluding PUBLIC_CHANNEL (which is 0) and DEBUG_CHANNEL (which is 2147483647). Do not use | |||
* a negative channel! | |||
* 5. When chatting, please type in local chat and add your channel. Example: If your COMM_CHANNEL was 9 then you'd type: "/9 hello" | |||
* 6. The code is written for an avatar attachment (usually a headset / HUD) and will run in no-script areas. | |||
* | |||
* | |||
*/ | |||
integer KEY1 = 11111111; | integer KEY1 = 11111111; | ||
| Line 36: | Line 59: | ||
integer COMM_CHANNEL = 9; | integer COMM_CHANNEL = 9; | ||
/* | |||
* | |||
* If you're not sure what you're doing, | |||
* do NOT change anything below! | |||
* | |||
*/ | |||
key ownerKey; | |||
string ownerName; | |||
integer CYCLES = 6; | integer CYCLES = 6; | ||
Revision as of 05:07, 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>
/*
- This script includes the XTEA-LSL-Implementation by:
- - Morse Dillon
- - Strife Onizuka
- - Dedric Mauriac
- - JB Kraft
- http://wiki.secondlife.com/wiki/XTEA_Strong_Encryption_Implementation
- Setup:
- 1. Make sure the object in which you want to use this script has more than one prim.
- 2. Make sure the object is modifiable by you.
- 3. This script must go into a childprim of your object, it doesn't matter into which one.
- 4. After you have copied the script into your object, make sure everyone you want to talk to has the same
- settings for KEY1, KEY2, KEY3, KEY4 and COMM_CHANNEL. You can use any valid, positive (!) integer number
- for COMM_CHANNEL excluding PUBLIC_CHANNEL (which is 0) and DEBUG_CHANNEL (which is 2147483647). Do not use
- a negative channel!
- 5. When chatting, please type in local chat and add your channel. Example: If your COMM_CHANNEL was 9 then you'd type: "/9 hello"
- 6. The code is written for an avatar attachment (usually a headset / HUD) and will run in no-script areas.
- /
integer KEY1 = 11111111; integer KEY2 = 22222222; integer KEY3 = 33333333; integer KEY4 = 44444444;
integer COMM_CHANNEL = 9;
/*
- If you're not sure what you're doing,
- do NOT change anything below!
- /
key ownerKey; string ownerName;
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!