UNPKG

@syncfusion/ej2-pdf

Version:

Feature-rich JavaScript PDF library with built-in support for loading and manipulating PDF document.

340 lines (339 loc) 13 kB
import { _PdfNativeHashInput } from '../digital-signature/signature/pdf-accumulator'; /** * Message digest implementation used internally for signature evaluation. * * @private */ var _RaceEvaluationMessageDigest = /** @class */ (function () { function _RaceEvaluationMessageDigest() { /** * Internal 64-byte block buffer. */ this._block = new Uint8Array(64); /** * Internal state word A. */ this._a = 0x67452301; /** * Internal state word B. */ this._b = 0xefcdab89; /** * Internal state word C. */ this._c = 0x98badcfe; /** * Internal state word D. */ this._d = 0x10325476; /** * Internal state word E. */ this._e = 0xc3d2e1f0; } /** * Create a chunked conversion sink for incremental hashing. * * @private * @param {_PdfNativeAccumulatorSink} outputSink - Sink to receive accumulator output. * @returns {_PdfNativeHashInput} A `_PdfNativeHashInput` for chunked input. */ _RaceEvaluationMessageDigest.prototype._startChunkedConversion = function (outputSink) { return new _PdfNativeHashInput(this, outputSink); }; /** * Rotate a 32-bit value left by `n` bits. * * @private * @param {number} x - Value to rotate. * @param {number} n - Number of bits to rotate. * @returns {number} The rotated value. */ _RaceEvaluationMessageDigest.prototype._rotateLeft = function (x, n) { return (x << n) | (x >>> (32 - n)); }; /** * Round function 1 used internally by the digest. * * @private * @param {number} a - Working state `a`. * @param {number} b - Working state `b`. * @param {number} c - Working state `c`. * @param {number} d - Working state `d`. * @param {number} e - Working state `e`. * @param {number} m - Message word. * @param {number} k - Round constant. * @param {number} s - Left-rotation amount. * @returns {number} Updated accumulator value. */ _RaceEvaluationMessageDigest.prototype._fn1 = function (a, b, c, d, e, m, k, s) { return (this._rotateLeft((a + (b ^ c ^ d) + m + k) | 0, s) + e) | 0; }; /** * Round function 2 used internally by the digest. * * @private * @param {number} a - Working state `a`. * @param {number} b - Working state `b`. * @param {number} c - Working state `c`. * @param {number} d - Working state `d`. * @param {number} e - Working state `e`. * @param {number} m - Message word. * @param {number} k - Round constant. * @param {number} s - Left-rotation amount. * @returns {number} Updated accumulator value. */ _RaceEvaluationMessageDigest.prototype._fn2 = function (a, b, c, d, e, m, k, s) { return (this._rotateLeft((a + ((b & c) | ((~b) & d)) + m + k) | 0, s) + e) | 0; }; /** * Round function 3 used internally by the digest. * * @private * @param {number} a - Working state `a`. * @param {number} b - Working state `b`. * @param {number} c - Working state `c`. * @param {number} d - Working state `d`. * @param {number} e - Working state `e`. * @param {number} m - Message word. * @param {number} k - Round constant. * @param {number} s - Left-rotation amount. * @returns {number} Updated accumulator value. */ _RaceEvaluationMessageDigest.prototype._fn3 = function (a, b, c, d, e, m, k, s) { return (this._rotateLeft((a + ((b | (~c)) ^ d) + m + k) | 0, s) + e) | 0; }; /** * Round function 4 used internally by the digest. * * @private * @param {number} a - Working state `a`. * @param {number} b - Working state `b`. * @param {number} c - Working state `c`. * @param {number} d - Working state `d`. * @param {number} e - Working state `e`. * @param {number} m - Message word. * @param {number} k - Round constant. * @param {number} s - Left-rotation amount. * @returns {number} Updated accumulator value. */ _RaceEvaluationMessageDigest.prototype._fn4 = function (a, b, c, d, e, m, k, s) { return (this._rotateLeft((a + ((b & d) | (c & (~d))) + m + k) | 0, s) + e) | 0; }; /** * Round function 5 used internally by the digest. * * @private * @param {number} a - Working state `a`. * @param {number} b - Working state `b`. * @param {number} c - Working state `c`. * @param {number} d - Working state `d`. * @param {number} e - Working state `e`. * @param {number} m - Message word. * @param {number} k - Round constant. * @param {number} s - Left-rotation amount. * @returns {number} Updated accumulator value. */ _RaceEvaluationMessageDigest.prototype._fn5 = function (a, b, c, d, e, m, k, s) { return (this._rotateLeft((a + (b ^ (c | (~d))) + m + k) | 0, s) + e) | 0; }; /** * Read a 32-bit little-endian integer from the buffer. * * @private * @param {Uint8Array} buffer - Source buffer. * @param {number} offset - Offset into buffer (in bytes). * @returns {number} The 32-bit signed integer. */ _RaceEvaluationMessageDigest.prototype._readInt32LE = function (buffer, offset) { offset >>>= 0; return (buffer[offset]) | (buffer[offset + 1] << 8) | (buffer[offset + 2] << 16) | (buffer[offset + 3] << 24); }; /** * Write an unsigned 32-bit little-endian integer to the buffer. * * @private * @param {Uint8Array} buffer - Destination buffer. * @param {number} value - Value to write. * @param {number} offset - Offset into buffer (in bytes). * @returns {number} The new offset (offset + 4). */ _RaceEvaluationMessageDigest.prototype._writeUInt32LE = function (buffer, value, offset) { value = +value; offset >>>= 0; buffer[offset + 3] = (value >>> 24); buffer[offset + 2] = (value >>> 16); buffer[offset + 1] = (value >>> 8); buffer[offset] = (value & 0xff); return offset + 4; }; /** * Write a signed 32-bit little-endian integer to the buffer. * * @private * @param {Uint8Array} buffer - Destination buffer. * @param {number} value - Value to write. * @param {number} offset - Offset into buffer (in bytes). * @returns {number} The new offset (offset + 4). */ _RaceEvaluationMessageDigest.prototype._writeInt32LE = function (buffer, value, offset) { value = +value; offset >>>= 0; buffer[offset] = (value & 0xff); buffer[offset + 1] = (value >>> 8); buffer[offset + 2] = (value >>> 16); buffer[offset + 3] = (value >>> 24); return offset + 4; }; /** * Process the current 64-byte block and update internal state. * * @private * @returns {void} */ _RaceEvaluationMessageDigest.prototype._update = function () { var _zl = new Uint8Array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13 ]); var _zr = new Uint8Array([ 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11 ]); var _sl = new Uint8Array([ 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 ]); var _sr = new Uint8Array([ 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 ]); var _hl = new Uint32Array([0x00000000, 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xa953fd4e]); var _hr = new Uint32Array([0x50a28be6, 0x5c4dd124, 0x6d703ef3, 0x7a6d76e9, 0x00000000]); var words = new Array(16); // eslint-disable-line for (var j = 0; j < 16; ++j) { words[j] = this._readInt32LE(this._block, j * 4); } var al = this._a | 0; var bl = this._b | 0; var cl = this._c | 0; var dl = this._d | 0; var el = this._e | 0; var ar = this._a | 0; var br = this._b | 0; var cr = this._c | 0; var dr = this._d | 0; var er = this._e | 0; for (var i = 0; i < 80; i += 1) { var tl = void 0; var tr = void 0; if (i < 16) { tl = this._fn1(al, bl, cl, dl, el, words[_zl[i]], _hl[0], _sl[i]); tr = this._fn5(ar, br, cr, dr, er, words[_zr[i]], _hr[0], _sr[i]); } else if (i < 32) { tl = this._fn2(al, bl, cl, dl, el, words[_zl[i]], _hl[1], _sl[i]); tr = this._fn4(ar, br, cr, dr, er, words[_zr[i]], _hr[1], _sr[i]); } else if (i < 48) { tl = this._fn3(al, bl, cl, dl, el, words[_zl[i]], _hl[2], _sl[i]); tr = this._fn3(ar, br, cr, dr, er, words[_zr[i]], _hr[2], _sr[i]); } else if (i < 64) { tl = this._fn4(al, bl, cl, dl, el, words[_zl[i]], _hl[3], _sl[i]); tr = this._fn2(ar, br, cr, dr, er, words[_zr[i]], _hr[3], _sr[i]); } else { tl = this._fn5(al, bl, cl, dl, el, words[_zl[i]], _hl[4], _sl[i]); tr = this._fn1(ar, br, cr, dr, er, words[_zr[i]], _hr[4], _sr[i]); } al = el; el = dl; dl = this._rotateLeft(cl, 10); cl = bl; bl = tl; ar = er; er = dr; dr = this._rotateLeft(cr, 10); cr = br; br = tr; } var t = (this._b + cl + dr) | 0; this._b = (this._c + dl + er) | 0; this._c = (this._d + el + ar) | 0; this._d = (this._e + al + br) | 0; this._e = (this._a + bl + cr) | 0; this._a = t; }; /** * Compute the message digest over the given input bytes. * * @private * @param {Uint8Array} data - Input bytes. * @param {number} offset - Start offset in `data`. * @param {number} length - End offset (exclusive) in `data`. * @returns {Uint8Array} The 20-byte digest as `Uint8Array`. */ _RaceEvaluationMessageDigest.prototype._hash = function (data, offset, length) { var _blockSize = 64; var _blockOffset = 0; var _length = [0, 0, 0, 0]; var block = this._block; while (_blockOffset + length - offset >= _blockSize) { for (var i = _blockOffset; i < _blockSize;) { block[i++] = data[offset++]; } this._update(); _blockOffset = 0; } while (offset < length) { block[_blockOffset++] = data[offset++]; } for (var j = 0, carry = length * 8; carry > 0; ++j) { _length[j] += carry; carry = (_length[j] / 0x0100000000) | 0; if (carry > 0) { _length[j] -= 0x0100000000 * carry; } } this._block[_blockOffset++] = 0x80; if (_blockOffset > 56) { this._block.fill(0, _blockOffset, 64); this._update(); _blockOffset = 0; } this._block.fill(0, _blockOffset, 56); this._writeUInt32LE(this._block, _length[0], 56); this._writeUInt32LE(this._block, _length[1], 60); this._update(); var buffer = new Uint8Array(20); this._writeInt32LE(buffer, this._a, 0); this._writeInt32LE(buffer, this._b, 4); this._writeInt32LE(buffer, this._c, 8); this._writeInt32LE(buffer, this._d, 12); this._writeInt32LE(buffer, this._e, 16); this._block.fill(0); _blockOffset = 0; for (var i = 0; i < 4; ++i) { _length[i] = 0; } return buffer; }; return _RaceEvaluationMessageDigest; }()); export { _RaceEvaluationMessageDigest };