1*b077aed3SPierre Pronchery=pod 2*b077aed3SPierre Pronchery 3*b077aed3SPierre Pronchery=head1 NAME 4*b077aed3SPierre Pronchery 5*b077aed3SPierre ProncheryEVP_KDF-SCRYPT - The scrypt EVP_KDF implementation 6*b077aed3SPierre Pronchery 7*b077aed3SPierre Pronchery=head1 DESCRIPTION 8*b077aed3SPierre Pronchery 9*b077aed3SPierre ProncherySupport for computing the B<scrypt> password-based KDF through the B<EVP_KDF> 10*b077aed3SPierre ProncheryAPI. 11*b077aed3SPierre Pronchery 12*b077aed3SPierre ProncheryThe EVP_KDF-SCRYPT algorithm implements the scrypt password-based key 13*b077aed3SPierre Proncheryderivation function, as described in RFC 7914. It is memory-hard in the sense 14*b077aed3SPierre Proncherythat it deliberately requires a significant amount of RAM for efficient 15*b077aed3SPierre Proncherycomputation. The intention of this is to render brute forcing of passwords on 16*b077aed3SPierre Proncherysystems that lack large amounts of main memory (such as GPUs or ASICs) 17*b077aed3SPierre Proncherycomputationally infeasible. 18*b077aed3SPierre Pronchery 19*b077aed3SPierre Proncheryscrypt provides three work factors that can be customized: N, r and p. N, which 20*b077aed3SPierre Proncheryhas to be a positive power of two, is the general work factor and scales CPU 21*b077aed3SPierre Proncherytime in an approximately linear fashion. r is the block size of the internally 22*b077aed3SPierre Proncheryused hash function and p is the parallelization factor. Both r and p need to be 23*b077aed3SPierre Proncherygreater than zero. The amount of RAM that scrypt requires for its computation 24*b077aed3SPierre Proncheryis roughly (128 * N * r * p) bytes. 25*b077aed3SPierre Pronchery 26*b077aed3SPierre ProncheryIn the original paper of Colin Percival ("Stronger Key Derivation via 27*b077aed3SPierre ProncherySequential Memory-Hard Functions", 2009), the suggested values that give a 28*b077aed3SPierre Proncherycomputation time of less than 5 seconds on a 2.5 GHz Intel Core 2 Duo are N = 29*b077aed3SPierre Pronchery2^20 = 1048576, r = 8, p = 1. Consequently, the required amount of memory for 30*b077aed3SPierre Proncherythis computation is roughly 1 GiB. On a more recent CPU (Intel i7-5930K at 3.5 31*b077aed3SPierre ProncheryGHz), this computation takes about 3 seconds. When N, r or p are not specified, 32*b077aed3SPierre Proncherythey default to 1048576, 8, and 1, respectively. The maximum amount of RAM that 33*b077aed3SPierre Proncherymay be used by scrypt defaults to 1025 MiB. 34*b077aed3SPierre Pronchery 35*b077aed3SPierre Pronchery=head2 Identity 36*b077aed3SPierre Pronchery 37*b077aed3SPierre Pronchery"SCRYPT" is the name for this implementation; it 38*b077aed3SPierre Proncherycan be used with the EVP_KDF_fetch() function. 39*b077aed3SPierre Pronchery 40*b077aed3SPierre Pronchery=head2 Supported parameters 41*b077aed3SPierre Pronchery 42*b077aed3SPierre ProncheryThe supported parameters are: 43*b077aed3SPierre Pronchery 44*b077aed3SPierre Pronchery=over 4 45*b077aed3SPierre Pronchery 46*b077aed3SPierre Pronchery=item "pass" (B<OSSL_KDF_PARAM_PASSWORD>) <octet string> 47*b077aed3SPierre Pronchery 48*b077aed3SPierre Pronchery=item "salt" (B<OSSL_KDF_PARAM_SALT>) <octet string> 49*b077aed3SPierre Pronchery 50*b077aed3SPierre ProncheryThese parameters work as described in L<EVP_KDF(3)/PARAMETERS>. 51*b077aed3SPierre Pronchery 52*b077aed3SPierre Pronchery=item "n" (B<OSSL_KDF_PARAM_SCRYPT_N>) <unsigned integer> 53*b077aed3SPierre Pronchery 54*b077aed3SPierre Pronchery=item "r" (B<OSSL_KDF_PARAM_SCRYPT_R>) <unsigned integer> 55*b077aed3SPierre Pronchery 56*b077aed3SPierre Pronchery=item "p" (B<OSSL_KDF_PARAM_SCRYPT_P>) <unsigned integer> 57*b077aed3SPierre Pronchery 58*b077aed3SPierre Pronchery=item "maxmem_bytes" (B<OSSL_KDF_PARAM_SCRYPT_MAXMEM>) <unsigned integer> 59*b077aed3SPierre Pronchery 60*b077aed3SPierre ProncheryThese parameters configure the scrypt work factors N, r, maxmem and p. 61*b077aed3SPierre ProncheryBoth N and maxmem_bytes are parameters of type B<uint64_t>. 62*b077aed3SPierre ProncheryBoth r and p are parameters of type B<uint32_t>. 63*b077aed3SPierre Pronchery 64*b077aed3SPierre Pronchery=item "properties" (B<OSSL_KDF_PARAM_PROPERTIES>) <UTF8 string> 65*b077aed3SPierre Pronchery 66*b077aed3SPierre ProncheryThis can be used to set the property query string when fetching the 67*b077aed3SPierre Proncheryfixed digest internally. NULL is used if this value is not set. 68*b077aed3SPierre Pronchery 69*b077aed3SPierre Pronchery=back 70*b077aed3SPierre Pronchery 71*b077aed3SPierre Pronchery=head1 NOTES 72*b077aed3SPierre Pronchery 73*b077aed3SPierre ProncheryA context for scrypt can be obtained by calling: 74*b077aed3SPierre Pronchery 75*b077aed3SPierre Pronchery EVP_KDF *kdf = EVP_KDF_fetch(NULL, "SCRYPT", NULL); 76*b077aed3SPierre Pronchery EVP_KDF_CTX *kctx = EVP_KDF_CTX_new(kdf); 77*b077aed3SPierre Pronchery 78*b077aed3SPierre ProncheryThe output length of an scrypt key derivation is specified via the 79*b077aed3SPierre Pronchery"keylen" parameter to the L<EVP_KDF_derive(3)> function. 80*b077aed3SPierre Pronchery 81*b077aed3SPierre Pronchery=head1 EXAMPLES 82*b077aed3SPierre Pronchery 83*b077aed3SPierre ProncheryThis example derives a 64-byte long test vector using scrypt with the password 84*b077aed3SPierre Pronchery"password", salt "NaCl" and N = 1024, r = 8, p = 16. 85*b077aed3SPierre Pronchery 86*b077aed3SPierre Pronchery EVP_KDF *kdf; 87*b077aed3SPierre Pronchery EVP_KDF_CTX *kctx; 88*b077aed3SPierre Pronchery unsigned char out[64]; 89*b077aed3SPierre Pronchery OSSL_PARAM params[6], *p = params; 90*b077aed3SPierre Pronchery 91*b077aed3SPierre Pronchery kdf = EVP_KDF_fetch(NULL, "SCRYPT", NULL); 92*b077aed3SPierre Pronchery kctx = EVP_KDF_CTX_new(kdf); 93*b077aed3SPierre Pronchery EVP_KDF_free(kdf); 94*b077aed3SPierre Pronchery 95*b077aed3SPierre Pronchery *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_PASSWORD, 96*b077aed3SPierre Pronchery "password", (size_t)8); 97*b077aed3SPierre Pronchery *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_SALT, 98*b077aed3SPierre Pronchery "NaCl", (size_t)4); 99*b077aed3SPierre Pronchery *p++ = OSSL_PARAM_construct_uint64(OSSL_KDF_PARAM_SCRYPT_N, (uint64_t)1024); 100*b077aed3SPierre Pronchery *p++ = OSSL_PARAM_construct_uint32(OSSL_KDF_PARAM_SCRYPT_R, (uint32_t)8); 101*b077aed3SPierre Pronchery *p++ = OSSL_PARAM_construct_uint32(OSSL_KDF_PARAM_SCRYPT_P, (uint32_t)16); 102*b077aed3SPierre Pronchery *p = OSSL_PARAM_construct_end(); 103*b077aed3SPierre Pronchery if (EVP_KDF_derive(kctx, out, sizeof(out), params) <= 0) { 104*b077aed3SPierre Pronchery error("EVP_KDF_derive"); 105*b077aed3SPierre Pronchery } 106*b077aed3SPierre Pronchery 107*b077aed3SPierre Pronchery { 108*b077aed3SPierre Pronchery const unsigned char expected[sizeof(out)] = { 109*b077aed3SPierre Pronchery 0xfd, 0xba, 0xbe, 0x1c, 0x9d, 0x34, 0x72, 0x00, 110*b077aed3SPierre Pronchery 0x78, 0x56, 0xe7, 0x19, 0x0d, 0x01, 0xe9, 0xfe, 111*b077aed3SPierre Pronchery 0x7c, 0x6a, 0xd7, 0xcb, 0xc8, 0x23, 0x78, 0x30, 112*b077aed3SPierre Pronchery 0xe7, 0x73, 0x76, 0x63, 0x4b, 0x37, 0x31, 0x62, 113*b077aed3SPierre Pronchery 0x2e, 0xaf, 0x30, 0xd9, 0x2e, 0x22, 0xa3, 0x88, 114*b077aed3SPierre Pronchery 0x6f, 0xf1, 0x09, 0x27, 0x9d, 0x98, 0x30, 0xda, 115*b077aed3SPierre Pronchery 0xc7, 0x27, 0xaf, 0xb9, 0x4a, 0x83, 0xee, 0x6d, 116*b077aed3SPierre Pronchery 0x83, 0x60, 0xcb, 0xdf, 0xa2, 0xcc, 0x06, 0x40 117*b077aed3SPierre Pronchery }; 118*b077aed3SPierre Pronchery 119*b077aed3SPierre Pronchery assert(!memcmp(out, expected, sizeof(out))); 120*b077aed3SPierre Pronchery } 121*b077aed3SPierre Pronchery 122*b077aed3SPierre Pronchery EVP_KDF_CTX_free(kctx); 123*b077aed3SPierre Pronchery 124*b077aed3SPierre Pronchery=head1 CONFORMING TO 125*b077aed3SPierre Pronchery 126*b077aed3SPierre ProncheryRFC 7914 127*b077aed3SPierre Pronchery 128*b077aed3SPierre Pronchery=head1 SEE ALSO 129*b077aed3SPierre Pronchery 130*b077aed3SPierre ProncheryL<EVP_KDF(3)>, 131*b077aed3SPierre ProncheryL<EVP_KDF_CTX_new(3)>, 132*b077aed3SPierre ProncheryL<EVP_KDF_CTX_free(3)>, 133*b077aed3SPierre ProncheryL<EVP_KDF_CTX_set_params(3)>, 134*b077aed3SPierre ProncheryL<EVP_KDF_derive(3)>, 135*b077aed3SPierre ProncheryL<EVP_KDF(3)/PARAMETERS> 136*b077aed3SPierre Pronchery 137*b077aed3SPierre Pronchery=head1 HISTORY 138*b077aed3SPierre Pronchery 139*b077aed3SPierre ProncheryThis functionality was added in OpenSSL 3.0. 140*b077aed3SPierre Pronchery 141*b077aed3SPierre Pronchery=head1 COPYRIGHT 142*b077aed3SPierre Pronchery 143*b077aed3SPierre ProncheryCopyright 2017-2021 The OpenSSL Project Authors. All Rights Reserved. 144*b077aed3SPierre Pronchery 145*b077aed3SPierre ProncheryLicensed under the Apache License 2.0 (the "License"). You may not use 146*b077aed3SPierre Proncherythis file except in compliance with the License. You can obtain a copy 147*b077aed3SPierre Proncheryin the file LICENSE in the source distribution or at 148*b077aed3SPierre ProncheryL<https://www.openssl.org/source/license.html>. 149*b077aed3SPierre Pronchery 150*b077aed3SPierre Pronchery=cut 151