projects
/
oweals
/
openssl.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Remove MD2 from digest algorithm table. This follows the recommendation in
[oweals/openssl.git]
/
crypto
/
evp
/
p5_crpt.c
diff --git
a/crypto/evp/p5_crpt.c
b/crypto/evp/p5_crpt.c
index 857835bc74358ce5b2c7413a21509a9003223b7e..2a265fdee27719efda659162b641d3e7edba4f6d 100644
(file)
--- a/
crypto/evp/p5_crpt.c
+++ b/
crypto/evp/p5_crpt.c
@@
-1,5
+1,5
@@
/* p5_crpt.c */
/* p5_crpt.c */
-/* Written by Dr Stephen N Henson (s
henson@bigfoot.com
) for the OpenSSL
+/* Written by Dr Stephen N Henson (s
teve@openssl.org
) for the OpenSSL
* project 1999.
*/
/* ====================================================================
* project 1999.
*/
/* ====================================================================
@@
-58,49
+58,71
@@
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
+#include "cryptlib.h"
#include <openssl/x509.h>
#include <openssl/evp.h>
#include <openssl/x509.h>
#include <openssl/evp.h>
-#include "cryptlib.h"
/* PKCS#5 v1.5 compatible PBE functions: see PKCS#5 v2.0 for more info.
*/
void PKCS5_PBE_add(void)
{
/* PKCS#5 v1.5 compatible PBE functions: see PKCS#5 v2.0 for more info.
*/
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);
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);
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);
EVP_PBE_alg_add(NID_pbeWithSHA1AndDES_CBC, EVP_des_cbc(), EVP_sha1(),
PKCS5_PBE_keyivgen);
+# endif
#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);
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);
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);
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
}
#endif
}
-int PKCS5_PBE_keyivgen(
const char *pass, int passlen, ASN1_TYPE *param
,
-
EVP_CIPHER *cipher,
EVP_MD *md,
-
unsigned char *key, unsigned char *iv
)
+int PKCS5_PBE_keyivgen(
EVP_CIPHER_CTX *cctx, const char *pass, int passlen
,
+
ASN1_TYPE *param, const EVP_CIPHER *cipher, const
EVP_MD *md,
+
int en_de
)
{
EVP_MD_CTX ctx;
unsigned char md_tmp[EVP_MAX_MD_SIZE];
{
EVP_MD_CTX ctx;
unsigned char md_tmp[EVP_MAX_MD_SIZE];
+ unsigned char key[EVP_MAX_KEY_LENGTH], iv[EVP_MAX_IV_LENGTH];
int i;
PBEPARAM *pbe;
int saltlen, iter;
int i;
PBEPARAM *pbe;
int saltlen, iter;
- unsigned char *salt, *pbuf;
+ unsigned char *salt;
+ const unsigned char *pbuf;
/* Extract useful info from parameter */
/* Extract useful info from parameter */
+ if (param == NULL || param->type != V_ASN1_SEQUENCE ||
+ param->value.sequence == NULL) {
+ EVPerr(EVP_F_PKCS5_PBE_KEYIVGEN,EVP_R_DECODE_ERROR);
+ return 0;
+ }
+
pbuf = param->value.sequence->data;
pbuf = param->value.sequence->data;
- if (!(pbe = d2i_PBEPARAM (NULL, &pbuf,
- param->value.sequence->length))) {
- EVPerr(EVP_F_EVP_PKCS5_PBE_KEYIVGEN,EVP_R_DECODE_ERROR);
+ if (!(pbe = d2i_PBEPARAM(NULL, &pbuf, param->value.sequence->length))) {
+ EVPerr(EVP_F_PKCS5_PBE_KEYIVGEN,EVP_R_DECODE_ERROR);
return 0;
}
return 0;
}
@@
-109,18
+131,29
@@
int PKCS5_PBE_keyivgen(const char *pass, int passlen, ASN1_TYPE *param,
salt = pbe->salt->data;
saltlen = pbe->salt->length;
salt = pbe->salt->data;
saltlen = pbe->salt->length;
- EVP_DigestInit (&ctx, md);
- EVP_DigestUpdate (&ctx, pass, passlen);
- EVP_DigestUpdate (&ctx, salt, saltlen);
+ if(!pass) passlen = 0;
+ else if(passlen == -1) passlen = strlen(pass);
+
+ EVP_MD_CTX_init(&ctx);
+ EVP_DigestInit_ex(&ctx, md, NULL);
+ EVP_DigestUpdate(&ctx, pass, passlen);
+ EVP_DigestUpdate(&ctx, salt, saltlen);
PBEPARAM_free(pbe);
PBEPARAM_free(pbe);
- EVP_DigestFinal
(&ctx, md_tmp, NULL);
+ EVP_DigestFinal
_ex
(&ctx, md_tmp, NULL);
for (i = 1; i < iter; i++) {
for (i = 1; i < iter; i++) {
- EVP_DigestInit
(&ctx, md
);
+ EVP_DigestInit
_ex(&ctx, md, NULL
);
EVP_DigestUpdate(&ctx, md_tmp, EVP_MD_size(md));
EVP_DigestUpdate(&ctx, md_tmp, EVP_MD_size(md));
- EVP_DigestFinal (&ctx, md_tmp, NULL);
+ EVP_DigestFinal
_ex
(&ctx, md_tmp, NULL);
}
}
- memcpy (key, md_tmp, EVP_CIPHER_key_length(cipher));
- memcpy (iv, md_tmp + (16 - EVP_CIPHER_iv_length(cipher)),
+ EVP_MD_CTX_cleanup(&ctx);
+ OPENSSL_assert(EVP_CIPHER_key_length(cipher) <= (int)sizeof(md_tmp));
+ memcpy(key, md_tmp, EVP_CIPHER_key_length(cipher));
+ OPENSSL_assert(EVP_CIPHER_iv_length(cipher) <= 16);
+ memcpy(iv, md_tmp + (16 - EVP_CIPHER_iv_length(cipher)),
EVP_CIPHER_iv_length(cipher));
EVP_CIPHER_iv_length(cipher));
+ EVP_CipherInit_ex(cctx, cipher, NULL, key, iv, en_de);
+ OPENSSL_cleanse(md_tmp, EVP_MAX_MD_SIZE);
+ OPENSSL_cleanse(key, EVP_MAX_KEY_LENGTH);
+ OPENSSL_cleanse(iv, EVP_MAX_IV_LENGTH);
return 1;
}
return 1;
}