• Hey Guest! Ever feel like entering a Game Jam, but the time limit is always too much pressure? We get it... You lead a hectic life and dedicating 3 whole days to make a game just doesn't work for you! So, why not enter the GMC SLOW JAM? Take your time! Kick back and make your game over 4 months! Interested? Then just click here!

GML [SOLVED!] SHA512 HMAC script

M

mimsi

Guest
I am writing a piece of software that accesses a website API to retrieve information. I have already created much of the functionality in GML because so far the language hadn't posed me any barriers. Well, I decided after some testing that I wanted to use the section of the API that requires a key and a secret key. Had I looked ahead, I would have just programmed this in JavaScript or PHP. It requires that code equivalent to this line of php:
Code:
hash_hmac('sha512',$uri,$apisecret)
I'm not trying to create an HMAC-SHA512 algorithm for fun or because I think it would help my project's security for any reason. I absolutely have to have it to continue the evolution of the project. Or I have to rewrite my whole project in a different language. I'd really like to avoid that.
SO. I did a lot of research and realized that hash functions are above my level. So I dug around ancient GML forums in foreign languages I don't understand, and I found this gem after a long while:
Code:
///sha512_calc(message)
//Geschreven door Size43
 
var bitlength, binb, add1, add2, add3, add4, binb, j, i, binb_length, _sha512, hex, output;
for(i = 750; i > 351; i -= 1)
{
    _sha512[i] = $0000;
}
 
_sha512[0] = $428a;_sha512[1] = $2f98;_sha512[2] = $d728;_sha512[3] = $ae22;_sha512[4] = $7137;_sha512[5] = $4491;_sha512[6] = $23ef;_sha512[7] = $65cd;_sha512[8] = $b5c0;_sha512[9] = $fbcf;_sha512[10] = $ec4d;_sha512[11] = $3b2f;_sha512[12] = $e9b5;_sha512[13] = $dba5;_sha512[14] = $8189;_sha512[15] = $dbbc;_sha512[16] = $3956;_sha512[17] = $c25b;_sha512[18] = $f348;_sha512[19] = $b538;_sha512[20] = $59f1;_sha512[21] = $11f1;_sha512[22] = $b605;_sha512[23] = $d019;_sha512[24] = $923f;_sha512[25] = $82a4;_sha512[26] = $af19;_sha512[27] = $4f9b;_sha512[28] = $ab1c;_sha512[29] = $5ed5;_sha512[30] = $da6d;_sha512[31] = $8118;_sha512[32] = $d807;_sha512[33] = $aa98;_sha512[34] = $a303;_sha512[35] = $0242;_sha512[36] = $1283;_sha512[37] = $5b01;_sha512[38] = $4570;_sha512[39] = $6fbe;_sha512[40] = $2431;_sha512[41] = $85be;_sha512[42] = $4ee4;_sha512[43] = $b28c;_sha512[44] = $550c;_sha512[45] = $7dc3;_sha512[46] = $d5ff;_sha512[47] = $b4e2;_sha512[48] = $72be;_sha512[49] = $5d74;_sha512[50] = $f27b;_sha512[51] = $896f;_sha512[52] = $80de;_sha512[53] = $b1fe;_sha512[54] = $3b16;_sha512[55] = $96b1;_sha512[56] = $9bdc;_sha512[57] = $06a7;_sha512[58] = $25c7;_sha512[59] = $1235;_sha512[60] = $c19b;_sha512[61] = $f174;_sha512[62] = $cf69;_sha512[63] = $2694;_sha512[64] = $e49b;_sha512[65] = $69c1;_sha512[66] = $9ef1;_sha512[67] = $4ad2;_sha512[68] = $efbe;_sha512[69] = $4786;_sha512[70] = $384f;_sha512[71] = $25e3;_sha512[72] = $0fc1;_sha512[73] = $9dc6;_sha512[74] = $8b8c;_sha512[75] = $d5b5;_sha512[76] = $240c;_sha512[77] = $a1cc;_sha512[78] = $77ac;_sha512[79] = $9c65;_sha512[80] = $2de9;_sha512[81] = $2c6f;_sha512[82] = $592b;_sha512[83] = $0275;_sha512[84] = $4a74;_sha512[85] = $84aa;_sha512[86] = $6ea6;_sha512[87] = $e483;_sha512[88] = $5cb0;_sha512[89] = $a9dc;_sha512[90] = $bd41;_sha512[91] = $fbd4;_sha512[92] = $76f9;_sha512[93] = $88da;_sha512[94] = $8311;_sha512[95] = $53b5;_sha512[96] = $983e;_sha512[97] = $5152;_sha512[98] = $ee66;_sha512[99] = $dfab;_sha512[100] = $a831;_sha512[101] = $c66d;_sha512[102] = $2db4;_sha512[103] = $3210;_sha512[104] = $b003;_sha512[105] = $27c8;_sha512[106] = $98fb;_sha512[107] = $213f;_sha512[108] = $bf59;_sha512[109] = $7fc7;_sha512[110] = $beef;_sha512[111] = $0ee4;_sha512[112] = $c6e0;_sha512[113] = $0bf3;_sha512[114] = $3da8;_sha512[115] = $8fc2;_sha512[116] = $d5a7;_sha512[117] = $9147;_sha512[118] = $930a;_sha512[119] = $a725;_sha512[120] = $06ca;_sha512[121] = $6351;_sha512[122] = $e003;_sha512[123] = $826f;_sha512[124] = $1429;_sha512[125] = $2967;_sha512[126] = $0a0e;_sha512[127] = $6e70;_sha512[128] = $27b7;_sha512[129] = $0a85;_sha512[130] = $46d2;_sha512[131] = $2ffc;_sha512[132] = $2e1b;_sha512[133] = $2138;_sha512[134] = $5c26;_sha512[135] = $c926;_sha512[136] = $4d2c;_sha512[137] = $6dfc;_sha512[138] = $5ac4;_sha512[139] = $2aed;_sha512[140] = $5338;_sha512[141] = $0d13;_sha512[142] = $9d95;_sha512[143] = $b3df;_sha512[144] = $650a;_sha512[145] = $7354;_sha512[146] = $8baf;_sha512[147] = $63de;_sha512[148] = $766a;_sha512[149] = $0abb;_sha512[150] = $3c77;_sha512[151] = $b2a8;_sha512[152] = $81c2;_sha512[153] = $c92e;_sha512[154] = $47ed;_sha512[155] = $aee6;_sha512[156] = $9272;_sha512[157] = $2c85;_sha512[158] = $1482;_sha512[159] = $353b;_sha512[160] = $a2bf;_sha512[161] = $e8a1;_sha512[162] = $4cf1;_sha512[163] = $0364;_sha512[164] = $a81a;_sha512[165] = $664b;_sha512[166] = $bc42;_sha512[167] = $3001;_sha512[168] = $c24b;_sha512[169] = $8b70;_sha512[170] = $d0f8;_sha512[171] = $9791;_sha512[172] = $c76c;_sha512[173] = $51a3;_sha512[174] = $0654;_sha512[175] = $be30;_sha512[176] = $d192;_sha512[177] = $e819;_sha512[178] = $d6ef;_sha512[179] = $5218;_sha512[180] = $d699;_sha512[181] = $0624;_sha512[182] = $5565;_sha512[183] = $a910;_sha512[184] = $f40e;_sha512[185] = $3585;_sha512[186] = $5771;_sha512[187] = $202a;_sha512[188] = $106a;_sha512[189] = $a070;_sha512[190] = $32bb;_sha512[191] = $d1b8;_sha512[192] = $19a4;_sha512[193] = $c116;_sha512[194] = $b8d2;_sha512[195] = $d0c8;_sha512[196] = $1e37;_sha512[197] = $6c08;_sha512[198] = $5141;_sha512[199] = $ab53;_sha512[200] = $2748;_sha512[201] = $774c;_sha512[202] = $df8e;_sha512[203] = $eb99;_sha512[204] = $34b0;_sha512[205] = $bcb5;_sha512[206] = $e19b;_sha512[207] = $48a8;_sha512[208] = $391c;_sha512[209] = $0cb3;_sha512[210] = $c5c9;_sha512[211] = $5a63;_sha512[212] = $4ed8;_sha512[213] = $aa4a;_sha512[214] = $e341;_sha512[215] = $8acb;_sha512[216] = $5b9c;_sha512[217] = $ca4f;_sha512[218] = $7763;_sha512[219] = $e373;_sha512[220] = $682e;_sha512[221] = $6ff3;_sha512[222] = $d6b2;_sha512[223] = $b8a3;_sha512[224] = $748f;_sha512[225] = $82ee;_sha512[226] = $5def;_sha512[227] = $b2fc;_sha512[228] = $78a5;_sha512[229] = $636f;_sha512[230] = $4317;_sha512[231] = $2f60;_sha512[232] = $84c8;_sha512[233] = $7814;_sha512[234] = $a1f0;_sha512[235] = $ab72;_sha512[236] = $8cc7;_sha512[237] = $0208;_sha512[238] = $1a64;_sha512[239] = $39ec;_sha512[240] = $90be;_sha512[241] = $fffa;_sha512[242] = $2363;_sha512[243] = $1e28;_sha512[244] = $a450;_sha512[245] = $6ceb;_sha512[246] = $de82;_sha512[247] = $bde9;_sha512[248] = $bef9;_sha512[249] = $a3f7;_sha512[250] = $b2c6;_sha512[251] = $7915;_sha512[252] = $c671;_sha512[253] = $78f2;_sha512[254] = $e372;_sha512[255] = $532b;_sha512[256] = $ca27;_sha512[257] = $3ece;_sha512[258] = $ea26;_sha512[259] = $619c;_sha512[260] = $d186;_sha512[261] = $b8c7;_sha512[262] = $21c0;_sha512[263] = $c207;_sha512[264] = $eada;_sha512[265] = $7dd6;_sha512[266] = $cde0;_sha512[267] = $eb1e;_sha512[268] = $f57d;_sha512[269] = $4f7f;_sha512[270] = $ee6e;_sha512[271] = $d178;_sha512[272] = $06f0;_sha512[273] = $67aa;_sha512[274] = $7217;_sha512[275] = $6fba;_sha512[276] = $0a63;_sha512[277] = $7dc5;_sha512[278] = $a2c8;_sha512[279] = $98a6;_sha512[280] = $113f;_sha512[281] = $9804;_sha512[282] = $bef9;_sha512[283] = $0dae;_sha512[284] = $1b71;_sha512[285] = $0b35;_sha512[286] = $131c;_sha512[287] = $471b;_sha512[288] = $28db;_sha512[289] = $77f5;_sha512[290] = $2304;_sha512[291] = $7d84;_sha512[292] = $32ca;_sha512[293] = $ab7b;_sha512[294] = $40c7;_sha512[295] = $2493;_sha512[296] = $3c9e;_sha512[297] = $be0a;_sha512[298] = $15c9;_sha512[299] = $bebc;_sha512[300] = $431d;_sha512[301] = $67c4;_sha512[302] = $9c10;_sha512[303] = $0d4c;_sha512[304] = $4cc5;_sha512[305] = $d4be;_sha512[306] = $cb3e;_sha512[307] = $42b6;_sha512[308] = $597f;_sha512[309] = $299c;_sha512[310] = $fc65;_sha512[311] = $7e2a;_sha512[312] = $5fcb;_sha512[313] = $6fab;_sha512[314] = $3ad6;_sha512[315] = $faec;_sha512[316] = $6c44;_sha512[317] = $198c;_sha512[318] = $4a47;_sha512[319] = $5817;_sha512[320] = $6a09;_sha512[321] = $e667;_sha512[322] = $f3bc;_sha512[323] = $c908;_sha512[324] = $bb67;_sha512[325] = $ae85;_sha512[326] = $84ca;_sha512[327] = $a73b;_sha512[328] = $3c6e;_sha512[329] = $f372;_sha512[330] = $fe94;_sha512[331] = $f82b;_sha512[332] = $a54f;_sha512[333] = $f53a;_sha512[334] = $5f1d;_sha512[335] = $36f1;_sha512[336] = $510e;_sha512[337] = $527f;_sha512[338] = $ade6;_sha512[339] = $82d1;_sha512[340] = $9b05;_sha512[341] = $688c;_sha512[342] = $2b3e;_sha512[343] = $6c1f;_sha512[344] = $1f83;_sha512[345] = $d9ab;_sha512[346] = $fb41;_sha512[347] = $bd6b;_sha512[348] = $5be0;_sha512[349] = $cd19;_sha512[350] = $137e;_sha512[351] = $2179;
 
bitlength = string_length(argument0) * 8
 
//Convert to big-endian
for (i = 0; i < string_length(argument0); i += 1)
{
    if(i mod 2 == 0)
    {
        //High byte
        binb[floor(i / 2)] = (ord(string_char_at(argument0, i + 1)) & $ff) << 8;
    }else{
        //Low byte
        binb[floor(i / 2)] |= ord(string_char_at(argument0, i + 1)) & $ff;
    }
}
 
if(i mod 2 == 0)
{
    //High byte
    binb[floor(i / 2)] = $80 << 8;
}else{
    //Low byte
    binb[floor(i / 2)] |= $80;
}
 
//append padding to the source string. The format is described in the FIPS.
binb_length = ((((bitlength + 128) >> 10) + 1) << 6);
 
binb[binb_length - 1] = bitlength & $ffff;
binb[binb_length - 2] = (bitlength >> 16) & $ffff;
 
