@technobuddha/library
Version:
A large library of useful functions
101 lines • 8.84 kB
JavaScript
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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