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