for (i = 0; i < (binb_length / 2); i += 32) //32 dwords is the block size
{
    _sha512[ 360] = _sha512[320]; _sha512[ 360 + 1] = _sha512[320 + 1]; _sha512[ 360 + 2] = _sha512[320 + 2]; _sha512[ 360 + 3] = _sha512[320 + 3];;
    _sha512[364] = _sha512[324]; _sha512[ 364  + 1] = _sha512[324 + 1]; _sha512[ 364  + 2] = _sha512[324 + 2]; _sha512[ 364  + 3] = _sha512[324 + 3];;
    _sha512[368] = _sha512[328]; _sha512[ 368  + 1] = _sha512[328 + 1]; _sha512[ 368  + 2] = _sha512[328 + 2]; _sha512[ 368  + 3] = _sha512[328 + 3];;
    _sha512[372] = _sha512[332]; _sha512[ 372  + 1] = _sha512[332 + 1]; _sha512[ 372  + 2] = _sha512[332 + 2]; _sha512[ 372  + 3] = _sha512[332 + 3];;
    _sha512[376] = _sha512[336]; _sha512[ 376  + 1] = _sha512[336 + 1]; _sha512[ 376  + 2] = _sha512[336 + 2]; _sha512[ 376  + 3] = _sha512[336 + 3];;
    _sha512[380] = _sha512[340]; _sha512[ 380  + 1] = _sha512[340 + 1]; _sha512[ 380  + 2] = _sha512[340 + 2]; _sha512[ 380  + 3] = _sha512[340 + 3];;
    _sha512[384] = _sha512[344]; _sha512[ 384  + 1] = _sha512[344 + 1]; _sha512[ 384  + 2] = _sha512[344 + 2]; _sha512[ 384  + 3] = _sha512[344 + 3];;
    _sha512[388] = _sha512[348]; _sha512[ 388  + 1] = _sha512[348 + 1]; _sha512[ 388  + 2] = _sha512[348 + 2]; _sha512[ 388  + 3] = _sha512[348 + 3];;
 
    for (j = 0; j < 16; j += 1)
    {
        _sha512[(420 + (j) * 4)] = binb[(i + 2 * j) * 2]; _sha512[(420 + (j) * 4) + 1] = binb[(i + 2 * j) * 2 + 1]; _sha512[(420 + (j) * 4) + 2] = binb[(i + 2 * j + 1) * 2]; _sha512[(420 + (j) * 4) + 3] = binb[(i + 2 * j + 1) * 2 + 1];;
    }
 
    for (j = 16; j < 80; j += 1)
    {
        //sigma1
        //rrot(408, (420 + (j - 2) * 4), 19);
            //Shift 16
            add2 = (420 + (j - 2) * 4)
            add1 = _sha512[add2 + 3];
            _sha512[408 + 3] = _sha512[add2 + 2]
            _sha512[408 + 2] = _sha512[add2 + 1]
            _sha512[408 + 1] = _sha512[add2 + 0]
            _sha512[408 + 0] = add1
         
            //Shift 3
            add1 = _sha512[408 + 3];
            _sha512[408 + 3] = (_sha512[408 + 3] >> 3) | ((_sha512[408 + 2] << 13) & $ffff)
            _sha512[408 + 2] = (_sha512[408 + 2] >> 3) | ((_sha512[408 + 1] << 13) & $ffff)
            _sha512[408 + 1] = (_sha512[408 + 1] >> 3) | ((_sha512[408 + 0] << 13) & $ffff)
            _sha512[408 + 0] = (_sha512[408 + 0] >> 3) | ((add1 << 13) & $ffff)
         
         
        //rrot(412, (420 + (j - 2) * 4), 32 + 29);
            add2 = (420 + (j - 2) * 4);
            //Shift 48
            add1 = _sha512[add2 + 0];
            _sha512[412 + 0] = _sha512[add2 + 1]
            _sha512[412 + 1] = _sha512[add2 + 2]
            _sha512[412 + 2] = _sha512[add2 + 3]
            _sha512[412 + 3] = add1
         
            //Shift 13
            add1 = _sha512[412 + 3];
            _sha512[412 + 3] = (_sha512[412 + 3] >> 13) | ((_sha512[412 + 2] << 3) & $ffff)
            _sha512[412 + 2] = (_sha512[412 + 2] >> 13) | ((_sha512[412 + 1] << 3) & $ffff)
            _sha512[412 + 1] = (_sha512[412 + 1] >> 13) | ((_sha512[412 + 0] << 3) & $ffff)
            _sha512[412 + 0] = (_sha512[412 + 0] >> 13) | ((add1 << 3) & $ffff)
     
        //shr(416, (420 + (j - 2) * 4), 6);
            //Shift 6
            //add2 = (420 + (j - 2) * 4);
            _sha512[416 + 3] = (_sha512[add2 + 3] >> 6) | ((_sha512[add2 + 2] << 10) & $ffff)
            _sha512[416 + 2] = (_sha512[add2 + 2] >> 6) | ((_sha512[add2 + 1] << 10) & $ffff)
            _sha512[416 + 1] = (_sha512[add2 + 1] >> 6) | ((_sha512[add2 + 0] << 10) & $ffff)
            _sha512[416 + 0] = (_sha512[add2 + 0] >> 6)
        _sha512[396] = _sha512[408] ^ _sha512[412] ^ _sha512[416]; _sha512[396 + 1] = _sha512[408 + 1] ^ _sha512[412 + 1] ^ _sha512[416 + 1]; _sha512[396 + 2] = _sha512[408 + 2] ^ _sha512[412 + 2] ^ _sha512[416 + 2]; _sha512[396 + 3] = _sha512[408 + 3] ^ _sha512[412 + 3] ^ _sha512[416 + 3];;
     
        //sigma0
        //rrot(408, (420 + (j - 15) * 4), 1);
            //Shift 1
            add2 = (420 + (j - 15) * 4);
            add1 = _sha512[add2 + 3];
            _sha512[408 + 3] = (_sha512[add2 + 3] >> 1) | ((_sha512[add2 + 2] << 15) & $ffff)
            _sha512[408 + 2] = (_sha512[add2 + 2] >> 1) | ((_sha512[add2 + 1] << 15) & $ffff)
            _sha512[408 + 1] = (_sha512[add2 + 1] >> 1) | ((_sha512[add2 + 0] << 15) & $ffff)
            _sha512[408 + 0] = (_sha512[add2 + 0] >> 1) | ((add1 << 15) & $ffff)
         
        //rrot(412, (420 + (j - 15) * 4), 8);
            //Shift 8
            //add2 = (420 + (j - 15) * 4)
            add1 = _sha512[add2 + 3];
            _sha512[412 + 3] = (_sha512[add2 + 3] >> 8) | ((_sha512[add2 + 2] << 8) & $ffff)
            _sha512[412 + 2] = (_sha512[add2 + 2] >> 8) | ((_sha512[add2 + 1] << 8) & $ffff)
            _sha512[412 + 1] = (_sha512[add2 + 1] >> 8) | ((_sha512[add2 + 0] << 8) & $ffff)
            _sha512[412 + 0] = (_sha512[add2 + 0] >> 8) | ((add1 << 8) & $ffff)
     
     
        //shr(416, (420 + (j - 15) * 4), 7);
            //Shift 6
            //add2 = (420 + (j - 15) * 4);
            _sha512[416 + 3] = (_sha512[add2 + 3] >> 7) | ((_sha512[add2 + 2] << 9) & $ffff)
            _sha512[416 + 2] = (_sha512[add2 + 2] >> 7) | ((_sha512[add2 + 1] << 9) & $ffff)
            _sha512[416 + 1] = (_sha512[add2 + 1] >> 7) | ((_sha512[add2 + 0] << 9) & $ffff)
            _sha512[416 + 0] = (_sha512[add2 + 0] >> 7)
     
        _sha512[392] = _sha512[408] ^ _sha512[412] ^ _sha512[416]; _sha512[392 + 1] = _sha512[408 + 1] ^ _sha512[412 + 1] ^ _sha512[416 + 1]; _sha512[392 + 2] = _sha512[408 + 2] ^ _sha512[412 + 2] ^ _sha512[416 + 2]; _sha512[392 + 3] = _sha512[408 + 3] ^ _sha512[412 + 3] ^ _sha512[416 + 3];;
     
        add1 = _sha512[396 + 3] + _sha512[(420 + (j - 7) * 4) + 3] + _sha512[392 + 3] + _sha512[(420 + (j - 16) * 4) + 3]; add2 = _sha512[396 + 2] + _sha512[(420 + (j - 7) * 4) + 2] + _sha512[392 + 2] + _sha512[(420 + (j - 16) * 4) + 2] + (add1 >> 16); add3 = _sha512[396 + 1] + _sha512[(420 + (j - 7) * 4) + 1] + _sha512[392 + 1] + _sha512[(420 + (j - 16) * 4) + 1] + (add2 >> 16); add4 = _sha512[396] + _sha512[(420 + (j - 7) * 4)] + _sha512[392] + _sha512[(420 + (j - 16) * 4)] + (add3 >> 16); _sha512[(420 + (j) * 4) + 3] = add1 & $00ffff; _sha512[(420 + (j) * 4) + 2] = add2 & $00ffff; _sha512[(420 + (j) * 4) + 1] = add3 & $00ffff; _sha512[(420 + (j) * 4)] = add4 & $00ffff;
    }
 
    for (j = 0; j < 80; j += 1)
    {
        //400
        _sha512[400 + 3] = (_sha512[ 376  + 3] & _sha512[ 380  + 3]) ^ (~_sha512[ 376  + 3] & _sha512[ 384  + 3]);
        _sha512[400 + 2] = (_sha512[ 376  + 2] & _sha512[ 380  + 2]) ^ (~_sha512[ 376  + 2] & _sha512[ 384  + 2]);
        _sha512[400 + 1] = (_sha512[ 376  + 1] & _sha512[ 380  + 1]) ^ (~_sha512[ 376  + 1] & _sha512[ 384  + 1]);
        _sha512[400] = (_sha512[376] & _sha512[380]) ^ (~_sha512[376] & _sha512[384]);
     
        //Sigma1
        //rrot(408, 376, 14);
            //Shift 14
            add1 = _sha512[376 + 3];
            _sha512[408 + 3] = (_sha512[376 + 3] >> 14) | ((_sha512[376 + 2] << 2) & $ffff)
            _sha512[408 + 2] = (_sha512[376 + 2] >> 14) | ((_sha512[376 + 1] << 2) & $ffff)
            _sha512[408 + 1] = (_sha512[376 + 1] >> 14) | ((_sha512[376 + 0] << 2) & $ffff)
            _sha512[408 + 0] = (_sha512[376 + 0] >> 14) | ((add1 << 2) & $ffff)
     
     
        //rrot(412, 376, 18);
            //Shift 16
            add1 = _sha512[376 + 3];
            _sha512[412 + 3] = _sha512[376 + 2]
            _sha512[412 + 2] = _sha512[376 + 1]
            _sha512[412 + 1] = _sha512[376 + 0]
            _sha512[412 + 0] = add1
         
            //Shift 2
            add1 = _sha512[412 + 3];
            _sha512[412 + 3] = (_sha512[412 + 3] >> 2) | ((_sha512[412 + 2] << 14) & $ffff)
            _sha512[412 + 2] = (_sha512[412 + 2] >> 2) | ((_sha512[412 + 1] << 14) & $ffff)
            _sha512[412 + 1] = (_sha512[412 + 1] >> 2) | ((_sha512[412 + 0] << 14) & $ffff)
            _sha512[412 + 0] = (_sha512[412 + 0] >> 2) | ((add1 << 14) & $ffff)
     
        //rrot(416, 376, 32 + 9);
            //Shift 32
            add1 = _sha512[376 + 1];
            add2 = _sha512[376 + 2];
            _sha512[416 + 1] = _sha512[376 + 3]
            _sha512[416 + 2] = _sha512[376 + 0]
            _sha512[416 + 3] = add1;
            _sha512[416 + 0] = add2;
         
            //Shift 9
            add1 = _sha512[416 + 3];
            _sha512[416 + 3] = (_sha512[416 + 3] >> 9) | ((_sha512[416 + 2] << 7) & $ffff)
            _sha512[416 + 2] = (_sha512[416 + 2] >> 9) | ((_sha512[416 + 1] << 7) & $ffff)
            _sha512[416 + 1] = (_sha512[416 + 1] >> 9) | ((_sha512[416 + 0] << 7) & $ffff)
            _sha512[416 + 0] = (_sha512[416 + 0] >> 9) | ((add1 << 7) & $ffff)
     
        //xor3
        _sha512[396] = _sha512[408] ^ _sha512[412] ^ _sha512[416]; _sha512[396 + 1] = _sha512[408 + 1] ^ _sha512[412 + 1] ^ _sha512[416 + 1]; _sha512[396 + 2] = _sha512[408 + 2] ^ _sha512[412 + 2] ^ _sha512[416 + 2]; _sha512[396 + 3] = _sha512[408 + 3] ^ _sha512[412 + 3] ^ _sha512[416 + 3];;
     
        //Sigma0
        //rrot(408,  360, 28);
            //Shift 12
            add1 = _sha512[360 + 3];
            _sha512[408 + 3] = (_sha512[360 + 3] >> 12) | ((_sha512[360 + 2] << 4) & $ffff)
            _sha512[408 + 2] = (_sha512[360 + 2] >> 12) | ((_sha512[360 + 1] << 4) & $ffff)
            _sha512[408 + 1] = (_sha512[360 + 1] >> 12) | ((_sha512[360 + 0] << 4) & $ffff)
            _sha512[408 + 0] = (_sha512[360 + 0] >> 12) | ((add1 << 4) & $ffff)
         
            //Shift 16
            add1 = _sha512[408 + 3];
            _sha512[408 + 3] = _sha512[408 + 2]
            _sha512[408 + 2] = _sha512[408 + 1]
            _sha512[408 + 1] = _sha512[408 + 0]
            _sha512[408 + 0] = add1
     
     
        //rrot(412,  360, 32 + 2);
            //Shift 32
            add1 = _sha512[360 + 1];
            add2 = _sha512[360 + 2];
            _sha512[412 + 1] = _sha512[360 + 3]
            _sha512[412 + 2] = _sha512[360 + 0]
            _sha512[412 + 3] = add1
            _sha512[412 + 0] = add2
         
            //Shift 2
            add1 = _sha512[412 + 3];
            _sha512[412 + 3] = (_sha512[412 + 3] >> 2) | ((_sha512[412 + 2] << 14) & $ffff)
            _sha512[412 + 2] = (_sha512[412 + 2] >> 2) | ((_sha512[412 + 1] << 14) & $ffff)
            _sha512[412 + 1] = (_sha512[412 + 1] >> 2) | ((_sha512[412 + 0] << 14) & $ffff)
            _sha512[412 + 0] = (_sha512[412 + 0] >> 2) | ((add1 << 14) & $ffff)
     
     
        //rrot(416,  360, 32 + 7);
            //Shift 32
            add1 = _sha512[360 + 1];
            add2 = _sha512[360 + 2];
            _sha512[416 + 1] = _sha512[360 + 3]
            _sha512[416 + 2] = _sha512[360 + 0]
            _sha512[416 + 3] = add1
            _sha512[416 + 0] = add2
         
            //Shift 7
            add1 = _sha512[416 + 3];
            _sha512[416 + 3] = (_sha512[416 + 3] >> 7) | ((_sha512[416 + 2] << 9) & $ffff)
            _sha512[416 + 2] = (_sha512[416 + 2] >> 7) | ((_sha512[416 + 1] << 9) & $ffff)
            _sha512[416 + 1] = (_sha512[416 + 1] >> 7) | ((_sha512[416 + 0] << 9) & $ffff)
            _sha512[416 + 0] = (_sha512[416 + 0] >> 7) | ((add1 << 9) & $ffff)
         
     
        _sha512[392] = _sha512[408] ^ _sha512[412] ^ _sha512[416]; _sha512[392 + 1] = _sha512[408 + 1] ^ _sha512[412 + 1] ^ _sha512[416 + 1]; _sha512[392 + 2] = _sha512[408 + 2] ^ _sha512[412 + 2] ^ _sha512[416 + 2]; _sha512[392 + 3] = _sha512[408 + 3] ^ _sha512[412 + 3] ^ _sha512[416 + 3];;
     
        //404
        _sha512[404 + 3] = (_sha512[ 360 + 3] & _sha512[ 364  + 3]) ^ (_sha512[ 360 + 3] & _sha512[ 368  + 3]) ^ (_sha512[ 364  + 3] & _sha512[ 368  + 3]);
        _sha512[404 + 2] = (_sha512[ 360 + 2] & _sha512[ 364  + 2]) ^ (_sha512[ 360 + 2] & _sha512[ 368  + 2]) ^ (_sha512[ 364  + 2] & _sha512[ 368  + 2]);
        _sha512[404 + 1] = (_sha512[ 360 + 1] & _sha512[ 364  + 1]) ^ (_sha512[ 360 + 1] & _sha512[ 368  + 1]) ^ (_sha512[ 364  + 1] & _sha512[ 368  + 1]);
        _sha512[404] = (_sha512[ 360] & _sha512[364]) ^ (_sha512[ 360] & _sha512[368]) ^ (_sha512[364] & _sha512[368]);
     
        //j * 4 = k[j]
        add1 = _sha512[388 + 3] + _sha512[396 + 3] + _sha512[400 + 3] + _sha512[j * 4 + 3] + _sha512[(420 + (j) * 4) + 3]; add2 = _sha512[388 + 2] + _sha512[396 + 2] + _sha512[400 + 2] + _sha512[j * 4 + 2] + _sha512[(420 + (j) * 4) + 2] + (add1 >> 16); add3 = _sha512[388 + 1] + _sha512[396 + 1] + _sha512[400 + 1] + _sha512[j * 4 + 1] + _sha512[(420 + (j) * 4) + 1] + (add2 >> 16); add4 = _sha512[388] + _sha512[396] + _sha512[400] + _sha512[j * 4] + _sha512[(420 + (j) * 4)] + (add3 >> 16); _sha512[352 + 3] = add1 & $00ffff; _sha512[352 + 2] = add2 & $00ffff; _sha512[352 + 1] = add3 & $00ffff; _sha512[352] = add4 & $00ffff;
     
        add1 = _sha512[392 + 3] + _sha512[404 + 3]; add2 = _sha512[392 + 2] + _sha512[404 + 2] + (add1 >> 16); add3 = _sha512[392 + 1] + _sha512[404 + 1] + (add2 >> 16); add4 = _sha512[392] + _sha512[404] + (add3 >> 16); _sha512[356 + 3] = add1 & $00ffff; _sha512[356 + 2] = add2 & $00ffff; _sha512[356 + 1] = add3 & $00ffff; _sha512[356] = add4 & $00ffff;
     
        _sha512[388] = _sha512[384]; _sha512[ 388  + 1] = _sha512[ 384  + 1]; _sha512[ 388  + 2] = _sha512[ 384  + 2]; _sha512[ 388  + 3] = _sha512[ 384  + 3];;
        _sha512[384] = _sha512[380]; _sha512[ 384  + 1] = _sha512[ 380  + 1]; _sha512[ 384  + 2] = _sha512[ 380  + 2]; _sha512[ 384  + 3] = _sha512[ 380  + 3];;
        _sha512[380] = _sha512[376]; _sha512[ 380  + 1] = _sha512[ 376  + 1]; _sha512[ 380  + 2] = _sha512[ 376  + 2]; _sha512[ 380  + 3] = _sha512[ 376  + 3];;
        add1 = _sha512[372 + 3] + _sha512[352 + 3]; add2 = _sha512[372 + 2] + _sha512[352 + 2] + (add1 >> 16); add3 = _sha512[372 + 1] + _sha512[352 + 1] + (add2 >> 16); add4 = _sha512[372] + _sha512[352] + (add3 >> 16); _sha512[376 + 3] = add1 & $00ffff; _sha512[376 + 2] = add2 & $00ffff; _sha512[376 + 1] = add3 & $00ffff; _sha512[376] = add4 & $00ffff;
 
        _sha512[372] = _sha512[368]; _sha512[ 372  + 1] = _sha512[ 368  + 1]; _sha512[ 372  + 2] = _sha512[ 368  + 2]; _sha512[ 372  + 3] = _sha512[ 368  + 3];;
        _sha512[368] = _sha512[364]; _sha512[ 368  + 1] = _sha512[ 364  + 1]; _sha512[ 368  + 2] = _sha512[ 364  + 2]; _sha512[ 368  + 3] = _sha512[ 364  + 3];;
        _sha512[364] = _sha512[ 360]; _sha512[ 364  + 1] = _sha512[ 360 + 1]; _sha512[ 364  + 2] = _sha512[ 360 + 2]; _sha512[ 364  + 3] = _sha512[ 360 + 3];;
        add1 = _sha512[352 + 3] + _sha512[356 + 3]; add2 = _sha512[352 + 2] + _sha512[356 + 2] + (add1 >> 16); add3 = _sha512[352 + 1] + _sha512[356 + 1] + (add2 >> 16); add4 = _sha512[352] + _sha512[356] + (add3 >> 16); _sha512[360 + 3] = add1 & $00ffff; _sha512[360 + 2] = add2 & $00ffff; _sha512[360 + 1] = add3 & $00ffff; _sha512[360] = add4 & $00ffff;
    }
 
 
    add1 = _sha512[320 + 3] + _sha512[ 360 + 3]; add2 = _sha512[320 + 2] + _sha512[ 360 + 2] + (add1 >> 16); add3 = _sha512[320 + 1] + _sha512[ 360 + 1] + (add2 >> 16); add4 = _sha512[320] + _sha512[ 360] + (add3 >> 16); _sha512[320 + 3] = add1 & $00ffff; _sha512[320 + 2] = add2 & $00ffff; _sha512[320 + 1] = add3 & $00ffff; _sha512[320] = add4 & $00ffff;
    add1 = _sha512[324 + 3] + _sha512[ 364  + 3]; add2 = _sha512[324 + 2] + _sha512[ 364  + 2] + (add1 >> 16); add3 = _sha512[324 + 1] + _sha512[ 364  + 1] + (add2 >> 16); add4 = _sha512[324] + _sha512[ 364 ] + (add3 >> 16); _sha512[324 + 3] = add1 & $00ffff; _sha512[324 + 2] = add2 & $00ffff; _sha512[324 + 1] = add3 & $00ffff; _sha512[324] = add4 & $00ffff;
    add1 = _sha512[328 + 3] + _sha512[ 368  + 3]; add2 = _sha512[328 + 2] + _sha512[ 368  + 2] + (add1 >> 16); add3 = _sha512[328 + 1] + _sha512[ 368  + 1] + (add2 >> 16); add4 = _sha512[328] + _sha512[ 368 ] + (add3 >> 16); _sha512[328 + 3] = add1 & $00ffff; _sha512[328 + 2] = add2 & $00ffff; _sha512[328 + 1] = add3 & $00ffff; _sha512[328] = add4 & $00ffff;
    add1 = _sha512[332 + 3] + _sha512[ 372  + 3]; add2 = _sha512[332 + 2] + _sha512[ 372  + 2] + (add1 >> 16); add3 = _sha512[332 + 1] + _sha512[ 372  + 1] + (add2 >> 16); add4 = _sha512[332] + _sha512[ 372 ] + (add3 >> 16); _sha512[332 + 3] = add1 & $00ffff; _sha512[332 + 2] = add2 & $00ffff; _sha512[332 + 1] = add3 & $00ffff; _sha512[332] = add4 & $00ffff;
    add1 = _sha512[336 + 3] + _sha512[ 376  + 3]; add2 = _sha512[336 + 2] + _sha512[ 376  + 2] + (add1 >> 16); add3 = _sha512[336 + 1] + _sha512[ 376  + 1] + (add2 >> 16); add4 = _sha512[336] + _sha512[ 376 ] + (add3 >> 16); _sha512[336 + 3] = add1 & $00ffff; _sha512[336 + 2] = add2 & $00ffff; _sha512[336 + 1] = add3 & $00ffff; _sha512[336] = add4 & $00ffff;
    add1 = _sha512[340 + 3] + _sha512[ 380  + 3]; add2 = _sha512[340 + 2] + _sha512[ 380  + 2] + (add1 >> 16); add3 = _sha512[340 + 1] + _sha512[ 380  + 1] + (add2 >> 16); add4 = _sha512[340] + _sha512[ 380 ] + (add3 >> 16); _sha512[340 + 3] = add1 & $00ffff; _sha512[340 + 2] = add2 & $00ffff; _sha512[340 + 1] = add3 & $00ffff; _sha512[340] = add4 & $00ffff;
    add1 = _sha512[344 + 3] + _sha512[ 384  + 3]; add2 = _sha512[344 + 2] + _sha512[ 384  + 2] + (add1 >> 16); add3 = _sha512[344 + 1] + _sha512[ 384  + 1] + (add2 >> 16); add4 = _sha512[344] + _sha512[ 384 ] + (add3 >> 16); _sha512[344 + 3] = add1 & $00ffff; _sha512[344 + 2] = add2 & $00ffff; _sha512[344 + 1] = add3 & $00ffff; _sha512[344] = add4 & $00ffff;
    add1 = _sha512[348 + 3] + _sha512[ 388  + 3]; add2 = _sha512[348 + 2] + _sha512[ 388  + 2] + (add1 >> 16); add3 = _sha512[348 + 1] + _sha512[ 388  + 1] + (add2 >> 16); add4 = _sha512[348] + _sha512[ 388 ] + (add3 >> 16); _sha512[348 + 3] = add1 & $00ffff; _sha512[348 + 2] = add2 & $00ffff; _sha512[348 + 1] = add3 & $00ffff; _sha512[348] = add4 & $00ffff;
}
 
//convert hash to hex string
hex = "0123456789abcdef";
output = "";
for (i = 0; i < 8; i += 1)
{
    for(j = 0; j < 4 ; j += 1)
    {
        var b; b = _sha512[(320 + i * 4) + j];
        output += string_char_at(hex, ((b >> 12) & $f) + 1) +
                    string_char_at(hex, ((b >> 8) & $f) + 1) +
                    string_char_at(hex, ((b >> 4) & $f) + 1) +
                    string_char_at(hex, (b & $f) + 1);
    }
}
 
return output;
The SHA512 algorithm here works flawlessly. I tested it against a trusted SHA512 algorithm. Now I need to figure out how in the world to HMAC it. Does anyone have any good ideas?
I found this script for HMAC-SHA1 here: http://www.gmlscripts.com/forums/viewtopic.php?id=2069
but I have no clue how to start converting it to work with SHA512. I tried changing some numbers around, but ran into the problem of just plain not understanding what I was doing.
Any help would be appreciated so that I don't have to rewrite my entire project in JavaScript. Thank you.

EDIT:: THIS PROBLEM IS NOW SOLVED, SCROLL DOWN TO MY LAST POSTS TO SEE WORKING SHA512 AND SHA512 HMAC ALGORITHMS
 
Last edited by a moderator:

FrostyCat

Redemption Seeker
Take the HMAC-SHA1 script and swap out the buffer_sha1() calls with a buffer-oriented version of sha512_calc().

Haven't tested this one for real, but adapting the SHA512 script for buffers doesn't look that hard. Just replace string_length(argument0) with the length of the buffer region and ord(string_char_at(argument0, i+1)) with a read from the next byte.
Code:
///sha512_calc_buffer(buffer, start, length)
//Geschreven door Size43

var bitlength, binb, add1, add2, add3, add4, binb, j, i, binb_length, _sha512, hex, output;
for(i = 750; i > 351; i -= 1)
{
    _sha512[i] = $0000;
}

_sha512[0] = $428a;_sha512[1] = $2f98;_sha512[2] = $d728;_sha512[3] = $ae22;_sha512[4] = $7137;_sha512[5] = $4491;_sha512[6] = $23ef;_sha512[7] = $65cd;_sha512[8] = $b5c0;_sha512[9] = $fbcf;_sha512[10] = $ec4d;_sha512[11] = $3b2f;_sha512[12] = $e9b5;_sha512[13] = $dba5;_sha512[14] = $8189;_sha512[15] = $dbbc;_sha512[16] = $3956;_sha512[17] = $c25b;_sha512[18] = $f348;_sha512[19] = $b538;_sha512[20] = $59f1;_sha512[21] = $11f1;_sha512[22] = $b605;_sha512[23] = $d019;_sha512[24] = $923f;_sha512[25] = $82a4;_sha512[26] = $af19;_sha512[27] = $4f9b;_sha512[28] = $ab1c;_sha512[29] = $5ed5;_sha512[30] = $da6d;_sha512[31] = $8118;_sha512[32] = $d807;_sha512[33] = $aa98;_sha512[34] = $a303;_sha512[35] = $0242;_sha512[36] = $1283;_sha512[37] = $5b01;_sha512[38] = $4570;_sha512[39] = $6fbe;_sha512[40] = $2431;_sha512[41] = $85be;_sha512[42] = $4ee4;_sha512[43] = $b28c;_sha512[44] = $550c;_sha512[45] = $7dc3;_sha512[46] = $d5ff;_sha512[47] = $b4e2;_sha512[48] = $72be;_sha512[49] = $5d74;_sha512[50] = $f27b;_sha512[51] = $896f;_sha512[52] = $80de;_sha512[53] = $b1fe;_sha512[54] = $3b16;_sha512[55] = $96b1;_sha512[56] = $9bdc;_sha512[57] = $06a7;_sha512[58] = $25c7;_sha512[59] = $1235;_sha512[60] = $c19b;_sha512[61] = $f174;_sha512[62] = $cf69;_sha512[63] = $2694;_sha512[64] = $e49b;_sha512[65] = $69c1;_sha512[66] = $9ef1;_sha512[67] = $4ad2;_sha512[68] = $efbe;_sha512[69] = $4786;_sha512[70] = $384f;_sha512[71] = $25e3;_sha512[72] = $0fc1;_sha512[73] = $9dc6;_sha512[74] = $8b8c;_sha512[75] = $d5b5;_sha512[76] = $240c;_sha512[77] = $a1cc;_sha512[78] = $77ac;_sha512[79] = $9c65;_sha512[80] = $2de9;_sha512[81] = $2c6f;_sha512[82] = $592b;_sha512[83] = $0275;_sha512[84] = $4a74;_sha512[85] = $84aa;_sha512[86] = $6ea6;_sha512[87] = $e483;_sha512[88] = $5cb0;_sha512[89] = $a9dc;_sha512[90] = $bd41;_sha512[91] = $fbd4;_sha512[92] = $76f9;_sha512[93] = $88da;_sha512[94] = $8311;_sha512[95] = $53b5;_sha512[96] = $983e;_sha512[97] = $5152;_sha512[98] = $ee66;_sha512[99] = $dfab;_sha512[100] = $a831;_sha512[101] = $c66d;_sha512[102] = $2db4;_sha512[103] = $3210;_sha512[104] = $b003;_sha512[105] = $27c8;_sha512[106] = $98fb;_sha512[107] = $213f;_sha512[108] = $bf59;_sha512[109] = $7fc7;_sha512[110] = $beef;_sha512[111] = $0ee4;_sha512[112] = $c6e0;_sha512[113] = $0bf3;_sha512[114] = $3da8;_sha512[115] = $8fc2;_sha512[116] = $d5a7;_sha512[117] = $9147;_sha512[118] = $930a;_sha512[119] = $a725;_sha512[120] = $06ca;_sha512[121] = $6351;_sha512[122] = $e003;_sha512[123] = $826f;_sha512[124] = $1429;_sha512[125] = $2967;_sha512[126] = $0a0e;_sha512[127] = $6e70;_sha512[128] = $27b7;_sha512[129] = $0a85;_sha512[130] = $46d2;_sha512[131] = $2ffc;_sha512[132] = $2e1b;_sha512[133] = $2138;_sha512[134] = $5c26;_sha512[135] = $c926;_sha512[136] = $4d2c;_sha512[137] = $6dfc;_sha512[138] = $5ac4;_sha512[139] = $2aed;_sha512[140] = $5338;_sha512[141] = $0d13;_sha512[142] = $9d95;_sha512[143] = $b3df;_sha512[144] = $650a;_sha512[145] = $7354;_sha512[146] = $8baf;_sha512[147] = $63de;_sha512[148] = $766a;_sha512[149] = $0abb;_sha512[150] = $3c77;_sha512[151] = $b2a8;_sha512[152] = $81c2;_sha512[153] = $c92e;_sha512[154] = $47ed;_sha512[155] = $aee6;_sha512[156] = $9272;_sha512[157] = $2c85;_sha512[158] = $1482;_sha512[159] = $353b;_sha512[160] = $a2bf;_sha512[161] = $e8a1;_sha512[162] = $4cf1;_sha512[163] = $0364;_sha512[164] = $a81a;_sha512[165] = $664b;_sha512[166] = $bc42;_sha512[167] = $3001;_sha512[168] = $c24b;_sha512[169] = $8b70;_sha512[170] = $d0f8;_sha512[171] = $9791;_sha512[172] = $c76c;_sha512[173] = $51a3;_sha512[174] = $0654;_sha512[175] = $be30;_sha512[176] = $d192;_sha512[177] = $e819;_sha512[178] = $d6ef;_sha512[179] = $5218;_sha512[180] = $d699;_sha512[181] = $0624;_sha512[182] = $5565;_sha512[183] = $a910;_sha512[184] = $f40e;_sha512[185] = $3585;_sha512[186] = $5771;_sha512[187] = $202a;_sha512[188] = $106a;_sha512[189] = $a070;_sha512[190] = $32bb;_sha512[191] = $d1b8;_sha512[192] = $19a4;_sha512[193] = $c116;_sha512[194] = $b8d2;_sha512[195] = $d0c8;_sha512[196] = $1e37;_sha512[197] = $6c08;_sha512[198] = $5141;_sha512[199] = $ab53;_sha512[200] = $2748;_sha512[201] = $774c;_sha512[202] = $df8e;_sha512[203] = $eb99;_sha512[204] = $34b0;_sha512[205] = $bcb5;_sha512[206] = $e19b;_sha512[207] = $48a8;_sha512[208] = $391c;_sha512[209] = $0cb3;_sha512[210] = $c5c9;_sha512[211] = $5a63;_sha512[212] = $4ed8;_sha512[213] = $aa4a;_sha512[214] = $e341;_sha512[215] = $8acb;_sha512[216] = $5b9c;_sha512[217] = $ca4f;_sha512[218] = $7763;_sha512[219] = $e373;_sha512[220] = $682e;_sha512[221] = $6ff3;_sha512[222] = $d6b2;_sha512[223] = $b8a3;_sha512[224] = $748f;_sha512[225] = $82ee;_sha512[226] = $5def;_sha512[227] = $b2fc;_sha512[228] = $78a5;_sha512[229] = $636f;_sha512[230] = $4317;_sha512[231] = $2f60;_sha512[232] = $84c8;_sha512[233] = $7814;_sha512[234] = $a1f0;_sha512[235] = $ab72;_sha512[236] = $8cc7;_sha512[237] = $0208;_sha512[238] = $1a64;_sha512[239] = $39ec;_sha512[240] = $90be;_sha512[241] = $fffa;_sha512[242] = $2363;_sha512[243] = $1e28;_sha512[244] = $a450;_sha512[245] = $6ceb;_sha512[246] = $de82;_sha512[247] = $bde9;_sha512[248] = $bef9;_sha512[249] = $a3f7;_sha512[250] = $b2c6;_sha512[251] = $7915;_sha512[252] = $c671;_sha512[253] = $78f2;_sha512[254] = $e372;_sha512[255] = $532b;_sha512[256] = $ca27;_sha512[257] = $3ece;_sha512[258] = $ea26;_sha512[259] = $619c;_sha512[260] = $d186;_sha512[261] = $b8c7;_sha512[262] = $21c0;_sha512[263] = $c207;_sha512[264] = $eada;_sha512[265] = $7dd6;_sha512[266] = $cde0;_sha512[267] = $eb1e;_sha512[268] = $f57d;_sha512[269] = $4f7f;_sha512[270] = $ee6e;_sha512[271] = $d178;_sha512[272] = $06f0;_sha512[273] = $67aa;_sha512[274] = $7217;_sha512[275] = $6fba;_sha512[276] = $0a63;_sha512[277] = $7dc5;_sha512[278] = $a2c8;_sha512[279] = $98a6;_sha512[280] = $113f;_sha512[281] = $9804;_sha512[282] = $bef9;_sha512[283] = $0dae;_sha512[284] = $1b71;_sha512[285] = $0b35;_sha512[286] = $131c;_sha512[287] = $471b;_sha512[288] = $28db;_sha512[289] = $77f5;_sha512[290] = $2304;_sha512[291] = $7d84;_sha512[292] = $32ca;_sha512[293] = $ab7b;_sha512[294] = $40c7;_sha512[295] = $2493;_sha512[296] = $3c9e;_sha512[297] = $be0a;_sha512[298] = $15c9;_sha512[299] = $bebc;_sha512[300] = $431d;_sha512[301] = $67c4;_sha512[302] = $9c10;_sha512[303] = $0d4c;_sha512[304] = $4cc5;_sha512[305] = $d4be;_sha512[306] = $cb3e;_sha512[307] = $42b6;_sha512[308] = $597f;_sha512[309] = $299c;_sha512[310] = $fc65;_sha512[311] = $7e2a;_sha512[312] = $5fcb;_sha512[313] = $6fab;_sha512[314] = $3ad6;_sha512[315] = $faec;_sha512[316] = $6c44;_sha512[317] = $198c;_sha512[318] = $4a47;_sha512[319] = $5817;_sha512[320] = $6a09;_sha512[321] = $e667;_sha512[322] = $f3bc;_sha512[323] = $c908;_sha512[324] = $bb67;_sha512[325] = $ae85;_sha512[326] = $84ca;_sha512[327] = $a73b;_sha512[328] = $3c6e;_sha512[329] = $f372;_sha512[330] = $fe94;_sha512[331] = $f82b;_sha512[332] = $a54f;_sha512[333] = $f53a;_sha512[334] = $5f1d;_sha512[335] = $36f1;_sha512[336] = $510e;_sha512[337] = $527f;_sha512[338] = $ade6;_sha512[339] = $82d1;_sha512[340] = $9b05;_sha512[341] = $688c;_sha512[342] = $2b3e;_sha512[343] = $6c1f;_sha512[344] = $1f83;_sha512[345] = $d9ab;_sha512[346] = $fb41;_sha512[347] = $bd6b;_sha512[348] = $5be0;_sha512[349] = $cd19;_sha512[350] = $137e;_sha512[351] = $2179;

