nacl-fast.js (61966B)
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 gf = function(init) { 11 var i, r = new Float64Array(16); 12 if (init) for (i = 0; i < init.length; i++) r[i] = init[i]; 13 return r; 14 }; 15 16 // Pluggable, initialized in high-level API below. 17 var randombytes = function(/* x, n */) { throw new Error('no PRNG'); }; 18 19 var _0 = new Uint8Array(16); 20 var _9 = new Uint8Array(32); _9[0] = 9; 21 22 var gf0 = gf(), 23 gf1 = gf([1]), 24 _121665 = gf([0xdb41, 1]), 25 D = gf([0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]), 26 D2 = gf([0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0, 0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406]), 27 X = gf([0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c, 0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169]), 28 Y = gf([0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]), 29 I = gf([0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]); 30 31 function ts64(x, i, h, l) { 32 x[i] = (h >> 24) & 0xff; 33 x[i+1] = (h >> 16) & 0xff; 34 x[i+2] = (h >> 8) & 0xff; 35 x[i+3] = h & 0xff; 36 x[i+4] = (l >> 24) & 0xff; 37 x[i+5] = (l >> 16) & 0xff; 38 x[i+6] = (l >> 8) & 0xff; 39 x[i+7] = l & 0xff; 40 } 41 42 function vn(x, xi, y, yi, n) { 43 var i,d = 0; 44 for (i = 0; i < n; i++) d |= x[xi+i]^y[yi+i]; 45 return (1 & ((d - 1) >>> 8)) - 1; 46 } 47 48 function crypto_verify_16(x, xi, y, yi) { 49 return vn(x,xi,y,yi,16); 50 } 51 52 function crypto_verify_32(x, xi, y, yi) { 53 return vn(x,xi,y,yi,32); 54 } 55 56 function core_salsa20(o, p, k, c) { 57 var j0 = c[ 0] & 0xff | (c[ 1] & 0xff)<<8 | (c[ 2] & 0xff)<<16 | (c[ 3] & 0xff)<<24, 58 j1 = k[ 0] & 0xff | (k[ 1] & 0xff)<<8 | (k[ 2] & 0xff)<<16 | (k[ 3] & 0xff)<<24, 59 j2 = k[ 4] & 0xff | (k[ 5] & 0xff)<<8 | (k[ 6] & 0xff)<<16 | (k[ 7] & 0xff)<<24, 60 j3 = k[ 8] & 0xff | (k[ 9] & 0xff)<<8 | (k[10] & 0xff)<<16 | (k[11] & 0xff)<<24, 61 j4 = k[12] & 0xff | (k[13] & 0xff)<<8 | (k[14] & 0xff)<<16 | (k[15] & 0xff)<<24, 62 j5 = c[ 4] & 0xff | (c[ 5] & 0xff)<<8 | (c[ 6] & 0xff)<<16 | (c[ 7] & 0xff)<<24, 63 j6 = p[ 0] & 0xff | (p[ 1] & 0xff)<<8 | (p[ 2] & 0xff)<<16 | (p[ 3] & 0xff)<<24, 64 j7 = p[ 4] & 0xff | (p[ 5] & 0xff)<<8 | (p[ 6] & 0xff)<<16 | (p[ 7] & 0xff)<<24, 65 j8 = p[ 8] & 0xff | (p[ 9] & 0xff)<<8 | (p[10] & 0xff)<<16 | (p[11] & 0xff)<<24, 66 j9 = p[12] & 0xff | (p[13] & 0xff)<<8 | (p[14] & 0xff)<<16 | (p[15] & 0xff)<<24, 67 j10 = c[ 8] & 0xff | (c[ 9] & 0xff)<<8 | (c[10] & 0xff)<<16 | (c[11] & 0xff)<<24, 68 j11 = k[16] & 0xff | (k[17] & 0xff)<<8 | (k[18] & 0xff)<<16 | (k[19] & 0xff)<<24, 69 j12 = k[20] & 0xff | (k[21] & 0xff)<<8 | (k[22] & 0xff)<<16 | (k[23] & 0xff)<<24, 70 j13 = k[24] & 0xff | (k[25] & 0xff)<<8 | (k[26] & 0xff)<<16 | (k[27] & 0xff)<<24, 71 j14 = k[28] & 0xff | (k[29] & 0xff)<<8 | (k[30] & 0xff)<<16 | (k[31] & 0xff)<<24, 72 j15 = c[12] & 0xff | (c[13] & 0xff)<<8 | (c[14] & 0xff)<<16 | (c[15] & 0xff)<<24; 73 74 var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7, 75 x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14, 76 x15 = j15, u; 77 78 for (var i = 0; i < 20; i += 2) { 79 u = x0 + x12 | 0; 80 x4 ^= u<<7 | u>>>(32-7); 81 u = x4 + x0 | 0; 82 x8 ^= u<<9 | u>>>(32-9); 83 u = x8 + x4 | 0; 84 x12 ^= u<<13 | u>>>(32-13); 85 u = x12 + x8 | 0; 86 x0 ^= u<<18 | u>>>(32-18); 87 88 u = x5 + x1 | 0; 89 x9 ^= u<<7 | u>>>(32-7); 90 u = x9 + x5 | 0; 91 x13 ^= u<<9 | u>>>(32-9); 92 u = x13 + x9 | 0; 93 x1 ^= u<<13 | u>>>(32-13); 94 u = x1 + x13 | 0; 95 x5 ^= u<<18 | u>>>(32-18); 96 97 u = x10 + x6 | 0; 98 x14 ^= u<<7 | u>>>(32-7); 99 u = x14 + x10 | 0; 100 x2 ^= u<<9 | u>>>(32-9); 101 u = x2 + x14 | 0; 102 x6 ^= u<<13 | u>>>(32-13); 103 u = x6 + x2 | 0; 104 x10 ^= u<<18 | u>>>(32-18); 105 106 u = x15 + x11 | 0; 107 x3 ^= u<<7 | u>>>(32-7); 108 u = x3 + x15 | 0; 109 x7 ^= u<<9 | u>>>(32-9); 110 u = x7 + x3 | 0; 111 x11 ^= u<<13 | u>>>(32-13); 112 u = x11 + x7 | 0; 113 x15 ^= u<<18 | u>>>(32-18); 114 115 u = x0 + x3 | 0; 116 x1 ^= u<<7 | u>>>(32-7); 117 u = x1 + x0 | 0; 118 x2 ^= u<<9 | u>>>(32-9); 119 u = x2 + x1 | 0; 120 x3 ^= u<<13 | u>>>(32-13); 121 u = x3 + x2 | 0; 122 x0 ^= u<<18 | u>>>(32-18); 123 124 u = x5 + x4 | 0; 125 x6 ^= u<<7 | u>>>(32-7); 126 u = x6 + x5 | 0; 127 x7 ^= u<<9 | u>>>(32-9); 128 u = x7 + x6 | 0; 129 x4 ^= u<<13 | u>>>(32-13); 130 u = x4 + x7 | 0; 131 x5 ^= u<<18 | u>>>(32-18); 132 133 u = x10 + x9 | 0; 134 x11 ^= u<<7 | u>>>(32-7); 135 u = x11 + x10 | 0; 136 x8 ^= u<<9 | u>>>(32-9); 137 u = x8 + x11 | 0; 138 x9 ^= u<<13 | u>>>(32-13); 139 u = x9 + x8 | 0; 140 x10 ^= u<<18 | u>>>(32-18); 141 142 u = x15 + x14 | 0; 143 x12 ^= u<<7 | u>>>(32-7); 144 u = x12 + x15 | 0; 145 x13 ^= u<<9 | u>>>(32-9); 146 u = x13 + x12 | 0; 147 x14 ^= u<<13 | u>>>(32-13); 148 u = x14 + x13 | 0; 149 x15 ^= u<<18 | u>>>(32-18); 150 } 151 x0 = x0 + j0 | 0; 152 x1 = x1 + j1 | 0; 153 x2 = x2 + j2 | 0; 154 x3 = x3 + j3 | 0; 155 x4 = x4 + j4 | 0; 156 x5 = x5 + j5 | 0; 157 x6 = x6 + j6 | 0; 158 x7 = x7 + j7 | 0; 159 x8 = x8 + j8 | 0; 160 x9 = x9 + j9 | 0; 161 x10 = x10 + j10 | 0; 162 x11 = x11 + j11 | 0; 163 x12 = x12 + j12 | 0; 164 x13 = x13 + j13 | 0; 165 x14 = x14 + j14 | 0; 166 x15 = x15 + j15 | 0; 167 168 o[ 0] = x0 >>> 0 & 0xff; 169 o[ 1] = x0 >>> 8 & 0xff; 170 o[ 2] = x0 >>> 16 & 0xff; 171 o[ 3] = x0 >>> 24 & 0xff; 172 173 o[ 4] = x1 >>> 0 & 0xff; 174 o[ 5] = x1 >>> 8 & 0xff; 175 o[ 6] = x1 >>> 16 & 0xff; 176 o[ 7] = x1 >>> 24 & 0xff; 177 178 o[ 8] = x2 >>> 0 & 0xff; 179 o[ 9] = x2 >>> 8 & 0xff; 180 o[10] = x2 >>> 16 & 0xff; 181 o[11] = x2 >>> 24 & 0xff; 182 183 o[12] = x3 >>> 0 & 0xff; 184 o[13] = x3 >>> 8 & 0xff; 185 o[14] = x3 >>> 16 & 0xff; 186 o[15] = x3 >>> 24 & 0xff; 187 188 o[16] = x4 >>> 0 & 0xff; 189 o[17] = x4 >>> 8 & 0xff; 190 o[18] = x4 >>> 16 & 0xff; 191 o[19] = x4 >>> 24 & 0xff; 192 193 o[20] = x5 >>> 0 & 0xff; 194 o[21] = x5 >>> 8 & 0xff; 195 o[22] = x5 >>> 16 & 0xff; 196 o[23] = x5 >>> 24 & 0xff; 197 198 o[24] = x6 >>> 0 & 0xff; 199 o[25] = x6 >>> 8 & 0xff; 200 o[26] = x6 >>> 16 & 0xff; 201 o[27] = x6 >>> 24 & 0xff; 202 203 o[28] = x7 >>> 0 & 0xff; 204 o[29] = x7 >>> 8 & 0xff; 205 o[30] = x7 >>> 16 & 0xff; 206 o[31] = x7 >>> 24 & 0xff; 207 208 o[32] = x8 >>> 0 & 0xff; 209 o[33] = x8 >>> 8 & 0xff; 210 o[34] = x8 >>> 16 & 0xff; 211 o[35] = x8 >>> 24 & 0xff; 212 213 o[36] = x9 >>> 0 & 0xff; 214 o[37] = x9 >>> 8 & 0xff; 215 o[38] = x9 >>> 16 & 0xff; 216 o[39] = x9 >>> 24 & 0xff; 217 218 o[40] = x10 >>> 0 & 0xff; 219 o[41] = x10 >>> 8 & 0xff; 220 o[42] = x10 >>> 16 & 0xff; 221 o[43] = x10 >>> 24 & 0xff; 222 223 o[44] = x11 >>> 0 & 0xff; 224 o[45] = x11 >>> 8 & 0xff; 225 o[46] = x11 >>> 16 & 0xff; 226 o[47] = x11 >>> 24 & 0xff; 227 228 o[48] = x12 >>> 0 & 0xff; 229 o[49] = x12 >>> 8 & 0xff; 230 o[50] = x12 >>> 16 & 0xff; 231 o[51] = x12 >>> 24 & 0xff; 232 233 o[52] = x13 >>> 0 & 0xff; 234 o[53] = x13 >>> 8 & 0xff; 235 o[54] = x13 >>> 16 & 0xff; 236 o[55] = x13 >>> 24 & 0xff; 237 238 o[56] = x14 >>> 0 & 0xff; 239 o[57] = x14 >>> 8 & 0xff; 240 o[58] = x14 >>> 16 & 0xff; 241 o[59] = x14 >>> 24 & 0xff; 242 243 o[60] = x15 >>> 0 & 0xff; 244 o[61] = x15 >>> 8 & 0xff; 245 o[62] = x15 >>> 16 & 0xff; 246 o[63] = x15 >>> 24 & 0xff; 247 } 248 249 function core_hsalsa20(o,p,k,c) { 250 var j0 = c[ 0] & 0xff | (c[ 1] & 0xff)<<8 | (c[ 2] & 0xff)<<16 | (c[ 3] & 0xff)<<24, 251 j1 = k[ 0] & 0xff | (k[ 1] & 0xff)<<8 | (k[ 2] & 0xff)<<16 | (k[ 3] & 0xff)<<24, 252 j2 = k[ 4] & 0xff | (k[ 5] & 0xff)<<8 | (k[ 6] & 0xff)<<16 | (k[ 7] & 0xff)<<24, 253 j3 = k[ 8] & 0xff | (k[ 9] & 0xff)<<8 | (k[10] & 0xff)<<16 | (k[11] & 0xff)<<24, 254 j4 = k[12] & 0xff | (k[13] & 0xff)<<8 | (k[14] & 0xff)<<16 | (k[15] & 0xff)<<24, 255 j5 = c[ 4] & 0xff | (c[ 5] & 0xff)<<8 | (c[ 6] & 0xff)<<16 | (c[ 7] & 0xff)<<24, 256 j6 = p[ 0] & 0xff | (p[ 1] & 0xff)<<8 | (p[ 2] & 0xff)<<16 | (p[ 3] & 0xff)<<24, 257 j7 = p[ 4] & 0xff | (p[ 5] & 0xff)<<8 | (p[ 6] & 0xff)<<16 | (p[ 7] & 0xff)<<24, 258 j8 = p[ 8] & 0xff | (p[ 9] & 0xff)<<8 | (p[10] & 0xff)<<16 | (p[11] & 0xff)<<24, 259 j9 = p[12] & 0xff | (p[13] & 0xff)<<8 | (p[14] & 0xff)<<16 | (p[15] & 0xff)<<24, 260 j10 = c[ 8] & 0xff | (c[ 9] & 0xff)<<8 | (c[10] & 0xff)<<16 | (c[11] & 0xff)<<24, 261 j11 = k[16] & 0xff | (k[17] & 0xff)<<8 | (k[18] & 0xff)<<16 | (k[19] & 0xff)<<24, 262 j12 = k[20] & 0xff | (k[21] & 0xff)<<8 | (k[22] & 0xff)<<16 | (k[23] & 0xff)<<24, 263 j13 = k[24] & 0xff | (k[25] & 0xff)<<8 | (k[26] & 0xff)<<16 | (k[27] & 0xff)<<24, 264 j14 = k[28] & 0xff | (k[29] & 0xff)<<8 | (k[30] & 0xff)<<16 | (k[31] & 0xff)<<24, 265 j15 = c[12] & 0xff | (c[13] & 0xff)<<8 | (c[14] & 0xff)<<16 | (c[15] & 0xff)<<24; 266 267 var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7, 268 x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14, 269 x15 = j15, u; 270 271 for (var i = 0; i < 20; i += 2) { 272 u = x0 + x12 | 0; 273 x4 ^= u<<7 | u>>>(32-7); 274 u = x4 + x0 | 0; 275 x8 ^= u<<9 | u>>>(32-9); 276 u = x8 + x4 | 0; 277 x12 ^= u<<13 | u>>>(32-13); 278 u = x12 + x8 | 0; 279 x0 ^= u<<18 | u>>>(32-18); 280 281 u = x5 + x1 | 0; 282 x9 ^= u<<7 | u>>>(32-7); 283 u = x9 + x5 | 0; 284 x13 ^= u<<9 | u>>>(32-9); 285 u = x13 + x9 | 0; 286 x1 ^= u<<13 | u>>>(32-13); 287 u = x1 + x13 | 0; 288 x5 ^= u<<18 | u>>>(32-18); 289 290 u = x10 + x6 | 0; 291 x14 ^= u<<7 | u>>>(32-7); 292 u = x14 + x10 | 0; 293 x2 ^= u<<9 | u>>>(32-9); 294 u = x2 + x14 | 0; 295 x6 ^= u<<13 | u>>>(32-13); 296 u = x6 + x2 | 0; 297 x10 ^= u<<18 | u>>>(32-18); 298 299 u = x15 + x11 | 0; 300 x3 ^= u<<7 | u>>>(32-7); 301 u = x3 + x15 | 0; 302 x7 ^= u<<9 | u>>>(32-9); 303 u = x7 + x3 | 0; 304 x11 ^= u<<13 | u>>>(32-13); 305 u = x11 + x7 | 0; 306 x15 ^= u<<18 | u>>>(32-18); 307 308 u = x0 + x3 | 0; 309 x1 ^= u<<7 | u>>>(32-7); 310 u = x1 + x0 | 0; 311 x2 ^= u<<9 | u>>>(32-9); 312 u = x2 + x1 | 0; 313 x3 ^= u<<13 | u>>>(32-13); 314 u = x3 + x2 | 0; 315 x0 ^= u<<18 | u>>>(32-18); 316 317 u = x5 + x4 | 0; 318 x6 ^= u<<7 | u>>>(32-7); 319 u = x6 + x5 | 0; 320 x7 ^= u<<9 | u>>>(32-9); 321 u = x7 + x6 | 0; 322 x4 ^= u<<13 | u>>>(32-13); 323 u = x4 + x7 | 0; 324 x5 ^= u<<18 | u>>>(32-18); 325 326 u = x10 + x9 | 0; 327 x11 ^= u<<7 | u>>>(32-7); 328 u = x11 + x10 | 0; 329 x8 ^= u<<9 | u>>>(32-9); 330 u = x8 + x11 | 0; 331 x9 ^= u<<13 | u>>>(32-13); 332 u = x9 + x8 | 0; 333 x10 ^= u<<18 | u>>>(32-18); 334 335 u = x15 + x14 | 0; 336 x12 ^= u<<7 | u>>>(32-7); 337 u = x12 + x15 | 0; 338 x13 ^= u<<9 | u>>>(32-9); 339 u = x13 + x12 | 0; 340 x14 ^= u<<13 | u>>>(32-13); 341 u = x14 + x13 | 0; 342 x15 ^= u<<18 | u>>>(32-18); 343 } 344 345 o[ 0] = x0 >>> 0 & 0xff; 346 o[ 1] = x0 >>> 8 & 0xff; 347 o[ 2] = x0 >>> 16 & 0xff; 348 o[ 3] = x0 >>> 24 & 0xff; 349 350 o[ 4] = x5 >>> 0 & 0xff; 351 o[ 5] = x5 >>> 8 & 0xff; 352 o[ 6] = x5 >>> 16 & 0xff; 353 o[ 7] = x5 >>> 24 & 0xff; 354 355 o[ 8] = x10 >>> 0 & 0xff; 356 o[ 9] = x10 >>> 8 & 0xff; 357 o[10] = x10 >>> 16 & 0xff; 358 o[11] = x10 >>> 24 & 0xff; 359 360 o[12] = x15 >>> 0 & 0xff; 361 o[13] = x15 >>> 8 & 0xff; 362 o[14] = x15 >>> 16 & 0xff; 363 o[15] = x15 >>> 24 & 0xff; 364 365 o[16] = x6 >>> 0 & 0xff; 366 o[17] = x6 >>> 8 & 0xff; 367 o[18] = x6 >>> 16 & 0xff; 368 o[19] = x6 >>> 24 & 0xff; 369 370 o[20] = x7 >>> 0 & 0xff; 371 o[21] = x7 >>> 8 & 0xff; 372 o[22] = x7 >>> 16 & 0xff; 373 o[23] = x7 >>> 24 & 0xff; 374 375 o[24] = x8 >>> 0 & 0xff; 376 o[25] = x8 >>> 8 & 0xff; 377 o[26] = x8 >>> 16 & 0xff; 378 o[27] = x8 >>> 24 & 0xff; 379 380 o[28] = x9 >>> 0 & 0xff; 381 o[29] = x9 >>> 8 & 0xff; 382 o[30] = x9 >>> 16 & 0xff; 383 o[31] = x9 >>> 24 & 0xff; 384 } 385 386 function crypto_core_salsa20(out,inp,k,c) { 387 core_salsa20(out,inp,k,c); 388 } 389 390 function crypto_core_hsalsa20(out,inp,k,c) { 391 core_hsalsa20(out,inp,k,c); 392 } 393 394 var sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]); 395 // "expand 32-byte k" 396 397 function crypto_stream_salsa20_xor(c,cpos,m,mpos,b,n,k) { 398 var z = new Uint8Array(16), x = new Uint8Array(64); 399 var u, i; 400 for (i = 0; i < 16; i++) z[i] = 0; 401 for (i = 0; i < 8; i++) z[i] = n[i]; 402 while (b >= 64) { 403 crypto_core_salsa20(x,z,k,sigma); 404 for (i = 0; i < 64; i++) c[cpos+i] = m[mpos+i] ^ x[i]; 405 u = 1; 406 for (i = 8; i < 16; i++) { 407 u = u + (z[i] & 0xff) | 0; 408 z[i] = u & 0xff; 409 u >>>= 8; 410 } 411 b -= 64; 412 cpos += 64; 413 mpos += 64; 414 } 415 if (b > 0) { 416 crypto_core_salsa20(x,z,k,sigma); 417 for (i = 0; i < b; i++) c[cpos+i] = m[mpos+i] ^ x[i]; 418 } 419 return 0; 420 } 421 422 function crypto_stream_salsa20(c,cpos,b,n,k) { 423 var z = new Uint8Array(16), x = new Uint8Array(64); 424 var u, i; 425 for (i = 0; i < 16; i++) z[i] = 0; 426 for (i = 0; i < 8; i++) z[i] = n[i]; 427 while (b >= 64) { 428 crypto_core_salsa20(x,z,k,sigma); 429 for (i = 0; i < 64; i++) c[cpos+i] = x[i]; 430 u = 1; 431 for (i = 8; i < 16; i++) { 432 u = u + (z[i] & 0xff) | 0; 433 z[i] = u & 0xff; 434 u >>>= 8; 435 } 436 b -= 64; 437 cpos += 64; 438 } 439 if (b > 0) { 440 crypto_core_salsa20(x,z,k,sigma); 441 for (i = 0; i < b; i++) c[cpos+i] = x[i]; 442 } 443 return 0; 444 } 445 446 function crypto_stream(c,cpos,d,n,k) { 447 var s = new Uint8Array(32); 448 crypto_core_hsalsa20(s,n,k,sigma); 449 var sn = new Uint8Array(8); 450 for (var i = 0; i < 8; i++) sn[i] = n[i+16]; 451 return crypto_stream_salsa20(c,cpos,d,sn,s); 452 } 453 454 function crypto_stream_xor(c,cpos,m,mpos,d,n,k) { 455 var s = new Uint8Array(32); 456 crypto_core_hsalsa20(s,n,k,sigma); 457 var sn = new Uint8Array(8); 458 for (var i = 0; i < 8; i++) sn[i] = n[i+16]; 459 return crypto_stream_salsa20_xor(c,cpos,m,mpos,d,sn,s); 460 } 461 462 /* 463 * Port of Andrew Moon's Poly1305-donna-16. Public domain. 464 * https://github.com/floodyberry/poly1305-donna 465 */ 466 467 var poly1305 = function(key) { 468 this.buffer = new Uint8Array(16); 469 this.r = new Uint16Array(10); 470 this.h = new Uint16Array(10); 471 this.pad = new Uint16Array(8); 472 this.leftover = 0; 473 this.fin = 0; 474 475 var t0, t1, t2, t3, t4, t5, t6, t7; 476 477 t0 = key[ 0] & 0xff | (key[ 1] & 0xff) << 8; this.r[0] = ( t0 ) & 0x1fff; 478 t1 = key[ 2] & 0xff | (key[ 3] & 0xff) << 8; this.r[1] = ((t0 >>> 13) | (t1 << 3)) & 0x1fff; 479 t2 = key[ 4] & 0xff | (key[ 5] & 0xff) << 8; this.r[2] = ((t1 >>> 10) | (t2 << 6)) & 0x1f03; 480 t3 = key[ 6] & 0xff | (key[ 7] & 0xff) << 8; this.r[3] = ((t2 >>> 7) | (t3 << 9)) & 0x1fff; 481 t4 = key[ 8] & 0xff | (key[ 9] & 0xff) << 8; this.r[4] = ((t3 >>> 4) | (t4 << 12)) & 0x00ff; 482 this.r[5] = ((t4 >>> 1)) & 0x1ffe; 483 t5 = key[10] & 0xff | (key[11] & 0xff) << 8; this.r[6] = ((t4 >>> 14) | (t5 << 2)) & 0x1fff; 484 t6 = key[12] & 0xff | (key[13] & 0xff) << 8; this.r[7] = ((t5 >>> 11) | (t6 << 5)) & 0x1f81; 485 t7 = key[14] & 0xff | (key[15] & 0xff) << 8; this.r[8] = ((t6 >>> 8) | (t7 << 8)) & 0x1fff; 486 this.r[9] = ((t7 >>> 5)) & 0x007f; 487 488 this.pad[0] = key[16] & 0xff | (key[17] & 0xff) << 8; 489 this.pad[1] = key[18] & 0xff | (key[19] & 0xff) << 8; 490 this.pad[2] = key[20] & 0xff | (key[21] & 0xff) << 8; 491 this.pad[3] = key[22] & 0xff | (key[23] & 0xff) << 8; 492 this.pad[4] = key[24] & 0xff | (key[25] & 0xff) << 8; 493 this.pad[5] = key[26] & 0xff | (key[27] & 0xff) << 8; 494 this.pad[6] = key[28] & 0xff | (key[29] & 0xff) << 8; 495 this.pad[7] = key[30] & 0xff | (key[31] & 0xff) << 8; 496 }; 497 498 poly1305.prototype.blocks = function(m, mpos, bytes) { 499 var hibit = this.fin ? 0 : (1 << 11); 500 var t0, t1, t2, t3, t4, t5, t6, t7, c; 501 var d0, d1, d2, d3, d4, d5, d6, d7, d8, d9; 502 503 var h0 = this.h[0], 504 h1 = this.h[1], 505 h2 = this.h[2], 506 h3 = this.h[3], 507 h4 = this.h[4], 508 h5 = this.h[5], 509 h6 = this.h[6], 510 h7 = this.h[7], 511 h8 = this.h[8], 512 h9 = this.h[9]; 513 514 var r0 = this.r[0], 515 r1 = this.r[1], 516 r2 = this.r[2], 517 r3 = this.r[3], 518 r4 = this.r[4], 519 r5 = this.r[5], 520 r6 = this.r[6], 521 r7 = this.r[7], 522 r8 = this.r[8], 523 r9 = this.r[9]; 524 525 while (bytes >= 16) { 526 t0 = m[mpos+ 0] & 0xff | (m[mpos+ 1] & 0xff) << 8; h0 += ( t0 ) & 0x1fff; 527 t1 = m[mpos+ 2] & 0xff | (m[mpos+ 3] & 0xff) << 8; h1 += ((t0 >>> 13) | (t1 << 3)) & 0x1fff; 528 t2 = m[mpos+ 4] & 0xff | (m[mpos+ 5] & 0xff) << 8; h2 += ((t1 >>> 10) | (t2 << 6)) & 0x1fff; 529 t3 = m[mpos+ 6] & 0xff | (m[mpos+ 7] & 0xff) << 8; h3 += ((t2 >>> 7) | (t3 << 9)) & 0x1fff; 530 t4 = m[mpos+ 8] & 0xff | (m[mpos+ 9] & 0xff) << 8; h4 += ((t3 >>> 4) | (t4 << 12)) & 0x1fff; 531 h5 += ((t4 >>> 1)) & 0x1fff; 532 t5 = m[mpos+10] & 0xff | (m[mpos+11] & 0xff) << 8; h6 += ((t4 >>> 14) | (t5 << 2)) & 0x1fff; 533 t6 = m[mpos+12] & 0xff | (m[mpos+13] & 0xff) << 8; h7 += ((t5 >>> 11) | (t6 << 5)) & 0x1fff; 534 t7 = m[mpos+14] & 0xff | (m[mpos+15] & 0xff) << 8; h8 += ((t6 >>> 8) | (t7 << 8)) & 0x1fff; 535 h9 += ((t7 >>> 5)) | hibit; 536 537 c = 0; 538 539 d0 = c; 540 d0 += h0 * r0; 541 d0 += h1 * (5 * r9); 542 d0 += h2 * (5 * r8); 543 d0 += h3 * (5 * r7); 544 d0 += h4 * (5 * r6); 545 c = (d0 >>> 13); d0 &= 0x1fff; 546 d0 += h5 * (5 * r5); 547 d0 += h6 * (5 * r4); 548 d0 += h7 * (5 * r3); 549 d0 += h8 * (5 * r2); 550 d0 += h9 * (5 * r1); 551 c += (d0 >>> 13); d0 &= 0x1fff; 552 553 d1 = c; 554 d1 += h0 * r1; 555 d1 += h1 * r0; 556 d1 += h2 * (5 * r9); 557 d1 += h3 * (5 * r8); 558 d1 += h4 * (5 * r7); 559 c = (d1 >>> 13); d1 &= 0x1fff; 560 d1 += h5 * (5 * r6); 561 d1 += h6 * (5 * r5); 562 d1 += h7 * (5 * r4); 563 d1 += h8 * (5 * r3); 564 d1 += h9 * (5 * r2); 565 c += (d1 >>> 13); d1 &= 0x1fff; 566 567 d2 = c; 568 d2 += h0 * r2; 569 d2 += h1 * r1; 570 d2 += h2 * r0; 571 d2 += h3 * (5 * r9); 572 d2 += h4 * (5 * r8); 573 c = (d2 >>> 13); d2 &= 0x1fff; 574 d2 += h5 * (5 * r7); 575 d2 += h6 * (5 * r6); 576 d2 += h7 * (5 * r5); 577 d2 += h8 * (5 * r4); 578 d2 += h9 * (5 * r3); 579 c += (d2 >>> 13); d2 &= 0x1fff; 580 581 d3 = c; 582 d3 += h0 * r3; 583 d3 += h1 * r2; 584 d3 += h2 * r1; 585 d3 += h3 * r0; 586 d3 += h4 * (5 * r9); 587 c = (d3 >>> 13); d3 &= 0x1fff; 588 d3 += h5 * (5 * r8); 589 d3 += h6 * (5 * r7); 590 d3 += h7 * (5 * r6); 591 d3 += h8 * (5 * r5); 592 d3 += h9 * (5 * r4); 593 c += (d3 >>> 13); d3 &= 0x1fff; 594 595 d4 = c; 596 d4 += h0 * r4; 597 d4 += h1 * r3; 598 d4 += h2 * r2; 599 d4 += h3 * r1; 600 d4 += h4 * r0; 601 c = (d4 >>> 13); d4 &= 0x1fff; 602 d4 += h5 * (5 * r9); 603 d4 += h6 * (5 * r8); 604 d4 += h7 * (5 * r7); 605 d4 += h8 * (5 * r6); 606 d4 += h9 * (5 * r5); 607 c += (d4 >>> 13); d4 &= 0x1fff; 608 609 d5 = c; 610 d5 += h0 * r5; 611 d5 += h1 * r4; 612 d5 += h2 * r3; 613 d5 += h3 * r2; 614 d5 += h4 * r1; 615 c = (d5 >>> 13); d5 &= 0x1fff; 616 d5 += h5 * r0; 617 d5 += h6 * (5 * r9); 618 d5 += h7 * (5 * r8); 619 d5 += h8 * (5 * r7); 620 d5 += h9 * (5 * r6); 621 c += (d5 >>> 13); d5 &= 0x1fff; 622 623 d6 = c; 624 d6 += h0 * r6; 625 d6 += h1 * r5; 626 d6 += h2 * r4; 627 d6 += h3 * r3; 628 d6 += h4 * r2; 629 c = (d6 >>> 13); d6 &= 0x1fff; 630 d6 += h5 * r1; 631 d6 += h6 * r0; 632 d6 += h7 * (5 * r9); 633 d6 += h8 * (5 * r8); 634 d6 += h9 * (5 * r7); 635 c += (d6 >>> 13); d6 &= 0x1fff; 636 637 d7 = c; 638 d7 += h0 * r7; 639 d7 += h1 * r6; 640 d7 += h2 * r5; 641 d7 += h3 * r4; 642 d7 += h4 * r3; 643 c = (d7 >>> 13); d7 &= 0x1fff; 644 d7 += h5 * r2; 645 d7 += h6 * r1; 646 d7 += h7 * r0; 647 d7 += h8 * (5 * r9); 648 d7 += h9 * (5 * r8); 649 c += (d7 >>> 13); d7 &= 0x1fff; 650 651 d8 = c; 652 d8 += h0 * r8; 653 d8 += h1 * r7; 654 d8 += h2 * r6; 655 d8 += h3 * r5; 656 d8 += h4 * r4; 657 c = (d8 >>> 13); d8 &= 0x1fff; 658 d8 += h5 * r3; 659 d8 += h6 * r2; 660 d8 += h7 * r1; 661 d8 += h8 * r0; 662 d8 += h9 * (5 * r9); 663 c += (d8 >>> 13); d8 &= 0x1fff; 664 665 d9 = c; 666 d9 += h0 * r9; 667 d9 += h1 * r8; 668 d9 += h2 * r7; 669 d9 += h3 * r6; 670 d9 += h4 * r5; 671 c = (d9 >>> 13); d9 &= 0x1fff; 672 d9 += h5 * r4; 673 d9 += h6 * r3; 674 d9 += h7 * r2; 675 d9 += h8 * r1; 676 d9 += h9 * r0; 677 c += (d9 >>> 13); d9 &= 0x1fff; 678 679 c = (((c << 2) + c)) | 0; 680 c = (c + d0) | 0; 681 d0 = c & 0x1fff; 682 c = (c >>> 13); 683 d1 += c; 684 685 h0 = d0; 686 h1 = d1; 687 h2 = d2; 688 h3 = d3; 689 h4 = d4; 690 h5 = d5; 691 h6 = d6; 692 h7 = d7; 693 h8 = d8; 694 h9 = d9; 695 696 mpos += 16; 697 bytes -= 16; 698 } 699 this.h[0] = h0; 700 this.h[1] = h1; 701 this.h[2] = h2; 702 this.h[3] = h3; 703 this.h[4] = h4; 704 this.h[5] = h5; 705 this.h[6] = h6; 706 this.h[7] = h7; 707 this.h[8] = h8; 708 this.h[9] = h9; 709 }; 710 711 poly1305.prototype.finish = function(mac, macpos) { 712 var g = new Uint16Array(10); 713 var c, mask, f, i; 714 715 if (this.leftover) { 716 i = this.leftover; 717 this.buffer[i++] = 1; 718 for (; i < 16; i++) this.buffer[i] = 0; 719 this.fin = 1; 720 this.blocks(this.buffer, 0, 16); 721 } 722 723 c = this.h[1] >>> 13; 724 this.h[1] &= 0x1fff; 725 for (i = 2; i < 10; i++) { 726 this.h[i] += c; 727 c = this.h[i] >>> 13; 728 this.h[i] &= 0x1fff; 729 } 730 this.h[0] += (c * 5); 731 c = this.h[0] >>> 13; 732 this.h[0] &= 0x1fff; 733 this.h[1] += c; 734 c = this.h[1] >>> 13; 735 this.h[1] &= 0x1fff; 736 this.h[2] += c; 737 738 g[0] = this.h[0] + 5; 739 c = g[0] >>> 13; 740 g[0] &= 0x1fff; 741 for (i = 1; i < 10; i++) { 742 g[i] = this.h[i] + c; 743 c = g[i] >>> 13; 744 g[i] &= 0x1fff; 745 } 746 g[9] -= (1 << 13); 747 748 mask = (c ^ 1) - 1; 749 for (i = 0; i < 10; i++) g[i] &= mask; 750 mask = ~mask; 751 for (i = 0; i < 10; i++) this.h[i] = (this.h[i] & mask) | g[i]; 752 753 this.h[0] = ((this.h[0] ) | (this.h[1] << 13) ) & 0xffff; 754 this.h[1] = ((this.h[1] >>> 3) | (this.h[2] << 10) ) & 0xffff; 755 this.h[2] = ((this.h[2] >>> 6) | (this.h[3] << 7) ) & 0xffff; 756 this.h[3] = ((this.h[3] >>> 9) | (this.h[4] << 4) ) & 0xffff; 757 this.h[4] = ((this.h[4] >>> 12) | (this.h[5] << 1) | (this.h[6] << 14)) & 0xffff; 758 this.h[5] = ((this.h[6] >>> 2) | (this.h[7] << 11) ) & 0xffff; 759 this.h[6] = ((this.h[7] >>> 5) | (this.h[8] << 8) ) & 0xffff; 760 this.h[7] = ((this.h[8] >>> 8) | (this.h[9] << 5) ) & 0xffff; 761 762 f = this.h[0] + this.pad[0]; 763 this.h[0] = f & 0xffff; 764 for (i = 1; i < 8; i++) { 765 f = (((this.h[i] + this.pad[i]) | 0) + (f >>> 16)) | 0; 766 this.h[i] = f & 0xffff; 767 } 768 769 mac[macpos+ 0] = (this.h[0] >>> 0) & 0xff; 770 mac[macpos+ 1] = (this.h[0] >>> 8) & 0xff; 771 mac[macpos+ 2] = (this.h[1] >>> 0) & 0xff; 772 mac[macpos+ 3] = (this.h[1] >>> 8) & 0xff; 773 mac[macpos+ 4] = (this.h[2] >>> 0) & 0xff; 774 mac[macpos+ 5] = (this.h[2] >>> 8) & 0xff; 775 mac[macpos+ 6] = (this.h[3] >>> 0) & 0xff; 776 mac[macpos+ 7] = (this.h[3] >>> 8) & 0xff; 777 mac[macpos+ 8] = (this.h[4] >>> 0) & 0xff; 778 mac[macpos+ 9] = (this.h[4] >>> 8) & 0xff; 779 mac[macpos+10] = (this.h[5] >>> 0) & 0xff; 780 mac[macpos+11] = (this.h[5] >>> 8) & 0xff; 781 mac[macpos+12] = (this.h[6] >>> 0) & 0xff; 782 mac[macpos+13] = (this.h[6] >>> 8) & 0xff; 783 mac[macpos+14] = (this.h[7] >>> 0) & 0xff; 784 mac[macpos+15] = (this.h[7] >>> 8) & 0xff; 785 }; 786 787 poly1305.prototype.update = function(m, mpos, bytes) { 788 var i, want; 789 790 if (this.leftover) { 791 want = (16 - this.leftover); 792 if (want > bytes) 793 want = bytes; 794 for (i = 0; i < want; i++) 795 this.buffer[this.leftover + i] = m[mpos+i]; 796 bytes -= want; 797 mpos += want; 798 this.leftover += want; 799 if (this.leftover < 16) 800 return; 801 this.blocks(this.buffer, 0, 16); 802 this.leftover = 0; 803 } 804 805 if (bytes >= 16) { 806 want = bytes - (bytes % 16); 807 this.blocks(m, mpos, want); 808 mpos += want; 809 bytes -= want; 810 } 811 812 if (bytes) { 813 for (i = 0; i < bytes; i++) 814 this.buffer[this.leftover + i] = m[mpos+i]; 815 this.leftover += bytes; 816 } 817 }; 818 819 function crypto_onetimeauth(out, outpos, m, mpos, n, k) { 820 var s = new poly1305(k); 821 s.update(m, mpos, n); 822 s.finish(out, outpos); 823 return 0; 824 } 825 826 function crypto_onetimeauth_verify(h, hpos, m, mpos, n, k) { 827 var x = new Uint8Array(16); 828 crypto_onetimeauth(x,0,m,mpos,n,k); 829 return crypto_verify_16(h,hpos,x,0); 830 } 831 832 function crypto_secretbox(c,m,d,n,k) { 833 var i; 834 if (d < 32) return -1; 835 crypto_stream_xor(c,0,m,0,d,n,k); 836 crypto_onetimeauth(c, 16, c, 32, d - 32, c); 837 for (i = 0; i < 16; i++) c[i] = 0; 838 return 0; 839 } 840 841 function crypto_secretbox_open(m,c,d,n,k) { 842 var i; 843 var x = new Uint8Array(32); 844 if (d < 32) return -1; 845 crypto_stream(x,0,32,n,k); 846 if (crypto_onetimeauth_verify(c, 16,c, 32,d - 32,x) !== 0) return -1; 847 crypto_stream_xor(m,0,c,0,d,n,k); 848 for (i = 0; i < 32; i++) m[i] = 0; 849 return 0; 850 } 851 852 function set25519(r, a) { 853 var i; 854 for (i = 0; i < 16; i++) r[i] = a[i]|0; 855 } 856 857 function car25519(o) { 858 var i, v, c = 1; 859 for (i = 0; i < 16; i++) { 860 v = o[i] + c + 65535; 861 c = Math.floor(v / 65536); 862 o[i] = v - c * 65536; 863 } 864 o[0] += c-1 + 37 * (c-1); 865 } 866 867 function sel25519(p, q, b) { 868 var t, c = ~(b-1); 869 for (var i = 0; i < 16; i++) { 870 t = c & (p[i] ^ q[i]); 871 p[i] ^= t; 872 q[i] ^= t; 873 } 874 } 875 876 function pack25519(o, n) { 877 var i, j, b; 878 var m = gf(), t = gf(); 879 for (i = 0; i < 16; i++) t[i] = n[i]; 880 car25519(t); 881 car25519(t); 882 car25519(t); 883 for (j = 0; j < 2; j++) { 884 m[0] = t[0] - 0xffed; 885 for (i = 1; i < 15; i++) { 886 m[i] = t[i] - 0xffff - ((m[i-1]>>16) & 1); 887 m[i-1] &= 0xffff; 888 } 889 m[15] = t[15] - 0x7fff - ((m[14]>>16) & 1); 890 b = (m[15]>>16) & 1; 891 m[14] &= 0xffff; 892 sel25519(t, m, 1-b); 893 } 894 for (i = 0; i < 16; i++) { 895 o[2*i] = t[i] & 0xff; 896 o[2*i+1] = t[i]>>8; 897 } 898 } 899 900 function neq25519(a, b) { 901 var c = new Uint8Array(32), d = new Uint8Array(32); 902 pack25519(c, a); 903 pack25519(d, b); 904 return crypto_verify_32(c, 0, d, 0); 905 } 906 907 function par25519(a) { 908 var d = new Uint8Array(32); 909 pack25519(d, a); 910 return d[0] & 1; 911 } 912 913 function unpack25519(o, n) { 914 var i; 915 for (i = 0; i < 16; i++) o[i] = n[2*i] + (n[2*i+1] << 8); 916 o[15] &= 0x7fff; 917 } 918 919 function A(o, a, b) { 920 for (var i = 0; i < 16; i++) o[i] = a[i] + b[i]; 921 } 922 923 function Z(o, a, b) { 924 for (var i = 0; i < 16; i++) o[i] = a[i] - b[i]; 925 } 926 927 function M(o, a, b) { 928 var v, c, 929 t0 = 0, t1 = 0, t2 = 0, t3 = 0, t4 = 0, t5 = 0, t6 = 0, t7 = 0, 930 t8 = 0, t9 = 0, t10 = 0, t11 = 0, t12 = 0, t13 = 0, t14 = 0, t15 = 0, 931 t16 = 0, t17 = 0, t18 = 0, t19 = 0, t20 = 0, t21 = 0, t22 = 0, t23 = 0, 932 t24 = 0, t25 = 0, t26 = 0, t27 = 0, t28 = 0, t29 = 0, t30 = 0, 933 b0 = b[0], 934 b1 = b[1], 935 b2 = b[2], 936 b3 = b[3], 937 b4 = b[4], 938 b5 = b[5], 939 b6 = b[6], 940 b7 = b[7], 941 b8 = b[8], 942 b9 = b[9], 943 b10 = b[10], 944 b11 = b[11], 945 b12 = b[12], 946 b13 = b[13], 947 b14 = b[14], 948 b15 = b[15]; 949 950 v = a[0]; 951 t0 += v * b0; 952 t1 += v * b1; 953 t2 += v * b2; 954 t3 += v * b3; 955 t4 += v * b4; 956 t5 += v * b5; 957 t6 += v * b6; 958 t7 += v * b7; 959 t8 += v * b8; 960 t9 += v * b9; 961 t10 += v * b10; 962 t11 += v * b11; 963 t12 += v * b12; 964 t13 += v * b13; 965 t14 += v * b14; 966 t15 += v * b15; 967 v = a[1]; 968 t1 += v * b0; 969 t2 += v * b1; 970 t3 += v * b2; 971 t4 += v * b3; 972 t5 += v * b4; 973 t6 += v * b5; 974 t7 += v * b6; 975 t8 += v * b7; 976 t9 += v * b8; 977 t10 += v * b9; 978 t11 += v * b10; 979 t12 += v * b11; 980 t13 += v * b12; 981 t14 += v * b13; 982 t15 += v * b14; 983 t16 += v * b15; 984 v = a[2]; 985 t2 += v * b0; 986 t3 += v * b1; 987 t4 += v * b2; 988 t5 += v * b3; 989 t6 += v * b4; 990 t7 += v * b5; 991 t8 += v * b6; 992 t9 += v * b7; 993 t10 += v * b8; 994 t11 += v * b9; 995 t12 += v * b10; 996 t13 += v * b11; 997 t14 += v * b12; 998 t15 += v * b13; 999 t16 += v * b14; 1000 t17 += v * b15; 1001 v = a[3]; 1002 t3 += v * b0; 1003 t4 += v * b1; 1004 t5 += v * b2; 1005 t6 += v * b3; 1006 t7 += v * b4; 1007 t8 += v * b5; 1008 t9 += v * b6; 1009 t10 += v * b7; 1010 t11 += v * b8; 1011 t12 += v * b9; 1012 t13 += v * b10; 1013 t14 += v * b11; 1014 t15 += v * b12; 1015 t16 += v * b13; 1016 t17 += v * b14; 1017 t18 += v * b15; 1018 v = a[4]; 1019 t4 += v * b0; 1020 t5 += v * b1; 1021 t6 += v * b2; 1022 t7 += v * b3; 1023 t8 += v * b4; 1024 t9 += v * b5; 1025 t10 += v * b6; 1026 t11 += v * b7; 1027 t12 += v * b8; 1028 t13 += v * b9; 1029 t14 += v * b10; 1030 t15 += v * b11; 1031 t16 += v * b12; 1032 t17 += v * b13; 1033 t18 += v * b14; 1034 t19 += v * b15; 1035 v = a[5]; 1036 t5 += v * b0; 1037 t6 += v * b1; 1038 t7 += v * b2; 1039 t8 += v * b3; 1040 t9 += v * b4; 1041 t10 += v * b5; 1042 t11 += v * b6; 1043 t12 += v * b7; 1044 t13 += v * b8; 1045 t14 += v * b9; 1046 t15 += v * b10; 1047 t16 += v * b11; 1048 t17 += v * b12; 1049 t18 += v * b13; 1050 t19 += v * b14; 1051 t20 += v * b15; 1052 v = a[6]; 1053 t6 += v * b0; 1054 t7 += v * b1; 1055 t8 += v * b2; 1056 t9 += v * b3; 1057 t10 += v * b4; 1058 t11 += v * b5; 1059 t12 += v * b6; 1060 t13 += v * b7; 1061 t14 += v * b8; 1062 t15 += v * b9; 1063 t16 += v * b10; 1064 t17 += v * b11; 1065 t18 += v * b12; 1066 t19 += v * b13; 1067 t20 += v * b14; 1068 t21 += v * b15; 1069 v = a[7]; 1070 t7 += v * b0; 1071 t8 += v * b1; 1072 t9 += v * b2; 1073 t10 += v * b3; 1074 t11 += v * b4; 1075 t12 += v * b5; 1076 t13 += v * b6; 1077 t14 += v * b7; 1078 t15 += v * b8; 1079 t16 += v * b9; 1080 t17 += v * b10; 1081 t18 += v * b11; 1082 t19 += v * b12; 1083 t20 += v * b13; 1084 t21 += v * b14; 1085 t22 += v * b15; 1086 v = a[8]; 1087 t8 += v * b0; 1088 t9 += v * b1; 1089 t10 += v * b2; 1090 t11 += v * b3; 1091 t12 += v * b4; 1092 t13 += v * b5; 1093 t14 += v * b6; 1094 t15 += v * b7; 1095 t16 += v * b8; 1096 t17 += v * b9; 1097 t18 += v * b10; 1098 t19 += v * b11; 1099 t20 += v * b12; 1100 t21 += v * b13; 1101 t22 += v * b14; 1102 t23 += v * b15; 1103 v = a[9]; 1104 t9 += v * b0; 1105 t10 += v * b1; 1106 t11 += v * b2; 1107 t12 += v * b3; 1108 t13 += v * b4; 1109 t14 += v * b5; 1110 t15 += v * b6; 1111 t16 += v * b7; 1112 t17 += v * b8; 1113 t18 += v * b9; 1114 t19 += v * b10; 1115 t20 += v * b11; 1116 t21 += v * b12; 1117 t22 += v * b13; 1118 t23 += v * b14; 1119 t24 += v * b15; 1120 v = a[10]; 1121 t10 += v * b0; 1122 t11 += v * b1; 1123 t12 += v * b2; 1124 t13 += v * b3; 1125 t14 += v * b4; 1126 t15 += v * b5; 1127 t16 += v * b6; 1128 t17 += v * b7; 1129 t18 += v * b8; 1130 t19 += v * b9; 1131 t20 += v * b10; 1132 t21 += v * b11; 1133 t22 += v * b12; 1134 t23 += v * b13; 1135 t24 += v * b14; 1136 t25 += v * b15; 1137 v = a[11]; 1138 t11 += v * b0; 1139 t12 += v * b1; 1140 t13 += v * b2; 1141 t14 += v * b3; 1142 t15 += v * b4; 1143 t16 += v * b5; 1144 t17 += v * b6; 1145 t18 += v * b7; 1146 t19 += v * b8; 1147 t20 += v * b9; 1148 t21 += v * b10; 1149 t22 += v * b11; 1150 t23 += v * b12; 1151 t24 += v * b13; 1152 t25 += v * b14; 1153 t26 += v * b15; 1154 v = a[12]; 1155 t12 += v * b0; 1156 t13 += v * b1; 1157 t14 += v * b2; 1158 t15 += v * b3; 1159 t16 += v * b4; 1160 t17 += v * b5; 1161 t18 += v * b6; 1162 t19 += v * b7; 1163 t20 += v * b8; 1164 t21 += v * b9; 1165 t22 += v * b10; 1166 t23 += v * b11; 1167 t24 += v * b12; 1168 t25 += v * b13; 1169 t26 += v * b14; 1170 t27 += v * b15; 1171 v = a[13]; 1172 t13 += v * b0; 1173 t14 += v * b1; 1174 t15 += v * b2; 1175 t16 += v * b3; 1176 t17 += v * b4; 1177 t18 += v * b5; 1178 t19 += v * b6; 1179 t20 += v * b7; 1180 t21 += v * b8; 1181 t22 += v * b9; 1182 t23 += v * b10; 1183 t24 += v * b11; 1184 t25 += v * b12; 1185 t26 += v * b13; 1186 t27 += v * b14; 1187 t28 += v * b15; 1188 v = a[14]; 1189 t14 += v * b0; 1190 t15 += v * b1; 1191 t16 += v * b2; 1192 t17 += v * b3; 1193 t18 += v * b4; 1194 t19 += v * b5; 1195 t20 += v * b6; 1196 t21 += v * b7; 1197 t22 += v * b8; 1198 t23 += v * b9; 1199 t24 += v * b10; 1200 t25 += v * b11; 1201 t26 += v * b12; 1202 t27 += v * b13; 1203 t28 += v * b14; 1204 t29 += v * b15; 1205 v = a[15]; 1206 t15 += v * b0; 1207 t16 += v * b1; 1208 t17 += v * b2; 1209 t18 += v * b3; 1210 t19 += v * b4; 1211 t20 += v * b5; 1212 t21 += v * b6; 1213 t22 += v * b7; 1214 t23 += v * b8; 1215 t24 += v * b9; 1216 t25 += v * b10; 1217 t26 += v * b11; 1218 t27 += v * b12; 1219 t28 += v * b13; 1220 t29 += v * b14; 1221 t30 += v * b15; 1222 1223 t0 += 38 * t16; 1224 t1 += 38 * t17; 1225 t2 += 38 * t18; 1226 t3 += 38 * t19; 1227 t4 += 38 * t20; 1228 t5 += 38 * t21; 1229 t6 += 38 * t22; 1230 t7 += 38 * t23; 1231 t8 += 38 * t24; 1232 t9 += 38 * t25; 1233 t10 += 38 * t26; 1234 t11 += 38 * t27; 1235 t12 += 38 * t28; 1236 t13 += 38 * t29; 1237 t14 += 38 * t30; 1238 // t15 left as is 1239 1240 // first car 1241 c = 1; 1242 v = t0 + c + 65535; c = Math.floor(v / 65536); t0 = v - c * 65536; 1243 v = t1 + c + 65535; c = Math.floor(v / 65536); t1 = v - c * 65536; 1244 v = t2 + c + 65535; c = Math.floor(v / 65536); t2 = v - c * 65536; 1245 v = t3 + c + 65535; c = Math.floor(v / 65536); t3 = v - c * 65536; 1246 v = t4 + c + 65535; c = Math.floor(v / 65536); t4 = v - c * 65536; 1247 v = t5 + c + 65535; c = Math.floor(v / 65536); t5 = v - c * 65536; 1248 v = t6 + c + 65535; c = Math.floor(v / 65536); t6 = v - c * 65536; 1249 v = t7 + c + 65535; c = Math.floor(v / 65536); t7 = v - c * 65536; 1250 v = t8 + c + 65535; c = Math.floor(v / 65536); t8 = v - c * 65536; 1251 v = t9 + c + 65535; c = Math.floor(v / 65536); t9 = v - c * 65536; 1252 v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536; 1253 v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536; 1254 v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536; 1255 v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536; 1256 v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536; 1257 v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536; 1258 t0 += c-1 + 37 * (c-1); 1259 1260 // second car 1261 c = 1; 1262 v = t0 + c + 65535; c = Math.floor(v / 65536); t0 = v - c * 65536; 1263 v = t1 + c + 65535; c = Math.floor(v / 65536); t1 = v - c * 65536; 1264 v = t2 + c + 65535; c = Math.floor(v / 65536); t2 = v - c * 65536; 1265 v = t3 + c + 65535; c = Math.floor(v / 65536); t3 = v - c * 65536; 1266 v = t4 + c + 65535; c = Math.floor(v / 65536); t4 = v - c * 65536; 1267 v = t5 + c + 65535; c = Math.floor(v / 65536); t5 = v - c * 65536; 1268 v = t6 + c + 65535; c = Math.floor(v / 65536); t6 = v - c * 65536; 1269 v = t7 + c + 65535; c = Math.floor(v / 65536); t7 = v - c * 65536; 1270 v = t8 + c + 65535; c = Math.floor(v / 65536); t8 = v - c * 65536; 1271 v = t9 + c + 65535; c = Math.floor(v / 65536); t9 = v - c * 65536; 1272 v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536; 1273 v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536; 1274 v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536; 1275 v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536; 1276 v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536; 1277 v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536; 1278 t0 += c-1 + 37 * (c-1); 1279 1280 o[ 0] = t0; 1281 o[ 1] = t1; 1282 o[ 2] = t2; 1283 o[ 3] = t3; 1284 o[ 4] = t4; 1285 o[ 5] = t5; 1286 o[ 6] = t6; 1287 o[ 7] = t7; 1288 o[ 8] = t8; 1289 o[ 9] = t9; 1290 o[10] = t10; 1291 o[11] = t11; 1292 o[12] = t12; 1293 o[13] = t13; 1294 o[14] = t14; 1295 o[15] = t15; 1296 } 1297 1298 function S(o, a) { 1299 M(o, a, a); 1300 } 1301 1302 function inv25519(o, i) { 1303 var c = gf(); 1304 var a; 1305 for (a = 0; a < 16; a++) c[a] = i[a]; 1306 for (a = 253; a >= 0; a--) { 1307 S(c, c); 1308 if(a !== 2 && a !== 4) M(c, c, i); 1309 } 1310 for (a = 0; a < 16; a++) o[a] = c[a]; 1311 } 1312 1313 function pow2523(o, i) { 1314 var c = gf(); 1315 var a; 1316 for (a = 0; a < 16; a++) c[a] = i[a]; 1317 for (a = 250; a >= 0; a--) { 1318 S(c, c); 1319 if(a !== 1) M(c, c, i); 1320 } 1321 for (a = 0; a < 16; a++) o[a] = c[a]; 1322 } 1323 1324 function crypto_scalarmult(q, n, p) { 1325 var z = new Uint8Array(32); 1326 var x = new Float64Array(80), r, i; 1327 var a = gf(), b = gf(), c = gf(), 1328 d = gf(), e = gf(), f = gf(); 1329 for (i = 0; i < 31; i++) z[i] = n[i]; 1330 z[31]=(n[31]&127)|64; 1331 z[0]&=248; 1332 unpack25519(x,p); 1333 for (i = 0; i < 16; i++) { 1334 b[i]=x[i]; 1335 d[i]=a[i]=c[i]=0; 1336 } 1337 a[0]=d[0]=1; 1338 for (i=254; i>=0; --i) { 1339 r=(z[i>>>3]>>>(i&7))&1; 1340 sel25519(a,b,r); 1341 sel25519(c,d,r); 1342 A(e,a,c); 1343 Z(a,a,c); 1344 A(c,b,d); 1345 Z(b,b,d); 1346 S(d,e); 1347 S(f,a); 1348 M(a,c,a); 1349 M(c,b,e); 1350 A(e,a,c); 1351 Z(a,a,c); 1352 S(b,a); 1353 Z(c,d,f); 1354 M(a,c,_121665); 1355 A(a,a,d); 1356 M(c,c,a); 1357 M(a,d,f); 1358 M(d,b,x); 1359 S(b,e); 1360 sel25519(a,b,r); 1361 sel25519(c,d,r); 1362 } 1363 for (i = 0; i < 16; i++) { 1364 x[i+16]=a[i]; 1365 x[i+32]=c[i]; 1366 x[i+48]=b[i]; 1367 x[i+64]=d[i]; 1368 } 1369 var x32 = x.subarray(32); 1370 var x16 = x.subarray(16); 1371 inv25519(x32,x32); 1372 M(x16,x16,x32); 1373 pack25519(q,x16); 1374 return 0; 1375 } 1376 1377 function crypto_scalarmult_base(q, n) { 1378 return crypto_scalarmult(q, n, _9); 1379 } 1380 1381 function crypto_box_keypair(y, x) { 1382 randombytes(x, 32); 1383 return crypto_scalarmult_base(y, x); 1384 } 1385 1386 function crypto_box_beforenm(k, y, x) { 1387 var s = new Uint8Array(32); 1388 crypto_scalarmult(s, x, y); 1389 return crypto_core_hsalsa20(k, _0, s, sigma); 1390 } 1391 1392 var crypto_box_afternm = crypto_secretbox; 1393 var crypto_box_open_afternm = crypto_secretbox_open; 1394 1395 function crypto_box(c, m, d, n, y, x) { 1396 var k = new Uint8Array(32); 1397 crypto_box_beforenm(k, y, x); 1398 return crypto_box_afternm(c, m, d, n, k); 1399 } 1400 1401 function crypto_box_open(m, c, d, n, y, x) { 1402 var k = new Uint8Array(32); 1403 crypto_box_beforenm(k, y, x); 1404 return crypto_box_open_afternm(m, c, d, n, k); 1405 } 1406 1407 var K = [ 1408 0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd, 1409 0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc, 1410 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019, 1411 0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118, 1412 0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe, 1413 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2, 1414 0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1, 1415 0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694, 1416 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3, 1417 0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65, 1418 0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483, 1419 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5, 1420 0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210, 1421 0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4, 1422 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725, 1423 0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70, 1424 0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926, 1425 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df, 1426 0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8, 1427 0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b, 1428 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001, 1429 0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30, 1430 0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910, 1431 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8, 1432 0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53, 1433 0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8, 1434 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb, 1435 0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3, 1436 0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60, 1437 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec, 1438 0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9, 1439 0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b, 1440 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207, 1441 0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178, 1442 0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6, 1443 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b, 1444 0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493, 1445 0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c, 1446 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a, 1447 0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817 1448 ]; 1449 1450 function crypto_hashblocks_hl(hh, hl, m, n) { 1451 var wh = new Int32Array(16), wl = new Int32Array(16), 1452 bh0, bh1, bh2, bh3, bh4, bh5, bh6, bh7, 1453 bl0, bl1, bl2, bl3, bl4, bl5, bl6, bl7, 1454 th, tl, i, j, h, l, a, b, c, d; 1455 1456 var ah0 = hh[0], 1457 ah1 = hh[1], 1458 ah2 = hh[2], 1459 ah3 = hh[3], 1460 ah4 = hh[4], 1461 ah5 = hh[5], 1462 ah6 = hh[6], 1463 ah7 = hh[7], 1464 1465 al0 = hl[0], 1466 al1 = hl[1], 1467 al2 = hl[2], 1468 al3 = hl[3], 1469 al4 = hl[4], 1470 al5 = hl[5], 1471 al6 = hl[6], 1472 al7 = hl[7]; 1473 1474 var pos = 0; 1475 while (n >= 128) { 1476 for (i = 0; i < 16; i++) { 1477 j = 8 * i + pos; 1478 wh[i] = (m[j+0] << 24) | (m[j+1] << 16) | (m[j+2] << 8) | m[j+3]; 1479 wl[i] = (m[j+4] << 24) | (m[j+5] << 16) | (m[j+6] << 8) | m[j+7]; 1480 } 1481 for (i = 0; i < 80; i++) { 1482 bh0 = ah0; 1483 bh1 = ah1; 1484 bh2 = ah2; 1485 bh3 = ah3; 1486 bh4 = ah4; 1487 bh5 = ah5; 1488 bh6 = ah6; 1489 bh7 = ah7; 1490 1491 bl0 = al0; 1492 bl1 = al1; 1493 bl2 = al2; 1494 bl3 = al3; 1495 bl4 = al4; 1496 bl5 = al5; 1497 bl6 = al6; 1498 bl7 = al7; 1499 1500 // add 1501 h = ah7; 1502 l = al7; 1503 1504 a = l & 0xffff; b = l >>> 16; 1505 c = h & 0xffff; d = h >>> 16; 1506 1507 // Sigma1 1508 h = ((ah4 >>> 14) | (al4 << (32-14))) ^ ((ah4 >>> 18) | (al4 << (32-18))) ^ ((al4 >>> (41-32)) | (ah4 << (32-(41-32)))); 1509 l = ((al4 >>> 14) | (ah4 << (32-14))) ^ ((al4 >>> 18) | (ah4 << (32-18))) ^ ((ah4 >>> (41-32)) | (al4 << (32-(41-32)))); 1510 1511 a += l & 0xffff; b += l >>> 16; 1512 c += h & 0xffff; d += h >>> 16; 1513 1514 // Ch 1515 h = (ah4 & ah5) ^ (~ah4 & ah6); 1516 l = (al4 & al5) ^ (~al4 & al6); 1517 1518 a += l & 0xffff; b += l >>> 16; 1519 c += h & 0xffff; d += h >>> 16; 1520 1521 // K 1522 h = K[i*2]; 1523 l = K[i*2+1]; 1524 1525 a += l & 0xffff; b += l >>> 16; 1526 c += h & 0xffff; d += h >>> 16; 1527 1528 // w 1529 h = wh[i%16]; 1530 l = wl[i%16]; 1531 1532 a += l & 0xffff; b += l >>> 16; 1533 c += h & 0xffff; d += h >>> 16; 1534 1535 b += a >>> 16; 1536 c += b >>> 16; 1537 d += c >>> 16; 1538 1539 th = c & 0xffff | d << 16; 1540 tl = a & 0xffff | b << 16; 1541 1542 // add 1543 h = th; 1544 l = tl; 1545 1546 a = l & 0xffff; b = l >>> 16; 1547 c = h & 0xffff; d = h >>> 16; 1548 1549 // Sigma0 1550 h = ((ah0 >>> 28) | (al0 << (32-28))) ^ ((al0 >>> (34-32)) | (ah0 << (32-(34-32)))) ^ ((al0 >>> (39-32)) | (ah0 << (32-(39-32)))); 1551 l = ((al0 >>> 28) | (ah0 << (32-28))) ^ ((ah0 >>> (34-32)) | (al0 << (32-(34-32)))) ^ ((ah0 >>> (39-32)) | (al0 << (32-(39-32)))); 1552 1553 a += l & 0xffff; b += l >>> 16; 1554 c += h & 0xffff; d += h >>> 16; 1555 1556 // Maj 1557 h = (ah0 & ah1) ^ (ah0 & ah2) ^ (ah1 & ah2); 1558 l = (al0 & al1) ^ (al0 & al2) ^ (al1 & al2); 1559 1560 a += l & 0xffff; b += l >>> 16; 1561 c += h & 0xffff; d += h >>> 16; 1562 1563 b += a >>> 16; 1564 c += b >>> 16; 1565 d += c >>> 16; 1566 1567 bh7 = (c & 0xffff) | (d << 16); 1568 bl7 = (a & 0xffff) | (b << 16); 1569 1570 // add 1571 h = bh3; 1572 l = bl3; 1573 1574 a = l & 0xffff; b = l >>> 16; 1575 c = h & 0xffff; d = h >>> 16; 1576 1577 h = th; 1578 l = tl; 1579 1580 a += l & 0xffff; b += l >>> 16; 1581 c += h & 0xffff; d += h >>> 16; 1582 1583 b += a >>> 16; 1584 c += b >>> 16; 1585 d += c >>> 16; 1586 1587 bh3 = (c & 0xffff) | (d << 16); 1588 bl3 = (a & 0xffff) | (b << 16); 1589 1590 ah1 = bh0; 1591 ah2 = bh1; 1592 ah3 = bh2; 1593 ah4 = bh3; 1594 ah5 = bh4; 1595 ah6 = bh5; 1596 ah7 = bh6; 1597 ah0 = bh7; 1598 1599 al1 = bl0; 1600 al2 = bl1; 1601 al3 = bl2; 1602 al4 = bl3; 1603 al5 = bl4; 1604 al6 = bl5; 1605 al7 = bl6; 1606 al0 = bl7; 1607 1608 if (i%16 === 15) { 1609 for (j = 0; j < 16; j++) { 1610 // add 1611 h = wh[j]; 1612 l = wl[j]; 1613 1614 a = l & 0xffff; b = l >>> 16; 1615 c = h & 0xffff; d = h >>> 16; 1616 1617 h = wh[(j+9)%16]; 1618 l = wl[(j+9)%16]; 1619 1620 a += l & 0xffff; b += l >>> 16; 1621 c += h & 0xffff; d += h >>> 16; 1622 1623 // sigma0 1624 th = wh[(j+1)%16]; 1625 tl = wl[(j+1)%16]; 1626 h = ((th >>> 1) | (tl << (32-1))) ^ ((th >>> 8) | (tl << (32-8))) ^ (th >>> 7); 1627 l = ((tl >>> 1) | (th << (32-1))) ^ ((tl >>> 8) | (th << (32-8))) ^ ((tl >>> 7) | (th << (32-7))); 1628 1629 a += l & 0xffff; b += l >>> 16; 1630 c += h & 0xffff; d += h >>> 16; 1631 1632 // sigma1 1633 th = wh[(j+14)%16]; 1634 tl = wl[(j+14)%16]; 1635 h = ((th >>> 19) | (tl << (32-19))) ^ ((tl >>> (61-32)) | (th << (32-(61-32)))) ^ (th >>> 6); 1636 l = ((tl >>> 19) | (th << (32-19))) ^ ((th >>> (61-32)) | (tl << (32-(61-32)))) ^ ((tl >>> 6) | (th << (32-6))); 1637 1638 a += l & 0xffff; b += l >>> 16; 1639 c += h & 0xffff; d += h >>> 16; 1640 1641 b += a >>> 16; 1642 c += b >>> 16; 1643 d += c >>> 16; 1644 1645 wh[j] = (c & 0xffff) | (d << 16); 1646 wl[j] = (a & 0xffff) | (b << 16); 1647 } 1648 } 1649 } 1650 1651 // add 1652 h = ah0; 1653 l = al0; 1654 1655 a = l & 0xffff; b = l >>> 16; 1656 c = h & 0xffff; d = h >>> 16; 1657 1658 h = hh[0]; 1659 l = hl[0]; 1660 1661 a += l & 0xffff; b += l >>> 16; 1662 c += h & 0xffff; d += h >>> 16; 1663 1664 b += a >>> 16; 1665 c += b >>> 16; 1666 d += c >>> 16; 1667 1668 hh[0] = ah0 = (c & 0xffff) | (d << 16); 1669 hl[0] = al0 = (a & 0xffff) | (b << 16); 1670 1671 h = ah1; 1672 l = al1; 1673 1674 a = l & 0xffff; b = l >>> 16; 1675 c = h & 0xffff; d = h >>> 16; 1676 1677 h = hh[1]; 1678 l = hl[1]; 1679 1680 a += l & 0xffff; b += l >>> 16; 1681 c += h & 0xffff; d += h >>> 16; 1682 1683 b += a >>> 16; 1684 c += b >>> 16; 1685 d += c >>> 16; 1686 1687 hh[1] = ah1 = (c & 0xffff) | (d << 16); 1688 hl[1] = al1 = (a & 0xffff) | (b << 16); 1689 1690 h = ah2; 1691 l = al2; 1692 1693 a = l & 0xffff; b = l >>> 16; 1694 c = h & 0xffff; d = h >>> 16; 1695 1696 h = hh[2]; 1697 l = hl[2]; 1698 1699 a += l & 0xffff; b += l >>> 16; 1700 c += h & 0xffff; d += h >>> 16; 1701 1702 b += a >>> 16; 1703 c += b >>> 16; 1704 d += c >>> 16; 1705 1706 hh[2] = ah2 = (c & 0xffff) | (d << 16); 1707 hl[2] = al2 = (a & 0xffff) | (b << 16); 1708 1709 h = ah3; 1710 l = al3; 1711 1712 a = l & 0xffff; b = l >>> 16; 1713 c = h & 0xffff; d = h >>> 16; 1714 1715 h = hh[3]; 1716 l = hl[3]; 1717 1718 a += l & 0xffff; b += l >>> 16; 1719 c += h & 0xffff; d += h >>> 16; 1720 1721 b += a >>> 16; 1722 c += b >>> 16; 1723 d += c >>> 16; 1724 1725 hh[3] = ah3 = (c & 0xffff) | (d << 16); 1726 hl[3] = al3 = (a & 0xffff) | (b << 16); 1727 1728 h = ah4; 1729 l = al4; 1730 1731 a = l & 0xffff; b = l >>> 16; 1732 c = h & 0xffff; d = h >>> 16; 1733 1734 h = hh[4]; 1735 l = hl[4]; 1736 1737 a += l & 0xffff; b += l >>> 16; 1738 c += h & 0xffff; d += h >>> 16; 1739 1740 b += a >>> 16; 1741 c += b >>> 16; 1742 d += c >>> 16; 1743 1744 hh[4] = ah4 = (c & 0xffff) | (d << 16); 1745 hl[4] = al4 = (a & 0xffff) | (b << 16); 1746 1747 h = ah5; 1748 l = al5; 1749 1750 a = l & 0xffff; b = l >>> 16; 1751 c = h & 0xffff; d = h >>> 16; 1752 1753 h = hh[5]; 1754 l = hl[5]; 1755 1756 a += l & 0xffff; b += l >>> 16; 1757 c += h & 0xffff; d += h >>> 16; 1758 1759 b += a >>> 16; 1760 c += b >>> 16; 1761 d += c >>> 16; 1762 1763 hh[5] = ah5 = (c & 0xffff) | (d << 16); 1764 hl[5] = al5 = (a & 0xffff) | (b << 16); 1765 1766 h = ah6; 1767 l = al6; 1768 1769 a = l & 0xffff; b = l >>> 16; 1770 c = h & 0xffff; d = h >>> 16; 1771 1772 h = hh[6]; 1773 l = hl[6]; 1774 1775 a += l & 0xffff; b += l >>> 16; 1776 c += h & 0xffff; d += h >>> 16; 1777 1778 b += a >>> 16; 1779 c += b >>> 16; 1780 d += c >>> 16; 1781 1782 hh[6] = ah6 = (c & 0xffff) | (d << 16); 1783 hl[6] = al6 = (a & 0xffff) | (b << 16); 1784 1785 h = ah7; 1786 l = al7; 1787 1788 a = l & 0xffff; b = l >>> 16; 1789 c = h & 0xffff; d = h >>> 16; 1790 1791 h = hh[7]; 1792 l = hl[7]; 1793 1794 a += l & 0xffff; b += l >>> 16; 1795 c += h & 0xffff; d += h >>> 16; 1796 1797 b += a >>> 16; 1798 c += b >>> 16; 1799 d += c >>> 16; 1800 1801 hh[7] = ah7 = (c & 0xffff) | (d << 16); 1802 hl[7] = al7 = (a & 0xffff) | (b << 16); 1803 1804 pos += 128; 1805 n -= 128; 1806 } 1807 1808 return n; 1809 } 1810 1811 function crypto_hash(out, m, n) { 1812 var hh = new Int32Array(8), 1813 hl = new Int32Array(8), 1814 x = new Uint8Array(256), 1815 i, b = n; 1816 1817 hh[0] = 0x6a09e667; 1818 hh[1] = 0xbb67ae85; 1819 hh[2] = 0x3c6ef372; 1820 hh[3] = 0xa54ff53a; 1821 hh[4] = 0x510e527f; 1822 hh[5] = 0x9b05688c; 1823 hh[6] = 0x1f83d9ab; 1824 hh[7] = 0x5be0cd19; 1825 1826 hl[0] = 0xf3bcc908; 1827 hl[1] = 0x84caa73b; 1828 hl[2] = 0xfe94f82b; 1829 hl[3] = 0x5f1d36f1; 1830 hl[4] = 0xade682d1; 1831 hl[5] = 0x2b3e6c1f; 1832 hl[6] = 0xfb41bd6b; 1833 hl[7] = 0x137e2179; 1834 1835 crypto_hashblocks_hl(hh, hl, m, n); 1836 n %= 128; 1837 1838 for (i = 0; i < n; i++) x[i] = m[b-n+i]; 1839 x[n] = 128; 1840 1841 n = 256-128*(n<112?1:0); 1842 x[n-9] = 0; 1843 ts64(x, n-8, (b / 0x20000000) | 0, b << 3); 1844 crypto_hashblocks_hl(hh, hl, x, n); 1845 1846 for (i = 0; i < 8; i++) ts64(out, 8*i, hh[i], hl[i]); 1847 1848 return 0; 1849 } 1850 1851 function add(p, q) { 1852 var a = gf(), b = gf(), c = gf(), 1853 d = gf(), e = gf(), f = gf(), 1854 g = gf(), h = gf(), t = gf(); 1855 1856 Z(a, p[1], p[0]); 1857 Z(t, q[1], q[0]); 1858 M(a, a, t); 1859 A(b, p[0], p[1]); 1860 A(t, q[0], q[1]); 1861 M(b, b, t); 1862 M(c, p[3], q[3]); 1863 M(c, c, D2); 1864 M(d, p[2], q[2]); 1865 A(d, d, d); 1866 Z(e, b, a); 1867 Z(f, d, c); 1868 A(g, d, c); 1869 A(h, b, a); 1870 1871 M(p[0], e, f); 1872 M(p[1], h, g); 1873 M(p[2], g, f); 1874 M(p[3], e, h); 1875 } 1876 1877 function cswap(p, q, b) { 1878 var i; 1879 for (i = 0; i < 4; i++) { 1880 sel25519(p[i], q[i], b); 1881 } 1882 } 1883 1884 function pack(r, p) { 1885 var tx = gf(), ty = gf(), zi = gf(); 1886 inv25519(zi, p[2]); 1887 M(tx, p[0], zi); 1888 M(ty, p[1], zi); 1889 pack25519(r, ty); 1890 r[31] ^= par25519(tx) << 7; 1891 } 1892 1893 function scalarmult(p, q, s) { 1894 var b, i; 1895 set25519(p[0], gf0); 1896 set25519(p[1], gf1); 1897 set25519(p[2], gf1); 1898 set25519(p[3], gf0); 1899 for (i = 255; i >= 0; --i) { 1900 b = (s[(i/8)|0] >> (i&7)) & 1; 1901 cswap(p, q, b); 1902 add(q, p); 1903 add(p, p); 1904 cswap(p, q, b); 1905 } 1906 } 1907 1908 function scalarbase(p, s) { 1909 var q = [gf(), gf(), gf(), gf()]; 1910 set25519(q[0], X); 1911 set25519(q[1], Y); 1912 set25519(q[2], gf1); 1913 M(q[3], X, Y); 1914 scalarmult(p, q, s); 1915 } 1916 1917 function crypto_sign_keypair(pk, sk, seeded) { 1918 var d = new Uint8Array(64); 1919 var p = [gf(), gf(), gf(), gf()]; 1920 var i; 1921 1922 if (!seeded) randombytes(sk, 32); 1923 crypto_hash(d, sk, 32); 1924 d[0] &= 248; 1925 d[31] &= 127; 1926 d[31] |= 64; 1927 1928 scalarbase(p, d); 1929 pack(pk, p); 1930 1931 for (i = 0; i < 32; i++) sk[i+32] = pk[i]; 1932 return 0; 1933 } 1934 1935 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]); 1936 1937 function modL(r, x) { 1938 var carry, i, j, k; 1939 for (i = 63; i >= 32; --i) { 1940 carry = 0; 1941 for (j = i - 32, k = i - 12; j < k; ++j) { 1942 x[j] += carry - 16 * x[i] * L[j - (i - 32)]; 1943 carry = Math.floor((x[j] + 128) / 256); 1944 x[j] -= carry * 256; 1945 } 1946 x[j] += carry; 1947 x[i] = 0; 1948 } 1949 carry = 0; 1950 for (j = 0; j < 32; j++) { 1951 x[j] += carry - (x[31] >> 4) * L[j]; 1952 carry = x[j] >> 8; 1953 x[j] &= 255; 1954 } 1955 for (j = 0; j < 32; j++) x[j] -= carry * L[j]; 1956 for (i = 0; i < 32; i++) { 1957 x[i+1] += x[i] >> 8; 1958 r[i] = x[i] & 255; 1959 } 1960 } 1961 1962 function reduce(r) { 1963 var x = new Float64Array(64), i; 1964 for (i = 0; i < 64; i++) x[i] = r[i]; 1965 for (i = 0; i < 64; i++) r[i] = 0; 1966 modL(r, x); 1967 } 1968 1969 // Note: difference from C - smlen returned, not passed as argument. 1970 function crypto_sign(sm, m, n, sk) { 1971 var d = new Uint8Array(64), h = new Uint8Array(64), r = new Uint8Array(64); 1972 var i, j, x = new Float64Array(64); 1973 var p = [gf(), gf(), gf(), gf()]; 1974 1975 crypto_hash(d, sk, 32); 1976 d[0] &= 248; 1977 d[31] &= 127; 1978 d[31] |= 64; 1979 1980 var smlen = n + 64; 1981 for (i = 0; i < n; i++) sm[64 + i] = m[i]; 1982 for (i = 0; i < 32; i++) sm[32 + i] = d[32 + i]; 1983 1984 crypto_hash(r, sm.subarray(32), n+32); 1985 reduce(r); 1986 scalarbase(p, r); 1987 pack(sm, p); 1988 1989 for (i = 32; i < 64; i++) sm[i] = sk[i]; 1990 crypto_hash(h, sm, n + 64); 1991 reduce(h); 1992 1993 for (i = 0; i < 64; i++) x[i] = 0; 1994 for (i = 0; i < 32; i++) x[i] = r[i]; 1995 for (i = 0; i < 32; i++) { 1996 for (j = 0; j < 32; j++) { 1997 x[i+j] += h[i] * d[j]; 1998 } 1999 } 2000 2001 modL(sm.subarray(32), x); 2002 return smlen; 2003 } 2004 2005 function unpackneg(r, p) { 2006 var t = gf(), chk = gf(), num = gf(), 2007 den = gf(), den2 = gf(), den4 = gf(), 2008 den6 = gf(); 2009 2010 set25519(r[2], gf1); 2011 unpack25519(r[1], p); 2012 S(num, r[1]); 2013 M(den, num, D); 2014 Z(num, num, r[2]); 2015 A(den, r[2], den); 2016 2017 S(den2, den); 2018 S(den4, den2); 2019 M(den6, den4, den2); 2020 M(t, den6, num); 2021 M(t, t, den); 2022 2023 pow2523(t, t); 2024 M(t, t, num); 2025 M(t, t, den); 2026 M(t, t, den); 2027 M(r[0], t, den); 2028 2029 S(chk, r[0]); 2030 M(chk, chk, den); 2031 if (neq25519(chk, num)) M(r[0], r[0], I); 2032 2033 S(chk, r[0]); 2034 M(chk, chk, den); 2035 if (neq25519(chk, num)) return -1; 2036 2037 if (par25519(r[0]) === (p[31]>>7)) Z(r[0], gf0, r[0]); 2038 2039 M(r[3], r[0], r[1]); 2040 return 0; 2041 } 2042 2043 function crypto_sign_open(m, sm, n, pk) { 2044 var i; 2045 var t = new Uint8Array(32), h = new Uint8Array(64); 2046 var p = [gf(), gf(), gf(), gf()], 2047 q = [gf(), gf(), gf(), gf()]; 2048 2049 if (n < 64) return -1; 2050 2051 if (unpackneg(q, pk)) return -1; 2052 2053 for (i = 0; i < n; i++) m[i] = sm[i]; 2054 for (i = 0; i < 32; i++) m[i+32] = pk[i]; 2055 crypto_hash(h, m, n); 2056 reduce(h); 2057 scalarmult(p, q, h); 2058 2059 scalarbase(q, sm.subarray(32)); 2060 add(p, q); 2061 pack(t, p); 2062 2063 n -= 64; 2064 if (crypto_verify_32(sm, 0, t, 0)) { 2065 for (i = 0; i < n; i++) m[i] = 0; 2066 return -1; 2067 } 2068 2069 for (i = 0; i < n; i++) m[i] = sm[i + 64]; 2070 return n; 2071 } 2072 2073 var crypto_secretbox_KEYBYTES = 32, 2074 crypto_secretbox_NONCEBYTES = 24, 2075 crypto_secretbox_ZEROBYTES = 32, 2076 crypto_secretbox_BOXZEROBYTES = 16, 2077 crypto_scalarmult_BYTES = 32, 2078 crypto_scalarmult_SCALARBYTES = 32, 2079 crypto_box_PUBLICKEYBYTES = 32, 2080 crypto_box_SECRETKEYBYTES = 32, 2081 crypto_box_BEFORENMBYTES = 32, 2082 crypto_box_NONCEBYTES = crypto_secretbox_NONCEBYTES, 2083 crypto_box_ZEROBYTES = crypto_secretbox_ZEROBYTES, 2084 crypto_box_BOXZEROBYTES = crypto_secretbox_BOXZEROBYTES, 2085 crypto_sign_BYTES = 64, 2086 crypto_sign_PUBLICKEYBYTES = 32, 2087 crypto_sign_SECRETKEYBYTES = 64, 2088 crypto_sign_SEEDBYTES = 32, 2089 crypto_hash_BYTES = 64; 2090 2091 nacl.lowlevel = { 2092 crypto_core_hsalsa20: crypto_core_hsalsa20, 2093 crypto_stream_xor: crypto_stream_xor, 2094 crypto_stream: crypto_stream, 2095 crypto_stream_salsa20_xor: crypto_stream_salsa20_xor, 2096 crypto_stream_salsa20: crypto_stream_salsa20, 2097 crypto_onetimeauth: crypto_onetimeauth, 2098 crypto_onetimeauth_verify: crypto_onetimeauth_verify, 2099 crypto_verify_16: crypto_verify_16, 2100 crypto_verify_32: crypto_verify_32, 2101 crypto_secretbox: crypto_secretbox, 2102 crypto_secretbox_open: crypto_secretbox_open, 2103 crypto_scalarmult: crypto_scalarmult, 2104 crypto_scalarmult_base: crypto_scalarmult_base, 2105 crypto_box_beforenm: crypto_box_beforenm, 2106 crypto_box_afternm: crypto_box_afternm, 2107 crypto_box: crypto_box, 2108 crypto_box_open: crypto_box_open, 2109 crypto_box_keypair: crypto_box_keypair, 2110 crypto_hash: crypto_hash, 2111 crypto_sign: crypto_sign, 2112 crypto_sign_keypair: crypto_sign_keypair, 2113 crypto_sign_open: crypto_sign_open, 2114 2115 crypto_secretbox_KEYBYTES: crypto_secretbox_KEYBYTES, 2116 crypto_secretbox_NONCEBYTES: crypto_secretbox_NONCEBYTES, 2117 crypto_secretbox_ZEROBYTES: crypto_secretbox_ZEROBYTES, 2118 crypto_secretbox_BOXZEROBYTES: crypto_secretbox_BOXZEROBYTES, 2119 crypto_scalarmult_BYTES: crypto_scalarmult_BYTES, 2120 crypto_scalarmult_SCALARBYTES: crypto_scalarmult_SCALARBYTES, 2121 crypto_box_PUBLICKEYBYTES: crypto_box_PUBLICKEYBYTES, 2122 crypto_box_SECRETKEYBYTES: crypto_box_SECRETKEYBYTES, 2123 crypto_box_BEFORENMBYTES: crypto_box_BEFORENMBYTES, 2124 crypto_box_NONCEBYTES: crypto_box_NONCEBYTES, 2125 crypto_box_ZEROBYTES: crypto_box_ZEROBYTES, 2126 crypto_box_BOXZEROBYTES: crypto_box_BOXZEROBYTES, 2127 crypto_sign_BYTES: crypto_sign_BYTES, 2128 crypto_sign_PUBLICKEYBYTES: crypto_sign_PUBLICKEYBYTES, 2129 crypto_sign_SECRETKEYBYTES: crypto_sign_SECRETKEYBYTES, 2130 crypto_sign_SEEDBYTES: crypto_sign_SEEDBYTES, 2131 crypto_hash_BYTES: crypto_hash_BYTES, 2132 2133 gf: gf, 2134 D: D, 2135 L: L, 2136 pack25519: pack25519, 2137 unpack25519: unpack25519, 2138 M: M, 2139 A: A, 2140 S: S, 2141 Z: Z, 2142 pow2523: pow2523, 2143 add: add, 2144 set25519: set25519, 2145 modL: modL, 2146 scalarmult: scalarmult, 2147 scalarbase: scalarbase, 2148 }; 2149 2150 /* High-level API */ 2151 2152 function checkLengths(k, n) { 2153 if (k.length !== crypto_secretbox_KEYBYTES) throw new Error('bad key size'); 2154 if (n.length !== crypto_secretbox_NONCEBYTES) throw new Error('bad nonce size'); 2155 } 2156 2157 function checkBoxLengths(pk, sk) { 2158 if (pk.length !== crypto_box_PUBLICKEYBYTES) throw new Error('bad public key size'); 2159 if (sk.length !== crypto_box_SECRETKEYBYTES) throw new Error('bad secret key size'); 2160 } 2161 2162 function checkArrayTypes() { 2163 for (var i = 0; i < arguments.length; i++) { 2164 if (!(arguments[i] instanceof Uint8Array)) 2165 throw new TypeError('unexpected type, use Uint8Array'); 2166 } 2167 } 2168 2169 function cleanup(arr) { 2170 for (var i = 0; i < arr.length; i++) arr[i] = 0; 2171 } 2172 2173 nacl.randomBytes = function(n) { 2174 var b = new Uint8Array(n); 2175 randombytes(b, n); 2176 return b; 2177 }; 2178 2179 nacl.secretbox = function(msg, nonce, key) { 2180 checkArrayTypes(msg, nonce, key); 2181 checkLengths(key, nonce); 2182 var m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length); 2183 var c = new Uint8Array(m.length); 2184 for (var i = 0; i < msg.length; i++) m[i+crypto_secretbox_ZEROBYTES] = msg[i]; 2185 crypto_secretbox(c, m, m.length, nonce, key); 2186 return c.subarray(crypto_secretbox_BOXZEROBYTES); 2187 }; 2188 2189 nacl.secretbox.open = function(box, nonce, key) { 2190 checkArrayTypes(box, nonce, key); 2191 checkLengths(key, nonce); 2192 var c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length); 2193 var m = new Uint8Array(c.length); 2194 for (var i = 0; i < box.length; i++) c[i+crypto_secretbox_BOXZEROBYTES] = box[i]; 2195 if (c.length < 32) return null; 2196 if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0) return null; 2197 return m.subarray(crypto_secretbox_ZEROBYTES); 2198 }; 2199 2200 nacl.secretbox.keyLength = crypto_secretbox_KEYBYTES; 2201 nacl.secretbox.nonceLength = crypto_secretbox_NONCEBYTES; 2202 nacl.secretbox.overheadLength = crypto_secretbox_BOXZEROBYTES; 2203 2204 nacl.scalarMult = function(n, p) { 2205 checkArrayTypes(n, p); 2206 if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size'); 2207 if (p.length !== crypto_scalarmult_BYTES) throw new Error('bad p size'); 2208 var q = new Uint8Array(crypto_scalarmult_BYTES); 2209 crypto_scalarmult(q, n, p); 2210 return q; 2211 }; 2212 2213 nacl.scalarMult.base = function(n) { 2214 checkArrayTypes(n); 2215 if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size'); 2216 var q = new Uint8Array(crypto_scalarmult_BYTES); 2217 crypto_scalarmult_base(q, n); 2218 return q; 2219 }; 2220 2221 nacl.scalarMult.scalarLength = crypto_scalarmult_SCALARBYTES; 2222 nacl.scalarMult.groupElementLength = crypto_scalarmult_BYTES; 2223 2224 nacl.box = function(msg, nonce, publicKey, secretKey) { 2225 var k = nacl.box.before(publicKey, secretKey); 2226 return nacl.secretbox(msg, nonce, k); 2227 }; 2228 2229 nacl.box.before = function(publicKey, secretKey) { 2230 checkArrayTypes(publicKey, secretKey); 2231 checkBoxLengths(publicKey, secretKey); 2232 var k = new Uint8Array(crypto_box_BEFORENMBYTES); 2233 crypto_box_beforenm(k, publicKey, secretKey); 2234 return k; 2235 }; 2236 2237 nacl.box.after = nacl.secretbox; 2238 2239 nacl.box.open = function(msg, nonce, publicKey, secretKey) { 2240 var k = nacl.box.before(publicKey, secretKey); 2241 return nacl.secretbox.open(msg, nonce, k); 2242 }; 2243 2244 nacl.box.open.after = nacl.secretbox.open; 2245 2246 nacl.box.keyPair = function() { 2247 var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); 2248 var sk = new Uint8Array(crypto_box_SECRETKEYBYTES); 2249 crypto_box_keypair(pk, sk); 2250 return {publicKey: pk, secretKey: sk}; 2251 }; 2252 2253 nacl.box.keyPair.fromSecretKey = function(secretKey) { 2254 checkArrayTypes(secretKey); 2255 if (secretKey.length !== crypto_box_SECRETKEYBYTES) 2256 throw new Error('bad secret key size'); 2257 var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES); 2258 crypto_scalarmult_base(pk, secretKey); 2259 return {publicKey: pk, secretKey: new Uint8Array(secretKey)}; 2260 }; 2261 2262 nacl.box.publicKeyLength = crypto_box_PUBLICKEYBYTES; 2263 nacl.box.secretKeyLength = crypto_box_SECRETKEYBYTES; 2264 nacl.box.sharedKeyLength = crypto_box_BEFORENMBYTES; 2265 nacl.box.nonceLength = crypto_box_NONCEBYTES; 2266 nacl.box.overheadLength = nacl.secretbox.overheadLength; 2267 2268 nacl.sign = function(msg, secretKey) { 2269 checkArrayTypes(msg, secretKey); 2270 if (secretKey.length !== crypto_sign_SECRETKEYBYTES) 2271 throw new Error('bad secret key size'); 2272 var signedMsg = new Uint8Array(crypto_sign_BYTES+msg.length); 2273 crypto_sign(signedMsg, msg, msg.length, secretKey); 2274 return signedMsg; 2275 }; 2276 2277 nacl.sign.open = function(signedMsg, publicKey) { 2278 checkArrayTypes(signedMsg, publicKey); 2279 if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) 2280 throw new Error('bad public key size'); 2281 var tmp = new Uint8Array(signedMsg.length); 2282 var mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey); 2283 if (mlen < 0) return null; 2284 var m = new Uint8Array(mlen); 2285 for (var i = 0; i < m.length; i++) m[i] = tmp[i]; 2286 return m; 2287 }; 2288 2289 nacl.sign.detached = function(msg, secretKey) { 2290 var signedMsg = nacl.sign(msg, secretKey); 2291 var sig = new Uint8Array(crypto_sign_BYTES); 2292 for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i]; 2293 return sig; 2294 }; 2295 2296 nacl.sign.detached.verify = function(msg, sig, publicKey) { 2297 checkArrayTypes(msg, sig, publicKey); 2298 if (sig.length !== crypto_sign_BYTES) 2299 throw new Error('bad signature size'); 2300 if (publicKey.length !== crypto_sign_PUBLICKEYBYTES) 2301 throw new Error('bad public key size'); 2302 var sm = new Uint8Array(crypto_sign_BYTES + msg.length); 2303 var m = new Uint8Array(crypto_sign_BYTES + msg.length); 2304 var i; 2305 for (i = 0; i < crypto_sign_BYTES; i++) sm[i] = sig[i]; 2306 for (i = 0; i < msg.length; i++) sm[i+crypto_sign_BYTES] = msg[i]; 2307 return (crypto_sign_open(m, sm, sm.length, publicKey) >= 0); 2308 }; 2309 2310 nacl.sign.keyPair = function() { 2311 var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); 2312 var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); 2313 crypto_sign_keypair(pk, sk); 2314 return {publicKey: pk, secretKey: sk}; 2315 }; 2316 2317 nacl.sign.keyPair.fromSecretKey = function(secretKey) { 2318 checkArrayTypes(secretKey); 2319 if (secretKey.length !== crypto_sign_SECRETKEYBYTES) 2320 throw new Error('bad secret key size'); 2321 var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); 2322 for (var i = 0; i < pk.length; i++) pk[i] = secretKey[32+i]; 2323 return {publicKey: pk, secretKey: new Uint8Array(secretKey)}; 2324 }; 2325 2326 nacl.sign.keyPair.fromSeed = function(seed) { 2327 checkArrayTypes(seed); 2328 if (seed.length !== crypto_sign_SEEDBYTES) 2329 throw new Error('bad seed size'); 2330 var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES); 2331 var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES); 2332 for (var i = 0; i < 32; i++) sk[i] = seed[i]; 2333 crypto_sign_keypair(pk, sk, true); 2334 return {publicKey: pk, secretKey: sk}; 2335 }; 2336 2337 nacl.sign.publicKeyLength = crypto_sign_PUBLICKEYBYTES; 2338 nacl.sign.secretKeyLength = crypto_sign_SECRETKEYBYTES; 2339 nacl.sign.seedLength = crypto_sign_SEEDBYTES; 2340 nacl.sign.signatureLength = crypto_sign_BYTES; 2341 2342 nacl.hash = function(msg) { 2343 checkArrayTypes(msg); 2344 var h = new Uint8Array(crypto_hash_BYTES); 2345 crypto_hash(h, msg, msg.length); 2346 return h; 2347 }; 2348 2349 nacl.hash.hashLength = crypto_hash_BYTES; 2350 2351 nacl.verify = function(x, y) { 2352 checkArrayTypes(x, y); 2353 // Zero length arguments are considered not equal. 2354 if (x.length === 0 || y.length === 0) return false; 2355 if (x.length !== y.length) return false; 2356 return (vn(x, 0, y, 0, x.length) === 0) ? true : false; 2357 }; 2358 2359 nacl.setPRNG = function(fn) { 2360 randombytes = fn; 2361 }; 2362 2363 (function() { 2364 // Initialize PRNG if environment provides CSPRNG. 2365 // If not, methods calling randombytes will throw. 2366 var crypto = typeof self !== 'undefined' ? (self.crypto || self.msCrypto) : null; 2367 if (crypto && crypto.getRandomValues) { 2368 // Browsers. 2369 var QUOTA = 65536; 2370 nacl.setPRNG(function(x, n) { 2371 var i, v = new Uint8Array(n); 2372 for (i = 0; i < n; i += QUOTA) { 2373 crypto.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA))); 2374 } 2375 for (i = 0; i < n; i++) x[i] = v[i]; 2376 cleanup(v); 2377 }); 2378 } else if (typeof require !== 'undefined') { 2379 // Node.js. 2380 crypto = require('crypto'); 2381 if (crypto && crypto.randomBytes) { 2382 nacl.setPRNG(function(x, n) { 2383 var i, v = crypto.randomBytes(n); 2384 for (i = 0; i < n; i++) x[i] = v[i]; 2385 cleanup(v); 2386 }); 2387 } 2388 } 2389 })(); 2390 2391 })(typeof module !== 'undefined' && module.exports ? module.exports : (self.nacl = self.nacl || {}));