| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2016-05-18 02:24:46 +08:00
										 |  |  |  * Copyright 1999-2016 The OpenSSL Project Authors. All Rights Reserved. | 
					
						
							| 
									
										
										
										
											1999-06-08 05:00:19 +08:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2016-05-18 02:24:46 +08:00
										 |  |  |  * Licensed under the OpenSSL license (the "License").  You may not use | 
					
						
							|  |  |  |  * this file except in compliance with the License.  You can obtain a copy | 
					
						
							|  |  |  |  * in the file LICENSE in the source distribution or at | 
					
						
							|  |  |  |  * https://www.openssl.org/source/license.html
 | 
					
						
							| 
									
										
										
										
											1999-06-08 05:00:19 +08:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2016-05-18 02:24:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-06-08 05:00:19 +08:00
										 |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | #include <stdlib.h>
 | 
					
						
							| 
									
										
										
										
											2015-05-14 22:56:48 +08:00
										 |  |  | #include "internal/cryptlib.h"
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | # include <openssl/x509.h>
 | 
					
						
							|  |  |  | # include <openssl/evp.h>
 | 
					
						
							|  |  |  | # include <openssl/hmac.h>
 | 
					
						
							|  |  |  | # include "evp_locl.h"
 | 
					
						
							| 
									
										
										
										
											1999-06-08 05:00:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-07-11 20:40:46 +08:00
										 |  |  | /* set this to print out info about the keygen algorithm */ | 
					
						
							| 
									
										
										
											
												Remove outdated DEBUG flags.
Add -DBIO_DEBUG to --strict-warnings.
Remove comments about outdated debugging ifdef guards.
Remove md_rand ifdef guarding an assert; it doesn't seem used.
Remove the conf guards in conf_api since we use OPENSSL_assert, not assert.
For pkcs12 stuff put OPENSSL_ in front of the macro name.
Merge TLS_DEBUG into SSL_DEBUG.
Various things just turned on/off asserts, mainly for checking non-NULL
arguments, which is now removed: camellia, bn_ctx, crypto/modes.
Remove some old debug code, that basically just printed things to stderr:
  DEBUG_PRINT_UNKNOWN_CIPHERSUITES, DEBUG_ZLIB, OPENSSL_RI_DEBUG,
  RL_DEBUG, RSA_DEBUG, SCRYPT_DEBUG.
Remove OPENSSL_SSL_DEBUG_BROKEN_PROTOCOL.
Reviewed-by: Richard Levitte <levitte@openssl.org>
											
										 
											2016-02-19 00:33:21 +08:00
										 |  |  | /* #define OPENSSL_DEBUG_PKCS5V2 */ | 
					
						
							| 
									
										
										
										
											1999-07-11 20:40:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
											
												Remove outdated DEBUG flags.
Add -DBIO_DEBUG to --strict-warnings.
Remove comments about outdated debugging ifdef guards.
Remove md_rand ifdef guarding an assert; it doesn't seem used.
Remove the conf guards in conf_api since we use OPENSSL_assert, not assert.
For pkcs12 stuff put OPENSSL_ in front of the macro name.
Merge TLS_DEBUG into SSL_DEBUG.
Various things just turned on/off asserts, mainly for checking non-NULL
arguments, which is now removed: camellia, bn_ctx, crypto/modes.
Remove some old debug code, that basically just printed things to stderr:
  DEBUG_PRINT_UNKNOWN_CIPHERSUITES, DEBUG_ZLIB, OPENSSL_RI_DEBUG,
  RL_DEBUG, RSA_DEBUG, SCRYPT_DEBUG.
