1 /*- 2 * Copyright 2009 Colin Percival 3 * Copyright 2013 Alexander Peslyak 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 * 27 * This file was originally written by Colin Percival as part of the Tarsnap 28 * online backup system. 29 */ 30 31 #include <errno.h> 32 #include <limits.h> 33 #include <stdint.h> 34 #include <stdlib.h> 35 #include <string.h> 36 37 #include "../crypto_scrypt.h" 38 #include "../pbkdf2-sha256.h" 39 #include "private/common.h" 40 41 static inline void 42 blkcpy_64(escrypt_block_t *dest, const escrypt_block_t *src) 43 { 44 int i; 45 46 #if (ARCH_BITS == 32) 47 for (i = 0; i < 16; ++i) { 48 dest->w[i] = src->w[i]; 49 } 50 #else 51 for (i = 0; i < 8; ++i) { 52 dest->d[i] = src->d[i]; 53 } 54 #endif 55 } 56 57 static inline void 58 blkxor_64(escrypt_block_t *dest, const escrypt_block_t *src) 59 { 60 int i; 61 62 #if (ARCH_BITS == 32) 63 for (i = 0; i < 16; ++i) { 64 dest->w[i] ^= src->w[i]; 65 } 66 #else 67 for (i = 0; i < 8; ++i) { 68 dest->d[i] ^= src->d[i]; 69 } 70 #endif 71 } 72 73 static inline void 74 blkcpy(escrypt_block_t *dest, const escrypt_block_t *src, size_t len) 75 { 76 size_t i, L; 77 78 #if (ARCH_BITS == 32) 79 L = (len >> 2); 80 for (i = 0; i < L; ++i) { 81 dest->w[i] = src->w[i]; 82 } 83 #else 84 L = (len >> 3); 85 for (i = 0; i < L; ++i) { 86 dest->d[i] = src->d[i]; 87 } 88 #endif 89 } 90 91 static inline void 92 blkxor(escrypt_block_t *dest, const escrypt_block_t *src, size_t len) 93 { 94 size_t i, L; 95 96 #if (ARCH_BITS == 32) 97 L = (len >> 2); 98 for (i = 0; i < L; ++i) { 99 dest->w[i] ^= src->w[i]; 100 } 101 #else 102 L = (len >> 3); 103 for (i = 0; i < L; ++i) { 104 dest->d[i] ^= src->d[i]; 105 } 106 #endif 107 } 108 109 /** 110 * salsa20_8(B): 111 * Apply the salsa20/8 core to the provided block. 112 */ 113 static void 114 salsa20_8(uint32_t B[16]) 115 { 116 escrypt_block_t X; 117 uint32_t *x = X.w; 118 size_t i; 119 120 blkcpy_64(&X, (escrypt_block_t *) B); 121 for (i = 0; i < 8; i += 2) { 122 #define R(a, b) (((a) << (b)) | ((a) >> (32 - (b)))) 123 /* Operate on columns. */ 124 x[4] ^= R(x[0] + x[12], 7); 125 x[8] ^= R(x[4] + x[0], 9); 126 x[12] ^= R(x[8] + x[4], 13); 127 x[0] ^= R(x[12] + x[8], 18); 128 129 x[9] ^= R(x[5] + x[1], 7); 130 x[13] ^= R(x[9] + x[5], 9); 131 x[1] ^= R(x[13] + x[9], 13); 132 x[5] ^= R(x[1] + x[13], 18); 133 134 x[14] ^= R(x[10] + x[6], 7); 135 x[2] ^= R(x[14] + x[10], 9); 136 x[6] ^= R(x[2] + x[14], 13); 137 x[10] ^= R(x[6] + x[2], 18); 138 139 x[3] ^= R(x[15] + x[11], 7); 140 x[7] ^= R(x[3] + x[15], 9); 141 x[11] ^= R(x[7] + x[3], 13); 142 x[15] ^= R(x[11] + x[7], 18); 143 144 /* Operate on rows. */ 145 x[1] ^= R(x[0] + x[3], 7); 146 x[2] ^= R(x[1] + x[0], 9); 147 x[3] ^= R(x[2] + x[1], 13); 148 x[0] ^= R(x[3] + x[2], 18); 149 150 x[6] ^= R(x[5] + x[4], 7); 151 x[7] ^= R(x[6] + x[5], 9); 152 x[4] ^= R(x[7] + x[6], 13); 153 x[5] ^= R(x[4] + x[7], 18); 154 155 x[11] ^= R(x[10] + x[9], 7); 156 x[8] ^= R(x[11] + x[10], 9); 157 x[9] ^= R(x[8] + x[11], 13); 158 x[10] ^= R(x[9] + x[8], 18); 159 160 x[12] ^= R(x[15] + x[14], 7); 161 x[13] ^= R(x[12] + x[15], 9); 162 x[14] ^= R(x[13] + x[12], 13); 163 x[15] ^= R(x[14] + x[13], 18); 164 #undef R 165 } 166 for (i = 0; i < 16; i++) 167 B[i] += x[i]; 168 } 169 170 /** 171 * blockmix_salsa8(Bin, Bout, X, r): 172 * Compute Bout = BlockMix_{salsa20/8, r}(Bin). The input Bin must be 128r 173 * bytes in length; the output Bout must also be the same size. The 174 * temporary space X must be 64 bytes. 175 */ 176 static void 177 blockmix_salsa8(const uint32_t *Bin, uint32_t *Bout, uint32_t *X, size_t r) 178 { 179 size_t i; 180 181 /* 1: X <-- B_{2r - 1} */ 182 blkcpy_64((escrypt_block_t *) X, 183 (escrypt_block_t *) &Bin[(2 * r - 1) * 16]); 184 185 /* 2: for i = 0 to 2r - 1 do */ 186 for (i = 0; i < 2 * r; i += 2) { 187 /* 3: X <-- H(X \xor B_i) */ 188 blkxor_64((escrypt_block_t *) X, (escrypt_block_t *) &Bin[i * 16]); 189 salsa20_8(X); 190 191 /* 4: Y_i <-- X */ 192 /* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */ 193 blkcpy_64((escrypt_block_t *) &Bout[i * 8], (escrypt_block_t *) X); 194 195 /* 3: X <-- H(X \xor B_i) */ 196 blkxor_64((escrypt_block_t *) X, (escrypt_block_t *) &Bin[i * 16 + 16]); 197 salsa20_8(X); 198 199 /* 4: Y_i <-- X */ 200 /* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */ 201 blkcpy_64((escrypt_block_t *) &Bout[i * 8 + r * 16], 202 (escrypt_block_t *) X); 203 } 204 } 205 206 /** 207 * integerify(B, r): 208 * Return the result of parsing B_{2r-1} as a little-endian integer. 209 */ 210 static inline uint64_t 211 integerify(const void *B, size_t r) 212 { 213 const uint32_t *X = (const uint32_t *) ((uintptr_t)(B) + (2 * r - 1) * 64); 214 215 return (((uint64_t)(X[1]) << 32) + X[0]); 216 } 217 218 /** 219 * smix(B, r, N, V, XY): 220 * Compute B = SMix_r(B, N). The input B must be 128r bytes in length; 221 * the temporary storage V must be 128rN bytes in length; the temporary 222 * storage XY must be 256r + 64 bytes in length. The value N must be a 223 * power of 2 greater than 1. The arrays B, V, and XY must be aligned to a 224 * multiple of 64 bytes. 225 */ 226 static void 227 smix(uint8_t *B, size_t r, uint64_t N, uint32_t *V, uint32_t *XY) 228 { 229 uint32_t *X = XY; 230 uint32_t *Y = &XY[32 * r]; 231 uint32_t *Z = &XY[64 * r]; 232 uint64_t i; 233 uint64_t j; 234 size_t k; 235 236 /* 1: X <-- B */ 237 for (k = 0; k < 32 * r; k++) { 238 X[k] = LOAD32_LE(&B[4 * k]); 239 } 240 /* 2: for i = 0 to N - 1 do */ 241 for (i = 0; i < N; i += 2) { 242 /* 3: V_i <-- X */ 243 blkcpy((escrypt_block_t *) &V[i * (32 * r)], (escrypt_block_t *) X, 244 128 * r); 245 246 /* 4: X <-- H(X) */ 247 blockmix_salsa8(X, Y, Z, r); 248 249 /* 3: V_i <-- X */ 250 blkcpy((escrypt_block_t *) &V[(i + 1) * (32 * r)], 251 (escrypt_block_t *) Y, 128 * r); 252 253 /* 4: X <-- H(X) */ 254 blockmix_salsa8(Y, X, Z, r); 255 } 256 257 /* 6: for i = 0 to N - 1 do */ 258 for (i = 0; i < N; i += 2) { 259 /* 7: j <-- Integerify(X) mod N */ 260 j = integerify(X, r) & (N - 1); 261 262 /* 8: X <-- H(X \xor V_j) */ 263 blkxor((escrypt_block_t *) X, (escrypt_block_t *) &V[j * (32 * r)], 264 128 * r); 265 blockmix_salsa8(X, Y, Z, r); 266 267 /* 7: j <-- Integerify(X) mod N */ 268 j = integerify(Y, r) & (N - 1); 269 270 /* 8: X <-- H(X \xor V_j) */ 271 blkxor((escrypt_block_t *) Y, (escrypt_block_t *) &V[j * (32 * r)], 272 128 * r); 273 blockmix_salsa8(Y, X, Z, r); 274 } 275 /* 10: B' <-- X */ 276 for (k = 0; k < 32 * r; k++) { 277 STORE32_LE(&B[4 * k], X[k]); 278 } 279 } 280 281 /** 282 * escrypt_kdf(local, passwd, passwdlen, salt, saltlen, 283 * N, r, p, buf, buflen): 284 * Compute scrypt(passwd[0 .. passwdlen - 1], salt[0 .. saltlen - 1], N, r, 285 * p, buflen) and write the result into buf. The parameters r, p, and buflen 286 * must satisfy r * p < 2^30 and buflen <= (2^32 - 1) * 32. The parameter N 287 * must be a power of 2 greater than 1. 288 * 289 * Return 0 on success; or -1 on error. 290 */ 291 int 292 escrypt_kdf_nosse(escrypt_local_t *local, const uint8_t *passwd, 293 size_t passwdlen, const uint8_t *salt, size_t saltlen, 294 uint64_t N, uint32_t _r, uint32_t _p, uint8_t *buf, 295 size_t buflen) 296 { 297 size_t B_size, V_size, XY_size, need; 298 uint8_t * B; 299 uint32_t *V, *XY; 300 size_t r = _r, p = _p; 301 uint32_t i; 302 303 /* Sanity-check parameters. */ 304 #if SIZE_MAX > UINT32_MAX 305 if (buflen > (((uint64_t)(1) << 32) - 1) * 32) { 306 errno = EFBIG; 307 return -1; 308 } 309 #endif 310 if ((uint64_t)(r) * (uint64_t)(p) >= ((uint64_t) 1 << 30)) { 311 errno = EFBIG; 312 return -1; 313 } 314 if (N > UINT32_MAX) { 315 errno = EFBIG; 316 return -1; 317 } 318 if (((N & (N - 1)) != 0) || (N < 2)) { 319 errno = EINVAL; 320 return -1; 321 } 322 if (r == 0 || p == 0) { 323 errno = EINVAL; 324 return -1; 325 } 326 if ((r > SIZE_MAX / 128 / p) || 327 #if SIZE_MAX / 256 <= UINT32_MAX 328 (r > SIZE_MAX / 256) || 329 #endif 330 (N > SIZE_MAX / 128 / r)) { 331 errno = ENOMEM; 332 return -1; 333 } 334 335 /* Allocate memory. */ 336 B_size = (size_t) 128 * r * p; 337 V_size = (size_t) 128 * r * (size_t) N; 338 need = B_size + V_size; 339 if (need < V_size) { 340 errno = ENOMEM; 341 return -1; 342 } 343 XY_size = (size_t) 256 * r + 64; 344 need += XY_size; 345 if (need < XY_size) { 346 errno = ENOMEM; 347 return -1; 348 } 349 if (local->size < need) { 350 if (free_region(local)) { 351 return -1; 352 } 353 if (!alloc_region(local, need)) { 354 return -1; 355 } 356 } 357 B = (uint8_t *) local->aligned; 358 V = (uint32_t *) ((uint8_t *) B + B_size); 359 XY = (uint32_t *) ((uint8_t *) V + V_size); 360 361 /* 1: (B_0 ... B_{p-1}) <-- PBKDF2(P, S, 1, p * MFLen) */ 362 PBKDF2_SHA256(passwd, passwdlen, salt, saltlen, 1, B, B_size); 363 364 /* 2: for i = 0 to p - 1 do */ 365 for (i = 0; i < p; i++) { 366 /* 3: B_i <-- MF(B_i, N) */ 367 smix(&B[(size_t) 128 * i * r], r, N, V, XY); 368 } 369 370 /* 5: DK <-- PBKDF2(P, B, 1, dkLen) */ 371 PBKDF2_SHA256(passwd, passwdlen, B, B_size, 1, buf, buflen); 372 373 /* Success! */ 374 return 0; 375 } 376