diff options
Diffstat (limited to 'src/lib/libcrypto/evp/p_open.c')
| -rw-r--r-- | src/lib/libcrypto/evp/p_open.c | 52 |
1 files changed, 28 insertions, 24 deletions
diff --git a/src/lib/libcrypto/evp/p_open.c b/src/lib/libcrypto/evp/p_open.c index 28a8e02252..6976f2a867 100644 --- a/src/lib/libcrypto/evp/p_open.c +++ b/src/lib/libcrypto/evp/p_open.c | |||
| @@ -56,64 +56,68 @@ | |||
| 56 | * [including the GNU Public Licence.] | 56 | * [including the GNU Public Licence.] |
| 57 | */ | 57 | */ |
| 58 | 58 | ||
| 59 | #ifndef OPENSSL_NO_RSA | ||
| 59 | #include <stdio.h> | 60 | #include <stdio.h> |
| 60 | #include "cryptlib.h" | 61 | #include "cryptlib.h" |
| 61 | #include "evp.h" | 62 | #include <openssl/evp.h> |
| 62 | #include "objects.h" | 63 | #include <openssl/objects.h> |
| 63 | #include "x509.h" | 64 | #include <openssl/x509.h> |
| 64 | 65 | ||
| 65 | int EVP_OpenInit(ctx,type,ek,ekl,iv,priv) | 66 | int EVP_OpenInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type, unsigned char *ek, |
| 66 | EVP_CIPHER_CTX *ctx; | 67 | int ekl, unsigned char *iv, EVP_PKEY *priv) |
| 67 | EVP_CIPHER *type; | ||
| 68 | unsigned char *ek; | ||
| 69 | int ekl; | ||
| 70 | unsigned char *iv; | ||
| 71 | EVP_PKEY *priv; | ||
| 72 | { | 68 | { |
| 73 | unsigned char *key=NULL; | 69 | unsigned char *key=NULL; |
| 74 | int i,size=0,ret=0; | 70 | int i,size=0,ret=0; |
| 75 | 71 | ||
| 72 | if(type) { | ||
| 73 | EVP_CIPHER_CTX_init(ctx); | ||
| 74 | if(!EVP_DecryptInit_ex(ctx,type,NULL, NULL,NULL)) return 0; | ||
| 75 | } | ||
| 76 | |||
| 77 | if(!priv) return 1; | ||
| 78 | |||
| 76 | if (priv->type != EVP_PKEY_RSA) | 79 | if (priv->type != EVP_PKEY_RSA) |
| 77 | { | 80 | { |
| 78 | EVPerr(EVP_F_EVP_OPENINIT,EVP_R_PUBLIC_KEY_NOT_RSA); | 81 | EVPerr(EVP_F_EVP_OPENINIT,EVP_R_PUBLIC_KEY_NOT_RSA); |
| 79 | ret= -1; | ||
| 80 | goto err; | 82 | goto err; |
| 81 | } | 83 | } |
| 82 | 84 | ||
| 83 | size=RSA_size(priv->pkey.rsa); | 85 | size=RSA_size(priv->pkey.rsa); |
| 84 | key=(unsigned char *)Malloc(size+2); | 86 | key=(unsigned char *)OPENSSL_malloc(size+2); |
| 85 | if (key == NULL) | 87 | if (key == NULL) |
| 86 | { | 88 | { |
| 87 | /* ERROR */ | 89 | /* ERROR */ |
| 88 | EVPerr(EVP_F_EVP_OPENINIT,ERR_R_MALLOC_FAILURE); | 90 | EVPerr(EVP_F_EVP_OPENINIT,ERR_R_MALLOC_FAILURE); |
| 89 | ret= -1; | ||
| 90 | goto err; | 91 | goto err; |
| 91 | } | 92 | } |
| 92 | 93 | ||
| 93 | i=EVP_PKEY_decrypt(key,ek,ekl,priv); | 94 | i=EVP_PKEY_decrypt(key,ek,ekl,priv); |
| 94 | if (i != type->key_len) | 95 | if ((i <= 0) || !EVP_CIPHER_CTX_set_key_length(ctx, i)) |
| 95 | { | 96 | { |
| 96 | /* ERROR */ | 97 | /* ERROR */ |
| 97 | goto err; | 98 | goto err; |
| 98 | } | 99 | } |
| 100 | if(!EVP_DecryptInit_ex(ctx,NULL,NULL,key,iv)) goto err; | ||
| 99 | 101 | ||
| 100 | EVP_CIPHER_CTX_init(ctx); | ||
| 101 | EVP_DecryptInit(ctx,type,key,iv); | ||
| 102 | ret=1; | 102 | ret=1; |
| 103 | err: | 103 | err: |
| 104 | if (key != NULL) memset(key,0,size); | 104 | if (key != NULL) memset(key,0,size); |
| 105 | Free(key); | 105 | OPENSSL_free(key); |
| 106 | return(ret); | 106 | return(ret); |
| 107 | } | 107 | } |
| 108 | 108 | ||
| 109 | int EVP_OpenFinal(ctx,out,outl) | 109 | int EVP_OpenFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl) |
| 110 | EVP_CIPHER_CTX *ctx; | ||
| 111 | unsigned char *out; | ||
| 112 | int *outl; | ||
| 113 | { | 110 | { |
| 114 | int i; | 111 | int i; |
| 115 | 112 | ||
| 116 | i=EVP_DecryptFinal(ctx,out,outl); | 113 | i=EVP_DecryptFinal_ex(ctx,out,outl); |
| 117 | EVP_DecryptInit(ctx,NULL,NULL,NULL); | 114 | EVP_DecryptInit_ex(ctx,NULL,NULL,NULL,NULL); |
| 118 | return(i); | 115 | return(i); |
| 119 | } | 116 | } |
| 117 | #else /* !OPENSSL_NO_RSA */ | ||
| 118 | |||
| 119 | # ifdef PEDANTIC | ||
| 120 | static void *dummy=&dummy; | ||
| 121 | # endif | ||
| 122 | |||
| 123 | #endif | ||
