summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbeck <>2015-01-28 04:14:31 +0000
committerbeck <>2015-01-28 04:14:31 +0000
commit36ad7f26648c87c63edaa9659d100b44b14f0ae1 (patch)
treef7e3e1ca2ec359adbc6581af16b8421550c018d8
parentc899559ffef49152f98a2504c0b30edb540fb863 (diff)
downloadopenbsd-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.c9
-rw-r--r--src/lib/libcrypto/asn1/asn1.h3
-rw-r--r--src/lib/libcrypto/asn1/x_algor.c16
-rw-r--r--src/lib/libcrypto/dsa/dsa_asn1.c16
-rw-r--r--src/lib/libcrypto/ecdsa/ecs_vrf.c16
-rw-r--r--src/lib/libcrypto/x509/x509.h3
-rw-r--r--src/lib/libcrypto/x509/x_all.c4
-rw-r--r--src/lib/libssl/src/crypto/asn1/a_verify.c9
-rw-r--r--src/lib/libssl/src/crypto/asn1/asn1.h3
-rw-r--r--src/lib/libssl/src/crypto/asn1/x_algor.c16
-rw-r--r--src/lib/libssl/src/crypto/dsa/dsa_asn1.c16
-rw-r--r--src/lib/libssl/src/crypto/ecdsa/ecs_vrf.c16
-rw-r--r--src/lib/libssl/src/crypto/x509/x509.h3
-rw-r--r--src/lib/libssl/src/crypto/x509/x_all.c4
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. */
141int
142X509_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);
192err: 200err:
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);
95err: 103err:
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);
758void X509_ALGOR_get0(ASN1_OBJECT **paobj, int *pptype, void **ppval, 758void X509_ALGOR_get0(ASN1_OBJECT **paobj, int *pptype, void **ppval,
759 X509_ALGOR *algor); 759 X509_ALGOR *algor);
760void X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md); 760void X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md);
761int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b);
761 762
762X509_NAME *X509_NAME_dup(X509_NAME *xn); 763X509_NAME *X509_NAME_dup(X509_NAME *xn);
763X509_NAME_ENTRY *X509_NAME_ENTRY_dup(X509_NAME_ENTRY *ne); 764X509_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 @@
76int 76int
77X509_verify(X509 *a, EVP_PKEY *r) 77X509_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. */
141int
142X509_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);
192err: 200err:
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);
95err: 103err:
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);
758void X509_ALGOR_get0(ASN1_OBJECT **paobj, int *pptype, void **ppval, 758void X509_ALGOR_get0(ASN1_OBJECT **paobj, int *pptype, void **ppval,
759 X509_ALGOR *algor); 759 X509_ALGOR *algor);
760void X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md); 760void X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md);
761int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b);
761 762
762X509_NAME *X509_NAME_dup(X509_NAME *xn); 763X509_NAME *X509_NAME_dup(X509_NAME *xn);
763X509_NAME_ENTRY *X509_NAME_ENTRY_dup(X509_NAME_ENTRY *ne); 764X509_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 @@
76int 76int
77X509_verify(X509 *a, EVP_PKEY *r) 77X509_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}