sodium-javascript/wasm/siphash.wat
2017-06-12 10:05:49 +02:00

349 lines
13 KiB
Plaintext

(module
(memory (export "siphash_memory") 10 10)
(func (export "siphash") (param $ptr i32) (param $ptr_len i32)
(local $v0 i64)
(local $v1 i64)
(local $v2 i64)
(local $v3 i64)
(local $b i64)
(local $k0 i64)
(local $k1 i64)
(local $m i64)
(local $end i32)
(local $left i32)
(set_local $v0 (i64.const 0x736f6d6570736575))
(set_local $v1 (i64.const 0x646f72616e646f6d))
(set_local $v2 (i64.const 0x6c7967656e657261))
(set_local $v3 (i64.const 0x7465646279746573))
(set_local $k0 (i64.load (i32.const 8)))
(set_local $k1 (i64.load (i32.const 16)))
;; b = ((uint64_t) inlen) << 56;
(set_local $b (i64.shl (i64.extend_u/i32 (get_local $ptr_len)) (i64.const 56)))
;; left = inlen & 7;
(set_local $left (i32.and (get_local $ptr_len) (i32.const 7)))
;; end = in + inlen - left;
(set_local $end (i32.sub (i32.add (get_local $ptr) (get_local $ptr_len)) (get_local $left)))
;; v3 ^= k1;
(set_local $v3 (i64.xor (get_local $v3) (get_local $k1)))
;; v2 ^= k0;
(set_local $v2 (i64.xor (get_local $v2) (get_local $k0)))
;; v1 ^= k1;
(set_local $v1 (i64.xor (get_local $v1) (get_local $k1)))
;; v0 ^= k0;
(set_local $v0 (i64.xor (get_local $v0) (get_local $k0)))
(block $end_loop
(loop $start_loop
(br_if $end_loop (i32.eq (get_local $ptr) (get_local $end)))
;; m = LOAD64_LE(in);
(set_local $m (i64.load (get_local $ptr)))
;; v3 ^= m
(set_local $v3 (i64.xor (get_local $v3) (get_local $m)))
;; SIPROUND
;; v0 += v1;
(set_local $v0 (i64.add (get_local $v0) (get_local $v1)))
;; v1 = ROTL64(v1, 13);
(set_local $v1 (i64.rotl (get_local $v1) (i64.const 13)))
;; v1 ^= v0;
(set_local $v1 (i64.xor (get_local $v1) (get_local $v0)))
;; v0 = ROTL64(v0, 32)
(set_local $v0 (i64.rotl (get_local $v0) (i64.const 32)))
;; v2 += v3;
(set_local $v2 (i64.add (get_local $v2) (get_local $v3)))
;; v3 = ROTL64(v3, 16);
(set_local $v3 (i64.rotl (get_local $v3) (i64.const 16)))
;; v3 ^= v2;
(set_local $v3 (i64.xor (get_local $v3) (get_local $v2)))
;; v0 += v3;
(set_local $v0 (i64.add (get_local $v0) (get_local $v3)))
;; v3 = ROTL64(v3, 21);
(set_local $v3 (i64.rotl (get_local $v3) (i64.const 21)))
;; v3 ^= v0;
(set_local $v3 (i64.xor (get_local $v3) (get_local $v0)))
;; v2 += v1;
(set_local $v2 (i64.add (get_local $v2) (get_local $v1)))
;; v1 = ROTL64(v1, 17);
(set_local $v1 (i64.rotl (get_local $v1) (i64.const 17)))
;; v1 ^= v2;
(set_local $v1 (i64.xor (get_local $v1) (get_local $v2)))
;; v2 = ROTL64(v2, 32);
(set_local $v2 (i64.rotl (get_local $v2) (i64.const 32)))
;; SIPROUND
;; v0 += v1;
(set_local $v0 (i64.add (get_local $v0) (get_local $v1)))
;; v1 = ROTL64(v1, 13);
(set_local $v1 (i64.rotl (get_local $v1) (i64.const 13)))
;; v1 ^= v0;
(set_local $v1 (i64.xor (get_local $v1) (get_local $v0)))
;; v0 = ROTL64(v0, 32)
(set_local $v0 (i64.rotl (get_local $v0) (i64.const 32)))
;; v2 += v3;
(set_local $v2 (i64.add (get_local $v2) (get_local $v3)))
;; v3 = ROTL64(v3, 16);
(set_local $v3 (i64.rotl (get_local $v3) (i64.const 16)))
;; v3 ^= v2;
(set_local $v3 (i64.xor (get_local $v3) (get_local $v2)))
;; v0 += v3;
(set_local $v0 (i64.add (get_local $v0) (get_local $v3)))
;; v3 = ROTL64(v3, 21);
(set_local $v3 (i64.rotl (get_local $v3) (i64.const 21)))
;; v3 ^= v0;
(set_local $v3 (i64.xor (get_local $v3) (get_local $v0)))
;; v2 += v1;
(set_local $v2 (i64.add (get_local $v2) (get_local $v1)))
;; v1 = ROTL64(v1, 17);
(set_local $v1 (i64.rotl (get_local $v1) (i64.const 17)))
;; v1 ^= v2;
(set_local $v1 (i64.xor (get_local $v1) (get_local $v2)))
;; v2 = ROTL64(v2, 32);
(set_local $v2 (i64.rotl (get_local $v2) (i64.const 32)))
;; v0 ^= m;
(set_local $v0 (i64.xor (get_local $v0) (get_local $m)))
;; ptr += 8
(set_local $ptr (i32.add (get_local $ptr) (i32.const 8)))
(br $start_loop)
)
)
(block $0
(block $1
(block $2
(block $3
(block $4
(block $5
(block $6
(block $7
(br_table $0 $1 $2 $3 $4 $5 $6 $7 (get_local $left))
)
;; b |= ((uint64_t) in[6]) << 48;
(set_local $b (i64.or (get_local $b) (i64.shl (i64.load8_u (i32.add (get_local $ptr) (i32.const 6))) (i64.const 48))))
)
;; b |= ((uint64_t) in[5]) << 40;
(set_local $b (i64.or (get_local $b) (i64.shl (i64.load8_u (i32.add (get_local $ptr) (i32.const 5))) (i64.const 40))))
)
;; b |= ((uint64_t) in[4]) << 32;
(set_local $b (i64.or (get_local $b) (i64.shl (i64.load8_u (i32.add (get_local $ptr) (i32.const 4))) (i64.const 32))))
)
;; b |= ((uint64_t) in[3]) << 24;
(set_local $b (i64.or (get_local $b) (i64.shl (i64.load8_u (i32.add (get_local $ptr) (i32.const 3))) (i64.const 24))))
)
;; b |= ((uint64_t) in[2]) << 16;
(set_local $b (i64.or (get_local $b) (i64.shl (i64.load8_u (i32.add (get_local $ptr) (i32.const 2))) (i64.const 16))))
)
;; b |= ((uint64_t) in[1]) << 8;
(set_local $b (i64.or (get_local $b) (i64.shl (i64.load8_u (i32.add (get_local $ptr) (i32.const 1))) (i64.const 8))))
)
;; b |= ((uint64_t) in[0]);
(set_local $b (i64.or (get_local $b) (i64.load8_u (get_local $ptr))))
)
;; v3 ^= b;
(set_local $v3 (i64.xor (get_local $v3) (get_local $b)))
;; SIPROUND
;; v0 += v1;
(set_local $v0 (i64.add (get_local $v0) (get_local $v1)))
;; v1 = ROTL64(v1, 13);
(set_local $v1 (i64.rotl (get_local $v1) (i64.const 13)))
;; v1 ^= v0;
(set_local $v1 (i64.xor (get_local $v1) (get_local $v0)))
;; v0 = ROTL64(v0, 32)
(set_local $v0 (i64.rotl (get_local $v0) (i64.const 32)))
;; v2 += v3;
(set_local $v2 (i64.add (get_local $v2) (get_local $v3)))
;; v3 = ROTL64(v3, 16);
(set_local $v3 (i64.rotl (get_local $v3) (i64.const 16)))
;; v3 ^= v2;
(set_local $v3 (i64.xor (get_local $v3) (get_local $v2)))
;; v0 += v3;
(set_local $v0 (i64.add (get_local $v0) (get_local $v3)))
;; v3 = ROTL64(v3, 21);
(set_local $v3 (i64.rotl (get_local $v3) (i64.const 21)))
;; v3 ^= v0;
(set_local $v3 (i64.xor (get_local $v3) (get_local $v0)))
;; v2 += v1;
(set_local $v2 (i64.add (get_local $v2) (get_local $v1)))
;; v1 = ROTL64(v1, 17);
(set_local $v1 (i64.rotl (get_local $v1) (i64.const 17)))
;; v1 ^= v2;
(set_local $v1 (i64.xor (get_local $v1) (get_local $v2)))
;; v2 = ROTL64(v2, 32);
(set_local $v2 (i64.rotl (get_local $v2) (i64.const 32)))
;; SIPROUND
;; v0 += v1;
(set_local $v0 (i64.add (get_local $v0) (get_local $v1)))
;; v1 = ROTL64(v1, 13);
(set_local $v1 (i64.rotl (get_local $v1) (i64.const 13)))
;; v1 ^= v0;
(set_local $v1 (i64.xor (get_local $v1) (get_local $v0)))
;; v0 = ROTL64(v0, 32)
(set_local $v0 (i64.rotl (get_local $v0) (i64.const 32)))
;; v2 += v3;
(set_local $v2 (i64.add (get_local $v2) (get_local $v3)))
;; v3 = ROTL64(v3, 16);
(set_local $v3 (i64.rotl (get_local $v3) (i64.const 16)))
;; v3 ^= v2;
(set_local $v3 (i64.xor (get_local $v3) (get_local $v2)))
;; v0 += v3;
(set_local $v0 (i64.add (get_local $v0) (get_local $v3)))
;; v3 = ROTL64(v3, 21);
(set_local $v3 (i64.rotl (get_local $v3) (i64.const 21)))
;; v3 ^= v0;
(set_local $v3 (i64.xor (get_local $v3) (get_local $v0)))
;; v2 += v1;
(set_local $v2 (i64.add (get_local $v2) (get_local $v1)))
;; v1 = ROTL64(v1, 17);
(set_local $v1 (i64.rotl (get_local $v1) (i64.const 17)))
;; v1 ^= v2;
(set_local $v1 (i64.xor (get_local $v1) (get_local $v2)))
;; v2 = ROTL64(v2, 32);
(set_local $v2 (i64.rotl (get_local $v2) (i64.const 32)))
;; v0 ^= b;
(set_local $v0 (i64.xor (get_local $v0) (get_local $b)))
;; v2 ^= 0xff;
(set_local $v2 (i64.xor (get_local $v2) (i64.const 0xff)))
;; SIPROUND
;; v0 += v1;
(set_local $v0 (i64.add (get_local $v0) (get_local $v1)))
;; v1 = ROTL64(v1, 13);
(set_local $v1 (i64.rotl (get_local $v1) (i64.const 13)))
;; v1 ^= v0;
(set_local $v1 (i64.xor (get_local $v1) (get_local $v0)))
;; v0 = ROTL64(v0, 32)
(set_local $v0 (i64.rotl (get_local $v0) (i64.const 32)))
;; v2 += v3;
(set_local $v2 (i64.add (get_local $v2) (get_local $v3)))
;; v3 = ROTL64(v3, 16);
(set_local $v3 (i64.rotl (get_local $v3) (i64.const 16)))
;; v3 ^= v2;
(set_local $v3 (i64.xor (get_local $v3) (get_local $v2)))
;; v0 += v3;
(set_local $v0 (i64.add (get_local $v0) (get_local $v3)))
;; v3 = ROTL64(v3, 21);
(set_local $v3 (i64.rotl (get_local $v3) (i64.const 21)))
;; v3 ^= v0;
(set_local $v3 (i64.xor (get_local $v3) (get_local $v0)))
;; v2 += v1;
(set_local $v2 (i64.add (get_local $v2) (get_local $v1)))
;; v1 = ROTL64(v1, 17);
(set_local $v1 (i64.rotl (get_local $v1) (i64.const 17)))
;; v1 ^= v2;
(set_local $v1 (i64.xor (get_local $v1) (get_local $v2)))
;; v2 = ROTL64(v2, 32);
(set_local $v2 (i64.rotl (get_local $v2) (i64.const 32)))
;; SIPROUND
;; v0 += v1;
(set_local $v0 (i64.add (get_local $v0) (get_local $v1)))
;; v1 = ROTL64(v1, 13);
(set_local $v1 (i64.rotl (get_local $v1) (i64.const 13)))
;; v1 ^= v0;
(set_local $v1 (i64.xor (get_local $v1) (get_local $v0)))
;; v0 = ROTL64(v0, 32)
(set_local $v0 (i64.rotl (get_local $v0) (i64.const 32)))
;; v2 += v3;
(set_local $v2 (i64.add (get_local $v2) (get_local $v3)))
;; v3 = ROTL64(v3, 16);
(set_local $v3 (i64.rotl (get_local $v3) (i64.const 16)))
;; v3 ^= v2;
(set_local $v3 (i64.xor (get_local $v3) (get_local $v2)))
;; v0 += v3;
(set_local $v0 (i64.add (get_local $v0) (get_local $v3)))
;; v3 = ROTL64(v3, 21);
(set_local $v3 (i64.rotl (get_local $v3) (i64.const 21)))
;; v3 ^= v0;
(set_local $v3 (i64.xor (get_local $v3) (get_local $v0)))
;; v2 += v1;
(set_local $v2 (i64.add (get_local $v2) (get_local $v1)))
;; v1 = ROTL64(v1, 17);
(set_local $v1 (i64.rotl (get_local $v1) (i64.const 17)))
;; v1 ^= v2;
(set_local $v1 (i64.xor (get_local $v1) (get_local $v2)))
;; v2 = ROTL64(v2, 32);
(set_local $v2 (i64.rotl (get_local $v2) (i64.const 32)))
;; SIPROUND
;; v0 += v1;
(set_local $v0 (i64.add (get_local $v0) (get_local $v1)))
;; v1 = ROTL64(v1, 13);
(set_local $v1 (i64.rotl (get_local $v1) (i64.const 13)))
;; v1 ^= v0;
(set_local $v1 (i64.xor (get_local $v1) (get_local $v0)))
;; v0 = ROTL64(v0, 32)
(set_local $v0 (i64.rotl (get_local $v0) (i64.const 32)))
;; v2 += v3;
(set_local $v2 (i64.add (get_local $v2) (get_local $v3)))
;; v3 = ROTL64(v3, 16);
(set_local $v3 (i64.rotl (get_local $v3) (i64.const 16)))
;; v3 ^= v2;
(set_local $v3 (i64.xor (get_local $v3) (get_local $v2)))
;; v0 += v3;
(set_local $v0 (i64.add (get_local $v0) (get_local $v3)))
;; v3 = ROTL64(v3, 21);
(set_local $v3 (i64.rotl (get_local $v3) (i64.const 21)))
;; v3 ^= v0;
(set_local $v3 (i64.xor (get_local $v3) (get_local $v0)))
;; v2 += v1;
(set_local $v2 (i64.add (get_local $v2) (get_local $v1)))
;; v1 = ROTL64(v1, 17);
(set_local $v1 (i64.rotl (get_local $v1) (i64.const 17)))
;; v1 ^= v2;
(set_local $v1 (i64.xor (get_local $v1) (get_local $v2)))
;; v2 = ROTL64(v2, 32);
(set_local $v2 (i64.rotl (get_local $v2) (i64.const 32)))
;; SIPROUND
;; v0 += v1;
(set_local $v0 (i64.add (get_local $v0) (get_local $v1)))
;; v1 = ROTL64(v1, 13);
(set_local $v1 (i64.rotl (get_local $v1) (i64.const 13)))
;; v1 ^= v0;
(set_local $v1 (i64.xor (get_local $v1) (get_local $v0)))
;; v0 = ROTL64(v0, 32)
(set_local $v0 (i64.rotl (get_local $v0) (i64.const 32)))
;; v2 += v3;
(set_local $v2 (i64.add (get_local $v2) (get_local $v3)))
;; v3 = ROTL64(v3, 16);
(set_local $v3 (i64.rotl (get_local $v3) (i64.const 16)))
;; v3 ^= v2;
(set_local $v3 (i64.xor (get_local $v3) (get_local $v2)))
;; v0 += v3;
(set_local $v0 (i64.add (get_local $v0) (get_local $v3)))
;; v3 = ROTL64(v3, 21);
(set_local $v3 (i64.rotl (get_local $v3) (i64.const 21)))
;; v3 ^= v0;
(set_local $v3 (i64.xor (get_local $v3) (get_local $v0)))
;; v2 += v1;
(set_local $v2 (i64.add (get_local $v2) (get_local $v1)))
;; v1 = ROTL64(v1, 17);
(set_local $v1 (i64.rotl (get_local $v1) (i64.const 17)))
;; v1 ^= v2;
(set_local $v1 (i64.xor (get_local $v1) (get_local $v2)))
;; v2 = ROTL64(v2, 32);
(set_local $v2 (i64.rotl (get_local $v2) (i64.const 32)))
;; b = v0 ^ v1 ^ v2 ^ v3;
(i64.store (i32.const 0) (i64.xor (get_local $v0) (i64.xor (get_local $v1) (i64.xor (get_local $v2) (get_local $v3)))))
)
)