bitlength = argument2 * 8;

//Convert to big-endian
buffer_seek(argument0, buffer_seek_start, argument1);
for (i = 0; i < argument2; i += 1)
{
    if(i mod 2 == 0)
    {
        //High byte
        binb[floor(i / 2)] = (buffer_read(argument0, buffer_u8) & $ff) << 8;
    }else{
        //Low byte
        binb[floor(i / 2)] |= buffer_read(argument0, buffer_u8) & $ff;
    }
}

if(i mod 2 == 0)
{
    //High byte
    binb[floor(i / 2)] = $80 << 8;
}else{
    //Low byte
    binb[floor(i / 2)] |= $80;
}

//append padding to the source string. The format is described in the FIPS.
binb_length = ((((bitlength + 128) >> 10) + 1) << 6);

binb[binb_length - 1] = bitlength & $ffff;
binb[binb_length - 2] = (bitlength >> 16) & $ffff;

for (i = 0; i < (binb_length / 2); i += 32) //32 dwords is the block size
{
    _sha512[ 360] = _sha512[320]; _sha512[ 360 + 1] = _sha512[320 + 1]; _sha512[ 360 + 2] = _sha512[320 + 2]; _sha512[ 360 + 3] = _sha512[320 + 3];;
    _sha512[364] = _sha512[324]; _sha512[ 364  + 1] = _sha512[324 + 1]; _sha512[ 364  + 2] = _sha512[324 + 2]; _sha512[ 364  + 3] = _sha512[324 + 3];;
    _sha512[368] = _sha512[328]; _sha512[ 368  + 1] = _sha512[328 + 1]; _sha512[ 368  + 2] = _sha512[328 + 2]; _sha512[ 368  + 3] = _sha512[328 + 3];;
    _sha512[372] = _sha512[332]; _sha512[ 372  + 1] = _sha512[332 + 1]; _sha512[ 372  + 2] = _sha512[332 + 2]; _sha512[ 372  + 3] = _sha512[332 + 3];;
    _sha512[376] = _sha512[336]; _sha512[ 376  + 1] = _sha512[336 + 1]; _sha512[ 376  + 2] = _sha512[336 + 2]; _sha512[ 376  + 3] = _sha512[336 + 3];;
    _sha512[380] = _sha512[340]; _sha512[ 380  + 1] = _sha512[340 + 1]; _sha512[ 380  + 2] = _sha512[340 + 2]; _sha512[ 380  + 3] = _sha512[340 + 3];;
    _sha512[384] = _sha512[344]; _sha512[ 384  + 1] = _sha512[344 + 1]; _sha512[ 384  + 2] = _sha512[344 + 2]; _sha512[ 384  + 3] = _sha512[344 + 3];;
    _sha512[388] = _sha512[348]; _sha512[ 388  + 1] = _sha512[348 + 1]; _sha512[ 388  + 2] = _sha512[348 + 2]; _sha512[ 388  + 3] = _sha512[348 + 3];;

    for (j = 0; j < 16; j += 1)
    {
        _sha512[(420 + (j) * 4)] = binb[(i + 2 * j) * 2]; _sha512[(420 + (j) * 4) + 1] = binb[(i + 2 * j) * 2 + 1]; _sha512[(420 + (j) * 4) + 2] = binb[(i + 2 * j + 1) * 2]; _sha512[(420 + (j) * 4) + 3] = binb[(i + 2 * j + 1) * 2 + 1];;
    }
 
    for (j = 16; j < 80; j += 1)
    {
        //sigma1
        //rrot(408, (420 + (j - 2) * 4), 19);
            //Shift 16
            add2 = (420 + (j - 2) * 4)
            add1 = _sha512[add2 + 3];
            _sha512[408 + 3] = _sha512[add2 + 2]
            _sha512[408 + 2] = _sha512[add2 + 1]
            _sha512[408 + 1] = _sha512[add2 + 0]
            _sha512[408 + 0] = add1
        
            //Shift 3
            add1 = _sha512[408 + 3];
            _sha512[408 + 3] = (_sha512[408 + 3] >> 3) | ((_sha512[408 + 2] << 13) & $ffff)
            _sha512[408 + 2] = (_sha512[408 + 2] >> 3) | ((_sha512[408 + 1] << 13) & $ffff)
            _sha512[408 + 1] = (_sha512[408 + 1] >> 3) | ((_sha512[408 + 0] << 13) & $ffff)
            _sha512[408 + 0] = (_sha512[408 + 0] >> 3) | ((add1 << 13) & $ffff)
        
        
        //rrot(412, (420 + (j - 2) * 4), 32 + 29);
            add2 = (420 + (j - 2) * 4);
            //Shift 48
            add1 = _sha512[add2 + 0];
            _sha512[412 + 0] = _sha512[add2 + 1]
            _sha512[412 + 1] = _sha512[add2 + 2]
            _sha512[412 + 2] = _sha512[add2 + 3]
            _sha512[412 + 3] = add1
        
            //Shift 13
            add1 = _sha512[412 + 3];
            _sha512[412 + 3] = (_sha512[412 + 3] >> 13) | ((_sha512[412 + 2] << 3) & $ffff)
            _sha512[412 + 2] = (_sha512[412 + 2] >> 13) | ((_sha512[412 + 1] << 3) & $ffff)
            _sha512[412 + 1] = (_sha512[412 + 1] >> 13) | ((_sha512[412 + 0] << 3) & $ffff)
            _sha512[412 + 0] = (_sha512[412 + 0] >> 13) | ((add1 << 3) & $ffff)
    
        //shr(416, (420 + (j - 2) * 4), 6);
            //Shift 6
            //add2 = (420 + (j - 2) * 4);
            _sha512[416 + 3] = (_sha512[add2 + 3] >> 6) | ((_sha512[add2 + 2] << 10) & $ffff)
            _sha512[416 + 2] = (_sha512[add2 + 2] >> 6) | ((_sha512[add2 + 1] << 10) & $ffff)
            _sha512[416 + 1] = (_sha512[add2 + 1] >> 6) | ((_sha512[add2 + 0] << 10) & $ffff)
            _sha512[416 + 0] = (_sha512[add2 + 0] >> 6)
        _sha512[396] = _sha512[408] ^ _sha512[412] ^ _sha512[416]; _sha512[396 + 1] = _sha512[408 + 1] ^ _sha512[412 + 1] ^ _sha512[416 + 1]; _sha512[396 + 2] = _sha512[408 + 2] ^ _sha512[412 + 2] ^ _sha512[416 + 2]; _sha512[396 + 3] = _sha512[408 + 3] ^ _sha512[412 + 3] ^ _sha512[416 + 3];;
    
        //sigma0
        //rrot(408, (420 + (j - 15) * 4), 1);
            //Shift 1
            add2 = (420 + (j - 15) * 4);
            add1 = _sha512[add2 + 3];
            _sha512[408 + 3] = (_sha512[add2 + 3] >> 1) | ((_sha512[add2 + 2] << 15) & $ffff)
            _sha512[408 + 2] = (_sha512[add2 + 2] >> 1) | ((_sha512[add2 + 1] << 15) & $ffff)
            _sha512[408 + 1] = (_sha512[add2 + 1] >> 1) | ((_sha512[add2 + 0] << 15) & $ffff)
            _sha512[408 + 0] = (_sha512[add2 + 0] >> 1) | ((add1 << 15) & $ffff)
        
        //rrot(412, (420 + (j - 15) * 4), 8);
            //Shift 8
            //add2 = (420 + (j - 15) * 4)
            add1 = _sha512[add2 + 3];
            _sha512[412 + 3] = (_sha512[add2 + 3] >> 8) | ((_sha512[add2 + 2] << 8) & $ffff)
            _sha512[412 + 2] = (_sha512[add2 + 2] >> 8) | ((_sha512[add2 + 1] << 8) & $ffff)
            _sha512[412 + 1] = (_sha512[add2 + 1] >> 8) | ((_sha512[add2 + 0] << 8) & $ffff)
            _sha512[412 + 0] = (_sha512[add2 + 0] >> 8) | ((add1 << 8) & $ffff)
    
    
        //shr(416, (420 + (j - 15) * 4), 7);
            //Shift 6
            //add2 = (420 + (j - 15) * 4);
            _sha512[416 + 3] = (_sha512[add2 + 3] >> 7) | ((_sha512[add2 + 2] << 9) & $ffff)
            _sha512[416 + 2] = (_sha512[add2 + 2] >> 7) | ((_sha512[add2 + 1] << 9) & $ffff)
            _sha512[416 + 1] = (_sha512[add2 + 1] >> 7) | ((_sha512[add2 + 0] << 9) & $ffff)
            _sha512[416 + 0] = (_sha512[add2 + 0] >> 7)
    
        _sha512[392] = _sha512[408] ^ _sha512[412] ^ _sha512[416]; _sha512[392 + 1] = _sha512[408 + 1] ^ _sha512[412 + 1] ^ _sha512[416 + 1]; _sha512[392 + 2] = _sha512[408 + 2] ^ _sha512[412 + 2] ^ _sha512[416 + 2]; _sha512[392 + 3] = _sha512[408 + 3] ^ _sha512[412 + 3] ^ _sha512[416 + 3];;
    
        add1 = _sha512[396 + 3] + _sha512[(420 + (j - 7) * 4) + 3] + _sha512[392 + 3] + _sha512[(420 + (j - 16) * 4) + 3]; add2 = _sha512[396 + 2] + _sha512[(420 + (j - 7) * 4) + 2] + _sha512[392 + 2] + _sha512[(420 + (j - 16) * 4) + 2] + (add1 >> 16); add3 = _sha512[396 + 1] + _sha512[(420 + (j - 7) * 4) + 1] + _sha512[392 + 1] + _sha512[(420 + (j - 16) * 4) + 1] + (add2 >> 16); add4 = _sha512[396] + _sha512[(420 + (j - 7) * 4)] + _sha512[392] + _sha512[(420 + (j - 16) * 4)] + (add3 >> 16); _sha512[(420 + (j) * 4) + 3] = add1 & $00ffff; _sha512[(420 + (j) * 4) + 2] = add2 & $00ffff; _sha512[(420 + (j) * 4) + 1] = add3 & $00ffff; _sha512[(420 + (j) * 4)] = add4 & $00ffff;
    }
 
    for (j = 0; j < 80; j += 1)
    {
        //400
        _sha512[400 + 3] = (_sha512[ 376  + 3] & _sha512[ 380  + 3]) ^ (~_sha512[ 376  + 3] & _sha512[ 384  + 3]);
        _sha512[400 + 2] = (_sha512[ 376  + 2] & _sha512[ 380  + 2]) ^ (~_sha512[ 376  + 2] & _sha512[ 384  + 2]);
        _sha512[400 + 1] = (_sha512[ 376  + 1] & _sha512[ 380  + 1]) ^ (~_sha512[ 376  + 1] & _sha512[ 384  + 1]);
        _sha512[400] = (_sha512[376] & _sha512[380]) ^ (~_sha512[376] & _sha512[384]);
    
        //Sigma1
        //rrot(408, 376, 14);
            //Shift 14
            add1 = _sha512[376 + 3];
            _sha512[408 + 3] = (_sha512[376 + 3] >> 14) | ((_sha512[376 + 2] << 2) & $ffff)
            _sha512[408 + 2] = (_sha512[376 + 2] >> 14) | ((_sha512[376 + 1] << 2) & $ffff)
            _sha512[408 + 1] = (_sha512[376 + 1] >> 14) | ((_sha512[376 + 0] << 2) & $ffff)
            _sha512[408 + 0] = (_sha512[376 + 0] >> 14) | ((add1 << 2) & $ffff)
    
    
        //rrot(412, 376, 18);
            //Shift 16
            add1 = _sha512[376 + 3];
            _sha512[412 + 3] = _sha512[376 + 2]
            _sha512[412 + 2] = _sha512[376 + 1]
            _sha512[412 + 1] = _sha512[376 + 0]
            _sha512[412 + 0] = add1
        
            //Shift 2
            add1 = _sha512[412 + 3];
            _sha512[412 + 3] = (_sha512[412 + 3] >> 2) | ((_sha512[412 + 2] << 14) & $ffff)
            _sha512[412 + 2] = (_sha512[412 + 2] >> 2) | ((_sha512[412 + 1] << 14) & $ffff)
            _sha512[412 + 1] = (_sha512[412 + 1] >> 2) | ((_sha512[412 + 0] << 14) & $ffff)
            _sha512[412 + 0] = (_sha512[412 + 0] >> 2) | ((add1 << 14) & $ffff)
    
        //rrot(416, 376, 32 + 9);
            //Shift 32
            add1 = _sha512[376 + 1];
            add2 = _sha512[376 + 2];
            _sha512[416 + 1] = _sha512[376 + 3]
            _sha512[416 + 2] = _sha512[376 + 0]
            _sha512[416 + 3] = add1;
            _sha512[416 + 0] = add2;
        
            //Shift 9
            add1 = _sha512[416 + 3];
            _sha512[416 + 3] = (_sha512[416 + 3] >> 9) | ((_sha512[416 + 2] << 7) & $ffff)
            _sha512[416 + 2] = (_sha512[416 + 2] >> 9) | ((_sha512[416 + 1] << 7) & $ffff)
            _sha512[416 + 1] = (_sha512[416 + 1] >> 9) | ((_sha512[416 + 0] << 7) & $ffff)
            _sha512[416 + 0] = (_sha512[416 + 0] >> 9) | ((add1 << 7) & $ffff)
    
        //xor3
        _sha512[396] = _sha512[408] ^ _sha512[412] ^ _sha512[416]; _sha512[396 + 1] = _sha512[408 + 1] ^ _sha512[412 + 1] ^ _sha512[416 + 1]; _sha512[396 + 2] = _sha512[408 + 2] ^ _sha512[412 + 2] ^ _sha512[416 + 2]; _sha512[396 + 3] = _sha512[408 + 3] ^ _sha512[412 + 3] ^ _sha512[416 + 3];;
    
        //Sigma0
        //rrot(408,  360, 28);
            //Shift 12
            add1 = _sha512[360 + 3];
            _sha512[408 + 3] = (_sha512[360 + 3] >> 12) | ((_sha512[360 + 2] << 4) & $ffff)
            _sha512[408 + 2] = (_sha512[360 + 2] >> 12) | ((_sha512[360 + 1] << 4) & $ffff)
            _sha512[408 + 1] = (_sha512[360 + 1] >> 12) | ((_sha512[360 + 0] << 4) & $ffff)
            _sha512[408 + 0] = (_sha512[360 + 0] >> 12) | ((add1 << 4) & $ffff)
        
            //Shift 16
            add1 = _sha512[408 + 3];
            _sha512[408 + 3] = _sha512[408 + 2]
            _sha512[408 + 2] = _sha512[408 + 1]
            _sha512[408 + 1] = _sha512[408 + 0]
            _sha512[408 + 0] = add1
    
    
        //rrot(412,  360, 32 + 2);
            //Shift 32
            add1 = _sha512[360 + 1];
            add2 = _sha512[360 + 2];
            _sha512[412 + 1] = _sha512[360 + 3]
            _sha512[412 + 2] = _sha512[360 + 0]
            _sha512[412 + 3] = add1
            _sha512[412 + 0] = add2
        
            //Shift 2
            add1 = _sha512[412 + 3];
            _sha512[412 + 3] = (_sha512[412 + 3] >> 2) | ((_sha512[412 + 2] << 14) & $ffff)
            _sha512[412 + 2] = (_sha512[412 + 2] >> 2) | ((_sha512[412 + 1] << 14) & $ffff)
            _sha512[412 + 1] = (_sha512[412 + 1] >> 2) | ((_sha512[412 + 0] << 14) & $ffff)
            _sha512[412 + 0] = (_sha512[412 + 0] >> 2) | ((add1 << 14) & $ffff)
    
    
        //rrot(416,  360, 32 + 7);
            //Shift 32
            add1 = _sha512[360 + 1];
            add2 = _sha512[360 + 2];
            _sha512[416 + 1] = _sha512[360 + 3]
            _sha512[416 + 2] = _sha512[360 + 0]
            _sha512[416 + 3] = add1
            _sha512[416 + 0] = add2
        
            //Shift 7
            add1 = _sha512[416 + 3];
            _sha512[416 + 3] = (_sha512[416 + 3] >> 7) | ((_sha512[416 + 2] << 9) & $ffff)
            _sha512[416 + 2] = (_sha512[416 + 2] >> 7) | ((_sha512[416 + 1] << 9) & $ffff)
            _sha512[416 + 1] = (_sha512[416 + 1] >> 7) | ((_sha512[416 + 0] << 9) & $ffff)
            _sha512[416 + 0] = (_sha512[416 + 0] >> 7) | ((add1 << 9) & $ffff)
        
    
        _sha512[392] = _sha512[408] ^ _sha512[412] ^ _sha512[416]; _sha512[392 + 1] = _sha512[408 + 1] ^ _sha512[412 + 1] ^ _sha512[416 + 1]; _sha512[392 + 2] = _sha512[408 + 2] ^ _sha512[412 + 2] ^ _sha512[416 + 2]; _sha512[392 + 3] = _sha512[408 + 3] ^ _sha512[412 + 3] ^ _sha512[416 + 3];;
    
        //404
        _sha512[404 + 3] = (_sha512[ 360 + 3] & _sha512[ 364  + 3]) ^ (_sha512[ 360 + 3] & _sha512[ 368  + 3]) ^ (_sha512[ 364  + 3] & _sha512[ 368  + 3]);
        _sha512[404 + 2] = (_sha512[ 360 + 2] & _sha512[ 364  + 2]) ^ (_sha512[ 360 + 2] & _sha512[ 368  + 2]) ^ (_sha512[ 364  + 2] & _sha512[ 368  + 2]);
        _sha512[404 + 1] = (_sha512[ 360 + 1] & _sha512[ 364  + 1]) ^ (_sha512[ 360 + 1] & _sha512[ 368  + 1]) ^ (_sha512[ 364  + 1] & _sha512[ 368  + 1]);
        _sha512[404] = (_sha512[ 360] & _sha512[364]) ^ (_sha512[ 360] & _sha512[368]) ^ (_sha512[364] & _sha512[368]);
    
        //j * 4 = k[j]
        add1 = _sha512[388 + 3] + _sha512[396 + 3] + _sha512[400 + 3] + _sha512[j * 4 + 3] + _sha512[(420 + (j) * 4) + 3]; add2 = _sha512[388 + 2] + _sha512[396 + 2] + _sha512[400 + 2] + _sha512[j * 4 + 2] + _sha512[(420 + (j) * 4) + 2] + (add1 >> 16); add3 = _sha512[388 + 1] + _sha512[396 + 1] + _sha512[400 + 1] + _sha512[j * 4 + 1] + _sha512[(420 + (j) * 4) + 1] + (add2 >> 16); add4 = _sha512[388] + _sha512[396] + _sha512[400] + _sha512[j * 4] + _sha512[(420 + (j) * 4)] + (add3 >> 16); _sha512[352 + 3] = add1 & $00ffff; _sha512[352 + 2] = add2 & $00ffff; _sha512[352 + 1] = add3 & $00ffff; _sha512[352] = add4 & $00ffff;
    
        add1 = _sha512[392 + 3] + _sha512[404 + 3]; add2 = _sha512[392 + 2] + _sha512[404 + 2] + (add1 >> 16); add3 = _sha512[392 + 1] + _sha512[404 + 1] + (add2 >> 16); add4 = _sha512[392] + _sha512[404] + (add3 >> 16); _sha512[356 + 3] = add1 & $00ffff; _sha512[356 + 2] = add2 & $00ffff; _sha512[356 + 1] = add3 & $00ffff; _sha512[356] = add4 & $00ffff;
    
        _sha512[388] = _sha512[384]; _sha512[ 388  + 1] = _sha512[ 384  + 1]; _sha512[ 388  + 2] = _sha512[ 384  + 2]; _sha512[ 388  + 3] = _sha512[ 384  + 3];;
        _sha512[384] = _sha512[380]; _sha512[ 384  + 1] = _sha512[ 380  + 1]; _sha512[ 384  + 2] = _sha512[ 380  + 2]; _sha512[ 384  + 3] = _sha512[ 380  + 3];;
        _sha512[380] = _sha512[376]; _sha512[ 380  + 1] = _sha512[ 376  + 1]; _sha512[ 380  + 2] = _sha512[ 376  + 2]; _sha512[ 380  + 3] = _sha512[ 376  + 3];;
        add1 = _sha512[372 + 3] + _sha512[352 + 3]; add2 = _sha512[372 + 2] + _sha512[352 + 2] + (add1 >> 16); add3 = _sha512[372 + 1] + _sha512[352 + 1] + (add2 >> 16); add4 = _sha512[372] + _sha512[352] + (add3 >> 16); _sha512[376 + 3] = add1 & $00ffff; _sha512[376 + 2] = add2 & $00ffff; _sha512[376 + 1] = add3 & $00ffff; _sha512[376] = add4 & $00ffff;

        _sha512[372] = _sha512[368]; _sha512[ 372  + 1] = _sha512[ 368  + 1]; _sha512[ 372  + 2] = _sha512[ 368  + 2]; _sha512[ 372  + 3] = _sha512[ 368  + 3];;
        _sha512[368] = _sha512[364]; _sha512[ 368  + 1] = _sha512[ 364  + 1]; _sha512[ 368  + 2] = _sha512[ 364  + 2]; _sha512[ 368  + 3] = _sha512[ 364  + 3];;
        _sha512[364] = _sha512[ 360]; _sha512[ 364  + 1] = _sha512[ 360 + 1]; _sha512[ 364  + 2] = _sha512[ 360 + 2]; _sha512[ 364  + 3] = _sha512[ 360 + 3];;
        add1 = _sha512[352 + 3] + _sha512[356 + 3]; add2 = _sha512[352 + 2] + _sha512[356 + 2] + (add1 >> 16); add3 = _sha512[352 + 1] + _sha512[356 + 1] + (add2 >> 16); add4 = _sha512[352] + _sha512[356] + (add3 >> 16); _sha512[360 + 3] = add1 & $00ffff; _sha512[360 + 2] = add2 & $00ffff; _sha512[360 + 1] = add3 & $00ffff; _sha512[360] = add4 & $00ffff;
    }
 
 
    add1 = _sha512[320 + 3] + _sha512[ 360 + 3]; add2 = _sha512[320 + 2] + _sha512[ 360 + 2] + (add1 >> 16); add3 = _sha512[320 + 1] + _sha512[ 360 + 1] + (add2 >> 16); add4 = _sha512[320] + _sha512[ 360] + (add3 >> 16); _sha512[320 + 3] = add1 & $00ffff; _sha512[320 + 2] = add2 & $00ffff; _sha512[320 + 1] = add3 & $00ffff; _sha512[320] = add4 & $00ffff;
    add1 = _sha512[324 + 3] + _sha512[ 364  + 3]; add2 = _sha512[324 + 2] + _sha512[ 364  + 2] + (add1 >> 16); add3 = _sha512[324 + 1] + _sha512[ 364  + 1] + (add2 >> 16); add4 = _sha512[324] + _sha512[ 364 ] + (add3 >> 16); _sha512[324 + 3] = add1 & $00ffff; _sha512[324 + 2] = add2 & $00ffff; _sha512[324 + 1] = add3 & $00ffff; _sha512[324] = add4 & $00ffff;
    add1 = _sha512[328 + 3] + _sha512[ 368  + 3]; add2 = _sha512[328 + 2] + _sha512[ 368  + 2] + (add1 >> 16); add3 = _sha512[328 + 1] + _sha512[ 368  + 1] + (add2 >> 16); add4 = _sha512[328] + _sha512[ 368 ] + (add3 >> 16); _sha512[328 + 3] = add1 & $00ffff; _sha512[328 + 2] = add2 & $00ffff; _sha512[328 + 1] = add3 & $00ffff; _sha512[328] = add4 & $00ffff;
    add1 = _sha512[332 + 3] + _sha512[ 372  + 3]; add2 = _sha512[332 + 2] + _sha512[ 372  + 2] + (add1 >> 16); add3 = _sha512[332 + 1] + _sha512[ 372  + 1] + (add2 >> 16); add4 = _sha512[332] + _sha512[ 372 ] + (add3 >> 16); _sha512[332 + 3] = add1 & $00ffff; _sha512[332 + 2] = add2 & $00ffff; _sha512[332 + 1] = add3 & $00ffff; _sha512[332] = add4 & $00ffff;
    add1 = _sha512[336 + 3] + _sha512[ 376  + 3]; add2 = _sha512[336 + 2] + _sha512[ 376  + 2] + (add1 >> 16); add3 = _sha512[336 + 1] + _sha512[ 376  + 1] + (add2 >> 16); add4 = _sha512[336] + _sha512[ 376 ] + (add3 >> 16); _sha512[336 + 3] = add1 & $00ffff; _sha512[336 + 2] = add2 & $00ffff; _sha512[336 + 1] = add3 & $00ffff; _sha512[336] = add4 & $00ffff;
    add1 = _sha512[340 + 3] + _sha512[ 380  + 3]; add2 = _sha512[340 + 2] + _sha512[ 380  + 2] + (add1 >> 16); add3 = _sha512[340 + 1] + _sha512[ 380  + 1] + (add2 >> 16); add4 = _sha512[340] + _sha512[ 380 ] + (add3 >> 16); _sha512[340 + 3] = add1 & $00ffff; _sha512[340 + 2] = add2 & $00ffff; _sha512[340 + 1] = add3 & $00ffff; _sha512[340] = add4 & $00ffff;
    add1 = _sha512[344 + 3] + _sha512[ 384  + 3]; add2 = _sha512[344 + 2] + _sha512[ 384  + 2] + (add1 >> 16); add3 = _sha512[344 + 1] + _sha512[ 384  + 1] + (add2 >> 16); add4 = _sha512[344] + _sha512[ 384 ] + (add3 >> 16); _sha512[344 + 3] = add1 & $00ffff; _sha512[344 + 2] = add2 & $00ffff; _sha512[344 + 1] = add3 & $00ffff; _sha512[344] = add4 & $00ffff;
    add1 = _sha512[348 + 3] + _sha512[ 388  + 3]; add2 = _sha512[348 + 2] + _sha512[ 388  + 2] + (add1 >> 16); add3 = _sha512[348 + 1] + _sha512[ 388  + 1] + (add2 >> 16); add4 = _sha512[348] + _sha512[ 388 ] + (add3 >> 16); _sha512[348 + 3] = add1 & $00ffff; _sha512[348 + 2] = add2 & $00ffff; _sha512[348 + 1] = add3 & $00ffff; _sha512[348] = add4 & $00ffff;
}

