nacl.js (32948B)
1 (function(nacl) { 2 'use strict'; 3 4 // Ported in 2014 by Dmitry Chestnykh and Devi Mandiri. 5 // Public domain. 6 // 7 // Implementation derived from TweetNaCl version 20140427. 8 // See for details: http://tweetnacl.cr.yp.to/ 9 10 var u64 = function(h, l) { this.hi = h|0 >>> 0; this.lo = l|0 >>> 0; }; 11 var gf = function(init) { 12 var i, r = new Float64Array(16); 13 if (init) for (i = 0; i < init.length; i++) r[i] = init[i]; 14 return r; 15 }; 16 17 // Pluggable, initialized in high-level API below. 18 var randombytes = function(/* x, n */) { throw new Error('no PRNG'); }; 19 20 var _0 = new Uint8Array(16); 21 var _9 = new Uint8Array(32); _9[0] = 9; 22 23 var gf0 = gf(), 24 gf1 = gf([1]), 25 _121665 = gf([0xdb41, 1]), 26 D = gf([0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]), 27 D2 = gf([0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0, 0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406]), 28 X = gf([0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c, 0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169]), 29 Y = gf([0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]), 30 I = gf([0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]); 31 32 function L32(x, c) { return (x << c) | (x >>> (32 - c)); } 33 34 function ld32(x, i) { 35 var u = x[i+3] & 0xff; 36 u = (u<<8)|(x[i+2] & 0xff); 37 u = (u<<8)|(x[i+1] & 0xff); 38 return (u<<8)|(x[i+0] & 0xff); 39 } 40 41 function dl64(x, i) { 42 var h = (x[i] << 24) | (x[i+1] << 16) | (x[i+2] << 8) | x[i+3]; 43 var l = (x[i+4] << 24) | (x[i+5] << 16) | (x[i+6] << 8) | x[i+7]; 44 return new u64(h, l); 45 } 46 47 function st32(x, j, u) { 48 var i; 49 for (i = 0; i < 4; i++) { x[j+i] = u & 255; u >>>= 8; } 50 } 51 52 function ts64(x, i, u) { 53 x[i] = (u.hi >> 24) & 0xff; 54 x[i+1] = (u.hi >> 16) & 0xff; 55 x[i+2] = (u.hi >> 8) & 0xff; 56 x[i+3] = u.hi & 0xff; 57 x[i+4] = (u.lo >> 24) & 0xff; 58 x[i+5] = (u.lo >> 16) & 0xff; 59 x[i+6] = (u.lo >> 8) & 0xff; 60 x[i+7] = u.lo & 0xff; 61 } 62 63 function vn(x, xi, y, yi, n) { 64 var i,d = 0; 65 for (i = 0; i < n; i++) d |= x[xi+i]^y[yi+i]; 66 return (1 & ((d - 1) >>> 8)) - 1; 67 } 68 69 function crypto_verify_16(x, xi, y, yi) { 70 return vn(x,xi,y,yi,16); 71 } 72 73 function crypto_verify_32(x, xi, y, yi) { 74 return vn(x,xi,y,yi,32); 75 } 76 77 function core(out,inp,k,c,h) { 78 var w = new Uint32Array(16), x = new Uint32Array(16), 79 y = new Uint32Array(16), t = new Uint32Array(4); 80 var i, j, m; 81 82 for (i = 0; i < 4; i++) { 83 x[5*i] = ld32(c, 4*i); 84 x[1+i] = ld32(k, 4*i); 85 x[6+i] = ld32(inp, 4*i); 86 x[11+i] = ld32(k, 16+4*i); 87 } 88 89 for (i = 0; i < 16; i++) y[i] = x[i]; 90 91 for (i = 0; i < 20; i++) { 92 for (j = 0; j < 4; j++) { 93 for (m = 0; m < 4; m++) t[m] = x[(5*j+4*m)%16]; 94 t[1] ^= L32((t[0]+t[3])|0, 7); 95 t[2] ^= L32((t[1]+t[0])|0, 9); 96 t[3] ^= L32((t[2]+t[1])|0,13); 97 t[0] ^= L32((t[3]+t[2])|0,18); 98 for (m = 0; m < 4; m++) w[4*j+(j+m)%4] = t[m]; 99 } 100 for (m = 0; m < 16; m++) x[m] = w[m]; 101 } 102 103 if (h) { 104 for (i = 0; i < 16; i++) x[i] = (x[i] + y[i]) | 0; 105 for (i = 0; i < 4; i++) { 106 x[5*i] = (x[5*i] - ld32(c, 4*i)) | 0; 107 x[6+i] = (x[6+i] - ld32(inp, 4*i)) | 0; 108 } 109 for (i = 0; i < 4; i++) { 110 st32(out,4*i,x[5*i]); 111 st32(out,16+4*i,x[6+i]); 112 } 113 } else { 114 for (i = 0; i < 16; i++) st32(out, 4 * i, (x[i] + y[i]) | 0); 115 } 116 } 117 118 function crypto_core_salsa20(out,inp,k,c) { 119 core(out,inp,k,c,false); 120 return 0; 121 } 122 123 function crypto_core_hsalsa20(out,inp,k,c) { 124 core(out,inp,k,c,true); 125 return 0; 126 } 127 128 var sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]); 129 // "expand 32-byte k" 130 131 function crypto_stream_salsa20_xor(c,cpos,m,mpos,b,n,k) { 132 var z = new Uint8Array(16), x = new Uint8Array(64); 133 var u, i; 134 if (!b) return 0; 135 for (i = 0; i < 16; i++) z[i] = 0; 136 for (i = 0; i < 8; i++) z[i] = n[i]; 137 while (b >= 64) { 138 crypto_core_salsa20(x,z,k,sigma); 139 for (i = 0; i < 64; i++) c[cpos+i] = (m?m[mpos+i]:0) ^ x[i]; 140 u = 1; 141 for (i = 8; i < 16; i++) { 142 u = u + (z[i] & 0xff) | 0; 143 z[i] = u & 0xff; 144 u >>>= 8; 145 } 146 b -= 64; 147 cpos += 64; 148 if (m) mpos += 64; 149 } 150 if (b > 0) { 151 crypto_core_salsa20(x,z,k,sigma); 152 for (i = 0; i < b; i++) c[cpos+i] = (m?m[mpos+i]:0) ^ x[i]; 153 } 154 return 0; 155 } 156 157 function crypto_stream_salsa20(c,cpos,d,n,k) { 158 return crypto_stream_salsa20_xor(c,cpos,null,0,d,n,k); 159 } 160 161 function crypto_stream(c,cpos,d,n,k) { 162 var s = new Uint8Array(32); 163 crypto_core_hsalsa20(s,n,k,sigma); 164 return crypto_stream_salsa20(c,cpos,d,n.subarray(16),s); 165 } 166 167 function crypto_stream_xor(c,cpos,m,mpos,d,n,k) { 168 var s = new Uint8Array(32); 169 crypto_core_hsalsa20(s,n,k,sigma); 170 return crypto_stream_salsa20_xor(c,cpos,m,mpos,d,n.subarray(16),s); 171 } 172 173 function add1305(h, c) { 174 var j, u = 0; 175 for (j = 0; j < 17; j++) { 176 u = (u + ((h[j] + c[j]) | 0)) | 0; 177 h[j] = u & 255; 178 u >>>= 8; 179 } 180 } 181 182 var minusp = new Uint32Array([ 183 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252 184 ]); 185 186 function crypto_onetimeauth(out, outpos, m, mpos, n, k) { 187 var s, i, j, u; 188 var x = new Uint32Array(17), r = new Uint32Array(17), 189 h = new Uint32Array(17), c = new Uint32Array(17), 190 g = new Uint32Array(17); 191 for (j = 0; j < 17; j++) r[j]=h[j]=0; 192 for (j = 0; j < 16; j++) r[j]=k[j]; 193 r[3]&=15; 194 r[4]&=252; 195 r[7]&=15; 196 r[8]&=252; 197 r[11]&=15; 198 r[12]&=252; 199 r[15]&=15; 200 201 while (n > 0) { 202 for (j = 0; j < 17; j++) c[j] = 0; 203 for (j = 0; (j < 16) && (j < n); ++j) c[j] = m[mpos+j]; 204 c[j] = 1; 205 mpos += j; n -= j; 206 add1305(h,c); 207 for (i = 0; i < 17; i++) { 208 x[i] = 0; 209 for (j = 0; j < 17; j++) x[i] = (x[i] + (h[j] * ((j <= i) ? r[i - j] : ((320 * r[i + 17 - j])|0))) | 0) | 0; 210 } 211 for (i = 0; i < 17; i++) h[i] = x[i]; 212 u = 0; 213 for (j = 0; j < 16; j++) { 214 u = (u + h[j]) | 0; 215 h[j] = u & 255; 216 u >>>= 8; 217 } 218 u = (u + h[16]) | 0; h[16] = u & 3; 219 u = (5 * (u >>> 2)) | 0; 220 for (j = 0; j < 16; j++) { 221 u = (u + h[j]) | 0; 222 h[j] = u & 255; 223 u >>>= 8; 224 } 225 u = (u + h[16]) | 0; h[16] = u; 226 } 227 228 for (j = 0; j < 17; j++) g[j] = h[j]; 229 add1305(h,minusp); 230 s = (-(h[16] >>> 7) | 0); 231 for (j = 0; j < 17; j++) h[j] ^= s & (g[j] ^ h[j]); 232 233 for (j = 0; j < 16; j++) c[j] = k[j + 16]; 234 c[16] = 0; 235 add1305(h,c); 236 for (j = 0; j < 16; j++) out[outpos+j] = h[j]; 237 return 0; 238 } 239 240 function crypto_onetimeauth_verify(h, hpos, m, mpos, n, k) { 241 var x = new Uint8Array(16); 242 crypto_onetimeauth(x,0,m,mpos,n,k); 243 return crypto_verify_16(h,hpos,x,0); 244 } 245 246 function crypto_secretbox(c,m,d,n,k) { 247 var i; 248 if (d < 32) return -1; 249 crypto_stream_xor(c,0,m,0,d,n,k); 250 crypto_onetimeauth(c, 16, c, 32, d - 32, c); 251 for (i = 0; i < 16; i++) c[i] = 0; 252 return 0; 253 } 254 255 function crypto_secretbox_open(m,c,d,n,k) { 256 var i; 257 var x = new Uint8Array(32); 258 if (d < 32) return -1; 259 crypto_stream(x,0,32,n,k); 260 if (crypto_onetimeauth_verify(c, 16,c, 32,d - 32,x) !== 0) return -1; 261 crypto_stream_xor(m,0,c,0,d,n,k); 262 for (i = 0; i < 32; i++) m[i] = 0; 263 return 0; 264 } 265 266 function set25519(r, a) { 267 var i; 268 for (i = 0; i < 16; i++) r[i] = a[i]|0; 269 } 270 271 function car25519(o) { 272 var c; 273 var i; 274 for (i = 0; i < 16; i++) { 275 o[i] += 65536; 276 c = Math.floor(o[i] / 65536); 277 o[(i+1)*(i<15?1:0)] += c - 1 + 37 * (c-1) * (i===15?1:0); 278 o[i] -= (c * 65536); 279 } 280 } 281 282 function sel25519(p, q, b) { 283 var t, c = ~(b-1); 284 for (var i = 0; i < 16; i++) { 285 t = c & (p[i] ^ q[i]); 286 p[i] ^= t; 287 q[i] ^= t; 288 } 289 } 290 291 function pack25519(o, n) { 292 var i, j, b; 293 var m = gf(), t = gf(); 294 for (i = 0; i < 16; i++) t[i] = n[i]; 295 car25519(t); 296 car25519(t); 297 car25519(t); 298 for (j = 0; j < 2; j++) { 299 m[0] = t[0] - 0xffed; 300 for (i = 1; i < 15; i++) { 301 m[i] = t[i] - 0xffff - ((m[i-1]>>16) & 1); 302 m[i-1] &= 0xffff; 303 } 304 m[15] = t[15] - 0x7fff - ((m[14]>>16) & 1); 305 b = (m[15]>>16) & 1; 306 m[14] &= 0xffff; 307 sel25519(t, m, 1-b); 308 } 309 for (i = 0; i < 16; i++) { 310 o[2*i] = t[i] & 0xff; 311 o[2*i+1] = t[i]>>8; 312 } 313 } 314 315 function neq25519(a, b) { 316 var c = new Uint8Array(32), d = new Uint8Array(32); 317 pack25519(c, a); 318 pack25519(d, b); 319 return crypto_verify_32(c, 0, d, 0); 320 } 321 322 function par25519(a) { 323 var d = new Uint8Array(32); 324 pack25519(d, a); 325 return d[0] & 1; 326 } 327 328 function unpack25519(o, n) { 329 var i; 330 for (i = 0; i < 16; i++) o[i] = n[2*i] + (n[2*i+1] << 8); 331 o[15] &= 0x7fff; 332 } 333 334 function A(o, a, b) { 335 var i; 336 for (i = 0; i < 16; i++) o[i] = (a[i] + b[i])|0; 337 } 338 339 function Z(o, a, b) { 340 var i; 341 for (i = 0; i < 16; i++) o[i] = (a[i] - b[i])|0; 342 } 343 344 function M(o, a, b) { 345 var i, j, t = new Float64Array(31); 346 for (i = 0; i < 31; i++) t[i] = 0; 347 for (i = 0; i < 16; i++) { 348 for (j = 0; j < 16; j++) { 349 t[i+j] += a[i] * b[j]; 350 } 351 } 352 for (i = 0; i < 15; i++) { 353 t[i] += 38 * t[i+16]; 354 } 355 for (i = 0; i < 16; i++) o[i] = t[i]; 356 car25519(o); 357 car25519(o); 358 } 359 360 function S(o, a) { 361 M(o, a, a); 362 } 363 364 function inv25519(o, i) { 365 var c = gf(); 366 var a; 367 for (a = 0; a < 16; a++) c[a] = i[a]; 368 for (a = 253; a >= 0; a--) { 369 S(c, c); 370 if(a !== 2 && a !== 4) M(c, c, i); 371 } 372 for (a = 0; a < 16; a++) o[a] = c[a]; 373 } 374 375 function pow2523(o, i) { 376 var c = gf(); 377 var a; 378 for (a = 0; a < 16; a++) c[a] = i[a]; 379 for (a = 250; a >= 0; a--) { 380 S(c, c); 381 if(a !== 1) M(c, c, i); 382 } 383 for (a = 0; a < 16; a++) o[a] = c[a]; 384 } 385 386 function crypto_scalarmult(q, n, p) { 387 var z = new Uint8Array(32); 388 var x = new Float64Array(80), r, i; 389 var a = gf(), b = gf(), c = gf(), 390 d = gf(), e = gf(), f = gf(); 391 for (i = 0; i < 31; i++) z[i] = n[i]; 392 z[31]=(n[31]&127)|64; 393 z[0]&=248; 394 unpack25519(x,p); 395 for (i = 0; i < 16; i++) { 396 b[i]=x[i]; 397 d[i]=a[i]=c[i]=0; 398 } 399 a[0]=d[0]=1; 400 for (i=254; i>=0; --i) { 401 r=(z[i>>>3]>>>(i&7))&1; 402 sel25519(a,b,r); 403 sel25519(c,d,r); 404 A(e,a,c); 405 Z(a,a,c); 406 A(c,b,d); 407 Z(b,b,d); 408 S(d,e); 409 S(f,a); 410 M(a,c,a); 411 M(c,b,e); 412 A(e,a,c); 413 Z(a,a,c); 414 S(b,a); 415 Z(c,d,f); 416 M(a,c,_121665); 417 A(a,a,d); 418 M(c,c,a); 419 M(a,d,f); 420 M(d,b,x); 421 S(b,e); 422 sel25519(a,b,r); 423 sel25519(c,d,r); 424 } 425 for (i = 0; i < 16; i++) { 426 x[i+16]=a[i]; 427 x[i+32]=c[i]; 428 x[i+48]=b[i]; 429 x[i+64]=d[i]; 430 } 431 var x32 = x.subarray(32); 432 var x16 = x.subarray(16); 433 inv25519(x32,x32); 434 M(x16,x16,x32); 435 pack25519(q,x16); 436 return 0; 437 } 438 439 function crypto_scalarmult_base(q, n) { 440 return crypto_scalarmult(q, n, _9); 441 } 442 443 function crypto_box_keypair(y, x) { 444 randombytes(x, 32); 445 return crypto_scalarmult_base(y, x); 446 } 447 448 function crypto_box_beforenm(k, y, x) { 449 var s = new Uint8Array(32); 450 crypto_scalarmult(s, x, y); 451 return crypto_core_hsalsa20(k, _0, s, sigma); 452 } 453 454 var crypto_box_afternm = crypto_secretbox; 455 var crypto_box_open_afternm = crypto_secretbox_open; 456 457 function crypto_box(c, m, d, n, y, x) { 458 var k = new Uint8Array(32); 459 crypto_box_beforenm(k, y, x); 460 return crypto_box_afternm(c, m, d, n, k); 461 } 462 463 function crypto_box_open(m, c, d, n, y, x) { 464 var k = new Uint8Array(32); 465 crypto_box_beforenm(k, y, x); 466 return crypto_box_open_afternm(m, c, d, n, k); 467 } 468 469 function add64() { 470 var a = 0, b = 0, c = 0, d = 0, m16 = 65535, l, h, i; 471 for (i = 0; i < arguments.length; i++) { 472 l = arguments[i].lo; 473 h = arguments[i].hi; 474 a += (l & m16); b += (l >>> 16); 475 c += (h & m16); d += (h >>> 16); 476 } 477 478 b += (a >>> 16); 479 c += (b >>> 16); 480 d += (c >>> 16); 481 482 return new u64((c & m16) | (d << 16), (a & m16) | (b << 16)); 483 } 484 485 function shr64(x, c) { 486 return new u64((x.hi >>> c), (x.lo >>> c) | (x.hi << (32 - c))); 487 } 488 489 function xor64() { 490 var l = 0, h = 0, i; 491 for (i = 0; i < arguments.length; i++) { 492 l ^= arguments[i].lo; 493 h ^= arguments[i].hi; 494 } 495 return new u64(h, l); 496 } 497 498 function R(x, c) { 499 var h, l, c1 = 32 - c; 500 if (c < 32) { 501 h = (x.hi >>> c) | (x.lo << c1); 502 l = (x.lo >>> c) | (x.hi << c1); 503 } else if (c < 64) { 504 h = (x.lo >>> c) | (x.hi << c1); 505 l = (x.hi >>> c) | (x.lo << c1); 506 } 507 return new u64(h, l); 508 } 509 510 function Ch(x, y, z) { 511 var h = (x.hi & y.hi) ^ (~x.hi & z.hi), 512 l = (x.lo & y.lo) ^ (~x.lo & z.lo); 513 return new u64(h, l); 514 } 515 516 function Maj(x, y, z) { 517 var h = (x.hi & y.hi) ^ (x.hi & z.hi) ^ (y.hi & z.hi), 518 l = (x.lo & y.lo) ^ (x.lo & z.lo) ^ (y.lo & z.lo); 519 return new u64(h, l); 520 } 521 522 function Sigma0(x) { return xor64(R(x,28), R(x,34), R(x,39)); } 523 function Sigma1(x) { return xor64(R(x,14), R(x,18), R(x,41)); } 524 function sigma0(x) { return xor64(R(x, 1), R(x, 8), shr64(x,7)); } 525 function sigma1(x) { return xor64(R(x,19), R(x,61), shr64(x,6)); } 526 527 var K = [ 528 new u64(0x428a2f98, 0xd728ae22), new u64(0x71374491, 0x23ef65cd), 529 new u64(0xb5c0fbcf, 0xec4d3b2f), new u64(0xe9b5dba5, 0x8189dbbc), 530 new u64(0x3956c25b, 0xf348b538), new u64(0x59f111f1, 0xb605d019), 531 new u64(0x923f82a4, 0xaf194f9b), new u64(0xab1c5ed5, 0xda6d8118), 532 new u64(0xd807aa98, 0xa3030242), new u64(0x12835b01, 0x45706fbe), 533 new u64(0x243185be, 0x4ee4b28c), new u64(0x550c7dc3, 0xd5ffb4e2), 534 new u64(0x72be5d74, 0xf27b896f), new u64(0x80deb1fe, 0x3b1696b1), 535 new u64(0x9bdc06a7, 0x25c71235), new u64(0xc19bf174, 0xcf692694), 536 new u64(0xe49b69c1, 0x9ef14ad2), new u64(0xefbe4786, 0x384f25e3), 537 new u64(0x0fc19dc6, 0x8b8cd5b5), new u64(0x240ca1cc, 0x77ac9c65), 538 new u64(0x2de92c6f, 0x592b0275), new u64(0x4a7484aa, 0x6ea6e483), 539 new u64(0x5cb0a9dc, 0xbd41fbd4), new u64(0x76f988da, 0x831153b5), 540 new u64(0x983e5152, 0xee66dfab), new u64(0xa831c66d, 0x2db43210), 541 new u64(0xb00327c8, 0x98fb213f), new u64(0xbf597fc7, 0xbeef0ee4), 542 new u64(0xc6e00bf3, 0x3da88fc2), new u64(0xd5a79147, 0x930aa725), 543 new u64(0x06ca6351, 0xe003826f), new u64(0x14292967, 0x0a0e6e70), 544 new u64(0x27b70a85, 0x46d22ffc), new u64(0x2e1b2138, 0x5c26c926), 545 new u64(0x4d2c6dfc, 0x5ac42aed), new u64(0x53380d13, 0x9d95b3df), 546 new u64(0x650a7354, 0x8baf63de), new u64(0x766a0abb, 0x3c77b2a8), 547 new u64(0x81c2c92e, 0x47edaee6), new u64(0x92722c85, 0x1482353b), 548 new u64(0xa2bfe8a1, 0x4cf10364), new u64(0xa81a664b, 0xbc423001), 549 new u64(0xc24b8b70, 0xd0f89791), new u64(0xc76c51a3, 0x0654be30), 550 new u64(0xd192e819, 0xd6ef5218), new u64(0xd6990624, 0x5565a910), 551 new u64(0xf40e3585, 0x5771202a), new u64(0x106aa070, 0x32bbd1b8), 552 new u64(0x19a4c116, 0xb8d2d0c8), new u64(0x1e376c08, 0x5141ab53), 553 new u64(0x2748774c, 0xdf8eeb99), new u64(0x34b0bcb5, 0xe19b48a8), 554 new u64(0x391c0cb3, 0xc5c95a63), new u64(0x4ed8aa4a, 0xe3418acb), 555 new u64(0x5b9cca4f, 0x7763e373), new u64(0x682e6ff3, 0xd6b2b8a3), 556 new u64(0x748f82ee, 0x5defb2fc), new u64(0x78a5636f, 0x43172f60), 557 new u64(0x84c87814, 0xa1f0ab72), new u64(0x8cc70208, 0x1a6439ec), 558 new u64(0x90befffa, 0x23631e28), new u64(0xa4506ceb, 0xde82bde9), 559 new u64(0xbef9a3f7, 0xb2c67915), new u64(0xc67178f2, 0xe372532b), 560 new u64(0xca273ece, 0xea26619c), new u64(0xd186b8c7, 0x21c0c207), 561 new u64(0xeada7dd6, 0xcde0eb1e), new u64(0xf57d4f7f, 0xee6ed178), 562 new u64(0x06f067aa, 0x72176fba), new u64(0x0a637dc5, 0xa2c898a6), 563 new u64(0x113f9804, 0xbef90dae), new u64(0x1b710b35, 0x131c471b), 564 new u64(0x28db77f5, 0x23047d84), new u64(0x32caab7b, 0x40c72493), 565 new u64(0x3c9ebe0a, 0x15c9bebc), new u64(0x431d67c4, 0x9c100d4c), 566 new u64(0x4cc5d4be, 0xcb3e42b6), new u64(0x597f299c, 0xfc657e2a), 567 new u64(0x5fcb6fab, 0x3ad6faec), new u64(0x6c44198c, 0x4a475817) 568 ]; 569 570 function crypto_hashblocks(x, m, n) { 571 var z = [], b = [], a = [], w = [], t, i, j; 572 573 for (i = 0; i < 8; i++) z[i] = a[i] = dl64(x, 8*i); 574 575 var pos = 0; 576 while (n >= 128) { 577 for (i = 0; i < 16; i++) w[i] = dl64(m, 8*i+pos); 578 for (i = 0; i < 80; i++) { 579 for (j = 0; j < 8; j++) b[j] = a[j]; 580 t = add64(a[7], Sigma1(a[4]), Ch(a[4], a[5], a[6]), K[i], w[i%16]); 581 b[7] = add64(t, Sigma0(a[0]), Maj(a[0], a[1], a[2])); 582 b[3] = add64(b[3], t); 583 for (j = 0; j < 8; j++) a[(j+1)%8] = b[j]; 584 if (i%16 === 15) { 585 for (j = 0; j < 16; j++) { 586 w[j] = add64(w[j], w[(j+9)%16], sigma0(w[(j+1)%16]), sigma1(w[(j+14)%16])); 587 } 588 } 589 } 590 591 for (i = 0; i < 8; i++) { 592 a[i] = add64(a[i], z[i]); 593 z[i] = a[i]; 594 } 595 596 pos += 128; 597 n -= 128; 598 } 599 600 for (i = 0; i < 8; i++) ts64(x, 8*i, z[i]); 601 return n; 602 } 603 604 var iv = new Uint8Array([ 605 0x6a,0x09,0xe6,0x67,0xf3,0xbc,0xc9,0x08, 606 0xbb,0x67,0xae,0x85,0x84,0xca,0xa7,0x3b, 607 0x3c,0x6e,0xf3,0x72,0xfe,0x94,0xf8,0x2b, 608 0xa5,0x4f,0xf5,0x3a,0x5f,0x1d,0x36,0xf1, 609 0x51,0x0e,0x52,0x7f,0xad,0xe6,0x82,0xd1, 610 0x9b,0x05,0x68,0x8c,0x2b,0x3e,0x6c,0x1f, 611 0x1f,0x83,0xd9,0xab,0xfb,0x41,0xbd,0x6b, 612 0x5b,0xe0,0xcd,0x19,0x13,0x7e,0x21,0x79 613 ]); 614 615 function crypto_hash(out, m, n) { 616 var h = new Uint8Array(64), x = new Uint8Array(256); 617 var i, b = n; 618 619 for (i = 0; i < 64; i++) h[i] = iv[i]; 620 621 crypto_hashblocks(h, m, n); 622 n %= 128; 623 624 for (i = 0; i < 256; i++) x[i] = 0; 625 for (i = 0; i < n; i++) x[i] = m[b-n+i]; 626 x[n] = 128; 627 628 n = 256-128*(n<112?1:0); 629 x[n-9] = 0; 630 ts64(x, n-8, new u64((b / 0x20000000) | 0, b << 3)); 631 crypto_hashblocks(h, x, n); 632 633 for (i = 0; i < 64; i++) out[i] = h[i]; 634 635 return 0; 636 } 637 638 function add(p, q) { 639 var a = gf(), b = gf(), c = gf(), 640 d = gf(), e = gf(), f = gf(), 641 g = gf(), h = gf(), t = gf(); 642 643 Z(a, p[1], p[0]); 644 Z(t, q[1], q[0]); 645 M(a, a, t); 646 A(b, p[0], p[1]); 647 A(t, q[0], q[1]); 648 M(b, b, t); 649 M(c, p[3], q[3]); 650 M(c, c, D2); 651 M(d, p[2], q[2]); 652 A(d, d, d); 653 Z(e, b, a); 654 Z(f, d, c); 655 A(g, d, c); 656 A(h, b, a); 657 658 M(p[0], e, f); 659 M(p[1], h, g); 660 M(p[2], g, f); 661 M(p[3], e, h); 662 } 663 664 function cswap(p, q, b) { 665 var i; 666 for (i = 0; i < 4; i++) { 667 sel25519(p[i], q[i], b); 668 } 669 } 670 671 function pack(r, p) { 672 var tx = gf(), ty = gf(), zi = gf(); 673 inv25519(zi, p[2]); 674 M(tx, p[0], zi); 675 M(ty, p[1], zi); 676 pack25519(r, ty); 677 r[31] ^= par25519(tx) << 7; 678 } 679 680 function scalarmult(p, q, s) { 681 var b, i; 682 set25519(p[0], gf0); 683 set25519(p[1], gf1); 684 set25519(p[2], gf1); 685 set25519(p[3], gf0); 686 for (i = 255; i >= 0; --i) { 687 b = (s[(i/8)|0] >> (i&7)) & 1; 688 cswap(p, q, b); 689 add(q, p); 690 add(p, p); 691 cswap(p, q, b); 692 } 693 } 694 695 function scalarbase(p, s) { 696 var q = [gf(), gf(), gf(), gf()]; 697 set25519(q[0], X); 698 set25519(q[1], Y); 699 set25519(q[2], gf1); 700 M(q[3], X, Y); 701 scalarmult(p, q, s); 702 } 703 704 function crypto_sign_keypair(pk, sk, seeded) { 705 var d = new Uint8Array(64); 706 var p = [gf(), gf(), gf(), gf()]; 707 var i; 708 709 if (!seeded) randombytes(sk, 32); 710 crypto_hash(d, sk, 32); 711 d[0] &= 248; 712 d[31] &= 127; 713 d[31] |= 64; 714 715 scalarbase(p, d); 716 pack(pk, p); 717 718 for (i = 0; i < 32; i++) sk[i+32] = pk[i]; 719 return 0; 720 } 721 722 var L = new Float64Array([0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10]); 723 724 function modL(r, x) { 725 var carry, i, j, k; 726 for (i = 63; i >= 32; --i) { 727 carry = 0; 728 for (j = i - 32, k = i - 12; j < k; ++j) { 729 x[j] += carry - 16 * x[i] * L[j - (i - 32)]; 730 carry = (x[j] + 128) >> 8; 731 x[j] -= carry * 256; 732 } 733 x[j] += carry; 734 x[i] = 0; 735 } 736 carry = 0; 737 for (j = 0; j < 32; j++) { 738 x[j] += carry - (x[31] >> 4) * L[j]; 739 carry = x[j] >> 8; 740 x[j] &= 255; 741 } 742 for (j = 0; j < 32; j++) x[j] -= carry * L[j]; 743 for (i = 0; i < 32; i++) { 744 x[i+1] += x[i] >> 8; 745 r[i] = x[i] & 255; 746 } 747 } 748 749 function reduce(r) { 750 var x = new Float64Array(64), i; 751 for (i = 0; i < 64; i++) x[i] = r[i]; 752 for (i = 0; i < 64; i++) r[i] = 0; 753 modL(r, x); 754 } 755 756 // Note: difference from C - smlen returned, not passed as argument. 757 function crypto_sign(sm, m, n, sk) { 758 var d = new Uint8Array(64), h = new Uint8Array(64), r = new Uint8Array(64); 759 var i, j, x = new Float64Array(64); 760 var p = [gf(), gf(), gf(), gf()]; 761 762 crypto_hash(d, sk, 32); 763 d[0] &= 248; 764 d[31] &= 127; 765 d[31] |= 64; 766 767 var smlen = n + 64; 768 for (i = 0; i < n; i++) sm[64 + i] = m[i]; 769 for (i = 0; i < 32; i++) sm[32 + i] = d[32 + i]; 770 771 crypto_hash(r, sm.subarray(32), n+32); 772 reduce(r); 773 scalarbase(p, r); 774 pack(sm, p); 775 776 for (i = 32; i < 64; i++) sm[i] = sk[i]; 777 crypto_hash(h, sm, n + 64); 778 reduce(h); 779 780 for (i = 0; i < 64; i++) x[i] = 0; 781 for (i = 0; i < 32; i++) x[i] = r[i]; 782 for (i = 0; i < 32; i++) { 783 for (j = 0; j < 32; j++) { 784 x[i+j] += h[i] * d[j]; 785 } 786 } 787 788 modL(sm.subarray(32), x); 789 return smlen; 790 } 791 792 function unpackneg(r, p) { 793 var t = gf(), chk = gf(), num = gf(), 794 den = gf(), den2 = gf(), den4 = gf(), 795 den6 = gf(); 796 797 set25519(r[2], gf1); 798 unpack25519(r[1], p); 799 S(num, r[1]); 800 M(den, num, D); 801 Z(num, num, r[2]); 802 A(den, r[2], den); 803 804 S(den2, den); 805 S(den4, den2); 806 M(den6, den4, den2); 807 M(t, den6, num); 808 M(t, t, den); 809 810 pow2523(t, t); 811 M(t, t, num); 812 M(t, t, den); 813 M(t, t, den); 814 M(r[0], t, den); 815 816 S(chk, r[0]); 817 M(chk, chk, den); 818 if (neq25519(chk, num)) M(r[0], r[0], I); 819 820 S(chk, r[0]); 821 M(chk, chk, den); 822 if (neq25519(chk, num)) return -1; 823 824 if (par25519(r[0]) === (p[31]>>7)) Z(r[0], gf0, r[0]); 825 826 M(r[3], r[0], r[1]); 827 return 0; 828 } 829 830 function crypto_sign_open(m, sm, n, pk) { 831 var i, mlen; 832 var t = new Uint8Array(32), h = new Uint8Array(64); 833 var p = [gf(), gf(), gf(), gf()], 834 q = [gf(), gf(), gf(), gf()]; 835 836 mlen = -1; 837 if (n < 64) return -1; 838 839 if (unpackneg(q, pk)) return -1; 840 841 for (i = 0; i < n; i++) m[i] = sm[i]; 842 for (i = 0; i < 32; i++) m[i+32] = pk[i]; 843 crypto_hash(h, m, n); 844 reduce(h); 845 scalarmult(p, q, h); 846 847 scalarbase(q, sm.subarray(32)); 848 add(p, q); 849 pack(t, p); 850 851 n -= 64; 852 if (crypto_verify_32(sm, 0, t, 0)) { 853 for (i = 0; i < n; i++) m[i] = 0; 854 return -1; 855 } 856 857 for (i = 0; i < n; i++) m[i] = sm[i + 64]; 858 mlen = n; 859 return mlen; 860 } 861 862 var crypto_secretbox_KEYBYTES = 32, 863 crypto_secretbox_NONCEBYTES = 24, 864 crypto_secretbox_ZEROBYTES = 32, 865 crypto_secretbox_BOXZEROBYTES = 16, 866 crypto_scalarmult_BYTES = 32, 867 crypto_scalarmult_SCALARBYTES = 32, 868 crypto_box_PUBLICKEYBYTES = 32, 869 crypto_box_SECRETKEYBYTES = 32, 870 crypto_box_BEFORENMBYTES = 32, 871 crypto_box_NONCEBYTES = crypto_secretbox_NONCEBYTES, 872 crypto_box_ZEROBYTES = crypto_secretbox_ZEROBYTES, 873 crypto_box_BOXZEROBYTES = crypto_secretbox_BOXZEROBYTES, 874 crypto_sign_BYTES = 64, 875 crypto_sign_PUBLICKEYBYTES = 32, 876 crypto_sign_SECRETKEYBYTES = 64, 877 crypto_sign_SEEDBYTES = 32, 878 crypto_hash_BYTES = 64; 879 880 nacl.lowlevel = { 881 crypto_core_hsalsa20: crypto_core_hsalsa20, 882 crypto_stream_xor: crypto_stream_xor, 883 crypto_stream: crypto_stream, 884 crypto_stream_salsa20_xor: crypto_stream_salsa20_xor, 885 crypto_stream_salsa20: crypto_stream_salsa20, 886 crypto_onetimeauth: crypto_onetimeauth, 887 crypto_onetimeauth_verify: crypto_onetimeauth_verify, 888 crypto_verify_16: crypto_verify_16, 889 crypto_verify_32: crypto_verify_32, 890 crypto_secretbox: crypto_secretbox, 891 crypto_secretbox_open: crypto_secretbox_open, 892 crypto_scalarmult: crypto_scalarmult, 893 crypto_scalarmult_base: crypto_scalarmult_base, 894 crypto_box_beforenm: crypto_box_beforenm, 895 crypto_box_afternm: crypto_box_afternm, 896 crypto_box: crypto_box, 897 crypto_box_open: crypto_box_open, 898 crypto_box_keypair: crypto_box_keypair, 899 crypto_hash: crypto_hash, 900 crypto_sign: crypto_sign, 901 crypto_sign_keypair: crypto_sign_keypair, 902 crypto_sign_open: crypto_sign_open, 903 904 crypto_secretbox_KEYBYTES: crypto_secretbox_KEYBYTES, 905 crypto_secretbox_NONCEBYTES: crypto_secretbox_NONCEBYTES, 906 crypto_secretbox_ZEROBYTES: crypto_secretbox_ZEROBYTES, 907 crypto_secretbox_BOXZEROBYTES: crypto_secretbox_BOXZEROBYTES, 908 crypto_scalarmult_BYTES: crypto_scalarmult_BYTES, 909 crypto_scalarmult_SCALARBYTES: crypto_scalarmult_SCALARBYTES, 910 crypto_box_PUBLICKEYBYTES: crypto_box_PUBLICKEYBYTES, 911 crypto_box_SECRETKEYBYTES: crypto_box_SECRETKEYBYTES, 912 crypto_box_BEFORENMBYTES: crypto_box_BEFORENMBYTES, 913 crypto_box_NONCEBYTES: crypto_box_NONCEBYTES, 914 crypto_box_ZEROBYTES: crypto_box_ZEROBYTES, 915 crypto_box_BOXZEROBYTES: crypto_box_BOXZEROBYTES, 916 crypto_sign_BYTES: crypto_sign_BYTES, 917 crypto_sign_PUBLICKEYBYTES: crypto_sign_PUBLICKEYBYTES, 918 crypto_sign_SECRETKEYBYTES: crypto_sign_SECRETKEYBYTES, 919 crypto_sign_SEEDBYTES: crypto_sign_SEEDBYTES, 920 crypto_hash_BYTES: crypto_hash_BYTES 921 }; 922 923 /* High-level API */ 924 925 function checkLengths(k, n) { 926 if (k.length !== crypto_secretbox_KEYBYTES) throw new Error('bad key size'); 927 if (n.length !== crypto_secretbox_NONCEBYTES) throw new Error('bad nonce size'); 928 } 929 930 function checkBoxLengths(pk, sk) { 931 if (pk.length !== crypto_box_PUBLICKEYBYTES) throw new Error('bad public key size'); 932 if (sk.length !== crypto_box_SECRETKEYBYTES) throw new Error('bad secret key size'); 933 } 934 935 function checkArrayTypes() { 936 var t, i; 937 for (i = 0; i < arguments.length; i++) { 938 if ((t = Object.prototype.toString.call(arguments[i])) !== '[object Uint8Array]') 939 throw new TypeError('unexpected type ' + t + ', use Uint8Array'); 940 } 941 } 942 943 function cleanup(arr) { 944 for (var i = 0; i < arr.length; i++) arr[i] = 0; 945 } 946 947 // TODO: Completely remove this in v0.15. 948 if (!nacl.util) { 949 nacl.util = {}; 950 nacl.util.decodeUTF8 = nacl.util.encodeUTF8 = nacl.util.encodeBase64 = nacl.util.decodeBase64 = function() { 951 throw new Error('nacl.util moved into separate package: https://github.com/dchest/tweetnacl-util-js'); 952 }; 953 } 954 955 nacl.randomBytes = function(n) { 956 var b = new Uint8Array(n); 957 randombytes(b, n); 958 return b; 959 }; 960 961 nacl.secretbox = function(msg, nonce, key) { 962 checkArrayTypes(msg, nonce, key); 963 checkLengths(key, nonce); 964 var m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length); 965 var c = new Uint8Array(m.length); 966 for (var i = 0; i < msg.length; i++) m[i+crypto_secretbox_ZEROBYTES] = msg[i]; 967 crypto_secretbox(c, m, m.length, nonce, key); 968 return c.subarray(crypto_secretbox_BOXZEROBYTES); 969 }; 970 971 nacl.secretbox.open = function(box, nonce, key) { 972 checkArrayTypes(box, nonce, key); 973 checkLengths(key, nonce); 974 var c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length); 975 var m = new Uint8Array(c.length); 976 for (var i = 0; i < box.length; i++) c[i+crypto_secretbox_BOXZEROBYTES] = box[i]; 977 if (c.length < 32) return false; 978 if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0) return false; 979 return m.subarray(crypto_secretbox_ZEROBYTES); 980 }; 981 982 nacl.secretbox.keyLength = crypto_secretbox_KEYBYTES; 983 nacl.secretbox.nonceLength = crypto_secretbox_NONCEBYTES; 984 nacl.secretbox.overheadLength = crypto_secretbox_BOXZEROBYTES; 985 986 nacl.scalarMult = function(n, p) { 987 checkArrayTypes(n, p); 988 if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size'); 989 if (p.length !== crypto_scalarmult_BYTES) throw new Error('bad p size'); 990 var q = new Uint8Array(crypto_scalarmult_BYTES); 991 crypto_scalarmult(q, n, p); 992 return q; 993 }; 994 995 nacl.scalarMult.base = function(n) { 996 checkArrayTypes(n); 997 if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size'); 998 var q = new Uint8Array(crypto_scalarmult_BYTES); 999 crypto_scalarmult_base(q, n); 1000 return q; 1001 }; 1002 1003 nacl.scalarMult.scalarLength = crypto_scalarmult_SCALARBYTES; 1004 nacl.scalarMult.groupElementLength = crypto_scalarmult_BYTES; 1005 1006 nacl.box = function(msg, nonce, publicKey, secretKey) { 1007 var k = nacl.box.before(publicKey, secretKey); 1008 return nacl.secretbox(msg, nonce, k); 1009 }; 1010 1011 nacl.box.before = function(publicKey, secretKey) { 1012 checkArrayTypes(publicKey, secretKey); 1013 checkBoxLengths(publicKey, secretKey); 1014 var k = new Uint8Array(crypto_box_BEFORENMBYTES); 1015 crypto_box_beforenm(k, publicKey, secretKey); 1016 return k; 1017 }; 1018 1019 nacl.box.after = nacl.secretbox; 1020 1021 nacl.box.open = function(msg, nonce, publicKey, secretKey) { 1022 var k = nacl.box.before(publicKey, secretKey); 1023 return nacl.secretbox.open(msg, nonce, k); 1024 }; 1025 1026 nacl.box.open.after = nacl.secretbox.open; 1027 1028 nacl.box.keyPair = function() { 1029 var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); 1030 var sk = new Uint8Array(crypto_box_SECRETKEYBYTES); 1031 crypto_box_keypair(pk, sk); 1032 return {publicKey: pk, secretKey: sk}; 1033 }; 1034 1035 nacl.box.keyPair.fromSecretKey = function(secretKey) { 1036 checkArrayTypes(secretKey); 1037 if (secretKey.length !== crypto_box_SECRETKEYBYTES) 1038 throw new Error('bad secret key size'); 1039 var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); 1040 crypto_scalarmult_base(pk, secretKey); 1041 return {publicKey: pk, secretKey: new Uint8Array(secretKey)}; 1042 }; 1043 1044 nacl.box.publicKeyLength = crypto_box_PUBLICKEYBYTES; 1045 nacl.box.secretKeyLength = crypto_box_SECRETKEYBYTES; 1046 nacl.box.sharedKeyLength = crypto_box_BEFORENMBYTES; 1047 nacl.box.nonceLength = crypto_box_NONCEBYTES; 1048 nacl.box.overheadLength = nacl.secretbox.overheadLength; 1049 1050 nacl.sign = function(msg, secretKey) { 1051 checkArrayTypes(msg, secretKey); 1052 if (secretKey.length !== crypto_sign_SECRETKEYBYTES) 1053 throw new Error('bad secret key size'); 1054 var signedMsg = new Uint8Array(crypto_sign_BYTES+msg.length); 1055 crypto_sign(signedMsg, msg, msg.length, secretKey); 1056 return signedMsg; 1057 }; 1058 1059 nacl.sign.open = function(signedMsg, publicKey) { 1060 if (arguments.length !== 2) 1061 throw new Error('nacl.sign.open accepts 2 arguments; did you mean to use nacl.sign.detached.verify?'); 1062 checkArrayTypes(signedMsg, publicKey); 1063 if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) 1064 throw new Error('bad public key size'); 1065 var tmp = new Uint8Array(signedMsg.length); 1066 var mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey); 1067 if (mlen < 0) return null; 1068 var m = new Uint8Array(mlen); 1069 for (var i = 0; i < m.length; i++) m[i] = tmp[i]; 1070 return m; 1071 }; 1072 1073 nacl.sign.detached = function(msg, secretKey) { 1074 var signedMsg = nacl.sign(msg, secretKey); 1075 var sig = new Uint8Array(crypto_sign_BYTES); 1076 for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i]; 1077 return sig; 1078 }; 1079 1080 nacl.sign.detached.verify = function(msg, sig, publicKey) { 1081 checkArrayTypes(msg, sig, publicKey); 1082 if (sig.length !== crypto_sign_BYTES) 1083 throw new Error('bad signature size'); 1084 if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) 1085 throw new Error('bad public key size'); 1086 var sm = new Uint8Array(crypto_sign_BYTES + msg.length); 1087 var m = new Uint8Array(crypto_sign_BYTES + msg.length); 1088 var i; 1089 for (i = 0; i < crypto_sign_BYTES; i++) sm[i] = sig[i]; 1090 for (i = 0; i < msg.length; i++) sm[i+crypto_sign_BYTES] = msg[i]; 1091 return (crypto_sign_open(m, sm, sm.length, publicKey) >= 0); 1092 }; 1093 1094 nacl.sign.keyPair = function() { 1095 var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); 1096 var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); 1097 crypto_sign_keypair(pk, sk); 1098 return {publicKey: pk, secretKey: sk}; 1099 }; 1100 1101 nacl.sign.keyPair.fromSecretKey = function(secretKey) { 1102 checkArrayTypes(secretKey); 1103 if (secretKey.length !== crypto_sign_SECRETKEYBYTES) 1104 throw new Error('bad secret key size'); 1105 var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); 1106 for (var i = 0; i < pk.length; i++) pk[i] = secretKey[32+i]; 1107 return {publicKey: pk, secretKey: new Uint8Array(secretKey)}; 1108 }; 1109 1110 nacl.sign.keyPair.fromSeed = function(seed) { 1111 checkArrayTypes(seed); 1112 if (seed.length !== crypto_sign_SEEDBYTES) 1113 throw new Error('bad seed size'); 1114 var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); 1115 var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); 1116 for (var i = 0; i < 32; i++) sk[i] = seed[i]; 1117 crypto_sign_keypair(pk, sk, true); 1118 return {publicKey: pk, secretKey: sk}; 1119 }; 1120 1121 nacl.sign.publicKeyLength = crypto_sign_PUBLICKEYBYTES; 1122 nacl.sign.secretKeyLength = crypto_sign_SECRETKEYBYTES; 1123 nacl.sign.seedLength = crypto_sign_SEEDBYTES; 1124 nacl.sign.signatureLength = crypto_sign_BYTES; 1125 1126 nacl.hash = function(msg) { 1127 checkArrayTypes(msg); 1128 var h = new Uint8Array(crypto_hash_BYTES); 1129 crypto_hash(h, msg, msg.length); 1130 return h; 1131 }; 1132 1133 nacl.hash.hashLength = crypto_hash_BYTES; 1134 1135 nacl.verify = function(x, y) { 1136 checkArrayTypes(x, y); 1137 // Zero length arguments are considered not equal. 1138 if (x.length === 0 || y.length === 0) return false; 1139 if (x.length !== y.length) return false; 1140 return (vn(x, 0, y, 0, x.length) === 0) ? true : false; 1141 }; 1142 1143 nacl.setPRNG = function(fn) { 1144 randombytes = fn; 1145 }; 1146 1147 (function() { 1148 // Initialize PRNG if environment provides CSPRNG. 1149 // If not, methods calling randombytes will throw. 1150 var crypto = typeof self !== 'undefined' ? (self.crypto || self.msCrypto) : null; 1151 if (crypto && crypto.getRandomValues) { 1152 // Browsers. 1153 var QUOTA = 65536; 1154 nacl.setPRNG(function(x, n) { 1155 var i, v = new Uint8Array(n); 1156 for (i = 0; i < n; i += QUOTA) { 1157 crypto.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA))); 1158 } 1159 for (i = 0; i < n; i++) x[i] = v[i]; 1160 cleanup(v); 1161 }); 1162 } else if (typeof require !== 'undefined') { 1163 // Node.js. 1164 crypto = require('crypto'); 1165 if (crypto && crypto.randomBytes) { 1166 nacl.setPRNG(function(x, n) { 1167 var i, v = crypto.randomBytes(n); 1168 for (i = 0; i < n; i++) x[i] = v[i]; 1169 cleanup(v); 1170 }); 1171 } 1172 } 1173 })(); 1174 1175 })(typeof module !== 'undefined' && module.exports ? module.exports : (self.nacl = self.nacl || {}));