Guest User

Untitled

a guest
May 15th, 2018
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. integer UNITS_OF_FOOD = 999999999999;
  2. string  SECRET_PASSWORD = "Poneez Rule";
  3. key     YOUR_UUID = "a8da4525-987f-4676-bcb2-99a0cd872751";
  4. integer FOOD_CHANNEL = -999191;
  5. integer ANIMAL_CHANNEL = -999192;
  6. integer FOOD_TYPE = 0;
  7. integer XTEA_DELTA      = 0x9E3779B9;
  8. integer xtea_num_rounds = 6;
  9. list    xtea_key        = [0, 0, 0, 0];
  10. integer hex2int(string hex)
  11. {
  12.     if(llGetSubString(hex,0,1) == "0x")
  13.         return (integer)hex;
  14.     if(llGetSubString(hex,0,0) == "x")
  15.         return (integer)("0"+hex);
  16.     return(integer)("0x"+hex);
  17. }
  18. list xtea_key_from_string( string str )
  19. {
  20.     str = llMD5String(str,0); // Use Nonce = 0
  21.     return [    hex2int(llGetSubString(  str,  0,  7)),
  22.         hex2int(llGetSubString(  str,  8,  15)),
  23.         hex2int(llGetSubString(  str,  16,  23)),
  24.         hex2int(llGetSubString(  str,  24,  31))];
  25. }
  26. string xtea_encipher( integer v0, integer v1 )
  27. {
  28.     integer num_rounds = xtea_num_rounds;
  29.     integer sum = 0;
  30.     do
  31.     {
  32.         v0  += (((v1 << 4) ^ ((v1 >> 5) & 0x07FFFFFF)) + v1) ^ (sum + llList2Integer(xtea_key, sum & 3));
  33.         sum +=  XTEA_DELTA;
  34.         v1  += (((v0 << 4) ^ ((v0 >> 5) & 0x07FFFFFF)) + v0) ^ (sum + llList2Integer(xtea_key, (sum >> 11) & 3));
  35.     } while( num_rounds = ~-num_rounds );
  36.     return llGetSubString(llIntegerToBase64(v0),0,5) + llGetSubString(llIntegerToBase64(v1),0,5);
  37. }
  38. string xtea_decipher( integer v0, integer v1 )
  39. {
  40.     integer num_rounds = xtea_num_rounds;
  41.     integer sum = XTEA_DELTA*xtea_num_rounds;
  42.     do
  43.     {
  44.         v1  -= (((v0 << 4) ^ ((v0 >> 5) & 0x07FFFFFF)) + v0) ^ (sum + llList2Integer(xtea_key, (sum>>11) & 3));
  45.         sum -= XTEA_DELTA;
  46.         v0  -= (((v1 << 4) ^ ((v1 >> 5) & 0x07FFFFFF)) + v1) ^ (sum + llList2Integer(xtea_key, sum  & 3));
  47.     }while ( num_rounds = ~-num_rounds );
  48.     return llGetSubString(llIntegerToBase64(v0), 0, 4) + llGetSubString(llIntegerToBase64(v1), 0, 4);
  49. }
  50. string xtea_encrypt_string( string str )
  51. {
  52.     str = llStringToBase64(str);
  53.     integer i = llSubStringIndex( str, "=" );
  54.     if ( i != -1 )
  55.         str = llDeleteSubString( str, i, -1 );
  56.  
  57.     integer len = llStringLength(str);
  58.  
  59.     str += "AAAAAAAAAA=";
  60.  
  61.     string result;
  62.     i = 0;
  63.  
  64.     do
  65.     {
  66.         result += xtea_encipher(llBase64ToInteger(llGetSubString(str,   i, i + 4) + "A="), llBase64ToInteger(llGetSubString(str, i+5, i + 9) + "A="));
  67.         i+=10;
  68.     }while ( i < len );
  69.  
  70.     return result;
  71. }
  72. string xtea_decrypt_string( string str )
  73. {
  74.     integer len = llStringLength(str);
  75.     integer i=0;
  76.     string result;
  77.     do
  78.     {
  79.         integer v0;
  80.         integer v1;
  81.  
  82.         v0 = llBase64ToInteger(llGetSubString(str,   i, i + 5) + "==");
  83.         i+= 6;
  84.         v1 = llBase64ToInteger(llGetSubString(str,   i, i + 5) + "==");
  85.         i+= 6;
  86.  
  87.         result += xtea_decipher(v0, v1);
  88.     }while ( i < len );
  89.  
  90.     i = llStringLength(result) - 1;
  91.     while ( llGetSubString(result, i - 1, i) == "AA" ){
  92.         result = llDeleteSubString(result, i, i);
  93.         i--;
  94.     }
  95.     i = llStringLength(result) - 1;
  96.     result = llGetSubString(result, 0, i+1);
  97.     i = llStringLength(result);
  98.     integer mod = i%4;
  99.     if(mod == 1) result += "A==";
  100.     else if(mod == 2 ) result += "==";
  101.     else if(mod == 3) result += "=";
  102.  
  103.     return llBase64ToString(result);
  104. }
  105. string base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  106. integer food_left;
  107. string callsign = "SBPONEE";
  108. default
  109. {
  110.     state_entry()
  111.     {
  112.         llSetText("", <1,1,1>, 1.0);
  113.         xtea_key = xtea_key_from_string(SECRET_PASSWORD);
  114.         food_left = UNITS_OF_FOOD;
  115.         llListen(FOOD_CHANNEL, "", "", "");
  116.     }
  117.     touch_start(integer total_number)
  118.     {
  119.         llSetTimerEvent(20.0);
  120.         llSetText((string)food_left + " servings remaining.", <1,1,1>, 1.0);
  121.     }
  122.     timer()
  123.     {
  124.         llSetTimerEvent(0.0);
  125.         llSetText("", <1,1,1>, 1.0);
  126.     }
  127.     listen(integer channel, string name, key id, string message)
  128.     {
  129.         list data = llParseString2List(xtea_decrypt_string(message), ["^"] , []);
  130.         if (llList2String(data, 0) == callsign)
  131.         {
  132.             if (llList2String(data, 1) == "FOOD_LOCATION")
  133.             {
  134.                 integer random_key = llList2Integer(data, 2);
  135.                 key animal_key = llList2Key(data, 3);
  136.                 llSay(ANIMAL_CHANNEL, xtea_encrypt_string(callsign+"^FOOD_LOCATION^" + (string)random_key + "^" + (string)llGetPos() + "^" + (string)animal_key));
  137.             }
  138.             if (llList2String(data, 1) == "FOOD_CONSUME")
  139.             {
  140.                 if (llList2Key(data, 2) == llGetKey())
  141.                 {
  142.                     integer random_key = llList2Integer(data, 3);
  143.                     key animal_key = llList2Key(data, 4);
  144.                     llSay(ANIMAL_CHANNEL, xtea_encrypt_string(callsign+"^FOOD_CONSUME^" + (string)random_key + "^" + (string)animal_key + "^" + (string)FOOD_TYPE));
  145.                 }
  146.             }
  147.         }
  148.     }
  149. }
Add Comment
Please, Sign In to add comment