export class Blake2b {
-
- /**
- * Buffers and counters
- * - b: input buffer, filled and refilled by input data in 128 byte increments
- * - c: buffer counter, points to current index in `b`
- * - h: chain buffer, updated after each compression
- * - p: set according to BLAKE2 layout from constructor arguments
- * - t: total byte counter, incremented by `c`
- * - Note: BLAKE2b reference supports 2¹²⁸-1, but this implementation restricts to 2⁶⁴-1 for compatibility with WASM without SIMD)
- */
- b: StaticArray<u8> = new StaticArray<u8>(128)
- c: i32 = 0
- h: StaticArray<u64> = new StaticArray<u64>(8)
- p: StaticArray<u8> = new StaticArray<u8>(64)
- t: u64 = 0
-
-
- // COMPRESS
- // Defined in BLAKE2 section 2.4
- compress (isFinal: u64): void {
+ /**
+ * Buffers and counters
+ * - b: input buffer, filled and refilled by input data in 128 byte increments
+ * - c: buffer counter, points to current index in `b`
+ * - h: chain buffer, updated after each compression
+ * - p: set according to BLAKE2 layout from constructor arguments
+ * - t: total byte counter, incremented by `c`
+ * - Note: BLAKE2b reference supports 2¹²⁸-1, but this implementation restricts to 2⁶⁴-1 for compatibility with WASM without SIMD)
+ */
+ b: StaticArray<u8> = new StaticArray<u8>(128)
+ c: u8 = 0
+ h: StaticArray<u64> = new StaticArray<u64>(8)
+ p: StaticArray<u8> = new StaticArray<u8>(64)
+ t: u64 = 0
+
+
+ // COMPRESS
+ // Defined in BLAKE2 section 2.4
+ compress (src: usize, isFinal: u64): void {
// initialize compression buffers
// - m: message buffer, represents current state of `b` during compression
// - v: state vector, set to bytes of `h` and `iv` then modified by `t` during compression
-
- let v0: u64 = this.h[0]
- let v8: u64 = 0x6a09e667f3bcc908
-
- let v1: u64 = this.h[1]
- let v9: u64 = 0xbb67ae8584caa73b
-
- let v2: u64 = this.h[2]
- let v10: u64 = 0x3c6ef372fe94f82b
-
- let v3: u64 = this.h[3]
- let v11: u64 = 0xa54ff53a5f1d36f1
-
- let v4: u64 = this.h[4]
- let v12: u64 = 0x510e527fade682d1
-
- let v5: u64 = this.h[5]
- let v13: u64 = 0x9b05688c2b3e6c1f
-
- let v6: u64 = this.h[6]
- let v14: u64 = 0x1f83d9abfb41bd6b
-
- let v7: u64 = this.h[7]
- let v15: u64 = 0x5be0cd19137e2179
-
+
+ let v0: u64 = this.h[0]
+ let v8: u64 = 0x6a09e667f3bcc908
+
+ let v1: u64 = this.h[1]
+ let v9: u64 = 0xbb67ae8584caa73b
+
+ let v2: u64 = this.h[2]
+ let v10: u64 = 0x3c6ef372fe94f82b
+
+ let v3: u64 = this.h[3]
+ let v11: u64 = 0xa54ff53a5f1d36f1
+
+ let v4: u64 = this.h[4]
+ let v12: u64 = 0x510e527fade682d1
+
+ let v5: u64 = this.h[5]
+ let v13: u64 = 0x9b05688c2b3e6c1f
+
+ let v6: u64 = this.h[6]
+ let v14: u64 = 0x1f83d9abfb41bd6b
+
+ let v7: u64 = this.h[7]
+ let v15: u64 = 0x5be0cd19137e2179
+
// lo 64 bits of counter
v12 ^= this.t
v14 ^= isFinal
// copy input buffer to message block
- const b_ptr = changetype<usize>(this.b)
-
- let m0: u64 = load<u64>(b_ptr + 0)
-
- let m1: u64 = load<u64>(b_ptr + 8)
-
- let m2: u64 = load<u64>(b_ptr + 16)
-
- let m3: u64 = load<u64>(b_ptr + 24)
-
- let m4: u64 = load<u64>(b_ptr + 32)
-
- let m5: u64 = load<u64>(b_ptr + 40)
-
- let m6: u64 = load<u64>(b_ptr + 48)
-
- let m7: u64 = load<u64>(b_ptr + 56)
-
- let m8: u64 = load<u64>(b_ptr + 64)
-
- let m9: u64 = load<u64>(b_ptr + 72)
-
- let m10: u64 = load<u64>(b_ptr + 80)
-
- let m11: u64 = load<u64>(b_ptr + 88)
-
- let m12: u64 = load<u64>(b_ptr + 96)
-
- let m13: u64 = load<u64>(b_ptr + 104)
-
- let m14: u64 = load<u64>(b_ptr + 112)
-
- let m15: u64 = load<u64>(b_ptr + 120)
-
+
+ let m0: u64 = load<u64>(src + 0)
+
+ let m1: u64 = load<u64>(src + 8)
+
+ let m2: u64 = load<u64>(src + 16)
+
+ let m3: u64 = load<u64>(src + 24)
+
+ let m4: u64 = load<u64>(src + 32)
+
+ let m5: u64 = load<u64>(src + 40)
+
+ let m6: u64 = load<u64>(src + 48)
+
+ let m7: u64 = load<u64>(src + 56)
+
+ let m8: u64 = load<u64>(src + 64)
+
+ let m9: u64 = load<u64>(src + 72)
+
+ let m10: u64 = load<u64>(src + 80)
+
+ let m11: u64 = load<u64>(src + 88)
+
+ let m12: u64 = load<u64>(src + 96)
+
+ let m13: u64 = load<u64>(src + 104)
+
+ let m14: u64 = load<u64>(src + 112)
+
+ let m15: u64 = load<u64>(src + 120)
+
// twelve rounds of mixing
-
+
// ROUND 0
-
+
v0 = v0 + v4 + m0
v12 = rotr<u64>(v12 ^ v0, 32)
v8 = v8 + v12
v12 = rotr<u64>(v12 ^ v0, 16)
v8 = v8 + v12
v4 = rotr<u64>(v4 ^ v8, 63)
-
+
v1 = v1 + v5 + m2
v13 = rotr<u64>(v13 ^ v1, 32)
v9 = v9 + v13
v13 = rotr<u64>(v13 ^ v1, 16)
v9 = v9 + v13
v5 = rotr<u64>(v5 ^ v9, 63)
-
+
v2 = v2 + v6 + m4
v14 = rotr<u64>(v14 ^ v2, 32)
v10 = v10 + v14
v14 = rotr<u64>(v14 ^ v2, 16)
v10 = v10 + v14
v6 = rotr<u64>(v6 ^ v10, 63)
-
+
v3 = v3 + v7 + m6
v15 = rotr<u64>(v15 ^ v3, 32)
v11 = v11 + v15
v15 = rotr<u64>(v15 ^ v3, 16)
v11 = v11 + v15
v7 = rotr<u64>(v7 ^ v11, 63)
-
+
v0 = v0 + v5 + m8
v15 = rotr<u64>(v15 ^ v0, 32)
v10 = v10 + v15
v15 = rotr<u64>(v15 ^ v0, 16)
v10 = v10 + v15
v5 = rotr<u64>(v5 ^ v10, 63)
-
+
v1 = v1 + v6 + m10
v12 = rotr<u64>(v12 ^ v1, 32)
v11 = v11 + v12
v12 = rotr<u64>(v12 ^ v1, 16)
v11 = v11 + v12
v6 = rotr<u64>(v6 ^ v11, 63)
-
+
v2 = v2 + v7 + m12
v13 = rotr<u64>(v13 ^ v2, 32)
v8 = v8 + v13
v13 = rotr<u64>(v13 ^ v2, 16)
v8 = v8 + v13
v7 = rotr<u64>(v7 ^ v8, 63)
-
+
v3 = v3 + v4 + m14
v14 = rotr<u64>(v14 ^ v3, 32)
v9 = v9 + v14
v14 = rotr<u64>(v14 ^ v3, 16)
v9 = v9 + v14
v4 = rotr<u64>(v4 ^ v9, 63)
-
+
// ROUND 1
-
+
v0 = v0 + v4 + m14
v12 = rotr<u64>(v12 ^ v0, 32)
v8 = v8 + v12
v12 = rotr<u64>(v12 ^ v0, 16)
v8 = v8 + v12
v4 = rotr<u64>(v4 ^ v8, 63)
-
+
v1 = v1 + v5 + m4
v13 = rotr<u64>(v13 ^ v1, 32)
v9 = v9 + v13
v13 = rotr<u64>(v13 ^ v1, 16)
v9 = v9 + v13
v5 = rotr<u64>(v5 ^ v9, 63)
-
+
v2 = v2 + v6 + m9
v14 = rotr<u64>(v14 ^ v2, 32)
v10 = v10 + v14
v14 = rotr<u64>(v14 ^ v2, 16)
v10 = v10 + v14
v6 = rotr<u64>(v6 ^ v10, 63)
-
+
v3 = v3 + v7 + m13
v15 = rotr<u64>(v15 ^ v3, 32)
v11 = v11 + v15
v15 = rotr<u64>(v15 ^ v3, 16)
v11 = v11 + v15
v7 = rotr<u64>(v7 ^ v11, 63)
-
+
v0 = v0 + v5 + m1
v15 = rotr<u64>(v15 ^ v0, 32)
v10 = v10 + v15
v15 = rotr<u64>(v15 ^ v0, 16)
v10 = v10 + v15
v5 = rotr<u64>(v5 ^ v10, 63)
-
+
v1 = v1 + v6 + m0
v12 = rotr<u64>(v12 ^ v1, 32)
v11 = v11 + v12
v12 = rotr<u64>(v12 ^ v1, 16)
v11 = v11 + v12
v6 = rotr<u64>(v6 ^ v11, 63)
-
+
v2 = v2 + v7 + m11
v13 = rotr<u64>(v13 ^ v2, 32)
v8 = v8 + v13
v13 = rotr<u64>(v13 ^ v2, 16)
v8 = v8 + v13
v7 = rotr<u64>(v7 ^ v8, 63)
-
+
v3 = v3 + v4 + m5
v14 = rotr<u64>(v14 ^ v3, 32)
v9 = v9 + v14
v14 = rotr<u64>(v14 ^ v3, 16)
v9 = v9 + v14
v4 = rotr<u64>(v4 ^ v9, 63)
-
+
// ROUND 2
-
+
v0 = v0 + v4 + m11
v12 = rotr<u64>(v12 ^ v0, 32)
v8 = v8 + v12
v12 = rotr<u64>(v12 ^ v0, 16)
v8 = v8 + v12
v4 = rotr<u64>(v4 ^ v8, 63)
-
+
v1 = v1 + v5 + m12
v13 = rotr<u64>(v13 ^ v1, 32)
v9 = v9 + v13
v13 = rotr<u64>(v13 ^ v1, 16)
v9 = v9 + v13
v5 = rotr<u64>(v5 ^ v9, 63)
-
+
v2 = v2 + v6 + m5
v14 = rotr<u64>(v14 ^ v2, 32)
v10 = v10 + v14
v14 = rotr<u64>(v14 ^ v2, 16)
v10 = v10 + v14
v6 = rotr<u64>(v6 ^ v10, 63)
-
+
v3 = v3 + v7 + m15
v15 = rotr<u64>(v15 ^ v3, 32)
v11 = v11 + v15
v15 = rotr<u64>(v15 ^ v3, 16)
v11 = v11 + v15
v7 = rotr<u64>(v7 ^ v11, 63)
-
+
v0 = v0 + v5 + m10
v15 = rotr<u64>(v15 ^ v0, 32)
v10 = v10 + v15
v15 = rotr<u64>(v15 ^ v0, 16)
v10 = v10 + v15
v5 = rotr<u64>(v5 ^ v10, 63)
-
+
v1 = v1 + v6 + m3
v12 = rotr<u64>(v12 ^ v1, 32)
v11 = v11 + v12
v12 = rotr<u64>(v12 ^ v1, 16)
v11 = v11 + v12
v6 = rotr<u64>(v6 ^ v11, 63)
-
+
v2 = v2 + v7 + m7
v13 = rotr<u64>(v13 ^ v2, 32)
v8 = v8 + v13
v13 = rotr<u64>(v13 ^ v2, 16)
v8 = v8 + v13
v7 = rotr<u64>(v7 ^ v8, 63)
-
+
v3 = v3 + v4 + m9
v14 = rotr<u64>(v14 ^ v3, 32)
v9 = v9 + v14
v14 = rotr<u64>(v14 ^ v3, 16)
v9 = v9 + v14
v4 = rotr<u64>(v4 ^ v9, 63)
-
+
// ROUND 3
-
+
v0 = v0 + v4 + m7
v12 = rotr<u64>(v12 ^ v0, 32)
v8 = v8 + v12
v12 = rotr<u64>(v12 ^ v0, 16)
v8 = v8 + v12
v4 = rotr<u64>(v4 ^ v8, 63)
-
+
v1 = v1 + v5 + m3
v13 = rotr<u64>(v13 ^ v1, 32)
v9 = v9 + v13
v13 = rotr<u64>(v13 ^ v1, 16)
v9 = v9 + v13
v5 = rotr<u64>(v5 ^ v9, 63)
-
+
v2 = v2 + v6 + m13
v14 = rotr<u64>(v14 ^ v2, 32)
v10 = v10 + v14
v14 = rotr<u64>(v14 ^ v2, 16)
v10 = v10 + v14
v6 = rotr<u64>(v6 ^ v10, 63)
-
+
v3 = v3 + v7 + m11
v15 = rotr<u64>(v15 ^ v3, 32)
v11 = v11 + v15
v15 = rotr<u64>(v15 ^ v3, 16)
v11 = v11 + v15
v7 = rotr<u64>(v7 ^ v11, 63)
-
+
v0 = v0 + v5 + m2
v15 = rotr<u64>(v15 ^ v0, 32)
v10 = v10 + v15
v15 = rotr<u64>(v15 ^ v0, 16)
v10 = v10 + v15
v5 = rotr<u64>(v5 ^ v10, 63)
-
+
v1 = v1 + v6 + m5
v12 = rotr<u64>(v12 ^ v1, 32)
v11 = v11 + v12
v12 = rotr<u64>(v12 ^ v1, 16)
v11 = v11 + v12
v6 = rotr<u64>(v6 ^ v11, 63)
-
+
v2 = v2 + v7 + m4
v13 = rotr<u64>(v13 ^ v2, 32)
v8 = v8 + v13
v13 = rotr<u64>(v13 ^ v2, 16)
v8 = v8 + v13
v7 = rotr<u64>(v7 ^ v8, 63)
-
+
v3 = v3 + v4 + m15
v14 = rotr<u64>(v14 ^ v3, 32)
v9 = v9 + v14
v14 = rotr<u64>(v14 ^ v3, 16)
v9 = v9 + v14
v4 = rotr<u64>(v4 ^ v9, 63)
-
+
// ROUND 4
-
+
v0 = v0 + v4 + m9
v12 = rotr<u64>(v12 ^ v0, 32)
v8 = v8 + v12
v12 = rotr<u64>(v12 ^ v0, 16)
v8 = v8 + v12
v4 = rotr<u64>(v4 ^ v8, 63)
-
+
v1 = v1 + v5 + m5
v13 = rotr<u64>(v13 ^ v1, 32)
v9 = v9 + v13
v13 = rotr<u64>(v13 ^ v1, 16)
v9 = v9 + v13
v5 = rotr<u64>(v5 ^ v9, 63)
-
+
v2 = v2 + v6 + m2
v14 = rotr<u64>(v14 ^ v2, 32)
v10 = v10 + v14
v14 = rotr<u64>(v14 ^ v2, 16)
v10 = v10 + v14
v6 = rotr<u64>(v6 ^ v10, 63)
-
+
v3 = v3 + v7 + m10
v15 = rotr<u64>(v15 ^ v3, 32)
v11 = v11 + v15
v15 = rotr<u64>(v15 ^ v3, 16)
v11 = v11 + v15
v7 = rotr<u64>(v7 ^ v11, 63)
-
+
v0 = v0 + v5 + m14
v15 = rotr<u64>(v15 ^ v0, 32)
v10 = v10 + v15
v15 = rotr<u64>(v15 ^ v0, 16)
v10 = v10 + v15
v5 = rotr<u64>(v5 ^ v10, 63)
-
+
v1 = v1 + v6 + m11
v12 = rotr<u64>(v12 ^ v1, 32)
v11 = v11 + v12
v12 = rotr<u64>(v12 ^ v1, 16)
v11 = v11 + v12
v6 = rotr<u64>(v6 ^ v11, 63)
-
+
v2 = v2 + v7 + m6
v13 = rotr<u64>(v13 ^ v2, 32)
v8 = v8 + v13
v13 = rotr<u64>(v13 ^ v2, 16)
v8 = v8 + v13
v7 = rotr<u64>(v7 ^ v8, 63)
-
+
v3 = v3 + v4 + m3
v14 = rotr<u64>(v14 ^ v3, 32)
v9 = v9 + v14
v14 = rotr<u64>(v14 ^ v3, 16)
v9 = v9 + v14
v4 = rotr<u64>(v4 ^ v9, 63)
-
+
// ROUND 5
-
+
v0 = v0 + v4 + m2
v12 = rotr<u64>(v12 ^ v0, 32)
v8 = v8 + v12
v12 = rotr<u64>(v12 ^ v0, 16)
v8 = v8 + v12
v4 = rotr<u64>(v4 ^ v8, 63)
-
+
v1 = v1 + v5 + m6
v13 = rotr<u64>(v13 ^ v1, 32)
v9 = v9 + v13
v13 = rotr<u64>(v13 ^ v1, 16)
v9 = v9 + v13
v5 = rotr<u64>(v5 ^ v9, 63)
-
+
v2 = v2 + v6 + m0
v14 = rotr<u64>(v14 ^ v2, 32)
v10 = v10 + v14
v14 = rotr<u64>(v14 ^ v2, 16)
v10 = v10 + v14
v6 = rotr<u64>(v6 ^ v10, 63)
-
+
v3 = v3 + v7 + m8
v15 = rotr<u64>(v15 ^ v3, 32)
v11 = v11 + v15
v15 = rotr<u64>(v15 ^ v3, 16)
v11 = v11 + v15
v7 = rotr<u64>(v7 ^ v11, 63)
-
+
v0 = v0 + v5 + m4
v15 = rotr<u64>(v15 ^ v0, 32)
v10 = v10 + v15
v15 = rotr<u64>(v15 ^ v0, 16)
v10 = v10 + v15
v5 = rotr<u64>(v5 ^ v10, 63)
-
+
v1 = v1 + v6 + m7
v12 = rotr<u64>(v12 ^ v1, 32)
v11 = v11 + v12
v12 = rotr<u64>(v12 ^ v1, 16)
v11 = v11 + v12
v6 = rotr<u64>(v6 ^ v11, 63)
-
+
v2 = v2 + v7 + m15
v13 = rotr<u64>(v13 ^ v2, 32)
v8 = v8 + v13
v13 = rotr<u64>(v13 ^ v2, 16)
v8 = v8 + v13
v7 = rotr<u64>(v7 ^ v8, 63)
-
+
v3 = v3 + v4 + m1
v14 = rotr<u64>(v14 ^ v3, 32)
v9 = v9 + v14
v14 = rotr<u64>(v14 ^ v3, 16)
v9 = v9 + v14
v4 = rotr<u64>(v4 ^ v9, 63)
-
+
// ROUND 6
-
+
v0 = v0 + v4 + m12
v12 = rotr<u64>(v12 ^ v0, 32)
v8 = v8 + v12
v12 = rotr<u64>(v12 ^ v0, 16)
v8 = v8 + v12
v4 = rotr<u64>(v4 ^ v8, 63)
-
+
v1 = v1 + v5 + m1
v13 = rotr<u64>(v13 ^ v1, 32)
v9 = v9 + v13
v13 = rotr<u64>(v13 ^ v1, 16)
v9 = v9 + v13
v5 = rotr<u64>(v5 ^ v9, 63)
-
+
v2 = v2 + v6 + m14
v14 = rotr<u64>(v14 ^ v2, 32)
v10 = v10 + v14
v14 = rotr<u64>(v14 ^ v2, 16)
v10 = v10 + v14
v6 = rotr<u64>(v6 ^ v10, 63)
-
+
v3 = v3 + v7 + m4
v15 = rotr<u64>(v15 ^ v3, 32)
v11 = v11 + v15
v15 = rotr<u64>(v15 ^ v3, 16)
v11 = v11 + v15
v7 = rotr<u64>(v7 ^ v11, 63)
-
+
v0 = v0 + v5 + m0
v15 = rotr<u64>(v15 ^ v0, 32)
v10 = v10 + v15
v15 = rotr<u64>(v15 ^ v0, 16)
v10 = v10 + v15
v5 = rotr<u64>(v5 ^ v10, 63)
-
+
v1 = v1 + v6 + m6
v12 = rotr<u64>(v12 ^ v1, 32)
v11 = v11 + v12
v12 = rotr<u64>(v12 ^ v1, 16)
v11 = v11 + v12
v6 = rotr<u64>(v6 ^ v11, 63)
-
+
v2 = v2 + v7 + m9
v13 = rotr<u64>(v13 ^ v2, 32)
v8 = v8 + v13
v13 = rotr<u64>(v13 ^ v2, 16)
v8 = v8 + v13
v7 = rotr<u64>(v7 ^ v8, 63)
-
+
v3 = v3 + v4 + m8
v14 = rotr<u64>(v14 ^ v3, 32)
v9 = v9 + v14
v14 = rotr<u64>(v14 ^ v3, 16)
v9 = v9 + v14
v4 = rotr<u64>(v4 ^ v9, 63)
-
+
// ROUND 7
-
+
v0 = v0 + v4 + m13
v12 = rotr<u64>(v12 ^ v0, 32)
v8 = v8 + v12
v12 = rotr<u64>(v12 ^ v0, 16)
v8 = v8 + v12
v4 = rotr<u64>(v4 ^ v8, 63)
-
+
v1 = v1 + v5 + m7
v13 = rotr<u64>(v13 ^ v1, 32)
v9 = v9 + v13
v13 = rotr<u64>(v13 ^ v1, 16)
v9 = v9 + v13
v5 = rotr<u64>(v5 ^ v9, 63)
-
+
v2 = v2 + v6 + m12
v14 = rotr<u64>(v14 ^ v2, 32)
v10 = v10 + v14
v14 = rotr<u64>(v14 ^ v2, 16)
v10 = v10 + v14
v6 = rotr<u64>(v6 ^ v10, 63)
-
+
v3 = v3 + v7 + m3
v15 = rotr<u64>(v15 ^ v3, 32)
v11 = v11 + v15
v15 = rotr<u64>(v15 ^ v3, 16)
v11 = v11 + v15
v7 = rotr<u64>(v7 ^ v11, 63)
-
+
v0 = v0 + v5 + m5
v15 = rotr<u64>(v15 ^ v0, 32)
v10 = v10 + v15
v15 = rotr<u64>(v15 ^ v0, 16)
v10 = v10 + v15
v5 = rotr<u64>(v5 ^ v10, 63)
-
+
v1 = v1 + v6 + m15
v12 = rotr<u64>(v12 ^ v1, 32)
v11 = v11 + v12
v12 = rotr<u64>(v12 ^ v1, 16)
v11 = v11 + v12
v6 = rotr<u64>(v6 ^ v11, 63)
-
+
v2 = v2 + v7 + m8
v13 = rotr<u64>(v13 ^ v2, 32)
v8 = v8 + v13
v13 = rotr<u64>(v13 ^ v2, 16)
v8 = v8 + v13
v7 = rotr<u64>(v7 ^ v8, 63)
-
+
v3 = v3 + v4 + m2
v14 = rotr<u64>(v14 ^ v3, 32)
v9 = v9 + v14
v14 = rotr<u64>(v14 ^ v3, 16)
v9 = v9 + v14
v4 = rotr<u64>(v4 ^ v9, 63)
-
+
// ROUND 8
-
+
v0 = v0 + v4 + m6
v12 = rotr<u64>(v12 ^ v0, 32)
v8 = v8 + v12
v12 = rotr<u64>(v12 ^ v0, 16)
v8 = v8 + v12
v4 = rotr<u64>(v4 ^ v8, 63)
-
+
v1 = v1 + v5 + m14
v13 = rotr<u64>(v13 ^ v1, 32)
v9 = v9 + v13
v13 = rotr<u64>(v13 ^ v1, 16)
v9 = v9 + v13
v5 = rotr<u64>(v5 ^ v9, 63)
-
+
v2 = v2 + v6 + m11
v14 = rotr<u64>(v14 ^ v2, 32)
v10 = v10 + v14
v14 = rotr<u64>(v14 ^ v2, 16)
v10 = v10 + v14
v6 = rotr<u64>(v6 ^ v10, 63)
-
+
v3 = v3 + v7 + m0
v15 = rotr<u64>(v15 ^ v3, 32)
v11 = v11 + v15
v15 = rotr<u64>(v15 ^ v3, 16)
v11 = v11 + v15
v7 = rotr<u64>(v7 ^ v11, 63)
-
+
v0 = v0 + v5 + m12
v15 = rotr<u64>(v15 ^ v0, 32)
v10 = v10 + v15
v15 = rotr<u64>(v15 ^ v0, 16)
v10 = v10 + v15
v5 = rotr<u64>(v5 ^ v10, 63)
-
+
v1 = v1 + v6 + m13
v12 = rotr<u64>(v12 ^ v1, 32)
v11 = v11 + v12
v12 = rotr<u64>(v12 ^ v1, 16)
v11 = v11 + v12
v6 = rotr<u64>(v6 ^ v11, 63)
-
+
v2 = v2 + v7 + m1
v13 = rotr<u64>(v13 ^ v2, 32)
v8 = v8 + v13
v13 = rotr<u64>(v13 ^ v2, 16)
v8 = v8 + v13
v7 = rotr<u64>(v7 ^ v8, 63)
-
+
v3 = v3 + v4 + m10
v14 = rotr<u64>(v14 ^ v3, 32)
v9 = v9 + v14
v14 = rotr<u64>(v14 ^ v3, 16)
v9 = v9 + v14
v4 = rotr<u64>(v4 ^ v9, 63)
-
+
// ROUND 9
-
+
v0 = v0 + v4 + m10
v12 = rotr<u64>(v12 ^ v0, 32)
v8 = v8 + v12
v12 = rotr<u64>(v12 ^ v0, 16)
v8 = v8 + v12
v4 = rotr<u64>(v4 ^ v8, 63)
-
+
v1 = v1 + v5 + m8
v13 = rotr<u64>(v13 ^ v1, 32)
v9 = v9 + v13
v13 = rotr<u64>(v13 ^ v1, 16)
v9 = v9 + v13
v5 = rotr<u64>(v5 ^ v9, 63)
-
+
v2 = v2 + v6 + m7
v14 = rotr<u64>(v14 ^ v2, 32)
v10 = v10 + v14
v14 = rotr<u64>(v14 ^ v2, 16)
v10 = v10 + v14
v6 = rotr<u64>(v6 ^ v10, 63)
-
+
v3 = v3 + v7 + m1
v15 = rotr<u64>(v15 ^ v3, 32)
v11 = v11 + v15
v15 = rotr<u64>(v15 ^ v3, 16)
v11 = v11 + v15
v7 = rotr<u64>(v7 ^ v11, 63)
-
+
v0 = v0 + v5 + m15
v15 = rotr<u64>(v15 ^ v0, 32)
v10 = v10 + v15
v15 = rotr<u64>(v15 ^ v0, 16)
v10 = v10 + v15
v5 = rotr<u64>(v5 ^ v10, 63)
-
+
v1 = v1 + v6 + m9
v12 = rotr<u64>(v12 ^ v1, 32)
v11 = v11 + v12
v12 = rotr<u64>(v12 ^ v1, 16)
v11 = v11 + v12
v6 = rotr<u64>(v6 ^ v11, 63)
-
+
v2 = v2 + v7 + m3
v13 = rotr<u64>(v13 ^ v2, 32)
v8 = v8 + v13
v13 = rotr<u64>(v13 ^ v2, 16)
v8 = v8 + v13
v7 = rotr<u64>(v7 ^ v8, 63)
-
+
v3 = v3 + v4 + m13
v14 = rotr<u64>(v14 ^ v3, 32)
v9 = v9 + v14
v14 = rotr<u64>(v14 ^ v3, 16)
v9 = v9 + v14
v4 = rotr<u64>(v4 ^ v9, 63)
-
+
// ROUND 10
-
+
v0 = v0 + v4 + m0
v12 = rotr<u64>(v12 ^ v0, 32)
v8 = v8 + v12
v12 = rotr<u64>(v12 ^ v0, 16)
v8 = v8 + v12
v4 = rotr<u64>(v4 ^ v8, 63)
-
+
v1 = v1 + v5 + m2
v13 = rotr<u64>(v13 ^ v1, 32)
v9 = v9 + v13
v13 = rotr<u64>(v13 ^ v1, 16)
v9 = v9 + v13
v5 = rotr<u64>(v5 ^ v9, 63)
-
+
v2 = v2 + v6 + m4
v14 = rotr<u64>(v14 ^ v2, 32)
v10 = v10 + v14
v14 = rotr<u64>(v14 ^ v2, 16)
v10 = v10 + v14
v6 = rotr<u64>(v6 ^ v10, 63)
-
+
v3 = v3 + v7 + m6
v15 = rotr<u64>(v15 ^ v3, 32)
v11 = v11 + v15
v15 = rotr<u64>(v15 ^ v3, 16)
v11 = v11 + v15
v7 = rotr<u64>(v7 ^ v11, 63)
-
+
v0 = v0 + v5 + m8
v15 = rotr<u64>(v15 ^ v0, 32)
v10 = v10 + v15
v15 = rotr<u64>(v15 ^ v0, 16)
v10 = v10 + v15
v5 = rotr<u64>(v5 ^ v10, 63)
-
+
v1 = v1 + v6 + m10
v12 = rotr<u64>(v12 ^ v1, 32)
v11 = v11 + v12
v12 = rotr<u64>(v12 ^ v1, 16)
v11 = v11 + v12
v6 = rotr<u64>(v6 ^ v11, 63)
-
+
v2 = v2 + v7 + m12
v13 = rotr<u64>(v13 ^ v2, 32)
v8 = v8 + v13
v13 = rotr<u64>(v13 ^ v2, 16)
v8 = v8 + v13
v7 = rotr<u64>(v7 ^ v8, 63)
-
+
v3 = v3 + v4 + m14
v14 = rotr<u64>(v14 ^ v3, 32)
v9 = v9 + v14
v14 = rotr<u64>(v14 ^ v3, 16)
v9 = v9 + v14
v4 = rotr<u64>(v4 ^ v9, 63)
-
+
// ROUND 11
-
+
v0 = v0 + v4 + m14
v12 = rotr<u64>(v12 ^ v0, 32)
v8 = v8 + v12
v12 = rotr<u64>(v12 ^ v0, 16)
v8 = v8 + v12
v4 = rotr<u64>(v4 ^ v8, 63)
-
+
v1 = v1 + v5 + m4
v13 = rotr<u64>(v13 ^ v1, 32)
v9 = v9 + v13
v13 = rotr<u64>(v13 ^ v1, 16)
v9 = v9 + v13
v5 = rotr<u64>(v5 ^ v9, 63)
-
+
v2 = v2 + v6 + m9
v14 = rotr<u64>(v14 ^ v2, 32)
v10 = v10 + v14
v14 = rotr<u64>(v14 ^ v2, 16)
v10 = v10 + v14
v6 = rotr<u64>(v6 ^ v10, 63)
-
+
v3 = v3 + v7 + m13
v15 = rotr<u64>(v15 ^ v3, 32)
v11 = v11 + v15
v15 = rotr<u64>(v15 ^ v3, 16)
v11 = v11 + v15
v7 = rotr<u64>(v7 ^ v11, 63)
-
+
v0 = v0 + v5 + m1
v15 = rotr<u64>(v15 ^ v0, 32)
v10 = v10 + v15
v15 = rotr<u64>(v15 ^ v0, 16)
v10 = v10 + v15
v5 = rotr<u64>(v5 ^ v10, 63)
-
+
v1 = v1 + v6 + m0
v12 = rotr<u64>(v12 ^ v1, 32)
v11 = v11 + v12
v12 = rotr<u64>(v12 ^ v1, 16)
v11 = v11 + v12
v6 = rotr<u64>(v6 ^ v11, 63)
-
+
v2 = v2 + v7 + m11
v13 = rotr<u64>(v13 ^ v2, 32)
v8 = v8 + v13
v13 = rotr<u64>(v13 ^ v2, 16)
v8 = v8 + v13
v7 = rotr<u64>(v7 ^ v8, 63)
-
+
v3 = v3 + v4 + m5
v14 = rotr<u64>(v14 ^ v3, 32)
v9 = v9 + v14
v14 = rotr<u64>(v14 ^ v3, 16)
v9 = v9 + v14
v4 = rotr<u64>(v4 ^ v9, 63)
-
+
// set new chain value
-
- this.h[0] ^= v0 ^ v8
-
- this.h[1] ^= v1 ^ v9
-
- this.h[2] ^= v2 ^ v10
-
- this.h[3] ^= v3 ^ v11
-
- this.h[4] ^= v4 ^ v12
-
- this.h[5] ^= v5 ^ v13
-
- this.h[6] ^= v6 ^ v14
-
- this.h[7] ^= v7 ^ v15
-
- }
-
-
-
- init(): Blake2b {
- // reset buffers and counters
-
+ this.h[0] ^= v0 ^ v8
+
+ this.h[1] ^= v1 ^ v9
+
+ this.h[2] ^= v2 ^ v10
+
+ this.h[3] ^= v3 ^ v11
+
+ this.h[4] ^= v4 ^ v12
+
+ this.h[5] ^= v5 ^ v13
+
+ this.h[6] ^= v6 ^ v14
+
+ this.h[7] ^= v7 ^ v15
+
+ }
+
+
+
+ init (): Blake2b {
+ // reset buffers and counters
+
this.b.fill(0)
this.c = 0
this.h.fill(0)
this.p.fill(0)
this.t = 0
-
-
- // initialize parameter block
- this.p[0] = 64 // always 64 bytes for this implementation
- this.p[1] = 0 // no key
- this.p[2] = 1 // fanout
- this.p[3] = 1 // depth
-
+
+
+ // initialize parameter block
+ this.p[0] = 64 // always 64 bytes for this implementation
+ this.p[1] = 0 // no key
+ this.p[2] = 1 // fanout
+ this.p[3] = 1 // depth
+
// initialize hash state
-
- this.h[0] = 0x6a09e667f3bcc908
-
- this.h[1] = 0xbb67ae8584caa73b
-
- this.h[2] = 0x3c6ef372fe94f82b
-
- this.h[3] = 0xa54ff53a5f1d36f1
-
- this.h[4] = 0x510e527fade682d1
-
- this.h[5] = 0x9b05688c2b3e6c1f
-
- this.h[6] = 0x1f83d9abfb41bd6b
-
- this.h[7] = 0x5be0cd19137e2179
-
+
+ this.h[0] = 0x6a09e667f3bcc908
+
+ this.h[1] = 0xbb67ae8584caa73b
+
+ this.h[2] = 0x3c6ef372fe94f82b
+
+ this.h[3] = 0xa54ff53a5f1d36f1
+
+ this.h[4] = 0x510e527fade682d1
+
+ this.h[5] = 0x9b05688c2b3e6c1f
+
+ this.h[6] = 0x1f83d9abfb41bd6b
+
+ this.h[7] = 0x5be0cd19137e2179
+
for (let i = 0; i < 8; i++) {
this.h[i] ^= load<u64>(changetype<usize>(this.p) + (i << 3))
}
return this
}
-
// input: variable-length message bytes passed by user to be hashed
update (input: StaticArray<u8>, length: i32): Blake2b {
const input_ptr: usize = changetype<usize>(input)
const b_ptr: usize = changetype<usize>(this.b)
+ let i = 0
- let i = 0;
- while (i < length) {
-
- // is buffer full?
- if (this.c === 128) {
-
- // increment total byte counter
+ // fill existing partial buffer
+ if (this.c > 0) {
+ const b_rem = 128 - this.c
+ const l_rem = length - i
+ const gap = u8(b_rem < l_rem ? b_rem : l_rem)
+ memory.copy(b_ptr + this.c, input_ptr + i, gap)
+ this.c += gap
+ i += gap
+ if (this.c === 128 && i < length) {
this.t += 128
-
- // reset buffer counter to zero
this.c = 0
-
- // compress (not final)
- this.compress(0)
-
- } else {
- const b_rem = 128 - this.c
- const l_rem = length - i
- const n = b_rem < l_rem ? b_rem : l_rem
- memory.copy(b_ptr + this.c, input_ptr + i, n)
- this.c += n
- i += n
+ this.compress(b_ptr, 0)
}
}
+
+ // compress full blocks
+ while (length - i > 128) {
+ this.t += 128
+ this.compress(input_ptr + i, 0)
+ i += 128
+ }
+
+ // store remaining partial block for further `update()` or `digest()`
+ memory.copy(b_ptr + this.c, input_ptr + i, u8(length - i))
+ this.c += u8(length - i)
+
return this
}
this.b.fill(0, this.c)
// set final block flag and compress
- this.compress(u64(0 - 1))
+ this.compress(changetype<usize>(this.b), 0xffffffffffffffff)
// return byte array of 64-byte chain buffer
memory.copy(changetype<usize>(output), changetype<usize>(this.h), 64)
// clear internal buffers and counters
-
+
this.b.fill(0)
this.c = 0
this.h.fill(0)
this.p.fill(0)
this.t = 0
-
+
}
}