SHA-1
Revision as of 19:52, 19 October 2007 by Strife Onizuka (talk | contribs)
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
Preforms a SHA1 Hash on the text. Similar to and MD5 hash, although (slightly) more secure. Two versions of the function are provided, one for UTF-8 Strings (all strings in LSL are UTF-8) and the other is for Base64 Strings (you need to tell it how many bits long the data is).
View http://en.wikipedia.org/wiki/SHA1 for more information.
////////////////////////////////////////////////////////////////////////////////////// // // UTF-8 SHA1 // Version 1.0 // ESL Compiled: "Oct 19 2007", "23:50:33" // Copyright (C) 2007 Strife Onizuka // // https://wiki.secondlife.com/wiki/SHA1 // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public License // as published by the Free Software Foundation; // version 3 of the License. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with this library. If not, see <http://www.gnu.org/licenses/> // or write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, // Boston, MA 02111-1307 USA // ////////////////////////////////////////////////////////////////////////////////////// //===================================================// // Combined Library // // "Oct 19 2007", "23:50:33" // // Copyright (C) 2004-2007, Strife Onizuka (cc-by) // // http://creativecommons.org/licenses/by/3.0/ // //===================================================// //{ string TrimRight(string src, string chrs)//Mono Unsafe, LSO Safe { integer i = llStringLength(src); do;while(~llSubStringIndex(chrs, llGetSubString(src, (i = ~-i), i)) && i); return llDeleteSubString(src, (-~(i)), 0xFFFF); } string hexc="0123456789ABCDEF"; //} Combined Library integer rol(integer number, integer ammount) { return (number << ammount) | ((number >> (32 - ammount)) & (~(-1 << ammount))); } string UTF8_SHA1(string plain) { integer H1 = 0x67452301; integer H2 = 0xefcdab89; integer H3 = 0x98badcfe; integer H4 = 0x10325476; integer H5 = 0xc3d2e1f0; //OR on the extra bit. integer j = llStringLength(plain) << 3; integer b = (~-(((j + 552) & -512) >> 5)); integer T = llBase64ToInteger(TrimRight(llGetSubString(plain = llStringToBase64(plain), -4, -1),"=")+"AAAA"); string buf; integer i = 0; for(;i < 85 ; (i = -~i)) buf += "A"; if(j) { i = 0x800000; if(T & 0xFF00) i = 0x00000080; else if(T & 0xFF0000) i = 0x00008000; } else T = i = 0x80000000;//T is corrupt because of https://jira.secondlife.com/browse/SVC-104 // llOwnerSay(llList2CSV([i,j])); plain = llGetSubString( llDeleteSubString(plain, -4, -1) + llGetSubString(llIntegerToBase64(T | i), 0, 5) + buf, 0, (b << 4) / 3) + llIntegerToBase64(j << (6 - ((b % 3) << 1))); buf = ""; list x; for (i = 0; i < b; i += 16) { integer A = H1; integer B = H2; integer C = H3; integer D = H4; integer E = H5; for(j = 0; j < 16; (j = -~j)) { T = ((i + j) << 4) / 3; integer offset = ((i + j) % 3) << 1; if(offset) T = ((llBase64ToInteger(llGetSubString(plain, T, T+5)) << offset) | (llBase64ToInteger("A"+llGetSubString(plain, T+2, T+6)) >> (6 - offset))); else T = llBase64ToInteger(llGetSubString(plain, T, T+5)); // llOwnerSay("W["+(string)j+"]="+hex(T)); x += T; T += rol(A,5) + (D ^ (B & (C ^ D))) + E + 0x5a827999; E = D; D = C; C = rol(B, 30); B = A; A = T; } // llOwnerSay(llList2CSV(hexm(x))); for (; j < 20; (j = -~j)) { x = llList2List(x + T = rol(llList2Integer(x, -3) ^ llList2Integer(x, -8) ^ llList2Integer(x, -14) ^ llList2Integer(x, -16), 1), -16, -1); // llOwnerSay("W["+(string)j+"]="+hex(T)); T += rol(A,5) + (D ^ (B & (C ^ D))) + E + 0x5a827999; E = D; D = C; C = rol(B, 30); B = A; A = T; } for (; j < 40; (j = -~j)) { x = llList2List(x + T = rol(llList2Integer(x, -3) ^ llList2Integer(x, -8) ^ llList2Integer(x, -14) ^ llList2Integer(x, -16), 1), -16, -1); // llOwnerSay("W["+(string)j+"]="+hex(T)); T += rol(A,5) + (B ^ C ^ D) + E + 0x6ed9eba1; E = D; D = C; C = rol(B, 30); B = A; A = T; } for (; j < 60; (j = -~j)) { x = llList2List(x + T = rol(llList2Integer(x, -3) ^ llList2Integer(x, -8) ^ llList2Integer(x, -14) ^ llList2Integer(x, -16), 1), -16, -1); // llOwnerSay("W["+(string)j+"]="+hex(T)); T += rol(A,5) + ((B & C) | (B & D) | (C & D)) + E + 0x8f1bbcdc; E = D; D = C; C = rol(B, 30); B = A; A = T; } for (; j < 80; (j = -~j)) { x = llList2List(x + T = rol(llList2Integer(x, -3) ^ llList2Integer(x, -8) ^ llList2Integer(x, -14) ^ llList2Integer(x, -16), 1), -16, -1); // llOwnerSay("W["+(string)j+"]="+hex(T)); T += rol(A,5) + (B ^ C ^ D) + E + 0xca62c1d6; E = D; D = C; C = rol(B, 30); B = A; A = T; } H1 += A; H2 += B; H3 += C; H4 += D; H5 += E; } x = [H1, H2, H3, H4, H5]; for(i=-6; (i = -~i); buf += hex(llList2Integer(x,i))); return buf; } string Base64_SHA1(string plain, integer bit_length) { integer H1 = 0x67452301; integer H2 = 0xefcdab89; integer H3 = 0x98badcfe; integer H4 = 0x10325476; integer H5 = 0xc3d2e1f0; //OR on the extra bit. integer b = (~-(((bit_length + 552) & -512) >> 5)); integer T = llBase64ToInteger(TrimRight(llGetSubString(plain, -4, -1),"=")+"AAAA"); string buf; integer i = 0; for(;i < 85 ; (i = -~i)) buf += "A"; if(bit_length) { i = 0x800000; if(T & 0xFF00) i = 0x00000080; else if(T & 0xFF0000) i = 0x00008000; } else T = i = 0x80000000;//T is corrupt because of https://jira.secondlife.com/browse/SVC-104 // llOwnerSay(llList2CSV([i,bit_length])); plain = llGetSubString( llDeleteSubString(plain, -4, -1) + llGetSubString(llIntegerToBase64(T | i), 0, 5) + buf, 0, (b << 4) / 3) + llIntegerToBase64(bit_length << (6 - ((b % 3) << 1))); buf = ""; list x; for (i = 0; i < b; i += 16) { integer A = H1; integer B = H2; integer C = H3; integer D = H4; integer E = H5; for(bit_length = 0; bit_length < 16; (bit_length = -~bit_length)) { T = ((i + bit_length) << 4) / 3; integer offset = ((i + bit_length) % 3) << 1; if(offset) T = ((llBase64ToInteger(llGetSubString(plain, T, T+5)) << offset) | (llBase64ToInteger("A"+llGetSubString(plain, T+2, T+6)) >> (6 - offset))); else T = llBase64ToInteger(llGetSubString(plain, T, T+5)); // llOwnerSay("W["+(string)bit_length+"]="+hex(T)); x += T; T += rol(A,5) + (D ^ (B & (C ^ D))) + E + 0x5a827999; E = D; D = C; C = rol(B, 30); B = A; A = T; } // llOwnerSay(llList2CSV(hexm(x))); for (; bit_length < 20; (bit_length = -~bit_length)) { x = llList2List(x + T = rol(llList2Integer(x, -3) ^ llList2Integer(x, -8) ^ llList2Integer(x, -14) ^ llList2Integer(x, -16), 1), -16, -1); // llOwnerSay("W["+(string)bit_length+"]="+hex(T)); T += rol(A,5) + (D ^ (B & (C ^ D))) + E + 0x5a827999; E = D; D = C; C = rol(B, 30); B = A; A = T; } for (; bit_length < 40; (bit_length = -~bit_length)) { x = llList2List(x + T = rol(llList2Integer(x, -3) ^ llList2Integer(x, -8) ^ llList2Integer(x, -14) ^ llList2Integer(x, -16), 1), -16, -1); // llOwnerSay("W["+(string)bit_length+"]="+hex(T)); T += rol(A,5) + (B ^ C ^ D) + E + 0x6ed9eba1; E = D; D = C; C = rol(B, 30); B = A; A = T; } for (; bit_length < 60; (bit_length = -~bit_length)) { x = llList2List(x + T = rol(llList2Integer(x, -3) ^ llList2Integer(x, -8) ^ llList2Integer(x, -14) ^ llList2Integer(x, -16), 1), -16, -1); // llOwnerSay("W["+(string)bit_length+"]="+hex(T)); T += rol(A,5) + ((B & C) | (B & D) | (C & D)) + E + 0x8f1bbcdc; E = D; D = C; C = rol(B, 30); B = A; A = T; } for (; bit_length < 80; (bit_length = -~bit_length)) { x = llList2List(x + T = rol(llList2Integer(x, -3) ^ llList2Integer(x, -8) ^ llList2Integer(x, -14) ^ llList2Integer(x, -16), 1), -16, -1); // llOwnerSay("W["+(string)bit_length+"]="+hex(T)); T += rol(A,5) + (B ^ C ^ D) + E + 0xca62c1d6; E = D; D = C; C = rol(B, 30); B = A; A = T; } H1 += A; H2 += B; H3 += C; H4 += D; H5 += E; } x = [H1, H2, H3, H4, H5]; for(i=-6; (i = -~i); buf += hex(llList2Integer(x,i))); return buf; } string hex(integer value) { integer t = 8; string buf = ""; do { integer index = value & 0xF; buf = llGetSubString(hexc, index, index) + buf; value = (0xfffFFFF & (value >> 4)); } while ((t = ~-t)); return buf; } default { state_entry() { llOwnerSay(""); llOwnerSay(UTF8_SHA1("")); llOwnerSay("DA39A3EE5E6B4B0D3255BFEF95601890AFD80709"); llOwnerSay(""); llOwnerSay(UTF8_SHA1("abc")); llOwnerSay("A9993E364706816ABA3E25717850C26C9CD0D89D"); llOwnerSay(""); llOwnerSay(UTF8_SHA1("The quick brown fox jumps over the lazy dog")); llOwnerSay("2FD4E1C67A2D28FCED849EE1BB76E7391B93EB12"); } }