//convert hash to hex string
hex = "0123456789abcdef";
output = "";
for (i = 0; i < 8; i += 1)
{
    for(j = 0; j < 4 ; j += 1)
    {
        var b; b = _sha512[(320 + i * 4) + j];
        output += string_char_at(hex, ((b >> 12) & $f) + 1) +
                    string_char_at(hex, ((b >> 8) & $f) + 1) +
                    string_char_at(hex, ((b >> 4) & $f) + 1) +
                    string_char_at(hex, (b & $f) + 1);
    }
}
 
Last edited:
M

mimsi

Guest
So, While the idea of just making a buffer version of the script hadn't crossed my mind, I ran into several other issues after I resolved that. Most of the issues have to do with the block size of the hash function along with various other things. More info on the differences in the parameters of the different SHA hash functions can be found here:
http://www.letu.edu/people/jaytevis/Network-Security/Stallings-Tables/CH03-Vertical.pdf

I went through and tried to alter the parameters of the HMAC function I linked to above, but I'm not sure what is going on with the number "40" on line 39 of the GML scripts code. Since it was built for SHA-1, and I know that this hash function returns 20 bytes (or 160 bits shown in the table in my link), I think it has something to do with that. I've been toying with it for a long time, but I'm getting confused with all these different numbers and where they are derived from.

EDIT: An update of all my code and the results

scSHA512()
Code:
//Code shown above in original post because my post became too large for the forum to allow.
//Please God GameMaker staff, add new hash algorithms
scSHA512_buffer()

Code:
///sha512_calc_buffer(buffer, start, length)
//Geschreven door Size43

var bitlength, binb, add1, add2, add3, add4, j, i, binb_length, _sha512, hex, output;
for(i = 750; i > 351; i -= 1)
{
    _sha512[i] = $0000;
}

_sha512[0] = $428a;_sha512[1] = $2f98;_sha512[2] = $d728;_sha512[3] = $ae22;_sha512[4] = $7137;_sha512[5] = $4491;_sha512[6] = $23ef;_sha512[7] = $65cd;_sha512[8] = $b5c0;_sha512[9] = $fbcf;_sha512[10] = $ec4d;_sha512[11] = $3b2f;_sha512[12] = $e9b5;_sha512[13] = $dba5;_sha512[14] = $8189;_sha512[15] = $dbbc;_sha512[16] = $3956;_sha512[17] = $c25b;_sha512[18] = $f348;_sha512[19] = $b538;_sha512[20] = $59f1;_sha512[21] = $11f1;_sha512[22] = $b605;_sha512[23] = $d019;_sha512[24] = $923f;_sha512[25] = $82a4;_sha512[26] = $af19;_sha512[27] = $4f9b;_sha512[28] = $ab1c;_sha512[29] = $5ed5;_sha512[30] = $da6d;_sha512[31] = $8118;_sha512[32] = $d807;_sha512[33] = $aa98;_sha512[34] = $a303;_sha512[35] = $0242;_sha512[36] = $1283;_sha512[37] = $5b01;_sha512[38] = $4570;_sha512[39] = $6fbe;_sha512[40] = $2431;_sha512[41] = $85be;_sha512[42] = $4ee4;_sha512[43] = $b28c;_sha512[44] = $550c;_sha512[45] = $7dc3;_sha512[46] = $d5ff;_sha512[47] = $b4e2;_sha512[48] = $72be;_sha512[49] = $5d74;_sha512[50] = $f27b;_sha512[51] = $896f;_sha512[52] = $80de;_sha512[53] = $b1fe;_sha512[54] = $3b16;_sha512[55] = $96b1;_sha512[56] = $9bdc;_sha512[57] = $06a7;_sha512[58] = $25c7;_sha512[59] = $1235;_sha512[60] = $c19b;_sha512[61] = $f174;_sha512[62] = $cf69;_sha512[63] = $2694;_sha512[64] = $e49b;_sha512[65] = $69c1;_sha512[66] = $9ef1;_sha512[67] = $4ad2;_sha512[68] = $efbe;_sha512[69] = $4786;_sha512[70] = $384f;_sha512[71] = $25e3;_sha512[72] = $0fc1;_sha512[73] = $9dc6;_sha512[74] = $8b8c;_sha512[75] = $d5b5;_sha512[76] = $240c;_sha512[77] = $a1cc;_sha512[78] = $77ac;_sha512[79] = $9c65;_sha512[80] = $2de9;_sha512[81] = $2c6f;_sha512[82] = $592b;_sha512[83] = $0275;_sha512[84] = $4a74;_sha512[85] = $84aa;_sha512[86] = $6ea6;_sha512[87] = $e483;_sha512[88] = $5cb0;_sha512[89] = $a9dc;_sha512[90] = $bd41;_sha512[91] = $fbd4;_sha512[92] = $76f9;_sha512[93] = $88da;_sha512[94] = $8311;_sha512[95] = $53b5;_sha512[96] = $983e;_sha512[97] = $5152;_sha512[98] = $ee66;_sha512[99] = $dfab;_sha512[100] = $a831;_sha512[101] = $c66d;_sha512[102] = $2db4;_sha512[103] = $3210;_sha512[104] = $b003;_sha512[105] = $27c8;_sha512[106] = $98fb;_sha512[107] = $213f;_sha512[108] = $bf59;_sha512[109] = $7fc7;_sha512[110] = $beef;_sha512[111] = $0ee4;_sha512[112] = $c6e0;_sha512[113] = $0bf3;_sha512[114] = $3da8;_sha512[115] = $8fc2;_sha512[116] = $d5a7;_sha512[117] = $9147;_sha512[118] = $930a;_sha512[119] = $a725;_sha512[120] = $06ca;_sha512[121] = $6351;_sha512[122] = $e003;_sha512[123] = $826f;_sha512[124] = $1429;_sha512[125] = $2967;_sha512[126] = $0a0e;_sha512[127] = $6e70;_sha512[128] = $27b7;_sha512[129] = $0a85;_sha512[130] = $46d2;_sha512[131] = $2ffc;_sha512[132] = $2e1b;_sha512[133] = $2138;_sha512[134] = $5c26;_sha512[135] = $c926;_sha512[136] = $4d2c;_sha512[137] = $6dfc;_sha512[138] = $5ac4;_sha512[139] = $2aed;_sha512[140] = $5338;_sha512[141] = $0d13;_sha512[142] = $9d95;_sha512[143] = $b3df;_sha512[144] = $650a;_sha512[145] = $7354;_sha512[146] = $8baf;_sha512[147] = $63de;_sha512[148] = $766a;_sha512[149] = $0abb;_sha512[150] = $3c77;_sha512[151] = $b2a8;_sha512[152] = $81c2;_sha512[153] = $c92e;_sha512[154] = $47ed;_sha512[155] = $aee6;_sha512[156] = $9272;_sha512[157] = $2c85;_sha512[158] = $1482;_sha512[159] = $353b;_sha512[160] = $a2bf;_sha512[161] = $e8a1;_sha512[162] = $4cf1;_sha512[163] = $0364;_sha512[164] = $a81a;_sha512[165] = $664b;_sha512[166] = $bc42;_sha512[167] = $3001;_sha512[168] = $c24b;_sha512[169] = $8b70;_sha512[170] = $d0f8;_sha512[171] = $9791;_sha512[172] = $c76c;_sha512[173] = $51a3;_sha512[174] = $0654;_sha512[175] = $be30;_sha512[176] = $d192;_sha512[177] = $e819;_sha512[178] = $d6ef;_sha512[179] = $5218;_sha512[180] = $d699;_sha512[181] = $0624;_sha512[182] = $5565;_sha512[183] = $a910;_sha512[184] = $f40e;_sha512[185] = $3585;_sha512[186] = $5771;_sha512[187] = $202a;_sha512[188] = $106a;_sha512[189] = $a070;_sha512[190] = $32bb;_sha512[191] = $d1b8;_sha512[192] = $19a4;_sha512[193] = $c116;_sha512[194] = $b8d2;_sha512[195] = $d0c8;_sha512[196] = $1e37;_sha512[197] = $6c08;_sha512[198] = $5141;_sha512[199] = $ab53;_sha512[200] = $2748;_sha512[201] = $774c;_sha512[202] = $df8e;_sha512[203] = $eb99;_sha512[204] = $34b0;_sha512[205] = $bcb5;_sha512[206] = $e19b;_sha512[207] = $48a8;_sha512[208] = $391c;_sha512[209] = $0cb3;_sha512[210] = $c5c9;_sha512[211] = $5a63;_sha512[212] = $4ed8;_sha512[213] = $aa4a;_sha512[214] = $e341;_sha512[215] = $8acb;_sha512[216] = $5b9c;_sha512[217] = $ca4f;_sha512[218] = $7763;_sha512[219] = $e373;_sha512[220] = $682e;_sha512[221] = $6ff3;_sha512[222] = $d6b2;_sha512[223] = $b8a3;_sha512[224] = $748f;_sha512[225] = $82ee;_sha512[226] = $5def;_sha512[227] = $b2fc;_sha512[228] = $78a5;_sha512[229] = $636f;_sha512[230] = $4317;_sha512[231] = $2f60;_sha512[232] = $84c8;_sha512[233] = $7814;_sha512[234] = $a1f0;_sha512[235] = $ab72;_sha512[236] = $8cc7;_sha512[237] = $0208;_sha512[238] = $1a64;_sha512[239] = $39ec;_sha512[240] = $90be;_sha512[241] = $fffa;_sha512[242] = $2363;_sha512[243] = $1e28;_sha512[244] = $a450;_sha512[245] = $6ceb;_sha512[246] = $de82;_sha512[247] = $bde9;_sha512[248] = $bef9;_sha512[249] = $a3f7;_sha512[250] = $b2c6;_sha512[251] = $7915;_sha512[252] = $c671;_sha512[253] = $78f2;_sha512[254] = $e372;_sha512[255] = $532b;_sha512[256] = $ca27;_sha512[257] = $3ece;_sha512[258] = $ea26;_sha512[259] = $619c;_sha512[260] = $d186;_sha512[261] = $b8c7;_sha512[262] = $21c0;_sha512[263] = $c207;_sha512[264] = $eada;_sha512[265] = $7dd6;_sha512[266] = $cde0;_sha512[267] = $eb1e;_sha512[268] = $f57d;_sha512[269] = $4f7f;_sha512[270] = $ee6e;_sha512[271] = $d178;_sha512[272] = $06f0;_sha512[273] = $67aa;_sha512[274] = $7217;_sha512[275] = $6fba;_sha512[276] = $0a63;_sha512[277] = $7dc5;_sha512[278] = $a2c8;_sha512[279] = $98a6;_sha512[280] = $113f;_sha512[281] = $9804;_sha512[282] = $bef9;_sha512[283] = $0dae;_sha512[284] = $1b71;_sha512[285] = $0b35;_sha512[286] = $131c;_sha512[287] = $471b;_sha512[288] = $28db;_sha512[289] = $77f5;_sha512[290] = $2304;_sha512[291] = $7d84;_sha512[292] = $32ca;_sha512[293] = $ab7b;_sha512[294] = $40c7;_sha512[295] = $2493;_sha512[296] = $3c9e;_sha512[297] = $be0a;_sha512[298] = $15c9;_sha512[299] = $bebc;_sha512[300] = $431d;_sha512[301] = $67c4;_sha512[302] = $9c10;_sha512[303] = $0d4c;_sha512[304] = $4cc5;_sha512[305] = $d4be;_sha512[306] = $cb3e;_sha512[307] = $42b6;_sha512[308] = $597f;_sha512[309] = $299c;_sha512[310] = $fc65;_sha512[311] = $7e2a;_sha512[312] = $5fcb;_sha512[313] = $6fab;_sha512[314] = $3ad6;_sha512[315] = $faec;_sha512[316] = $6c44;_sha512[317] = $198c;_sha512[318] = $4a47;_sha512[319] = $5817;_sha512[320] = $6a09;_sha512[321] = $e667;_sha512[322] = $f3bc;_sha512[323] = $c908;_sha512[324] = $bb67;_sha512[325] = $ae85;_sha512[326] = $84ca;_sha512[327] = $a73b;_sha512[328] = $3c6e;_sha512[329] = $f372;_sha512[330] = $fe94;_sha512[331] = $f82b;_sha512[332] = $a54f;_sha512[333] = $f53a;_sha512[334] = $5f1d;_sha512[335] = $36f1;_sha512[336] = $510e;_sha512[337] = $527f;_sha512[338] = $ade6;_sha512[339] = $82d1;_sha512[340] = $9b05;_sha512[341] = $688c;_sha512[342] = $2b3e;_sha512[343] = $6c1f;_sha512[344] = $1f83;_sha512[345] = $d9ab;_sha512[346] = $fb41;_sha512[347] = $bd6b;_sha512[348] = $5be0;_sha512[349] = $cd19;_sha512[350] = $137e;_sha512[351] = $2179;

bitlength = argument2 * 8;

//Convert to big-endian
buffer_seek(argument0, buffer_seek_start, argument1);
for (i = 0; i < bitlength; i += 1)
{
    if(i mod 2 == 0)
    {
        //High byte
        binb[floor(i / 2)] = (buffer_read(argument0, buffer_u8) & $ff) << 8;
    }else{
        //Low byte
        binb[floor(i / 2)] |= buffer_read(argument0, buffer_u8) & $ff;
    }
}

if(i mod 2 == 0)
{
    //High byte
    binb[i / 2] = $80 << 8;
}else{
    //Low byte
    binb[floor(i / 2)] |= $80;
}

//append padding to the source string. The format is described in the FIPS.
binb_length = ((((bitlength + 128) >> 10) + 1) << 6);

binb[binb_length - 1] = bitlength & $ffff;
binb[binb_length - 2] = (bitlength >> 16) & $ffff;

