Inline the concatArrays
function in calculatePDF20Hash
This helper function is first of all only called *twice*, and secondly it also leads to unnecessary intermediate allocations given how the `TypedArray`s are handled. Hence we can simply inline this small function, and thus directly allocate the combined `TypedArray` instead.
This commit is contained in:
parent
9a9a5b2365
commit
b884757873
@ -1323,26 +1323,24 @@ var PDF17 = (function PDF17Closure() {
|
|||||||
})();
|
})();
|
||||||
|
|
||||||
var PDF20 = (function PDF20Closure() {
|
var PDF20 = (function PDF20Closure() {
|
||||||
function concatArrays(array1, array2) {
|
|
||||||
var t = new Uint8Array(array1.length + array2.length);
|
|
||||||
t.set(array1, 0);
|
|
||||||
t.set(array2, array1.length);
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
|
|
||||||
function calculatePDF20Hash(password, input, userBytes) {
|
function calculatePDF20Hash(password, input, userBytes) {
|
||||||
// This refers to Algorithm 2.B as defined in ISO 32000-2.
|
// This refers to Algorithm 2.B as defined in ISO 32000-2.
|
||||||
var k = calculateSHA256(input, 0, input.length).subarray(0, 32);
|
var k = calculateSHA256(input, 0, input.length).subarray(0, 32);
|
||||||
var e = [0];
|
var e = [0];
|
||||||
var i = 0;
|
var i = 0;
|
||||||
while (i < 64 || e[e.length - 1] > i - 32) {
|
while (i < 64 || e[e.length - 1] > i - 32) {
|
||||||
var arrayLength = password.length + k.length + userBytes.length;
|
const combinedLength = password.length + k.length + userBytes.length,
|
||||||
|
combinedArray = new Uint8Array(combinedLength);
|
||||||
|
let writeOffset = 0;
|
||||||
|
combinedArray.set(password, writeOffset);
|
||||||
|
writeOffset += password.length;
|
||||||
|
combinedArray.set(k, writeOffset);
|
||||||
|
writeOffset += k.length;
|
||||||
|
combinedArray.set(userBytes, writeOffset);
|
||||||
|
|
||||||
var k1 = new Uint8Array(arrayLength * 64);
|
var k1 = new Uint8Array(combinedLength * 64);
|
||||||
var array = concatArrays(password, k);
|
for (var j = 0, pos = 0; j < 64; j++, pos += combinedLength) {
|
||||||
array = concatArrays(array, userBytes);
|
k1.set(combinedArray, pos);
|
||||||
for (var j = 0, pos = 0; j < 64; j++, pos += arrayLength) {
|
|
||||||
k1.set(array, pos);
|
|
||||||
}
|
}
|
||||||
// AES128 CBC NO PADDING with first 16 bytes of k as the key
|
// AES128 CBC NO PADDING with first 16 bytes of k as the key
|
||||||
// and the second 16 as the iv.
|
// and the second 16 as the iv.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user