UNPKG

@abdellatif.dev/cryptjs

Version:

A JavaScript/TypeScript library that brings cryptographic functionality from Dart to the web

79 lines (78 loc) 2.23 kB
"use strict"; import { assert } from "console"; import validateRounds from "./rounds.js"; import validateSalt from "./salt.js"; import { hashBuffer, toUtf16Bytes } from "./utils.js"; export default function shaAlgorithm(algorithm, data, blockSize, providedRounds, providedSalt) { const [valueBytes, rounds, salt] = [ toUtf16Bytes(data), validateRounds(providedRounds), validateSalt(providedSalt) ]; const saltBytes = toUtf16Bytes(salt); const dataA = [...valueBytes, ...saltBytes]; const dataB = [...valueBytes, ...saltBytes, ...valueBytes]; const altBytes = hashBuffer(Buffer.from(dataB), algorithm); let count = data.length; while (count >= blockSize) { dataA.push(...altBytes); count -= blockSize; } 0 < count && dataA.push(...altBytes.slice(0, count)); for (let bits = data.length; bits != 0; bits >>= 1) { if ((bits & 1) != 0) { dataA.push(...altBytes); } else { dataA.push(...valueBytes); } } const digestA = hashBuffer(Buffer.from(dataA), algorithm); const dataDP = []; for (let x = 0; x < data.length; x++) { dataDP.push(...valueBytes); } const dpBytes = hashBuffer(Buffer.from(dataDP), algorithm); const p = []; count = data.length; while (count >= blockSize) { p.push(...dpBytes); count -= blockSize; } 0 < count && p.push(...dpBytes.slice(0, count)); const dataDS = []; const a0 = digestA[0]; assert(0 <= a0 && a0 < 256); for (let x = 0; x < 16 + a0; x++) { dataDS.push(...saltBytes); } const dsBytes = hashBuffer(Buffer.from(dataDS), algorithm); const s = []; count = salt.length; while (count >= blockSize) { s.push(...dsBytes); count -= blockSize; } 0 < count && s.push(...dsBytes.slice(0, count)); let hashSeq = digestA; for (var r = 0; r < rounds; r++) { const dataC = []; if (r % 2 == 1) { dataC.push(...p); } else { dataC.push(...hashSeq); } r % 3 != 0 && dataC.push(...s); r % 7 != 0 && dataC.push(...p); if (r % 2 == 1) { dataC.push(...hashSeq); } else { dataC.push(...p); } hashSeq = hashBuffer(Buffer.from(dataC), algorithm); } return { hashSeq, salt }; } //# sourceMappingURL=index.js.map