for (i = 0; i < (binb_length / 2); i += 32) //32 dwords is the block size
{
    _sha512[ 360] = _sha512[320]; _sha512[ 360 + 1] = _sha512[320 + 1]; _sha512[ 360 + 2] = _sha512[320 + 2]; _sha512[ 360 + 3] = _sha512[320 + 3];;
    _sha512[364] = _sha512[324]; _sha512[ 364  + 1] = _sha512[324 + 1]; _sha512[ 364  + 2] = _sha512[324 + 2]; _sha512[ 364  + 3] = _sha512[324 + 3];;
    _sha512[368] = _sha512[328]; _sha512[ 368  + 1] = _sha512[328 + 1]; _sha512[ 368  + 2] = _sha512[328 + 2]; _sha512[ 368  + 3] = _sha512[328 + 3];;
    _sha512[372] = _sha512[332]; _sha512[ 372  + 1] = _sha512[332 + 1]; _sha512[ 372  + 2] = _sha512[332 + 2]; _sha512[ 372  + 3] = _sha512[332 + 3];;
    _sha512[376] = _sha512[336]; _sha512[ 376  + 1] = _sha512[336 + 1]; _sha512[ 376  + 2] = _sha512[336 + 2]; _sha512[ 376  + 3] = _sha512[336 + 3];;
    _sha512[380] = _sha512[340]; _sha512[ 380  + 1] = _sha512[340 + 1]; _sha512[ 380  + 2] = _sha512[340 + 2]; _sha512[ 380  + 3] = _sha512[340 + 3];;
    _sha512[384] = _sha512[344]; _sha512[ 384  + 1] = _sha512[344 + 1]; _sha512[ 384  + 2] = _sha512[344 + 2]; _sha512[ 384  + 3] = _sha512[344 + 3];;
    _sha512[388] = _sha512[348]; _sha512[ 388  + 1] = _sha512[348 + 1]; _sha512[ 388  + 2] = _sha512[348 + 2]; _sha512[ 388  + 3] = _sha512[348 + 3];;

    for (j = 0; j < 16; j += 1)
    {
        _sha512[(420 + (j) * 4)] = binb[(i + 2 * j) * 2]; _sha512[(420 + (j) * 4) + 1] = binb[(i + 2 * j) * 2 + 1]; _sha512[(420 + (j) * 4) + 2] = binb[(i + 2 * j + 1) * 2]; _sha512[(420 + (j) * 4) + 3] = binb[(i + 2 * j + 1) * 2 + 1];;
    }

    for (j = 16; j < 80; j += 1)
    {
        //sigma1
        //rrot(408, (420 + (j - 2) * 4), 19);
            //Shift 16
            add2 = (420 + (j - 2) * 4)
            add1 = _sha512[add2 + 3];
            _sha512[408 + 3] = _sha512[add2 + 2]
            _sha512[408 + 2] = _sha512[add2 + 1]
            _sha512[408 + 1] = _sha512[add2 + 0]
            _sha512[408 + 0] = add1
       
            //Shift 3
            add1 = _sha512[408 + 3];
            _sha512[408 + 3] = (_sha512[408 + 3] >> 3) | ((_sha512[408 + 2] << 13) & $ffff)
            _sha512[408 + 2] = (_sha512[408 + 2] >> 3) | ((_sha512[408 + 1] << 13) & $ffff)
            _sha512[408 + 1] = (_sha512[408 + 1] >> 3) | ((_sha512[408 + 0] << 13) & $ffff)
            _sha512[408 + 0] = (_sha512[408 + 0] >> 3) | ((add1 << 13) & $ffff)
       
       
        //rrot(412, (420 + (j - 2) * 4), 32 + 29);
            add2 = (420 + (j - 2) * 4);
            //Shift 48
            add1 = _sha512[add2 + 0];
            _sha512[412 + 0] = _sha512[add2 + 1]
            _sha512[412 + 1] = _sha512[add2 + 2]
            _sha512[412 + 2] = _sha512[add2 + 3]
            _sha512[412 + 3] = add1
       
            //Shift 13
            add1 = _sha512[412 + 3];
            _sha512[412 + 3] = (_sha512[412 + 3] >> 13) | ((_sha512[412 + 2] << 3) & $ffff)
            _sha512[412 + 2] = (_sha512[412 + 2] >> 13) | ((_sha512[412 + 1] << 3) & $ffff)
            _sha512[412 + 1] = (_sha512[412 + 1] >> 13) | ((_sha512[412 + 0] << 3) & $ffff)
            _sha512[412 + 0] = (_sha512[412 + 0] >> 13) | ((add1 << 3) & $ffff)
  
        //shr(416, (420 + (j - 2) * 4), 6);
            //Shift 6
            //add2 = (420 + (j - 2) * 4);
            _sha512[416 + 3] = (_sha512[add2 + 3] >> 6) | ((_sha512[add2 + 2] << 10) & $ffff)
            _sha512[416 + 2] = (_sha512[add2 + 2] >> 6) | ((_sha512[add2 + 1] << 10) & $ffff)
            _sha512[416 + 1] = (_sha512[add2 + 1] >> 6) | ((_sha512[add2 + 0] << 10) & $ffff)
            _sha512[416 + 0] = (_sha512[add2 + 0] >> 6)
        _sha512[396] = _sha512[408] ^ _sha512[412] ^ _sha512[416]; _sha512[396 + 1] = _sha512[408 + 1] ^ _sha512[412 + 1] ^ _sha512[416 + 1]; _sha512[396 + 2] = _sha512[408 + 2] ^ _sha512[412 + 2] ^ _sha512[416 + 2]; _sha512[396 + 3] = _sha512[408 + 3] ^ _sha512[412 + 3] ^ _sha512[416 + 3];;
  
        //sigma0
        //rrot(408, (420 + (j - 15) * 4), 1);
            //Shift 1
            add2 = (420 + (j - 15) * 4);
            add1 = _sha512[add2 + 3];
            _sha512[408 + 3] = (_sha512[add2 + 3] >> 1) | ((_sha512[add2 + 2] << 15) & $ffff)
            _sha512[408 + 2] = (_sha512[add2 + 2] >> 1) | ((_sha512[add2 + 1] << 15) & $ffff)
            _sha512[408 + 1] = (_sha512[add2 + 1] >> 1) | ((_sha512[add2 + 0] << 15) & $ffff)
            _sha512[408 + 0] = (_sha512[add2 + 0] >> 1) | ((add1 << 15) & $ffff)
       
        //rrot(412, (420 + (j - 15) * 4), 8);
            //Shift 8
            //add2 = (420 + (j - 15) * 4)
            add1 = _sha512[add2 + 3];
            _sha512[412 + 3] = (_sha512[add2 + 3] >> 8) | ((_sha512[add2 + 2] << 8) & $ffff)
            _sha512[412 + 2] = (_sha512[add2 + 2] >> 8) | ((_sha512[add2 + 1] << 8) & $ffff)
            _sha512[412 + 1] = (_sha512[add2 + 1] >> 8) | ((_sha512[add2 + 0] << 8) & $ffff)
            _sha512[412 + 0] = (_sha512[add2 + 0] >> 8) | ((add1 << 8) & $ffff)
  
  
        //shr(416, (420 + (j - 15) * 4), 7);
            //Shift 6
            //add2 = (420 + (j - 15) * 4);
            _sha512[416 + 3] = (_sha512[add2 + 3] >> 7) | ((_sha512[add2 + 2] << 9) & $ffff)
            _sha512[416 + 2] = (_sha512[add2 + 2] >> 7) | ((_sha512[add2 + 1] << 9) & $ffff)
            _sha512[416 + 1] = (_sha512[add2 + 1] >> 7) | ((_sha512[add2 + 0] << 9) & $ffff)
            _sha512[416 + 0] = (_sha512[add2 + 0] >> 7)
  
        _sha512[392] = _sha512[408] ^ _sha512[412] ^ _sha512[416]; _sha512[392 + 1] = _sha512[408 + 1] ^ _sha512[412 + 1] ^ _sha512[416 + 1]; _sha512[392 + 2] = _sha512[408 + 2] ^ _sha512[412 + 2] ^ _sha512[416 + 2]; _sha512[392 + 3] = _sha512[408 + 3] ^ _sha512[412 + 3] ^ _sha512[416 + 3];;
  
        add1 = _sha512[396 + 3] + _sha512[(420 + (j - 7) * 4) + 3] + _sha512[392 + 3] + _sha512[(420 + (j - 16) * 4) + 3]; add2 = _sha512[396 + 2] + _sha512[(420 + (j - 7) * 4) + 2] + _sha512[392 + 2] + _sha512[(420 + (j - 16) * 4) + 2] + (add1 >> 16); add3 = _sha512[396 + 1] + _sha512[(420 + (j - 7) * 4) + 1] + _sha512[392 + 1] + _sha512[(420 + (j - 16) * 4) + 1] + (add2 >> 16); add4 = _sha512[396] + _sha512[(420 + (j - 7) * 4)] + _sha512[392] + _sha512[(420 + (j - 16) * 4)] + (add3 >> 16); _sha512[(420 + (j) * 4) + 3] = add1 & $00ffff; _sha512[(420 + (j) * 4) + 2] = add2 & $00ffff; _sha512[(420 + (j) * 4) + 1] = add3 & $00ffff; _sha512[(420 + (j) * 4)] = add4 & $00ffff;
    }

    for (j = 0; j < 80; j += 1)
    {
        //400
        _sha512[400 + 3] = (_sha512[ 376  + 3] & _sha512[ 380  + 3]) ^ (~_sha512[ 376  + 3] & _sha512[ 384  + 3]);
        _sha512[400 + 2] = (_sha512[ 376  + 2] & _sha512[ 380  + 2]) ^ (~_sha512[ 376  + 2] & _sha512[ 384  + 2]);
        _sha512[400 + 1] = (_sha512[ 376  + 1] & _sha512[ 380  + 1]) ^ (~_sha512[ 376  + 1] & _sha512[ 384  + 1]);
        _sha512[400] = (_sha512[376] & _sha512[380]) ^ (~_sha512[376] & _sha512[384]);
  
        //Sigma1
        //rrot(408, 376, 14);
            //Shift 14
            add1 = _sha512[376 + 3];
            _sha512[408 + 3] = (_sha512[376 + 3] >> 14) | ((_sha512[376 + 2] << 2) & $ffff)
            _sha512[408 + 2] = (_sha512[376 + 2] >> 14) | ((_sha512[376 + 1] << 2) & $ffff)
            _sha512[408 + 1] = (_sha512[376 + 1] >> 14) | ((_sha512[376 + 0] << 2) & $ffff)
            _sha512[408 + 0] = (_sha512[376 + 0] >> 14) | ((add1 << 2) & $ffff)
  
  
        //rrot(412, 376, 18);
            //Shift 16
            add1 = _sha512[376 + 3];
            _sha512[412 + 3] = _sha512[376 + 2]
            _sha512[412 + 2] = _sha512[376 + 1]
            _sha512[412 + 1] = _sha512[376 + 0]
            _sha512[412 + 0] = add1
       
            //Shift 2
            add1 = _sha512[412 + 3];
            _sha512[412 + 3] = (_sha512[412 + 3] >> 2) | ((_sha512[412 + 2] << 14) & $ffff)
            _sha512[412 + 2] = (_sha512[412 + 2] >> 2) | ((_sha512[412 + 1] << 14) & $ffff)
            _sha512[412 + 1] = (_sha512[412 + 1] >> 2) | ((_sha512[412 + 0] << 14) & $ffff)
            _sha512[412 + 0] = (_sha512[412 + 0] >> 2) | ((add1 << 14) & $ffff)
  
        //rrot(416, 376, 32 + 9);
            //Shift 32
            add1 = _sha512[376 + 1];
            add2 = _sha512[376 + 2];
            _sha512[416 + 1] = _sha512[376 + 3]
            _sha512[416 + 2] = _sha512[376 + 0]
            _sha512[416 + 3] = add1;
            _sha512[416 + 0] = add2;
       
            //Shift 9
            add1 = _sha512[416 + 3];
            _sha512[416 + 3] = (_sha512[416 + 3] >> 9) | ((_sha512[416 + 2] << 7) & $ffff)
            _sha512[416 + 2] = (_sha512[416 + 2] >> 9) | ((_sha512[416 + 1] << 7) & $ffff)
            _sha512[416 + 1] = (_sha512[416 + 1] >> 9) | ((_sha512[416 + 0] << 7) & $ffff)
            _sha512[416 + 0] = (_sha512[416 + 0] >> 9) | ((add1 << 7) & $ffff)
  
        //xor3
        _sha512[396] = _sha512[408] ^ _sha512[412] ^ _sha512[416]; _sha512[396 + 1] = _sha512[408 + 1] ^ _sha512[412 + 1] ^ _sha512[416 + 1]; _sha512[396 + 2] = _sha512[408 + 2] ^ _sha512[412 + 2] ^ _sha512[416 + 2]; _sha512[396 + 3] = _sha512[408 + 3] ^ _sha512[412 + 3] ^ _sha512[416 + 3];;
  
        //Sigma0
        //rrot(408,  360, 28);
            //Shift 12
            add1 = _sha512[360 + 3];
            _sha512[408 + 3] = (_sha512[360 + 3] >> 12) | ((_sha512[360 + 2] << 4) & $ffff)
            _sha512[408 + 2] = (_sha512[360 + 2] >> 12) | ((_sha512[360 + 1] << 4) & $ffff)
            _sha512[408 + 1] = (_sha512[360 + 1] >> 12) | ((_sha512[360 + 0] << 4) & $ffff)
            _sha512[408 + 0] = (_sha512[360 + 0] >> 12) | ((add1 << 4) & $ffff)
       
            //Shift 16
            add1 = _sha512[408 + 3];
            _sha512[408 + 3] = _sha512[408 + 2]
            _sha512[408 + 2] = _sha512[408 + 1]
            _sha512[408 + 1] = _sha512[408 + 0]
            _sha512[408 + 0] = add1
  
  
        //rrot(412,  360, 32 + 2);
            //Shift 32
            add1 = _sha512[360 + 1];
            add2 = _sha512[360 + 2];
            _sha512[412 + 1] = _sha512[360 + 3]
            _sha512[412 + 2] = _sha512[360 + 0]
            _sha512[412 + 3] = add1
            _sha512[412 + 0] = add2
       
            //Shift 2
            add1 = _sha512[412 + 3];
            _sha512[412 + 3] = (_sha512[412 + 3] >> 2) | ((_sha512[412 + 2] << 14) & $ffff)
            _sha512[412 + 2] = (_sha512[412 + 2] >> 2) | ((_sha512[412 + 1] << 14) & $ffff)
            _sha512[412 + 1] = (_sha512[412 + 1] >> 2) | ((_sha512[412 + 0] << 14) & $ffff)
            _sha512[412 + 0] = (_sha512[412 + 0] >> 2) | ((add1 << 14) & $ffff)
  
  
        //rrot(416,  360, 32 + 7);
            //Shift 32
            add1 = _sha512[360 + 1];
            add2 = _sha512[360 + 2];
            _sha512[416 + 1] = _sha512[360 + 3]
            _sha512[416 + 2] = _sha512[360 + 0]
            _sha512[416 + 3] = add1
            _sha512[416 + 0] = add2
       
            //Shift 7
            add1 = _sha512[416 + 3];
            _sha512[416 + 3] = (_sha512[416 + 3] >> 7) | ((_sha512[416 + 2] << 9) & $ffff)
            _sha512[416 + 2] = (_sha512[416 + 2] >> 7) | ((_sha512[416 + 1] << 9) & $ffff)
            _sha512[416 + 1] = (_sha512[416 + 1] >> 7) | ((_sha512[416 + 0] << 9) & $ffff)
            _sha512[416 + 0] = (_sha512[416 + 0] >> 7) | ((add1 << 9) & $ffff)
       
  
        _sha512[392] = _sha512[408] ^ _sha512[412] ^ _sha512[416]; _sha512[392 + 1] = _sha512[408 + 1] ^ _sha512[412 + 1] ^ _sha512[416 + 1]; _sha512[392 + 2] = _sha512[408 + 2] ^ _sha512[412 + 2] ^ _sha512[416 + 2]; _sha512[392 + 3] = _sha512[408 + 3] ^ _sha512[412 + 3] ^ _sha512[416 + 3];;
  
        //404
        _sha512[404 + 3] = (_sha512[ 360 + 3] & _sha512[ 364  + 3]) ^ (_sha512[ 360 + 3] & _sha512[ 368  + 3]) ^ (_sha512[ 364  + 3] & _sha512[ 368  + 3]);
        _sha512[404 + 2] = (_sha512[ 360 + 2] & _sha512[ 364  + 2]) ^ (_sha512[ 360 + 2] & _sha512[ 368  + 2]) ^ (_sha512[ 364  + 2] & _sha512[ 368  + 2]);
        _sha512[404 + 1] = (_sha512[ 360 + 1] & _sha512[ 364  + 1]) ^ (_sha512[ 360 + 1] & _sha512[ 368  + 1]) ^ (_sha512[ 364  + 1] & _sha512[ 368  + 1]);
        _sha512[404] = (_sha512[ 360] & _sha512[364]) ^ (_sha512[ 360] & _sha512[368]) ^ (_sha512[364] & _sha512[368]);
  
        //j * 4 = k[j]
        add1 = _sha512[388 + 3] + _sha512[396 + 3] + _sha512[400 + 3] + _sha512[j * 4 + 3] + _sha512[(420 + (j) * 4) + 3]; add2 = _sha512[388 + 2] + _sha512[396 + 2] + _sha512[400 + 2] + _sha512[j * 4 + 2] + _sha512[(420 + (j) * 4) + 2] + (add1 >> 16); add3 = _sha512[388 + 1] + _sha512[396 + 1] + _sha512[400 + 1] + _sha512[j * 4 + 1] + _sha512[(420 + (j) * 4) + 1] + (add2 >> 16); add4 = _sha512[388] + _sha512[396] + _sha512[400] + _sha512[j * 4] + _sha512[(420 + (j) * 4)] + (add3 >> 16); _sha512[352 + 3] = add1 & $00ffff; _sha512[352 + 2] = add2 & $00ffff; _sha512[352 + 1] = add3 & $00ffff; _sha512[352] = add4 & $00ffff;
  
        add1 = _sha512[392 + 3] + _sha512[404 + 3]; add2 = _sha512[392 + 2] + _sha512[404 + 2] + (add1 >> 16); add3 = _sha512[392 + 1] + _sha512[404 + 1] + (add2 >> 16); add4 = _sha512[392] + _sha512[404] + (add3 >> 16); _sha512[356 + 3] = add1 & $00ffff; _sha512[356 + 2] = add2 & $00ffff; _sha512[356 + 1] = add3 & $00ffff; _sha512[356] = add4 & $00ffff;
  
        _sha512[388] = _sha512[384]; _sha512[ 388  + 1] = _sha512[ 384  + 1]; _sha512[ 388  + 2] = _sha512[ 384  + 2]; _sha512[ 388  + 3] = _sha512[ 384  + 3];;
        _sha512[384] = _sha512[380]; _sha512[ 384  + 1] = _sha512[ 380  + 1]; _sha512[ 384  + 2] = _sha512[ 380  + 2]; _sha512[ 384  + 3] = _sha512[ 380  + 3];;
        _sha512[380] = _sha512[376]; _sha512[ 380  + 1] = _sha512[ 376  + 1]; _sha512[ 380  + 2] = _sha512[ 376  + 2]; _sha512[ 380  + 3] = _sha512[ 376  + 3];;
        add1 = _sha512[372 + 3] + _sha512[352 + 3]; add2 = _sha512[372 + 2] + _sha512[352 + 2] + (add1 >> 16); add3 = _sha512[372 + 1] + _sha512[352 + 1] + (add2 >> 16); add4 = _sha512[372] + _sha512[352] + (add3 >> 16); _sha512[376 + 3] = add1 & $00ffff; _sha512[376 + 2] = add2 & $00ffff; _sha512[376 + 1] = add3 & $00ffff; _sha512[376] = add4 & $00ffff;

        _sha512[372] = _sha512[368]; _sha512[ 372  + 1] = _sha512[ 368  + 1]; _sha512[ 372  + 2] = _sha512[ 368  + 2]; _sha512[ 372  + 3] = _sha512[ 368  + 3];;
        _sha512[368] = _sha512[364]; _sha512[ 368  + 1] = _sha512[ 364  + 1]; _sha512[ 368  + 2] = _sha512[ 364  + 2]; _sha512[ 368  + 3] = _sha512[ 364  + 3];;
        _sha512[364] = _sha512[ 360]; _sha512[ 364  + 1] = _sha512[ 360 + 1]; _sha512[ 364  + 2] = _sha512[ 360 + 2]; _sha512[ 364  + 3] = _sha512[ 360 + 3];;
        add1 = _sha512[352 + 3] + _sha512[356 + 3]; add2 = _sha512[352 + 2] + _sha512[356 + 2] + (add1 >> 16); add3 = _sha512[352 + 1] + _sha512[356 + 1] + (add2 >> 16); add4 = _sha512[352] + _sha512[356] + (add3 >> 16); _sha512[360 + 3] = add1 & $00ffff; _sha512[360 + 2] = add2 & $00ffff; _sha512[360 + 1] = add3 & $00ffff; _sha512[360] = add4 & $00ffff;
    }


    add1 = _sha512[320 + 3] + _sha512[ 360 + 3]; add2 = _sha512[320 + 2] + _sha512[ 360 + 2] + (add1 >> 16); add3 = _sha512[320 + 1] + _sha512[ 360 + 1] + (add2 >> 16); add4 = _sha512[320] + _sha512[ 360] + (add3 >> 16); _sha512[320 + 3] = add1 & $00ffff; _sha512[320 + 2] = add2 & $00ffff; _sha512[320 + 1] = add3 & $00ffff; _sha512[320] = add4 & $00ffff;
    add1 = _sha512[324 + 3] + _sha512[ 364  + 3]; add2 = _sha512[324 + 2] + _sha512[ 364  + 2] + (add1 >> 16); add3 = _sha512[324 + 1] + _sha512[ 364  + 1] + (add2 >> 16); add4 = _sha512[324] + _sha512[ 364 ] + (add3 >> 16); _sha512[324 + 3] = add1 & $00ffff; _sha512[324 + 2] = add2 & $00ffff; _sha512[324 + 1] = add3 & $00ffff; _sha512[324] = add4 & $00ffff;
    add1 = _sha512[328 + 3] + _sha512[ 368  + 3]; add2 = _sha512[328 + 2] + _sha512[ 368  + 2] + (add1 >> 16); add3 = _sha512[328 + 1] + _sha512[ 368  + 1] + (add2 >> 16); add4 = _sha512[328] + _sha512[ 368 ] + (add3 >> 16); _sha512[328 + 3] = add1 & $00ffff; _sha512[328 + 2] = add2 & $00ffff; _sha512[328 + 1] = add3 & $00ffff; _sha512[328] = add4 & $00ffff;
    add1 = _sha512[332 + 3] + _sha512[ 372  + 3]; add2 = _sha512[332 + 2] + _sha512[ 372  + 2] + (add1 >> 16); add3 = _sha512[332 + 1] + _sha512[ 372  + 1] + (add2 >> 16); add4 = _sha512[332] + _sha512[ 372 ] + (add3 >> 16); _sha512[332 + 3] = add1 & $00ffff; _sha512[332 + 2] = add2 & $00ffff; _sha512[332 + 1] = add3 & $00ffff; _sha512[332] = add4 & $00ffff;
    add1 = _sha512[336 + 3] + _sha512[ 376  + 3]; add2 = _sha512[336 + 2] + _sha512[ 376  + 2] + (add1 >> 16); add3 = _sha512[336 + 1] + _sha512[ 376  + 1] + (add2 >> 16); add4 = _sha512[336] + _sha512[ 376 ] + (add3 >> 16); _sha512[336 + 3] = add1 & $00ffff; _sha512[336 + 2] = add2 & $00ffff; _sha512[336 + 1] = add3 & $00ffff; _sha512[336] = add4 & $00ffff;
    add1 = _sha512[340 + 3] + _sha512[ 380  + 3]; add2 = _sha512[340 + 2] + _sha512[ 380  + 2] + (add1 >> 16); add3 = _sha512[340 + 1] + _sha512[ 380  + 1] + (add2 >> 16); add4 = _sha512[340] + _sha512[ 380 ] + (add3 >> 16); _sha512[340 + 3] = add1 & $00ffff; _sha512[340 + 2] = add2 & $00ffff; _sha512[340 + 1] = add3 & $00ffff; _sha512[340] = add4 & $00ffff;
    add1 = _sha512[344 + 3] + _sha512[ 384  + 3]; add2 = _sha512[344 + 2] + _sha512[ 384  + 2] + (add1 >> 16); add3 = _sha512[344 + 1] + _sha512[ 384  + 1] + (add2 >> 16); add4 = _sha512[344] + _sha512[ 384 ] + (add3 >> 16); _sha512[344 + 3] = add1 & $00ffff; _sha512[344 + 2] = add2 & $00ffff; _sha512[344 + 1] = add3 & $00ffff; _sha512[344] = add4 & $00ffff;
    add1 = _sha512[348 + 3] + _sha512[ 388  + 3]; add2 = _sha512[348 + 2] + _sha512[ 388  + 2] + (add1 >> 16); add3 = _sha512[348 + 1] + _sha512[ 388  + 1] + (add2 >> 16); add4 = _sha512[348] + _sha512[ 388 ] + (add3 >> 16); _sha512[348 + 3] = add1 & $00ffff; _sha512[348 + 2] = add2 & $00ffff; _sha512[348 + 1] = add3 & $00ffff; _sha512[348] = add4 & $00ffff;
}

//convert hash to hex string
hex = "0123456789abcdef";
output = "";
for (i = 0; i < 8; i += 1)
{
    for(j = 0; j < 4 ; j += 1)
    {
        var b; b = _sha512[(320 + i * 4) + j];
        output += string_char_at(hex, ((b >> 12) & $f) + 1) +
                    string_char_at(hex, ((b >> 8) & $f) + 1) +
                    string_char_at(hex, ((b >> 4) & $f) + 1) +
                    string_char_at(hex, (b & $f) + 1);
    }
}

return output;

scHMAC()

Code:
/// hmac_sha1( key, string )
//
//  Implementation of the HMAC algorithm using the SHA1 hash function.
//  This algorithm is typically used for web authorisation, especially
//  when using the OAuth standard.
//
//      key          encryption key, string
//      string       plaintext to encrypt, string
//
/// GMLscripts.com/license

{
    var key = argument0;
    var str = argument1;
    var block_size = 128; // was 64
    var msg_digest_size = 64; // was 20
  
    //Create reference string for decimal hex value look-up (because of GM's
    //silly string indexing, this reference returns N+1)
    var hexRef = "0123456789abcdef";
     
    //Create buffers to hold our data. We use buffers rather than strings because
    //0x00 - the NULL character in ASCII - typically terminates a string and may
    //cause weirdness.
    var buf_key      = buffer_create( block_size, buffer_fixed, 1 );
  
    //64-bytes of padding and then enough room for the string
    var buf_innerPad = buffer_create( block_size + string_length( str ), buffer_fixed, 1 );
  
    //NB - Using 84 here - SHA1 returns 20 bytes of data and we append that to
    //64-bytes of padding
    var buf_outerPad = buffer_create( block_size + msg_digest_size, buffer_fixed, 1 );
  
    if ( string_length( key ) > block_size ) {
  
        //If the key is longer than SHA1's block size, we hash the key and use
        //that instead.
        //---->> UPDATED TO SHA512 function
        //var sha = sha1_string_utf8( key );
        var sha = scSHA512( key );
       
        //Since SHA1 returns a hex *string*, we need to turn that into 8-bit bytes.
        for( var n = 1; n <= 2 * msg_digest_size; n += 2 ) buffer_write( buf_key, buffer_u8,
            string_pos( string_char_at( sha, n+1 ), hexRef )
        + ( string_pos( string_char_at( sha, n ), hexRef ) * 16 ) - 17 );
       
    } else {
       
        //If the key is smaller than SHA1's block size, just use the key. Since
        //we're in a 64 byte buffer, it automatically pads with 0x00
        buffer_write( buf_key, buffer_text, key );
    }
  
    for( var n = 0; n < block_size; n++ ) {
        var keyVal = buffer_peek( buf_key, n, buffer_u8 );
       
        //Bitwise XOR between the inner/outer padding and the key
        buffer_poke( buf_innerPad, n, buffer_u8, $36 ^ keyVal );
        buffer_poke( buf_outerPad, n, buffer_u8, $5C ^ keyVal );
    }
  
    //Seek to the end of the padding  for both the inner and outer pads
    buffer_seek( buf_innerPad, buffer_seek_start, block_size );
    buffer_seek( buf_outerPad, buffer_seek_start, block_size );
  
    //Append the string to encrypt
    buffer_write( buf_innerPad, buffer_text, str );
  
    //Apply SHA1 to (innerPad + string)
    //------>> UPDATED to SHA512
    //var sha = buffer_sha1( buf_innerPad, 0, buffer_tell( buf_innerPad ) );
    var sha = scSHA512_buffer( buf_innerPad, 0, buffer_tell( buf_innerPad ) );
  
    //Turn the SHA1 output into bytes and append this to the outer pad
    for( var n = 1; n <= 2 * msg_digest_size; n += 2 ) buffer_write( buf_outerPad, buffer_u8,
        string_pos( string_char_at( sha, n+1 ), hexRef )
    + ( string_pos( string_char_at( sha, n ), hexRef ) * 16 ) - 17 );
  
    //Apply SHA1 to (outerPad + result)
    //------>> UPDATED to SHA512
    //var result = buffer_sha1( buf_outerPad, 0, buffer_tell( buf_outerPad ) );
    var result = scSHA512_buffer( buf_outerPad, 0, buffer_tell( buf_outerPad ) );
  
    buffer_delete( buf_key );
    buffer_delete( buf_innerPad );
    buffer_delete( buf_outerPad );
  
    return result;
}

CreationCode of Room
Code:
str = scHMAC("abc123", "Hello World!");
show_message(str);

RESULTS:
___________________________________________
############################################################################################
ERROR in
action number 1
of PreCreate Event
for object objMouse:

Attempting to read from outside the buffer, returning 0
at gml_Script_scSHA512_buffer (line 21) - binb[floor(i / 2)] = (buffer_read(argument0, buffer_u8) & $ff) << 8;
############################################################################################
--------------------------------------------------------------------------------------------
stack frame is
gml_Script_scSHA512_buffer (line 21)
called from - gml_Script_scHMAC (line 72) - var sha = scSHA512_buffer( buf_innerPad, 0, buffer_tell( buf_innerPad ) );
called from - gml_Room_room2_Create (line 1) - str = scHMAC("abc123", "Hello World!");

after hitting abort, the messagebox pops up and reads:
ae283e9ee4b36a74e4fb193456ff................A lot of hex digits........... b60
what the output should be:
557d7b43ffa9757f2c18fe902f12240192ed95b1ed8a5b1856c1e8d18141f946d1fc3b6d81b888b62651a335afe69e8e6ba40745f111b251eff50bfa6ee6b3a1
So, there are some complications and I'm sitting here like "I dunno what I'm doing, but my screen looks cool with all this code on it!"

I dunno what the issue is at all. I'm lost. Please help. :/
 
Last edited by a moderator:

Juju

Member
HMAC script looks fine to me. Does the original string-based SHA512 script work with the HMAC script?
 
M

mimsi

Guest
Yes, the string-based script is verified to work with the few inputs that I tested it with. Based on the nature of the likelihood of collisions to exist is so small, I'm so near 100% sure it works that you have a better chance of winning the lottery than for it to be malfunctioning.

EDIT: The only thing I am unsure about is if there is any "wierdness" involved with the null character that was pointed out in the HMAC script.

EDIT2: I've also noticed some errors in the code that don't affect the functionality. This includes a double var declaration of binb. Also, in the line of code written
Code:
for (i = 0; i < string_length(argument0); i += 1)
{
    if(i mod 2 == 0)
    {
        //High byte
        binb[floor(i / 2)] = (ord(string_char_at(argument0, i + 1)) & $ff) << 8;
    }else{
        //Low byte
        binb[floor(i / 2)] |= ord(string_char_at(argument0, i + 1)) & $ff;
    }
}
taking the floor of i/2 in the "true" case is unnecessary and likely slows down the script. The script is very large, so I'm sure there is room for many optimizations if GameMaker doesn't optimize at build time. This might be true for all of the additions of real literals. I'm not sure yet.

Also, the person who wrote this script I'm pretty sure is German. I found it on a website that I had to google translate. I may be able to relocate the site so that proper credit can be given to the poor soul who spent the time writing this thing.
 
Last edited by a moderator:

FrostyCat

Redemption Seeker
I know what's wrong now --- the reading loop is over a size in bits instead of in bytes.

Replace this:
Code:
for (i = 0; i < bitlength; i += 1)
With this:
Code:
for (i = 0; i < argument2; i += 1)
My previous post has been redacted to include this change.

Failing this, I would suggest that you test this piecewise, i.e. the SHA-512 script against test vectors and then the HMAC-SHA-512 against HMAC test vectors. That way you avoid targeting fixes at places that don't need fixing.
 
M

mimsi

Guest
Oh WOW!!!! It works perfectly now! I had suspected that at first! so I changed the line
Code:
bitlength = argument2 * 8;
to
Code:
bitlength = argument2;
and didn't think that maybe the value of bitlength being the first case would matter throughout the rest of the code!!
Output is perfect now! Thank you so much!
After I go through and try to optimize, I'll update this post as SOLVED and I'll post the updated code.
 
M

mimsi

Guest
Sorry for the double post, but these algorithms will be too large to keep in one post and I want the code to be available for anyone to use
My code is slightly modified. Link to original code: https://pastebin.com/YnTWNRKU
Code:
///string_sha512(message)
//Geschreven door Size43
 
var bitlength, binb, add1, add2, add3, add4, j, i, binb_length, _sha512, hex, b, output;
for(i = 750; i > 351; i -= 1)
{
    _sha512[i] = $0000;
}
 
