summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/asn1/a_verify.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/asn1/a_verify.c')
-rw-r--r--src/lib/libcrypto/asn1/a_verify.c77
1 files changed, 23 insertions, 54 deletions
diff --git a/src/lib/libcrypto/asn1/a_verify.c b/src/lib/libcrypto/asn1/a_verify.c
index 432722e409..cecdb13c70 100644
--- a/src/lib/libcrypto/asn1/a_verify.c
+++ b/src/lib/libcrypto/asn1/a_verify.c
@@ -101,13 +101,8 @@ int ASN1_verify(i2d_of_void *i2d, X509_ALGOR *a, ASN1_BIT_STRING *signature,
101 p=buf_in; 101 p=buf_in;
102 102
103 i2d(data,&p); 103 i2d(data,&p);
104 if (!EVP_VerifyInit_ex(&ctx,type, NULL) 104 EVP_VerifyInit_ex(&ctx,type, NULL);
105 || !EVP_VerifyUpdate(&ctx,(unsigned char *)buf_in,inl)) 105 EVP_VerifyUpdate(&ctx,(unsigned char *)buf_in,inl);
106 {
107 ASN1err(ASN1_F_ASN1_VERIFY,ERR_R_EVP_LIB);
108 ret=0;
109 goto err;
110 }
111 106
112 OPENSSL_cleanse(buf_in,(unsigned int)inl); 107 OPENSSL_cleanse(buf_in,(unsigned int)inl);
113 OPENSSL_free(buf_in); 108 OPENSSL_free(buf_in);
@@ -131,10 +126,11 @@ err:
131#endif 126#endif
132 127
133 128
134int ASN1_item_verify(const ASN1_ITEM *it, X509_ALGOR *a, 129int ASN1_item_verify(const ASN1_ITEM *it, X509_ALGOR *a, ASN1_BIT_STRING *signature,
135 ASN1_BIT_STRING *signature, void *asn, EVP_PKEY *pkey) 130 void *asn, EVP_PKEY *pkey)
136 { 131 {
137 EVP_MD_CTX ctx; 132 EVP_MD_CTX ctx;
133 const EVP_MD *type = NULL;
138 unsigned char *buf_in=NULL; 134 unsigned char *buf_in=NULL;
139 int ret= -1,inl; 135 int ret= -1,inl;
140 136
@@ -148,47 +144,25 @@ int ASN1_item_verify(const ASN1_ITEM *it, X509_ALGOR *a,
148 ASN1err(ASN1_F_ASN1_ITEM_VERIFY,ASN1_R_UNKNOWN_SIGNATURE_ALGORITHM); 144 ASN1err(ASN1_F_ASN1_ITEM_VERIFY,ASN1_R_UNKNOWN_SIGNATURE_ALGORITHM);
149 goto err; 145 goto err;
150 } 146 }
151 if (mdnid == NID_undef) 147 type=EVP_get_digestbynid(mdnid);
148 if (type == NULL)
152 { 149 {
153 if (!pkey->ameth || !pkey->ameth->item_verify) 150 ASN1err(ASN1_F_ASN1_ITEM_VERIFY,ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM);
154 { 151 goto err;
155 ASN1err(ASN1_F_ASN1_ITEM_VERIFY,ASN1_R_UNKNOWN_SIGNATURE_ALGORITHM);
156 goto err;
157 }
158 ret = pkey->ameth->item_verify(&ctx, it, asn, a,
159 signature, pkey);
160 /* Return value of 2 means carry on, anything else means we
161 * exit straight away: either a fatal error of the underlying
162 * verification routine handles all verification.
163 */
164 if (ret != 2)
165 goto err;
166 ret = -1;
167 } 152 }
168 else 153
154 /* Check public key OID matches public key type */
155 if (EVP_PKEY_type(pknid) != pkey->ameth->pkey_id)
169 { 156 {
170 const EVP_MD *type; 157 ASN1err(ASN1_F_ASN1_ITEM_VERIFY,ASN1_R_WRONG_PUBLIC_KEY_TYPE);
171 type=EVP_get_digestbynid(mdnid); 158 goto err;
172 if (type == NULL) 159 }
173 {
174 ASN1err(ASN1_F_ASN1_ITEM_VERIFY,ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM);
175 goto err;
176 }
177
178 /* Check public key OID matches public key type */
179 if (EVP_PKEY_type(pknid) != pkey->ameth->pkey_id)
180 {
181 ASN1err(ASN1_F_ASN1_ITEM_VERIFY,ASN1_R_WRONG_PUBLIC_KEY_TYPE);
182 goto err;
183 }
184
185 if (!EVP_DigestVerifyInit(&ctx, NULL, type, NULL, pkey))
186 {
187 ASN1err(ASN1_F_ASN1_ITEM_VERIFY,ERR_R_EVP_LIB);
188 ret=0;
189 goto err;
190 }
191 160
161 if (!EVP_VerifyInit_ex(&ctx,type, NULL))
162 {
163 ASN1err(ASN1_F_ASN1_ITEM_VERIFY,ERR_R_EVP_LIB);
164 ret=0;
165 goto err;
192 } 166 }
193 167
194 inl = ASN1_item_i2d(asn, &buf_in, it); 168 inl = ASN1_item_i2d(asn, &buf_in, it);
@@ -199,18 +173,13 @@ int ASN1_item_verify(const ASN1_ITEM *it, X509_ALGOR *a,
199 goto err; 173 goto err;
200 } 174 }
201 175
202 if (!EVP_DigestVerifyUpdate(&ctx,buf_in,inl)) 176 EVP_VerifyUpdate(&ctx,(unsigned char *)buf_in,inl);
203 {
204 ASN1err(ASN1_F_ASN1_ITEM_VERIFY,ERR_R_EVP_LIB);
205 ret=0;
206 goto err;
207 }
208 177
209 OPENSSL_cleanse(buf_in,(unsigned int)inl); 178 OPENSSL_cleanse(buf_in,(unsigned int)inl);
210 OPENSSL_free(buf_in); 179 OPENSSL_free(buf_in);
211 180
212 if (EVP_DigestVerifyFinal(&ctx,signature->data, 181 if (EVP_VerifyFinal(&ctx,(unsigned char *)signature->data,
213 (size_t)signature->length) <= 0) 182 (unsigned int)signature->length,pkey) <= 0)
214 { 183 {
215 ASN1err(ASN1_F_ASN1_ITEM_VERIFY,ERR_R_EVP_LIB); 184 ASN1err(ASN1_F_ASN1_ITEM_VERIFY,ERR_R_EVP_LIB);
216 ret=0; 185 ret=0;