summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/evp/p_open.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/evp/p_open.c')
-rw-r--r--src/lib/libcrypto/evp/p_open.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/src/lib/libcrypto/evp/p_open.c b/src/lib/libcrypto/evp/p_open.c
index b9ca7892c2..2760c00fec 100644
--- a/src/lib/libcrypto/evp/p_open.c
+++ b/src/lib/libcrypto/evp/p_open.c
@@ -68,37 +68,41 @@ int EVP_OpenInit(EVP_CIPHER_CTX *ctx, EVP_CIPHER *type, unsigned char *ek,
68 { 68 {
69 unsigned char *key=NULL; 69 unsigned char *key=NULL;
70 int i,size=0,ret=0; 70 int i,size=0,ret=0;
71 71
72 if(type) {
73 EVP_CIPHER_CTX_init(ctx);
74 if(!EVP_DecryptInit(ctx,type,NULL,NULL)) return 0;
75 }
76
77 if(!priv) return 1;
78
72 if (priv->type != EVP_PKEY_RSA) 79 if (priv->type != EVP_PKEY_RSA)
73 { 80 {
74 EVPerr(EVP_F_EVP_OPENINIT,EVP_R_PUBLIC_KEY_NOT_RSA); 81 EVPerr(EVP_F_EVP_OPENINIT,EVP_R_PUBLIC_KEY_NOT_RSA);
75 ret= -1;
76 goto err; 82 goto err;
77 } 83 }
78 84
79 size=RSA_size(priv->pkey.rsa); 85 size=RSA_size(priv->pkey.rsa);
80 key=(unsigned char *)Malloc(size+2); 86 key=(unsigned char *)OPENSSL_malloc(size+2);
81 if (key == NULL) 87 if (key == NULL)
82 { 88 {
83 /* ERROR */ 89 /* ERROR */
84 EVPerr(EVP_F_EVP_OPENINIT,ERR_R_MALLOC_FAILURE); 90 EVPerr(EVP_F_EVP_OPENINIT,ERR_R_MALLOC_FAILURE);
85 ret= -1;
86 goto err; 91 goto err;
87 } 92 }
88 93
89 i=EVP_PKEY_decrypt(key,ek,ekl,priv); 94 i=EVP_PKEY_decrypt(key,ek,ekl,priv);
90 if (i != type->key_len) 95 if ((i <= 0) || !EVP_CIPHER_CTX_set_key_length(ctx, i))
91 { 96 {
92 /* ERROR */ 97 /* ERROR */
93 goto err; 98 goto err;
94 } 99 }
100 if(!EVP_DecryptInit(ctx,NULL,key,iv)) goto err;
95 101
96 EVP_CIPHER_CTX_init(ctx);
97 EVP_DecryptInit(ctx,type,key,iv);
98 ret=1; 102 ret=1;
99err: 103err:
100 if (key != NULL) memset(key,0,size); 104 if (key != NULL) memset(key,0,size);
101 Free(key); 105 OPENSSL_free(key);
102 return(ret); 106 return(ret);
103 } 107 }
104 108