UNPKG

@syncfusion/ej2-pdf

Version:

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

115 lines (114 loc) 4.14 kB
import { _PdfNativeHashInput } from '../digital-signature/signature/pdf-accumulator'; /** * SHA-1 hash implementation used internally for PDF cryptography. * * @private */ var _Sha1 = /** @class */ (function () { function _Sha1() { } /** * Create a chunked conversion sink for incremental hashing. * * @private * @param {_PdfNativeAccumulatorSink} outputSink - Sink that will receive the hash output. * @returns {_PdfNativeHashInput} A `_PdfNativeHashInput` for feeding chunks. */ _Sha1.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. * @returns {number} The rotated value. */ _Sha1.prototype._rotateLeft = function (x, n) { return (x << n) | (x >>> (32 - n)); }; /** * Compute the SHA-1 hash for a slice of bytes. * * @private * @param {Uint8Array} data - Input bytes. * @param {number} offset - Start offset into `data`. * @param {number} length - Number of bytes to hash. * @returns {Uint8Array} The 20-byte SHA-1 digest as `Uint8Array`. */ _Sha1.prototype._hash = function (data, offset, length) { var paddedLength = ((length + 9 + 63) >> 6) << 6; var padded = new Uint8Array(paddedLength); var i = 0; for (; i < length; ++i) { padded[i] = data[offset++]; } padded[i++] = 0x80; var bitLength = length * 8; padded[paddedLength - 4] = (bitLength >>> 24) & 0xff; padded[paddedLength - 3] = (bitLength >>> 16) & 0xff; padded[paddedLength - 2] = (bitLength >>> 8) & 0xff; padded[paddedLength - 1] = bitLength & 0xff; var h0 = 0x67452301; var h1 = 0xefcdab89; var h2 = 0x98badcfe; var h3 = 0x10325476; var h4 = 0xc3d2e1f0; var w = new Uint32Array(80); for (var j = 0; j < paddedLength; j += 64) { for (var k = 0; k < 16; ++k) { var idx = j + k * 4; w[k] = (padded[idx] << 24) | (padded[idx + 1] << 16) | (padded[idx + 2] << 8) | padded[idx + 3]; } for (var k = 16; k < 80; ++k) { w[k] = this._rotateLeft(w[k - 3] ^ w[k - 8] ^ w[k - 14] ^ w[k - 16], 1); } var a = h0; var b = h1; var c = h2; var d = h3; var e = h4; for (var k = 0; k < 80; ++k) { var f = void 0; var kConst = void 0; if (k < 20) { f = (b & c) | (~b & d); kConst = 0x5a827999; } else if (k < 40) { f = b ^ c ^ d; kConst = 0x6ed9eba1; } else if (k < 60) { f = (b & c) | (b & d) | (c & d); kConst = 0x8f1bbcdc; } else { f = b ^ c ^ d; kConst = 0xca62c1d6; } var temp = (this._rotateLeft(a, 5) + f + e + kConst + w[k]) >>> 0; e = d; d = c; c = this._rotateLeft(b, 30); b = a; a = temp; } h0 = (h0 + a) >>> 0; h1 = (h1 + b) >>> 0; h2 = (h2 + c) >>> 0; h3 = (h3 + d) >>> 0; h4 = (h4 + e) >>> 0; } return new Uint8Array([ (h0 >>> 24) & 0xff, (h0 >>> 16) & 0xff, (h0 >>> 8) & 0xff, h0 & 0xff, (h1 >>> 24) & 0xff, (h1 >>> 16) & 0xff, (h1 >>> 8) & 0xff, h1 & 0xff, (h2 >>> 24) & 0xff, (h2 >>> 16) & 0xff, (h2 >>> 8) & 0xff, h2 & 0xff, (h3 >>> 24) & 0xff, (h3 >>> 16) & 0xff, (h3 >>> 8) & 0xff, h3 & 0xff, (h4 >>> 24) & 0xff, (h4 >>> 16) & 0xff, (h4 >>> 8) & 0xff, h4 & 0xff ]); }; return _Sha1; }()); export { _Sha1 };