|
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 411 | /** * 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
test
8c62e2ad1cda54385b36853d023beb9677eb843afb0b6a95197bb921461aa09e
-
result: Success time: 0.02s memory: 5120 kB returned value: 0
1
ce85b99cc46752fffee35cab9a7b0278abb4c2d2055cff685af4912c49490f8d
-
result: Success time: 0.02s memory: 5120 kB returned value: 0
six
c48e702625d11ff2230bfe362cc2700d3d32e3af56090b54586af393b0037a66
-
result: Success time: 0.02s memory: 5120 kB returned value: 0
six
c48e702625d11ff2230bfe362cc2700d3d32e3af56090b54586af393b0037a66
-
result: Success time: 0.04s memory: 5388 kB returned value: 0
message digest тест "The quick brown fox jumps over the lazy dog" The quick brown fox jumps over the lazy dog 123123123123 тестовое сообщение #8..#11 etc -- what? why so? a
ad4434ecb18f2c99b60cbe59ec3d2469582b65273f48de72db2fde16a4889a4d 8efcbde0262732266efce1faaca98628bce37680f21205dfe50c4c5228dd627e b2c84ae4df8ae64dc6a878df14b56be8fc630dbd56c39bab921e842170088637 77b7fa410c9ac58a25f49bca7d0468c9296529315eaca76bd1a10f376d1f4294 e4c99935f7dc2130fab8a3b136e51a09d901f080df8d43049c8766c8bab7aa39 fa8acc23edd89d8334aa240902921c51e1f660a397ec01bfa54d71998699a18e 5868189b2c290f01b4a6310fb303dfca48ddb0ed686e11438df67152a92abbc6 d42c539e367c66e9c88a801f6649349c21871b4344c6a573f849fdce62f314dd
-
result: Success time: 0.02s memory: 5120 kB returned value: 0
a message digest тест "The quick brown fox jumps over the lazy dog" The quick brown fox jumps over the lazy dog 123123123123 тестовое сообщение #8..#11 etc -- what? why so?
d42c539e367c66e9c88a801f6649349c21871b4344c6a573f849fdce62f314dd
-
result: Success time: 0.03s memory: 5252 kB returned value: 0
The quick brown fox jumps over the lazy dog The quick brown fox jumps over the lazy dog The quick brown fox jumps over the lazy dog Гм... Хм...
77b7fa410c9ac58a25f49bca7d0468c9296529315eaca76bd1a10f376d1f4294 77b7fa410c9ac58a25f49bca7d0468c9296529315eaca76bd1a10f376d1f4294 16ae426f1fcc67ea64132a1655c02844b0f78f6a8962abf422074a81b516aed6 758e46ea09c913423fc2df038b22385835624af6073672f32cbe54066f505c44 39aab69864c816661609a2926bcecc4074c587317607c6703a8cc1606ee04808
-
result: Success time: 0.02s memory: 5120 kB returned value: 0
тестовое сообщение
fa8acc23edd89d8334aa240902921c51e1f660a397ec01bfa54d71998699a18e
-
result: Success time: 0.02s memory: 5120 kB returned value: 0
123123123123
554c6f14def3dcbcc5defbfe19f9bb236a4da3482e52e4db178fde762502bf0d
-
result: Success time: 0.03s memory: 5120 kB returned value: 0
The quick brown fox jumps over the lazy dog
e5cc9b9a625f73673d6f384307b7e47ddd9f42d68357512ed027b38191e10dd0
-
result: Success time: 0.02s memory: 5120 kB returned value: 0
"The quick brown fox jumps over the lazy dog"
516098580a03f9df30730f5b79efbcd7048d839146730955ca82d05a0444f2de
-
result: Success time: 0.02s memory: 5120 kB returned value: 0
тест
434124d757720b8757ac730b2f126da6557709738fee33047866f6b9d3f18674
-
result: Success time: 0.02s memory: 5120 kB returned value: 0
a
ce85b99cc46752fffee35cab9a7b0278abb4c2d2055cff685af4912c49490f8d
-
result: Success time: 0.02s memory: 5120 kB returned value: 0
message digest
71f9250748697d3b188abf46d01f2f3f7fe3acfe4a177203e4df42f468f54a88
-
result: Success time: 0.02s memory: 5120 kB returned value: 0
ce85b99cc46752fffee35cab9a7b0278abb4c2d2055cff685af4912c49490f8d
-
result: Success time: 0.02s memory: 5120 kB returned value: 0
The quick brown fox jumps over the lazy dog
e5cc9b9a625f73673d6f384307b7e47ddd9f42d68357512ed027b38191e10dd0
-
result: Success time: 0.02s memory: 5120 kB returned value: 0
1303
c3f281c8fd3d16d0826299670d41661d591e196ba1456af197974345adc8531c
-
result: Success time: 0.05s memory: 5640 kB returned value: 0
<SOAP-ENV:Body wsu:Id="body"><SendFullULRequest xmlns="http://ws.unisoft/"> <smev:Message xmlns:smev="http://smev.gosuslugi.ru/rev110801"><smev:Sender><smev:Code>13242</smev:Code><smev:Name>MINSVYAZ_SYS_1</smev:Name></smev:Sender><smev:Recipient><smev:Code>13312</smev:Code><smev:Name>NALOG_SYS_1</smev:Name></smev:Recipient><smev:Originator><smev:Code>originator_code</smev:Code><smev:Name>ПГУ</smev:Name></smev:Originator><smev:TypeCode>5</smev:TypeCode><smev:Date>2011-08-17T09:30:47Z</smev:Date></smev:Message><smev:MessageData xmlns:smev="http://smev.gosuslugi.ru/rev110801"><smev:AppData wsu:Id="fns-AppData"><Документ xmlns="http://ws.unisoft/EGRNXX/FullULReq" ВерсФорм="4.01" ИдДок="fef858cb-ad4f-45dc-a7e1-6816e3bcb1d4" НомерДела="55"> <СвЮЛ ИННЮЛ="1234567890" НаимЮЛ="Организация" ОГРН="1234567890123" ОКОГУ="14003"/> <ЗапросЮЛ> <ОГРН>1023302752021</ОГРН> </ЗапросЮЛ> </Документ></smev:AppData></smev:MessageData></SendFullULRequest></SOAP-ENV:Body>
32a657907395790a60399f516fcf9dc2eaaa77b51f217670f2da3c43a27cd473 754ced9e5f9b14c43d0f43ee207edd6ec3936c444fdbfa31e95e7d1b6a206f6e 277906966cb4942b5f2f06e822727af3565df15a4c2b0c6b8a52f4f3bca46733 bf960b5e8386aee149a52e1fa883609fc6036355ddbbefa99a2bceabb3e13792 b169cd61ff2edbcbfb8563008a0668048f8456f80dad5ae7c2d78dfee862482b 295eb7d34f1c44f6693e95a3624d88929df0460fddb8fb5cbcbf1655d256eee5 8f4f1b2f85920c891a36e0b2031fefecae7b117400506fd1bb1bb0ebb325939d 49ebe0678ba3c935e338da58c7831ec1b481003c3797f9fd3b02d45548651ff6
-
result: Success time: 0.02s memory: 5120 kB returned value: 0
4556564
208175a9ccec9e53261fd11fa228063404f0bcd3003398b23308e017f1a8a3e1
-
result: Success time: 0.02s memory: 5120 kB returned value: 0
a
ce85b99cc46752fffee35cab9a7b0278abb4c2d2055cff685af4912c49490f8d
-
result: Success time: 0.02s memory: 5120 kB returned value: 0
The length is equal to 64 symbols in ascii codepage on my mind..
32ed21134e173f89d235689e4f3a62a1b8bf2e462bdd0322f8284ae259499bb7
-
result: Success time: 0.02s memory: 5388 kB returned value: 0
http://ideone.com/QNhxW http://ideone.com/LYNnw http://ideone.com/Jbvm8 QNhxW LYNnw Jbvm8 http://ideone.com/ http://ideone.com ideone.com
7d74b6b6ccae709ae5d029d6d55d5ebf85d1de8aed6387b5e3fd6ca9ba7b26e3 5d884a3169e7d4b18d3ef84085513866a1005ec47d715a3bc83c6635c81ea936 36a470940eee288a915b624579c001289d2a8f6f34ffd0a3d576ec1a1d79b7bc eef90687b7691cdec3a90820544a109d1aa91264b86a8b0cc0c6e8d5a3dbccda a65287f5ccb9ee1b08ac5882406a75d135beb80e8ce394cb438043c95f0b766b 3acff431baf8e563cc5ec9278118450af9129555ada0b36dc7fb6d180b4e2fd1 b269946e1014ed490cbc2c55c21a7358f9c21ad2829a65a684e32eed31468884 54c98e062d760ccde0cf62d53c31e7a1130dbbcbd34b80659e4acbe22282c63b 5212ca913fe08153096c5a539a56d1b28620bee37d8bc6007902a035d96225fc
-
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
ce85b99cc46752fffee35cab9a7b0278abb4c2d2055cff685af4912c49490f8d d42c539e367c66e9c88a801f6649349c21871b4344c6a573f849fdce62f314dd f3134348c44fb1b2a277729e2285ebb5cb5e0f29c975bc753b70497c06a4d51d ad4434ecb18f2c99b60cbe59ec3d2469582b65273f48de72db2fde16a4889a4d 95c1af627c356496d80274330b2cff6a10c67b5f597087202f94d06d2338cf8e cc178dcad4df619dcaa00aac79ca355c00144e4ada2793d7bd9b3518ead3ccd3 b1c466d37519b82e8319819ff32595e047a28cb6f83eff1c6916a815a637fffa 471aba57a60a770d3a76130635c1fbea4ef14de51f78b4ae57dd893b62f55208 53a3a3ed25180cef0c1d85a074273e551c25660a87062a52d926a9e8fe5733a4 77b7fa410c9ac58a25f49bca7d0468c9296529315eaca76bd1a10f376d1f4294 a3ebc4daaab78b0be131dab5737a7f67e602670d543521319150d2e14eeec445