Remove OPENSSL_SSL_DEBUG_BROKEN_PROTOCOL.
Reviewed-by: Richard Levitte <levitte@openssl.org>
											
										 
											2016-02-19 00:33:21 +08:00
										 |  |  | # ifdef OPENSSL_DEBUG_PKCS5V2
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | static void h__dump(const unsigned char *p, int len); | 
					
						
							|  |  |  | # endif
 | 
					
						
							| 
									
										
										
										
											1999-07-11 20:40:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * This is an implementation of PKCS#5 v2.0 password based encryption key | 
					
						
							|  |  |  |  * derivation function PBKDF2. SHA1 version verified against test vectors | 
					
						
							| 
									
										
										
										
											2017-10-11 05:55:09 +08:00
										 |  |  |  * posted by Peter Gutmann to the PKCS-TNG mailing list. | 
					
						
							| 
									
										
										
										
											1999-06-08 05:00:19 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-05-15 02:40:53 +08:00
										 |  |  | int PKCS5_PBKDF2_HMAC(const char *pass, int passlen, | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |                       const unsigned char *salt, int saltlen, int iter, | 
					
						
							|  |  |  |                       const EVP_MD *digest, int keylen, unsigned char *out) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-10-12 01:26:23 +08:00
										 |  |  |     const char *empty = ""; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     unsigned char digtmp[EVP_MAX_MD_SIZE], *p, itmp[4]; | 
					
						
							|  |  |  |     int cplen, j, k, tkeylen, mdlen; | 
					
						
							|  |  |  |     unsigned long i = 1; | 
					
						
							| 
									
										
										
										
											2015-11-30 20:44:28 +08:00
										 |  |  |     HMAC_CTX *hctx_tpl = NULL, *hctx = NULL; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     mdlen = EVP_MD_size(digest); | 
					
						
							|  |  |  |     if (mdlen < 0) | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-30 20:44:28 +08:00
										 |  |  |     hctx_tpl = HMAC_CTX_new(); | 
					
						
							|  |  |  |     if (hctx_tpl == NULL) | 
					
						
							|  |  |  |         return 0; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     p = out; | 
					
						
							|  |  |  |     tkeylen = keylen; | 
					
						
							| 
									
										
										
										
											2016-10-12 01:26:23 +08:00
										 |  |  |     if (pass == NULL) { | 
					
						
							|  |  |  |         pass = empty; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |         passlen = 0; | 
					
						
							| 
									
										
										
										
											2016-10-12 01:26:23 +08:00
										 |  |  |     } else if (passlen == -1) { | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |         passlen = strlen(pass); | 
					
						
							| 
									
										
										
										
											2016-10-12 01:26:23 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-11-30 20:44:28 +08:00
										 |  |  |     if (!HMAC_Init_ex(hctx_tpl, pass, passlen, digest, NULL)) { | 
					
						
							|  |  |  |         HMAC_CTX_free(hctx_tpl); | 
					
						
							|  |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     hctx = HMAC_CTX_new(); | 
					
						
							|  |  |  |     if (hctx == NULL) { | 
					
						
							|  |  |  |         HMAC_CTX_free(hctx_tpl); | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |         return 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     while (tkeylen) { | 
					
						
							|  |  |  |         if (tkeylen > mdlen) | 
					
						
							|  |  |  |             cplen = mdlen; | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |             cplen = tkeylen; | 
					
						
							|  |  |  |         /*
 | 
					
						
							|  |  |  |          * We are unlikely to ever use more than 256 blocks (5120 bits!) but | 
					
						
							|  |  |  |          * just in case... | 
					
						
							|  |  |  |          */ | 
					
						
							|  |  |  |         itmp[0] = (unsigned char)((i >> 24) & 0xff); | 
					
						
							|  |  |  |         itmp[1] = (unsigned char)((i >> 16) & 0xff); | 
					
						
							|  |  |  |         itmp[2] = (unsigned char)((i >> 8) & 0xff); | 
					
						
							|  |  |  |         itmp[3] = (unsigned char)(i & 0xff); | 
					
						
							| 
									
										
										
										
											2015-11-30 20:44:28 +08:00
										 |  |  |         if (!HMAC_CTX_copy(hctx, hctx_tpl)) { | 
					
						
							|  |  |  |             HMAC_CTX_free(hctx); | 
					
						
							|  |  |  |             HMAC_CTX_free(hctx_tpl); | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |             return 0; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2015-11-30 20:44:28 +08:00
										 |  |  |         if (!HMAC_Update(hctx, salt, saltlen) | 
					
						
							|  |  |  |             || !HMAC_Update(hctx, itmp, 4) | 
					
						
							|  |  |  |             || !HMAC_Final(hctx, digtmp, NULL)) { | 
					
						
							|  |  |  |             HMAC_CTX_free(hctx); | 
					
						
							|  |  |  |             HMAC_CTX_free(hctx_tpl); | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |             return 0; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         memcpy(p, digtmp, cplen); | 
					
						
							|  |  |  |         for (j = 1; j < iter; j++) { | 
					
						
							| 
									
										
										
										
											2015-11-30 20:44:28 +08:00
										 |  |  |             if (!HMAC_CTX_copy(hctx, hctx_tpl)) { | 
					
						
							|  |  |  |                 HMAC_CTX_free(hctx); | 
					
						
							|  |  |  |                 HMAC_CTX_free(hctx_tpl); | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |                 return 0; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2015-11-30 20:44:28 +08:00
										 |  |  |             if (!HMAC_Update(hctx, digtmp, mdlen) | 
					
						
							|  |  |  |                 || !HMAC_Final(hctx, digtmp, NULL)) { | 
					
						
							|  |  |  |                 HMAC_CTX_free(hctx); | 
					
						
							|  |  |  |                 HMAC_CTX_free(hctx_tpl); | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |                 return 0; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             for (k = 0; k < cplen; k++) | 
					
						
							|  |  |  |                 p[k] ^= digtmp[k]; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         tkeylen -= cplen; | 
					
						
							|  |  |  |         i++; | 
					
						
							|  |  |  |         p += cplen; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-11-30 20:44:28 +08:00
										 |  |  |     HMAC_CTX_free(hctx); | 
					
						
							|  |  |  |     HMAC_CTX_free(hctx_tpl); | 
					
						
							| 
									
										
										
											
												Remove outdated DEBUG flags.
Add -DBIO_DEBUG to --strict-warnings.
Remove comments about outdated debugging ifdef guards.
Remove md_rand ifdef guarding an assert; it doesn't seem used.
Remove the conf guards in conf_api since we use OPENSSL_assert, not assert.
For pkcs12 stuff put OPENSSL_ in front of the macro name.
Merge TLS_DEBUG into SSL_DEBUG.
Various things just turned on/off asserts, mainly for checking non-NULL
arguments, which is now removed: camellia, bn_ctx, crypto/modes.
Remove some old debug code, that basically just printed things to stderr:
  DEBUG_PRINT_UNKNOWN_CIPHERSUITES, DEBUG_ZLIB, OPENSSL_RI_DEBUG,
  RL_DEBUG, RSA_DEBUG, SCRYPT_DEBUG.
Remove OPENSSL_SSL_DEBUG_BROKEN_PROTOCOL.
Reviewed-by: Richard Levitte <levitte@openssl.org>
											
										 
											2016-02-19 00:33:21 +08:00
										 |  |  | # ifdef OPENSSL_DEBUG_PKCS5V2
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     fprintf(stderr, "Password:\n"); | 
					
						
							|  |  |  |     h__dump(pass, passlen); | 
					
						
							|  |  |  |     fprintf(stderr, "Salt:\n"); | 
					
						
							|  |  |  |     h__dump(salt, saltlen); | 
					
						
							|  |  |  |     fprintf(stderr, "Iteration count %d\n", iter); | 
					
						
							|  |  |  |     fprintf(stderr, "Key:\n"); | 
					
						
							|  |  |  |     h__dump(out, keylen); | 
					
						
							|  |  |  | # endif
 | 
					
						
							|  |  |  |     return 1; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2006-05-15 02:40:53 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | int PKCS5_PBKDF2_HMAC_SHA1(const char *pass, int passlen, | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |                            const unsigned char *salt, int saltlen, int iter, | 
					
						
							|  |  |  |                            int keylen, unsigned char *out) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return PKCS5_PBKDF2_HMAC(pass, passlen, salt, saltlen, iter, EVP_sha1(), | 
					
						
							|  |  |  |                              keylen, out); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Now the key derivation function itself. This is a bit evil because it has | 
					
						
							|  |  |  |  * to check the ASN1 parameters are valid: and there are quite a few of | 
					
						
							|  |  |  |  * them... | 
					
						
							| 
									
										
										
										
											1999-06-08 05:00:19 +08:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int PKCS5_v2_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen, | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |                           ASN1_TYPE *param, const EVP_CIPHER *c, | 
					
						
							|  |  |  |                           const EVP_MD *md, int en_de) | 
					
						
							| 
									
										
										
										
											1999-06-08 05:00:19 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     PBE2PARAM *pbe2 = NULL; | 
					
						
							|  |  |  |     const EVP_CIPHER *cipher; | 
					
						
							| 
									
										
										
										
											2015-02-06 20:08:45 +08:00
										 |  |  |     EVP_PBE_KEYGEN *kdf; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     int rv = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-28 23:10:54 +08:00
										 |  |  |     pbe2 = ASN1_TYPE_unpack_sequence(ASN1_ITEM_rptr(PBE2PARAM), param); | 
					
						
							|  |  |  |     if (pbe2 == NULL) { | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |         EVPerr(EVP_F_PKCS5_V2_PBE_KEYIVGEN, EVP_R_DECODE_ERROR); | 
					
						
							|  |  |  |         goto err; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* See if we recognise the key derivation function */ | 
					
						
							| 
									
										
										
										
											2015-02-06 20:08:45 +08:00
										 |  |  |     if (!EVP_PBE_find(EVP_PBE_TYPE_KDF, OBJ_obj2nid(pbe2->keyfunc->algorithm), | 
					
						
							| 
									
										
										
										
											2016-05-04 04:40:33 +08:00
										 |  |  |                         NULL, NULL, &kdf)) { | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |         EVPerr(EVP_F_PKCS5_V2_PBE_KEYIVGEN, | 
					
						
							|  |  |  |                EVP_R_UNSUPPORTED_KEY_DERIVATION_FUNCTION); | 
					
						
							|  |  |  |         goto err; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /*
 | 
					
						
							|  |  |  |      * lets see if we recognise the encryption algorithm. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     cipher = EVP_get_cipherbyobj(pbe2->encryption->algorithm); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!cipher) { | 
					
						
							|  |  |  |         EVPerr(EVP_F_PKCS5_V2_PBE_KEYIVGEN, EVP_R_UNSUPPORTED_CIPHER); | 
					
						
							|  |  |  |         goto err; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Fixup cipher based on AlgorithmIdentifier */ | 
					
						
							|  |  |  |     if (!EVP_CipherInit_ex(ctx, cipher, NULL, NULL, NULL, en_de)) | 
					
						
							|  |  |  |         goto err; | 
					
						
							|  |  |  |     if (EVP_CIPHER_asn1_to_param(ctx, pbe2->encryption->parameter) < 0) { | 
					
						
							|  |  |  |         EVPerr(EVP_F_PKCS5_V2_PBE_KEYIVGEN, EVP_R_CIPHER_PARAMETER_ERROR); | 
					
						
							|  |  |  |         goto err; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-02-06 20:08:45 +08:00
										 |  |  |     rv = kdf(ctx, pass, passlen, pbe2->keyfunc->parameter, NULL, NULL, en_de); | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |  err: | 
					
						
							|  |  |  |     PBE2PARAM_free(pbe2); | 
					
						
							|  |  |  |     return rv; | 
					
						
							| 
									
										
										
										
											2009-11-26 06:01:06 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | int PKCS5_v2_PBKDF2_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, | 
					
						
							|  |  |  |                              int passlen, ASN1_TYPE *param, | 
					
						
							|  |  |  |                              const EVP_CIPHER *c, const EVP_MD *md, int en_de) | 
					
						
							| 
									
										
										
										
											2009-11-26 06:01:06 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     unsigned char *salt, key[EVP_MAX_KEY_LENGTH]; | 
					
						
							| 
									
										
										
										
											2015-03-28 23:10:54 +08:00
										 |  |  |     int saltlen, iter; | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     int rv = 0; | 
					
						
							|  |  |  |     unsigned int keylen = 0; | 
					
						
							|  |  |  |     int prf_nid, hmac_md_nid; | 
					
						
							|  |  |  |     PBKDF2PARAM *kdf = NULL; | 
					
						
							|  |  |  |     const EVP_MD *prfmd; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (EVP_CIPHER_CTX_cipher(ctx) == NULL) { | 
					
						
							|  |  |  |         EVPerr(EVP_F_PKCS5_V2_PBKDF2_KEYIVGEN, EVP_R_NO_CIPHER_SET); | 
					
						
							|  |  |  |         goto err; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     keylen = EVP_CIPHER_CTX_key_length(ctx); | 
					
						
							| 
									
										
										
										
											2017-12-08 02:39:34 +08:00
										 |  |  |     OPENSSL_assert(keylen <= sizeof(key)); | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* Decode parameter */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-28 23:10:54 +08:00
										 |  |  |     kdf = ASN1_TYPE_unpack_sequence(ASN1_ITEM_rptr(PBKDF2PARAM), param); | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-28 23:10:54 +08:00
										 |  |  |     if (kdf == NULL) { | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |         EVPerr(EVP_F_PKCS5_V2_PBKDF2_KEYIVGEN, EVP_R_DECODE_ERROR); | 
					
						
							|  |  |  |         goto err; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     keylen = EVP_CIPHER_CTX_key_length(ctx); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Now check the parameters of the kdf */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (kdf->keylength && (ASN1_INTEGER_get(kdf->keylength) != (int)keylen)) { | 
					
						
							|  |  |  |         EVPerr(EVP_F_PKCS5_V2_PBKDF2_KEYIVGEN, EVP_R_UNSUPPORTED_KEYLENGTH); | 
					
						
							|  |  |  |         goto err; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (kdf->prf) | 
					
						
							|  |  |  |         prf_nid = OBJ_obj2nid(kdf->prf->algorithm); | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         prf_nid = NID_hmacWithSHA1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!EVP_PBE_find(EVP_PBE_TYPE_PRF, prf_nid, NULL, &hmac_md_nid, 0)) { | 
					
						
							|  |  |  |         EVPerr(EVP_F_PKCS5_V2_PBKDF2_KEYIVGEN, EVP_R_UNSUPPORTED_PRF); | 
					
						
							|  |  |  |         goto err; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     prfmd = EVP_get_digestbynid(hmac_md_nid); | 
					
						
							|  |  |  |     if (prfmd == NULL) { | 
					
						
							|  |  |  |         EVPerr(EVP_F_PKCS5_V2_PBKDF2_KEYIVGEN, EVP_R_UNSUPPORTED_PRF); | 
					
						
							|  |  |  |         goto err; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (kdf->salt->type != V_ASN1_OCTET_STRING) { | 
					
						
							|  |  |  |         EVPerr(EVP_F_PKCS5_V2_PBKDF2_KEYIVGEN, EVP_R_UNSUPPORTED_SALT_TYPE); | 
					
						
							|  |  |  |         goto err; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* it seems that its all OK */ | 
					
						
							|  |  |  |     salt = kdf->salt->value.octet_string->data; | 
					
						
							|  |  |  |     saltlen = kdf->salt->value.octet_string->length; | 
					
						
							|  |  |  |     iter = ASN1_INTEGER_get(kdf->iter); | 
					
						
							|  |  |  |     if (!PKCS5_PBKDF2_HMAC(pass, passlen, salt, saltlen, iter, prfmd, | 
					
						
							|  |  |  |                            keylen, key)) | 
					
						
							|  |  |  |         goto err; | 
					
						
							|  |  |  |     rv = EVP_CipherInit_ex(ctx, NULL, NULL, key, NULL, en_de); | 
					
						
							|  |  |  |  err: | 
					
						
							|  |  |  |     OPENSSL_cleanse(key, keylen); | 
					
						
							|  |  |  |     PBKDF2PARAM_free(kdf); | 
					
						
							|  |  |  |     return rv; | 
					
						
							| 
									
										
										
										
											1999-06-08 05:00:19 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											1999-07-11 20:40:46 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
											
												Remove outdated DEBUG flags.
Add -DBIO_DEBUG to --strict-warnings.
Remove comments about outdated debugging ifdef guards.
Remove md_rand ifdef guarding an assert; it doesn't seem used.
Remove the conf guards in conf_api since we use OPENSSL_assert, not assert.
For pkcs12 stuff put OPENSSL_ in front of the macro name.
Merge TLS_DEBUG into SSL_DEBUG.
Various things just turned on/off asserts, mainly for checking non-NULL
arguments, which is now removed: camellia, bn_ctx, crypto/modes.
Remove some old debug code, that basically just printed things to stderr:
  DEBUG_PRINT_UNKNOWN_CIPHERSUITES, DEBUG_ZLIB, OPENSSL_RI_DEBUG,
  RL_DEBUG, RSA_DEBUG, SCRYPT_DEBUG.
Remove OPENSSL_SSL_DEBUG_BROKEN_PROTOCOL.
Reviewed-by: Richard Levitte <levitte@openssl.org>
											
										 
											2016-02-19 00:33:21 +08:00
										 |  |  | # ifdef OPENSSL_DEBUG_PKCS5V2
 | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | static void h__dump(const unsigned char *p, int len) | 
					
						
							| 
									
										
										
										
											1999-07-11 20:40:46 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  |     for (; len--; p++) | 
					
						
							|  |  |  |         fprintf(stderr, "%02X ", *p); | 
					
						
							|  |  |  |     fprintf(stderr, "\n"); | 
					
						
							| 
									
										
										
										
											1999-07-11 20:40:46 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2015-01-22 11:40:55 +08:00
										 |  |  | # endif
 |