commit 771a3f767d6591f80d51557203d34971f8233ac4 Author: Mathias Buus Date: Thu Jun 8 17:59:29 2017 +0200 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d1c1dbe --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +bundle.js diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..56fce08 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017 Mathias Buus + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..b6097c8 --- /dev/null +++ b/README.md @@ -0,0 +1,65 @@ +# blake2b-wasm + +Blake2b implemented in WASM + +``` +npm install blake2b-wasm +``` + +Works in browsers that support WASM and Node.js 8+. + +## Usage + +``` js +var blake2b = require('blake2b-wasm') + +if (!blake2b.SUPPORTED) { + console.log('WebAssembly not supported by your runtime') +} + +blake2b.ready(function (err) { + if (err) throw err + + var hash = blake2b() + .update(new Buffer('hello')) // pass in a buffer or uint8array + .update(new Buffer(' ')) + .update(new Buffer('world')) + .digest('hex') + + console.log('Blake2b hash of "hello world" is %s', hash) +}) +``` + +## API + +#### `var hash = blake2b()` + +Create a new hash instance + +#### `hash.update(data)` + +Update the hash with a new piece of data. `data` should be a buffer or uint8array. + +#### `var digest = hash.digest([enc])` + +Digest the hash. + +## Browser demo + +There is a browser example included in [example.html](example.html) and [example.js](example.js). + +## Contributing + +The bulk of this module is implemented in WebAssembly in the [blake2b.wat](blake2b.wat) file. +The format of this file is S-Expressions that can be compiled to their binary WASM representation by doing + +``` +# also available as `npm run compile` +wast2wasm blake2b.wat -o blake2b.wasm +``` + +If you do not have `wast2wasm` installed follow the instructions here, https://github.com/WebAssembly/wabt + +## License + +MIT diff --git a/blake2b.wasm b/blake2b.wasm new file mode 100644 index 0000000..d847981 Binary files /dev/null and b/blake2b.wasm differ diff --git a/blake2b.wat b/blake2b.wat new file mode 100644 index 0000000..5ef36be --- /dev/null +++ b/blake2b.wat @@ -0,0 +1,2830 @@ +(module + ;; 0-64 reserved for param block + (memory (export "memory") 10 1000) + + (func (export "blake2b_init") (param $ptr i32) (param $outlen i32) + ;; setup param block (expect memory to be cleared) + + ;; 1 byte outlen. + (i32.store8 (i32.const 0) (get_local $outlen)) + + ;; 1 byte keylen. + (i32.store8 (i32.const 1) (i32.const 0)) + + ;; 1 byte fanout. + (i32.store8 (i32.const 2) (i32.const 1)) + + ;; 1 byte depth. + (i32.store8 (i32.const 3) (i32.const 1)) + + ;; init the hash + + ;; b array: 0-128 + + ;; h array: 128-192, (8 * i64) + ;; TODO: support xor against param block and stuff, for now just xor against length + + (i64.store (i32.add (get_local $ptr) (i32.const 128)) (i64.xor (i64.const 0x6a09e667f3bcc908) (i64.load (i32.const 0)))) + (i64.store (i32.add (get_local $ptr) (i32.const 136)) (i64.const 0xbb67ae8584caa73b)) + (i64.store (i32.add (get_local $ptr) (i32.const 144)) (i64.const 0x3c6ef372fe94f82b)) + (i64.store (i32.add (get_local $ptr) (i32.const 152)) (i64.const 0xa54ff53a5f1d36f1)) + (i64.store (i32.add (get_local $ptr) (i32.const 160)) (i64.const 0x510e527fade682d1)) + (i64.store (i32.add (get_local $ptr) (i32.const 168)) (i64.const 0x9b05688c2b3e6c1f)) + (i64.store (i32.add (get_local $ptr) (i32.const 176)) (i64.const 0x1f83d9abfb41bd6b)) + (i64.store (i32.add (get_local $ptr) (i32.const 184)) (i64.const 0x5be0cd19137e2179)) + + ;; t int.64: 192-200 + (i64.store (i32.add (get_local $ptr) (i32.const 192)) (i64.const 0)) + + ;; c int.64: 200-208 + (i64.store (i32.add (get_local $ptr) (i32.const 200)) (i64.const 0)) + + ;; f int.64: 208-216 + (i64.store (i32.add (get_local $ptr) (i32.const 208)) (i64.const 0)) + ) + + (func (export "blake2b_update") (param $ctx i32) (param $input i32) (param $input_end i32) + (local $t i32) + (local $c i32) + (local $i i32) + + ;; load ctx.t, ctx.c + (set_local $t (i32.add (get_local $ctx) (i32.const 192))) + (set_local $c (i32.add (get_local $ctx) (i32.const 200))) + + ;; i = ctx.c + (set_local $i (i32.wrap/i64 (i64.load (get_local $c)))) + + (block $end + (loop $start + (br_if $end (i32.eq (get_local $input) (get_local $input_end))) + + (if (i32.eq (get_local $i) (i32.const 128)) + (then + (i64.store (get_local $t) (i64.add (i64.load (get_local $t)) (i64.extend_u/i32 (get_local $i)))) + (set_local $i (i32.const 0)) + get_local $ctx + call $blake2b_compress + ) + ) + + (i32.store8 (i32.add (get_local $ctx) (get_local $i)) (i32.load8_u (get_local $input))) + (set_local $i (i32.add (get_local $i) (i32.const 1))) + (set_local $input (i32.add (get_local $input) (i32.const 1))) + + (br $start) + ) + ) + + (i64.store (get_local $c) (i64.extend_u/i32 (get_local $i))) + ) + + (func (export "blake2b_final") (param $ctx i32) + (local $t i32) + (local $c i32) + (local $i i32) + + ;; load ctx.t, ctx.c + (set_local $t (i32.add (get_local $ctx) (i32.const 192))) + (set_local $c (i32.add (get_local $ctx) (i32.const 200))) + + ;; ctx.t += ctx.c + (i64.store (get_local $t) (i64.add (i64.load (get_local $t)) (i64.load (get_local $c)))) + + ;; set ctx.f to last_block + (i64.store (i32.add (get_local $ctx) (i32.const 208)) (i64.const 0xffffffffffffffff)) + + ;; i = ctx.c + (set_local $i (i32.wrap/i64 (i64.load (get_local $c)))) + + ;; zero out remaining, i..128 + (block $end + (loop $start + (br_if $end (i32.eq (get_local $i) (i32.const 128))) + (i32.store8 (i32.add (get_local $ctx) (get_local $i)) (i32.const 0)) + (set_local $i (i32.add (get_local $i) (i32.const 1))) + (br $start) + ) + ) + + ;; ctx.c = i (for good meassure) + (i64.store (get_local $c) (i64.extend_u/i32 (get_local $i))) + + get_local $ctx + call $blake2b_compress + ) + + (func $blake2b_compress (export "blake2b_compress") (param $ctx i32) + (local $v0 i64) + (local $v1 i64) + (local $v2 i64) + (local $v3 i64) + (local $v4 i64) + (local $v5 i64) + (local $v6 i64) + (local $v7 i64) + (local $v8 i64) + (local $v9 i64) + (local $v10 i64) + (local $v11 i64) + (local $v12 i64) + (local $v13 i64) + (local $v14 i64) + (local $v15 i64) + + (local $m0 i64) + (local $m1 i64) + (local $m2 i64) + (local $m3 i64) + (local $m4 i64) + (local $m5 i64) + (local $m6 i64) + (local $m7 i64) + (local $m8 i64) + (local $m9 i64) + (local $m10 i64) + (local $m11 i64) + (local $m12 i64) + (local $m13 i64) + (local $m14 i64) + (local $m15 i64) + + (local $h0 i32) + (local $h1 i32) + (local $h2 i32) + (local $h3 i32) + (local $h4 i32) + (local $h5 i32) + (local $h6 i32) + (local $h7 i32) + (local $h8 i32) + + ;; set h ptrs + (set_local $h0 (i32.add (get_local $ctx) (i32.const 128))) + (set_local $h1 (i32.add (get_local $ctx) (i32.const 136))) + (set_local $h2 (i32.add (get_local $ctx) (i32.const 144))) + (set_local $h3 (i32.add (get_local $ctx) (i32.const 152))) + (set_local $h4 (i32.add (get_local $ctx) (i32.const 160))) + (set_local $h5 (i32.add (get_local $ctx) (i32.const 168))) + (set_local $h6 (i32.add (get_local $ctx) (i32.const 176))) + (set_local $h7 (i32.add (get_local $ctx) (i32.const 184))) + + ;; set v[0-8] to ctx.h[0-8] + (set_local $v0 (i64.load (get_local $h0))) + (set_local $v1 (i64.load (get_local $h1))) + (set_local $v2 (i64.load (get_local $h2))) + (set_local $v3 (i64.load (get_local $h3))) + (set_local $v4 (i64.load (get_local $h4))) + (set_local $v5 (i64.load (get_local $h5))) + (set_local $v6 (i64.load (get_local $h6))) + (set_local $v7 (i64.load (get_local $h7))) + + ;; set v[8-16] to init vectors + (set_local $v8 (i64.const 0x6a09e667f3bcc908)) + (set_local $v9 (i64.const 0xbb67ae8584caa73b)) + (set_local $v10 (i64.const 0x3c6ef372fe94f82b)) + (set_local $v11 (i64.const 0xa54ff53a5f1d36f1)) + (set_local $v12 (i64.const 0x510e527fade682d1)) + (set_local $v13 (i64.const 0x9b05688c2b3e6c1f)) + (set_local $v14 (i64.const 0x1f83d9abfb41bd6b)) + (set_local $v15 (i64.const 0x5be0cd19137e2179)) + + ;; set m[0-16] to ctx[0-128] + (set_local $m0 (i64.load (get_local $ctx))) + (set_local $m1 (i64.load (i32.add (get_local $ctx) (i32.const 8)))) + (set_local $m2 (i64.load (i32.add (get_local $ctx) (i32.const 16)))) + (set_local $m3 (i64.load (i32.add (get_local $ctx) (i32.const 24)))) + (set_local $m4 (i64.load (i32.add (get_local $ctx) (i32.const 32)))) + (set_local $m5 (i64.load (i32.add (get_local $ctx) (i32.const 40)))) + (set_local $m6 (i64.load (i32.add (get_local $ctx) (i32.const 48)))) + (set_local $m7 (i64.load (i32.add (get_local $ctx) (i32.const 56)))) + (set_local $m8 (i64.load (i32.add (get_local $ctx) (i32.const 64)))) + (set_local $m9 (i64.load (i32.add (get_local $ctx) (i32.const 72)))) + (set_local $m10 (i64.load (i32.add (get_local $ctx) (i32.const 80)))) + (set_local $m11 (i64.load (i32.add (get_local $ctx) (i32.const 88)))) + (set_local $m12 (i64.load (i32.add (get_local $ctx) (i32.const 96)))) + (set_local $m13 (i64.load (i32.add (get_local $ctx) (i32.const 104)))) + (set_local $m14 (i64.load (i32.add (get_local $ctx) (i32.const 112)))) + (set_local $m15 (i64.load (i32.add (get_local $ctx) (i32.const 120)))) + + ;; v12 = v12 ^ ctx.t + (set_local $v12 + (i64.xor + (get_local $v12) + (i64.load (i32.add (get_local $ctx) (i32.const 192))) + ) + ) + + ;; v14 = v14 ^ ctx.f + (set_local $v14 + (i64.xor + (get_local $v14) + (i64.load (i32.add (get_local $ctx) (i32.const 208))) + ) + ) + + ;; ROUNDS GENERATED BY `node generate-rounds.js` + + ;; ROUND(0) + + ;; G(0, 0) + + ;; $v0 = $v0 + $v4 + $m0 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v4) (get_local $m0)))) + + ;; $v12 = rotr64($v12 ^ $v0, 32) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v0)) (i64.const 32))) + + ;; $v8 = $v8 + $v12 + (set_local $v8 (i64.add (get_local $v8) (get_local $v12))) + + ;; $v4 = rotr64($v4 ^ $v8, 24) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v8)) (i64.const 24))) + + ;; $v0 = $v0 + $v4 + $m1 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v4) (get_local $m1)))) + + ;; $v12 = rotr64($v12 ^ $v0, 16) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v0)) (i64.const 16))) + + ;; $v8 = $v8 + $v12 + (set_local $v8 (i64.add (get_local $v8) (get_local $v12))) + + ;; $v4 = rotr64($v4 ^ $v8, 63) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v8)) (i64.const 63))) + + ;; G(0, 1) + + ;; $v1 = $v1 + $v5 + $m2 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v5) (get_local $m2)))) + + ;; $v13 = rotr64($v13 ^ $v1, 32) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v1)) (i64.const 32))) + + ;; $v9 = $v9 + $v13 + (set_local $v9 (i64.add (get_local $v9) (get_local $v13))) + + ;; $v5 = rotr64($v5 ^ $v9, 24) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v9)) (i64.const 24))) + + ;; $v1 = $v1 + $v5 + $m3 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v5) (get_local $m3)))) + + ;; $v13 = rotr64($v13 ^ $v1, 16) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v1)) (i64.const 16))) + + ;; $v9 = $v9 + $v13 + (set_local $v9 (i64.add (get_local $v9) (get_local $v13))) + + ;; $v5 = rotr64($v5 ^ $v9, 63) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v9)) (i64.const 63))) + + ;; G(0, 2) + + ;; $v2 = $v2 + $v6 + $m4 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v6) (get_local $m4)))) + + ;; $v14 = rotr64($v14 ^ $v2, 32) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v2)) (i64.const 32))) + + ;; $v10 = $v10 + $v14 + (set_local $v10 (i64.add (get_local $v10) (get_local $v14))) + + ;; $v6 = rotr64($v6 ^ $v10, 24) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v10)) (i64.const 24))) + + ;; $v2 = $v2 + $v6 + $m5 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v6) (get_local $m5)))) + + ;; $v14 = rotr64($v14 ^ $v2, 16) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v2)) (i64.const 16))) + + ;; $v10 = $v10 + $v14 + (set_local $v10 (i64.add (get_local $v10) (get_local $v14))) + + ;; $v6 = rotr64($v6 ^ $v10, 63) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v10)) (i64.const 63))) + + ;; G(0, 3) + + ;; $v3 = $v3 + $v7 + $m6 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v7) (get_local $m6)))) + + ;; $v15 = rotr64($v15 ^ $v3, 32) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v3)) (i64.const 32))) + + ;; $v11 = $v11 + $v15 + (set_local $v11 (i64.add (get_local $v11) (get_local $v15))) + + ;; $v7 = rotr64($v7 ^ $v11, 24) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v11)) (i64.const 24))) + + ;; $v3 = $v3 + $v7 + $m7 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v7) (get_local $m7)))) + + ;; $v15 = rotr64($v15 ^ $v3, 16) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v3)) (i64.const 16))) + + ;; $v11 = $v11 + $v15 + (set_local $v11 (i64.add (get_local $v11) (get_local $v15))) + + ;; $v7 = rotr64($v7 ^ $v11, 63) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v11)) (i64.const 63))) + + ;; G(0, 4) + + ;; $v0 = $v0 + $v5 + $m8 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v5) (get_local $m8)))) + + ;; $v15 = rotr64($v15 ^ $v0, 32) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v0)) (i64.const 32))) + + ;; $v10 = $v10 + $v15 + (set_local $v10 (i64.add (get_local $v10) (get_local $v15))) + + ;; $v5 = rotr64($v5 ^ $v10, 24) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v10)) (i64.const 24))) + + ;; $v0 = $v0 + $v5 + $m9 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v5) (get_local $m9)))) + + ;; $v15 = rotr64($v15 ^ $v0, 16) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v0)) (i64.const 16))) + + ;; $v10 = $v10 + $v15 + (set_local $v10 (i64.add (get_local $v10) (get_local $v15))) + + ;; $v5 = rotr64($v5 ^ $v10, 63) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v10)) (i64.const 63))) + + ;; G(0, 5) + + ;; $v1 = $v1 + $v6 + $m10 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v6) (get_local $m10)))) + + ;; $v12 = rotr64($v12 ^ $v1, 32) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v1)) (i64.const 32))) + + ;; $v11 = $v11 + $v12 + (set_local $v11 (i64.add (get_local $v11) (get_local $v12))) + + ;; $v6 = rotr64($v6 ^ $v11, 24) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v11)) (i64.const 24))) + + ;; $v1 = $v1 + $v6 + $m11 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v6) (get_local $m11)))) + + ;; $v12 = rotr64($v12 ^ $v1, 16) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v1)) (i64.const 16))) + + ;; $v11 = $v11 + $v12 + (set_local $v11 (i64.add (get_local $v11) (get_local $v12))) + + ;; $v6 = rotr64($v6 ^ $v11, 63) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v11)) (i64.const 63))) + + ;; G(0, 6) + + ;; $v2 = $v2 + $v7 + $m12 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v7) (get_local $m12)))) + + ;; $v13 = rotr64($v13 ^ $v2, 32) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v2)) (i64.const 32))) + + ;; $v8 = $v8 + $v13 + (set_local $v8 (i64.add (get_local $v8) (get_local $v13))) + + ;; $v7 = rotr64($v7 ^ $v8, 24) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v8)) (i64.const 24))) + + ;; $v2 = $v2 + $v7 + $m13 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v7) (get_local $m13)))) + + ;; $v13 = rotr64($v13 ^ $v2, 16) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v2)) (i64.const 16))) + + ;; $v8 = $v8 + $v13 + (set_local $v8 (i64.add (get_local $v8) (get_local $v13))) + + ;; $v7 = rotr64($v7 ^ $v8, 63) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v8)) (i64.const 63))) + + ;; G(0, 7) + + ;; $v3 = $v3 + $v4 + $m14 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v4) (get_local $m14)))) + + ;; $v14 = rotr64($v14 ^ $v3, 32) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v3)) (i64.const 32))) + + ;; $v9 = $v9 + $v14 + (set_local $v9 (i64.add (get_local $v9) (get_local $v14))) + + ;; $v4 = rotr64($v4 ^ $v9, 24) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v9)) (i64.const 24))) + + ;; $v3 = $v3 + $v4 + $m15 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v4) (get_local $m15)))) + + ;; $v14 = rotr64($v14 ^ $v3, 16) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v3)) (i64.const 16))) + + ;; $v9 = $v9 + $v14 + (set_local $v9 (i64.add (get_local $v9) (get_local $v14))) + + ;; $v4 = rotr64($v4 ^ $v9, 63) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v9)) (i64.const 63))) + + ;; ROUND(1) + + ;; G(1, 0) + + ;; $v0 = $v0 + $v4 + $m14 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v4) (get_local $m14)))) + + ;; $v12 = rotr64($v12 ^ $v0, 32) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v0)) (i64.const 32))) + + ;; $v8 = $v8 + $v12 + (set_local $v8 (i64.add (get_local $v8) (get_local $v12))) + + ;; $v4 = rotr64($v4 ^ $v8, 24) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v8)) (i64.const 24))) + + ;; $v0 = $v0 + $v4 + $m10 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v4) (get_local $m10)))) + + ;; $v12 = rotr64($v12 ^ $v0, 16) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v0)) (i64.const 16))) + + ;; $v8 = $v8 + $v12 + (set_local $v8 (i64.add (get_local $v8) (get_local $v12))) + + ;; $v4 = rotr64($v4 ^ $v8, 63) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v8)) (i64.const 63))) + + ;; G(1, 1) + + ;; $v1 = $v1 + $v5 + $m4 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v5) (get_local $m4)))) + + ;; $v13 = rotr64($v13 ^ $v1, 32) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v1)) (i64.const 32))) + + ;; $v9 = $v9 + $v13 + (set_local $v9 (i64.add (get_local $v9) (get_local $v13))) + + ;; $v5 = rotr64($v5 ^ $v9, 24) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v9)) (i64.const 24))) + + ;; $v1 = $v1 + $v5 + $m8 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v5) (get_local $m8)))) + + ;; $v13 = rotr64($v13 ^ $v1, 16) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v1)) (i64.const 16))) + + ;; $v9 = $v9 + $v13 + (set_local $v9 (i64.add (get_local $v9) (get_local $v13))) + + ;; $v5 = rotr64($v5 ^ $v9, 63) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v9)) (i64.const 63))) + + ;; G(1, 2) + + ;; $v2 = $v2 + $v6 + $m9 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v6) (get_local $m9)))) + + ;; $v14 = rotr64($v14 ^ $v2, 32) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v2)) (i64.const 32))) + + ;; $v10 = $v10 + $v14 + (set_local $v10 (i64.add (get_local $v10) (get_local $v14))) + + ;; $v6 = rotr64($v6 ^ $v10, 24) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v10)) (i64.const 24))) + + ;; $v2 = $v2 + $v6 + $m15 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v6) (get_local $m15)))) + + ;; $v14 = rotr64($v14 ^ $v2, 16) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v2)) (i64.const 16))) + + ;; $v10 = $v10 + $v14 + (set_local $v10 (i64.add (get_local $v10) (get_local $v14))) + + ;; $v6 = rotr64($v6 ^ $v10, 63) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v10)) (i64.const 63))) + + ;; G(1, 3) + + ;; $v3 = $v3 + $v7 + $m13 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v7) (get_local $m13)))) + + ;; $v15 = rotr64($v15 ^ $v3, 32) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v3)) (i64.const 32))) + + ;; $v11 = $v11 + $v15 + (set_local $v11 (i64.add (get_local $v11) (get_local $v15))) + + ;; $v7 = rotr64($v7 ^ $v11, 24) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v11)) (i64.const 24))) + + ;; $v3 = $v3 + $v7 + $m6 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v7) (get_local $m6)))) + + ;; $v15 = rotr64($v15 ^ $v3, 16) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v3)) (i64.const 16))) + + ;; $v11 = $v11 + $v15 + (set_local $v11 (i64.add (get_local $v11) (get_local $v15))) + + ;; $v7 = rotr64($v7 ^ $v11, 63) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v11)) (i64.const 63))) + + ;; G(1, 4) + + ;; $v0 = $v0 + $v5 + $m1 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v5) (get_local $m1)))) + + ;; $v15 = rotr64($v15 ^ $v0, 32) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v0)) (i64.const 32))) + + ;; $v10 = $v10 + $v15 + (set_local $v10 (i64.add (get_local $v10) (get_local $v15))) + + ;; $v5 = rotr64($v5 ^ $v10, 24) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v10)) (i64.const 24))) + + ;; $v0 = $v0 + $v5 + $m12 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v5) (get_local $m12)))) + + ;; $v15 = rotr64($v15 ^ $v0, 16) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v0)) (i64.const 16))) + + ;; $v10 = $v10 + $v15 + (set_local $v10 (i64.add (get_local $v10) (get_local $v15))) + + ;; $v5 = rotr64($v5 ^ $v10, 63) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v10)) (i64.const 63))) + + ;; G(1, 5) + + ;; $v1 = $v1 + $v6 + $m0 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v6) (get_local $m0)))) + + ;; $v12 = rotr64($v12 ^ $v1, 32) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v1)) (i64.const 32))) + + ;; $v11 = $v11 + $v12 + (set_local $v11 (i64.add (get_local $v11) (get_local $v12))) + + ;; $v6 = rotr64($v6 ^ $v11, 24) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v11)) (i64.const 24))) + + ;; $v1 = $v1 + $v6 + $m2 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v6) (get_local $m2)))) + + ;; $v12 = rotr64($v12 ^ $v1, 16) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v1)) (i64.const 16))) + + ;; $v11 = $v11 + $v12 + (set_local $v11 (i64.add (get_local $v11) (get_local $v12))) + + ;; $v6 = rotr64($v6 ^ $v11, 63) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v11)) (i64.const 63))) + + ;; G(1, 6) + + ;; $v2 = $v2 + $v7 + $m11 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v7) (get_local $m11)))) + + ;; $v13 = rotr64($v13 ^ $v2, 32) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v2)) (i64.const 32))) + + ;; $v8 = $v8 + $v13 + (set_local $v8 (i64.add (get_local $v8) (get_local $v13))) + + ;; $v7 = rotr64($v7 ^ $v8, 24) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v8)) (i64.const 24))) + + ;; $v2 = $v2 + $v7 + $m7 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v7) (get_local $m7)))) + + ;; $v13 = rotr64($v13 ^ $v2, 16) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v2)) (i64.const 16))) + + ;; $v8 = $v8 + $v13 + (set_local $v8 (i64.add (get_local $v8) (get_local $v13))) + + ;; $v7 = rotr64($v7 ^ $v8, 63) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v8)) (i64.const 63))) + + ;; G(1, 7) + + ;; $v3 = $v3 + $v4 + $m5 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v4) (get_local $m5)))) + + ;; $v14 = rotr64($v14 ^ $v3, 32) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v3)) (i64.const 32))) + + ;; $v9 = $v9 + $v14 + (set_local $v9 (i64.add (get_local $v9) (get_local $v14))) + + ;; $v4 = rotr64($v4 ^ $v9, 24) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v9)) (i64.const 24))) + + ;; $v3 = $v3 + $v4 + $m3 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v4) (get_local $m3)))) + + ;; $v14 = rotr64($v14 ^ $v3, 16) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v3)) (i64.const 16))) + + ;; $v9 = $v9 + $v14 + (set_local $v9 (i64.add (get_local $v9) (get_local $v14))) + + ;; $v4 = rotr64($v4 ^ $v9, 63) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v9)) (i64.const 63))) + + ;; ROUND(2) + + ;; G(2, 0) + + ;; $v0 = $v0 + $v4 + $m11 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v4) (get_local $m11)))) + + ;; $v12 = rotr64($v12 ^ $v0, 32) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v0)) (i64.const 32))) + + ;; $v8 = $v8 + $v12 + (set_local $v8 (i64.add (get_local $v8) (get_local $v12))) + + ;; $v4 = rotr64($v4 ^ $v8, 24) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v8)) (i64.const 24))) + + ;; $v0 = $v0 + $v4 + $m8 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v4) (get_local $m8)))) + + ;; $v12 = rotr64($v12 ^ $v0, 16) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v0)) (i64.const 16))) + + ;; $v8 = $v8 + $v12 + (set_local $v8 (i64.add (get_local $v8) (get_local $v12))) + + ;; $v4 = rotr64($v4 ^ $v8, 63) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v8)) (i64.const 63))) + + ;; G(2, 1) + + ;; $v1 = $v1 + $v5 + $m12 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v5) (get_local $m12)))) + + ;; $v13 = rotr64($v13 ^ $v1, 32) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v1)) (i64.const 32))) + + ;; $v9 = $v9 + $v13 + (set_local $v9 (i64.add (get_local $v9) (get_local $v13))) + + ;; $v5 = rotr64($v5 ^ $v9, 24) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v9)) (i64.const 24))) + + ;; $v1 = $v1 + $v5 + $m0 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v5) (get_local $m0)))) + + ;; $v13 = rotr64($v13 ^ $v1, 16) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v1)) (i64.const 16))) + + ;; $v9 = $v9 + $v13 + (set_local $v9 (i64.add (get_local $v9) (get_local $v13))) + + ;; $v5 = rotr64($v5 ^ $v9, 63) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v9)) (i64.const 63))) + + ;; G(2, 2) + + ;; $v2 = $v2 + $v6 + $m5 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v6) (get_local $m5)))) + + ;; $v14 = rotr64($v14 ^ $v2, 32) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v2)) (i64.const 32))) + + ;; $v10 = $v10 + $v14 + (set_local $v10 (i64.add (get_local $v10) (get_local $v14))) + + ;; $v6 = rotr64($v6 ^ $v10, 24) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v10)) (i64.const 24))) + + ;; $v2 = $v2 + $v6 + $m2 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v6) (get_local $m2)))) + + ;; $v14 = rotr64($v14 ^ $v2, 16) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v2)) (i64.const 16))) + + ;; $v10 = $v10 + $v14 + (set_local $v10 (i64.add (get_local $v10) (get_local $v14))) + + ;; $v6 = rotr64($v6 ^ $v10, 63) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v10)) (i64.const 63))) + + ;; G(2, 3) + + ;; $v3 = $v3 + $v7 + $m15 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v7) (get_local $m15)))) + + ;; $v15 = rotr64($v15 ^ $v3, 32) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v3)) (i64.const 32))) + + ;; $v11 = $v11 + $v15 + (set_local $v11 (i64.add (get_local $v11) (get_local $v15))) + + ;; $v7 = rotr64($v7 ^ $v11, 24) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v11)) (i64.const 24))) + + ;; $v3 = $v3 + $v7 + $m13 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v7) (get_local $m13)))) + + ;; $v15 = rotr64($v15 ^ $v3, 16) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v3)) (i64.const 16))) + + ;; $v11 = $v11 + $v15 + (set_local $v11 (i64.add (get_local $v11) (get_local $v15))) + + ;; $v7 = rotr64($v7 ^ $v11, 63) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v11)) (i64.const 63))) + + ;; G(2, 4) + + ;; $v0 = $v0 + $v5 + $m10 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v5) (get_local $m10)))) + + ;; $v15 = rotr64($v15 ^ $v0, 32) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v0)) (i64.const 32))) + + ;; $v10 = $v10 + $v15 + (set_local $v10 (i64.add (get_local $v10) (get_local $v15))) + + ;; $v5 = rotr64($v5 ^ $v10, 24) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v10)) (i64.const 24))) + + ;; $v0 = $v0 + $v5 + $m14 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v5) (get_local $m14)))) + + ;; $v15 = rotr64($v15 ^ $v0, 16) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v0)) (i64.const 16))) + + ;; $v10 = $v10 + $v15 + (set_local $v10 (i64.add (get_local $v10) (get_local $v15))) + + ;; $v5 = rotr64($v5 ^ $v10, 63) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v10)) (i64.const 63))) + + ;; G(2, 5) + + ;; $v1 = $v1 + $v6 + $m3 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v6) (get_local $m3)))) + + ;; $v12 = rotr64($v12 ^ $v1, 32) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v1)) (i64.const 32))) + + ;; $v11 = $v11 + $v12 + (set_local $v11 (i64.add (get_local $v11) (get_local $v12))) + + ;; $v6 = rotr64($v6 ^ $v11, 24) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v11)) (i64.const 24))) + + ;; $v1 = $v1 + $v6 + $m6 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v6) (get_local $m6)))) + + ;; $v12 = rotr64($v12 ^ $v1, 16) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v1)) (i64.const 16))) + + ;; $v11 = $v11 + $v12 + (set_local $v11 (i64.add (get_local $v11) (get_local $v12))) + + ;; $v6 = rotr64($v6 ^ $v11, 63) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v11)) (i64.const 63))) + + ;; G(2, 6) + + ;; $v2 = $v2 + $v7 + $m7 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v7) (get_local $m7)))) + + ;; $v13 = rotr64($v13 ^ $v2, 32) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v2)) (i64.const 32))) + + ;; $v8 = $v8 + $v13 + (set_local $v8 (i64.add (get_local $v8) (get_local $v13))) + + ;; $v7 = rotr64($v7 ^ $v8, 24) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v8)) (i64.const 24))) + + ;; $v2 = $v2 + $v7 + $m1 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v7) (get_local $m1)))) + + ;; $v13 = rotr64($v13 ^ $v2, 16) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v2)) (i64.const 16))) + + ;; $v8 = $v8 + $v13 + (set_local $v8 (i64.add (get_local $v8) (get_local $v13))) + + ;; $v7 = rotr64($v7 ^ $v8, 63) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v8)) (i64.const 63))) + + ;; G(2, 7) + + ;; $v3 = $v3 + $v4 + $m9 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v4) (get_local $m9)))) + + ;; $v14 = rotr64($v14 ^ $v3, 32) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v3)) (i64.const 32))) + + ;; $v9 = $v9 + $v14 + (set_local $v9 (i64.add (get_local $v9) (get_local $v14))) + + ;; $v4 = rotr64($v4 ^ $v9, 24) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v9)) (i64.const 24))) + + ;; $v3 = $v3 + $v4 + $m4 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v4) (get_local $m4)))) + + ;; $v14 = rotr64($v14 ^ $v3, 16) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v3)) (i64.const 16))) + + ;; $v9 = $v9 + $v14 + (set_local $v9 (i64.add (get_local $v9) (get_local $v14))) + + ;; $v4 = rotr64($v4 ^ $v9, 63) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v9)) (i64.const 63))) + + ;; ROUND(3) + + ;; G(3, 0) + + ;; $v0 = $v0 + $v4 + $m7 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v4) (get_local $m7)))) + + ;; $v12 = rotr64($v12 ^ $v0, 32) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v0)) (i64.const 32))) + + ;; $v8 = $v8 + $v12 + (set_local $v8 (i64.add (get_local $v8) (get_local $v12))) + + ;; $v4 = rotr64($v4 ^ $v8, 24) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v8)) (i64.const 24))) + + ;; $v0 = $v0 + $v4 + $m9 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v4) (get_local $m9)))) + + ;; $v12 = rotr64($v12 ^ $v0, 16) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v0)) (i64.const 16))) + + ;; $v8 = $v8 + $v12 + (set_local $v8 (i64.add (get_local $v8) (get_local $v12))) + + ;; $v4 = rotr64($v4 ^ $v8, 63) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v8)) (i64.const 63))) + + ;; G(3, 1) + + ;; $v1 = $v1 + $v5 + $m3 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v5) (get_local $m3)))) + + ;; $v13 = rotr64($v13 ^ $v1, 32) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v1)) (i64.const 32))) + + ;; $v9 = $v9 + $v13 + (set_local $v9 (i64.add (get_local $v9) (get_local $v13))) + + ;; $v5 = rotr64($v5 ^ $v9, 24) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v9)) (i64.const 24))) + + ;; $v1 = $v1 + $v5 + $m1 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v5) (get_local $m1)))) + + ;; $v13 = rotr64($v13 ^ $v1, 16) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v1)) (i64.const 16))) + + ;; $v9 = $v9 + $v13 + (set_local $v9 (i64.add (get_local $v9) (get_local $v13))) + + ;; $v5 = rotr64($v5 ^ $v9, 63) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v9)) (i64.const 63))) + + ;; G(3, 2) + + ;; $v2 = $v2 + $v6 + $m13 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v6) (get_local $m13)))) + + ;; $v14 = rotr64($v14 ^ $v2, 32) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v2)) (i64.const 32))) + + ;; $v10 = $v10 + $v14 + (set_local $v10 (i64.add (get_local $v10) (get_local $v14))) + + ;; $v6 = rotr64($v6 ^ $v10, 24) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v10)) (i64.const 24))) + + ;; $v2 = $v2 + $v6 + $m12 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v6) (get_local $m12)))) + + ;; $v14 = rotr64($v14 ^ $v2, 16) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v2)) (i64.const 16))) + + ;; $v10 = $v10 + $v14 + (set_local $v10 (i64.add (get_local $v10) (get_local $v14))) + + ;; $v6 = rotr64($v6 ^ $v10, 63) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v10)) (i64.const 63))) + + ;; G(3, 3) + + ;; $v3 = $v3 + $v7 + $m11 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v7) (get_local $m11)))) + + ;; $v15 = rotr64($v15 ^ $v3, 32) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v3)) (i64.const 32))) + + ;; $v11 = $v11 + $v15 + (set_local $v11 (i64.add (get_local $v11) (get_local $v15))) + + ;; $v7 = rotr64($v7 ^ $v11, 24) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v11)) (i64.const 24))) + + ;; $v3 = $v3 + $v7 + $m14 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v7) (get_local $m14)))) + + ;; $v15 = rotr64($v15 ^ $v3, 16) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v3)) (i64.const 16))) + + ;; $v11 = $v11 + $v15 + (set_local $v11 (i64.add (get_local $v11) (get_local $v15))) + + ;; $v7 = rotr64($v7 ^ $v11, 63) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v11)) (i64.const 63))) + + ;; G(3, 4) + + ;; $v0 = $v0 + $v5 + $m2 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v5) (get_local $m2)))) + + ;; $v15 = rotr64($v15 ^ $v0, 32) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v0)) (i64.const 32))) + + ;; $v10 = $v10 + $v15 + (set_local $v10 (i64.add (get_local $v10) (get_local $v15))) + + ;; $v5 = rotr64($v5 ^ $v10, 24) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v10)) (i64.const 24))) + + ;; $v0 = $v0 + $v5 + $m6 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v5) (get_local $m6)))) + + ;; $v15 = rotr64($v15 ^ $v0, 16) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v0)) (i64.const 16))) + + ;; $v10 = $v10 + $v15 + (set_local $v10 (i64.add (get_local $v10) (get_local $v15))) + + ;; $v5 = rotr64($v5 ^ $v10, 63) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v10)) (i64.const 63))) + + ;; G(3, 5) + + ;; $v1 = $v1 + $v6 + $m5 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v6) (get_local $m5)))) + + ;; $v12 = rotr64($v12 ^ $v1, 32) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v1)) (i64.const 32))) + + ;; $v11 = $v11 + $v12 + (set_local $v11 (i64.add (get_local $v11) (get_local $v12))) + + ;; $v6 = rotr64($v6 ^ $v11, 24) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v11)) (i64.const 24))) + + ;; $v1 = $v1 + $v6 + $m10 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v6) (get_local $m10)))) + + ;; $v12 = rotr64($v12 ^ $v1, 16) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v1)) (i64.const 16))) + + ;; $v11 = $v11 + $v12 + (set_local $v11 (i64.add (get_local $v11) (get_local $v12))) + + ;; $v6 = rotr64($v6 ^ $v11, 63) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v11)) (i64.const 63))) + + ;; G(3, 6) + + ;; $v2 = $v2 + $v7 + $m4 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v7) (get_local $m4)))) + + ;; $v13 = rotr64($v13 ^ $v2, 32) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v2)) (i64.const 32))) + + ;; $v8 = $v8 + $v13 + (set_local $v8 (i64.add (get_local $v8) (get_local $v13))) + + ;; $v7 = rotr64($v7 ^ $v8, 24) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v8)) (i64.const 24))) + + ;; $v2 = $v2 + $v7 + $m0 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v7) (get_local $m0)))) + + ;; $v13 = rotr64($v13 ^ $v2, 16) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v2)) (i64.const 16))) + + ;; $v8 = $v8 + $v13 + (set_local $v8 (i64.add (get_local $v8) (get_local $v13))) + + ;; $v7 = rotr64($v7 ^ $v8, 63) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v8)) (i64.const 63))) + + ;; G(3, 7) + + ;; $v3 = $v3 + $v4 + $m15 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v4) (get_local $m15)))) + + ;; $v14 = rotr64($v14 ^ $v3, 32) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v3)) (i64.const 32))) + + ;; $v9 = $v9 + $v14 + (set_local $v9 (i64.add (get_local $v9) (get_local $v14))) + + ;; $v4 = rotr64($v4 ^ $v9, 24) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v9)) (i64.const 24))) + + ;; $v3 = $v3 + $v4 + $m8 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v4) (get_local $m8)))) + + ;; $v14 = rotr64($v14 ^ $v3, 16) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v3)) (i64.const 16))) + + ;; $v9 = $v9 + $v14 + (set_local $v9 (i64.add (get_local $v9) (get_local $v14))) + + ;; $v4 = rotr64($v4 ^ $v9, 63) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v9)) (i64.const 63))) + + ;; ROUND(4) + + ;; G(4, 0) + + ;; $v0 = $v0 + $v4 + $m9 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v4) (get_local $m9)))) + + ;; $v12 = rotr64($v12 ^ $v0, 32) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v0)) (i64.const 32))) + + ;; $v8 = $v8 + $v12 + (set_local $v8 (i64.add (get_local $v8) (get_local $v12))) + + ;; $v4 = rotr64($v4 ^ $v8, 24) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v8)) (i64.const 24))) + + ;; $v0 = $v0 + $v4 + $m0 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v4) (get_local $m0)))) + + ;; $v12 = rotr64($v12 ^ $v0, 16) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v0)) (i64.const 16))) + + ;; $v8 = $v8 + $v12 + (set_local $v8 (i64.add (get_local $v8) (get_local $v12))) + + ;; $v4 = rotr64($v4 ^ $v8, 63) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v8)) (i64.const 63))) + + ;; G(4, 1) + + ;; $v1 = $v1 + $v5 + $m5 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v5) (get_local $m5)))) + + ;; $v13 = rotr64($v13 ^ $v1, 32) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v1)) (i64.const 32))) + + ;; $v9 = $v9 + $v13 + (set_local $v9 (i64.add (get_local $v9) (get_local $v13))) + + ;; $v5 = rotr64($v5 ^ $v9, 24) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v9)) (i64.const 24))) + + ;; $v1 = $v1 + $v5 + $m7 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v5) (get_local $m7)))) + + ;; $v13 = rotr64($v13 ^ $v1, 16) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v1)) (i64.const 16))) + + ;; $v9 = $v9 + $v13 + (set_local $v9 (i64.add (get_local $v9) (get_local $v13))) + + ;; $v5 = rotr64($v5 ^ $v9, 63) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v9)) (i64.const 63))) + + ;; G(4, 2) + + ;; $v2 = $v2 + $v6 + $m2 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v6) (get_local $m2)))) + + ;; $v14 = rotr64($v14 ^ $v2, 32) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v2)) (i64.const 32))) + + ;; $v10 = $v10 + $v14 + (set_local $v10 (i64.add (get_local $v10) (get_local $v14))) + + ;; $v6 = rotr64($v6 ^ $v10, 24) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v10)) (i64.const 24))) + + ;; $v2 = $v2 + $v6 + $m4 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v6) (get_local $m4)))) + + ;; $v14 = rotr64($v14 ^ $v2, 16) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v2)) (i64.const 16))) + + ;; $v10 = $v10 + $v14 + (set_local $v10 (i64.add (get_local $v10) (get_local $v14))) + + ;; $v6 = rotr64($v6 ^ $v10, 63) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v10)) (i64.const 63))) + + ;; G(4, 3) + + ;; $v3 = $v3 + $v7 + $m10 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v7) (get_local $m10)))) + + ;; $v15 = rotr64($v15 ^ $v3, 32) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v3)) (i64.const 32))) + + ;; $v11 = $v11 + $v15 + (set_local $v11 (i64.add (get_local $v11) (get_local $v15))) + + ;; $v7 = rotr64($v7 ^ $v11, 24) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v11)) (i64.const 24))) + + ;; $v3 = $v3 + $v7 + $m15 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v7) (get_local $m15)))) + + ;; $v15 = rotr64($v15 ^ $v3, 16) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v3)) (i64.const 16))) + + ;; $v11 = $v11 + $v15 + (set_local $v11 (i64.add (get_local $v11) (get_local $v15))) + + ;; $v7 = rotr64($v7 ^ $v11, 63) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v11)) (i64.const 63))) + + ;; G(4, 4) + + ;; $v0 = $v0 + $v5 + $m14 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v5) (get_local $m14)))) + + ;; $v15 = rotr64($v15 ^ $v0, 32) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v0)) (i64.const 32))) + + ;; $v10 = $v10 + $v15 + (set_local $v10 (i64.add (get_local $v10) (get_local $v15))) + + ;; $v5 = rotr64($v5 ^ $v10, 24) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v10)) (i64.const 24))) + + ;; $v0 = $v0 + $v5 + $m1 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v5) (get_local $m1)))) + + ;; $v15 = rotr64($v15 ^ $v0, 16) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v0)) (i64.const 16))) + + ;; $v10 = $v10 + $v15 + (set_local $v10 (i64.add (get_local $v10) (get_local $v15))) + + ;; $v5 = rotr64($v5 ^ $v10, 63) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v10)) (i64.const 63))) + + ;; G(4, 5) + + ;; $v1 = $v1 + $v6 + $m11 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v6) (get_local $m11)))) + + ;; $v12 = rotr64($v12 ^ $v1, 32) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v1)) (i64.const 32))) + + ;; $v11 = $v11 + $v12 + (set_local $v11 (i64.add (get_local $v11) (get_local $v12))) + + ;; $v6 = rotr64($v6 ^ $v11, 24) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v11)) (i64.const 24))) + + ;; $v1 = $v1 + $v6 + $m12 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v6) (get_local $m12)))) + + ;; $v12 = rotr64($v12 ^ $v1, 16) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v1)) (i64.const 16))) + + ;; $v11 = $v11 + $v12 + (set_local $v11 (i64.add (get_local $v11) (get_local $v12))) + + ;; $v6 = rotr64($v6 ^ $v11, 63) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v11)) (i64.const 63))) + + ;; G(4, 6) + + ;; $v2 = $v2 + $v7 + $m6 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v7) (get_local $m6)))) + + ;; $v13 = rotr64($v13 ^ $v2, 32) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v2)) (i64.const 32))) + + ;; $v8 = $v8 + $v13 + (set_local $v8 (i64.add (get_local $v8) (get_local $v13))) + + ;; $v7 = rotr64($v7 ^ $v8, 24) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v8)) (i64.const 24))) + + ;; $v2 = $v2 + $v7 + $m8 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v7) (get_local $m8)))) + + ;; $v13 = rotr64($v13 ^ $v2, 16) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v2)) (i64.const 16))) + + ;; $v8 = $v8 + $v13 + (set_local $v8 (i64.add (get_local $v8) (get_local $v13))) + + ;; $v7 = rotr64($v7 ^ $v8, 63) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v8)) (i64.const 63))) + + ;; G(4, 7) + + ;; $v3 = $v3 + $v4 + $m3 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v4) (get_local $m3)))) + + ;; $v14 = rotr64($v14 ^ $v3, 32) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v3)) (i64.const 32))) + + ;; $v9 = $v9 + $v14 + (set_local $v9 (i64.add (get_local $v9) (get_local $v14))) + + ;; $v4 = rotr64($v4 ^ $v9, 24) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v9)) (i64.const 24))) + + ;; $v3 = $v3 + $v4 + $m13 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v4) (get_local $m13)))) + + ;; $v14 = rotr64($v14 ^ $v3, 16) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v3)) (i64.const 16))) + + ;; $v9 = $v9 + $v14 + (set_local $v9 (i64.add (get_local $v9) (get_local $v14))) + + ;; $v4 = rotr64($v4 ^ $v9, 63) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v9)) (i64.const 63))) + + ;; ROUND(5) + + ;; G(5, 0) + + ;; $v0 = $v0 + $v4 + $m2 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v4) (get_local $m2)))) + + ;; $v12 = rotr64($v12 ^ $v0, 32) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v0)) (i64.const 32))) + + ;; $v8 = $v8 + $v12 + (set_local $v8 (i64.add (get_local $v8) (get_local $v12))) + + ;; $v4 = rotr64($v4 ^ $v8, 24) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v8)) (i64.const 24))) + + ;; $v0 = $v0 + $v4 + $m12 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v4) (get_local $m12)))) + + ;; $v12 = rotr64($v12 ^ $v0, 16) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v0)) (i64.const 16))) + + ;; $v8 = $v8 + $v12 + (set_local $v8 (i64.add (get_local $v8) (get_local $v12))) + + ;; $v4 = rotr64($v4 ^ $v8, 63) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v8)) (i64.const 63))) + + ;; G(5, 1) + + ;; $v1 = $v1 + $v5 + $m6 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v5) (get_local $m6)))) + + ;; $v13 = rotr64($v13 ^ $v1, 32) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v1)) (i64.const 32))) + + ;; $v9 = $v9 + $v13 + (set_local $v9 (i64.add (get_local $v9) (get_local $v13))) + + ;; $v5 = rotr64($v5 ^ $v9, 24) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v9)) (i64.const 24))) + + ;; $v1 = $v1 + $v5 + $m10 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v5) (get_local $m10)))) + + ;; $v13 = rotr64($v13 ^ $v1, 16) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v1)) (i64.const 16))) + + ;; $v9 = $v9 + $v13 + (set_local $v9 (i64.add (get_local $v9) (get_local $v13))) + + ;; $v5 = rotr64($v5 ^ $v9, 63) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v9)) (i64.const 63))) + + ;; G(5, 2) + + ;; $v2 = $v2 + $v6 + $m0 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v6) (get_local $m0)))) + + ;; $v14 = rotr64($v14 ^ $v2, 32) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v2)) (i64.const 32))) + + ;; $v10 = $v10 + $v14 + (set_local $v10 (i64.add (get_local $v10) (get_local $v14))) + + ;; $v6 = rotr64($v6 ^ $v10, 24) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v10)) (i64.const 24))) + + ;; $v2 = $v2 + $v6 + $m11 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v6) (get_local $m11)))) + + ;; $v14 = rotr64($v14 ^ $v2, 16) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v2)) (i64.const 16))) + + ;; $v10 = $v10 + $v14 + (set_local $v10 (i64.add (get_local $v10) (get_local $v14))) + + ;; $v6 = rotr64($v6 ^ $v10, 63) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v10)) (i64.const 63))) + + ;; G(5, 3) + + ;; $v3 = $v3 + $v7 + $m8 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v7) (get_local $m8)))) + + ;; $v15 = rotr64($v15 ^ $v3, 32) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v3)) (i64.const 32))) + + ;; $v11 = $v11 + $v15 + (set_local $v11 (i64.add (get_local $v11) (get_local $v15))) + + ;; $v7 = rotr64($v7 ^ $v11, 24) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v11)) (i64.const 24))) + + ;; $v3 = $v3 + $v7 + $m3 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v7) (get_local $m3)))) + + ;; $v15 = rotr64($v15 ^ $v3, 16) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v3)) (i64.const 16))) + + ;; $v11 = $v11 + $v15 + (set_local $v11 (i64.add (get_local $v11) (get_local $v15))) + + ;; $v7 = rotr64($v7 ^ $v11, 63) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v11)) (i64.const 63))) + + ;; G(5, 4) + + ;; $v0 = $v0 + $v5 + $m4 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v5) (get_local $m4)))) + + ;; $v15 = rotr64($v15 ^ $v0, 32) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v0)) (i64.const 32))) + + ;; $v10 = $v10 + $v15 + (set_local $v10 (i64.add (get_local $v10) (get_local $v15))) + + ;; $v5 = rotr64($v5 ^ $v10, 24) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v10)) (i64.const 24))) + + ;; $v0 = $v0 + $v5 + $m13 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v5) (get_local $m13)))) + + ;; $v15 = rotr64($v15 ^ $v0, 16) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v0)) (i64.const 16))) + + ;; $v10 = $v10 + $v15 + (set_local $v10 (i64.add (get_local $v10) (get_local $v15))) + + ;; $v5 = rotr64($v5 ^ $v10, 63) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v10)) (i64.const 63))) + + ;; G(5, 5) + + ;; $v1 = $v1 + $v6 + $m7 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v6) (get_local $m7)))) + + ;; $v12 = rotr64($v12 ^ $v1, 32) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v1)) (i64.const 32))) + + ;; $v11 = $v11 + $v12 + (set_local $v11 (i64.add (get_local $v11) (get_local $v12))) + + ;; $v6 = rotr64($v6 ^ $v11, 24) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v11)) (i64.const 24))) + + ;; $v1 = $v1 + $v6 + $m5 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v6) (get_local $m5)))) + + ;; $v12 = rotr64($v12 ^ $v1, 16) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v1)) (i64.const 16))) + + ;; $v11 = $v11 + $v12 + (set_local $v11 (i64.add (get_local $v11) (get_local $v12))) + + ;; $v6 = rotr64($v6 ^ $v11, 63) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v11)) (i64.const 63))) + + ;; G(5, 6) + + ;; $v2 = $v2 + $v7 + $m15 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v7) (get_local $m15)))) + + ;; $v13 = rotr64($v13 ^ $v2, 32) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v2)) (i64.const 32))) + + ;; $v8 = $v8 + $v13 + (set_local $v8 (i64.add (get_local $v8) (get_local $v13))) + + ;; $v7 = rotr64($v7 ^ $v8, 24) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v8)) (i64.const 24))) + + ;; $v2 = $v2 + $v7 + $m14 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v7) (get_local $m14)))) + + ;; $v13 = rotr64($v13 ^ $v2, 16) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v2)) (i64.const 16))) + + ;; $v8 = $v8 + $v13 + (set_local $v8 (i64.add (get_local $v8) (get_local $v13))) + + ;; $v7 = rotr64($v7 ^ $v8, 63) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v8)) (i64.const 63))) + + ;; G(5, 7) + + ;; $v3 = $v3 + $v4 + $m1 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v4) (get_local $m1)))) + + ;; $v14 = rotr64($v14 ^ $v3, 32) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v3)) (i64.const 32))) + + ;; $v9 = $v9 + $v14 + (set_local $v9 (i64.add (get_local $v9) (get_local $v14))) + + ;; $v4 = rotr64($v4 ^ $v9, 24) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v9)) (i64.const 24))) + + ;; $v3 = $v3 + $v4 + $m9 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v4) (get_local $m9)))) + + ;; $v14 = rotr64($v14 ^ $v3, 16) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v3)) (i64.const 16))) + + ;; $v9 = $v9 + $v14 + (set_local $v9 (i64.add (get_local $v9) (get_local $v14))) + + ;; $v4 = rotr64($v4 ^ $v9, 63) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v9)) (i64.const 63))) + + ;; ROUND(6) + + ;; G(6, 0) + + ;; $v0 = $v0 + $v4 + $m12 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v4) (get_local $m12)))) + + ;; $v12 = rotr64($v12 ^ $v0, 32) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v0)) (i64.const 32))) + + ;; $v8 = $v8 + $v12 + (set_local $v8 (i64.add (get_local $v8) (get_local $v12))) + + ;; $v4 = rotr64($v4 ^ $v8, 24) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v8)) (i64.const 24))) + + ;; $v0 = $v0 + $v4 + $m5 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v4) (get_local $m5)))) + + ;; $v12 = rotr64($v12 ^ $v0, 16) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v0)) (i64.const 16))) + + ;; $v8 = $v8 + $v12 + (set_local $v8 (i64.add (get_local $v8) (get_local $v12))) + + ;; $v4 = rotr64($v4 ^ $v8, 63) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v8)) (i64.const 63))) + + ;; G(6, 1) + + ;; $v1 = $v1 + $v5 + $m1 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v5) (get_local $m1)))) + + ;; $v13 = rotr64($v13 ^ $v1, 32) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v1)) (i64.const 32))) + + ;; $v9 = $v9 + $v13 + (set_local $v9 (i64.add (get_local $v9) (get_local $v13))) + + ;; $v5 = rotr64($v5 ^ $v9, 24) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v9)) (i64.const 24))) + + ;; $v1 = $v1 + $v5 + $m15 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v5) (get_local $m15)))) + + ;; $v13 = rotr64($v13 ^ $v1, 16) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v1)) (i64.const 16))) + + ;; $v9 = $v9 + $v13 + (set_local $v9 (i64.add (get_local $v9) (get_local $v13))) + + ;; $v5 = rotr64($v5 ^ $v9, 63) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v9)) (i64.const 63))) + + ;; G(6, 2) + + ;; $v2 = $v2 + $v6 + $m14 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v6) (get_local $m14)))) + + ;; $v14 = rotr64($v14 ^ $v2, 32) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v2)) (i64.const 32))) + + ;; $v10 = $v10 + $v14 + (set_local $v10 (i64.add (get_local $v10) (get_local $v14))) + + ;; $v6 = rotr64($v6 ^ $v10, 24) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v10)) (i64.const 24))) + + ;; $v2 = $v2 + $v6 + $m13 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v6) (get_local $m13)))) + + ;; $v14 = rotr64($v14 ^ $v2, 16) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v2)) (i64.const 16))) + + ;; $v10 = $v10 + $v14 + (set_local $v10 (i64.add (get_local $v10) (get_local $v14))) + + ;; $v6 = rotr64($v6 ^ $v10, 63) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v10)) (i64.const 63))) + + ;; G(6, 3) + + ;; $v3 = $v3 + $v7 + $m4 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v7) (get_local $m4)))) + + ;; $v15 = rotr64($v15 ^ $v3, 32) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v3)) (i64.const 32))) + + ;; $v11 = $v11 + $v15 + (set_local $v11 (i64.add (get_local $v11) (get_local $v15))) + + ;; $v7 = rotr64($v7 ^ $v11, 24) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v11)) (i64.const 24))) + + ;; $v3 = $v3 + $v7 + $m10 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v7) (get_local $m10)))) + + ;; $v15 = rotr64($v15 ^ $v3, 16) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v3)) (i64.const 16))) + + ;; $v11 = $v11 + $v15 + (set_local $v11 (i64.add (get_local $v11) (get_local $v15))) + + ;; $v7 = rotr64($v7 ^ $v11, 63) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v11)) (i64.const 63))) + + ;; G(6, 4) + + ;; $v0 = $v0 + $v5 + $m0 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v5) (get_local $m0)))) + + ;; $v15 = rotr64($v15 ^ $v0, 32) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v0)) (i64.const 32))) + + ;; $v10 = $v10 + $v15 + (set_local $v10 (i64.add (get_local $v10) (get_local $v15))) + + ;; $v5 = rotr64($v5 ^ $v10, 24) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v10)) (i64.const 24))) + + ;; $v0 = $v0 + $v5 + $m7 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v5) (get_local $m7)))) + + ;; $v15 = rotr64($v15 ^ $v0, 16) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v0)) (i64.const 16))) + + ;; $v10 = $v10 + $v15 + (set_local $v10 (i64.add (get_local $v10) (get_local $v15))) + + ;; $v5 = rotr64($v5 ^ $v10, 63) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v10)) (i64.const 63))) + + ;; G(6, 5) + + ;; $v1 = $v1 + $v6 + $m6 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v6) (get_local $m6)))) + + ;; $v12 = rotr64($v12 ^ $v1, 32) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v1)) (i64.const 32))) + + ;; $v11 = $v11 + $v12 + (set_local $v11 (i64.add (get_local $v11) (get_local $v12))) + + ;; $v6 = rotr64($v6 ^ $v11, 24) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v11)) (i64.const 24))) + + ;; $v1 = $v1 + $v6 + $m3 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v6) (get_local $m3)))) + + ;; $v12 = rotr64($v12 ^ $v1, 16) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v1)) (i64.const 16))) + + ;; $v11 = $v11 + $v12 + (set_local $v11 (i64.add (get_local $v11) (get_local $v12))) + + ;; $v6 = rotr64($v6 ^ $v11, 63) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v11)) (i64.const 63))) + + ;; G(6, 6) + + ;; $v2 = $v2 + $v7 + $m9 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v7) (get_local $m9)))) + + ;; $v13 = rotr64($v13 ^ $v2, 32) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v2)) (i64.const 32))) + + ;; $v8 = $v8 + $v13 + (set_local $v8 (i64.add (get_local $v8) (get_local $v13))) + + ;; $v7 = rotr64($v7 ^ $v8, 24) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v8)) (i64.const 24))) + + ;; $v2 = $v2 + $v7 + $m2 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v7) (get_local $m2)))) + + ;; $v13 = rotr64($v13 ^ $v2, 16) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v2)) (i64.const 16))) + + ;; $v8 = $v8 + $v13 + (set_local $v8 (i64.add (get_local $v8) (get_local $v13))) + + ;; $v7 = rotr64($v7 ^ $v8, 63) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v8)) (i64.const 63))) + + ;; G(6, 7) + + ;; $v3 = $v3 + $v4 + $m8 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v4) (get_local $m8)))) + + ;; $v14 = rotr64($v14 ^ $v3, 32) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v3)) (i64.const 32))) + + ;; $v9 = $v9 + $v14 + (set_local $v9 (i64.add (get_local $v9) (get_local $v14))) + + ;; $v4 = rotr64($v4 ^ $v9, 24) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v9)) (i64.const 24))) + + ;; $v3 = $v3 + $v4 + $m11 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v4) (get_local $m11)))) + + ;; $v14 = rotr64($v14 ^ $v3, 16) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v3)) (i64.const 16))) + + ;; $v9 = $v9 + $v14 + (set_local $v9 (i64.add (get_local $v9) (get_local $v14))) + + ;; $v4 = rotr64($v4 ^ $v9, 63) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v9)) (i64.const 63))) + + ;; ROUND(7) + + ;; G(7, 0) + + ;; $v0 = $v0 + $v4 + $m13 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v4) (get_local $m13)))) + + ;; $v12 = rotr64($v12 ^ $v0, 32) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v0)) (i64.const 32))) + + ;; $v8 = $v8 + $v12 + (set_local $v8 (i64.add (get_local $v8) (get_local $v12))) + + ;; $v4 = rotr64($v4 ^ $v8, 24) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v8)) (i64.const 24))) + + ;; $v0 = $v0 + $v4 + $m11 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v4) (get_local $m11)))) + + ;; $v12 = rotr64($v12 ^ $v0, 16) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v0)) (i64.const 16))) + + ;; $v8 = $v8 + $v12 + (set_local $v8 (i64.add (get_local $v8) (get_local $v12))) + + ;; $v4 = rotr64($v4 ^ $v8, 63) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v8)) (i64.const 63))) + + ;; G(7, 1) + + ;; $v1 = $v1 + $v5 + $m7 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v5) (get_local $m7)))) + + ;; $v13 = rotr64($v13 ^ $v1, 32) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v1)) (i64.const 32))) + + ;; $v9 = $v9 + $v13 + (set_local $v9 (i64.add (get_local $v9) (get_local $v13))) + + ;; $v5 = rotr64($v5 ^ $v9, 24) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v9)) (i64.const 24))) + + ;; $v1 = $v1 + $v5 + $m14 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v5) (get_local $m14)))) + + ;; $v13 = rotr64($v13 ^ $v1, 16) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v1)) (i64.const 16))) + + ;; $v9 = $v9 + $v13 + (set_local $v9 (i64.add (get_local $v9) (get_local $v13))) + + ;; $v5 = rotr64($v5 ^ $v9, 63) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v9)) (i64.const 63))) + + ;; G(7, 2) + + ;; $v2 = $v2 + $v6 + $m12 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v6) (get_local $m12)))) + + ;; $v14 = rotr64($v14 ^ $v2, 32) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v2)) (i64.const 32))) + + ;; $v10 = $v10 + $v14 + (set_local $v10 (i64.add (get_local $v10) (get_local $v14))) + + ;; $v6 = rotr64($v6 ^ $v10, 24) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v10)) (i64.const 24))) + + ;; $v2 = $v2 + $v6 + $m1 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v6) (get_local $m1)))) + + ;; $v14 = rotr64($v14 ^ $v2, 16) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v2)) (i64.const 16))) + + ;; $v10 = $v10 + $v14 + (set_local $v10 (i64.add (get_local $v10) (get_local $v14))) + + ;; $v6 = rotr64($v6 ^ $v10, 63) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v10)) (i64.const 63))) + + ;; G(7, 3) + + ;; $v3 = $v3 + $v7 + $m3 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v7) (get_local $m3)))) + + ;; $v15 = rotr64($v15 ^ $v3, 32) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v3)) (i64.const 32))) + + ;; $v11 = $v11 + $v15 + (set_local $v11 (i64.add (get_local $v11) (get_local $v15))) + + ;; $v7 = rotr64($v7 ^ $v11, 24) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v11)) (i64.const 24))) + + ;; $v3 = $v3 + $v7 + $m9 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v7) (get_local $m9)))) + + ;; $v15 = rotr64($v15 ^ $v3, 16) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v3)) (i64.const 16))) + + ;; $v11 = $v11 + $v15 + (set_local $v11 (i64.add (get_local $v11) (get_local $v15))) + + ;; $v7 = rotr64($v7 ^ $v11, 63) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v11)) (i64.const 63))) + + ;; G(7, 4) + + ;; $v0 = $v0 + $v5 + $m5 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v5) (get_local $m5)))) + + ;; $v15 = rotr64($v15 ^ $v0, 32) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v0)) (i64.const 32))) + + ;; $v10 = $v10 + $v15 + (set_local $v10 (i64.add (get_local $v10) (get_local $v15))) + + ;; $v5 = rotr64($v5 ^ $v10, 24) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v10)) (i64.const 24))) + + ;; $v0 = $v0 + $v5 + $m0 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v5) (get_local $m0)))) + + ;; $v15 = rotr64($v15 ^ $v0, 16) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v0)) (i64.const 16))) + + ;; $v10 = $v10 + $v15 + (set_local $v10 (i64.add (get_local $v10) (get_local $v15))) + + ;; $v5 = rotr64($v5 ^ $v10, 63) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v10)) (i64.const 63))) + + ;; G(7, 5) + + ;; $v1 = $v1 + $v6 + $m15 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v6) (get_local $m15)))) + + ;; $v12 = rotr64($v12 ^ $v1, 32) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v1)) (i64.const 32))) + + ;; $v11 = $v11 + $v12 + (set_local $v11 (i64.add (get_local $v11) (get_local $v12))) + + ;; $v6 = rotr64($v6 ^ $v11, 24) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v11)) (i64.const 24))) + + ;; $v1 = $v1 + $v6 + $m4 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v6) (get_local $m4)))) + + ;; $v12 = rotr64($v12 ^ $v1, 16) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v1)) (i64.const 16))) + + ;; $v11 = $v11 + $v12 + (set_local $v11 (i64.add (get_local $v11) (get_local $v12))) + + ;; $v6 = rotr64($v6 ^ $v11, 63) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v11)) (i64.const 63))) + + ;; G(7, 6) + + ;; $v2 = $v2 + $v7 + $m8 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v7) (get_local $m8)))) + + ;; $v13 = rotr64($v13 ^ $v2, 32) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v2)) (i64.const 32))) + + ;; $v8 = $v8 + $v13 + (set_local $v8 (i64.add (get_local $v8) (get_local $v13))) + + ;; $v7 = rotr64($v7 ^ $v8, 24) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v8)) (i64.const 24))) + + ;; $v2 = $v2 + $v7 + $m6 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v7) (get_local $m6)))) + + ;; $v13 = rotr64($v13 ^ $v2, 16) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v2)) (i64.const 16))) + + ;; $v8 = $v8 + $v13 + (set_local $v8 (i64.add (get_local $v8) (get_local $v13))) + + ;; $v7 = rotr64($v7 ^ $v8, 63) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v8)) (i64.const 63))) + + ;; G(7, 7) + + ;; $v3 = $v3 + $v4 + $m2 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v4) (get_local $m2)))) + + ;; $v14 = rotr64($v14 ^ $v3, 32) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v3)) (i64.const 32))) + + ;; $v9 = $v9 + $v14 + (set_local $v9 (i64.add (get_local $v9) (get_local $v14))) + + ;; $v4 = rotr64($v4 ^ $v9, 24) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v9)) (i64.const 24))) + + ;; $v3 = $v3 + $v4 + $m10 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v4) (get_local $m10)))) + + ;; $v14 = rotr64($v14 ^ $v3, 16) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v3)) (i64.const 16))) + + ;; $v9 = $v9 + $v14 + (set_local $v9 (i64.add (get_local $v9) (get_local $v14))) + + ;; $v4 = rotr64($v4 ^ $v9, 63) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v9)) (i64.const 63))) + + ;; ROUND(8) + + ;; G(8, 0) + + ;; $v0 = $v0 + $v4 + $m6 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v4) (get_local $m6)))) + + ;; $v12 = rotr64($v12 ^ $v0, 32) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v0)) (i64.const 32))) + + ;; $v8 = $v8 + $v12 + (set_local $v8 (i64.add (get_local $v8) (get_local $v12))) + + ;; $v4 = rotr64($v4 ^ $v8, 24) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v8)) (i64.const 24))) + + ;; $v0 = $v0 + $v4 + $m15 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v4) (get_local $m15)))) + + ;; $v12 = rotr64($v12 ^ $v0, 16) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v0)) (i64.const 16))) + + ;; $v8 = $v8 + $v12 + (set_local $v8 (i64.add (get_local $v8) (get_local $v12))) + + ;; $v4 = rotr64($v4 ^ $v8, 63) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v8)) (i64.const 63))) + + ;; G(8, 1) + + ;; $v1 = $v1 + $v5 + $m14 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v5) (get_local $m14)))) + + ;; $v13 = rotr64($v13 ^ $v1, 32) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v1)) (i64.const 32))) + + ;; $v9 = $v9 + $v13 + (set_local $v9 (i64.add (get_local $v9) (get_local $v13))) + + ;; $v5 = rotr64($v5 ^ $v9, 24) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v9)) (i64.const 24))) + + ;; $v1 = $v1 + $v5 + $m9 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v5) (get_local $m9)))) + + ;; $v13 = rotr64($v13 ^ $v1, 16) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v1)) (i64.const 16))) + + ;; $v9 = $v9 + $v13 + (set_local $v9 (i64.add (get_local $v9) (get_local $v13))) + + ;; $v5 = rotr64($v5 ^ $v9, 63) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v9)) (i64.const 63))) + + ;; G(8, 2) + + ;; $v2 = $v2 + $v6 + $m11 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v6) (get_local $m11)))) + + ;; $v14 = rotr64($v14 ^ $v2, 32) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v2)) (i64.const 32))) + + ;; $v10 = $v10 + $v14 + (set_local $v10 (i64.add (get_local $v10) (get_local $v14))) + + ;; $v6 = rotr64($v6 ^ $v10, 24) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v10)) (i64.const 24))) + + ;; $v2 = $v2 + $v6 + $m3 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v6) (get_local $m3)))) + + ;; $v14 = rotr64($v14 ^ $v2, 16) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v2)) (i64.const 16))) + + ;; $v10 = $v10 + $v14 + (set_local $v10 (i64.add (get_local $v10) (get_local $v14))) + + ;; $v6 = rotr64($v6 ^ $v10, 63) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v10)) (i64.const 63))) + + ;; G(8, 3) + + ;; $v3 = $v3 + $v7 + $m0 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v7) (get_local $m0)))) + + ;; $v15 = rotr64($v15 ^ $v3, 32) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v3)) (i64.const 32))) + + ;; $v11 = $v11 + $v15 + (set_local $v11 (i64.add (get_local $v11) (get_local $v15))) + + ;; $v7 = rotr64($v7 ^ $v11, 24) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v11)) (i64.const 24))) + + ;; $v3 = $v3 + $v7 + $m8 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v7) (get_local $m8)))) + + ;; $v15 = rotr64($v15 ^ $v3, 16) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v3)) (i64.const 16))) + + ;; $v11 = $v11 + $v15 + (set_local $v11 (i64.add (get_local $v11) (get_local $v15))) + + ;; $v7 = rotr64($v7 ^ $v11, 63) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v11)) (i64.const 63))) + + ;; G(8, 4) + + ;; $v0 = $v0 + $v5 + $m12 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v5) (get_local $m12)))) + + ;; $v15 = rotr64($v15 ^ $v0, 32) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v0)) (i64.const 32))) + + ;; $v10 = $v10 + $v15 + (set_local $v10 (i64.add (get_local $v10) (get_local $v15))) + + ;; $v5 = rotr64($v5 ^ $v10, 24) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v10)) (i64.const 24))) + + ;; $v0 = $v0 + $v5 + $m2 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v5) (get_local $m2)))) + + ;; $v15 = rotr64($v15 ^ $v0, 16) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v0)) (i64.const 16))) + + ;; $v10 = $v10 + $v15 + (set_local $v10 (i64.add (get_local $v10) (get_local $v15))) + + ;; $v5 = rotr64($v5 ^ $v10, 63) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v10)) (i64.const 63))) + + ;; G(8, 5) + + ;; $v1 = $v1 + $v6 + $m13 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v6) (get_local $m13)))) + + ;; $v12 = rotr64($v12 ^ $v1, 32) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v1)) (i64.const 32))) + + ;; $v11 = $v11 + $v12 + (set_local $v11 (i64.add (get_local $v11) (get_local $v12))) + + ;; $v6 = rotr64($v6 ^ $v11, 24) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v11)) (i64.const 24))) + + ;; $v1 = $v1 + $v6 + $m7 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v6) (get_local $m7)))) + + ;; $v12 = rotr64($v12 ^ $v1, 16) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v1)) (i64.const 16))) + + ;; $v11 = $v11 + $v12 + (set_local $v11 (i64.add (get_local $v11) (get_local $v12))) + + ;; $v6 = rotr64($v6 ^ $v11, 63) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v11)) (i64.const 63))) + + ;; G(8, 6) + + ;; $v2 = $v2 + $v7 + $m1 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v7) (get_local $m1)))) + + ;; $v13 = rotr64($v13 ^ $v2, 32) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v2)) (i64.const 32))) + + ;; $v8 = $v8 + $v13 + (set_local $v8 (i64.add (get_local $v8) (get_local $v13))) + + ;; $v7 = rotr64($v7 ^ $v8, 24) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v8)) (i64.const 24))) + + ;; $v2 = $v2 + $v7 + $m4 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v7) (get_local $m4)))) + + ;; $v13 = rotr64($v13 ^ $v2, 16) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v2)) (i64.const 16))) + + ;; $v8 = $v8 + $v13 + (set_local $v8 (i64.add (get_local $v8) (get_local $v13))) + + ;; $v7 = rotr64($v7 ^ $v8, 63) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v8)) (i64.const 63))) + + ;; G(8, 7) + + ;; $v3 = $v3 + $v4 + $m10 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v4) (get_local $m10)))) + + ;; $v14 = rotr64($v14 ^ $v3, 32) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v3)) (i64.const 32))) + + ;; $v9 = $v9 + $v14 + (set_local $v9 (i64.add (get_local $v9) (get_local $v14))) + + ;; $v4 = rotr64($v4 ^ $v9, 24) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v9)) (i64.const 24))) + + ;; $v3 = $v3 + $v4 + $m5 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v4) (get_local $m5)))) + + ;; $v14 = rotr64($v14 ^ $v3, 16) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v3)) (i64.const 16))) + + ;; $v9 = $v9 + $v14 + (set_local $v9 (i64.add (get_local $v9) (get_local $v14))) + + ;; $v4 = rotr64($v4 ^ $v9, 63) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v9)) (i64.const 63))) + + ;; ROUND(9) + + ;; G(9, 0) + + ;; $v0 = $v0 + $v4 + $m10 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v4) (get_local $m10)))) + + ;; $v12 = rotr64($v12 ^ $v0, 32) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v0)) (i64.const 32))) + + ;; $v8 = $v8 + $v12 + (set_local $v8 (i64.add (get_local $v8) (get_local $v12))) + + ;; $v4 = rotr64($v4 ^ $v8, 24) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v8)) (i64.const 24))) + + ;; $v0 = $v0 + $v4 + $m2 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v4) (get_local $m2)))) + + ;; $v12 = rotr64($v12 ^ $v0, 16) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v0)) (i64.const 16))) + + ;; $v8 = $v8 + $v12 + (set_local $v8 (i64.add (get_local $v8) (get_local $v12))) + + ;; $v4 = rotr64($v4 ^ $v8, 63) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v8)) (i64.const 63))) + + ;; G(9, 1) + + ;; $v1 = $v1 + $v5 + $m8 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v5) (get_local $m8)))) + + ;; $v13 = rotr64($v13 ^ $v1, 32) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v1)) (i64.const 32))) + + ;; $v9 = $v9 + $v13 + (set_local $v9 (i64.add (get_local $v9) (get_local $v13))) + + ;; $v5 = rotr64($v5 ^ $v9, 24) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v9)) (i64.const 24))) + + ;; $v1 = $v1 + $v5 + $m4 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v5) (get_local $m4)))) + + ;; $v13 = rotr64($v13 ^ $v1, 16) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v1)) (i64.const 16))) + + ;; $v9 = $v9 + $v13 + (set_local $v9 (i64.add (get_local $v9) (get_local $v13))) + + ;; $v5 = rotr64($v5 ^ $v9, 63) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v9)) (i64.const 63))) + + ;; G(9, 2) + + ;; $v2 = $v2 + $v6 + $m7 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v6) (get_local $m7)))) + + ;; $v14 = rotr64($v14 ^ $v2, 32) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v2)) (i64.const 32))) + + ;; $v10 = $v10 + $v14 + (set_local $v10 (i64.add (get_local $v10) (get_local $v14))) + + ;; $v6 = rotr64($v6 ^ $v10, 24) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v10)) (i64.const 24))) + + ;; $v2 = $v2 + $v6 + $m6 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v6) (get_local $m6)))) + + ;; $v14 = rotr64($v14 ^ $v2, 16) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v2)) (i64.const 16))) + + ;; $v10 = $v10 + $v14 + (set_local $v10 (i64.add (get_local $v10) (get_local $v14))) + + ;; $v6 = rotr64($v6 ^ $v10, 63) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v10)) (i64.const 63))) + + ;; G(9, 3) + + ;; $v3 = $v3 + $v7 + $m1 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v7) (get_local $m1)))) + + ;; $v15 = rotr64($v15 ^ $v3, 32) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v3)) (i64.const 32))) + + ;; $v11 = $v11 + $v15 + (set_local $v11 (i64.add (get_local $v11) (get_local $v15))) + + ;; $v7 = rotr64($v7 ^ $v11, 24) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v11)) (i64.const 24))) + + ;; $v3 = $v3 + $v7 + $m5 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v7) (get_local $m5)))) + + ;; $v15 = rotr64($v15 ^ $v3, 16) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v3)) (i64.const 16))) + + ;; $v11 = $v11 + $v15 + (set_local $v11 (i64.add (get_local $v11) (get_local $v15))) + + ;; $v7 = rotr64($v7 ^ $v11, 63) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v11)) (i64.const 63))) + + ;; G(9, 4) + + ;; $v0 = $v0 + $v5 + $m15 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v5) (get_local $m15)))) + + ;; $v15 = rotr64($v15 ^ $v0, 32) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v0)) (i64.const 32))) + + ;; $v10 = $v10 + $v15 + (set_local $v10 (i64.add (get_local $v10) (get_local $v15))) + + ;; $v5 = rotr64($v5 ^ $v10, 24) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v10)) (i64.const 24))) + + ;; $v0 = $v0 + $v5 + $m11 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v5) (get_local $m11)))) + + ;; $v15 = rotr64($v15 ^ $v0, 16) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v0)) (i64.const 16))) + + ;; $v10 = $v10 + $v15 + (set_local $v10 (i64.add (get_local $v10) (get_local $v15))) + + ;; $v5 = rotr64($v5 ^ $v10, 63) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v10)) (i64.const 63))) + + ;; G(9, 5) + + ;; $v1 = $v1 + $v6 + $m9 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v6) (get_local $m9)))) + + ;; $v12 = rotr64($v12 ^ $v1, 32) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v1)) (i64.const 32))) + + ;; $v11 = $v11 + $v12 + (set_local $v11 (i64.add (get_local $v11) (get_local $v12))) + + ;; $v6 = rotr64($v6 ^ $v11, 24) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v11)) (i64.const 24))) + + ;; $v1 = $v1 + $v6 + $m14 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v6) (get_local $m14)))) + + ;; $v12 = rotr64($v12 ^ $v1, 16) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v1)) (i64.const 16))) + + ;; $v11 = $v11 + $v12 + (set_local $v11 (i64.add (get_local $v11) (get_local $v12))) + + ;; $v6 = rotr64($v6 ^ $v11, 63) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v11)) (i64.const 63))) + + ;; G(9, 6) + + ;; $v2 = $v2 + $v7 + $m3 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v7) (get_local $m3)))) + + ;; $v13 = rotr64($v13 ^ $v2, 32) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v2)) (i64.const 32))) + + ;; $v8 = $v8 + $v13 + (set_local $v8 (i64.add (get_local $v8) (get_local $v13))) + + ;; $v7 = rotr64($v7 ^ $v8, 24) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v8)) (i64.const 24))) + + ;; $v2 = $v2 + $v7 + $m12 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v7) (get_local $m12)))) + + ;; $v13 = rotr64($v13 ^ $v2, 16) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v2)) (i64.const 16))) + + ;; $v8 = $v8 + $v13 + (set_local $v8 (i64.add (get_local $v8) (get_local $v13))) + + ;; $v7 = rotr64($v7 ^ $v8, 63) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v8)) (i64.const 63))) + + ;; G(9, 7) + + ;; $v3 = $v3 + $v4 + $m13 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v4) (get_local $m13)))) + + ;; $v14 = rotr64($v14 ^ $v3, 32) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v3)) (i64.const 32))) + + ;; $v9 = $v9 + $v14 + (set_local $v9 (i64.add (get_local $v9) (get_local $v14))) + + ;; $v4 = rotr64($v4 ^ $v9, 24) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v9)) (i64.const 24))) + + ;; $v3 = $v3 + $v4 + $m0 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v4) (get_local $m0)))) + + ;; $v14 = rotr64($v14 ^ $v3, 16) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v3)) (i64.const 16))) + + ;; $v9 = $v9 + $v14 + (set_local $v9 (i64.add (get_local $v9) (get_local $v14))) + + ;; $v4 = rotr64($v4 ^ $v9, 63) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v9)) (i64.const 63))) + + ;; ROUND(10) + + ;; G(10, 0) + + ;; $v0 = $v0 + $v4 + $m0 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v4) (get_local $m0)))) + + ;; $v12 = rotr64($v12 ^ $v0, 32) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v0)) (i64.const 32))) + + ;; $v8 = $v8 + $v12 + (set_local $v8 (i64.add (get_local $v8) (get_local $v12))) + + ;; $v4 = rotr64($v4 ^ $v8, 24) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v8)) (i64.const 24))) + + ;; $v0 = $v0 + $v4 + $m1 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v4) (get_local $m1)))) + + ;; $v12 = rotr64($v12 ^ $v0, 16) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v0)) (i64.const 16))) + + ;; $v8 = $v8 + $v12 + (set_local $v8 (i64.add (get_local $v8) (get_local $v12))) + + ;; $v4 = rotr64($v4 ^ $v8, 63) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v8)) (i64.const 63))) + + ;; G(10, 1) + + ;; $v1 = $v1 + $v5 + $m2 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v5) (get_local $m2)))) + + ;; $v13 = rotr64($v13 ^ $v1, 32) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v1)) (i64.const 32))) + + ;; $v9 = $v9 + $v13 + (set_local $v9 (i64.add (get_local $v9) (get_local $v13))) + + ;; $v5 = rotr64($v5 ^ $v9, 24) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v9)) (i64.const 24))) + + ;; $v1 = $v1 + $v5 + $m3 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v5) (get_local $m3)))) + + ;; $v13 = rotr64($v13 ^ $v1, 16) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v1)) (i64.const 16))) + + ;; $v9 = $v9 + $v13 + (set_local $v9 (i64.add (get_local $v9) (get_local $v13))) + + ;; $v5 = rotr64($v5 ^ $v9, 63) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v9)) (i64.const 63))) + + ;; G(10, 2) + + ;; $v2 = $v2 + $v6 + $m4 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v6) (get_local $m4)))) + + ;; $v14 = rotr64($v14 ^ $v2, 32) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v2)) (i64.const 32))) + + ;; $v10 = $v10 + $v14 + (set_local $v10 (i64.add (get_local $v10) (get_local $v14))) + + ;; $v6 = rotr64($v6 ^ $v10, 24) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v10)) (i64.const 24))) + + ;; $v2 = $v2 + $v6 + $m5 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v6) (get_local $m5)))) + + ;; $v14 = rotr64($v14 ^ $v2, 16) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v2)) (i64.const 16))) + + ;; $v10 = $v10 + $v14 + (set_local $v10 (i64.add (get_local $v10) (get_local $v14))) + + ;; $v6 = rotr64($v6 ^ $v10, 63) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v10)) (i64.const 63))) + + ;; G(10, 3) + + ;; $v3 = $v3 + $v7 + $m6 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v7) (get_local $m6)))) + + ;; $v15 = rotr64($v15 ^ $v3, 32) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v3)) (i64.const 32))) + + ;; $v11 = $v11 + $v15 + (set_local $v11 (i64.add (get_local $v11) (get_local $v15))) + + ;; $v7 = rotr64($v7 ^ $v11, 24) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v11)) (i64.const 24))) + + ;; $v3 = $v3 + $v7 + $m7 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v7) (get_local $m7)))) + + ;; $v15 = rotr64($v15 ^ $v3, 16) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v3)) (i64.const 16))) + + ;; $v11 = $v11 + $v15 + (set_local $v11 (i64.add (get_local $v11) (get_local $v15))) + + ;; $v7 = rotr64($v7 ^ $v11, 63) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v11)) (i64.const 63))) + + ;; G(10, 4) + + ;; $v0 = $v0 + $v5 + $m8 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v5) (get_local $m8)))) + + ;; $v15 = rotr64($v15 ^ $v0, 32) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v0)) (i64.const 32))) + + ;; $v10 = $v10 + $v15 + (set_local $v10 (i64.add (get_local $v10) (get_local $v15))) + + ;; $v5 = rotr64($v5 ^ $v10, 24) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v10)) (i64.const 24))) + + ;; $v0 = $v0 + $v5 + $m9 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v5) (get_local $m9)))) + + ;; $v15 = rotr64($v15 ^ $v0, 16) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v0)) (i64.const 16))) + + ;; $v10 = $v10 + $v15 + (set_local $v10 (i64.add (get_local $v10) (get_local $v15))) + + ;; $v5 = rotr64($v5 ^ $v10, 63) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v10)) (i64.const 63))) + + ;; G(10, 5) + + ;; $v1 = $v1 + $v6 + $m10 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v6) (get_local $m10)))) + + ;; $v12 = rotr64($v12 ^ $v1, 32) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v1)) (i64.const 32))) + + ;; $v11 = $v11 + $v12 + (set_local $v11 (i64.add (get_local $v11) (get_local $v12))) + + ;; $v6 = rotr64($v6 ^ $v11, 24) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v11)) (i64.const 24))) + + ;; $v1 = $v1 + $v6 + $m11 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v6) (get_local $m11)))) + + ;; $v12 = rotr64($v12 ^ $v1, 16) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v1)) (i64.const 16))) + + ;; $v11 = $v11 + $v12 + (set_local $v11 (i64.add (get_local $v11) (get_local $v12))) + + ;; $v6 = rotr64($v6 ^ $v11, 63) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v11)) (i64.const 63))) + + ;; G(10, 6) + + ;; $v2 = $v2 + $v7 + $m12 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v7) (get_local $m12)))) + + ;; $v13 = rotr64($v13 ^ $v2, 32) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v2)) (i64.const 32))) + + ;; $v8 = $v8 + $v13 + (set_local $v8 (i64.add (get_local $v8) (get_local $v13))) + + ;; $v7 = rotr64($v7 ^ $v8, 24) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v8)) (i64.const 24))) + + ;; $v2 = $v2 + $v7 + $m13 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v7) (get_local $m13)))) + + ;; $v13 = rotr64($v13 ^ $v2, 16) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v2)) (i64.const 16))) + + ;; $v8 = $v8 + $v13 + (set_local $v8 (i64.add (get_local $v8) (get_local $v13))) + + ;; $v7 = rotr64($v7 ^ $v8, 63) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v8)) (i64.const 63))) + + ;; G(10, 7) + + ;; $v3 = $v3 + $v4 + $m14 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v4) (get_local $m14)))) + + ;; $v14 = rotr64($v14 ^ $v3, 32) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v3)) (i64.const 32))) + + ;; $v9 = $v9 + $v14 + (set_local $v9 (i64.add (get_local $v9) (get_local $v14))) + + ;; $v4 = rotr64($v4 ^ $v9, 24) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v9)) (i64.const 24))) + + ;; $v3 = $v3 + $v4 + $m15 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v4) (get_local $m15)))) + + ;; $v14 = rotr64($v14 ^ $v3, 16) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v3)) (i64.const 16))) + + ;; $v9 = $v9 + $v14 + (set_local $v9 (i64.add (get_local $v9) (get_local $v14))) + + ;; $v4 = rotr64($v4 ^ $v9, 63) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v9)) (i64.const 63))) + + ;; ROUND(11) + + ;; G(11, 0) + + ;; $v0 = $v0 + $v4 + $m14 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v4) (get_local $m14)))) + + ;; $v12 = rotr64($v12 ^ $v0, 32) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v0)) (i64.const 32))) + + ;; $v8 = $v8 + $v12 + (set_local $v8 (i64.add (get_local $v8) (get_local $v12))) + + ;; $v4 = rotr64($v4 ^ $v8, 24) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v8)) (i64.const 24))) + + ;; $v0 = $v0 + $v4 + $m10 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v4) (get_local $m10)))) + + ;; $v12 = rotr64($v12 ^ $v0, 16) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v0)) (i64.const 16))) + + ;; $v8 = $v8 + $v12 + (set_local $v8 (i64.add (get_local $v8) (get_local $v12))) + + ;; $v4 = rotr64($v4 ^ $v8, 63) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v8)) (i64.const 63))) + + ;; G(11, 1) + + ;; $v1 = $v1 + $v5 + $m4 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v5) (get_local $m4)))) + + ;; $v13 = rotr64($v13 ^ $v1, 32) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v1)) (i64.const 32))) + + ;; $v9 = $v9 + $v13 + (set_local $v9 (i64.add (get_local $v9) (get_local $v13))) + + ;; $v5 = rotr64($v5 ^ $v9, 24) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v9)) (i64.const 24))) + + ;; $v1 = $v1 + $v5 + $m8 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v5) (get_local $m8)))) + + ;; $v13 = rotr64($v13 ^ $v1, 16) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v1)) (i64.const 16))) + + ;; $v9 = $v9 + $v13 + (set_local $v9 (i64.add (get_local $v9) (get_local $v13))) + + ;; $v5 = rotr64($v5 ^ $v9, 63) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v9)) (i64.const 63))) + + ;; G(11, 2) + + ;; $v2 = $v2 + $v6 + $m9 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v6) (get_local $m9)))) + + ;; $v14 = rotr64($v14 ^ $v2, 32) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v2)) (i64.const 32))) + + ;; $v10 = $v10 + $v14 + (set_local $v10 (i64.add (get_local $v10) (get_local $v14))) + + ;; $v6 = rotr64($v6 ^ $v10, 24) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v10)) (i64.const 24))) + + ;; $v2 = $v2 + $v6 + $m15 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v6) (get_local $m15)))) + + ;; $v14 = rotr64($v14 ^ $v2, 16) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v2)) (i64.const 16))) + + ;; $v10 = $v10 + $v14 + (set_local $v10 (i64.add (get_local $v10) (get_local $v14))) + + ;; $v6 = rotr64($v6 ^ $v10, 63) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v10)) (i64.const 63))) + + ;; G(11, 3) + + ;; $v3 = $v3 + $v7 + $m13 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v7) (get_local $m13)))) + + ;; $v15 = rotr64($v15 ^ $v3, 32) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v3)) (i64.const 32))) + + ;; $v11 = $v11 + $v15 + (set_local $v11 (i64.add (get_local $v11) (get_local $v15))) + + ;; $v7 = rotr64($v7 ^ $v11, 24) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v11)) (i64.const 24))) + + ;; $v3 = $v3 + $v7 + $m6 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v7) (get_local $m6)))) + + ;; $v15 = rotr64($v15 ^ $v3, 16) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v3)) (i64.const 16))) + + ;; $v11 = $v11 + $v15 + (set_local $v11 (i64.add (get_local $v11) (get_local $v15))) + + ;; $v7 = rotr64($v7 ^ $v11, 63) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v11)) (i64.const 63))) + + ;; G(11, 4) + + ;; $v0 = $v0 + $v5 + $m1 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v5) (get_local $m1)))) + + ;; $v15 = rotr64($v15 ^ $v0, 32) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v0)) (i64.const 32))) + + ;; $v10 = $v10 + $v15 + (set_local $v10 (i64.add (get_local $v10) (get_local $v15))) + + ;; $v5 = rotr64($v5 ^ $v10, 24) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v10)) (i64.const 24))) + + ;; $v0 = $v0 + $v5 + $m12 + (set_local $v0 (i64.add (get_local $v0) (i64.add (get_local $v5) (get_local $m12)))) + + ;; $v15 = rotr64($v15 ^ $v0, 16) + (set_local $v15 (i64.rotr (i64.xor (get_local $v15) (get_local $v0)) (i64.const 16))) + + ;; $v10 = $v10 + $v15 + (set_local $v10 (i64.add (get_local $v10) (get_local $v15))) + + ;; $v5 = rotr64($v5 ^ $v10, 63) + (set_local $v5 (i64.rotr (i64.xor (get_local $v5) (get_local $v10)) (i64.const 63))) + + ;; G(11, 5) + + ;; $v1 = $v1 + $v6 + $m0 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v6) (get_local $m0)))) + + ;; $v12 = rotr64($v12 ^ $v1, 32) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v1)) (i64.const 32))) + + ;; $v11 = $v11 + $v12 + (set_local $v11 (i64.add (get_local $v11) (get_local $v12))) + + ;; $v6 = rotr64($v6 ^ $v11, 24) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v11)) (i64.const 24))) + + ;; $v1 = $v1 + $v6 + $m2 + (set_local $v1 (i64.add (get_local $v1) (i64.add (get_local $v6) (get_local $m2)))) + + ;; $v12 = rotr64($v12 ^ $v1, 16) + (set_local $v12 (i64.rotr (i64.xor (get_local $v12) (get_local $v1)) (i64.const 16))) + + ;; $v11 = $v11 + $v12 + (set_local $v11 (i64.add (get_local $v11) (get_local $v12))) + + ;; $v6 = rotr64($v6 ^ $v11, 63) + (set_local $v6 (i64.rotr (i64.xor (get_local $v6) (get_local $v11)) (i64.const 63))) + + ;; G(11, 6) + + ;; $v2 = $v2 + $v7 + $m11 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v7) (get_local $m11)))) + + ;; $v13 = rotr64($v13 ^ $v2, 32) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v2)) (i64.const 32))) + + ;; $v8 = $v8 + $v13 + (set_local $v8 (i64.add (get_local $v8) (get_local $v13))) + + ;; $v7 = rotr64($v7 ^ $v8, 24) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v8)) (i64.const 24))) + + ;; $v2 = $v2 + $v7 + $m7 + (set_local $v2 (i64.add (get_local $v2) (i64.add (get_local $v7) (get_local $m7)))) + + ;; $v13 = rotr64($v13 ^ $v2, 16) + (set_local $v13 (i64.rotr (i64.xor (get_local $v13) (get_local $v2)) (i64.const 16))) + + ;; $v8 = $v8 + $v13 + (set_local $v8 (i64.add (get_local $v8) (get_local $v13))) + + ;; $v7 = rotr64($v7 ^ $v8, 63) + (set_local $v7 (i64.rotr (i64.xor (get_local $v7) (get_local $v8)) (i64.const 63))) + + ;; G(11, 7) + + ;; $v3 = $v3 + $v4 + $m5 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v4) (get_local $m5)))) + + ;; $v14 = rotr64($v14 ^ $v3, 32) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v3)) (i64.const 32))) + + ;; $v9 = $v9 + $v14 + (set_local $v9 (i64.add (get_local $v9) (get_local $v14))) + + ;; $v4 = rotr64($v4 ^ $v9, 24) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v9)) (i64.const 24))) + + ;; $v3 = $v3 + $v4 + $m3 + (set_local $v3 (i64.add (get_local $v3) (i64.add (get_local $v4) (get_local $m3)))) + + ;; $v14 = rotr64($v14 ^ $v3, 16) + (set_local $v14 (i64.rotr (i64.xor (get_local $v14) (get_local $v3)) (i64.const 16))) + + ;; $v9 = $v9 + $v14 + (set_local $v9 (i64.add (get_local $v9) (get_local $v14))) + + ;; $v4 = rotr64($v4 ^ $v9, 63) + (set_local $v4 (i64.rotr (i64.xor (get_local $v4) (get_local $v9)) (i64.const 63))) + + ;; END OF GENERATED CODE + + (i64.store (get_local $h0) + (i64.xor + (i64.load (get_local $h0)) + (i64.xor + (get_local $v0) + (get_local $v8) + ) + ) + ) + + (i64.store (get_local $h1) + (i64.xor + (i64.load (get_local $h1)) + (i64.xor + (get_local $v1) + (get_local $v9) + ) + ) + ) + + (i64.store (get_local $h2) + (i64.xor + (i64.load (get_local $h2)) + (i64.xor + (get_local $v2) + (get_local $v10) + ) + ) + ) + + (i64.store (get_local $h3) + (i64.xor + (i64.load (get_local $h3)) + (i64.xor + (get_local $v3) + (get_local $v11) + ) + ) + ) + + (i64.store (get_local $h4) + (i64.xor + (i64.load (get_local $h4)) + (i64.xor + (get_local $v4) + (get_local $v12) + ) + ) + ) + + (i64.store (get_local $h5) + (i64.xor + (i64.load (get_local $h5)) + (i64.xor + (get_local $v5) + (get_local $v13) + ) + ) + ) + + (i64.store (get_local $h6) + (i64.xor + (i64.load (get_local $h6)) + (i64.xor + (get_local $v6) + (get_local $v14) + ) + ) + ) + + (i64.store (get_local $h7) + (i64.xor + (i64.load (get_local $h7)) + (i64.xor + (get_local $v7) + (get_local $v15) + ) + ) + ) + ) +) diff --git a/example.html b/example.html new file mode 100644 index 0000000..a87ecc6 --- /dev/null +++ b/example.html @@ -0,0 +1,14 @@ + + + + Blake2b-WASM Demo + + +
    +
  1. Run `npm run demo` if you haven't
  2. +
  3. Reload this page
  4. +
  5. Open the console
  6. +
