|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 | /** * Javascript GOST R 34.11-94 hash function implementation. * Based on C-code by Alexei Kravchenko and Markku-Juhani Saarinen * and Utf8 class by Chris Veness. * * Usage: gosthash("<string>") returns a hash-string. * Alexander Okrugin (November, 11, 2011) */ var Utf8 = {}; // Utf8 namespace Utf8.encode = function (strUni) { // use regular expressions & String.replace callback function for better efficiency // than procedural approaches var strUtf = strUni.replace(/[\u0080-\u07ff]/g, // U+0080 - U+07FF => 2 bytes 110yyyyy, 10zzzzzz function (c) { var cc = c.charCodeAt(0); return String.fromCharCode(0xc0 | cc >> 6, 0x80 | cc & 0x3f); }); strUtf = strUtf.replace(/[\u0800-\uffff]/g, // U+0800 - U+FFFF => 3 bytes 1110xxxx, 10yyyyyy, 10zzzzzz function (c) { var cc = c.charCodeAt(0); return String.fromCharCode(0xe0 | cc >> 12, 0x80 | cc >> 6 & 0x3F, 0x80 | cc & 0x3f); }); return strUtf; } Utf8.decode = function (strUtf) { // note: decode 3-byte chars first as decoded 2-byte strings could appear to be 3-byte char! var strUni = strUtf.replace(/[\u00e0-\u00ef][\u0080-\u00bf][\u0080-\u00bf]/g, // 3-byte chars function (c) { // (note parentheses for precence) var cc = ((c.charCodeAt(0) & 0x0f) << 12) | ((c.charCodeAt(1) & 0x3f) << 6) | (c.charCodeAt(2) & 0x3f); return String.fromCharCode(cc); }); strUni = strUni.replace(/[\u00c0-\u00df][\u0080-\u00bf]/g, // 2-byte chars function (c) { // (note parentheses for precence) var cc = (c.charCodeAt(0) & 0x1f) << 6 | c.charCodeAt(1) & 0x3f; return String.fromCharCode(cc); }); return strUni; } function rol(word, n) { return ((word << (n & 0x1f)) | (word >>> (32 - (n & 0x1f)))); } function ch2hex(val) { var hext = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"]; return hext[(val >>> 4) & 15] + hext[val & 15]; } function str2bytes(str) { var arr = Array(str.length); for (var i = 0; i < str.length; ++i) arr[i] = str.charCodeAt(i) & 255; return arr; } var hash = new Array(8); var sum = new Array(8); var message = new Array(32); var length = 0, r = 0, l = 0; var gost_sbox = new Array(4); for (var j = 0; j < 4; j++) gost_sbox[j] = new Array(256); /* eight 4-bit S-Boxes as defined by RFC 4351 section 11.2 */ /** var sbox = [ [4, 10, 9, 2, 13, 8, 0, 14, 6, 11, 1, 12, 7, 15, 5, 3], [14, 11, 4, 12, 6, 13, 15, 10, 2, 3, 8, 1, 0, 7, 5, 9], [5, 8, 1, 13, 10, 3, 4, 2, 14, 15, 12, 7, 6, 0, 9, 11], [7, 13, 10, 1, 0, 8, 9, 15, 14, 4, 6, 12, 11, 2, 5, 3], [6, 12, 7, 1, 5, 15, 13, 8, 4, 10, 9, 14, 0, 3, 11, 2], [4, 11, 10, 0, 7, 2, 1, 13, 3, 6, 8, 5, 9, 12, 15, 14], [13, 11, 4, 1, 3, 15, 5, 9, 0, 10, 14, 7, 6, 8, 2, 12], [1, 15, 13, 0, 5, 7, 10, 4, 9, 2, 3, 14, 6, 11, 8, 12] ]; */ /** CryptoPro S-Box: */ var sbox = [ [10, 4, 5, 6, 8, 1, 3, 7, 13, 12, 14, 0, 9, 2, 11, 15], [5, 15, 4, 0, 2, 13, 11, 9, 1, 7, 6, 3, 12, 14, 10, 8], [7, 15, 12, 14, 9, 4, 1, 0, 3, 11, 5, 2, 6, 10, 8, 13], [4, 10, 7, 12, 0, 15, 2, 8, 14, 1, 6, 5, 13, 11, 9, 3], [7, 6, 4, 11, 9, 12, 2, 10, 1, 8, 0, 14, 15, 13, 3, 5], [7, 6, 2, 4, 13, 9, 15, 0, 10, 1, 5, 11, 8, 14, 12, 3], [13, 14, 4, 1, 7, 0, 5, 10, 3, 12, 8, 15, 6, 2, 9, 11], [1, 3, 10, 9, 5, 11, 4, 15, 8, 6, 7, 14, 13, 0, 2, 12] ]; /** * Initialize algorithm context before calculaing hash. */ function gost_init() { for (var i = 0; i < 8; i++) { hash[i] = 0; sum[i] = 0; message[4 * i] = 0; message[4 * i + 1] = 0; message[4 * i + 2] = 0; message[4 * i + 3] = 0; } length = 0; } /* * A full encryption round of GOST 28147-89. * Temporary variables tmp assumed and variables r and l for left and right * blocks. */ function GOST_ENCRYPT_ROUND(key1, key2) { var tmp = (key1) + r; l ^= gost_sbox[0][tmp & 0xff] ^ gost_sbox[1][(tmp >>> 8) & 0xff] ^ gost_sbox[2][(tmp >>> 16) & 0xff] ^ gost_sbox[3][(tmp >>> 24) & 0xff]; tmp = (key2) + l; r ^= gost_sbox[0][tmp & 0xff] ^ gost_sbox[1][(tmp >>> 8) & 0xff] ^ gost_sbox[2][(tmp >>> 16) & 0xff] ^ gost_sbox[3][(tmp >>> 24) & 0xff]; } /* encrypt a block with the given key */ function GOST_ENCRYPT(ii, key, varhash) { r = varhash[ii], l = varhash[ii + 1]; GOST_ENCRYPT_ROUND(key[0], key[1]); GOST_ENCRYPT_ROUND(key[2], key[3]); GOST_ENCRYPT_ROUND(key[4], key[5]); GOST_ENCRYPT_ROUND(key[6], key[7]); GOST_ENCRYPT_ROUND(key[0], key[1]); GOST_ENCRYPT_ROUND(key[2], key[3]); GOST_ENCRYPT_ROUND(key[4], key[5]); GOST_ENCRYPT_ROUND(key[6], key[7]); GOST_ENCRYPT_ROUND(key[0], key[1]); GOST_ENCRYPT_ROUND(key[2], key[3]); GOST_ENCRYPT_ROUND(key[4], key[5]); GOST_ENCRYPT_ROUND(key[6], key[7]); GOST_ENCRYPT_ROUND(key[7], key[6]); GOST_ENCRYPT_ROUND(key[5], key[4]); GOST_ENCRYPT_ROUND(key[3], key[2]); GOST_ENCRYPT_ROUND(key[1], key[0]); return [l, r]; } /** * The core transformation. Process a 512-bit block. * * @param block the message block to process */ function gost_block_compress(block) { var key = new Array(8); var u = new Array(8); var v = new Array(8); var w = new Array(8); var s = new Array(8); /* u := hash, v := <256-bit message block> */ for (var i = 0; i < 8; i++) { u[i] = hash[i]; v[i] = block[i]; } /* w := u xor v */ w[0] = u[0] ^ v[0]; w[1] = u[1] ^ v[1]; w[2] = u[2] ^ v[2]; w[3] = u[3] ^ v[3]; w[4] = u[4] ^ v[4]; w[5] = u[5] ^ v[5]; w[6] = u[6] ^ v[6]; w[7] = u[7] ^ v[7]; /* calculate keys, encrypt hash and store result to the s[] array */ for (var i = 0;; i += 2) { /* key generation: key_i := P(w) */ key[0] = (w[0] & 0x000000ff) | ((w[2] & 0x000000ff) << 8) | ((w[4] & 0x000000ff) << 16) | ((w[6] & 0x000000ff) << 24); key[1] = ((w[0] & 0x0000ff00) >>> 8) | (w[2] & 0x0000ff00) | ((w[4] & 0x0000ff00) << 8) | ((w[6] & 0x0000ff00) << 16); key[2] = ((w[0] & 0x00ff0000) >>> 16) | ((w[2] & 0x00ff0000) >>> 8) | (w[4] & 0x00ff0000) | ((w[6] & 0x00ff0000) << 8); key[3] = ((w[0] & 0xff000000) >>> 24) | ((w[2] & 0xff000000) >>> 16) | ((w[4] & 0xff000000) >>> 8) | (w[6] & 0xff000000); key[4] = (w[1] & 0x000000ff) | ((w[3] & 0x000000ff) << 8) | ((w[5] & 0x000000ff) << 16) | ((w[7] & 0x000000ff) << 24); key[5] = ((w[1] & 0x0000ff00) >>> 8) | (w[3] & 0x0000ff00) | ((w[5] & 0x0000ff00) << 8) | ((w[7] & 0x0000ff00) << 16); key[6] = ((w[1] & 0x00ff0000) >>> 16) | ((w[3] & 0x00ff0000) >>> 8) | (w[5] & 0x00ff0000) | ((w[7] & 0x00ff0000) << 8); key[7] = ((w[1] & 0xff000000) >>> 24) | ((w[3] & 0xff000000) >>> 16) | ((w[5] & 0xff000000) >>> 8) | (w[7] & 0xff000000); /* encryption: s_i := E_{key_i} (h_i) */ var res = GOST_ENCRYPT(i, key, hash); s[i] = res[0]; s[i + 1] = res[1]; if (i == 0) { /* w:= A(u) ^ A^2(v) */ w[0] = u[2] ^ v[4]; w[1] = u[3] ^ v[5]; w[2] = u[4] ^ v[6]; w[3] = u[5] ^ v[7]; w[4] = u[6] ^ (v[0] ^= v[2]); w[5] = u[7] ^ (v[1] ^= v[3]); w[6] = (u[0] ^= u[2]) ^ (v[2] ^= v[4]); w[7] = (u[1] ^= u[3]) ^ (v[3] ^= v[5]); } else if ((i & 2) != 0) { if (i == 6) break; /* w := A^2(u) xor A^4(v) xor C_3; u := A(u) xor C_3 */ /* C_3=0xff00ffff000000ffff0000ff00ffff0000ff00ff00ff00ffff00ff00ff00ff00 */ u[2] ^= u[4] ^ 0x000000ff; u[3] ^= u[5] ^ 0xff00ffff; u[4] ^= 0xff00ff00; u[5] ^= 0xff00ff00; u[6] ^= 0x00ff00ff; u[7] ^= 0x00ff00ff; u[0] ^= 0x00ffff00; u[1] ^= 0xff0000ff; w[0] = u[4] ^ v[0]; w[2] = u[6] ^ v[2]; w[4] = u[0] ^ (v[4] ^= v[6]); w[6] = u[2] ^ (v[6] ^= v[0]); w[1] = u[5] ^ v[1]; w[3] = u[7] ^ v[3]; w[5] = u[1] ^ (v[5] ^= v[7]); w[7] = u[3] ^ (v[7] ^= v[1]); } else { /* i==4 here */ /* w:= A( A^2(u) xor C_3 ) xor A^6(v) */ w[0] = u[6] ^ v[4]; w[1] = u[7] ^ v[5]; w[2] = u[0] ^ v[6]; w[3] = u[1] ^ v[7]; w[4] = u[2] ^ (v[0] ^= v[2]); w[5] = u[3] ^ (v[1] ^= v[3]); w[6] = (u[4] ^= u[6]) ^ (v[2] ^= v[4]); w[7] = (u[5] ^= u[7]) ^ (v[3] ^= v[5]); } } /* step hash function: x(block, hash) := psi^61(hash xor psi(block xor psi^12(S))) */ /* 12 rounds of the LFSR and xor in <message block> */ u[0] = block[0] ^ s[6]; u[1] = block[1] ^ s[7]; u[2] = block[2] ^ (s[0] << 16) ^ (s[0] >>> 16) ^ (s[0] & 0xffff) ^ (s[1] & 0xffff) ^ (s[1] >>> 16) ^ (s[2] << 16) ^ s[6] ^ (s[6] << 16) ^ (s[7] & 0xffff0000) ^ (s[7] >>> 16); u[3] = block[3] ^ (s[0] & 0xffff) ^ (s[0] << 16) ^ (s[1] & 0xffff) ^ (s[1] << 16) ^ (s[1] >>> 16) ^ (s[2] << 16) ^ (s[2] >>> 16) ^ (s[3] << 16) ^ s[6] ^ (s[6] << 16) ^ (s[6] >>> 16) ^ (s[7] & 0xffff) ^ (s[7] << 16) ^ (s[7] >>> 16); u[4] = block[4] ^ (s[0] & 0xffff0000) ^ (s[0] << 16) ^ (s[0] >>> 16) ^ (s[1] & 0xffff0000) ^ (s[1] >>> 16) ^ (s[2] << 16) ^ (s[2] >>> 16) ^ (s[3] << 16) ^ (s[3] >>> 16) ^ (s[4] << 16) ^ (s[6] << 16) ^ (s[6] >>> 16) ^ (s[7] & 0xffff) ^ (s[7] << 16) ^ (s[7] >>> 16); u[5] = block[5] ^ (s[0] << 16) ^ (s[0] >>> 16) ^ (s[0] & 0xffff0000) ^ (s[1] & 0xffff) ^ s[2] ^ (s[2] >>> 16) ^ (s[3] << 16) ^ (s[3] >>> 16) ^ (s[4] << 16) ^ (s[4] >>> 16) ^ (s[5] << 16) ^ (s[6] << 16) ^ (s[6] >>> 16) ^ (s[7] & 0xffff0000) ^ (s[7] << 16) ^ (s[7] >>> 16); u[6] = block[6] ^ s[0] ^ (s[1] >>> 16) ^ (s[2] << 16) ^ s[3] ^ (s[3] >>> 16) ^ (s[4] << 16) ^ (s[4] >>> 16) ^ (s[5] << 16) ^ (s[5] >>> 16) ^ s[6] ^ (s[6] << 16) ^ (s[6] >>> 16) ^ (s[7] << 16); u[7] = block[7] ^ (s[0] & 0xffff0000) ^ (s[0] << 16) ^ (s[1] & 0xffff) ^ (s[1] << 16) ^ (s[2] >>> 16) ^ (s[3] << 16) ^ s[4] ^ (s[4] >>> 16) ^ (s[5] << 16) ^ (s[5] >>> 16) ^ (s[6] >>> 16) ^ (s[7] & 0xffff) ^ (s[7] << 16) ^ (s[7] >>> 16); /* 1 round of the LFSR (a mixing transformation) and xor with <hash> */ v[0] = hash[0] ^ (u[1] << 16) ^ (u[0] >>> 16); v[1] = hash[1] ^ (u[2] << 16) ^ (u[1] >>> 16); v[2] = hash[2] ^ (u[3] << 16) ^ (u[2] >>> 16); v[3] = hash[3] ^ (u[4] << 16) ^ (u[3] >>> 16); v[4] = hash[4] ^ (u[5] << 16) ^ (u[4] >>> 16); v[5] = hash[5] ^ (u[6] << 16) ^ (u[5] >>> 16); v[6] = hash[6] ^ (u[7] << 16) ^ (u[6] >>> 16); v[7] = hash[7] ^ (u[0] & 0xffff0000) ^ (u[0] << 16) ^ (u[1] & 0xffff0000) ^ (u[1] << 16) ^ (u[6] << 16) ^ (u[7] & 0xffff0000) ^ (u[7] >>> 16); /* 61 rounds of LFSR, mixing up hash */ hash[0] = (v[0] & 0xffff0000) ^ (v[0] << 16) ^ (v[0] >>> 16) ^ (v[1] >>> 16) ^ (v[1] & 0xffff0000) ^ (v[2] << 16) ^ (v[3] >>> 16) ^ (v[4] << 16) ^ (v[5] >>> 16) ^ v[5] ^ (v[6] >>> 16) ^ (v[7] << 16) ^ (v[7] >>> 16) ^ (v[7] & 0xffff); hash[1] = (v[0] << 16) ^ (v[0] >>> 16) ^ (v[0] & 0xffff0000) ^ (v[1] & 0xffff) ^ v[2] ^ (v[2] >>> 16) ^ (v[3] << 16) ^ (v[4] >>> 16) ^ (v[5] << 16) ^ (v[6] << 16) ^ v[6] ^ (v[7] & 0xffff0000) ^ (v[7] >>> 16); hash[2] = (v[0] & 0xffff) ^ (v[0] << 16) ^ (v[1] << 16) ^ (v[1] >>> 16) ^ (v[1] & 0xffff0000) ^ (v[2] << 16) ^ (v[3] >>> 16) ^ v[3] ^ (v[4] << 16) ^ (v[5] >>> 16) ^ v[6] ^ (v[6] >>> 16) ^ (v[7] & 0xffff) ^ (v[7] << 16) ^ (v[7] >>> 16); hash[3] = (v[0] << 16) ^ (v[0] >>> 16) ^ (v[0] & 0xffff0000) ^ (v[1] & 0xffff0000) ^ (v[1] >>> 16) ^ (v[2] << 16) ^ (v[2] >>> 16) ^ v[2] ^ (v[3] << 16) ^ (v[4] >>> 16) ^ v[4] ^ (v[5] << 16) ^ (v[6] << 16) ^ (v[7] & 0xffff) ^ (v[7] >>> 16); hash[4] = (v[0] >>> 16) ^ (v[1] << 16) ^ v[1] ^ (v[2] >>> 16) ^ v[2] ^ (v[3] << 16) ^ (v[3] >>> 16) ^ v[3] ^ (v[4] << 16) ^ (v[5] >>> 16) ^ v[5] ^ (v[6] << 16) ^ (v[6] >>> 16) ^ (v[7] << 16); hash[5] = (v[0] << 16) ^ (v[0] & 0xffff0000) ^ (v[1] << 16) ^ (v[1] >>> 16) ^ (v[1] & 0xffff0000) ^ (v[2] << 16) ^ v[2] ^ (v[3] >>> 16) ^ v[3] ^ (v[4] << 16) ^ (v[4] >>> 16) ^ v[4] ^ (v[5] << 16) ^ (v[6] << 16) ^ (v[6] >>> 16) ^ v[6] ^ (v[7] << 16) ^ (v[7] >>> 16) ^ (v[7] & 0xffff0000); hash[6] = v[0] ^ v[2] ^ (v[2] >>> 16) ^ v[3] ^ (v[3] << 16) ^ v[4] ^ (v[4] >>> 16) ^ (v[5] << 16) ^ (v[5] >>> 16) ^ v[5] ^ (v[6] << 16) ^ (v[6] >>> 16) ^ v[6] ^ (v[7] << 16) ^ v[7]; hash[7] = v[0] ^ (v[0] >>> 16) ^ (v[1] << 16) ^ (v[1] >>> 16) ^ (v[2] << 16) ^ (v[3] >>> 16) ^ v[3] ^ (v[4] << 16) ^ v[4] ^ (v[5] >>> 16) ^ v[5] ^ (v[6] << 16) ^ (v[6] >>> 16) ^ (v[7] << 16) ^ v[7]; } /** * Update block sum and message hash. * * @param block the 256-bit message block to process */ function gost_compute_sum_and_hash(block) { /* compute the 256-bit sum */ var carry = 0; var hb = 0; for (var i = 0; i < 8; i++) { hb = (sum[i] >>> 24); sum[i] = (sum[i] & 0x00ffffff) + (block[i] & 0x00ffffff) + carry; hb = hb + (block[i] >>> 24) + (sum[i] >>> 24); sum[i] = (sum[i] & 0x00ffffff) | ((hb & 0xff) << 24); carry = ((hb & 0x100) != 0 ? 1 : 0); } /* update message hash */ gost_block_compress(block); } /** * Calculate message hash. * Can be called repeatedly with chunks of the message to be hashed. * * @param _msg message chunk * @param _size length of the message chunk */ function gost_update(_msg, _size) { var index = length & 31; var msg = _msg, pmsg = 0; var size = _size; var msg32 = new Array(8); length += size; /* fill partial block */ if (index != 0) { left = 32 - index; if (size < left) { for (var i = 0; i < size; i++) message[index + i] = msg[i]; return; } else for (var i = 0; i < left; i++) message[index + i] = msg[i]; /* process partitial block */ for (var i = 0; i < 8; i++) msg32[i] = ((message[4 * i] & 0xff)) | ((message[4 * i + 1] & 0xff) << 8) | ((message[4 * i + 2] & 0xff) << 16) | ((message[4 * i + 3] & 0xff) << 24); gost_compute_sum_and_hash(msg32); pmsg += left; size -= left; } while (size >= 32) { for (var i = 0; i < 8; i++) { message[4 * i] = msg[pmsg + 4 * i]; message[4 * i + 1] = msg[pmsg + 4 * i + 1]; message[4 * i + 2] = msg[pmsg + 4 * i + 2]; message[4 * i + 3] = msg[pmsg + 4 * i + 3]; msg32[i] = ((message[4 * i] & 0xff)) | ((message[4 * i + 1] & 0xff) << 8) | ((message[4 * i + 2] & 0xff) << 16) | ((message[4 * i + 3] & 0xff) << 24); } gost_compute_sum_and_hash(msg32); pmsg += 32; size -= 32; } if (size != 0) { for (var i = 0; i < size; i++) { message[i] = msg[pmsg + i]; } } } /** * Finish hashing and store message digest into given array. * * @param result calculated hash in binary form */ function gost_final() { var index = length & 31; var msg32 = new Array(8); /* pad the last block with zeroes and hash it */ if (index > 0) { for (var i = 0; i < 32 - index; i++) { message[index + i] = 0; } for (var i = 0; i < 8; i++) { msg32[i] = ((message[4 * i] & 0xff)) | ((message[4 * i + 1] & 0xff) << 8) | ((message[4 * i + 2] & 0xff) << 16) | ((message[4 * i + 3] & 0xff) << 24); } gost_compute_sum_and_hash(msg32); } /* hash the message length and the sum */ msg32[0] = (length << 3); msg32[1] = (length >>> 29); for (var i = 2; i < 8; i++) { msg32[i] = 0; } gost_block_compress(msg32); gost_block_compress(sum); } /* initialize the lookup tables */ function gost_init_table() { var ax, bx, cx, dx; for (var i = 0, a = 0; a < 16; a++) { ax = sbox[1][a] << 15; bx = sbox[3][a] << 23; cx = rol(sbox[5][a], 31); dx = sbox[7][a] << 7; for (var b = 0; b < 16; b++, i++) { gost_sbox[0][i] = ax | (sbox[0][b] << 11); gost_sbox[1][i] = bx | (sbox[2][b] << 19); gost_sbox[2][i] = cx | (sbox[4][b] << 27); gost_sbox[3][i] = dx | (sbox[6][b] << 3); } } } function gosthash(v) { var rx = new Array(8); var x = str2bytes(Utf8.encode(v)); gost_init(); gost_init_table(); gost_update(x, x.length); gost_final(); for (var i = 0; i < 8; i++) rx[i] = ch2hex(hash[i] & 0xff) + ch2hex((hash[i] >>> 8) & 0xff) + ch2hex((hash[i] >>> 16) & 0xff) + ch2hex((hash[i] >>> 24) & 0xff); return (rx.join("")); } print(gosthash(readline())); // output it while(str = readline()) { print(gosthash(str)); } |
-
upload with new input
-
result: Success time: 0.02s memory: 5120 kB returned value: 0
This is message, length=32 bytes
2cefc2f7b7bdc514e18ea57fa74ff357e7fa17d652c75f69cb1be7893ede48eb
-
result: Success time: 0.02s memory: 5120 kB returned value: 0
abc
981e5f3ca30c841487830f84fb433e13ac1101569b9c13584ac483234cd656c0 b285056dbf18d7392d7677369524dd14747459ed8143997e163b2986f92fd42c
-
result: Success time: 0.03s memory: 5256 kB returned value: 0
a abc
981e5f3ca30c841487830f84fb433e13ac1101569b9c13584ac483234cd656c0 e74c52dd282183bf37af0079c9f78055715a103f17e3133ceff1aacf2f403011 cb3216bb8ebb385424a0dd313c9e9abee98a84609180951d66359e38be562d82
-
result: Success time: 0.02s memory: 5076 kB returned value: 0
981e5f3ca30c841487830f84fb433e13ac1101569b9c13584ac483234cd656c0
-
result: Success time: 0.02s memory: 5076 kB returned value: 0
a
981e5f3ca30c841487830f84fb433e13ac1101569b9c13584ac483234cd656c0
-
result: Success time: 0.02s memory: 5076 kB returned value: 0
abc
cb3216bb8ebb385424a0dd313c9e9abee98a84609180951d66359e38be562d82
-
result: Success time: 0.02s memory: 5076 kB returned value: 0
a
981e5f3ca30c841487830f84fb433e13ac1101569b9c13584ac483234cd656c0
-
result: Success time: 0.02s memory: 5120 kB returned value: 0
а
6f5011705afd33e9a31b81fa2d0767cfbfeccdd8467b380bda82073aca326464
-
result: Success time: 0.02s memory: 5076 kB returned value: 0
ВАГИНДМИТРИИВЛАДИСЛАВОВИЧ16041983
eef67fbb8e7c37ae51982d741c2fc621ee3cfa5cb3c992b7e996d7766d8166e0
-
result: Success time: 0.02s memory: 5120 kB returned value: 0
ВАГИНДМИТРИИВЛАДИМИРОВИЧ16041983
2bff5f3950f2efa40379305723f914996becb4d290105d451e6416012df92fe9
-
result: Success time: 0.02s memory: 5076 kB returned value: 0
ОБЬЕДКИНАЕЖЕЧКИНААННАМАРИЯВАИДАСАРЕНОВНА31121960
e5659d7544f0c3d7e4feaa5e33f27b6b2a3e3655b57d4aed83585f7022b36ad4
-
result: Success time: 0.03s memory: 5120 kB returned value: 0
ВАГИНДМИТРИЙВЛАДИМИРОВИЧ16041983
70a90dd44db43068b0410b183538db31964b0122ce3528421cc4640b24efa867
-
result: Success time: 0.02s memory: 5120 kB returned value: 0
123sdfasыва
8572c4774913ea24557e6dd878a12916eefc9e939b92676521d0796940262015
-
result: Success time: 0.02s memory: 5120 kB returned value: 0
MOLDASIGINSZAO
69806a05eaba0cbb9372c28079abdad1217a96e4c9816b09cd8bbd6f143fd2ac
-
result: Success time: 0.02s memory: 5076 kB returned value: 0
ZAOMOLDASIGINS
82e0598e8e1b4b1eaec65e0b0b51a6727a6b09939d99cdca2ede967468fa4a10
-
result: Success time: 0.02s memory: 5120 kB returned value: 0
ВЕЛИКИИИГОРЬЕВГЕНЬЕВИЧ05091972
73e9c0a467929d8ac75d9b8915440b98e304fbbab80e3bcce915a0d516e83ed3
-
result: Success time: 0.02s memory: 5076 kB returned value: 0
ZAOANAKONDA
493f19b766667ef62c954986aef1407ccd9531208b9d0b6818241890b7bb05cc
-
result: Success time: 0.03s memory: 5120 kB returned value: 0
ОБЩЕСТВОСОГРАНИЧЕННОИОТВЕТСТВЕННОСТЬЮСТРАХОВАЯКОМПАНИЯГЕЛИОС
2ddcbb8e37b45b09046b3f811a29f33b240befb250e5dac398515c950794c242
-
result: Success time: 0.02s memory: 5120 kB returned value: 0
ОБЩЕСТВОСОГРАНИЧЕННОИОТВЕТСТВЕННОСТЬЮСТРАХОВАЯКОМПАНИЮГЕЛИОС
c06e68b7cb87282aeedc80b6afa43c36d8c7ea42f03c26d37d0d6bf60e5b1730
-
result: Success time: 0.02s memory: 5120 kB returned value: 0
ВЕЛИКИИИГОРЬЕВГЕНЬЕВИЧ05091972
73e9c0a467929d8ac75d9b8915440b98e304fbbab80e3bcce915a0d516e83ed3
-
result: Success time: 0.03s memory: 5520 kB returned value: 0
a abc message digest ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 12345678901234567890123456789012345678901234567890123456789012345678901234567890 This is message, length=32 bytes Suppose the original message has length = 50 bytes UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU The quick brown fox jumps over the lazy dog The quick brown fox jumps over the lazy cog
981e5f3ca30c841487830f84fb433e13ac1101569b9c13584ac483234cd656c0 e74c52dd282183bf37af0079c9f78055715a103f17e3133ceff1aacf2f403011 b285056dbf18d7392d7677369524dd14747459ed8143997e163b2986f92fd42c bc6041dd2aa401ebfa6e9886734174febdb4729aa972d60f549ac39b29721ba0 73b70a39497de53a6e08c67b6d4db853540f03e9389299d9b0156ef7e85d0f61 6bc7b38989b28cf93ae8842bf9d752905910a7528a61e5bce0782de43e610c90 2cefc2f7b7bdc514e18ea57fa74ff357e7fa17d652c75f69cb1be7893ede48eb c3730c5cbccacf915ac292676f21e8bd4ef75331d9405e5f1a61dc3130a65011 1c4ac7614691bbf427fa2316216be8f10d92edfd37cd1027514c1008f649c4e8 9004294a361a508c586fe53d1f1b02746765e71b765472786e4770d565830a76 a93124f5bf2c6d83c3bbf722bc55569310245ca5957541f4dbd7dfaf8137e6f2


