SHA-3
Here's an open source SHA-3 implementation in LSL.
It supports all three versions of the algorithm - SHA-3, Keccak, SHAKE.
Processing speed is roughly 100 characters per second.
<lsl> ///////////////////////////////////////////////////////////////////////////////// // // CasperTech SHA-3 implementation // // Creative Commons Attribution 4.0 International https://creativecommons.org/licenses/by/4.0/ // // Based on js-sha3 https://github.com/emn178/js-sha3 // ////////////////////////////////////////////////////////////////////////////////
list HEX_CHARS = ["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"]; list SHAKE_PADDING = [31, 7936, 2031616, 520093696]; list KECCAK_PADDING = [1, 256, 65536, 16777216]; list PADDING = [6, 1536, 393216, 100663296]; list SHIFT = [0, 8, 16, 24]; list RC = [1, 0, 32898, 0, 32906, 2147483648, 2147516416, 2147483648, 32907, 0, 2147483649,
0, 2147516545, 2147483648, 32777, 2147483648, 138, 0, 136, 0, 2147516425, 0, 2147483658, 0, 2147516555, 0, 139, 2147483648, 32905, 2147483648, 32771, 2147483648, 32770, 2147483648, 128, 2147483648, 32778, 0, 2147483658, 2147483648, 2147516545, 2147483648, 32896, 2147483648, 2147483649, 0, 2147516424, 2147483648];
integer ALGORITHM_SHA3 = 0; integer ALGORITHM_KECCAK = 1; integer ALGORITHM_SHAKE = 2;
integer UTF8ToUnicodeInteger(string input) //From http://wiki.secondlife.com/w/index.php?title=UTF-8 with thanks {
integer result = llBase64ToInteger(llStringToBase64(input = llGetSubString(input,0,0))); if(result & 0x80000000) { integer end = (integer)("0x"+llGetSubString(input = (string)llParseString2List(llEscapeURL(input),(list)"%",[]),-8,-1)); integer begin = (integer)("0x"+llDeleteSubString(input,-8,-1)); return ( ( 0x0000003f & end ) | (( 0x00003f00 & end) >> 2 ) | (( 0x003f0000 & end) >> 4 ) | (( 0x3f000000 & end) >> 6 ) | (( 0x0000003f & begin) << 24) | (( 0x00000100 & begin) << 22) ) & (0x7FFFFFFF >> (5 * ((integer)(llLog(~result) / 0.69314718055994530941723212145818) - 25))); } return result >> 24;
} integer zeroFillRightShift(integer value, integer count) //From http://wiki.secondlife.com/wiki/Right_Shift with thanks {
return ((value & 0x7fFFffFF) >> count) - ((value & 0x80000000) >> count);
} list f(list s) {
integer h; integer l; integer n; integer c0; integer c1; integer c2; integer c3; integer c4; integer c5; integer c6; integer c7; integer c8; integer c9; integer b0; integer b1; integer b2; integer b3; integer b4; integer b5; integer b6; integer b7; integer b8; integer b9; integer b10; integer b11; integer b12; integer b13; integer b14; integer b15; integer b16; integer b17; integer b18; integer b19; integer b20; integer b21; integer b22; integer b23; integer b24; integer b25; integer b26; integer b27; integer b28; integer b29; integer b30; integer b31; integer b32; integer b33; integer b34; integer b35; integer b36; integer b37; integer b38; integer b39; integer b40; integer b41; integer b42; integer b43; integer b44; integer b45; integer b46; integer b47; integer b48; integer b49; integer s0 = llList2Integer(s,0); integer s1 = llList2Integer(s,1); integer s2 = llList2Integer(s,2); integer s3 = llList2Integer(s,3); integer s4 = llList2Integer(s,4); integer s5 = llList2Integer(s,5); integer s6 = llList2Integer(s,6); integer s7 = llList2Integer(s,7); integer s8 = llList2Integer(s,8); integer s9 = llList2Integer(s,9); integer s10 = llList2Integer(s,10); integer s11 = llList2Integer(s,11); integer s12 = llList2Integer(s,12); integer s13 = llList2Integer(s,13); integer s14 = llList2Integer(s,14); integer s15 = llList2Integer(s,15); integer s16 = llList2Integer(s,16); integer s17 = llList2Integer(s,17); integer s18 = llList2Integer(s,18); integer s19 = llList2Integer(s,19); integer s20 = llList2Integer(s,20); integer s21 = llList2Integer(s,21); integer s22 = llList2Integer(s,22); integer s23 = llList2Integer(s,23); integer s24 = llList2Integer(s,24); integer s25 = llList2Integer(s,25); integer s26 = llList2Integer(s,26); integer s27 = llList2Integer(s,27); integer s28 = llList2Integer(s,28); integer s29 = llList2Integer(s,29); integer s30 = llList2Integer(s,30); integer s31 = llList2Integer(s,31); integer s32 = llList2Integer(s,32); integer s33 = llList2Integer(s,33); integer s34 = llList2Integer(s,34); integer s35 = llList2Integer(s,35); integer s36 = llList2Integer(s,36); integer s37 = llList2Integer(s,37); integer s38 = llList2Integer(s,38); integer s39 = llList2Integer(s,39); integer s40 = llList2Integer(s,40); integer s41 = llList2Integer(s,41); integer s42 = llList2Integer(s,42); integer s43 = llList2Integer(s,43); integer s44 = llList2Integer(s,44); integer s45 = llList2Integer(s,45); integer s46 = llList2Integer(s,46); integer s47 = llList2Integer(s,47); integer s48 = llList2Integer(s,48); integer s49 = llList2Integer(s,49); for (n = 0; n < 48; n += 2) { c0 = s0 ^ s10 ^ s20 ^ s30 ^ s40; c1 = s1 ^ s11 ^ s21 ^ s31 ^ s41; c2 = s2 ^ s12 ^ s22 ^ s32 ^ s42; c3 = s3 ^ s13 ^ s23 ^ s33 ^ s43; c4 = s4 ^ s14 ^ s24 ^ s34 ^ s44; c5 = s5 ^ s15 ^ s25 ^ s35 ^ s45; c6 = s6 ^ s16 ^ s26 ^ s36 ^ s46; c7 = s7 ^ s17 ^ s27 ^ s37 ^ s47; c8 = s8 ^ s18 ^ s28 ^ s38 ^ s48; c9 = s9 ^ s19 ^ s29 ^ s39 ^ s49; h = c8 ^ ((c2 << 1) | (zeroFillRightShift(c3,31))); l = c9 ^ ((c3 << 1) | (zeroFillRightShift(c2,31))); s0 = s0 ^ h; s1 = s1 ^ l; s10 = s10 ^ h; s11 = s11 ^ l; s20 = s20 ^ h; s21 = s21 ^ l; s30 = s30 ^ h; s31 = s31 ^ l; s40 = s40 ^ h; s41 = s41 ^ l; h = c0 ^ ((c4 << 1) | (zeroFillRightShift(c5,31))); l = c1 ^ ((c5 << 1) | (zeroFillRightShift(c4,31))); s2 = s2 ^ h; s3 = s3 ^ l; s12 = s12 ^ h; s13 = s13 ^ l; s22 = s22 ^ h; s23 = s23 ^ l; s32 = s32 ^ h; s33 = s33 ^ l; s42 = s42 ^ h; s43 = s43 ^ l; h = c2 ^ ((c6 << 1) | (zeroFillRightShift(c7,31))); l = c3 ^ ((c7 << 1) | (zeroFillRightShift(c6,31))); s4 = s4 ^ h; s5 = s5 ^ l; s14 = s14 ^ h; s15 = s15 ^ l; s24 = s24 ^ h; s25 = s25 ^ l; s34 = s34 ^ h; s35 = s35 ^ l; s44 = s44 ^ h; s45 = s45 ^ l; h = c4 ^ ((c8 << 1) | (zeroFillRightShift(c9,31))); l = c5 ^ ((c9 << 1) | (zeroFillRightShift(c8,31))); s6 = s6 ^ h; s7 = s7 ^ l; s16 = s16 ^ h; s17 = s17 ^ l; s26 = s26 ^ h; s27 = s27 ^ l; s36 = s36 ^ h; s37 = s37 ^ l; s46 = s46 ^ h; s47 = s47 ^ l; h = c6 ^ ((c0 << 1) | (zeroFillRightShift(c1,31))); l = c7 ^ ((c1 << 1) | (zeroFillRightShift(c0,31))); s8 = s8 ^ h; s9 = s9 ^ l; s18 = s18 ^ h; s19 = s19 ^ l; s28 = s28 ^ h; s29 = s29 ^ l; s38 = s38 ^ h; s39 = s39 ^ l; s48 = s48 ^ h; s49 = s49 ^ l; b0 = s0; b1 = s1; b32 = (s11 << 4) | (zeroFillRightShift(s10,28)); b33 = (s10 << 4) | (zeroFillRightShift(s11,28)); b14 = (s20 << 3) | (zeroFillRightShift(s21,29)); b15 = (s21 << 3) | (zeroFillRightShift(s20,29)); b46 = (s31 << 9) | (zeroFillRightShift(s30,23)); b47 = (s30 << 9) | (zeroFillRightShift(s31,23)); b28 = (s40 << 18) | (zeroFillRightShift(s41,14)); b29 = (s41 << 18) | (zeroFillRightShift(s40,14)); b20 = (s2 << 1) | (zeroFillRightShift(s3,31)); b21 = (s3 << 1) | (zeroFillRightShift(s2,31)); b2 = (s13 << 12) | (zeroFillRightShift(s12,20)); b3 = (s12 << 12) | (zeroFillRightShift(s13,20)); b34 = (s22 << 10) | (zeroFillRightShift(s23,22)); b35 = (s23 << 10) | (zeroFillRightShift(s22,22)); b16 = (s33 << 13) | (zeroFillRightShift(s32,19)); b17 = (s32 << 13) | (zeroFillRightShift(s33,19)); b48 = (s42 << 2) | (zeroFillRightShift(s43,30)); b49 = (s43 << 2) | (zeroFillRightShift(s42,30)); b40 = (s5 << 30) | (zeroFillRightShift(s4,2)); b41 = (s4 << 30) | (zeroFillRightShift(s5,2)); b22 = (s14 << 6) | (zeroFillRightShift(s15,26)); b23 = (s15 << 6) | (zeroFillRightShift(s14,26)); b4 = (s25 << 11) | (zeroFillRightShift(s24,21)); b5 = (s24 << 11) | (zeroFillRightShift(s25,21)); b36 = (s34 << 15) | (zeroFillRightShift(s35,17)); b37 = (s35 << 15) | (zeroFillRightShift(s34,17)); b18 = (s45 << 29) | (zeroFillRightShift(s44,3)); b19 = (s44 << 29) | (zeroFillRightShift(s45,3)); b10 = (s6 << 28) | (zeroFillRightShift(s7,4)); b11 = (s7 << 28) | (zeroFillRightShift(s6,4)); b42 = (s17 << 23) | (zeroFillRightShift(s16,9)); b43 = (s16 << 23) | (zeroFillRightShift(s17,9)); b24 = (s26 << 25) | (zeroFillRightShift(s27,7)); b25 = (s27 << 25) | (zeroFillRightShift(s26,7)); b6 = (s36 << 21) | (zeroFillRightShift(s37,11)); b7 = (s37 << 21) | (zeroFillRightShift(s36,11)); b38 = (s47 << 24) | (zeroFillRightShift(s46,8)); b39 = (s46 << 24) | (zeroFillRightShift(s47,8)); b30 = (s8 << 27) | (zeroFillRightShift(s9,5)); b31 = (s9 << 27) | (zeroFillRightShift(s8,5)); b12 = (s18 << 20) | (zeroFillRightShift(s19,12)); b13 = (s19 << 20) | (zeroFillRightShift(s18,12)); b44 = (s29 << 7) | (zeroFillRightShift(s28,25)); b45 = (s28 << 7) | (zeroFillRightShift(s29,25)); b26 = (s38 << 8) | (zeroFillRightShift(s39,24)); b27 = (s39 << 8) | (zeroFillRightShift(s38,24)); b8 = (s48 << 14) | (zeroFillRightShift(s49,18)); b9 = (s49 << 14) | (zeroFillRightShift(s48,18)); s0 = b0 ^ (~b2 & b4); s1 = b1 ^ (~b3 & b5); s10 = b10 ^ (~b12 & b14); s11 = b11 ^ (~b13 & b15); s20 = b20 ^ (~b22 & b24); s21 = b21 ^ (~b23 & b25); s30 = b30 ^ (~b32 & b34); s31 = b31 ^ (~b33 & b35); s40 = b40 ^ (~b42 & b44); s41 = b41 ^ (~b43 & b45); s2 = b2 ^ (~b4 & b6); s3 = b3 ^ (~b5 & b7); s12 = b12 ^ (~b14 & b16); s13 = b13 ^ (~b15 & b17); s22 = b22 ^ (~b24 & b26); s23 = b23 ^ (~b25 & b27); s32 = b32 ^ (~b34 & b36); s33 = b33 ^ (~b35 & b37); s42 = b42 ^ (~b44 & b46); s43 = b43 ^ (~b45 & b47); s4 = b4 ^ (~b6 & b8); s5 = b5 ^ (~b7 & b9); s14 = b14 ^ (~b16 & b18); s15 = b15 ^ (~b17 & b19); s24 = b24 ^ (~b26 & b28); s25 = b25 ^ (~b27 & b29); s34 = b34 ^ (~b36 & b38); s35 = b35 ^ (~b37 & b39); s44 = b44 ^ (~b46 & b48); s45 = b45 ^ (~b47 & b49); s6 = b6 ^ (~b8 & b0); s7 = b7 ^ (~b9 & b1); s16 = b16 ^ (~b18 & b10); s17 = b17 ^ (~b19 & b11); s26 = b26 ^ (~b28 & b20); s27 = b27 ^ (~b29 & b21); s36 = b36 ^ (~b38 & b30); s37 = b37 ^ (~b39 & b31); s46 = b46 ^ (~b48 & b40); s47 = b47 ^ (~b49 & b41); s8 = b8 ^ (~b0 & b2); s9 = b9 ^ (~b1 & b3); s18 = b18 ^ (~b10 & b12); s19 = b19 ^ (~b11 & b13); s28 = b28 ^ (~b20 & b22); s29 = b29 ^ (~b21 & b23); s38 = b38 ^ (~b30 & b32); s39 = b39 ^ (~b31 & b33); s48 = b48 ^ (~b40 & b42); s49 = b49 ^ (~b41 & b43); s0 = s0 ^ llList2Integer(RC, n); s1 = s1 ^ llList2Integer(RC, n + 1); } return [s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14,s15,s16,s17,s18,s19,s20,s21,s22,s23,s24,s25,s26,s27,s28,s29,s30,s31,s32,s33,s34,s35,s36,s37,s38,s39,s40,s41,s42,s43,s44,s45,s46,s47,s48,s49];
} string Keccak(integer bits, list padding, integer outputBits, string message) {
list blocks = []; list s = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; integer block = 0; integer start = 0; integer blockCount = (1600 - (bits << 1)) >> 5; integer byteCount = blockCount << 2; integer outputBlocks = outputBits >> 5; integer extraBytes = (outputBits & 31) >> 3; integer length = llStringLength(message); integer index = 0; integer i; integer code; integer reset = FALSE; integer lastByteIndex = 0; blocks = [0]; for(i = 0; i < blockCount + 1; ++i) { blocks+=[0]; } while(index < length) { if (reset == TRUE) { reset = FALSE; blocks = [block]; for(i = 0; i < blockCount + 1; ++i) { blocks+=[0]; } } for(i = start; index < length && i < byteCount; ++index) { code = UTF8ToUnicodeInteger(llGetSubString(message, index, index)); integer blockNumber = llList2Integer(blocks, i >> 2); if (code < 0x80) { blocks = llListReplaceList(blocks, [llList2Integer(blocks, i >> 2) | code << llList2Integer(SHIFT,i & 3)], i >> 2, i >> 2); i = i + 1; } else if (code < 0x800) { blocks = llListReplaceList(blocks, [llList2Integer(blocks, i >> 2) |(0xc0 | (code >> 6)) << llList2Integer(SHIFT,i & 3)], i >> 2, i >> 2); i = i + 1; blocks = llListReplaceList(blocks, [llList2Integer(blocks, i >> 2) | (0x80 | (code & 0x3f)) << llList2Integer(SHIFT,i & 3)], i >> 2, i >> 2); i = i + 1; } else if (code < 0xd800 || code >= 0xe000) { blocks = llListReplaceList(blocks, [llList2Integer(blocks, i >> 2) | (0xe0 | (code >> 12)) << llList2Integer(SHIFT,i & 3)], i >> 2, i >> 2); i = i + 1; blocks = llListReplaceList(blocks, [llList2Integer(blocks, i >> 2) | (0x80 | ((code >> 6) & 0x3f)) << llList2Integer(SHIFT,i & 3)], i >> 2, i >> 2); i = i + 1; blocks = llListReplaceList(blocks, [llList2Integer(blocks, i >> 2) | (0x80 | (code & 0x3f)) << llList2Integer(SHIFT,i & 3)], i >> 2, i >> 2); i = i + 1; } else { index = index + 1; code = 0x10000 + (((code & 0x3ff) << 10) | (UTF8ToUnicodeInteger(llGetSubString(message, index, index)) & 0x3ff)); blocks = llListReplaceList(blocks, [llList2Integer(blocks, i >> 2) | (0xf0 | (code >> 18)) << llList2Integer(SHIFT,i & 3)], i >> 2, i >> 2); i = i + 1; blocks = llListReplaceList(blocks, [llList2Integer(blocks, i >> 2) | (0x80 | ((code >> 12) & 0x3f)) << llList2Integer(SHIFT,i & 3)], i >> 2, i >> 2); i = i + 1; blocks = llListReplaceList(blocks, [llList2Integer(blocks, i >> 2) | (0x80 | ((code >> 6) & 0x3f)) << llList2Integer(SHIFT,i & 3)], i >> 2, i >> 2); i = i + 1; blocks = llListReplaceList(blocks, [llList2Integer(blocks, i >> 2) | (0x80 | (code & 0x3f)) << llList2Integer(SHIFT,i & 3)], i >> 2, i >> 2); i = i + 1; } } lastByteIndex = i; if (i >= byteCount) { start = i - byteCount; block = llList2Integer(blocks,blockCount); for(i = 0; i < blockCount; ++i) { s = llListReplaceList(s, [llList2Integer(s,i) ^ llList2Integer(blocks,i)], i, i); } s = f(s); reset = TRUE; } else { start = i; } } //Finalise i = lastByteIndex; blocks = llListReplaceList(blocks, [llList2Integer(blocks, i >> 2) | llList2Integer(padding, i & 3)],i >> 2, i >> 2); if (lastByteIndex == byteCount) { blocks = llListReplaceList(blocks, [llList2Integer(blocks, blockCount)], 0, 0); for (i = 1; i < blockCount + 1; ++i) { blocks = llListReplaceList(blocks, [0], i, i); } } blocks = llListReplaceList(blocks, [llList2Integer(blocks, blockCount - 1) | 0x80000000], blockCount - 1, blockCount - 1); for (i = 0; i < blockCount; ++i) { s = llListReplaceList(s, [llList2Integer(s, i) ^ llList2Integer(blocks,i)], i, i); }
s = f(s); //Dump to hex integer j = 0; string hex = ""; while (j < outputBlocks) { for (i = 0; i < blockCount && j < outputBlocks; ++i, ++j) { block = llList2Integer(s,i); hex += llList2String(HEX_CHARS,(block >> 4) & 0x0F) + llList2String(HEX_CHARS, block & 0x0F); hex += llList2String(HEX_CHARS,(block >> 12) & 0x0F) + llList2String(HEX_CHARS,(block >> 8) & 0x0F); hex += llList2String(HEX_CHARS,(block >> 20) & 0x0F) + llList2String(HEX_CHARS,(block >> 16) & 0x0F); hex += llList2String(HEX_CHARS,(block >> 28) & 0x0F) + llList2String(HEX_CHARS,(block >> 24) & 0x0F); } if (j % blockCount == 0) { s =f(s); i = 0; } } if (extraBytes) { block = llList2Integer(s,i); if (extraBytes > 0) { hex += llList2String(HEX_CHARS,(block >> 4) & 0x0F) + llList2String(HEX_CHARS,block & 0x0F); } if (extraBytes > 1) { hex += llList2String(HEX_CHARS,(block >> 12) & 0x0F) + llList2String(HEX_CHARS,(block >> 8) & 0x0F); } if (extraBytes > 2) { hex += llList2String(HEX_CHARS,(block >> 20) & 0x0F) + llList2String(HEX_CHARS,(block >> 16) & 0x0F); } } return hex;
}
string digest(integer algorithm, integer strength, integer outputBits, string message) {
if (algorithm==ALGORITHM_SHA3) { if (strength==224 || strength == 256 || strength == 384 || strength == 512) { return Keccak(strength, PADDING, strength, message); } } else if (algorithm==ALGORITHM_KECCAK) { if (strength==224 || strength==256 || strength==384 || strength==512 || strength==576) { return Keccak(strength, KECCAK_PADDING, strength, message); } } else if (algorithm==ALGORITHM_SHAKE) { if (strength==128 || strength==256) { return Keccak(strength, SHAKE_PADDING, outputBits, message); } } else { return "ERROR: Invalid algorithm"; } return "ERROR: Invalid parameters for algorithm";
} integer total = 0; integer passed = 0; doTest(string testName, integer algorithm, integer bits, integer outputBits, string message, string expected) {
llResetTime(); llSetText("Running "+testName,<1.0,1.0,1.0>,1.0); string result = digest(algorithm, bits, outputBits, message); string conclusion = "FAILED"; total++; if (result == expected) { passed++; //Don't output passes conclusion = "PASSED in "+(string)llGetTime()+" seconds"; } else { conclusion+=" Got: "+result+", Expected: "+expected; }
llOwnerSay(testName+": "+conclusion); llSetText("",<1.0,1.0,1.0>,1.0);
}
string longString = "CKbfXmklN4jDlILbNgZcWeHvOupCAyrZkZW1UmXzD2QUgUhlO13L14apDFb5CecAyAQAPZAteA7V8vpMS9BiGyGjButGvy4qG01pAAQPmb1HVNOwtoLKPIWco9ZkhTCZkUzZmlgfHlfSMZLek6weUFn1h9oyaz9Ccu7ozJxLzzOlYme5ILoiYOppt1llgOcOnBu8MxoTStiKL7Gjx5H4bWtBmxtXGC1oE9nugZpgvPteogU3u5zmf3Gun3Rfh1h8PzmvFtzIaRZE0VfBONv47KZKtO0D7zMcfYJkPq7iR8lBRxmBCysObNPbGBKGrT6s5zUUjm38KHn5q8ukwZ2BZtjbmTCKNUKSgCzHuDCKXfh1yLBXDjQGooemFPNbczW1OEawY8Voi0O7nSFzfJJGoJqBcaHJzOT30FgSlzoZoamD7EgceSErjYJLYAoXJAgWOqeU22hTtl7iHfxjVrafQfOobyUTpH1Zjk9STXpGTzuR62N4HQJxFz9BfZf7S02xAJtotg6zopUTak7x1NQ0kSUFB8ZeDLzHykWxPi5C1CTQCiS4aHnDggEy455zo4ifiLzFNbBo7BW0XTqIJMp5w67kLMvScewY4KoJfvCfRfOW90ETb8kb7OBGSt4WMGvzFzfh3F8CU16oAmUESCQoYcrb7VqJfrUfKbvvPy6vRIfS70981uBI0RKZKg2jIGaCYUG30DzA662zrqfAqkg6eXqAF4JSiZfXRVImpLEfnYUZh7e573OFq8xJhq8BYAFQxPxKKts3YBTA2I42Dq0zq3SvK451CHXjwc1cpACEsLB0Cg8wx093fMi6GyFzR06aR1Cg8zQkl7mYbS2yhq1x7bMUqcklMZgui5t9LFG7RjPhetnnG4CtBzyDcJutSShAqOc3UhnM4w8cho0OshnpgwgR4ebA3fwbubkLyqsX6yFE0w7WKzMqfaSvPttoi1uVtno6KRCg7O71m4DI85uAl7VPjlsyitYNjjxFlRP6blIikaoLl8pmf3eDmFUperIQ";
default {
state_entry() { llOwnerSay("Touch to run test suite"); }
touch_start(integer total_number) { doTest("SHA-3 224 Empty",ALGORITHM_SHA3, 224, 0, "", "6b4e03423667dbb73b6e15454f0eb1abd4597f9a1b078e3f5b5a6bc7"); doTest("SHA-3 512", ALGORITHM_SHA3, 512, 0, "The quick brown fox jumps over the lazy dog", "01dedd5de4ef14642445ba5f5b97c15e47b9ad931326e4b0727cd94cefc44fff23f07bf543139939b49128caf436dc1bdee54fcb24023a08d9403f9b4bf0d450"); doTest("SHA-3 512 Cascade", ALGORITHM_SHA3, 512, 0, "The quick brown fox jumps over the lazy dog.", "18f4f4bd419603f95538837003d9d254c26c23765565162247483f65c50303597bc9ce4d289f21d1c2f1f458828e33dc442100331b35e7eb031b5d38ba6460f8"); doTest("SHA-3 512 Empty", ALGORITHM_SHA3, 512, 0, "", "a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26"); doTest("SHA-3 512 Unicode",ALGORITHM_SHA3, 512, 0, "中文", "059bbe2efc50cc30e4d8ec5a96be697e2108fcbf9193e1296192eddabc13b143c0120d059399a13d0d42651efe23a6c1ce2d1efb576c5b207fa2516050505af7"); doTest("SHA-3 512 Long",ALGORITHM_SHA3, 512, 0, longString, "7e8452e1a742af7170b1b85ef1743e0cac3e8f1dd11ffb6a0657641b813289b1a3efcc76a9d781e5c55400d8c337d437aa43d43ee6694d18814c76f8504a70cd");
doTest("SHA-3 384", ALGORITHM_SHA3, 384, 0, "The quick brown fox jumps over the lazy dog", "7063465e08a93bce31cd89d2e3ca8f602498696e253592ed26f07bf7e703cf328581e1471a7ba7ab119b1a9ebdf8be41"); doTest("SHA-3 384 Cascade",ALGORITHM_SHA3, 384, 0, "The quick brown fox jumps over the lazy dog.", "1a34d81695b622df178bc74df7124fe12fac0f64ba5250b78b99c1273d4b080168e10652894ecad5f1f4d5b965437fb9"); doTest("SHA-3 384 Empty", ALGORITHM_SHA3, 384, 0, "", "0c63a75b845e4f7d01107d852e4c2485c51a50aaaa94fc61995e71bbee983a2ac3713831264adb47fb6bd1e058d5f004"); doTest("SHA-3 384 Unicode",ALGORITHM_SHA3, 384, 0, "中文", "9fb5b99e3c546f2738dcd50a14e9aef9c313800c1bf8cf76bc9b2c3a23307841364c5a2d0794702662c5796fb72f5432"); doTest("SHA-3 384 Long", ALGORITHM_SHA3, 384, 0, longString, "683009d6ebe8596b77142ace13ac0dfc3b640bdbc437f848a41dc11e7b36db49bc4c648f2fff887e49b1ec48e47bd457");
doTest("SHA-3 256",ALGORITHM_SHA3, 256, 0, "The quick brown fox jumps over the lazy dog", "69070dda01975c8c120c3aada1b282394e7f032fa9cf32f4cb2259a0897dfc04"); doTest("SHA-3 256 Cascade",ALGORITHM_SHA3, 256, 0, "The quick brown fox jumps over the lazy dog.", "a80f839cd4f83f6c3dafc87feae470045e4eb0d366397d5c6ce34ba1739f734d"); doTest("SHA-3 256 Empty",ALGORITHM_SHA3, 256, 0, "", "a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a"); ; doTest("SHA-3 256 Unicode",ALGORITHM_SHA3, 256, 0, "中文", "ac5305da3d18be1aed44aa7c70ea548da243a59a5fd546f489348fd5718fb1a0"); doTest("SHA-3 256 Long",ALGORITHM_SHA3, 256, 0, longString, "070ca9c7ea03e907ace05f976db311c85e26f2ccf1f00c8db8e222d1ae336ca9");
doTest("SHA-3 224",ALGORITHM_SHA3, 224, 0, "The quick brown fox jumps over the lazy dog", "d15dadceaa4d5d7bb3b48f446421d542e08ad8887305e28d58335795"); doTest("SHA-3 224 Cascade",ALGORITHM_SHA3, 224, 0, "The quick brown fox jumps over the lazy dog.", "2d0708903833afabdd232a20201176e8b58c5be8a6fe74265ac54db0"); doTest("SHA-3 224 Empty",ALGORITHM_SHA3, 224, 0, "", "6b4e03423667dbb73b6e15454f0eb1abd4597f9a1b078e3f5b5a6bc7"); doTest("SHA-3 224 Unicode",ALGORITHM_SHA3, 224, 0, "中文", "106d169e10b61c2a2a05554d3e631ec94467f8316640f29545d163ee"); doTest("SHA-3 224 Long",ALGORITHM_SHA3, 224, 0, longString, "1ea077c39a1e88ae715458f29fc580ca3e94a7d47dcdd829ac5e68af"); doTest("Keccak 512",ALGORITHM_KECCAK, 512, 0, "The quick brown fox jumps over the lazy dog", "d135bb84d0439dbac432247ee573a23ea7d3c9deb2a968eb31d47c4fb45f1ef4422d6c531b5b9bd6f449ebcc449ea94d0a8f05f62130fda612da53c79659f609"); doTest("Keccak 512 Cascade",ALGORITHM_KECCAK, 512, 0, "The quick brown fox jumps over the lazy dog.", "ab7192d2b11f51c7dd744e7b3441febf397ca07bf812cceae122ca4ded6387889064f8db9230f173f6d1ab6e24b6e50f065b039f799f5592360a6558eb52d760"); doTest("Keccak 512 Empty",ALGORITHM_KECCAK, 512, 0, "", "0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e"); doTest("Keccak 512 Unicode",ALGORITHM_KECCAK, 512, 0, "中文", "2f6a1bd50562230229af34b0ccf46b8754b89d23ae2c5bf7840b4acfcef86f87395edc0a00b2bfef53bafebe3b79de2e3e01cbd8169ddbb08bde888dcc893524"); doTest("Keccak 384",ALGORITHM_KECCAK, 384, 0, "The quick brown fox jumps over the lazy dog", "283990fa9d5fb731d786c5bbee94ea4db4910f18c62c03d173fc0a5e494422e8a0b3da7574dae7fa0baf005e504063b3"); doTest("Keccak 384 Cascade",ALGORITHM_KECCAK, 384, 0, "The quick brown fox jumps over the lazy dog.", "9ad8e17325408eddb6edee6147f13856ad819bb7532668b605a24a2d958f88bd5c169e56dc4b2f89ffd325f6006d820b"); doTest("Keccak 384 Empty",ALGORITHM_KECCAK, 384, 0, "", "2c23146a63a29acf99e73b88f8c24eaa7dc60aa771780ccc006afbfa8fe2479b2dd2b21362337441ac12b515911957ff"); doTest("Keccak 384 Unicode",ALGORITHM_KECCAK, 384, 0, "中文", "743f64bb7544c6ed923be4741b738dde18b7cee384a3a09c4e01acaaac9f19222cdee137702bd3aa05dc198373d87d6c");
doTest("Keccak 256",ALGORITHM_KECCAK, 256, 0, "The quick brown fox jumps over the lazy dog", "4d741b6f1eb29cb2a9b9911c82f56fa8d73b04959d3d9d222895df6c0b28aa15"); doTest("Keccak 256 Cascade",ALGORITHM_KECCAK, 256, 0, "The quick brown fox jumps over the lazy dog.", "578951e24efd62a3d63a86f7cd19aaa53c898fe287d2552133220370240b572d"); doTest("Keccak 256 Empty",ALGORITHM_KECCAK, 256, 0, "", "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"); doTest("Keccak 256 Unicode",ALGORITHM_KECCAK, 256, 0, "中文", "70a2b6579047f0a977fcb5e9120a4e07067bea9abb6916fbc2d13ffb9a4e4eee");
doTest("Keccak 224",ALGORITHM_KECCAK, 224, 0, "The quick brown fox jumps over the lazy dog", "310aee6b30c47350576ac2873fa89fd190cdc488442f3ef654cf23fe"); doTest("Keccak 224 Cascade",ALGORITHM_KECCAK, 224, 0, "The quick brown fox jumps over the lazy dog.", "c59d4eaeac728671c635ff645014e2afa935bebffdb5fbd207ffdeab"); doTest("Keccak 224 Empty",ALGORITHM_KECCAK, 224, 0, "", "f71837502ba8e10837bdd8d365adb85591895602fc552b48b7390abd"); doTest("Keccak 224 Unicode",ALGORITHM_KECCAK, 224, 0, "中文", "7bc2a0b6e7e0a055a61e4f731e2944b560f41ff98967dcbf4bbf77a5"); doTest("Shake 256 (512)",ALGORITHM_SHAKE, 256, 512, "The quick brown fox jumps over the lazy dog", "2f671343d9b2e1604dc9dcf0753e5fe15c7c64a0d283cbbf722d411a0e36f6ca1d01d1369a23539cd80f7c054b6e5daf9c962cad5b8ed5bd11998b40d5734442"); doTest("Shake 256 (512) Cascade",ALGORITHM_SHAKE, 256, 512, "The quick brown fox jumps over the lazy dog.", "bd225bfc8b255f3036f0c8866010ed0053b5163a3cae111e723c0c8e704eca4e5d0f1e2a2fa18c8a219de6b88d5917ff5dd75b5fb345e7409a3b333b508a65fb"); doTest("Shake 256 (512) Empty",ALGORITHM_SHAKE, 256, 512, "", "46b9dd2b0ba88d13233b3feb743eeb243fcd52ea62b81b82b50c27646ed5762fd75dc4ddd8c0f200cb05019d67b592f6fc821c49479ab48640292eacb3b7c4be"); doTest("Shake 256 (512) Unicode",ALGORITHM_SHAKE, 256, 512, "中文", "23c0e9f7f5e9863798dcc6de066ba3bc858fcf1652fbb19aeb0d45b049aae5b3cff3f2ee0f33ec00b4527c25e13c8fdf6abf56a4e4c18821fa9afa7d5cb5609d"); doTest("Shake 128 (256)",ALGORITHM_SHAKE, 128, 256, "The quick brown fox jumps over the lazy dog", "f4202e3c5852f9182a0430fd8144f0a74b95e7417ecae17db0f8cfeed0e3e66e"); doTest("Shake 128 (256) Cascade",ALGORITHM_SHAKE, 128, 256, "The quick brown fox jumps over the lazy dog.", "634069e6b13c3af64c57f05babf5911b6acf1d309b9624fc92b0c0bd9f27f538"); doTest("Shake 128 (256) Empty",ALGORITHM_SHAKE, 128, 256, "", "7f9c2ba4e88f827d616045507605853ed73b8093f6efbc88eb1a6eacfa66ef26"); doTest("Shake 128 (256) Unicode",ALGORITHM_SHAKE, 128, 256, "中文", "d001a1cbe144d95604a9483407bdfbe078421a5f5a91a3de3465182cd11df868"); llOwnerSay("("+(string)passed+"/"+(string)total+") tests passed"); }
}
</lsl>