+ + + diff --git a/example.js b/example.js new file mode 100644 index 0000000..390c418 --- /dev/null +++ b/example.js @@ -0,0 +1,12 @@ +var blake2b = require('./') + +blake2b.ready(function () { + var hash = blake2b() + .update(new Buffer('hello')) + .update(new Buffer(' ')) + .update(new Buffer('world')) + .digest('hex') + + console.log('Blake2b hash of "hello world" is %s', hash) +}) + diff --git a/generate-rounds.js b/generate-rounds.js new file mode 100644 index 0000000..b646613 --- /dev/null +++ b/generate-rounds.js @@ -0,0 +1,77 @@ +var sigma = [ + [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ] , + [ 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 ] , + [ 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 ] , + [ 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 ] , + [ 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 ] , + [ 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 ] , + [ 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 ] , + [ 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 ] , + [ 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 ] , + [ 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0 ] , + [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ] , + [ 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 ] +] + +function G (r, i, a, b, c, d) { + return ` + ;; G(${r}, ${i}) + + ;; ${a} = ${a} + ${b} + $m${sigma[r][2*i+0]} + (set_local ${a} (i64.add (get_local ${a}) (i64.add (get_local ${b}) (get_local $m${sigma[r][2*i+0]})))) + + ;; ${d} = rotr64(${d} ^ ${a}, 32) + (set_local ${d} (i64.rotr (i64.xor (get_local ${d}) (get_local ${a})) (i64.const 32))) + + ;; ${c} = ${c} + ${d} + (set_local ${c} (i64.add (get_local ${c}) (get_local ${d}))) + + ;; ${b} = rotr64(${b} ^ ${c}, 24) + (set_local ${b} (i64.rotr (i64.xor (get_local ${b}) (get_local ${c})) (i64.const 24))) + + ;; ${a} = ${a} + ${b} + $m${sigma[r][2*i+1]} + (set_local ${a} (i64.add (get_local ${a}) (i64.add (get_local ${b}) (get_local $m${sigma[r][2*i+1]})))) + + ;; ${d} = rotr64(${d} ^ ${a}, 16) + (set_local ${d} (i64.rotr (i64.xor (get_local ${d}) (get_local ${a})) (i64.const 16))) + + ;; ${c} = ${c} + ${d} + (set_local ${c} (i64.add (get_local ${c}) (get_local ${d}))) + + ;; ${b} = rotr64(${b} ^ ${c}, 63) + (set_local ${b} (i64.rotr (i64.xor (get_local ${b}) (get_local ${c})) (i64.const 63)))` +} + +function ROUND (r) { + return ` + ;; ROUND(${r}) + ${G(r,0, '$v0', '$v4', '$v8', '$v12')} + ${G(r,1, '$v1', '$v5', '$v9', '$v13')} + ${G(r,2, '$v2', '$v6', '$v10', '$v14')} + ${G(r,3, '$v3', '$v7', '$v11', '$v15')} + ${G(r,4, '$v0', '$v5', '$v10', '$v15')} + ${G(r,5, '$v1', '$v6', '$v11', '$v12')} + ${G(r,6, '$v2', '$v7', '$v8', '$v13')} + ${G(r,7, '$v3', '$v4', '$v9', '$v14')} + ` +} +// function rotr64 (w, c) { +// i64 +// // ( w >> c ) | ( w << ( 64 - c ) ) +// rotr64 +// } + +console.log( + ROUND( 0 ), + ROUND( 1 ), + ROUND( 2 ), + ROUND( 3 ), + ROUND( 4 ), + ROUND( 5 ), + ROUND( 6 ), + ROUND( 7 ), + ROUND( 8 ), + ROUND( 9 ), + ROUND( 10 ), + ROUND( 11 ) +) diff --git a/index.js b/index.js new file mode 100644 index 0000000..4a58975 --- /dev/null +++ b/index.js @@ -0,0 +1,94 @@ +var fs = require('fs') +var buf = toUint8Array(fs.readFileSync(__dirname + '/blake2b.wasm', 'base64')) +var rdy + +var head = 64 +var mod = null +var memory = null +var freeList = [] + +module.exports = Blake2b + +function Blake2b () { + if (!(this instanceof Blake2b)) return new Blake2b() + if (!mod) throw new Error('WASM not loaded. Wait for Blake2b.ready(cb)') + + if (!freeList.length) { + freeList.push(head) + head += 216 + } + + this.finalized = false + this.pointer = freeList.pop() + mod.blake2b_init(this.pointer, 32) +} + +Blake2b.prototype.ready = Blake2b.ready + +Blake2b.prototype.update = function (input) { + if (this.finalized) throw new Error('Hash instance finalized') + + memory.set(input, head) + mod.blake2b_update(this.pointer, head, head + input.length) + return this +} + +Blake2b.prototype.digest = function (enc) { + if (this.finalized) throw new Error('Hash instance finalized') + this.finalized = true + + freeList.push(this.pointer) + mod.blake2b_final(this.pointer) + + if (!enc || enc === 'binary') return memory.slice(this.pointer + 128, this.pointer + 128 + 32) + if (enc === 'hex') return hexSlice(memory, this.pointer + 128, 32) + + for (var i = 0; i < 32; i++) enc[i] = memory[this.pointer + 128 + i] + return enc +} + +Blake2b.WASM = buf +Blake2b.SUPPORTED = typeof WebAssembly !== 'undefined' + +Blake2b.ready = function (cb) { + if (!cb) cb = noop + if (!Blake2b.SUPPORTED) return cb(new Error('WebAssembly not supported')) + + if (!rdy) { + rdy = WebAssembly.instantiate(buf).then(setup) + } + + return rdy.then(cb).catch(cb) +} + +function noop () {} + +function hexSlice (buf, start, len) { + var str = '' + for (var i = 0; i < len; i++) str += toHex(buf[start + i]) + return str +} + +function toHex (n) { + if (n < 16) return '0' + n.toString(16) + return n.toString(16) +} + +function setup (w) { + mod = w.instance.exports + memory = new Uint8Array(w.instance.exports.memory.buffer) +} + +function toUint8Array (s) { + if (typeof atob === 'function') { + return new Uint8Array(atob(s).split('').map(charCodeAt)) + } + var b = require('buf' + 'fer') + return new b.Buffer(s, 'base64') +} + +function charCodeAt (c) { + return c.charCodeAt(0) +} + +window.Blake2b = module.exports diff --git a/package.json b/package.json new file mode 100644 index 0000000..6f316ae --- /dev/null +++ b/package.json @@ -0,0 +1,31 @@ +{ + "name": "blake2b-wasm", + "version": "0.0.0", + "description": "Blake2b implemented in WASM", + "main": "index.js", + "dependencies": { + "brfs": "^1.4.3" + }, + "devDependencies": { + "browserify": "^14.4.0" + }, + "browserify": { + "transform": [ + "brfs" + ] + }, + "scripts": { + "compile": "wast2wasm blake2b.wat -o blake2b.wasm", + "demo": "browserify example.js > bundle.js" + }, + "repository": { + "type": "git", + "url": "https://github.com/mafintosh/blake2b-wasm.git" + }, + "author": "Mathias Buus (@mafintosh)", + "license": "MIT", + "bugs": { + "url": "https://github.com/mafintosh/blake2b-wasm/issues" + }, + "homepage": "https://github.com/mafintosh/blake2b-wasm" +}