UNPKG

@technobuddha/library

Version:
101 lines 8.84 kB
import { encodeBinary } from "./encode-binary.js"; import { encodeText } from "./encode-text.js"; import { HashBase } from "./hash-base.js"; /** * The base class for sha based cryptographic hash functions * @group Binary * @category Hash */ export class ShaBase extends HashBase { /** * Internal buffer used to store a block of data for hashing operations. * This buffer is typically filled with input data and processed in chunks * according to the hash algorithm's block size. */ block; /** * The size of each data block (in bytes) that the hash algorithm processes at a time. * This value determines how input data is divided and handled internally. * @readonly */ blockSize; /** * The size in bytes of the final hash output produced by the algorithm. * This value determines the length of the resulting hash digest. * @readonly */ finalSize; /** * The current length of the data processed or stored. * Used internally to track the number of bytes or elements handled by the hash algorithm. */ len; /** * Creates a new instance of the hash base class. * * @param blockSize - The size of the internal block buffer in bytes. * @param finalSize - The size of the final hash output in bytes. */ constructor(blockSize, finalSize) { super(); this.block = new Uint8Array(blockSize); this.finalSize = finalSize; this.blockSize = blockSize; this.len = 0; } digest(encoding) { const rem = this.len % this.blockSize; this.block[rem] = 0x80; this.block.fill(0, rem + 1); if (rem >= this.finalSize) { this.updateCounters(this.block); this.block.fill(0); } const bits = this.len * 8; if (bits <= 32) { // uint32 this.block[this.blockSize - 4] = (bits & 0xff000000) >>> 24; this.block[this.blockSize - 3] = (bits & 0x00ff0000) >>> 16; this.block[this.blockSize - 2] = (bits & 0x0000ff00) >>> 8; this.block[this.blockSize - 1] = bits & 0x000000ff; } else { // uint64 const lowBits = (bits & 0xffffffff) >>> 0; const highBits = (bits - lowBits) / 0x100000000; this.block[this.blockSize - 8] = (highBits & 0xff000000) >>> 24; this.block[this.blockSize - 7] = (highBits & 0x00ff0000) >>> 16; this.block[this.blockSize - 6] = (highBits & 0x0000ff00) >>> 8; this.block[this.blockSize - 5] = highBits & 0x000000ff; this.block[this.blockSize - 4] = (lowBits & 0xff000000) >>> 24; this.block[this.blockSize - 3] = (lowBits & 0x00ff0000) >>> 16; this.block[this.blockSize - 2] = (lowBits & 0x0000ff00) >>> 8; this.block[this.blockSize - 1] = lowBits & 0x000000ff; } this.updateCounters(this.block); const hash = this.hash(); return encoding ? encodeBinary(hash, encoding) : hash; } update(data, encoding = 'utf8') { const buffer = typeof data === 'string' ? encodeText(data, encoding) : ArrayBuffer.isView(data) ? new Uint8Array(data.buffer, data.byteOffset, data.byteLength) : new Uint8Array(data); const { length } = buffer; let accum = this.len; for (let offset = 0; offset < length;) { const assigned = accum % this.blockSize; const remainder = Math.min(length - offset, this.blockSize - assigned); for (let i = 0; i < remainder; i++) { this.block[assigned + i] = buffer[offset + i]; } accum += remainder; offset += remainder; if (accum % this.blockSize === 0) { this.updateCounters(this.block); } } this.len += length; return this; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhLWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc2hhLWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHMUM7Ozs7R0FJRztBQUNILE1BQU0sT0FBZ0IsT0FBUSxTQUFRLFFBQVE7SUFDNUM7Ozs7T0FJRztJQUNnQixLQUFLLENBQWE7SUFDckM7Ozs7T0FJRztJQUNnQixTQUFTLENBQVM7SUFDckM7Ozs7T0FJRztJQUNnQixTQUFTLENBQVM7SUFDckM7OztPQUdHO0lBQ0ssR0FBRyxDQUFTO0lBRXBCOzs7OztPQUtHO0lBQ0gsWUFBbUIsU0FBaUIsRUFBRSxTQUFpQjtRQUNyRCxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDZixDQUFDO0lBNEJNLE1BQU0sQ0FBQyxRQUF5QjtRQUNyQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFFdEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUU1QixJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFD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