diff options
author | beck <> | 2015-01-28 04:14:31 +0000 |
---|---|---|
committer | beck <> | 2015-01-28 04:14:31 +0000 |
commit | 36ad7f26648c87c63edaa9659d100b44b14f0ae1 (patch) | |
tree | f7e3e1ca2ec359adbc6581af16b8421550c018d8 | |
parent | c899559ffef49152f98a2504c0b30edb540fb863 (diff) | |
download | openbsd-36ad7f26648c87c63edaa9659d100b44b14f0ae1.tar.gz openbsd-36ad7f26648c87c63edaa9659d100b44b14f0ae1.tar.bz2 openbsd-36ad7f26648c87c63edaa9659d100b44b14f0ae1.zip |
Fix a number of issues relating to algorithms in signatures, Mostly
from OpenSSL with a hint of boring and some things done here. Addresses
CVE-2014-8275 for OpenSSL fully
ok miod@ doug@
-rw-r--r-- | src/lib/libcrypto/asn1/a_verify.c | 9 | ||||
-rw-r--r-- | src/lib/libcrypto/asn1/asn1.h | 3 | ||||
-rw-r--r-- | src/lib/libcrypto/asn1/x_algor.c | 16 | ||||
-rw-r--r-- | src/lib/libcrypto/dsa/dsa_asn1.c | 16 | ||||
-rw-r--r-- | src/lib/libcrypto/ecdsa/ecs_vrf.c | 16 | ||||
-rw-r--r-- | src/lib/libcrypto/x509/x509.h | 3 | ||||
-rw-r--r-- | src/lib/libcrypto/x509/x_all.c | 4 | ||||
-rw-r--r-- | src/lib/libssl/src/crypto/asn1/a_verify.c | 9 | ||||
-rw-r--r-- | src/lib/libssl/src/crypto/asn1/asn1.h | 3 | ||||
-rw-r--r-- | src/lib/libssl/src/crypto/asn1/x_algor.c | 16 | ||||
-rw-r--r-- | src/lib/libssl/src/crypto/dsa/dsa_asn1.c | 16 | ||||
-rw-r--r-- | src/lib/libssl/src/crypto/ecdsa/ecs_vrf.c | 16 | ||||
-rw-r--r-- | src/lib/libssl/src/crypto/x509/x509.h | 3 | ||||
-rw-r--r-- | src/lib/libssl/src/crypto/x509/x_all.c | 4 |
14 files changed, 116 insertions, 18 deletions
diff --git a/src/lib/libcrypto/asn1/a_verify.c b/src/lib/libcrypto/asn1/a_verify.c index ea937cab3a..3fc79b78f6 100644 --- a/src/lib/libcrypto/asn1/a_verify.c +++ b/src/lib/libcrypto/asn1/a_verify.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: a_verify.c,v 1.20 2014/07/11 08:44:47 jsing Exp $ */ | 1 | /* $OpenBSD: a_verify.c,v 1.21 2015/01/28 04:14:31 beck Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -85,6 +85,13 @@ ASN1_item_verify(const ASN1_ITEM *it, X509_ALGOR *a, | |||
85 | return -1; | 85 | return -1; |
86 | } | 86 | } |
87 | 87 | ||
88 | if (signature->type == V_ASN1_BIT_STRING && signature->flags & 0x7) | ||
89 | { | ||
90 | ASN1err(ASN1_F_ASN1_VERIFY, | ||
91 | ASN1_R_INVALID_BIT_STRING_BITS_LEFT); | ||
92 | return -1; | ||
93 | } | ||
94 | |||
88 | EVP_MD_CTX_init(&ctx); | 95 | EVP_MD_CTX_init(&ctx); |
89 | 96 | ||
90 | /* Convert signature OID into digest and public key OIDs */ | 97 | /* Convert signature OID into digest and public key OIDs */ |
diff --git a/src/lib/libcrypto/asn1/asn1.h b/src/lib/libcrypto/asn1/asn1.h index a1cc718856..5ec89db3f0 100644 --- a/src/lib/libcrypto/asn1/asn1.h +++ b/src/lib/libcrypto/asn1/asn1.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: asn1.h,v 1.28 2014/06/12 15:49:27 deraadt Exp $ */ | 1 | /* $OpenBSD: asn1.h,v 1.29 2015/01/28 04:14:31 beck Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -1279,6 +1279,7 @@ void ERR_load_ASN1_strings(void); | |||
1279 | #define ASN1_R_ILLEGAL_TIME_VALUE 184 | 1279 | #define ASN1_R_ILLEGAL_TIME_VALUE 184 |
1280 | #define ASN1_R_INTEGER_NOT_ASCII_FORMAT 185 | 1280 | #define ASN1_R_INTEGER_NOT_ASCII_FORMAT 185 |
1281 | #define ASN1_R_INTEGER_TOO_LARGE_FOR_LONG 128 | 1281 | #define ASN1_R_INTEGER_TOO_LARGE_FOR_LONG 128 |
1282 | #define ASN1_R_INVALID_BIT_STRING_BITS_LEFT 220 | ||
1282 | #define ASN1_R_INVALID_BMPSTRING_LENGTH 129 | 1283 | #define ASN1_R_INVALID_BMPSTRING_LENGTH 129 |
1283 | #define ASN1_R_INVALID_DIGIT 130 | 1284 | #define ASN1_R_INVALID_DIGIT 130 |
1284 | #define ASN1_R_INVALID_MIME_TYPE 205 | 1285 | #define ASN1_R_INVALID_MIME_TYPE 205 |
diff --git a/src/lib/libcrypto/asn1/x_algor.c b/src/lib/libcrypto/asn1/x_algor.c index c069a5225c..71aeaaade0 100644 --- a/src/lib/libcrypto/asn1/x_algor.c +++ b/src/lib/libcrypto/asn1/x_algor.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: x_algor.c,v 1.12 2014/06/12 15:49:27 deraadt Exp $ */ | 1 | /* $OpenBSD: x_algor.c,v 1.13 2015/01/28 04:14:31 beck Exp $ */ |
2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
3 | * project 2000. | 3 | * project 2000. |
4 | */ | 4 | */ |
@@ -136,3 +136,17 @@ X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md) | |||
136 | 136 | ||
137 | X509_ALGOR_set0(alg, OBJ_nid2obj(EVP_MD_type(md)), param_type, NULL); | 137 | X509_ALGOR_set0(alg, OBJ_nid2obj(EVP_MD_type(md)), param_type, NULL); |
138 | } | 138 | } |
139 | |||
140 | /* Returns 0 if they are equal, != 0 otherwise. */ | ||
141 | int | ||
142 | X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b) | ||
143 | { | ||
144 | int rv = OBJ_cmp(a->algorithm, b->algorithm); | ||
145 | if (!rv) { | ||
146 | if (!a->parameter && !b->parameter) | ||
147 | rv = 0; | ||
148 | else | ||
149 | rv = ASN1_TYPE_cmp(a->parameter, b->parameter); | ||
150 | } | ||
151 | return(rv); | ||
152 | } | ||
diff --git a/src/lib/libcrypto/dsa/dsa_asn1.c b/src/lib/libcrypto/dsa/dsa_asn1.c index 7040b5a672..16cb1fa379 100644 --- a/src/lib/libcrypto/dsa/dsa_asn1.c +++ b/src/lib/libcrypto/dsa/dsa_asn1.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: dsa_asn1.c,v 1.13 2014/10/18 17:20:40 jsing Exp $ */ | 1 | /* $OpenBSD: dsa_asn1.c,v 1.14 2015/01/28 04:14:31 beck Exp $ */ |
2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
3 | * project 2000. | 3 | * project 2000. |
4 | */ | 4 | */ |
@@ -57,6 +57,7 @@ | |||
57 | */ | 57 | */ |
58 | 58 | ||
59 | #include <stdio.h> | 59 | #include <stdio.h> |
60 | #include <string.h> | ||
60 | 61 | ||
61 | #include <openssl/asn1.h> | 62 | #include <openssl/asn1.h> |
62 | #include <openssl/asn1t.h> | 63 | #include <openssl/asn1t.h> |
@@ -181,15 +182,26 @@ DSA_verify(int type, const unsigned char *dgst, int dgst_len, | |||
181 | const unsigned char *sigbuf, int siglen, DSA *dsa) | 182 | const unsigned char *sigbuf, int siglen, DSA *dsa) |
182 | { | 183 | { |
183 | DSA_SIG *s; | 184 | DSA_SIG *s; |
185 | unsigned char *der = NULL; | ||
186 | const unsigned char *p = sigbuf; | ||
187 | int derlen = -1; | ||
184 | int ret = -1; | 188 | int ret = -1; |
185 | 189 | ||
186 | s = DSA_SIG_new(); | 190 | s = DSA_SIG_new(); |
187 | if (s == NULL) | 191 | if (s == NULL) |
188 | return ret; | 192 | return ret; |
189 | if (d2i_DSA_SIG(&s, &sigbuf, siglen) == NULL) | 193 | if (d2i_DSA_SIG(&s, &p, siglen) == NULL) |
194 | goto err; | ||
195 | /* Ensure signature uses DER and doesn't have trailing garbage */ | ||
196 | derlen = i2d_DSA_SIG(s, &der); | ||
197 | if (derlen != siglen || memcmp(sigbuf, der, derlen)) | ||
190 | goto err; | 198 | goto err; |
191 | ret = DSA_do_verify(dgst, dgst_len, s, dsa); | 199 | ret = DSA_do_verify(dgst, dgst_len, s, dsa); |
192 | err: | 200 | err: |
201 | if (derlen > 0) { | ||
202 | explicit_bzero(der, derlen); | ||
203 | free(der); | ||
204 | } | ||
193 | DSA_SIG_free(s); | 205 | DSA_SIG_free(s); |
194 | return ret; | 206 | return ret; |
195 | } | 207 | } |
diff --git a/src/lib/libcrypto/ecdsa/ecs_vrf.c b/src/lib/libcrypto/ecdsa/ecs_vrf.c index 40a677c46a..b1e66af80a 100644 --- a/src/lib/libcrypto/ecdsa/ecs_vrf.c +++ b/src/lib/libcrypto/ecdsa/ecs_vrf.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ecs_vrf.c,v 1.3 2014/07/10 22:45:57 jsing Exp $ */ | 1 | /* $OpenBSD: ecs_vrf.c,v 1.4 2015/01/28 04:14:31 beck Exp $ */ |
2 | /* | 2 | /* |
3 | * Written by Nils Larsch for the OpenSSL project | 3 | * Written by Nils Larsch for the OpenSSL project |
4 | */ | 4 | */ |
@@ -56,6 +56,7 @@ | |||
56 | * | 56 | * |
57 | */ | 57 | */ |
58 | 58 | ||
59 | #include <string.h> | ||
59 | #include <openssl/opensslconf.h> | 60 | #include <openssl/opensslconf.h> |
60 | 61 | ||
61 | #include "ecs_locl.h" | 62 | #include "ecs_locl.h" |
@@ -86,13 +87,24 @@ int ECDSA_verify(int type, const unsigned char *dgst, int dgst_len, | |||
86 | const unsigned char *sigbuf, int sig_len, EC_KEY *eckey) | 87 | const unsigned char *sigbuf, int sig_len, EC_KEY *eckey) |
87 | { | 88 | { |
88 | ECDSA_SIG *s; | 89 | ECDSA_SIG *s; |
90 | unsigned char *der = NULL; | ||
91 | const unsigned char *p = sigbuf; | ||
92 | int derlen = -1; | ||
89 | int ret=-1; | 93 | int ret=-1; |
90 | 94 | ||
91 | s = ECDSA_SIG_new(); | 95 | s = ECDSA_SIG_new(); |
92 | if (s == NULL) return(ret); | 96 | if (s == NULL) return(ret); |
93 | if (d2i_ECDSA_SIG(&s, &sigbuf, sig_len) == NULL) goto err; | 97 | if (d2i_ECDSA_SIG(&s, &p, sig_len) == NULL) goto err; |
98 | /* Ensure signature uses DER and doesn't have trailing garbage */ | ||
99 | derlen = i2d_ECDSA_SIG(s, &der); | ||
100 | if (derlen != sig_len || memcmp(sigbuf, der, derlen)) | ||
101 | goto err; | ||
94 | ret=ECDSA_do_verify(dgst, dgst_len, s, eckey); | 102 | ret=ECDSA_do_verify(dgst, dgst_len, s, eckey); |
95 | err: | 103 | err: |
104 | if (derlen > 0) { | ||
105 | explicit_bzero(der, derlen); | ||
106 | free(der); | ||
107 | } | ||
96 | ECDSA_SIG_free(s); | 108 | ECDSA_SIG_free(s); |
97 | return(ret); | 109 | return(ret); |
98 | } | 110 | } |
diff --git a/src/lib/libcrypto/x509/x509.h b/src/lib/libcrypto/x509/x509.h index e425949675..d67a87df0b 100644 --- a/src/lib/libcrypto/x509/x509.h +++ b/src/lib/libcrypto/x509/x509.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: x509.h,v 1.20 2014/06/12 15:49:31 deraadt Exp $ */ | 1 | /* $OpenBSD: x509.h,v 1.21 2015/01/28 04:14:31 beck Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -758,6 +758,7 @@ int X509_ALGOR_set0(X509_ALGOR *alg, ASN1_OBJECT *aobj, int ptype, void *pval); | |||
758 | void X509_ALGOR_get0(ASN1_OBJECT **paobj, int *pptype, void **ppval, | 758 | void X509_ALGOR_get0(ASN1_OBJECT **paobj, int *pptype, void **ppval, |
759 | X509_ALGOR *algor); | 759 | X509_ALGOR *algor); |
760 | void X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md); | 760 | void X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md); |
761 | int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b); | ||
761 | 762 | ||
762 | X509_NAME *X509_NAME_dup(X509_NAME *xn); | 763 | X509_NAME *X509_NAME_dup(X509_NAME *xn); |
763 | X509_NAME_ENTRY *X509_NAME_ENTRY_dup(X509_NAME_ENTRY *ne); | 764 | X509_NAME_ENTRY *X509_NAME_ENTRY_dup(X509_NAME_ENTRY *ne); |
diff --git a/src/lib/libcrypto/x509/x_all.c b/src/lib/libcrypto/x509/x_all.c index edb5f520fa..28a81c14a7 100644 --- a/src/lib/libcrypto/x509/x_all.c +++ b/src/lib/libcrypto/x509/x_all.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: x_all.c,v 1.18 2014/07/11 08:44:49 jsing Exp $ */ | 1 | /* $OpenBSD: x_all.c,v 1.19 2015/01/28 04:14:31 beck Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -76,6 +76,8 @@ | |||
76 | int | 76 | int |
77 | X509_verify(X509 *a, EVP_PKEY *r) | 77 | X509_verify(X509 *a, EVP_PKEY *r) |
78 | { | 78 | { |
79 | if (X509_ALGOR_cmp(a->sig_alg, a->cert_info->signature)) | ||
80 | return 0; | ||
79 | return(ASN1_item_verify(ASN1_ITEM_rptr(X509_CINF), a->sig_alg, | 81 | return(ASN1_item_verify(ASN1_ITEM_rptr(X509_CINF), a->sig_alg, |
80 | a->signature, a->cert_info, r)); | 82 | a->signature, a->cert_info, r)); |
81 | } | 83 | } |
diff --git a/src/lib/libssl/src/crypto/asn1/a_verify.c b/src/lib/libssl/src/crypto/asn1/a_verify.c index ea937cab3a..3fc79b78f6 100644 --- a/src/lib/libssl/src/crypto/asn1/a_verify.c +++ b/src/lib/libssl/src/crypto/asn1/a_verify.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: a_verify.c,v 1.20 2014/07/11 08:44:47 jsing Exp $ */ | 1 | /* $OpenBSD: a_verify.c,v 1.21 2015/01/28 04:14:31 beck Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -85,6 +85,13 @@ ASN1_item_verify(const ASN1_ITEM *it, X509_ALGOR *a, | |||
85 | return -1; | 85 | return -1; |
86 | } | 86 | } |
87 | 87 | ||
88 | if (signature->type == V_ASN1_BIT_STRING && signature->flags & 0x7) | ||
89 | { | ||
90 | ASN1err(ASN1_F_ASN1_VERIFY, | ||
91 | ASN1_R_INVALID_BIT_STRING_BITS_LEFT); | ||
92 | return -1; | ||
93 | } | ||
94 | |||
88 | EVP_MD_CTX_init(&ctx); | 95 | EVP_MD_CTX_init(&ctx); |
89 | 96 | ||
90 | /* Convert signature OID into digest and public key OIDs */ | 97 | /* Convert signature OID into digest and public key OIDs */ |
diff --git a/src/lib/libssl/src/crypto/asn1/asn1.h b/src/lib/libssl/src/crypto/asn1/asn1.h index a1cc718856..5ec89db3f0 100644 --- a/src/lib/libssl/src/crypto/asn1/asn1.h +++ b/src/lib/libssl/src/crypto/asn1/asn1.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: asn1.h,v 1.28 2014/06/12 15:49:27 deraadt Exp $ */ | 1 | /* $OpenBSD: asn1.h,v 1.29 2015/01/28 04:14:31 beck Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -1279,6 +1279,7 @@ void ERR_load_ASN1_strings(void); | |||
1279 | #define ASN1_R_ILLEGAL_TIME_VALUE 184 | 1279 | #define ASN1_R_ILLEGAL_TIME_VALUE 184 |
1280 | #define ASN1_R_INTEGER_NOT_ASCII_FORMAT 185 | 1280 | #define ASN1_R_INTEGER_NOT_ASCII_FORMAT 185 |
1281 | #define ASN1_R_INTEGER_TOO_LARGE_FOR_LONG 128 | 1281 | #define ASN1_R_INTEGER_TOO_LARGE_FOR_LONG 128 |
1282 | #define ASN1_R_INVALID_BIT_STRING_BITS_LEFT 220 | ||
1282 | #define ASN1_R_INVALID_BMPSTRING_LENGTH 129 | 1283 | #define ASN1_R_INVALID_BMPSTRING_LENGTH 129 |
1283 | #define ASN1_R_INVALID_DIGIT 130 | 1284 | #define ASN1_R_INVALID_DIGIT 130 |
1284 | #define ASN1_R_INVALID_MIME_TYPE 205 | 1285 | #define ASN1_R_INVALID_MIME_TYPE 205 |
diff --git a/src/lib/libssl/src/crypto/asn1/x_algor.c b/src/lib/libssl/src/crypto/asn1/x_algor.c index c069a5225c..71aeaaade0 100644 --- a/src/lib/libssl/src/crypto/asn1/x_algor.c +++ b/src/lib/libssl/src/crypto/asn1/x_algor.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: x_algor.c,v 1.12 2014/06/12 15:49:27 deraadt Exp $ */ | 1 | /* $OpenBSD: x_algor.c,v 1.13 2015/01/28 04:14:31 beck Exp $ */ |
2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
3 | * project 2000. | 3 | * project 2000. |
4 | */ | 4 | */ |
@@ -136,3 +136,17 @@ X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md) | |||
136 | 136 | ||
137 | X509_ALGOR_set0(alg, OBJ_nid2obj(EVP_MD_type(md)), param_type, NULL); | 137 | X509_ALGOR_set0(alg, OBJ_nid2obj(EVP_MD_type(md)), param_type, NULL); |
138 | } | 138 | } |
139 | |||
140 | /* Returns 0 if they are equal, != 0 otherwise. */ | ||
141 | int | ||
142 | X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b) | ||
143 | { | ||
144 | int rv = OBJ_cmp(a->algorithm, b->algorithm); | ||
145 | if (!rv) { | ||
146 | if (!a->parameter && !b->parameter) | ||
147 | rv = 0; | ||
148 | else | ||
149 | rv = ASN1_TYPE_cmp(a->parameter, b->parameter); | ||
150 | } | ||
151 | return(rv); | ||
152 | } | ||
diff --git a/src/lib/libssl/src/crypto/dsa/dsa_asn1.c b/src/lib/libssl/src/crypto/dsa/dsa_asn1.c index 7040b5a672..16cb1fa379 100644 --- a/src/lib/libssl/src/crypto/dsa/dsa_asn1.c +++ b/src/lib/libssl/src/crypto/dsa/dsa_asn1.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: dsa_asn1.c,v 1.13 2014/10/18 17:20:40 jsing Exp $ */ | 1 | /* $OpenBSD: dsa_asn1.c,v 1.14 2015/01/28 04:14:31 beck Exp $ */ |
2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
3 | * project 2000. | 3 | * project 2000. |
4 | */ | 4 | */ |
@@ -57,6 +57,7 @@ | |||
57 | */ | 57 | */ |
58 | 58 | ||
59 | #include <stdio.h> | 59 | #include <stdio.h> |
60 | #include <string.h> | ||
60 | 61 | ||
61 | #include <openssl/asn1.h> | 62 | #include <openssl/asn1.h> |
62 | #include <openssl/asn1t.h> | 63 | #include <openssl/asn1t.h> |
@@ -181,15 +182,26 @@ DSA_verify(int type, const unsigned char *dgst, int dgst_len, | |||
181 | const unsigned char *sigbuf, int siglen, DSA *dsa) | 182 | const unsigned char *sigbuf, int siglen, DSA *dsa) |
182 | { | 183 | { |
183 | DSA_SIG *s; | 184 | DSA_SIG *s; |
185 | unsigned char *der = NULL; | ||
186 | const unsigned char *p = sigbuf; | ||
187 | int derlen = -1; | ||
184 | int ret = -1; | 188 | int ret = -1; |
185 | 189 | ||
186 | s = DSA_SIG_new(); | 190 | s = DSA_SIG_new(); |
187 | if (s == NULL) | 191 | if (s == NULL) |
188 | return ret; | 192 | return ret; |
189 | if (d2i_DSA_SIG(&s, &sigbuf, siglen) == NULL) | 193 | if (d2i_DSA_SIG(&s, &p, siglen) == NULL) |
194 | goto err; | ||
195 | /* Ensure signature uses DER and doesn't have trailing garbage */ | ||
196 | derlen = i2d_DSA_SIG(s, &der); | ||
197 | if (derlen != siglen || memcmp(sigbuf, der, derlen)) | ||
190 | goto err; | 198 | goto err; |
191 | ret = DSA_do_verify(dgst, dgst_len, s, dsa); | 199 | ret = DSA_do_verify(dgst, dgst_len, s, dsa); |
192 | err: | 200 | err: |
201 | if (derlen > 0) { | ||
202 | explicit_bzero(der, derlen); | ||
203 | free(der); | ||
204 | } | ||
193 | DSA_SIG_free(s); | 205 | DSA_SIG_free(s); |
194 | return ret; | 206 | return ret; |
195 | } | 207 | } |
diff --git a/src/lib/libssl/src/crypto/ecdsa/ecs_vrf.c b/src/lib/libssl/src/crypto/ecdsa/ecs_vrf.c index 40a677c46a..b1e66af80a 100644 --- a/src/lib/libssl/src/crypto/ecdsa/ecs_vrf.c +++ b/src/lib/libssl/src/crypto/ecdsa/ecs_vrf.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ecs_vrf.c,v 1.3 2014/07/10 22:45:57 jsing Exp $ */ | 1 | /* $OpenBSD: ecs_vrf.c,v 1.4 2015/01/28 04:14:31 beck Exp $ */ |
2 | /* | 2 | /* |
3 | * Written by Nils Larsch for the OpenSSL project | 3 | * Written by Nils Larsch for the OpenSSL project |
4 | */ | 4 | */ |
@@ -56,6 +56,7 @@ | |||
56 | * | 56 | * |
57 | */ | 57 | */ |
58 | 58 | ||
59 | #include <string.h> | ||
59 | #include <openssl/opensslconf.h> | 60 | #include <openssl/opensslconf.h> |
60 | 61 | ||
61 | #include "ecs_locl.h" | 62 | #include "ecs_locl.h" |
@@ -86,13 +87,24 @@ int ECDSA_verify(int type, const unsigned char *dgst, int dgst_len, | |||
86 | const unsigned char *sigbuf, int sig_len, EC_KEY *eckey) | 87 | const unsigned char *sigbuf, int sig_len, EC_KEY *eckey) |
87 | { | 88 | { |
88 | ECDSA_SIG *s; | 89 | ECDSA_SIG *s; |
90 | unsigned char *der = NULL; | ||
91 | const unsigned char *p = sigbuf; | ||
92 | int derlen = -1; | ||
89 | int ret=-1; | 93 | int ret=-1; |
90 | 94 | ||
91 | s = ECDSA_SIG_new(); | 95 | s = ECDSA_SIG_new(); |
92 | if (s == NULL) return(ret); | 96 | if (s == NULL) return(ret); |
93 | if (d2i_ECDSA_SIG(&s, &sigbuf, sig_len) == NULL) goto err; | 97 | if (d2i_ECDSA_SIG(&s, &p, sig_len) == NULL) goto err; |
98 | /* Ensure signature uses DER and doesn't have trailing garbage */ | ||
99 | derlen = i2d_ECDSA_SIG(s, &der); | ||
100 | if (derlen != sig_len || memcmp(sigbuf, der, derlen)) | ||
101 | goto err; | ||
94 | ret=ECDSA_do_verify(dgst, dgst_len, s, eckey); | 102 | ret=ECDSA_do_verify(dgst, dgst_len, s, eckey); |
95 | err: | 103 | err: |
104 | if (derlen > 0) { | ||
105 | explicit_bzero(der, derlen); | ||
106 | free(der); | ||
107 | } | ||
96 | ECDSA_SIG_free(s); | 108 | ECDSA_SIG_free(s); |
97 | return(ret); | 109 | return(ret); |
98 | } | 110 | } |
diff --git a/src/lib/libssl/src/crypto/x509/x509.h b/src/lib/libssl/src/crypto/x509/x509.h index e425949675..d67a87df0b 100644 --- a/src/lib/libssl/src/crypto/x509/x509.h +++ b/src/lib/libssl/src/crypto/x509/x509.h | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: x509.h,v 1.20 2014/06/12 15:49:31 deraadt Exp $ */ | 1 | /* $OpenBSD: x509.h,v 1.21 2015/01/28 04:14:31 beck Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -758,6 +758,7 @@ int X509_ALGOR_set0(X509_ALGOR *alg, ASN1_OBJECT *aobj, int ptype, void *pval); | |||
758 | void X509_ALGOR_get0(ASN1_OBJECT **paobj, int *pptype, void **ppval, | 758 | void X509_ALGOR_get0(ASN1_OBJECT **paobj, int *pptype, void **ppval, |
759 | X509_ALGOR *algor); | 759 | X509_ALGOR *algor); |
760 | void X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md); | 760 | void X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md); |
761 | int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b); | ||
761 | 762 | ||
762 | X509_NAME *X509_NAME_dup(X509_NAME *xn); | 763 | X509_NAME *X509_NAME_dup(X509_NAME *xn); |
763 | X509_NAME_ENTRY *X509_NAME_ENTRY_dup(X509_NAME_ENTRY *ne); | 764 | X509_NAME_ENTRY *X509_NAME_ENTRY_dup(X509_NAME_ENTRY *ne); |
diff --git a/src/lib/libssl/src/crypto/x509/x_all.c b/src/lib/libssl/src/crypto/x509/x_all.c index edb5f520fa..28a81c14a7 100644 --- a/src/lib/libssl/src/crypto/x509/x_all.c +++ b/src/lib/libssl/src/crypto/x509/x_all.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: x_all.c,v 1.18 2014/07/11 08:44:49 jsing Exp $ */ | 1 | /* $OpenBSD: x_all.c,v 1.19 2015/01/28 04:14:31 beck Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -76,6 +76,8 @@ | |||
76 | int | 76 | int |
77 | X509_verify(X509 *a, EVP_PKEY *r) | 77 | X509_verify(X509 *a, EVP_PKEY *r) |
78 | { | 78 | { |
79 | if (X509_ALGOR_cmp(a->sig_alg, a->cert_info->signature)) | ||
80 | return 0; | ||
79 | return(ASN1_item_verify(ASN1_ITEM_rptr(X509_CINF), a->sig_alg, | 81 | return(ASN1_item_verify(ASN1_ITEM_rptr(X509_CINF), a->sig_alg, |
80 | a->signature, a->cert_info, r)); | 82 | a->signature, a->cert_info, r)); |
81 | } | 83 | } |