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