diff options
Diffstat (limited to 'src')
| -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 | } |
