diff options
Diffstat (limited to 'src/lib/libcrypto/asn1/x_pubkey.c')
| -rw-r--r-- | src/lib/libcrypto/asn1/x_pubkey.c | 50 | 
1 files changed, 38 insertions, 12 deletions
| diff --git a/src/lib/libcrypto/asn1/x_pubkey.c b/src/lib/libcrypto/asn1/x_pubkey.c index d958540120..7d6d71af88 100644 --- a/src/lib/libcrypto/asn1/x_pubkey.c +++ b/src/lib/libcrypto/asn1/x_pubkey.c | |||
| @@ -80,8 +80,7 @@ IMPLEMENT_ASN1_FUNCTIONS(X509_PUBKEY) | |||
| 80 | 80 | ||
| 81 | int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey) | 81 | int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey) | 
| 82 | { | 82 | { | 
| 83 | int ok=0; | 83 | X509_PUBKEY *pk=NULL; | 
| 84 | X509_PUBKEY *pk; | ||
| 85 | X509_ALGOR *a; | 84 | X509_ALGOR *a; | 
| 86 | ASN1_OBJECT *o; | 85 | ASN1_OBJECT *o; | 
| 87 | unsigned char *s,*p = NULL; | 86 | unsigned char *s,*p = NULL; | 
| @@ -104,7 +103,11 @@ int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey) | |||
| 104 | (a->parameter->type != V_ASN1_NULL)) | 103 | (a->parameter->type != V_ASN1_NULL)) | 
| 105 | { | 104 | { | 
| 106 | ASN1_TYPE_free(a->parameter); | 105 | ASN1_TYPE_free(a->parameter); | 
| 107 | a->parameter=ASN1_TYPE_new(); | 106 | if (!(a->parameter=ASN1_TYPE_new())) | 
| 107 | { | ||
| 108 | X509err(X509_F_X509_PUBKEY_SET,ERR_R_MALLOC_FAILURE); | ||
| 109 | goto err; | ||
| 110 | } | ||
| 108 | a->parameter->type=V_ASN1_NULL; | 111 | a->parameter->type=V_ASN1_NULL; | 
| 109 | } | 112 | } | 
| 110 | } | 113 | } | 
| @@ -118,14 +121,34 @@ int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey) | |||
| 118 | dsa=pkey->pkey.dsa; | 121 | dsa=pkey->pkey.dsa; | 
| 119 | dsa->write_params=0; | 122 | dsa->write_params=0; | 
| 120 | ASN1_TYPE_free(a->parameter); | 123 | ASN1_TYPE_free(a->parameter); | 
| 121 | i=i2d_DSAparams(dsa,NULL); | 124 | if ((i=i2d_DSAparams(dsa,NULL)) <= 0) | 
| 122 | if ((p=(unsigned char *)OPENSSL_malloc(i)) == NULL) goto err; | 125 | goto err; | 
| 126 | if (!(p=(unsigned char *)OPENSSL_malloc(i))) | ||
| 127 | { | ||
| 128 | X509err(X509_F_X509_PUBKEY_SET,ERR_R_MALLOC_FAILURE); | ||
| 129 | goto err; | ||
| 130 | } | ||
| 123 | pp=p; | 131 | pp=p; | 
| 124 | i2d_DSAparams(dsa,&pp); | 132 | i2d_DSAparams(dsa,&pp); | 
| 125 | a->parameter=ASN1_TYPE_new(); | 133 | if (!(a->parameter=ASN1_TYPE_new())) | 
| 134 | { | ||
| 135 | OPENSSL_free(p); | ||
| 136 | X509err(X509_F_X509_PUBKEY_SET,ERR_R_MALLOC_FAILURE); | ||
| 137 | goto err; | ||
| 138 | } | ||
| 126 | a->parameter->type=V_ASN1_SEQUENCE; | 139 | a->parameter->type=V_ASN1_SEQUENCE; | 
| 127 | a->parameter->value.sequence=ASN1_STRING_new(); | 140 | if (!(a->parameter->value.sequence=ASN1_STRING_new())) | 
| 128 | ASN1_STRING_set(a->parameter->value.sequence,p,i); | 141 | { | 
| 142 | OPENSSL_free(p); | ||
| 143 | X509err(X509_F_X509_PUBKEY_SET,ERR_R_MALLOC_FAILURE); | ||
| 144 | goto err; | ||
| 145 | } | ||
| 146 | if (!ASN1_STRING_set(a->parameter->value.sequence,p,i)) | ||
| 147 | { | ||
| 148 | OPENSSL_free(p); | ||
| 149 | X509err(X509_F_X509_PUBKEY_SET,ERR_R_MALLOC_FAILURE); | ||
| 150 | goto err; | ||
| 151 | } | ||
| 129 | OPENSSL_free(p); | 152 | OPENSSL_free(p); | 
| 130 | } | 153 | } | 
| 131 | else | 154 | else | 
| @@ -143,7 +166,11 @@ int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey) | |||
| 143 | } | 166 | } | 
| 144 | p=s; | 167 | p=s; | 
| 145 | i2d_PublicKey(pkey,&p); | 168 | i2d_PublicKey(pkey,&p); | 
| 146 | if (!M_ASN1_BIT_STRING_set(pk->public_key,s,i)) goto err; | 169 | if (!M_ASN1_BIT_STRING_set(pk->public_key,s,i)) | 
| 170 | { | ||
| 171 | X509err(X509_F_X509_PUBKEY_SET,ERR_R_MALLOC_FAILURE); | ||
| 172 | goto err; | ||
| 173 | } | ||
| 147 | /* Set number of unused bits to zero */ | 174 | /* Set number of unused bits to zero */ | 
| 148 | pk->public_key->flags&= ~(ASN1_STRING_FLAG_BITS_LEFT|0x07); | 175 | pk->public_key->flags&= ~(ASN1_STRING_FLAG_BITS_LEFT|0x07); | 
| 149 | pk->public_key->flags|=ASN1_STRING_FLAG_BITS_LEFT; | 176 | pk->public_key->flags|=ASN1_STRING_FLAG_BITS_LEFT; | 
| @@ -159,12 +186,11 @@ int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey) | |||
| 159 | X509_PUBKEY_free(*x); | 186 | X509_PUBKEY_free(*x); | 
| 160 | 187 | ||
| 161 | *x=pk; | 188 | *x=pk; | 
| 162 | pk=NULL; | ||
| 163 | 189 | ||
| 164 | ok=1; | 190 | return 1; | 
| 165 | err: | 191 | err: | 
| 166 | if (pk != NULL) X509_PUBKEY_free(pk); | 192 | if (pk != NULL) X509_PUBKEY_free(pk); | 
| 167 | return(ok); | 193 | return 0; | 
| 168 | } | 194 | } | 
| 169 | 195 | ||
| 170 | EVP_PKEY *X509_PUBKEY_get(X509_PUBKEY *key) | 196 | EVP_PKEY *X509_PUBKEY_get(X509_PUBKEY *key) | 
