1 |
|
2 | const assert = require('nanoassert')
|
3 |
|
4 | module.exports = {
|
5 | crypto_verify_16,
|
6 | crypto_verify_32,
|
7 | sodium_memcmp,
|
8 | sodium_is_zero
|
9 | }
|
10 |
|
11 | function vn (x, xi, y, yi, n) {
|
12 | var d = 0
|
13 | for (let i = 0; i < n; i++) d |= x[xi + i] ^ y[yi + i]
|
14 | return (1 & ((d - 1) >>> 8)) - 1
|
15 | }
|
16 |
|
17 | function crypto_verify_16 (x, xi, y, yi) {
|
18 | return vn(x, xi, y, yi, 16)
|
19 | }
|
20 |
|
21 | function crypto_verify_32 (x, xi, y, yi) {
|
22 | return vn(x, xi, y, yi, 32)
|
23 | }
|
24 |
|
25 | function sodium_memcmp (a, b) {
|
26 | assert(a.byteLength === b.byteLength, 'buffers must be the same size')
|
27 |
|
28 | return vn(a, 0, b, 0, a.byteLength) === 0
|
29 | }
|
30 |
|
31 | function sodium_is_zero (arr) {
|
32 | var d = 0
|
33 | for (let i = 0; i < arr.length; i++) d |= arr[i]
|
34 | return d === 0
|
35 | }
|