_sha512[0] = $428a;_sha512[1] = $2f98;_sha512[2] = $d728;_sha512[3] = $ae22;_sha512[4] = $7137;_sha512[5] = $4491;_sha512[6] = $23ef;_sha512[7] = $65cd;_sha512[8] = $b5c0;_sha512[9] = $fbcf;_sha512[10] = $ec4d;_sha512[11] = $3b2f;_sha512[12] = $e9b5;_sha512[13] = $dba5;_sha512[14] = $8189;_sha512[15] = $dbbc;_sha512[16] = $3956;_sha512[17] = $c25b;_sha512[18] = $f348;_sha512[19] = $b538;_sha512[20] = $59f1;_sha512[21] = $11f1;_sha512[22] = $b605;_sha512[23] = $d019;_sha512[24] = $923f;_sha512[25] = $82a4;_sha512[26] = $af19;_sha512[27] = $4f9b;_sha512[28] = $ab1c;_sha512[29] = $5ed5;_sha512[30] = $da6d;_sha512[31] = $8118;_sha512[32] = $d807;_sha512[33] = $aa98;_sha512[34] = $a303;_sha512[35] = $0242;_sha512[36] = $1283;_sha512[37] = $5b01;_sha512[38] = $4570;_sha512[39] = $6fbe;_sha512[40] = $2431;_sha512[41] = $85be;_sha512[42] = $4ee4;_sha512[43] = $b28c;_sha512[44] = $550c;_sha512[45] = $7dc3;_sha512[46] = $d5ff;_sha512[47] = $b4e2;_sha512[48] = $72be;_sha512[49] = $5d74;_sha512[50] = $f27b;_sha512[51] = $896f;_sha512[52] = $80de;_sha512[53] = $b1fe;_sha512[54] = $3b16;_sha512[55] = $96b1;_sha512[56] = $9bdc;_sha512[57] = $06a7;_sha512[58] = $25c7;_sha512[59] = $1235;_sha512[60] = $c19b;_sha512[61] = $f174;_sha512[62] = $cf69;_sha512[63] = $2694;_sha512[64] = $e49b;_sha512[65] = $69c1;_sha512[66] = $9ef1;_sha512[67] = $4ad2;_sha512[68] = $efbe;_sha512[69] = $4786;_sha512[70] = $384f;_sha512[71] = $25e3;_sha512[72] = $0fc1;_sha512[73] = $9dc6;_sha512[74] = $8b8c;_sha512[75] = $d5b5;_sha512[76] = $240c;_sha512[77] = $a1cc;_sha512[78] = $77ac;_sha512[79] = $9c65;_sha512[80] = $2de9;_sha512[81] = $2c6f;_sha512[82] = $592b;_sha512[83] = $0275;_sha512[84] = $4a74;_sha512[85] = $84aa;_sha512[86] = $6ea6;_sha512[87] = $e483;_sha512[88] = $5cb0;_sha512[89] = $a9dc;_sha512[90] = $bd41;_sha512[91] = $fbd4;_sha512[92] = $76f9;_sha512[93] = $88da;_sha512[94] = $8311;_sha512[95] = $53b5;_sha512[96] = $983e;_sha512[97] = $5152;_sha512[98] = $ee66;_sha512[99] = $dfab;_sha512[100] = $a831;_sha512[101] = $c66d;_sha512[102] = $2db4;_sha512[103] = $3210;_sha512[104] = $b003;_sha512[105] = $27c8;_sha512[106] = $98fb;_sha512[107] = $213f;_sha512[108] = $bf59;_sha512[109] = $7fc7;_sha512[110] = $beef;_sha512[111] = $0ee4;_sha512[112] = $c6e0;_sha512[113] = $0bf3;_sha512[114] = $3da8;_sha512[115] = $8fc2;_sha512[116] = $d5a7;_sha512[117] = $9147;_sha512[118] = $930a;_sha512[119] = $a725;_sha512[120] = $06ca;_sha512[121] = $6351;_sha512[122] = $e003;_sha512[123] = $826f;_sha512[124] = $1429;_sha512[125] = $2967;_sha512[126] = $0a0e;_sha512[127] = $6e70;_sha512[128] = $27b7;_sha512[129] = $0a85;_sha512[130] = $46d2;_sha512[131] = $2ffc;_sha512[132] = $2e1b;_sha512[133] = $2138;_sha512[134] = $5c26;_sha512[135] = $c926;_sha512[136] = $4d2c;_sha512[137] = $6dfc;_sha512[138] = $5ac4;_sha512[139] = $2aed;_sha512[140] = $5338;_sha512[141] = $0d13;_sha512[142] = $9d95;_sha512[143] = $b3df;_sha512[144] = $650a;_sha512[145] = $7354;_sha512[146] = $8baf;_sha512[147] = $63de;_sha512[148] = $766a;_sha512[149] = $0abb;_sha512[150] = $3c77;_sha512[151] = $b2a8;_sha512[152] = $81c2;_sha512[153] = $c92e;_sha512[154] = $47ed;_sha512[155] = $aee6;_sha512[156] = $9272;_sha512[157] = $2c85;_sha512[158] = $1482;_sha512[159] = $353b;_sha512[160] = $a2bf;_sha512[161] = $e8a1;_sha512[162] = $4cf1;_sha512[163] = $0364;_sha512[164] = $a81a;_sha512[165] = $664b;_sha512[166] = $bc42;_sha512[167] = $3001;_sha512[168] = $c24b;_sha512[169] = $8b70;_sha512[170] = $d0f8;_sha512[171] = $9791;_sha512[172] = $c76c;_sha512[173] = $51a3;_sha512[174] = $0654;_sha512[175] = $be30;_sha512[176] = $d192;_sha512[177] = $e819;_sha512[178] = $d6ef;_sha512[179] = $5218;_sha512[180] = $d699;_sha512[181] = $0624;_sha512[182] = $5565;_sha512[183] = $a910;_sha512[184] = $f40e;_sha512[185] = $3585;_sha512[186] = $5771;_sha512[187] = $202a;_sha512[188] = $106a;_sha512[189] = $a070;_sha512[190] = $32bb;_sha512[191] = $d1b8;_sha512[192] = $19a4;_sha512[193] = $c116;_sha512[194] = $b8d2;_sha512[195] = $d0c8;_sha512[196] = $1e37;_sha512[197] = $6c08;_sha512[198] = $5141;_sha512[199] = $ab53;_sha512[200] = $2748;_sha512[201] = $774c;_sha512[202] = $df8e;_sha512[203] = $eb99;_sha512[204] = $34b0;_sha512[205] = $bcb5;_sha512[206] = $e19b;_sha512[207] = $48a8;_sha512[208] = $391c;_sha512[209] = $0cb3;_sha512[210] = $c5c9;_sha512[211] = $5a63;_sha512[212] = $4ed8;_sha512[213] = $aa4a;_sha512[214] = $e341;_sha512[215] = $8acb;_sha512[216] = $5b9c;_sha512[217] = $ca4f;_sha512[218] = $7763;_sha512[219] = $e373;_sha512[220] = $682e;_sha512[221] = $6ff3;_sha512[222] = $d6b2;_sha512[223] = $b8a3;_sha512[224] = $748f;_sha512[225] = $82ee;_sha512[226] = $5def;_sha512[227] = $b2fc;_sha512[228] = $78a5;_sha512[229] = $636f;_sha512[230] = $4317;_sha512[231] = $2f60;_sha512[232] = $84c8;_sha512[233] = $7814;_sha512[234] = $a1f0;_sha512[235] = $ab72;_sha512[236] = $8cc7;_sha512[237] = $0208;_sha512[238] = $1a64;_sha512[239] = $39ec;_sha512[240] = $90be;_sha512[241] = $fffa;_sha512[242] = $2363;_sha512[243] = $1e28;_sha512[244] = $a450;_sha512[245] = $6ceb;_sha512[246] = $de82;_sha512[247] = $bde9;_sha512[248] = $bef9;_sha512[249] = $a3f7;_sha512[250] = $b2c6;_sha512[251] = $7915;_sha512[252] = $c671;_sha512[253] = $78f2;_sha512[254] = $e372;_sha512[255] = $532b;_sha512[256] = $ca27;_sha512[257] = $3ece;_sha512[258] = $ea26;_sha512[259] = $619c;_sha512[260] = $d186;_sha512[261] = $b8c7;_sha512[262] = $21c0;_sha512[263] = $c207;_sha512[264] = $eada;_sha512[265] = $7dd6;_sha512[266] = $cde0;_sha512[267] = $eb1e;_sha512[268] = $f57d;_sha512[269] = $4f7f;_sha512[270] = $ee6e;_sha512[271] = $d178;_sha512[272] = $06f0;_sha512[273] = $67aa;_sha512[274] = $7217;_sha512[275] = $6fba;_sha512[276] = $0a63;_sha512[277] = $7dc5;_sha512[278] = $a2c8;_sha512[279] = $98a6;_sha512[280] = $113f;_sha512[281] = $9804;_sha512[282] = $bef9;_sha512[283] = $0dae;_sha512[284] = $1b71;_sha512[285] = $0b35;_sha512[286] = $131c;_sha512[287] = $471b;_sha512[288] = $28db;_sha512[289] = $77f5;_sha512[290] = $2304;_sha512[291] = $7d84;_sha512[292] = $32ca;_sha512[293] = $ab7b;_sha512[294] = $40c7;_sha512[295] = $2493;_sha512[296] = $3c9e;_sha512[297] = $be0a;_sha512[298] = $15c9;_sha512[299] = $bebc;_sha512[300] = $431d;_sha512[301] = $67c4;_sha512[302] = $9c10;_sha512[303] = $0d4c;_sha512[304] = $4cc5;_sha512[305] = $d4be;_sha512[306] = $cb3e;_sha512[307] = $42b6;_sha512[308] = $597f;_sha512[309] = $299c;_sha512[310] = $fc65;_sha512[311] = $7e2a;_sha512[312] = $5fcb;_sha512[313] = $6fab;_sha512[314] = $3ad6;_sha512[315] = $faec;_sha512[316] = $6c44;_sha512[317] = $198c;_sha512[318] = $4a47;_sha512[319] = $5817;_sha512[320] = $6a09;_sha512[321] = $e667;_sha512[322] = $f3bc;_sha512[323] = $c908;_sha512[324] = $bb67;_sha512[325] = $ae85;_sha512[326] = $84ca;_sha512[327] = $a73b;_sha512[328] = $3c6e;_sha512[329] = $f372;_sha512[330] = $fe94;_sha512[331] = $f82b;_sha512[332] = $a54f;_sha512[333] = $f53a;_sha512[334] = $5f1d;_sha512[335] = $36f1;_sha512[336] = $510e;_sha512[337] = $527f;_sha512[338] = $ade6;_sha512[339] = $82d1;_sha512[340] = $9b05;_sha512[341] = $688c;_sha512[342] = $2b3e;_sha512[343] = $6c1f;_sha512[344] = $1f83;_sha512[345] = $d9ab;_sha512[346] = $fb41;_sha512[347] = $bd6b;_sha512[348] = $5be0;_sha512[349] = $cd19;_sha512[350] = $137e;_sha512[351] = $2179;
 
bitlength = string_length(argument0) * 8
 
//Convert to big-endian
for (i = 0; i < string_length(argument0); i++)
{
    if(i mod 2 == 0)
    {
        //High byte
        binb[i / 2] = (ord(string_char_at(argument0, i + 1)) & $ff) << 8;
    }else{
        //Low byte
        binb[floor(i / 2)] |= ord(string_char_at(argument0, i + 1)) & $ff;
    }
}
 
if(i mod 2 == 0)
{
    //High byte
    binb[i / 2] = $80 << 8;
}else{
    //Low byte
    binb[floor(i / 2)] |= $80;
}
 
//append padding to the source string. The format is described in the FIPS.
binb_length = ((((bitlength + 128) >> 10) + 1) << 6);
 
binb[binb_length - 1] = bitlength & $ffff;
binb[binb_length - 2] = (bitlength >> 16) & $ffff;

for (i = 0; i < (binb_length / 2); i += 32) //32 dwords is the block size
{
    _sha512[360] = _sha512[320]; _sha512[360 + 1] = _sha512[320 + 1]; _sha512[360 + 2] = _sha512[320 + 2]; _sha512[360 + 3] = _sha512[320 + 3];;
    _sha512[364] = _sha512[324]; _sha512[364 + 1] = _sha512[324 + 1]; _sha512[364 + 2] = _sha512[324 + 2]; _sha512[364 + 3] = _sha512[324 + 3];;
    _sha512[368] = _sha512[328]; _sha512[368 + 1] = _sha512[328 + 1]; _sha512[368 + 2] = _sha512[328 + 2]; _sha512[368 + 3] = _sha512[328 + 3];;
    _sha512[372] = _sha512[332]; _sha512[372 + 1] = _sha512[332 + 1]; _sha512[372 + 2] = _sha512[332 + 2]; _sha512[372 + 3] = _sha512[332 + 3];;
    _sha512[376] = _sha512[336]; _sha512[376 + 1] = _sha512[336 + 1]; _sha512[376 + 2] = _sha512[336 + 2]; _sha512[376 + 3] = _sha512[336 + 3];;
    _sha512[380] = _sha512[340]; _sha512[380 + 1] = _sha512[340 + 1]; _sha512[380 + 2] = _sha512[340 + 2]; _sha512[380 + 3] = _sha512[340 + 3];;
    _sha512[384] = _sha512[344]; _sha512[384 + 1] = _sha512[344 + 1]; _sha512[384 + 2] = _sha512[344 + 2]; _sha512[384 + 3] = _sha512[344 + 3];;
    _sha512[388] = _sha512[348]; _sha512[388 + 1] = _sha512[348 + 1]; _sha512[388 + 2] = _sha512[348 + 2]; _sha512[388 + 3] = _sha512[348 + 3];;
 
    for (j = 0; j < 16; j++)
    {
        _sha512[(420 + j * 4)] = binb[(i + 2 * j) * 2]; _sha512[(420 + j * 4) + 1] = binb[(i + 2 * j) * 2 + 1]; _sha512[(420 + j * 4) + 2] = binb[(i + 2 * j + 1) * 2]; _sha512[(420 + j * 4) + 3] = binb[(i + 2 * j + 1) * 2 + 1];;
    }
  
    for (j = 16; j < 80; j++)
    {
        //sigma1
        //rrot(408, (420 + (j - 2) * 4), 19);
            //Shift 16
            add2 = (420 + (j - 2) * 4);
            add1 = _sha512[add2 + 3];
            _sha512[408 + 3] = _sha512[add2 + 2];
            _sha512[408 + 2] = _sha512[add2 + 1];
            _sha512[408 + 1] = _sha512[add2 + 0];
            _sha512[408 + 0] = add1;
          
            //Shift 3
            add1 = _sha512[408 + 3];
            _sha512[408 + 3] = (_sha512[408 + 3] >> 3) | ((_sha512[408 + 2] << 13) & $ffff);
            _sha512[408 + 2] = (_sha512[408 + 2] >> 3) | ((_sha512[408 + 1] << 13) & $ffff);
            _sha512[408 + 1] = (_sha512[408 + 1] >> 3) | ((_sha512[408 + 0] << 13) & $ffff);
            _sha512[408 + 0] = (_sha512[408 + 0] >> 3) | ((add1 << 13) & $ffff);
          
          
        //rrot(412, (420 + (j - 2) * 4), 32 + 29);
            add2 = (420 + (j - 2) * 4);
            //Shift 48
            add1 = _sha512[add2 + 0];
            _sha512[412 + 0] = _sha512[add2 + 1];
            _sha512[412 + 1] = _sha512[add2 + 2];
            _sha512[412 + 2] = _sha512[add2 + 3];
            _sha512[412 + 3] = add1;
          
            //Shift 13
            add1 = _sha512[412 + 3];
            _sha512[412 + 3] = (_sha512[412 + 3] >> 13) | ((_sha512[412 + 2] << 3) & $ffff);
            _sha512[412 + 2] = (_sha512[412 + 2] >> 13) | ((_sha512[412 + 1] << 3) & $ffff);
            _sha512[412 + 1] = (_sha512[412 + 1] >> 13) | ((_sha512[412 + 0] << 3) & $ffff);
            _sha512[412 + 0] = (_sha512[412 + 0] >> 13) | ((add1 << 3) & $ffff);
      
        //shr(416, (420 + (j - 2) * 4), 6);
            //Shift 6
            //add2 = (420 + (j - 2) * 4);
            _sha512[416 + 3] = (_sha512[add2 + 3] >> 6) | ((_sha512[add2 + 2] << 10) & $ffff);
            _sha512[416 + 2] = (_sha512[add2 + 2] >> 6) | ((_sha512[add2 + 1] << 10) & $ffff);
            _sha512[416 + 1] = (_sha512[add2 + 1] >> 6) | ((_sha512[add2 + 0] << 10) & $ffff);
            _sha512[416 + 0] = (_sha512[add2 + 0] >> 6);
        _sha512[396] = _sha512[408] ^ _sha512[412] ^ _sha512[416]; _sha512[396 + 1] = _sha512[408 + 1] ^ _sha512[412 + 1] ^ _sha512[416 + 1]; _sha512[396 + 2] = _sha512[408 + 2] ^ _sha512[412 + 2] ^ _sha512[416 + 2]; _sha512[396 + 3] = _sha512[408 + 3] ^ _sha512[412 + 3] ^ _sha512[416 + 3];;
      
        //sigma0
        //rrot(408, (420 + (j - 15) * 4), 1);
            //Shift 1
            add2 = (420 + (j - 15) * 4);
            add1 = _sha512[add2 + 3];
            _sha512[408 + 3] = (_sha512[add2 + 3] >> 1) | ((_sha512[add2 + 2] << 15) & $ffff);
            _sha512[408 + 2] = (_sha512[add2 + 2] >> 1) | ((_sha512[add2 + 1] << 15) & $ffff);
            _sha512[408 + 1] = (_sha512[add2 + 1] >> 1) | ((_sha512[add2 + 0] << 15) & $ffff);
            _sha512[408 + 0] = (_sha512[add2 + 0] >> 1) | ((add1 << 15) & $ffff);
          
        //rrot(412, (420 + (j - 15) * 4), 8);
            //Shift 8
            //add2 = (420 + (j - 15) * 4)
            add1 = _sha512[add2 + 3];
            _sha512[412 + 3] = (_sha512[add2 + 3] >> 8) | ((_sha512[add2 + 2] << 8) & $ffff);
            _sha512[412 + 2] = (_sha512[add2 + 2] >> 8) | ((_sha512[add2 + 1] << 8) & $ffff);
            _sha512[412 + 1] = (_sha512[add2 + 1] >> 8) | ((_sha512[add2 + 0] << 8) & $ffff);
            _sha512[412 + 0] = (_sha512[add2 + 0] >> 8) | ((add1 << 8) & $ffff);
      
      
        //shr(416, (420 + (j - 15) * 4), 7);
            //Shift 6
            //add2 = (420 + (j - 15) * 4);
            _sha512[416 + 3] = (_sha512[add2 + 3] >> 7) | ((_sha512[add2 + 2] << 9) & $ffff);
            _sha512[416 + 2] = (_sha512[add2 + 2] >> 7) | ((_sha512[add2 + 1] << 9) & $ffff);
            _sha512[416 + 1] = (_sha512[add2 + 1] >> 7) | ((_sha512[add2 + 0] << 9) & $ffff);
            _sha512[416 + 0] = (_sha512[add2 + 0] >> 7);
      
        _sha512[392] = _sha512[408] ^ _sha512[412] ^ _sha512[416]; _sha512[392 + 1] = _sha512[408 + 1] ^ _sha512[412 + 1] ^ _sha512[416 + 1]; _sha512[392 + 2] = _sha512[408 + 2] ^ _sha512[412 + 2] ^ _sha512[416 + 2]; _sha512[392 + 3] = _sha512[408 + 3] ^ _sha512[412 + 3] ^ _sha512[416 + 3];;
      
        add1 = _sha512[396 + 3] + _sha512[(420 + (j - 7) * 4) + 3] + _sha512[392 + 3] + _sha512[(420 + (j - 16) * 4) + 3]; add2 = _sha512[396 + 2] + _sha512[(420 + (j - 7) * 4) + 2] + _sha512[392 + 2] + _sha512[(420 + (j - 16) * 4) + 2] + (add1 >> 16); add3 = _sha512[396 + 1] + _sha512[(420 + (j - 7) * 4) + 1] + _sha512[392 + 1] + _sha512[(420 + (j - 16) * 4) + 1] + (add2 >> 16); add4 = _sha512[396] + _sha512[(420 + (j - 7) * 4)] + _sha512[392] + _sha512[(420 + (j - 16) * 4)] + (add3 >> 16); _sha512[(420 + (j) * 4) + 3] = add1 & $00ffff; _sha512[(420 + (j) * 4) + 2] = add2 & $00ffff; _sha512[(420 + (j) * 4) + 1] = add3 & $00ffff; _sha512[(420 + (j) * 4)] = add4 & $00ffff;
    }
  
    for (j = 0; j < 80; j++)
    {
        //400
        _sha512[400 + 3] = (_sha512[376 + 3] & _sha512[380 + 3]) ^ (~_sha512[376 + 3] & _sha512[384 + 3]);
        _sha512[400 + 2] = (_sha512[376 + 2] & _sha512[380 + 2]) ^ (~_sha512[376 + 2] & _sha512[384 + 2]);
        _sha512[400 + 1] = (_sha512[376 + 1] & _sha512[380 + 1]) ^ (~_sha512[376 + 1] & _sha512[384 + 1]);
        _sha512[400] = (_sha512[376] & _sha512[380]) ^ (~_sha512[376] & _sha512[384]);
      
        //Sigma1
        //rrot(408, 376, 14);
            //Shift 14
            add1 = _sha512[376 + 3];
            _sha512[408 + 3] = (_sha512[376 + 3] >> 14) | ((_sha512[376 + 2] << 2) & $ffff);
            _sha512[408 + 2] = (_sha512[376 + 2] >> 14) | ((_sha512[376 + 1] << 2) & $ffff);
            _sha512[408 + 1] = (_sha512[376 + 1] >> 14) | ((_sha512[376 + 0] << 2) & $ffff);
            _sha512[408 + 0] = (_sha512[376 + 0] >> 14) | ((add1 << 2) & $ffff);
      
      
        //rrot(412, 376, 18);
            //Shift 16
            add1 = _sha512[376 + 3];
            _sha512[412 + 3] = _sha512[376 + 2];
            _sha512[412 + 2] = _sha512[376 + 1];
            _sha512[412 + 1] = _sha512[376 + 0];
            _sha512[412 + 0] = add1;
          
            //Shift 2
            add1 = _sha512[412 + 3];
            _sha512[412 + 3] = (_sha512[412 + 3] >> 2) | ((_sha512[412 + 2] << 14) & $ffff);
            _sha512[412 + 2] = (_sha512[412 + 2] >> 2) | ((_sha512[412 + 1] << 14) & $ffff);
            _sha512[412 + 1] = (_sha512[412 + 1] >> 2) | ((_sha512[412 + 0] << 14) & $ffff);
            _sha512[412 + 0] = (_sha512[412 + 0] >> 2) | ((add1 << 14) & $ffff);
      
        //rrot(416, 376, 32 + 9);
            //Shift 32
            add1 = _sha512[376 + 1];
            add2 = _sha512[376 + 2];
            _sha512[416 + 1] = _sha512[376 + 3];
            _sha512[416 + 2] = _sha512[376 + 0];
            _sha512[416 + 3] = add1;
            _sha512[416 + 0] = add2;
          
            //Shift 9
            add1 = _sha512[416 + 3];
            _sha512[416 + 3] = (_sha512[416 + 3] >> 9) | ((_sha512[416 + 2] << 7) & $ffff);
            _sha512[416 + 2] = (_sha512[416 + 2] >> 9) | ((_sha512[416 + 1] << 7) & $ffff);
            _sha512[416 + 1] = (_sha512[416 + 1] >> 9) | ((_sha512[416 + 0] << 7) & $ffff);
            _sha512[416 + 0] = (_sha512[416 + 0] >> 9) | ((add1 << 7) & $ffff);
      
        //xor3
        _sha512[396] = _sha512[408] ^ _sha512[412] ^ _sha512[416]; _sha512[396 + 1] = _sha512[408 + 1] ^ _sha512[412 + 1] ^ _sha512[416 + 1]; _sha512[396 + 2] = _sha512[408 + 2] ^ _sha512[412 + 2] ^ _sha512[416 + 2]; _sha512[396 + 3] = _sha512[408 + 3] ^ _sha512[412 + 3] ^ _sha512[416 + 3];;
      
        //Sigma0
        //rrot(408,  360, 28);
            //Shift 12
            add1 = _sha512[360 + 3];
            _sha512[408 + 3] = (_sha512[360 + 3] >> 12) | ((_sha512[360 + 2] << 4) & $ffff);
            _sha512[408 + 2] = (_sha512[360 + 2] >> 12) | ((_sha512[360 + 1] << 4) & $ffff);
            _sha512[408 + 1] = (_sha512[360 + 1] >> 12) | ((_sha512[360 + 0] << 4) & $ffff);
            _sha512[408 + 0] = (_sha512[360 + 0] >> 12) | ((add1 << 4) & $ffff);
          
            //Shift 16
            add1 = _sha512[408 + 3];
            _sha512[408 + 3] = _sha512[408 + 2];
            _sha512[408 + 2] = _sha512[408 + 1];
            _sha512[408 + 1] = _sha512[408 + 0];
            _sha512[408 + 0] = add1;
      
      
        //rrot(412,  360, 32 + 2);
            //Shift 32
            add1 = _sha512[360 + 1];
            add2 = _sha512[360 + 2];
            _sha512[412 + 1] = _sha512[360 + 3];
            _sha512[412 + 2] = _sha512[360 + 0];
            _sha512[412 + 3] = add1;
            _sha512[412 + 0] = add2;
          
            //Shift 2
            add1 = _sha512[412 + 3];
            _sha512[412 + 3] = (_sha512[412 + 3] >> 2) | ((_sha512[412 + 2] << 14) & $ffff);
            _sha512[412 + 2] = (_sha512[412 + 2] >> 2) | ((_sha512[412 + 1] << 14) & $ffff);
            _sha512[412 + 1] = (_sha512[412 + 1] >> 2) | ((_sha512[412 + 0] << 14) & $ffff);
            _sha512[412 + 0] = (_sha512[412 + 0] >> 2) | ((add1 << 14) & $ffff);
      
      
        //rrot(416,  360, 32 + 7);
            //Shift 32
            add1 = _sha512[360 + 1];
            add2 = _sha512[360 + 2];
            _sha512[416 + 1] = _sha512[360 + 3];
            _sha512[416 + 2] = _sha512[360 + 0];
            _sha512[416 + 3] = add1;
            _sha512[416 + 0] = add2;
          
            //Shift 7
            add1 = _sha512[416 + 3];
            _sha512[416 + 3] = (_sha512[416 + 3] >> 7) | ((_sha512[416 + 2] << 9) & $ffff);
            _sha512[416 + 2] = (_sha512[416 + 2] >> 7) | ((_sha512[416 + 1] << 9) & $ffff);
            _sha512[416 + 1] = (_sha512[416 + 1] >> 7) | ((_sha512[416 + 0] << 9) & $ffff);
            _sha512[416 + 0] = (_sha512[416 + 0] >> 7) | ((add1 << 9) & $ffff);
          
      
        _sha512[392] = _sha512[408] ^ _sha512[412] ^ _sha512[416]; _sha512[392 + 1] = _sha512[408 + 1] ^ _sha512[412 + 1] ^ _sha512[416 + 1]; _sha512[392 + 2] = _sha512[408 + 2] ^ _sha512[412 + 2] ^ _sha512[416 + 2]; _sha512[392 + 3] = _sha512[408 + 3] ^ _sha512[412 + 3] ^ _sha512[416 + 3];;
      
        //404
        _sha512[404 + 3] = (_sha512[360 + 3] & _sha512[364  + 3]) ^ (_sha512[360 + 3] & _sha512[368 + 3]) ^ (_sha512[364 + 3] & _sha512[368 + 3]);
        _sha512[404 + 2] = (_sha512[360 + 2] & _sha512[364  + 2]) ^ (_sha512[360 + 2] & _sha512[368 + 2]) ^ (_sha512[364 + 2] & _sha512[368 + 2]);
        _sha512[404 + 1] = (_sha512[360 + 1] & _sha512[364  + 1]) ^ (_sha512[360 + 1] & _sha512[368 + 1]) ^ (_sha512[364 + 1] & _sha512[368 + 1]);
        _sha512[404] = (_sha512[360] & _sha512[364]) ^ (_sha512[360] & _sha512[368]) ^ (_sha512[364] & _sha512[368]);
      
        //j * 4 = k[j]
        add1 = _sha512[388 + 3] + _sha512[396 + 3] + _sha512[400 + 3] + _sha512[j * 4 + 3] + _sha512[(420 + (j) * 4) + 3]; add2 = _sha512[388 + 2] + _sha512[396 + 2] + _sha512[400 + 2] + _sha512[j * 4 + 2] + _sha512[(420 + (j) * 4) + 2] + (add1 >> 16); add3 = _sha512[388 + 1] + _sha512[396 + 1] + _sha512[400 + 1] + _sha512[j * 4 + 1] + _sha512[(420 + (j) * 4) + 1] + (add2 >> 16); add4 = _sha512[388] + _sha512[396] + _sha512[400] + _sha512[j * 4] + _sha512[(420 + (j) * 4)] + (add3 >> 16); _sha512[352 + 3] = add1 & $00ffff; _sha512[352 + 2] = add2 & $00ffff; _sha512[352 + 1] = add3 & $00ffff; _sha512[352] = add4 & $00ffff;
      
        add1 = _sha512[392 + 3] + _sha512[404 + 3]; add2 = _sha512[392 + 2] + _sha512[404 + 2] + (add1 >> 16); add3 = _sha512[392 + 1] + _sha512[404 + 1] + (add2 >> 16); add4 = _sha512[392] + _sha512[404] + (add3 >> 16); _sha512[356 + 3] = add1 & $00ffff; _sha512[356 + 2] = add2 & $00ffff; _sha512[356 + 1] = add3 & $00ffff; _sha512[356] = add4 & $00ffff;
      
        _sha512[388] = _sha512[384]; _sha512[388 + 1] = _sha512[384 + 1]; _sha512[388 + 2] = _sha512[384 + 2]; _sha512[388 + 3] = _sha512[384 + 3];;
        _sha512[384] = _sha512[380]; _sha512[384 + 1] = _sha512[380 + 1]; _sha512[384 + 2] = _sha512[380 + 2]; _sha512[384 + 3] = _sha512[380 + 3];;
        _sha512[380] = _sha512[376]; _sha512[380 + 1] = _sha512[376 + 1]; _sha512[380 + 2] = _sha512[376 + 2]; _sha512[380 + 3] = _sha512[376 + 3];;
        add1 = _sha512[372 + 3] + _sha512[352 + 3]; add2 = _sha512[372 + 2] + _sha512[352 + 2] + (add1 >> 16); add3 = _sha512[372 + 1] + _sha512[352 + 1] + (add2 >> 16); add4 = _sha512[372] + _sha512[352] + (add3 >> 16); _sha512[376 + 3] = add1 & $00ffff; _sha512[376 + 2] = add2 & $00ffff; _sha512[376 + 1] = add3 & $00ffff; _sha512[376] = add4 & $00ffff;
 
        _sha512[372] = _sha512[368]; _sha512[372 + 1] = _sha512[368 + 1]; _sha512[372 + 2] = _sha512[368 + 2]; _sha512[372 + 3] = _sha512[368 + 3];;
        _sha512[368] = _sha512[364]; _sha512[368 + 1] = _sha512[364 + 1]; _sha512[368 + 2] = _sha512[364 + 2]; _sha512[368 + 3] = _sha512[364 + 3];;
        _sha512[364] = _sha512[360]; _sha512[364 + 1] = _sha512[360 + 1]; _sha512[364 + 2] = _sha512[360 + 2]; _sha512[364 + 3] = _sha512[360 + 3];;
        add1 = _sha512[352 + 3] + _sha512[356 + 3]; add2 = _sha512[352 + 2] + _sha512[356 + 2] + (add1 >> 16); add3 = _sha512[352 + 1] + _sha512[356 + 1] + (add2 >> 16); add4 = _sha512[352] + _sha512[356] + (add3 >> 16); _sha512[360 + 3] = add1 & $00ffff; _sha512[360 + 2] = add2 & $00ffff; _sha512[360 + 1] = add3 & $00ffff; _sha512[360] = add4 & $00ffff;
    }
  
  
    add1 = _sha512[320 + 3] + _sha512[360 + 3]; add2 = _sha512[320 + 2] + _sha512[360 + 2] + (add1 >> 16); add3 = _sha512[320 + 1] + _sha512[360 + 1] + (add2 >> 16); add4 = _sha512[320] + _sha512[360] + (add3 >> 16); _sha512[320 + 3] = add1 & $00ffff; _sha512[320 + 2] = add2 & $00ffff; _sha512[320 + 1] = add3 & $00ffff; _sha512[320] = add4 & $00ffff;
    add1 = _sha512[324 + 3] + _sha512[364 + 3]; add2 = _sha512[324 + 2] + _sha512[364 + 2] + (add1 >> 16); add3 = _sha512[324 + 1] + _sha512[364 + 1] + (add2 >> 16); add4 = _sha512[324] + _sha512[364] + (add3 >> 16); _sha512[324 + 3] = add1 & $00ffff; _sha512[324 + 2] = add2 & $00ffff; _sha512[324 + 1] = add3 & $00ffff; _sha512[324] = add4 & $00ffff;
    add1 = _sha512[328 + 3] + _sha512[368 + 3]; add2 = _sha512[328 + 2] + _sha512[368 + 2] + (add1 >> 16); add3 = _sha512[328 + 1] + _sha512[368 + 1] + (add2 >> 16); add4 = _sha512[328] + _sha512[368] + (add3 >> 16); _sha512[328 + 3] = add1 & $00ffff; _sha512[328 + 2] = add2 & $00ffff; _sha512[328 + 1] = add3 & $00ffff; _sha512[328] = add4 & $00ffff;
    add1 = _sha512[332 + 3] + _sha512[372 + 3]; add2 = _sha512[332 + 2] + _sha512[372 + 2] + (add1 >> 16); add3 = _sha512[332 + 1] + _sha512[372 + 1] + (add2 >> 16); add4 = _sha512[332] + _sha512[372] + (add3 >> 16); _sha512[332 + 3] = add1 & $00ffff; _sha512[332 + 2] = add2 & $00ffff; _sha512[332 + 1] = add3 & $00ffff; _sha512[332] = add4 & $00ffff;
    add1 = _sha512[336 + 3] + _sha512[376 + 3]; add2 = _sha512[336 + 2] + _sha512[376 + 2] + (add1 >> 16); add3 = _sha512[336 + 1] + _sha512[376 + 1] + (add2 >> 16); add4 = _sha512[336] + _sha512[376] + (add3 >> 16); _sha512[336 + 3] = add1 & $00ffff; _sha512[336 + 2] = add2 & $00ffff; _sha512[336 + 1] = add3 & $00ffff; _sha512[336] = add4 & $00ffff;
    add1 = _sha512[340 + 3] + _sha512[380 + 3]; add2 = _sha512[340 + 2] + _sha512[380 + 2] + (add1 >> 16); add3 = _sha512[340 + 1] + _sha512[380 + 1] + (add2 >> 16); add4 = _sha512[340] + _sha512[380] + (add3 >> 16); _sha512[340 + 3] = add1 & $00ffff; _sha512[340 + 2] = add2 & $00ffff; _sha512[340 + 1] = add3 & $00ffff; _sha512[340] = add4 & $00ffff;
    add1 = _sha512[344 + 3] + _sha512[384 + 3]; add2 = _sha512[344 + 2] + _sha512[384 + 2] + (add1 >> 16); add3 = _sha512[344 + 1] + _sha512[384 + 1] + (add2 >> 16); add4 = _sha512[344] + _sha512[384] + (add3 >> 16); _sha512[344 + 3] = add1 & $00ffff; _sha512[344 + 2] = add2 & $00ffff; _sha512[344 + 1] = add3 & $00ffff; _sha512[344] = add4 & $00ffff;
    add1 = _sha512[348 + 3] + _sha512[388 + 3]; add2 = _sha512[348 + 2] + _sha512[388 + 2] + (add1 >> 16); add3 = _sha512[348 + 1] + _sha512[388 + 1] + (add2 >> 16); add4 = _sha512[348] + _sha512[388] + (add3 >> 16); _sha512[348 + 3] = add1 & $00ffff; _sha512[348 + 2] = add2 & $00ffff; _sha512[348 + 1] = add3 & $00ffff; _sha512[348] = add4 & $00ffff;
}
 
