| 52 | * Calculate the MD5 of an array of little-endian words, and a bit length. |
| 53 | */ |
| 54 | function wordsToMd5(x: Uint32Array, len: number) { |
| 55 | /* append padding */ |
| 56 | const xpad = new Uint32Array(getOutputLength(len)).fill(0); |
| 57 | xpad.set(x); |
| 58 | xpad[len >> 5] |= 0x80 << (len % 32); |
| 59 | xpad[xpad.length - 1] = len; |
| 60 | x = xpad; |
| 61 | |
| 62 | let a = 1732584193; |
| 63 | let b = -271733879; |
| 64 | let c = -1732584194; |
| 65 | let d = 271733878; |
| 66 | |
| 67 | for (let i = 0; i < x.length; i += 16) { |
| 68 | const olda = a; |
| 69 | const oldb = b; |
| 70 | const oldc = c; |
| 71 | const oldd = d; |
| 72 | |
| 73 | a = md5ff(a, b, c, d, x[i], 7, -680876936); |
| 74 | d = md5ff(d, a, b, c, x[i + 1], 12, -389564586); |
| 75 | c = md5ff(c, d, a, b, x[i + 2], 17, 606105819); |
| 76 | b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330); |
| 77 | a = md5ff(a, b, c, d, x[i + 4], 7, -176418897); |
| 78 | d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426); |
| 79 | c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341); |
| 80 | b = md5ff(b, c, d, a, x[i + 7], 22, -45705983); |
| 81 | a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416); |
| 82 | d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417); |
| 83 | c = md5ff(c, d, a, b, x[i + 10], 17, -42063); |
| 84 | b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162); |
| 85 | a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682); |
| 86 | d = md5ff(d, a, b, c, x[i + 13], 12, -40341101); |
| 87 | c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290); |
| 88 | b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329); |
| 89 | |
| 90 | a = md5gg(a, b, c, d, x[i + 1], 5, -165796510); |
| 91 | d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632); |
| 92 | c = md5gg(c, d, a, b, x[i + 11], 14, 643717713); |
| 93 | b = md5gg(b, c, d, a, x[i], 20, -373897302); |
| 94 | a = md5gg(a, b, c, d, x[i + 5], 5, -701558691); |
| 95 | d = md5gg(d, a, b, c, x[i + 10], 9, 38016083); |
| 96 | c = md5gg(c, d, a, b, x[i + 15], 14, -660478335); |
| 97 | b = md5gg(b, c, d, a, x[i + 4], 20, -405537848); |
| 98 | a = md5gg(a, b, c, d, x[i + 9], 5, 568446438); |
| 99 | d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690); |
| 100 | c = md5gg(c, d, a, b, x[i + 3], 14, -187363961); |
| 101 | b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501); |
| 102 | a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467); |
| 103 | d = md5gg(d, a, b, c, x[i + 2], 9, -51403784); |
| 104 | c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473); |
| 105 | b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734); |
| 106 | |
| 107 | a = md5hh(a, b, c, d, x[i + 5], 4, -378558); |
| 108 | d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463); |
| 109 | c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562); |
| 110 | b = md5hh(b, c, d, a, x[i + 14], 23, -35309556); |
| 111 | a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060); |