UNPKG

@syncfusion/ej2-pdf

Version:

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

175 lines (174 loc) 6.75 kB
import { _PdfNativeHashInput } from '../digital-signature/signature/pdf-accumulator'; /** * SHA-256 hash implementation used internally for PDF cryptography. * * @private */ var _Sha256 = /** @class */ (function () { function _Sha256() { } /** * 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. */ _Sha256.prototype._startChunkedConversion = function (outputSink) { return new _PdfNativeHashInput(this, outputSink); }; /** * Rotate a 32 bit value right by `n` bits. * * @private * @param {number} x - The 32 bit value to rotate. * @param {number} n - The number of bits to rotate. * @returns {number} The rotated 32-bit value. */ _Sha256.prototype._rotateRight = function (x, n) { return (x >>> n) | (x << (32 - n)); }; /** * Upper case sigma function used in SHA-256. * * @private * @param {number} x - The input 32-bit word. * @returns {number} The transformed 32-bit word. */ _Sha256.prototype._sigma = function (x) { return this._rotateRight(x, 2) ^ this._rotateRight(x, 13) ^ this._rotateRight(x, 22); }; /** * Upper-case sigma prime function used in SHA-256. * * @private * @param {number} x - The input 32-bit word. * @returns {number} The transformed 32-bit word. */ _Sha256.prototype._sigmaPrime = function (x) { return this._rotateRight(x, 6) ^ this._rotateRight(x, 11) ^ this._rotateRight(x, 25); }; /** * Lower-case sigma function used in the message schedule. * * @private * @param {number} x - The input 32-bit word. * @returns {number} The transformed 32-bit word. */ _Sha256.prototype._littleSigma = function (x) { return this._rotateRight(x, 7) ^ this._rotateRight(x, 18) ^ (x >>> 3); }; /** * Lower-case sigma prime function used in the message schedule. * * @private * @param {number} x The input 32-bit word. * @returns {number} The transformed 32-bit word. */ _Sha256.prototype._littleSigmaPrime = function (x) { return this._rotateRight(x, 17) ^ this._rotateRight(x, 19) ^ (x >>> 10); }; /** * Compute the SHA-256 hash for a slice of bytes. * * @private * @param {Uint8Array} data bytes. * @param {number} offset into `data`. * @param {number} length of bytes to hash. * @returns {Uint8Array} The 32-byte SHA-256 digest as `Uint8Array`. */ _Sha256.prototype._hash = function (data, offset, length) { var h0 = 0x6a09e667; var h1 = 0xbb67ae85; var h2 = 0x3c6ef372; var h3 = 0xa54ff53a; var h4 = 0x510e527f; var h5 = 0x9b05688c; var h6 = 0x1f83d9ab; var h7 = 0x5be0cd19; var k = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2]; var paddedLength = Math.ceil((length + 9) / 64) * 64; var padded = new Uint8Array(paddedLength); var i = 0; var j; for (; i < length; ++i) { padded[i] = data[offset++]; } padded[i++] = 0x80; var n = paddedLength - 8; while (i < n) { padded[i++] = 0; } padded[i++] = 0; padded[i++] = 0; padded[i++] = 0; padded[i++] = (length >>> 29) & 0xff; padded[i++] = (length >> 21) & 0xff; padded[i++] = (length >> 13) & 0xff; padded[i++] = (length >> 5) & 0xff; padded[i++] = (length << 3) & 0xff; var w = new Uint32Array(64); for (i = 0; i < paddedLength;) { for (j = 0; j < 16; ++j) { w[j] = (padded[i] << 24) | (padded[i + 1] << 16) | (padded[i + 2] << 8) | padded[i + 3]; i += 4; } for (j = 16; j < 64; ++j) { w[j] = (this._littleSigmaPrime(w[j - 2]) + w[j - 7] + this._littleSigma(w[j - 15]) + w[j - 16]) | 0; } var a = h0; var b = h1; var c = h2; var d = h3; var e = h4; var f = h5; var g = h6; var h = h7; var t1 = void 0; var t2 = void 0; for (j = 0; j < 64; ++j) { t1 = h + this._sigmaPrime(e) + ((e & f) ^ (~e & g)) + k[j] + w[j]; t2 = this._sigma(a) + ((a & b) ^ (a & c) ^ (b & c)); h = g; g = f; f = e; e = (d + t1) | 0; d = c; c = b; b = a; a = (t1 + t2) | 0; } h0 = (h0 + a) | 0; h1 = (h1 + b) | 0; h2 = (h2 + c) | 0; h3 = (h3 + d) | 0; h4 = (h4 + e) | 0; h5 = (h5 + f) | 0; h6 = (h6 + g) | 0; h7 = (h7 + h) | 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, (h5 >> 24) & 0xFF, (h5 >> 16) & 0xFF, (h5 >> 8) & 0xFF, (h5) & 0xFF, (h6 >> 24) & 0xFF, (h6 >> 16) & 0xFF, (h6 >> 8) & 0xFF, (h6) & 0xFF, (h7 >> 24) & 0xFF, (h7 >> 16) & 0xFF, (h7 >> 8) & 0xFF, (h7) & 0xFF ]); }; return _Sha256; }()); export { _Sha256 };