@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
JavaScript
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 };