diff options
author | slontis <shane.lontis@oracle.com> | 2023-08-31 17:51:46 +1000 |
---|---|---|
committer | Pauli <pauli@openssl.org> | 2023-09-04 14:15:34 +1000 |
commit | e3994583a1e4bde9a589c379520d216bc0a0c515 (patch) | |
tree | 740416411fe5f6b4c6fbead6c06d03de556d17cc /apps | |
parent | 9f679bdc71aac83e89cc5aacb42855f3657ace39 (diff) | |
download | openssl-e3994583a1e4bde9a589c379520d216bc0a0c515.tar.gz |
Added 'saltlen' option to the OpenSSL enc command line app.
This allows PBKDF2 to change the saltlen to something other than the
new default value of 16. Previously this app hardwired the salt length
to a maximum of 8 bytes. Non PBKDF2 mode uses EVP_BytesToKey()
internally, which is documented to only allow 8 bytes.
Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Paul Dale <pauli@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/21858)
Diffstat (limited to 'apps')
-rw-r--r-- | apps/enc.c | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/apps/enc.c b/apps/enc.c index 58994e1d3e..a3b17da08d 100644 --- a/apps/enc.c +++ b/apps/enc.c @@ -49,7 +49,7 @@ typedef enum OPTION_choice { OPT_NOPAD, OPT_SALT, OPT_NOSALT, OPT_DEBUG, OPT_UPPER_P, OPT_UPPER_A, OPT_A, OPT_Z, OPT_BUFSIZE, OPT_K, OPT_KFILE, OPT_UPPER_K, OPT_NONE, OPT_UPPER_S, OPT_IV, OPT_MD, OPT_ITER, OPT_PBKDF2, OPT_CIPHER, - OPT_R_ENUM, OPT_PROV_ENUM + OPT_SALTLEN, OPT_R_ENUM, OPT_PROV_ENUM } OPTION_CHOICE; const OPTIONS enc_options[] = { @@ -100,6 +100,8 @@ const OPTIONS enc_options[] = { {OPT_MORE_STR, 0, 0, "Use -iter to change the iteration count from " STR(PBKDF2_ITER_DEFAULT)}, {"none", OPT_NONE, '-', "Don't encrypt"}, + {"saltlen", OPT_SALTLEN, 'p', "Specify the PBKDF2 salt length (in bytes)"}, + {OPT_MORE_STR, 0, 0, "Default: 16"}, #ifndef OPENSSL_NO_ZLIB {"z", OPT_Z, '-', "Compress or decompress encrypted data using zlib"}, #endif @@ -132,7 +134,8 @@ int enc_main(int argc, char **argv) int base64 = 0, informat = FORMAT_BINARY, outformat = FORMAT_BINARY; int ret = 1, inl, nopad = 0; unsigned char key[EVP_MAX_KEY_LENGTH], iv[EVP_MAX_IV_LENGTH]; - unsigned char *buff = NULL, salt[PKCS5_SALT_LEN]; + unsigned char *buff = NULL, salt[EVP_MAX_IV_LENGTH]; + int saltlen = 0; int pbkdf2 = 0; int iter = 0; long n; @@ -293,6 +296,12 @@ int enc_main(int argc, char **argv) iter = opt_int_arg(); pbkdf2 = 1; break; + case OPT_SALTLEN: + if (!opt_int(opt_arg(), &saltlen)) + goto opthelp; + if (saltlen > (int)sizeof(salt)) + saltlen = (int)sizeof(salt); + break; case OPT_PBKDF2: pbkdf2 = 1; if (iter == 0) /* do not overwrite a chosen value */ @@ -317,6 +326,8 @@ int enc_main(int argc, char **argv) goto opthelp; if (!app_RAND_load()) goto end; + if (saltlen == 0 || pbkdf2 == 0) + saltlen = PKCS5_SALT_LEN; /* Get the cipher name, either from progname (if set) or flag. */ if (!opt_cipher(ciphername, &cipher)) @@ -496,13 +507,13 @@ int enc_main(int argc, char **argv) if (nosalt) { sptr = NULL; } else { - if (hsalt != NULL && !set_hex(hsalt, salt, sizeof(salt))) { + if (hsalt != NULL && !set_hex(hsalt, salt, saltlen)) { BIO_printf(bio_err, "invalid hex salt value\n"); goto end; } if (enc) { /* encryption */ if (hsalt == NULL) { - if (RAND_bytes(salt, sizeof(salt)) <= 0) { + if (RAND_bytes(salt, saltlen) <= 0) { BIO_printf(bio_err, "RAND_bytes failed\n"); goto end; } @@ -515,7 +526,7 @@ int enc_main(int argc, char **argv) sizeof(magic) - 1) != sizeof(magic) - 1 || BIO_write(wbio, (char *)salt, - sizeof(salt)) != sizeof(salt))) { + saltlen) != saltlen)) { BIO_printf(bio_err, "error writing output file\n"); goto end; } @@ -528,7 +539,7 @@ int enc_main(int argc, char **argv) } if (memcmp(mbuf, magic, sizeof(mbuf)) == 0) { /* file IS salted */ if (BIO_read(rbio, salt, - sizeof(salt)) != sizeof(salt)) { + saltlen) != saltlen) { BIO_printf(bio_err, "error reading input file\n"); goto end; } @@ -550,7 +561,8 @@ int enc_main(int argc, char **argv) int iklen = EVP_CIPHER_get_key_length(cipher); int ivlen = EVP_CIPHER_get_iv_length(cipher); /* not needed if HASH_UPDATE() is fixed : */ - int islen = (sptr != NULL ? sizeof(salt) : 0); + int islen = (sptr != NULL ? saltlen : 0); + if (!PKCS5_PBKDF2_HMAC(str, str_len, sptr, islen, iter, dgst, iklen+ivlen, tmpkeyiv)) { BIO_printf(bio_err, "PKCS5_PBKDF2_HMAC failed\n"); @@ -646,7 +658,7 @@ int enc_main(int argc, char **argv) if (printkey) { if (!nosalt) { printf("salt="); - for (i = 0; i < (int)sizeof(salt); i++) + for (i = 0; i < (int)saltlen; i++) printf("%02X", salt[i]); printf("\n"); } |