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...