summaryrefslogtreecommitdiff
path: root/std/hash/_sha3
diff options
context:
space:
mode:
authorCasper Beyer <caspervonb@pm.me>2021-02-02 19:05:46 +0800
committerGitHub <noreply@github.com>2021-02-02 12:05:46 +0100
commit6abf126c2a7a451cded8c6b5e6ddf1b69c84055d (patch)
treefd94c013a19fcb38954844085821ec1601c20e18 /std/hash/_sha3
parenta2b5d44f1aa9d64f448a2a3cc2001272e2f60b98 (diff)
chore: remove std directory (#9361)
This removes the std folder from the tree. Various parts of the tests are pretty tightly dependent on std (47 direct imports and 75 indirect imports, not counting the cli tests that use them as fixtures) so I've added std as a submodule for now.
Diffstat (limited to 'std/hash/_sha3')
-rw-r--r--std/hash/_sha3/keccak.ts52
-rw-r--r--std/hash/_sha3/keccakf.ts790
-rw-r--r--std/hash/_sha3/sha3.ts56
-rw-r--r--std/hash/_sha3/shake.ts51
-rw-r--r--std/hash/_sha3/sponge.ts111
5 files changed, 0 insertions, 1060 deletions
diff --git a/std/hash/_sha3/keccak.ts b/std/hash/_sha3/keccak.ts
deleted file mode 100644
index 403a2dcb0..000000000
--- a/std/hash/_sha3/keccak.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-
-import { Sponge } from "./sponge.ts";
-import { keccakf } from "./keccakf.ts";
-
-/** Keccak-224 hash */
-export class Keccak224 extends Sponge {
- constructor() {
- super({
- bitsize: 224,
- rate: 144,
- dsbyte: 1,
- permutator: keccakf,
- });
- }
-}
-
-/** Keccak-256 hash */
-export class Keccak256 extends Sponge {
- constructor() {
- super({
- bitsize: 256,
- rate: 136,
- dsbyte: 1,
- permutator: keccakf,
- });
- }
-}
-
-/** Keccak-384 hash */
-export class Keccak384 extends Sponge {
- constructor() {
- super({
- bitsize: 384,
- rate: 104,
- dsbyte: 1,
- permutator: keccakf,
- });
- }
-}
-
-/** Keccak-512 hash */
-export class Keccak512 extends Sponge {
- constructor() {
- super({
- bitsize: 512,
- rate: 72,
- dsbyte: 1,
- permutator: keccakf,
- });
- }
-}
diff --git a/std/hash/_sha3/keccakf.ts b/std/hash/_sha3/keccakf.ts
deleted file mode 100644
index 0ba2b870c..000000000
--- a/std/hash/_sha3/keccakf.ts
+++ /dev/null
@@ -1,790 +0,0 @@
-// Ported from Go:
-// https://github.com/golang/crypto/blob/master/sha3/keccakf.go
-// Copyright 2011 The Go Authors. All rights reserved. BSD license.
-// https://github.com/golang/go/blob/master/LICENSE
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-
-const KECCAK_ROUNDS = 24;
-const KECCAK_RC: number[] = [
- 0x1,
- 0x0,
- 0x8082,
- 0x0,
- 0x808a,
- 0x80000000,
- 0x80008000,
- 0x80000000,
- 0x808b,
- 0x0,
- 0x80000001,
- 0x0,
- 0x80008081,
- 0x80000000,
- 0x8009,
- 0x80000000,
- 0x8a,
- 0x0,
- 0x88,
- 0x0,
- 0x80008009,
- 0x0,
- 0x8000000a,
- 0x0,
- 0x8000808b,
- 0x0,
- 0x8b,
- 0x80000000,
- 0x8089,
- 0x80000000,
- 0x8003,
- 0x80000000,
- 0x8002,
- 0x80000000,
- 0x80,
- 0x80000000,
- 0x800a,
- 0x0,
- 0x8000000a,
- 0x80000000,
- 0x80008081,
- 0x80000000,
- 0x8080,
- 0x80000000,
- 0x80000001,
- 0x0,
- 0x80008008,
- 0x80000000,
-];
-
-/** keccak1600 permutation function */
-export function keccakf(state: Uint8Array): void {
- const s = new Uint32Array(state.buffer);
- let bc0 = 0;
- let bc1 = 0;
- let bc2 = 0;
- let bc3 = 0;
- let bc4 = 0;
- let bc5 = 0;
- let bc6 = 0;
- let bc7 = 0;
- let bc8 = 0;
- let bc9 = 0;
- let d0 = 0;
- let d1 = 0;
- let d2 = 0;
- let d3 = 0;
- let d4 = 0;
- let d5 = 0;
- let d6 = 0;
- let d7 = 0;
- let d8 = 0;
- let d9 = 0;
- let t0 = 0;
- let t1 = 0;
-
- for (let n = 0; n < KECCAK_ROUNDS * 2; n += 8) {
- // Round 1
- bc0 = s[0] ^ s[10] ^ s[20] ^ s[30] ^ s[40];
- bc1 = s[1] ^ s[11] ^ s[21] ^ s[31] ^ s[41];
- bc2 = s[2] ^ s[12] ^ s[22] ^ s[32] ^ s[42];
- bc3 = s[3] ^ s[13] ^ s[23] ^ s[33] ^ s[43];
- bc4 = s[4] ^ s[14] ^ s[24] ^ s[34] ^ s[44];
- bc5 = s[5] ^ s[15] ^ s[25] ^ s[35] ^ s[45];
- bc6 = s[6] ^ s[16] ^ s[26] ^ s[36] ^ s[46];
- bc7 = s[7] ^ s[17] ^ s[27] ^ s[37] ^ s[47];
- bc8 = s[8] ^ s[18] ^ s[28] ^ s[38] ^ s[48];
- bc9 = s[9] ^ s[19] ^ s[29] ^ s[39] ^ s[49];
-
- d0 = bc8 ^ ((bc2 << 1) | (bc3 >>> 31));
- d1 = bc9 ^ ((bc3 << 1) | (bc2 >>> 31));
- d2 = bc0 ^ ((bc4 << 1) | (bc5 >>> 31));
- d3 = bc1 ^ ((bc5 << 1) | (bc4 >>> 31));
- d4 = bc2 ^ ((bc6 << 1) | (bc7 >>> 31));
- d5 = bc3 ^ ((bc7 << 1) | (bc6 >>> 31));
- d6 = bc4 ^ ((bc8 << 1) | (bc9 >>> 31));
- d7 = bc5 ^ ((bc9 << 1) | (bc8 >>> 31));
- d8 = bc6 ^ ((bc0 << 1) | (bc1 >>> 31));
- d9 = bc7 ^ ((bc1 << 1) | (bc0 >>> 31));
-
- bc0 = s[0] ^ d0;
- bc1 = s[1] ^ d1;
- t0 = s[12] ^ d2;
- t1 = s[13] ^ d3;
- bc2 = (t1 << 12) | (t0 >>> 20);
- bc3 = (t0 << 12) | (t1 >>> 20);
- t0 = s[24] ^ d4;
- t1 = s[25] ^ d5;
- bc4 = (t1 << 11) | (t0 >>> 21);
- bc5 = (t0 << 11) | (t1 >>> 21);
- t0 = s[36] ^ d6;
- t1 = s[37] ^ d7;
- bc6 = (t0 << 21) | (t1 >>> 11);
- bc7 = (t1 << 21) | (t0 >>> 11);
- t0 = s[48] ^ d8;
- t1 = s[49] ^ d9;
- bc8 = (t0 << 14) | (t1 >>> 18);
- bc9 = (t1 << 14) | (t0 >>> 18);
- s[0] = bc0 ^ (bc4 & ~bc2) ^ KECCAK_RC[n];
- s[1] = bc1 ^ (bc5 & ~bc3) ^ KECCAK_RC[n + 1];
- s[12] = bc2 ^ (bc6 & ~bc4);
- s[13] = bc3 ^ (bc7 & ~bc5);
- s[24] = bc4 ^ (bc8 & ~bc6);
- s[25] = bc5 ^ (bc9 & ~bc7);
- s[36] = bc6 ^ (bc0 & ~bc8);
- s[37] = bc7 ^ (bc1 & ~bc9);
- s[48] = bc8 ^ (bc2 & ~bc0);
- s[49] = bc9 ^ (bc3 & ~bc1);
-
- t0 = s[20] ^ d0;
- t1 = s[21] ^ d1;
- bc4 = (t0 << 3) | (t1 >>> 29);
- bc5 = (t1 << 3) | (t0 >>> 29);
- t0 = s[32] ^ d2;
- t1 = s[33] ^ d3;
- bc6 = (t1 << 13) | (t0 >>> 19);
- bc7 = (t0 << 13) | (t1 >>> 19);
- t0 = s[44] ^ d4;
- t1 = s[45] ^ d5;
- bc8 = (t1 << 29) | (t0 >>> 3);
- bc9 = (t0 << 29) | (t1 >>> 3);
- t0 = s[6] ^ d6;
- t1 = s[7] ^ d7;
- bc0 = (t0 << 28) | (t1 >>> 4);
- bc1 = (t1 << 28) | (t0 >>> 4);
- t0 = s[18] ^ d8;
- t1 = s[19] ^ d9;
- bc2 = (t0 << 20) | (t1 >>> 12);
- bc3 = (t1 << 20) | (t0 >>> 12);
- s[20] = bc0 ^ (bc4 & ~bc2);
- s[21] = bc1 ^ (bc5 & ~bc3);
- s[32] = bc2 ^ (bc6 & ~bc4);
- s[33] = bc3 ^ (bc7 & ~bc5);
- s[44] = bc4 ^ (bc8 & ~bc6);
- s[45] = bc5 ^ (bc9 & ~bc7);
- s[6] = bc6 ^ (bc0 & ~bc8);
- s[7] = bc7 ^ (bc1 & ~bc9);
- s[18] = bc8 ^ (bc2 & ~bc0);
- s[19] = bc9 ^ (bc3 & ~bc1);
-
- t0 = s[40] ^ d0;
- t1 = s[41] ^ d1;
- bc8 = (t0 << 18) | (t1 >>> 14);
- bc9 = (t1 << 18) | (t0 >>> 14);
- t0 = s[2] ^ d2;
- t1 = s[3] ^ d3;
- bc0 = (t0 << 1) | (t1 >>> 31);
- bc1 = (t1 << 1) | (t0 >>> 31);
- t0 = s[14] ^ d4;
- t1 = s[15] ^ d5;
- bc2 = (t0 << 6) | (t1 >>> 26);
- bc3 = (t1 << 6) | (t0 >>> 26);
- t0 = s[26] ^ d6;
- t1 = s[27] ^ d7;
- bc4 = (t0 << 25) | (t1 >>> 7);
- bc5 = (t1 << 25) | (t0 >>> 7);
- t0 = s[38] ^ d8;
- t1 = s[39] ^ d9;
- bc6 = (t0 << 8) | (t1 >>> 24);
- bc7 = (t1 << 8) | (t0 >>> 24);
- s[40] = bc0 ^ (bc4 & ~bc2);
- s[41] = bc1 ^ (bc5 & ~bc3);
- s[2] = bc2 ^ (bc6 & ~bc4);
- s[3] = bc3 ^ (bc7 & ~bc5);
- s[14] = bc4 ^ (bc8 & ~bc6);
- s[15] = bc5 ^ (bc9 & ~bc7);
- s[26] = bc6 ^ (bc0 & ~bc8);
- s[27] = bc7 ^ (bc1 & ~bc9);
- s[38] = bc8 ^ (bc2 & ~bc0);
- s[39] = bc9 ^ (bc3 & ~bc1);
-
- t0 = s[10] ^ d0;
- t1 = s[11] ^ d1;
- bc2 = (t1 << 4) | (t0 >>> 28);
- bc3 = (t0 << 4) | (t1 >>> 28);
- t0 = s[22] ^ d2;
- t1 = s[23] ^ d3;
- bc4 = (t0 << 10) | (t1 >>> 22);
- bc5 = (t1 << 10) | (t0 >>> 22);
- t0 = s[34] ^ d4;
- t1 = s[35] ^ d5;
- bc6 = (t0 << 15) | (t1 >>> 17);
- bc7 = (t1 << 15) | (t0 >>> 17);
- t0 = s[46] ^ d6;
- t1 = s[47] ^ d7;
- bc8 = (t1 << 24) | (t0 >>> 8);
- bc9 = (t0 << 24) | (t1 >>> 8);
- t0 = s[8] ^ d8;
- t1 = s[9] ^ d9;
- bc0 = (t0 << 27) | (t1 >>> 5);
- bc1 = (t1 << 27) | (t0 >>> 5);
- s[10] = bc0 ^ (bc4 & ~bc2);
- s[11] = bc1 ^ (bc5 & ~bc3);
- s[22] = bc2 ^ (bc6 & ~bc4);
- s[23] = bc3 ^ (bc7 & ~bc5);
- s[34] = bc4 ^ (bc8 & ~bc6);
- s[35] = bc5 ^ (bc9 & ~bc7);
- s[46] = bc6 ^ (bc0 & ~bc8);
- s[47] = bc7 ^ (bc1 & ~bc9);
- s[8] = bc8 ^ (bc2 & ~bc0);
- s[9] = bc9 ^ (bc3 & ~bc1);
-
- t0 = s[30] ^ d0;
- t1 = s[31] ^ d1;
- bc6 = (t1 << 9) | (t0 >>> 23);
- bc7 = (t0 << 9) | (t1 >>> 23);
- t0 = s[42] ^ d2;
- t1 = s[43] ^ d3;
- bc8 = (t0 << 2) | (t1 >>> 30);
- bc9 = (t1 << 2) | (t0 >>> 30);
- t0 = s[4] ^ d4;
- t1 = s[5] ^ d5;
- bc0 = (t1 << 30) | (t0 >>> 2);
- bc1 = (t0 << 30) | (t1 >>> 2);
- t0 = s[16] ^ d6;
- t1 = s[17] ^ d7;
- bc2 = (t1 << 23) | (t0 >>> 9);
- bc3 = (t0 << 23) | (t1 >>> 9);
- t0 = s[28] ^ d8;
- t1 = s[29] ^ d9;
- bc4 = (t1 << 7) | (t0 >>> 25);
- bc5 = (t0 << 7) | (t1 >>> 25);
- s[30] = bc0 ^ (bc4 & ~bc2);
- s[31] = bc1 ^ (bc5 & ~bc3);
- s[42] = bc2 ^ (bc6 & ~bc4);
- s[43] = bc3 ^ (bc7 & ~bc5);
- s[4] = bc4 ^ (bc8 & ~bc6);
- s[5] = bc5 ^ (bc9 & ~bc7);
- s[16] = bc6 ^ (bc0 & ~bc8);
- s[17] = bc7 ^ (bc1 & ~bc9);
- s[28] = bc8 ^ (bc2 & ~bc0);
- s[29] = bc9 ^ (bc3 & ~bc1);
-
- // Round 2
- bc0 = s[0] ^ s[10] ^ s[20] ^ s[30] ^ s[40];
- bc1 = s[1] ^ s[11] ^ s[21] ^ s[31] ^ s[41];
- bc2 = s[2] ^ s[12] ^ s[22] ^ s[32] ^ s[42];
- bc3 = s[3] ^ s[13] ^ s[23] ^ s[33] ^ s[43];
- bc4 = s[4] ^ s[14] ^ s[24] ^ s[34] ^ s[44];
- bc5 = s[5] ^ s[15] ^ s[25] ^ s[35] ^ s[45];
- bc6 = s[6] ^ s[16] ^ s[26] ^ s[36] ^ s[46];
- bc7 = s[7] ^ s[17] ^ s[27] ^ s[37] ^ s[47];
- bc8 = s[8] ^ s[18] ^ s[28] ^ s[38] ^ s[48];
- bc9 = s[9] ^ s[19] ^ s[29] ^ s[39] ^ s[49];
-
- d0 = bc8 ^ ((bc2 << 1) | (bc3 >>> 31));
- d1 = bc9 ^ ((bc3 << 1) | (bc2 >>> 31));
- d2 = bc0 ^ ((bc4 << 1) | (bc5 >>> 31));
- d3 = bc1 ^ ((bc5 << 1) | (bc4 >>> 31));
- d4 = bc2 ^ ((bc6 << 1) | (bc7 >>> 31));
- d5 = bc3 ^ ((bc7 << 1) | (bc6 >>> 31));
- d6 = bc4 ^ ((bc8 << 1) | (bc9 >>> 31));
- d7 = bc5 ^ ((bc9 << 1) | (bc8 >>> 31));
- d8 = bc6 ^ ((bc0 << 1) | (bc1 >>> 31));
- d9 = bc7 ^ ((bc1 << 1) | (bc0 >>> 31));
-
- bc0 = s[0] ^ d0;
- bc1 = s[1] ^ d1;
- t0 = s[32] ^ d2;
- t1 = s[33] ^ d3;
- bc2 = (t1 << 12) | (t0 >>> 20);
- bc3 = (t0 << 12) | (t1 >>> 20);
- t0 = s[14] ^ d4;
- t1 = s[15] ^ d5;
- bc4 = (t1 << 11) | (t0 >>> 21);
- bc5 = (t0 << 11) | (t1 >>> 21);
- t0 = s[46] ^ d6;
- t1 = s[47] ^ d7;
- bc6 = (t0 << 21) | (t1 >>> 11);
- bc7 = (t1 << 21) | (t0 >>> 11);
- t0 = s[28] ^ d8;
- t1 = s[29] ^ d9;
- bc8 = (t0 << 14) | (t1 >>> 18);
- bc9 = (t1 << 14) | (t0 >>> 18);
- s[0] = bc0 ^ (bc4 & ~bc2) ^ KECCAK_RC[n + 2];
- s[1] = bc1 ^ (bc5 & ~bc3) ^ KECCAK_RC[n + 3];
- s[32] = bc2 ^ (bc6 & ~bc4);
- s[33] = bc3 ^ (bc7 & ~bc5);
- s[14] = bc4 ^ (bc8 & ~bc6);
- s[15] = bc5 ^ (bc9 & ~bc7);
- s[46] = bc6 ^ (bc0 & ~bc8);
- s[47] = bc7 ^ (bc1 & ~bc9);
- s[28] = bc8 ^ (bc2 & ~bc0);
- s[29] = bc9 ^ (bc3 & ~bc1);
-
- t0 = s[40] ^ d0;
- t1 = s[41] ^ d1;
- bc4 = (t0 << 3) | (t1 >>> 29);
- bc5 = (t1 << 3) | (t0 >>> 29);
- t0 = s[22] ^ d2;
- t1 = s[23] ^ d3;
- bc6 = (t1 << 13) | (t0 >>> 19);
- bc7 = (t0 << 13) | (t1 >>> 19);
- t0 = s[4] ^ d4;
- t1 = s[5] ^ d5;
- bc8 = (t1 << 29) | (t0 >>> 3);
- bc9 = (t0 << 29) | (t1 >>> 3);
- t0 = s[36] ^ d6;
- t1 = s[37] ^ d7;
- bc0 = (t0 << 28) | (t1 >>> 4);
- bc1 = (t1 << 28) | (t0 >>> 4);
- t0 = s[18] ^ d8;
- t1 = s[19] ^ d9;
- bc2 = (t0 << 20) | (t1 >>> 12);
- bc3 = (t1 << 20) | (t0 >>> 12);
- s[40] = bc0 ^ (bc4 & ~bc2);
- s[41] = bc1 ^ (bc5 & ~bc3);
- s[22] = bc2 ^ (bc6 & ~bc4);
- s[23] = bc3 ^ (bc7 & ~bc5);
- s[4] = bc4 ^ (bc8 & ~bc6);
- s[5] = bc5 ^ (bc9 & ~bc7);
- s[36] = bc6 ^ (bc0 & ~bc8);
- s[37] = bc7 ^ (bc1 & ~bc9);
- s[18] = bc8 ^ (bc2 & ~bc0);
- s[19] = bc9 ^ (bc3 & ~bc1);
-
- t0 = s[30] ^ d0;
- t1 = s[31] ^ d1;
- bc8 = (t0 << 18) | (t1 >>> 14);
- bc9 = (t1 << 18) | (t0 >>> 14);
- t0 = s[12] ^ d2;
- t1 = s[13] ^ d3;
- bc0 = (t0 << 1) | (t1 >>> 31);
- bc1 = (t1 << 1) | (t0 >>> 31);
- t0 = s[44] ^ d4;
- t1 = s[45] ^ d5;
- bc2 = (t0 << 6) | (t1 >>> 26);
- bc3 = (t1 << 6) | (t0 >>> 26);
- t0 = s[26] ^ d6;
- t1 = s[27] ^ d7;
- bc4 = (t0 << 25) | (t1 >>> 7);
- bc5 = (t1 << 25) | (t0 >>> 7);
- t0 = s[8] ^ d8;
- t1 = s[9] ^ d9;
- bc6 = (t0 << 8) | (t1 >>> 24);
- bc7 = (t1 << 8) | (t0 >>> 24);
- s[30] = bc0 ^ (bc4 & ~bc2);
- s[31] = bc1 ^ (bc5 & ~bc3);
- s[12] = bc2 ^ (bc6 & ~bc4);
- s[13] = bc3 ^ (bc7 & ~bc5);
- s[44] = bc4 ^ (bc8 & ~bc6);
- s[45] = bc5 ^ (bc9 & ~bc7);
- s[26] = bc6 ^ (bc0 & ~bc8);
- s[27] = bc7 ^ (bc1 & ~bc9);
- s[8] = bc8 ^ (bc2 & ~bc0);
- s[9] = bc9 ^ (bc3 & ~bc1);
-
- t0 = s[20] ^ d0;
- t1 = s[21] ^ d1;
- bc2 = (t1 << 4) | (t0 >>> 28);
- bc3 = (t0 << 4) | (t1 >>> 28);
- t0 = s[2] ^ d2;
- t1 = s[3] ^ d3;
- bc4 = (t0 << 10) | (t1 >>> 22);
- bc5 = (t1 << 10) | (t0 >>> 22);
- t0 = s[34] ^ d4;
- t1 = s[35] ^ d5;
- bc6 = (t0 << 15) | (t1 >>> 17);
- bc7 = (t1 << 15) | (t0 >>> 17);
- t0 = s[16] ^ d6;
- t1 = s[17] ^ d7;
- bc8 = (t1 << 24) | (t0 >>> 8);
- bc9 = (t0 << 24) | (t1 >>> 8);
- t0 = s[48] ^ d8;
- t1 = s[49] ^ d9;
- bc0 = (t0 << 27) | (t1 >>> 5);
- bc1 = (t1 << 27) | (t0 >>> 5);
- s[20] = bc0 ^ (bc4 & ~bc2);
- s[21] = bc1 ^ (bc5 & ~bc3);
- s[2] = bc2 ^ (bc6 & ~bc4);
- s[3] = bc3 ^ (bc7 & ~bc5);
- s[34] = bc4 ^ (bc8 & ~bc6);
- s[35] = bc5 ^ (bc9 & ~bc7);
- s[16] = bc6 ^ (bc0 & ~bc8);
- s[17] = bc7 ^ (bc1 & ~bc9);
- s[48] = bc8 ^ (bc2 & ~bc0);
- s[49] = bc9 ^ (bc3 & ~bc1);
-
- t0 = s[10] ^ d0;
- t1 = s[11] ^ d1;
- bc6 = (t1 << 9) | (t0 >>> 23);
- bc7 = (t0 << 9) | (t1 >>> 23);
- t0 = s[42] ^ d2;
- t1 = s[43] ^ d3;
- bc8 = (t0 << 2) | (t1 >>> 30);
- bc9 = (t1 << 2) | (t0 >>> 30);
- t0 = s[24] ^ d4;
- t1 = s[25] ^ d5;
- bc0 = (t1 << 30) | (t0 >>> 2);
- bc1 = (t0 << 30) | (t1 >>> 2);
- t0 = s[6] ^ d6;
- t1 = s[7] ^ d7;
- bc2 = (t1 << 23) | (t0 >>> 9);
- bc3 = (t0 << 23) | (t1 >>> 9);
- t0 = s[38] ^ d8;
- t1 = s[39] ^ d9;
- bc4 = (t1 << 7) | (t0 >>> 25);
- bc5 = (t0 << 7) | (t1 >>> 25);
- s[10] = bc0 ^ (bc4 & ~bc2);
- s[11] = bc1 ^ (bc5 & ~bc3);
- s[42] = bc2 ^ (bc6 & ~bc4);
- s[43] = bc3 ^ (bc7 & ~bc5);
- s[24] = bc4 ^ (bc8 & ~bc6);
- s[25] = bc5 ^ (bc9 & ~bc7);
- s[6] = bc6 ^ (bc0 & ~bc8);
- s[7] = bc7 ^ (bc1 & ~bc9);
- s[38] = bc8 ^ (bc2 & ~bc0);
- s[39] = bc9 ^ (bc3 & ~bc1);
-
- // Round 3
- bc0 = s[0] ^ s[10] ^ s[20] ^ s[30] ^ s[40];
- bc1 = s[1] ^ s[11] ^ s[21] ^ s[31] ^ s[41];
- bc2 = s[2] ^ s[12] ^ s[22] ^ s[32] ^ s[42];
- bc3 = s[3] ^ s[13] ^ s[23] ^ s[33] ^ s[43];
- bc4 = s[4] ^ s[14] ^ s[24] ^ s[34] ^ s[44];
- bc5 = s[5] ^ s[15] ^ s[25] ^ s[35] ^ s[45];
- bc6 = s[6] ^ s[16] ^ s[26] ^ s[36] ^ s[46];
- bc7 = s[7] ^ s[17] ^ s[27] ^ s[37] ^ s[47];
- bc8 = s[8] ^ s[18] ^ s[28] ^ s[38] ^ s[48];
- bc9 = s[9] ^ s[19] ^ s[29] ^ s[39] ^ s[49];
-
- d0 = bc8 ^ ((bc2 << 1) | (bc3 >>> 31));
- d1 = bc9 ^ ((bc3 << 1) | (bc2 >>> 31));
- d2 = bc0 ^ ((bc4 << 1) | (bc5 >>> 31));
- d3 = bc1 ^ ((bc5 << 1) | (bc4 >>> 31));
- d4 = bc2 ^ ((bc6 << 1) | (bc7 >>> 31));
- d5 = bc3 ^ ((bc7 << 1) | (bc6 >>> 31));
- d6 = bc4 ^ ((bc8 << 1) | (bc9 >>> 31));
- d7 = bc5 ^ ((bc9 << 1) | (bc8 >>> 31));
- d8 = bc6 ^ ((bc0 << 1) | (bc1 >>> 31));
- d9 = bc7 ^ ((bc1 << 1) | (bc0 >>> 31));
-
- bc0 = s[0] ^ d0;
- bc1 = s[1] ^ d1;
- t0 = s[22] ^ d2;
- t1 = s[23] ^ d3;
- bc2 = (t1 << 12) | (t0 >>> 20);
- bc3 = (t0 << 12) | (t1 >>> 20);
- t0 = s[44] ^ d4;
- t1 = s[45] ^ d5;
- bc4 = (t1 << 11) | (t0 >>> 21);
- bc5 = (t0 << 11) | (t1 >>> 21);
- t0 = s[16] ^ d6;
- t1 = s[17] ^ d7;
- bc6 = (t0 << 21) | (t1 >>> 11);
- bc7 = (t1 << 21) | (t0 >>> 11);
- t0 = s[38] ^ d8;
- t1 = s[39] ^ d9;
- bc8 = (t0 << 14) | (t1 >>> 18);
- bc9 = (t1 << 14) | (t0 >>> 18);
- s[0] = bc0 ^ (bc4 & ~bc2) ^ KECCAK_RC[n + 4];
- s[1] = bc1 ^ (bc5 & ~bc3) ^ KECCAK_RC[n + 5];
- s[22] = bc2 ^ (bc6 & ~bc4);
- s[23] = bc3 ^ (bc7 & ~bc5);
- s[44] = bc4 ^ (bc8 & ~bc6);
- s[45] = bc5 ^ (bc9 & ~bc7);
- s[16] = bc6 ^ (bc0 & ~bc8);
- s[17] = bc7 ^ (bc1 & ~bc9);
- s[38] = bc8 ^ (bc2 & ~bc0);
- s[39] = bc9 ^ (bc3 & ~bc1);
-
- t0 = s[30] ^ d0;
- t1 = s[31] ^ d1;
- bc4 = (t0 << 3) | (t1 >>> 29);
- bc5 = (t1 << 3) | (t0 >>> 29);
- t0 = s[2] ^ d2;
- t1 = s[3] ^ d3;
- bc6 = (t1 << 13) | (t0 >>> 19);
- bc7 = (t0 << 13) | (t1 >>> 19);
- t0 = s[24] ^ d4;
- t1 = s[25] ^ d5;
- bc8 = (t1 << 29) | (t0 >>> 3);
- bc9 = (t0 << 29) | (t1 >>> 3);
- t0 = s[46] ^ d6;
- t1 = s[47] ^ d7;
- bc0 = (t0 << 28) | (t1 >>> 4);
- bc1 = (t1 << 28) | (t0 >>> 4);
- t0 = s[18] ^ d8;
- t1 = s[19] ^ d9;
- bc2 = (t0 << 20) | (t1 >>> 12);
- bc3 = (t1 << 20) | (t0 >>> 12);
- s[30] = bc0 ^ (bc4 & ~bc2);
- s[31] = bc1 ^ (bc5 & ~bc3);
- s[2] = bc2 ^ (bc6 & ~bc4);
- s[3] = bc3 ^ (bc7 & ~bc5);
- s[24] = bc4 ^ (bc8 & ~bc6);
- s[25] = bc5 ^ (bc9 & ~bc7);
- s[46] = bc6 ^ (bc0 & ~bc8);
- s[47] = bc7 ^ (bc1 & ~bc9);
- s[18] = bc8 ^ (bc2 & ~bc0);
- s[19] = bc9 ^ (bc3 & ~bc1);
-
- t0 = s[10] ^ d0;
- t1 = s[11] ^ d1;
- bc8 = (t0 << 18) | (t1 >>> 14);
- bc9 = (t1 << 18) | (t0 >>> 14);
- t0 = s[32] ^ d2;
- t1 = s[33] ^ d3;
- bc0 = (t0 << 1) | (t1 >>> 31);
- bc1 = (t1 << 1) | (t0 >>> 31);
- t0 = s[4] ^ d4;
- t1 = s[5] ^ d5;
- bc2 = (t0 << 6) | (t1 >>> 26);
- bc3 = (t1 << 6) | (t0 >>> 26);
- t0 = s[26] ^ d6;
- t1 = s[27] ^ d7;
- bc4 = (t0 << 25) | (t1 >>> 7);
- bc5 = (t1 << 25) | (t0 >>> 7);
- t0 = s[48] ^ d8;
- t1 = s[49] ^ d9;
- bc6 = (t0 << 8) | (t1 >>> 24);
- bc7 = (t1 << 8) | (t0 >>> 24);
- s[10] = bc0 ^ (bc4 & ~bc2);
- s[11] = bc1 ^ (bc5 & ~bc3);
- s[32] = bc2 ^ (bc6 & ~bc4);
- s[33] = bc3 ^ (bc7 & ~bc5);
- s[4] = bc4 ^ (bc8 & ~bc6);
- s[5] = bc5 ^ (bc9 & ~bc7);
- s[26] = bc6 ^ (bc0 & ~bc8);
- s[27] = bc7 ^ (bc1 & ~bc9);
- s[48] = bc8 ^ (bc2 & ~bc0);
- s[49] = bc9 ^ (bc3 & ~bc1);
-
- t0 = s[40] ^ d0;
- t1 = s[41] ^ d1;
- bc2 = (t1 << 4) | (t0 >>> 28);
- bc3 = (t0 << 4) | (t1 >>> 28);
- t0 = s[12] ^ d2;
- t1 = s[13] ^ d3;
- bc4 = (t0 << 10) | (t1 >>> 22);
- bc5 = (t1 << 10) | (t0 >>> 22);
- t0 = s[34] ^ d4;
- t1 = s[35] ^ d5;
- bc6 = (t0 << 15) | (t1 >>> 17);
- bc7 = (t1 << 15) | (t0 >>> 17);
- t0 = s[6] ^ d6;
- t1 = s[7] ^ d7;
- bc8 = (t1 << 24) | (t0 >>> 8);
- bc9 = (t0 << 24) | (t1 >>> 8);
- t0 = s[28] ^ d8;
- t1 = s[29] ^ d9;
- bc0 = (t0 << 27) | (t1 >>> 5);
- bc1 = (t1 << 27) | (t0 >>> 5);
- s[40] = bc0 ^ (bc4 & ~bc2);
- s[41] = bc1 ^ (bc5 & ~bc3);
- s[12] = bc2 ^ (bc6 & ~bc4);
- s[13] = bc3 ^ (bc7 & ~bc5);
- s[34] = bc4 ^ (bc8 & ~bc6);
- s[35] = bc5 ^ (bc9 & ~bc7);
- s[6] = bc6 ^ (bc0 & ~bc8);
- s[7] = bc7 ^ (bc1 & ~bc9);
- s[28] = bc8 ^ (bc2 & ~bc0);
- s[29] = bc9 ^ (bc3 & ~bc1);
-
- t0 = s[20] ^ d0;
- t1 = s[21] ^ d1;
- bc6 = (t1 << 9) | (t0 >>> 23);
- bc7 = (t0 << 9) | (t1 >>> 23);
- t0 = s[42] ^ d2;
- t1 = s[43] ^ d3;
- bc8 = (t0 << 2) | (t1 >>> 30);
- bc9 = (t1 << 2) | (t0 >>> 30);
- t0 = s[14] ^ d4;
- t1 = s[15] ^ d5;
- bc0 = (t1 << 30) | (t0 >>> 2);
- bc1 = (t0 << 30) | (t1 >>> 2);
- t0 = s[36] ^ d6;
- t1 = s[37] ^ d7;
- bc2 = (t1 << 23) | (t0 >>> 9);
- bc3 = (t0 << 23) | (t1 >>> 9);
- t0 = s[8] ^ d8;
- t1 = s[9] ^ d9;
- bc4 = (t1 << 7) | (t0 >>> 25);
- bc5 = (t0 << 7) | (t1 >>> 25);
- s[20] = bc0 ^ (bc4 & ~bc2);
- s[21] = bc1 ^ (bc5 & ~bc3);
- s[42] = bc2 ^ (bc6 & ~bc4);
- s[43] = bc3 ^ (bc7 & ~bc5);
- s[14] = bc4 ^ (bc8 & ~bc6);
- s[15] = bc5 ^ (bc9 & ~bc7);
- s[36] = bc6 ^ (bc0 & ~bc8);
- s[37] = bc7 ^ (bc1 & ~bc9);
- s[8] = bc8 ^ (bc2 & ~bc0);
- s[9] = bc9 ^ (bc3 & ~bc1);
-
- // Round 4
- bc0 = s[0] ^ s[10] ^ s[20] ^ s[30] ^ s[40];
- bc1 = s[1] ^ s[11] ^ s[21] ^ s[31] ^ s[41];
- bc2 = s[2] ^ s[12] ^ s[22] ^ s[32] ^ s[42];
- bc3 = s[3] ^ s[13] ^ s[23] ^ s[33] ^ s[43];
- bc4 = s[4] ^ s[14] ^ s[24] ^ s[34] ^ s[44];
- bc5 = s[5] ^ s[15] ^ s[25] ^ s[35] ^ s[45];
- bc6 = s[6] ^ s[16] ^ s[26] ^ s[36] ^ s[46];
- bc7 = s[7] ^ s[17] ^ s[27] ^ s[37] ^ s[47];
- bc8 = s[8] ^ s[18] ^ s[28] ^ s[38] ^ s[48];
- bc9 = s[9] ^ s[19] ^ s[29] ^ s[39] ^ s[49];
-
- d0 = bc8 ^ ((bc2 << 1) | (bc3 >>> 31));
- d1 = bc9 ^ ((bc3 << 1) | (bc2 >>> 31));
- d2 = bc0 ^ ((bc4 << 1) | (bc5 >>> 31));
- d3 = bc1 ^ ((bc5 << 1) | (bc4 >>> 31));
- d4 = bc2 ^ ((bc6 << 1) | (bc7 >>> 31));
- d5 = bc3 ^ ((bc7 << 1) | (bc6 >>> 31));
- d6 = bc4 ^ ((bc8 << 1) | (bc9 >>> 31));
- d7 = bc5 ^ ((bc9 << 1) | (bc8 >>> 31));
- d8 = bc6 ^ ((bc0 << 1) | (bc1 >>> 31));
- d9 = bc7 ^ ((bc1 << 1) | (bc0 >>> 31));
-
- bc0 = s[0] ^ d0;
- bc1 = s[1] ^ d1;
- t0 = s[2] ^ d2;
- t1 = s[3] ^ d3;
- bc2 = (t1 << 12) | (t0 >>> 20);
- bc3 = (t0 << 12) | (t1 >>> 20);
- t0 = s[4] ^ d4;
- t1 = s[5] ^ d5;
- bc4 = (t1 << 11) | (t0 >>> 21);
- bc5 = (t0 << 11) | (t1 >>> 21);
- t0 = s[6] ^ d6;
- t1 = s[7] ^ d7;
- bc6 = (t0 << 21) | (t1 >>> 11);
- bc7 = (t1 << 21) | (t0 >>> 11);
- t0 = s[8] ^ d8;
- t1 = s[9] ^ d9;
- bc8 = (t0 << 14) | (t1 >>> 18);
- bc9 = (t1 << 14) | (t0 >>> 18);
- s[0] = bc0 ^ (bc4 & ~bc2) ^ KECCAK_RC[n + 6];
- s[1] = bc1 ^ (bc5 & ~bc3) ^ KECCAK_RC[n + 7];
- s[2] = bc2 ^ (bc6 & ~bc4);
- s[3] = bc3 ^ (bc7 & ~bc5);
- s[4] = bc4 ^ (bc8 & ~bc6);
- s[5] = bc5 ^ (bc9 & ~bc7);
- s[6] = bc6 ^ (bc0 & ~bc8);
- s[7] = bc7 ^ (bc1 & ~bc9);
- s[8] = bc8 ^ (bc2 & ~bc0);
- s[9] = bc9 ^ (bc3 & ~bc1);
-
- t0 = s[10] ^ d0;
- t1 = s[11] ^ d1;
- bc4 = (t0 << 3) | (t1 >>> 29);
- bc5 = (t1 << 3) | (t0 >>> 29);
- t0 = s[12] ^ d2;
- t1 = s[13] ^ d3;
- bc6 = (t1 << 13) | (t0 >>> 19);
- bc7 = (t0 << 13) | (t1 >>> 19);
- t0 = s[14] ^ d4;
- t1 = s[15] ^ d5;
- bc8 = (t1 << 29) | (t0 >>> 3);
- bc9 = (t0 << 29) | (t1 >>> 3);
- t0 = s[16] ^ d6;
- t1 = s[17] ^ d7;
- bc0 = (t0 << 28) | (t1 >>> 4);
- bc1 = (t1 << 28) | (t0 >>> 4);
- t0 = s[18] ^ d8;
- t1 = s[19] ^ d9;
- bc2 = (t0 << 20) | (t1 >>> 12);
- bc3 = (t1 << 20) | (t0 >>> 12);
- s[10] = bc0 ^ (bc4 & ~bc2);
- s[11] = bc1 ^ (bc5 & ~bc3);
- s[12] = bc2 ^ (bc6 & ~bc4);
- s[13] = bc3 ^ (bc7 & ~bc5);
- s[14] = bc4 ^ (bc8 & ~bc6);
- s[15] = bc5 ^ (bc9 & ~bc7);
- s[16] = bc6 ^ (bc0 & ~bc8);
- s[17] = bc7 ^ (bc1 & ~bc9);
- s[18] = bc8 ^ (bc2 & ~bc0);
- s[19] = bc9 ^ (bc3 & ~bc1);
-
- t0 = s[20] ^ d0;
- t1 = s[21] ^ d1;
- bc8 = (t0 << 18) | (t1 >>> 14);
- bc9 = (t1 << 18) | (t0 >>> 14);
- t0 = s[22] ^ d2;
- t1 = s[23] ^ d3;
- bc0 = (t0 << 1) | (t1 >>> 31);
- bc1 = (t1 << 1) | (t0 >>> 31);
- t0 = s[24] ^ d4;
- t1 = s[25] ^ d5;
- bc2 = (t0 << 6) | (t1 >>> 26);
- bc3 = (t1 << 6) | (t0 >>> 26);
- t0 = s[26] ^ d6;
- t1 = s[27] ^ d7;
- bc4 = (t0 << 25) | (t1 >>> 7);
- bc5 = (t1 << 25) | (t0 >>> 7);
- t0 = s[28] ^ d8;
- t1 = s[29] ^ d9;
- bc6 = (t0 << 8) | (t1 >>> 24);
- bc7 = (t1 << 8) | (t0 >>> 24);
- s[20] = bc0 ^ (bc4 & ~bc2);
- s[21] = bc1 ^ (bc5 & ~bc3);
- s[22] = bc2 ^ (bc6 & ~bc4);
- s[23] = bc3 ^ (bc7 & ~bc5);
- s[24] = bc4 ^ (bc8 & ~bc6);
- s[25] = bc5 ^ (bc9 & ~bc7);
- s[26] = bc6 ^ (bc0 & ~bc8);
- s[27] = bc7 ^ (bc1 & ~bc9);
- s[28] = bc8 ^ (bc2 & ~bc0);
- s[29] = bc9 ^ (bc3 & ~bc1);
-
- t0 = s[30] ^ d0;
- t1 = s[31] ^ d1;
- bc2 = (t1 << 4) | (t0 >>> 28);
- bc3 = (t0 << 4) | (t1 >>> 28);
- t0 = s[32] ^ d2;
- t1 = s[33] ^ d3;
- bc4 = (t0 << 10) | (t1 >>> 22);
- bc5 = (t1 << 10) | (t0 >>> 22);
- t0 = s[34] ^ d4;
- t1 = s[35] ^ d5;
- bc6 = (t0 << 15) | (t1 >>> 17);
- bc7 = (t1 << 15) | (t0 >>> 17);
- t0 = s[36] ^ d6;
- t1 = s[37] ^ d7;
- bc8 = (t1 << 24) | (t0 >>> 8);
- bc9 = (t0 << 24) | (t1 >>> 8);
- t0 = s[38] ^ d8;
- t1 = s[39] ^ d9;
- bc0 = (t0 << 27) | (t1 >>> 5);
- bc1 = (t1 << 27) | (t0 >>> 5);
- s[30] = bc0 ^ (bc4 & ~bc2);
- s[31] = bc1 ^ (bc5 & ~bc3);
- s[32] = bc2 ^ (bc6 & ~bc4);
- s[33] = bc3 ^ (bc7 & ~bc5);
- s[34] = bc4 ^ (bc8 & ~bc6);
- s[35] = bc5 ^ (bc9 & ~bc7);
- s[36] = bc6 ^ (bc0 & ~bc8);
- s[37] = bc7 ^ (bc1 & ~bc9);
- s[38] = bc8 ^ (bc2 & ~bc0);
- s[39] = bc9 ^ (bc3 & ~bc1);
-
- t0 = s[40] ^ d0;
- t1 = s[41] ^ d1;
- bc6 = (t1 << 9) | (t0 >>> 23);
- bc7 = (t0 << 9) | (t1 >>> 23);
- t0 = s[42] ^ d2;
- t1 = s[43] ^ d3;
- bc8 = (t0 << 2) | (t1 >>> 30);
- bc9 = (t1 << 2) | (t0 >>> 30);
- t0 = s[44] ^ d4;
- t1 = s[45] ^ d5;
- bc0 = (t1 << 30) | (t0 >>> 2);
- bc1 = (t0 << 30) | (t1 >>> 2);
- t0 = s[46] ^ d6;
- t1 = s[47] ^ d7;
- bc2 = (t1 << 23) | (t0 >>> 9);
- bc3 = (t0 << 23) | (t1 >>> 9);
- t0 = s[48] ^ d8;
- t1 = s[49] ^ d9;
- bc4 = (t1 << 7) | (t0 >>> 25);
- bc5 = (t0 << 7) | (t1 >>> 25);
- s[40] = bc0 ^ (bc4 & ~bc2);
- s[41] = bc1 ^ (bc5 & ~bc3);
- s[42] = bc2 ^ (bc6 & ~bc4);
- s[43] = bc3 ^ (bc7 & ~bc5);
- s[44] = bc4 ^ (bc8 & ~bc6);
- s[45] = bc5 ^ (bc9 & ~bc7);
- s[46] = bc6 ^ (bc0 & ~bc8);
- s[47] = bc7 ^ (bc1 & ~bc9);
- s[48] = bc8 ^ (bc2 & ~bc0);
- s[49] = bc9 ^ (bc3 & ~bc1);
- }
-}
diff --git a/std/hash/_sha3/sha3.ts b/std/hash/_sha3/sha3.ts
deleted file mode 100644
index 2966ce2a4..000000000
--- a/std/hash/_sha3/sha3.ts
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-
-import { Sponge } from "./sponge.ts";
-import { keccakf } from "./keccakf.ts";
-
-/** Sha3-224 hash */
-// deno-lint-ignore camelcase
-export class Sha3_224 extends Sponge {
- constructor() {
- super({
- bitsize: 224,
- rate: 144,
- dsbyte: 6,
- permutator: keccakf,
- });
- }
-}
-
-/** Sha3-256 hash */
-// deno-lint-ignore camelcase
-export class Sha3_256 extends Sponge {
- constructor() {
- super({
- bitsize: 256,
- rate: 136,
- dsbyte: 6,
- permutator: keccakf,
- });
- }
-}
-
-/** Sha3-384 hash */
-// deno-lint-ignore camelcase
-export class Sha3_384 extends Sponge {
- constructor() {
- super({
- bitsize: 384,
- rate: 104,
- dsbyte: 6,
- permutator: keccakf,
- });
- }
-}
-
-/** Sha3-512 hash */
-// deno-lint-ignore camelcase
-export class Sha3_512 extends Sponge {
- constructor() {
- super({
- bitsize: 512,
- rate: 72,
- dsbyte: 6,
- permutator: keccakf,
- });
- }
-}
diff --git a/std/hash/_sha3/shake.ts b/std/hash/_sha3/shake.ts
deleted file mode 100644
index 4fe24d7cf..000000000
--- a/std/hash/_sha3/shake.ts
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-
-import { Sponge } from "./sponge.ts";
-import { keccakf } from "./keccakf.ts";
-
-/** Shake128 hash */
-export class Shake128 extends Sponge {
- /**
- * Instantiates a new Shake128 hash
- * @param bitsize length of hash in bits
- */
- constructor(bitsize: number) {
- if (bitsize < 8) {
- throw new Error("shake128: `bitsize` too small");
- }
-
- if (bitsize % 8 !== 0) {
- throw new Error("shake128: `bitsize` must be multiple of 8");
- }
-
- super({
- bitsize: bitsize,
- rate: 168,
- dsbyte: 0x1f,
- permutator: keccakf,
- });
- }
-}
-
-/**
- * Instantiates a new Shake256 hash
- * @param bitsize length of hash in bits
- */
-export class Shake256 extends Sponge {
- constructor(bitsize: number) {
- if (bitsize < 8) {
- throw new Error("shake256: `bitsize` too small");
- }
-
- if (bitsize % 8 !== 0) {
- throw new Error("shake256: `bitsize` must be multiple of 8");
- }
-
- super({
- bitsize: bitsize,
- rate: 136,
- dsbyte: 0x1f,
- permutator: keccakf,
- });
- }
-}
diff --git a/std/hash/_sha3/sponge.ts b/std/hash/_sha3/sponge.ts
deleted file mode 100644
index 9ad67ca07..000000000
--- a/std/hash/_sha3/sponge.ts
+++ /dev/null
@@ -1,111 +0,0 @@
-// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
-
-import * as hex from "../../encoding/hex.ts";
-
-type SpongePermutator = (data: Uint8Array) => void;
-
-/** Sponge construction option */
-export interface SpongeOption {
- bitsize: number;
- rate: number;
- dsbyte: number;
- permutator: SpongePermutator;
-}
-
-export type Message = string | ArrayBuffer;
-
-const STATE_SIZE = 200;
-const TYPE_ERROR_MSG = "sha3: `data` is invalid type";
-
-/** Sponge construction */
-export class Sponge {
- #option: SpongeOption;
- #state: Uint8Array;
- #rp: number;
- #absorbing: boolean;
-
- constructor(option: SpongeOption) {
- this.#option = option;
- this.#state = new Uint8Array(STATE_SIZE);
- this.#rp = 0;
- this.#absorbing = true;
- }
-
- /** Applies padding to internal state */
- private pad(): void {
- this.#state[this.#rp] ^= this.#option.dsbyte;
- this.#state[this.#option.rate - 1] ^= 0x80;
- }
-
- /** Squeezes internal state */
- protected squeeze(length: number): Uint8Array {
- if (length < 0) {
- throw new Error("sha3: length cannot be negative");
- }
-
- this.pad();
-
- const hash = new Uint8Array(length);
- let pos = 0;
- while (length > 0) {
- const r = length > this.#option.rate ? this.#option.rate : length;
- this.#option.permutator(this.#state);
- hash.set(this.#state.slice(0, r), pos);
- length -= r;
- pos += r;
- }
-
- this.#absorbing = false;
- return hash;
- }
-
- /** Updates internal state by absorbing */
- update(data: Message): this {
- if (!this.#absorbing) {
- throw new Error("sha3: cannot update already finalized hash");
- }
-
- let msg: Uint8Array;
-
- if (typeof data === "string") {
- msg = new TextEncoder().encode(data as string);
- } else if (typeof data === "object") {
- if (data instanceof ArrayBuffer || ArrayBuffer.isView(data)) {
- msg = new Uint8Array(data);
- } else {
- throw new Error(TYPE_ERROR_MSG);
- }
- } else {
- throw new Error(TYPE_ERROR_MSG);
- }
-
- let rp = this.#rp;
-
- for (let i = 0; i < msg.length; ++i) {
- this.#state[rp++] ^= msg[i];
- if (rp >= this.#option.rate) {
- this.#option.permutator(this.#state);
- rp = 0;
- }
- }
-
- this.#rp = rp;
- return this;
- }
-
- /** Returns the hash in ArrayBuffer */
- digest(): ArrayBuffer {
- return this.squeeze(this.#option.bitsize >> 3);
- }
-
- /** Returns the hash in given format */
- toString(format: "hex" = "hex"): string {
- const rawOutput = this.squeeze(this.#option.bitsize >> 3);
- switch (format) {
- case "hex":
- return hex.encodeToString(rawOutput);
- default:
- throw new Error("sha3: invalid output format");
- }
- }
-}