//convert hash to hex string
hex = "0123456789abcdef";
output = "";
for (i = 0; i < 8; i++)
{
    for(j = 0; j < 4 ; j++)
    {
        b = _sha512[(320 + i * 4) + j];
        output += string_char_at(hex, ((b >> 12) & $f) + 1) +
                    string_char_at(hex, ((b >> 8) & $f) + 1) +
                    string_char_at(hex, ((b >> 4) & $f) + 1) +
                    string_char_at(hex, (b & $f) + 1);
    }
}
 
return output;
 
M

mimsi

Guest
Code:
///buffer_sha512(buffer, start, length)
//Geschreven door Size43

var bitlength, binb, add1, add2, add3, add4, j, i, binb_length, _sha512, hex, b, output;
for(i = 750; i > 351; i -= 1)
{
    _sha512[i] = $0000;
}

_sha512[0] = $428a;_sha512[1] = $2f98;_sha512[2] = $d728;_sha512[3] = $ae22;_sha512[4] = $7137;_sha512[5] = $4491;_sha512[6] = $23ef;_sha512[7] = $65cd;_sha512[8] = $b5c0;_sha512[9] = $fbcf;_sha512[10] = $ec4d;_sha512[11] = $3b2f;_sha512[12] = $e9b5;_sha512[13] = $dba5;_sha512[14] = $8189;_sha512[15] = $dbbc;_sha512[16] = $3956;_sha512[17] = $c25b;_sha512[18] = $f348;_sha512[19] = $b538;_sha512[20] = $59f1;_sha512[21] = $11f1;_sha512[22] = $b605;_sha512[23] = $d019;_sha512[24] = $923f;_sha512[25] = $82a4;_sha512[26] = $af19;_sha512[27] = $4f9b;_sha512[28] = $ab1c;_sha512[29] = $5ed5;_sha512[30] = $da6d;_sha512[31] = $8118;_sha512[32] = $d807;_sha512[33] = $aa98;_sha512[34] = $a303;_sha512[35] = $0242;_sha512[36] = $1283;_sha512[37] = $5b01;_sha512[38] = $4570;_sha512[39] = $6fbe;_sha512[40] = $2431;_sha512[41] = $85be;_sha512[42] = $4ee4;_sha512[43] = $b28c;_sha512[44] = $550c;_sha512[45] = $7dc3;_sha512[46] = $d5ff;_sha512[47] = $b4e2;_sha512[48] = $72be;_sha512[49] = $5d74;_sha512[50] = $f27b;_sha512[51] = $896f;_sha512[52] = $80de;_sha512[53] = $b1fe;_sha512[54] = $3b16;_sha512[55] = $96b1;_sha512[56] = $9bdc;_sha512[57] = $06a7;_sha512[58] = $25c7;_sha512[59] = $1235;_sha512[60] = $c19b;_sha512[61] = $f174;_sha512[62] = $cf69;_sha512[63] = $2694;_sha512[64] = $e49b;_sha512[65] = $69c1;_sha512[66] = $9ef1;_sha512[67] = $4ad2;_sha512[68] = $efbe;_sha512[69] = $4786;_sha512[70] = $384f;_sha512[71] = $25e3;_sha512[72] = $0fc1;_sha512[73] = $9dc6;_sha512[74] = $8b8c;_sha512[75] = $d5b5;_sha512[76] = $240c;_sha512[77] = $a1cc;_sha512[78] = $77ac;_sha512[79] = $9c65;_sha512[80] = $2de9;_sha512[81] = $2c6f;_sha512[82] = $592b;_sha512[83] = $0275;_sha512[84] = $4a74;_sha512[85] = $84aa;_sha512[86] = $6ea6;_sha512[87] = $e483;_sha512[88] = $5cb0;_sha512[89] = $a9dc;_sha512[90] = $bd41;_sha512[91] = $fbd4;_sha512[92] = $76f9;_sha512[93] = $88da;_sha512[94] = $8311;_sha512[95] = $53b5;_sha512[96] = $983e;_sha512[97] = $5152;_sha512[98] = $ee66;_sha512[99] = $dfab;_sha512[100] = $a831;_sha512[101] = $c66d;_sha512[102] = $2db4;_sha512[103] = $3210;_sha512[104] = $b003;_sha512[105] = $27c8;_sha512[106] = $98fb;_sha512[107] = $213f;_sha512[108] = $bf59;_sha512[109] = $7fc7;_sha512[110] = $beef;_sha512[111] = $0ee4;_sha512[112] = $c6e0;_sha512[113] = $0bf3;_sha512[114] = $3da8;_sha512[115] = $8fc2;_sha512[116] = $d5a7;_sha512[117] = $9147;_sha512[118] = $930a;_sha512[119] = $a725;_sha512[120] = $06ca;_sha512[121] = $6351;_sha512[122] = $e003;_sha512[123] = $826f;_sha512[124] = $1429;_sha512[125] = $2967;_sha512[126] = $0a0e;_sha512[127] = $6e70;_sha512[128] = $27b7;_sha512[129] = $0a85;_sha512[130] = $46d2;_sha512[131] = $2ffc;_sha512[132] = $2e1b;_sha512[133] = $2138;_sha512[134] = $5c26;_sha512[135] = $c926;_sha512[136] = $4d2c;_sha512[137] = $6dfc;_sha512[138] = $5ac4;_sha512[139] = $2aed;_sha512[140] = $5338;_sha512[141] = $0d13;_sha512[142] = $9d95;_sha512[143] = $b3df;_sha512[144] = $650a;_sha512[145] = $7354;_sha512[146] = $8baf;_sha512[147] = $63de;_sha512[148] = $766a;_sha512[149] = $0abb;_sha512[150] = $3c77;_sha512[151] = $b2a8;_sha512[152] = $81c2;_sha512[153] = $c92e;_sha512[154] = $47ed;_sha512[155] = $aee6;_sha512[156] = $9272;_sha512[157] = $2c85;_sha512[158] = $1482;_sha512[159] = $353b;_sha512[160] = $a2bf;_sha512[161] = $e8a1;_sha512[162] = $4cf1;_sha512[163] = $0364;_sha512[164] = $a81a;_sha512[165] = $664b;_sha512[166] = $bc42;_sha512[167] = $3001;_sha512[168] = $c24b;_sha512[169] = $8b70;_sha512[170] = $d0f8;_sha512[171] = $9791;_sha512[172] = $c76c;_sha512[173] = $51a3;_sha512[174] = $0654;_sha512[175] = $be30;_sha512[176] = $d192;_sha512[177] = $e819;_sha512[178] = $d6ef;_sha512[179] = $5218;_sha512[180] = $d699;_sha512[181] = $0624;_sha512[182] = $5565;_sha512[183] = $a910;_sha512[184] = $f40e;_sha512[185] = $3585;_sha512[186] = $5771;_sha512[187] = $202a;_sha512[188] = $106a;_sha512[189] = $a070;_sha512[190] = $32bb;_sha512[191] = $d1b8;_sha512[192] = $19a4;_sha512[193] = $c116;_sha512[194] = $b8d2;_sha512[195] = $d0c8;_sha512[196] = $1e37;_sha512[197] = $6c08;_sha512[198] = $5141;_sha512[199] = $ab53;_sha512[200] = $2748;_sha512[201] = $774c;_sha512[202] = $df8e;_sha512[203] = $eb99;_sha512[204] = $34b0;_sha512[205] = $bcb5;_sha512[206] = $e19b;_sha512[207] = $48a8;_sha512[208] = $391c;_sha512[209] = $0cb3;_sha512[210] = $c5c9;_sha512[211] = $5a63;_sha512[212] = $4ed8;_sha512[213] = $aa4a;_sha512[214] = $e341;_sha512[215] = $8acb;_sha512[216] = $5b9c;_sha512[217] = $ca4f;_sha512[218] = $7763;_sha512[219] = $e373;_sha512[220] = $682e;_sha512[221] = $6ff3;_sha512[222] = $d6b2;_sha512[223] = $b8a3;_sha512[224] = $748f;_sha512[225] = $82ee;_sha512[226] = $5def;_sha512[227] = $b2fc;_sha512[228] = $78a5;_sha512[229] = $636f;_sha512[230] = $4317;_sha512[231] = $2f60;_sha512[232] = $84c8;_sha512[233] = $7814;_sha512[234] = $a1f0;_sha512[235] = $ab72;_sha512[236] = $8cc7;_sha512[237] = $0208;_sha512[238] = $1a64;_sha512[239] = $39ec;_sha512[240] = $90be;_sha512[241] = $fffa;_sha512[242] = $2363;_sha512[243] = $1e28;_sha512[244] = $a450;_sha512[245] = $6ceb;_sha512[246] = $de82;_sha512[247] = $bde9;_sha512[248] = $bef9;_sha512[249] = $a3f7;_sha512[250] = $b2c6;_sha512[251] = $7915;_sha512[252] = $c671;_sha512[253] = $78f2;_sha512[254] = $e372;_sha512[255] = $532b;_sha512[256] = $ca27;_sha512[257] = $3ece;_sha512[258] = $ea26;_sha512[259] = $619c;_sha512[260] = $d186;_sha512[261] = $b8c7;_sha512[262] = $21c0;_sha512[263] = $c207;_sha512[264] = $eada;_sha512[265] = $7dd6;_sha512[266] = $cde0;_sha512[267] = $eb1e;_sha512[268] = $f57d;_sha512[269] = $4f7f;_sha512[270] = $ee6e;_sha512[271] = $d178;_sha512[272] = $06f0;_sha512[273] = $67aa;_sha512[274] = $7217;_sha512[275] = $6fba;_sha512[276] = $0a63;_sha512[277] = $7dc5;_sha512[278] = $a2c8;_sha512[279] = $98a6;_sha512[280] = $113f;_sha512[281] = $9804;_sha512[282] = $bef9;_sha512[283] = $0dae;_sha512[284] = $1b71;_sha512[285] = $0b35;_sha512[286] = $131c;_sha512[287] = $471b;_sha512[288] = $28db;_sha512[289] = $77f5;_sha512[290] = $2304;_sha512[291] = $7d84;_sha512[292] = $32ca;_sha512[293] = $ab7b;_sha512[294] = $40c7;_sha512[295] = $2493;_sha512[296] = $3c9e;_sha512[297] = $be0a;_sha512[298] = $15c9;_sha512[299] = $bebc;_sha512[300] = $431d;_sha512[301] = $67c4;_sha512[302] = $9c10;_sha512[303] = $0d4c;_sha512[304] = $4cc5;_sha512[305] = $d4be;_sha512[306] = $cb3e;_sha512[307] = $42b6;_sha512[308] = $597f;_sha512[309] = $299c;_sha512[310] = $fc65;_sha512[311] = $7e2a;_sha512[312] = $5fcb;_sha512[313] = $6fab;_sha512[314] = $3ad6;_sha512[315] = $faec;_sha512[316] = $6c44;_sha512[317] = $198c;_sha512[318] = $4a47;_sha512[319] = $5817;_sha512[320] = $6a09;_sha512[321] = $e667;_sha512[322] = $f3bc;_sha512[323] = $c908;_sha512[324] = $bb67;_sha512[325] = $ae85;_sha512[326] = $84ca;_sha512[327] = $a73b;_sha512[328] = $3c6e;_sha512[329] = $f372;_sha512[330] = $fe94;_sha512[331] = $f82b;_sha512[332] = $a54f;_sha512[333] = $f53a;_sha512[334] = $5f1d;_sha512[335] = $36f1;_sha512[336] = $510e;_sha512[337] = $527f;_sha512[338] = $ade6;_sha512[339] = $82d1;_sha512[340] = $9b05;_sha512[341] = $688c;_sha512[342] = $2b3e;_sha512[343] = $6c1f;_sha512[344] = $1f83;_sha512[345] = $d9ab;_sha512[346] = $fb41;_sha512[347] = $bd6b;_sha512[348] = $5be0;_sha512[349] = $cd19;_sha512[350] = $137e;_sha512[351] = $2179;

bitlength = argument2 * 8;

//Convert to big-endian
buffer_seek(argument0, buffer_seek_start, argument1);
for (i = 0; i < argument2; i += 1)
{
    if(i mod 2 == 0)
    {
        //High byte
        binb[i / 2] = (buffer_read(argument0, buffer_u8) & $ff) << 8;
    }else{
        //Low byte
        binb[floor(i / 2)] |= buffer_read(argument0, buffer_u8) & $ff;
    }
}

if(i mod 2 == 0)
{
    //High byte
    binb[i / 2] = $80 << 8;
}else{
    //Low byte
    binb[floor(i / 2)] |= $80;
}

//append padding to the source string. The format is described in the FIPS.
binb_length = ((((bitlength + 128) >> 10) + 1) << 6);

binb[binb_length - 1] = bitlength & $ffff;
binb[binb_length - 2] = (bitlength >> 16) & $ffff;

