sha-1
No library sha-1 algorithm
by hirako2000
HTML
<div class="wrapper">
<span>input:</span>
<input size="16" maxlength="16" type="text" oninput="hash(this.value)"/>
<div>do not use yet, alg is flawed</div>
</div>
CSS
.hash {
font-family: monospace;
}
input {
margin-bottom: 1em;
}
span {
width: 100%;
}
.wrapper {
width: 100%;
}
TypeScript
class SHA1 {
// Helper function for left rotation
private static leftRotate(n: number, bits: number): number {
return (n << bits) | (n >>> (32 - bits));
}
// Process a 512-bit block of the message
private static processBlock(words: number[], hashBuffer: number[]): void {
const W = Array(80); // Message schedule
let A = hashBuffer[0];
let B = hashBuffer[1];
let C = hashBuffer[2];
let D = hashBuffer[3];
let E = hashBuffer[4];
// Prepare the message schedule
for (let t = 0; t < 16; t++) {
W[t] = words[t];
}
for (let t = 16; t < 80; t++) {
W[t] = SHA1.leftRotate(W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16], 1);
}
// Main SHA-1 algorithm
for (let t = 0; t < 80; t++) {
let F: number;
let K: number;
if (t < 20) {
F = (B & C) | ((~B) & D);
K = 0x5A827999;
} else if (t < 40) {
F = B ^ C ^ D;
K = 0x6ED9EBA1;
} else if (t < 60) {
F = (B & C) | (B & D) | (C & D);
K = 0x8F1BBCDC;
} else {
F = B ^ C ^ D;
K = 0xCA62C1D6;
}
const temp = (SHA1.leftRotate(A, 5) + F + E + K + W[t]) >>> 0;
E = D;
D = C;
C = SHA1.leftRotate(B, 30);
B = A;
A = temp;
}
// Update hash values
hashBuffer[0] = (hashBuffer[0] + A) >>> 0;
hashBuffer[1] = (hashBuffer[1] + B) >>> 0;
hashBuffer[2] = (hashBuffer[2] + C) >>> 0;
hashBuffer[3] = (hashBuffer[3] + D) >>> 0;
hashBuffer[4] = (hashBuffer[4] + E) >>> 0;
}
// method to hash a message
static hash(message: string): string {
// Convert message to UTF-8 using TextEncoder
const encoder = new TextEncoder();
const messageArray = Array.from(encoder.encode(message));
const messageBitLength = messageArray.length * 8;
// Padding
messageArray.push(0x80);
while ((messageArray.length % 64) !== 56) {
messageArray.push(0);
}
// Append message length
const...