X-Git-Url: https://git.openssl.org/gitweb/?a=blobdiff_plain;f=crypto%2Fevp%2Fp5_crpt.c;h=f05273f257b411bd12a7c3b3c118b2726216d10d;hb=82b223052712859ccb71d587d4e29394dae813e8;hp=0cf7e9d45e70f250f9a37656e82991c3712d734d;hpb=97e4a932451188508b6f865b1a16f2e670a1c315;p=openssl.git diff --git a/crypto/evp/p5_crpt.c b/crypto/evp/p5_crpt.c index 0cf7e9d45e..f05273f257 100644 --- a/crypto/evp/p5_crpt.c +++ b/crypto/evp/p5_crpt.c @@ -67,26 +67,41 @@ void PKCS5_PBE_add(void) { -#ifndef NO_DES +#ifndef OPENSSL_NO_DES +# ifndef OPENSSL_NO_MD5 EVP_PBE_alg_add(NID_pbeWithMD5AndDES_CBC, EVP_des_cbc(), EVP_md5(), PKCS5_PBE_keyivgen); +# endif +# ifndef OPENSSL_NO_MD2 EVP_PBE_alg_add(NID_pbeWithMD2AndDES_CBC, EVP_des_cbc(), EVP_md2(), PKCS5_PBE_keyivgen); +# endif +# ifndef OPENSSL_NO_SHA EVP_PBE_alg_add(NID_pbeWithSHA1AndDES_CBC, EVP_des_cbc(), EVP_sha1(), PKCS5_PBE_keyivgen); +# endif #endif -#ifndef NO_RC2 +#ifndef OPENSSL_NO_RC2 +# ifndef OPENSSL_NO_MD5 EVP_PBE_alg_add(NID_pbeWithMD5AndRC2_CBC, EVP_rc2_64_cbc(), EVP_md5(), PKCS5_PBE_keyivgen); +# endif +# ifndef OPENSSL_NO_MD2 EVP_PBE_alg_add(NID_pbeWithMD2AndRC2_CBC, EVP_rc2_64_cbc(), EVP_md2(), PKCS5_PBE_keyivgen); +# endif +# ifndef OPENSSL_NO_SHA EVP_PBE_alg_add(NID_pbeWithSHA1AndRC2_CBC, EVP_rc2_64_cbc(), EVP_sha1(), PKCS5_PBE_keyivgen); +# endif +#endif +#ifndef OPENSSL_NO_HMAC +EVP_PBE_alg_add(NID_pbes2, NULL, NULL, PKCS5_v2_PBE_keyivgen); #endif } int PKCS5_PBE_keyivgen(EVP_CIPHER_CTX *cctx, const char *pass, int passlen, - ASN1_TYPE *param, EVP_CIPHER *cipher, EVP_MD *md, + ASN1_TYPE *param, const EVP_CIPHER *cipher, const EVP_MD *md, int en_de) { EVP_MD_CTX ctx; @@ -99,7 +114,7 @@ int PKCS5_PBE_keyivgen(EVP_CIPHER_CTX *cctx, const char *pass, int passlen, /* Extract useful info from parameter */ pbuf = param->value.sequence->data; - if (!param || (param->type = V_ASN1_SEQUENCE) || + if (!param || (param->type != V_ASN1_SEQUENCE) || !(pbe = d2i_PBEPARAM (NULL, &pbuf, param->value.sequence->length))) { EVPerr(EVP_F_PKCS5_PBE_KEYIVGEN,EVP_R_DECODE_ERROR); return 0; @@ -110,6 +125,10 @@ int PKCS5_PBE_keyivgen(EVP_CIPHER_CTX *cctx, const char *pass, int passlen, salt = pbe->salt->data; saltlen = pbe->salt->length; + if(!pass) passlen = 0; + else if(passlen == -1) passlen = strlen(pass); + + EVP_MD_CTX_init(&ctx); EVP_DigestInit (&ctx, md); EVP_DigestUpdate (&ctx, pass, passlen); EVP_DigestUpdate (&ctx, salt, saltlen); @@ -120,6 +139,7 @@ int PKCS5_PBE_keyivgen(EVP_CIPHER_CTX *cctx, const char *pass, int passlen, EVP_DigestUpdate(&ctx, md_tmp, EVP_MD_size(md)); EVP_DigestFinal (&ctx, md_tmp, NULL); } + EVP_MD_CTX_cleanup(&ctx); memcpy (key, md_tmp, EVP_CIPHER_key_length(cipher)); memcpy (iv, md_tmp + (16 - EVP_CIPHER_iv_length(cipher)), EVP_CIPHER_iv_length(cipher));