for (i = 0; i < (binb_length / 2); i += 32) //32 dwords is the block size
{
    _sha512[360] = _sha512[320]; _sha512[360 + 1] = _sha512[320 + 1]; _sha512[360 + 2] = _sha512[320 + 2]; _sha512[360 + 3] = _sha512[320 + 3];;
    _sha512[364] = _sha512[324]; _sha512[364 + 1] = _sha512[324 + 1]; _sha512[364 + 2] = _sha512[324 + 2]; _sha512[364 + 3] = _sha512[324 + 3];;
    _sha512[368] = _sha512[328]; _sha512[368 + 1] = _sha512[328 + 1]; _sha512[368 + 2] = _sha512[328 + 2]; _sha512[368 + 3] = _sha512[328 + 3];;
    _sha512[372] = _sha512[332]; _sha512[372 + 1] = _sha512[332 + 1]; _sha512[372 + 2] = _sha512[332 + 2]; _sha512[372 + 3] = _sha512[332 + 3];;
    _sha512[376] = _sha512[336]; _sha512[376 + 1] = _sha512[336 + 1]; _sha512[376 + 2] = _sha512[336 + 2]; _sha512[376 + 3] = _sha512[336 + 3];;
    _sha512[380] = _sha512[340]; _sha512[380 + 1] = _sha512[340 + 1]; _sha512[380 + 2] = _sha512[340 + 2]; _sha512[380 + 3] = _sha512[340 + 3];;
    _sha512[384] = _sha512[344]; _sha512[384 + 1] = _sha512[344 + 1]; _sha512[384 + 2] = _sha512[344 + 2]; _sha512[384 + 3] = _sha512[344 + 3];;
    _sha512[388] = _sha512[348]; _sha512[388 + 1] = _sha512[348 + 1]; _sha512[388 + 2] = _sha512[348 + 2]; _sha512[388 + 3] = _sha512[348 + 3];;
 
    for (j = 0; j < 16; j++)
    {
        _sha512[(420 + j * 4)] = binb[(i + 2 * j) * 2]; _sha512[(420 + j * 4) + 1] = binb[(i + 2 * j) * 2 + 1]; _sha512[(420 + j * 4) + 2] = binb[(i + 2 * j + 1) * 2]; _sha512[(420 + j * 4) + 3] = binb[(i + 2 * j + 1) * 2 + 1];;
    }
 
    for (j = 16; j < 80; j++)
    {
        //sigma1
        //rrot(408, (420 + (j - 2) * 4), 19);
            //Shift 16
            add2 = (420 + (j - 2) * 4);
            add1 = _sha512[add2 + 3];
            _sha512[408 + 3] = _sha512[add2 + 2];
            _sha512[408 + 2] = _sha512[add2 + 1];
            _sha512[408 + 1] = _sha512[add2 + 0];
            _sha512[408 + 0] = add1;
         
            //Shift 3
            add1 = _sha512[408 + 3];
            _sha512[408 + 3] = (_sha512[408 + 3] >> 3) | ((_sha512[408 + 2] << 13) & $ffff);
            _sha512[408 + 2] = (_sha512[408 + 2] >> 3) | ((_sha512[408 + 1] << 13) & $ffff);
            _sha512[408 + 1] = (_sha512[408 + 1] >> 3) | ((_sha512[408 + 0] << 13) & $ffff);
            _sha512[408 + 0] = (_sha512[408 + 0] >> 3) | ((add1 << 13) & $ffff);
         
         
        //rrot(412, (420 + (j - 2) * 4), 32 + 29);
            add2 = (420 + (j - 2) * 4);
            //Shift 48
            add1 = _sha512[add2 + 0];
            _sha512[412 + 0] = _sha512[add2 + 1];
            _sha512[412 + 1] = _sha512[add2 + 2];
            _sha512[412 + 2] = _sha512[add2 + 3];
            _sha512[412 + 3] = add1;
         
            //Shift 13
            add1 = _sha512[412 + 3];
            _sha512[412 + 3] = (_sha512[412 + 3] >> 13) | ((_sha512[412 + 2] << 3) & $ffff);
            _sha512[412 + 2] = (_sha512[412 + 2] >> 13) | ((_sha512[412 + 1] << 3) & $ffff);
            _sha512[412 + 1] = (_sha512[412 + 1] >> 13) | ((_sha512[412 + 0] << 3) & $ffff);
            _sha512[412 + 0] = (_sha512[412 + 0] >> 13) | ((add1 << 3) & $ffff);
     
        //shr(416, (420 + (j - 2) * 4), 6);
            //Shift 6
            //add2 = (420 + (j - 2) * 4);
            _sha512[416 + 3] = (_sha512[add2 + 3] >> 6) | ((_sha512[add2 + 2] << 10) & $ffff);
            _sha512[416 + 2] = (_sha512[add2 + 2] >> 6) | ((_sha512[add2 + 1] << 10) & $ffff);
            _sha512[416 + 1] = (_sha512[add2 + 1] >> 6) | ((_sha512[add2 + 0] << 10) & $ffff);
            _sha512[416 + 0] = (_sha512[add2 + 0] >> 6);
        _sha512[396] = _sha512[408] ^ _sha512[412] ^ _sha512[416]; _sha512[396 + 1] = _sha512[408 + 1] ^ _sha512[412 + 1] ^ _sha512[416 + 1]; _sha512[396 + 2] = _sha512[408 + 2] ^ _sha512[412 + 2] ^ _sha512[416 + 2]; _sha512[396 + 3] = _sha512[408 + 3] ^ _sha512[412 + 3] ^ _sha512[416 + 3];;
     
        //sigma0
        //rrot(408, (420 + (j - 15) * 4), 1);
            //Shift 1
            add2 = (420 + (j - 15) * 4);
            add1 = _sha512[add2 + 3];
            _sha512[408 + 3] = (_sha512[add2 + 3] >> 1) | ((_sha512[add2 + 2] << 15) & $ffff);
            _sha512[408 + 2] = (_sha512[add2 + 2] >> 1) | ((_sha512[add2 + 1] << 15) & $ffff);
            _sha512[408 + 1] = (_sha512[add2 + 1] >> 1) | ((_sha512[add2 + 0] << 15) & $ffff);
            _sha512[408 + 0] = (_sha512[add2 + 0] >> 1) | ((add1 << 15) & $ffff);
         
        //rrot(412, (420 + (j - 15) * 4), 8);
            //Shift 8
            //add2 = (420 + (j - 15) * 4)
            add1 = _sha512[add2 + 3];
            _sha512[412 + 3] = (_sha512[add2 + 3] >> 8) | ((_sha512[add2 + 2] << 8) & $ffff);
            _sha512[412 + 2] = (_sha512[add2 + 2] >> 8) | ((_sha512[add2 + 1] << 8) & $ffff);
            _sha512[412 + 1] = (_sha512[add2 + 1] >> 8) | ((_sha512[add2 + 0] << 8) & $ffff);
            _sha512[412 + 0] = (_sha512[add2 + 0] >> 8) | ((add1 << 8) & $ffff);
     
     
        //shr(416, (420 + (j - 15) * 4), 7);
            //Shift 6
            //add2 = (420 + (j - 15) * 4);
            _sha512[416 + 3] = (_sha512[add2 + 3] >> 7) | ((_sha512[add2 + 2] << 9) & $ffff);
            _sha512[416 + 2] = (_sha512[add2 + 2] >> 7) | ((_sha512[add2 + 1] << 9) & $ffff);
            _sha512[416 + 1] = (_sha512[add2 + 1] >> 7) | ((_sha512[add2 + 0] << 9) & $ffff);
            _sha512[416 + 0] = (_sha512[add2 + 0] >> 7);
     
        _sha512[392] = _sha512[408] ^ _sha512[412] ^ _sha512[416]; _sha512[392 + 1] = _sha512[408 + 1] ^ _sha512[412 + 1] ^ _sha512[416 + 1]; _sha512[392 + 2] = _sha512[408 + 2] ^ _sha512[412 + 2] ^ _sha512[416 + 2]; _sha512[392 + 3] = _sha512[408 + 3] ^ _sha512[412 + 3] ^ _sha512[416 + 3];;
     
        add1 = _sha512[396 + 3] + _sha512[(420 + (j - 7) * 4) + 3] + _sha512[392 + 3] + _sha512[(420 + (j - 16) * 4) + 3]; add2 = _sha512[396 + 2] + _sha512[(420 + (j - 7) * 4) + 2] + _sha512[392 + 2] + _sha512[(420 + (j - 16) * 4) + 2] + (add1 >> 16); add3 = _sha512[396 + 1] + _sha512[(420 + (j - 7) * 4) + 1] + _sha512[392 + 1] + _sha512[(420 + (j - 16) * 4) + 1] + (add2 >> 16); add4 = _sha512[396] + _sha512[(420 + (j - 7) * 4)] + _sha512[392] + _sha512[(420 + (j - 16) * 4)] + (add3 >> 16); _sha512[(420 + (j) * 4) + 3] = add1 & $00ffff; _sha512[(420 + (j) * 4) + 2] = add2 & $00ffff; _sha512[(420 + (j) * 4) + 1] = add3 & $00ffff; _sha512[(420 + (j) * 4)] = add4 & $00ffff;
    }
 
    for (j = 0; j < 80; j++)
    {
        //400
        _sha512[400 + 3] = (_sha512[376 + 3] & _sha512[380 + 3]) ^ (~_sha512[376 + 3] & _sha512[384 + 3]);
        _sha512[400 + 2] = (_sha512[376 + 2] & _sha512[380 + 2]) ^ (~_sha512[376 + 2] & _sha512[384 + 2]);
        _sha512[400 + 1] = (_sha512[376 + 1] & _sha512[380 + 1]) ^ (~_sha512[376 + 1] & _sha512[384 + 1]);
        _sha512[400] = (_sha512[376] & _sha512[380]) ^ (~_sha512[376] & _sha512[384]);
     
        //Sigma1
        //rrot(408, 376, 14);
            //Shift 14
            add1 = _sha512[376 + 3];
            _sha512[408 + 3] = (_sha512[376 + 3] >> 14) | ((_sha512[376 + 2] << 2) & $ffff);
            _sha512[408 + 2] = (_sha512[376 + 2] >> 14) | ((_sha512[376 + 1] << 2) & $ffff);
            _sha512[408 + 1] = (_sha512[376 + 1] >> 14) | ((_sha512[376 + 0] << 2) & $ffff);
            _sha512[408 + 0] = (_sha512[376 + 0] >> 14) | ((add1 << 2) & $ffff);
     
     
        //rrot(412, 376, 18);
            //Shift 16
            add1 = _sha512[376 + 3];
            _sha512[412 + 3] = _sha512[376 + 2];
            _sha512[412 + 2] = _sha512[376 + 1];
            _sha512[412 + 1] = _sha512[376 + 0];
            _sha512[412 + 0] = add1;
         
            //Shift 2
            add1 = _sha512[412 + 3];
            _sha512[412 + 3] = (_sha512[412 + 3] >> 2) | ((_sha512[412 + 2] << 14) & $ffff);
            _sha512[412 + 2] = (_sha512[412 + 2] >> 2) | ((_sha512[412 + 1] << 14) & $ffff);
            _sha512[412 + 1] = (_sha512[412 + 1] >> 2) | ((_sha512[412 + 0] << 14) & $ffff);
            _sha512[412 + 0] = (_sha512[412 + 0] >> 2) | ((add1 << 14) & $ffff);
     
        //rrot(416, 376, 32 + 9);
            //Shift 32
            add1 = _sha512[376 + 1];
            add2 = _sha512[376 + 2];
            _sha512[416 + 1] = _sha512[376 + 3];
            _sha512[416 + 2] = _sha512[376 + 0];
            _sha512[416 + 3] = add1;
            _sha512[416 + 0] = add2;
         
            //Shift 9
            add1 = _sha512[416 + 3];
            _sha512[416 + 3] = (_sha512[416 + 3] >> 9) | ((_sha512[416 + 2] << 7) & $ffff);
            _sha512[416 + 2] = (_sha512[416 + 2] >> 9) | ((_sha512[416 + 1] << 7) & $ffff);
            _sha512[416 + 1] = (_sha512[416 + 1] >> 9) | ((_sha512[416 + 0] << 7) & $ffff);
            _sha512[416 + 0] = (_sha512[416 + 0] >> 9) | ((add1 << 7) & $ffff);
     
        //xor3
        _sha512[396] = _sha512[408] ^ _sha512[412] ^ _sha512[416]; _sha512[396 + 1] = _sha512[408 + 1] ^ _sha512[412 + 1] ^ _sha512[416 + 1]; _sha512[396 + 2] = _sha512[408 + 2] ^ _sha512[412 + 2] ^ _sha512[416 + 2]; _sha512[396 + 3] = _sha512[408 + 3] ^ _sha512[412 + 3] ^ _sha512[416 + 3];;
     
        //Sigma0
        //rrot(408,  360, 28);
            //Shift 12
            add1 = _sha512[360 + 3];
            _sha512[408 + 3] = (_sha512[360 + 3] >> 12) | ((_sha512[360 + 2] << 4) & $ffff);
            _sha512[408 + 2] = (_sha512[360 + 2] >> 12) | ((_sha512[360 + 1] << 4) & $ffff);
            _sha512[408 + 1] = (_sha512[360 + 1] >> 12) | ((_sha512[360 + 0] << 4) & $ffff);
            _sha512[408 + 0] = (_sha512[360 + 0] >> 12) | ((add1 << 4) & $ffff);
         
            //Shift 16
            add1 = _sha512[408 + 3];
            _sha512[408 + 3] = _sha512[408 + 2];
            _sha512[408 + 2] = _sha512[408 + 1];
            _sha512[408 + 1] = _sha512[408 + 0];
            _sha512[408 + 0] = add1;
     
     
        //rrot(412,  360, 32 + 2);
            //Shift 32
            add1 = _sha512[360 + 1];
            add2 = _sha512[360 + 2];
            _sha512[412 + 1] = _sha512[360 + 3];
            _sha512[412 + 2] = _sha512[360 + 0];
            _sha512[412 + 3] = add1;
            _sha512[412 + 0] = add2;
         
            //Shift 2
            add1 = _sha512[412 + 3];
            _sha512[412 + 3] = (_sha512[412 + 3] >> 2) | ((_sha512[412 + 2] << 14) & $ffff);
            _sha512[412 + 2] = (_sha512[412 + 2] >> 2) | ((_sha512[412 + 1] << 14) & $ffff);
            _sha512[412 + 1] = (_sha512[412 + 1] >> 2) | ((_sha512[412 + 0] << 14) & $ffff);
            _sha512[412 + 0] = (_sha512[412 + 0] >> 2) | ((add1 << 14) & $ffff);
     
     
        //rrot(416,  360, 32 + 7);
            //Shift 32
            add1 = _sha512[360 + 1];
            add2 = _sha512[360 + 2];
            _sha512[416 + 1] = _sha512[360 + 3];
            _sha512[416 + 2] = _sha512[360 + 0];
            _sha512[416 + 3] = add1;
            _sha512[416 + 0] = add2;
         
            //Shift 7
            add1 = _sha512[416 + 3];
            _sha512[416 + 3] = (_sha512[416 + 3] >> 7) | ((_sha512[416 + 2] << 9) & $ffff);
            _sha512[416 + 2] = (_sha512[416 + 2] >> 7) | ((_sha512[416 + 1] << 9) & $ffff);
            _sha512[416 + 1] = (_sha512[416 + 1] >> 7) | ((_sha512[416 + 0] << 9) & $ffff);
            _sha512[416 + 0] = (_sha512[416 + 0] >> 7) | ((add1 << 9) & $ffff);
         
     
        _sha512[392] = _sha512[408] ^ _sha512[412] ^ _sha512[416]; _sha512[392 + 1] = _sha512[408 + 1] ^ _sha512[412 + 1] ^ _sha512[416 + 1]; _sha512[392 + 2] = _sha512[408 + 2] ^ _sha512[412 + 2] ^ _sha512[416 + 2]; _sha512[392 + 3] = _sha512[408 + 3] ^ _sha512[412 + 3] ^ _sha512[416 + 3];;
     
        //404
        _sha512[404 + 3] = (_sha512[360 + 3] & _sha512[364  + 3]) ^ (_sha512[360 + 3] & _sha512[368 + 3]) ^ (_sha512[364 + 3] & _sha512[368 + 3]);
        _sha512[404 + 2] = (_sha512[360 + 2] & _sha512[364  + 2]) ^ (_sha512[360 + 2] & _sha512[368 + 2]) ^ (_sha512[364 + 2] & _sha512[368 + 2]);
        _sha512[404 + 1] = (_sha512[360 + 1] & _sha512[364  + 1]) ^ (_sha512[360 + 1] & _sha512[368 + 1]) ^ (_sha512[364 + 1] & _sha512[368 + 1]);
        _sha512[404] = (_sha512[360] & _sha512[364]) ^ (_sha512[360] & _sha512[368]) ^ (_sha512[364] & _sha512[368]);
     
        //j * 4 = k[j]
        add1 = _sha512[388 + 3] + _sha512[396 + 3] + _sha512[400 + 3] + _sha512[j * 4 + 3] + _sha512[(420 + (j) * 4) + 3]; add2 = _sha512[388 + 2] + _sha512[396 + 2] + _sha512[400 + 2] + _sha512[j * 4 + 2] + _sha512[(420 + (j) * 4) + 2] + (add1 >> 16); add3 = _sha512[388 + 1] + _sha512[396 + 1] + _sha512[400 + 1] + _sha512[j * 4 + 1] + _sha512[(420 + (j) * 4) + 1] + (add2 >> 16); add4 = _sha512[388] + _sha512[396] + _sha512[400] + _sha512[j * 4] + _sha512[(420 + (j) * 4)] + (add3 >> 16); _sha512[352 + 3] = add1 & $00ffff; _sha512[352 + 2] = add2 & $00ffff; _sha512[352 + 1] = add3 & $00ffff; _sha512[352] = add4 & $00ffff;
     
        add1 = _sha512[392 + 3] + _sha512[404 + 3]; add2 = _sha512[392 + 2] + _sha512[404 + 2] + (add1 >> 16); add3 = _sha512[392 + 1] + _sha512[404 + 1] + (add2 >> 16); add4 = _sha512[392] + _sha512[404] + (add3 >> 16); _sha512[356 + 3] = add1 & $00ffff; _sha512[356 + 2] = add2 & $00ffff; _sha512[356 + 1] = add3 & $00ffff; _sha512[356] = add4 & $00ffff;
     
        _sha512[388] = _sha512[384]; _sha512[388 + 1] = _sha512[384 + 1]; _sha512[388 + 2] = _sha512[384 + 2]; _sha512[388 + 3] = _sha512[384 + 3];;
        _sha512[384] = _sha512[380]; _sha512[384 + 1] = _sha512[380 + 1]; _sha512[384 + 2] = _sha512[380 + 2]; _sha512[384 + 3] = _sha512[380 + 3];;
        _sha512[380] = _sha512[376]; _sha512[380 + 1] = _sha512[376 + 1]; _sha512[380 + 2] = _sha512[376 + 2]; _sha512[380 + 3] = _sha512[376 + 3];;
        add1 = _sha512[372 + 3] + _sha512[352 + 3]; add2 = _sha512[372 + 2] + _sha512[352 + 2] + (add1 >> 16); add3 = _sha512[372 + 1] + _sha512[352 + 1] + (add2 >> 16); add4 = _sha512[372] + _sha512[352] + (add3 >> 16); _sha512[376 + 3] = add1 & $00ffff; _sha512[376 + 2] = add2 & $00ffff; _sha512[376 + 1] = add3 & $00ffff; _sha512[376] = add4 & $00ffff;
 
        _sha512[372] = _sha512[368]; _sha512[372 + 1] = _sha512[368 + 1]; _sha512[372 + 2] = _sha512[368 + 2]; _sha512[372 + 3] = _sha512[368 + 3];;
        _sha512[368] = _sha512[364]; _sha512[368 + 1] = _sha512[364 + 1]; _sha512[368 + 2] = _sha512[364 + 2]; _sha512[368 + 3] = _sha512[364 + 3];;
        _sha512[364] = _sha512[360]; _sha512[364 + 1] = _sha512[360 + 1]; _sha512[364 + 2] = _sha512[360 + 2]; _sha512[364 + 3] = _sha512[360 + 3];;
        add1 = _sha512[352 + 3] + _sha512[356 + 3]; add2 = _sha512[352 + 2] + _sha512[356 + 2] + (add1 >> 16); add3 = _sha512[352 + 1] + _sha512[356 + 1] + (add2 >> 16); add4 = _sha512[352] + _sha512[356] + (add3 >> 16); _sha512[360 + 3] = add1 & $00ffff; _sha512[360 + 2] = add2 & $00ffff; _sha512[360 + 1] = add3 & $00ffff; _sha512[360] = add4 & $00ffff;
    }
 
 
    add1 = _sha512[320 + 3] + _sha512[360 + 3]; add2 = _sha512[320 + 2] + _sha512[360 + 2] + (add1 >> 16); add3 = _sha512[320 + 1] + _sha512[360 + 1] + (add2 >> 16); add4 = _sha512[320] + _sha512[360] + (add3 >> 16); _sha512[320 + 3] = add1 & $00ffff; _sha512[320 + 2] = add2 & $00ffff; _sha512[320 + 1] = add3 & $00ffff; _sha512[320] = add4 & $00ffff;
    add1 = _sha512[324 + 3] + _sha512[364 + 3]; add2 = _sha512[324 + 2] + _sha512[364 + 2] + (add1 >> 16); add3 = _sha512[324 + 1] + _sha512[364 + 1] + (add2 >> 16); add4 = _sha512[324] + _sha512[364] + (add3 >> 16); _sha512[324 + 3] = add1 & $00ffff; _sha512[324 + 2] = add2 & $00ffff; _sha512[324 + 1] = add3 & $00ffff; _sha512[324] = add4 & $00ffff;
    add1 = _sha512[328 + 3] + _sha512[368 + 3]; add2 = _sha512[328 + 2] + _sha512[368 + 2] + (add1 >> 16); add3 = _sha512[328 + 1] + _sha512[368 + 1] + (add2 >> 16); add4 = _sha512[328] + _sha512[368] + (add3 >> 16); _sha512[328 + 3] = add1 & $00ffff; _sha512[328 + 2] = add2 & $00ffff; _sha512[328 + 1] = add3 & $00ffff; _sha512[328] = add4 & $00ffff;
    add1 = _sha512[332 + 3] + _sha512[372 + 3]; add2 = _sha512[332 + 2] + _sha512[372 + 2] + (add1 >> 16); add3 = _sha512[332 + 1] + _sha512[372 + 1] + (add2 >> 16); add4 = _sha512[332] + _sha512[372] + (add3 >> 16); _sha512[332 + 3] = add1 & $00ffff; _sha512[332 + 2] = add2 & $00ffff; _sha512[332 + 1] = add3 & $00ffff; _sha512[332] = add4 & $00ffff;
    add1 = _sha512[336 + 3] + _sha512[376 + 3]; add2 = _sha512[336 + 2] + _sha512[376 + 2] + (add1 >> 16); add3 = _sha512[336 + 1] + _sha512[376 + 1] + (add2 >> 16); add4 = _sha512[336] + _sha512[376] + (add3 >> 16); _sha512[336 + 3] = add1 & $00ffff; _sha512[336 + 2] = add2 & $00ffff; _sha512[336 + 1] = add3 & $00ffff; _sha512[336] = add4 & $00ffff;
    add1 = _sha512[340 + 3] + _sha512[380 + 3]; add2 = _sha512[340 + 2] + _sha512[380 + 2] + (add1 >> 16); add3 = _sha512[340 + 1] + _sha512[380 + 1] + (add2 >> 16); add4 = _sha512[340] + _sha512[380] + (add3 >> 16); _sha512[340 + 3] = add1 & $00ffff; _sha512[340 + 2] = add2 & $00ffff; _sha512[340 + 1] = add3 & $00ffff; _sha512[340] = add4 & $00ffff;
    add1 = _sha512[344 + 3] + _sha512[384 + 3]; add2 = _sha512[344 + 2] + _sha512[384 + 2] + (add1 >> 16); add3 = _sha512[344 + 1] + _sha512[384 + 1] + (add2 >> 16); add4 = _sha512[344] + _sha512[384] + (add3 >> 16); _sha512[344 + 3] = add1 & $00ffff; _sha512[344 + 2] = add2 & $00ffff; _sha512[344 + 1] = add3 & $00ffff; _sha512[344] = add4 & $00ffff;
    add1 = _sha512[348 + 3] + _sha512[388 + 3]; add2 = _sha512[348 + 2] + _sha512[388 + 2] + (add1 >> 16); add3 = _sha512[348 + 1] + _sha512[388 + 1] + (add2 >> 16); add4 = _sha512[348] + _sha512[388] + (add3 >> 16); _sha512[348 + 3] = add1 & $00ffff; _sha512[348 + 2] = add2 & $00ffff; _sha512[348 + 1] = add3 & $00ffff; _sha512[348] = add4 & $00ffff;
}
 
//convert hash to hex string
hex = "0123456789abcdef";
output = "";
for (i = 0; i < 8; i++)
{
    for(j = 0; j < 4 ; j++)
    {
        b = _sha512[(320 + i * 4) + j];
        output += string_char_at(hex, ((b >> 12) & $f) + 1) +
                    string_char_at(hex, ((b >> 8) & $f) + 1) +
                    string_char_at(hex, ((b >> 4) & $f) + 1) +
                    string_char_at(hex, (b & $f) + 1);
    }
}
 
return output;
Code:
/// hmac_sha512( key, string )
// 
//  Implementation of the HMAC algorithm using the SHA512 hash function.
//  This algorithm is typically used for web authorisation, especially
//  when using the OAuth standard.
// 
//      key          encryption key, string
//      string       plaintext to encrypt, string
// 
/// GMLscripts.com/license

{
    var key = argument0;
    var str = argument1;

    //Create reference string for decimal hex value look-up (because of GM's
    //silly string indexing, this reference returns N+1)
    var hexRef = "0123456789abcdef";
    
    //Create buffers to hold our data. We use buffers rather than strings because
    //0x00 - the NULL character in ASCII - typically terminates a string and may
    //cause weirdness.
    var buf_key = buffer_create( 128, buffer_fixed, 1 );
  
    //128-bytes of padding and then enough room for the string
    var buf_innerPad = buffer_create( 128 + string_length( str ), buffer_fixed, 1 );
  
    //NB - Using 192 here - SHA1 returns 64 bytes of data and we append that to
    //128-bytes of padding
    var buf_outerPad = buffer_create( 192, buffer_fixed, 1 );
  
    if ( string_length( key ) > 128 ) {
  
        //If the key is longer than SHA512's block size, we hash the key and use
        //that instead.
        var sha = string_sha512( key );
      
        //Since SHA512 returns a hex *string*, we need to turn that into 8-bit bytes.
        for( var n = 1; n <= 128; n += 2 ) buffer_write( buf_key, buffer_u8,
            string_pos( string_char_at( sha, n+1 ), hexRef )
        + ( string_pos( string_char_at( sha, n ), hexRef ) * 16 ) - 17 );
      
    } else {
      
        //If the key is smaller than SHA512's block size, just use the key. Since
        //we're in a 128 byte buffer, it automatically pads with 0x00
        buffer_write( buf_key, buffer_text, key );
    }
  
    for( var n = 0; n < 128; n++ ) {
        var keyVal = buffer_peek( buf_key, n, buffer_u8 );
      
        //Bitwise XOR between the inner/outer padding and the key
        buffer_poke( buf_innerPad, n, buffer_u8, $36 ^ keyVal );
        buffer_poke( buf_outerPad, n, buffer_u8, $5C ^ keyVal );
    }
  
    //Seek to the end of the padding  for both the inner and outer pads
    buffer_seek( buf_innerPad, buffer_seek_start, 128 );
    buffer_seek( buf_outerPad, buffer_seek_start, 128 );
  
    //Append the string to encrypt
    buffer_write( buf_innerPad, buffer_text, str );
  
    //Apply SHA512 to (innerPad + string)
    var sha = buffer_sha512( buf_innerPad, 0, buffer_tell( buf_innerPad ) );
  
    //Turn the SHA1 output into bytes and append this to the outer pad
    for( var n = 1; n <= 128; n += 2 ) buffer_write( buf_outerPad, buffer_u8,
        string_pos( string_char_at( sha, n+1 ), hexRef )
    + ( string_pos( string_char_at( sha, n ), hexRef ) * 16 ) - 17 );
  
    //Apply SHA512 to (outerPad + result)
    var result = buffer_sha512( buf_outerPad, 0, buffer_tell( buf_outerPad ) );
  
    buffer_delete( buf_key );
    buffer_delete( buf_innerPad );
    buffer_delete( buf_outerPad );
  
    return result;
}
I could find negligible difference between the processing of real literals whether they had a + operator or not (ie [360 + 3] vs [363]) so I left those as they were because there were a lot of them and I was lazy. These functions all work though, so have fun with secure hashes. So far, SHA512 has no known crack unlike the built in MD5 and SHA1 hash functions.
 
Last edited by a moderator:
Top