blob: 11f7c279bea5d78d2d5fded6660ffbd86146c92c [file] [log] [blame]
Alexandre Lisionf26d3e52014-04-14 16:22:31 -04001From 3a8c7b1a08b2766a7f8a388eee14442281b4e295 Mon Sep 17 00:00:00 2001
2From: Adam Langley <agl@chromium.org>
3Date: Thu, 24 Jan 2013 16:27:14 -0500
4Subject: [PATCH 19/36] tls12_digests
5
6Fixes a bug with handling TLS 1.2 and digest functions for DSA and ECDSA
7keys.
8---
9 ssl/s3_clnt.c | 26 +++++++++++++--
10 ssl/ssl3.h | 11 +++++-
11 ssl/ssl_cert.c | 20 -----------
12 ssl/ssl_lib.c | 35 +++++++++++--------
13 ssl/ssl_locl.h | 4 +--
14 ssl/t1_lib.c | 104 ++++++++++++++++++++-------------------------------------
15 6 files changed, 94 insertions(+), 106 deletions(-)
16
17diff --git a/ssl/s3_clnt.c b/ssl/s3_clnt.c
18index c9196b3..1f3b376 100644
19--- a/ssl/s3_clnt.c
20+++ b/ssl/s3_clnt.c
21@@ -1990,12 +1990,13 @@ int ssl3_get_certificate_request(SSL *s)
22 SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,SSL_R_DATA_LENGTH_TOO_LONG);
23 goto err;
24 }
25- if ((llen & 1) || !tls1_process_sigalgs(s, p, llen))
26+ if (llen & 1)
27 {
28 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECODE_ERROR);
29 SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,SSL_R_SIGNATURE_ALGORITHMS_ERROR);
30 goto err;
31 }
32+ tls1_process_sigalgs(s, p, llen);
33 p += llen;
34 }
35
36@@ -3017,7 +3018,28 @@ int ssl3_send_client_verify(SSL *s)
37 {
38 long hdatalen = 0;
39 void *hdata;
40- const EVP_MD *md = s->cert->key->digest;
41+ const EVP_MD *md;
42+ switch (ssl_cert_type(NULL, pkey))
43+ {
44+ case SSL_PKEY_RSA_ENC:
45+ md = s->s3->digest_rsa;
46+ break;
47+ case SSL_PKEY_DSA_SIGN:
48+ md = s->s3->digest_dsa;
49+ break;
50+ case SSL_PKEY_ECC:
51+ md = s->s3->digest_ecdsa;
52+ break;
53+ default:
54+ md = NULL;
55+ }
56+ if (!md)
57+ /* Unlike with the SignatureAlgorithm extension (sent by clients),
58+ * there are no default algorithms for the CertificateRequest message
59+ * (sent by servers). However, now that we've sent a certificate
60+ * for which we don't really know what hash to use for signing, the
61+ * best we can do is try a default algorithm. */
62+ md = EVP_sha1();
63 hdatalen = BIO_get_mem_data(s->s3->handshake_buffer,
64 &hdata);
65 if (hdatalen <= 0 || !tls12_get_sigandhash(p, pkey, md))
66diff --git a/ssl/ssl3.h b/ssl/ssl3.h
67index 29098e4..3229995 100644
68--- a/ssl/ssl3.h
69+++ b/ssl/ssl3.h
70@@ -550,6 +550,16 @@ typedef struct ssl3_state_st
71 * verified Channel ID from the client: a P256 point, (x,y), where
72 * each are big-endian values. */
73 unsigned char tlsext_channel_id[64];
74+
75+ /* These point to the digest function to use for signatures made with
76+ * each type of public key. A NULL value indicates that the default
77+ * digest should be used, which is SHA1 as of TLS 1.2.
78+ *
79+ * (These should be in the tmp member, but we have to put them here to
80+ * ensure binary compatibility with earlier OpenSSL 1.0.* releases.) */
81+ const EVP_MD *digest_rsa;
82+ const EVP_MD *digest_dsa;
83+ const EVP_MD *digest_ecdsa;
84 } SSL3_STATE;
85
86 #endif
87@@ -700,4 +710,3 @@ typedef struct ssl3_state_st
88 }
89 #endif
90 #endif
91-
92diff --git a/ssl/ssl_cert.c b/ssl/ssl_cert.c
93index 5123a89..bc4150b 100644
94--- a/ssl/ssl_cert.c
95+++ b/ssl/ssl_cert.c
96@@ -160,21 +160,6 @@ int SSL_get_ex_data_X509_STORE_CTX_idx(void)
97 return ssl_x509_store_ctx_idx;
98 }
99
100-static void ssl_cert_set_default_md(CERT *cert)
101- {
102- /* Set digest values to defaults */
103-#ifndef OPENSSL_NO_DSA
104- cert->pkeys[SSL_PKEY_DSA_SIGN].digest = EVP_sha1();
105-#endif
106-#ifndef OPENSSL_NO_RSA
107- cert->pkeys[SSL_PKEY_RSA_SIGN].digest = EVP_sha1();
108- cert->pkeys[SSL_PKEY_RSA_ENC].digest = EVP_sha1();
109-#endif
110-#ifndef OPENSSL_NO_ECDSA
111- cert->pkeys[SSL_PKEY_ECC].digest = EVP_sha1();
112-#endif
113- }
114-
115 CERT *ssl_cert_new(void)
116 {
117 CERT *ret;
118@@ -189,7 +174,6 @@ CERT *ssl_cert_new(void)
119
120 ret->key= &(ret->pkeys[SSL_PKEY_RSA_ENC]);
121 ret->references=1;
122- ssl_cert_set_default_md(ret);
123 return(ret);
124 }
125
126@@ -322,10 +306,6 @@ CERT *ssl_cert_dup(CERT *cert)
127 * chain is held inside SSL_CTX */
128
129 ret->references=1;
130- /* Set digests to defaults. NB: we don't copy existing values as they
131- * will be set during handshake.
132- */
133- ssl_cert_set_default_md(ret);
134
135 return(ret);
136
137diff --git a/ssl/ssl_lib.c b/ssl/ssl_lib.c
138index 5f8b0b0..e360550 100644
139--- a/ssl/ssl_lib.c
140+++ b/ssl/ssl_lib.c
141@@ -2345,32 +2345,41 @@ EVP_PKEY *ssl_get_sign_pkey(SSL *s,const SSL_CIPHER *cipher, const EVP_MD **pmd)
142 {
143 unsigned long alg_a;
144 CERT *c;
145- int idx = -1;
146
147 alg_a = cipher->algorithm_auth;
148 c=s->cert;
149
150+ /* SHA1 is the default for all signature algorithms up to TLS 1.2,
151+ * except RSA which is handled specially in s3_srvr.c */
152+ if (pmd)
153+ *pmd = EVP_sha1();
154+
155 if ((alg_a & SSL_aDSS) &&
156- (c->pkeys[SSL_PKEY_DSA_SIGN].privatekey != NULL))
157- idx = SSL_PKEY_DSA_SIGN;
158+ (c->pkeys[SSL_PKEY_DSA_SIGN].privatekey != NULL))
159+ {
160+ if (pmd && s->s3 && s->s3->digest_dsa)
161+ *pmd = s->s3->digest_dsa;
162+ return c->pkeys[SSL_PKEY_DSA_SIGN].privatekey;
163+ }
164 else if (alg_a & SSL_aRSA)
165 {
166+ if (pmd && s->s3 && s->s3->digest_rsa)
167+ *pmd = s->s3->digest_rsa;
168 if (c->pkeys[SSL_PKEY_RSA_SIGN].privatekey != NULL)
169- idx = SSL_PKEY_RSA_SIGN;
170- else if (c->pkeys[SSL_PKEY_RSA_ENC].privatekey != NULL)
171- idx = SSL_PKEY_RSA_ENC;
172+ return c->pkeys[SSL_PKEY_RSA_SIGN].privatekey;
173+ if (c->pkeys[SSL_PKEY_RSA_ENC].privatekey != NULL)
174+ return c->pkeys[SSL_PKEY_RSA_ENC].privatekey;
175 }
176 else if ((alg_a & SSL_aECDSA) &&
177 (c->pkeys[SSL_PKEY_ECC].privatekey != NULL))
178- idx = SSL_PKEY_ECC;
179- if (idx == -1)
180 {
181- SSLerr(SSL_F_SSL_GET_SIGN_PKEY,ERR_R_INTERNAL_ERROR);
182- return(NULL);
183+ if (pmd && s->s3 && s->s3->digest_ecdsa)
184+ *pmd = s->s3->digest_ecdsa;
185+ return c->pkeys[SSL_PKEY_ECC].privatekey;
186 }
187- if (pmd)
188- *pmd = c->pkeys[idx].digest;
189- return c->pkeys[idx].privatekey;
190+
191+ SSLerr(SSL_F_SSL_GET_SIGN_PKEY,ERR_R_INTERNAL_ERROR);
192+ return(NULL);
193 }
194
195 void ssl_update_cache(SSL *s,int mode)
196diff --git a/ssl/ssl_locl.h b/ssl/ssl_locl.h
197index 6d38f0f..3e89fcb 100644
198--- a/ssl/ssl_locl.h
199+++ b/ssl/ssl_locl.h
200@@ -485,8 +485,6 @@ typedef struct cert_pkey_st
201 {
202 X509 *x509;
203 EVP_PKEY *privatekey;
204- /* Digest to use when signing */
205- const EVP_MD *digest;
206 } CERT_PKEY;
207
208 typedef struct cert_st
209@@ -1142,7 +1140,7 @@ int ssl_add_clienthello_renegotiate_ext(SSL *s, unsigned char *p, int *len,
210 int ssl_parse_clienthello_renegotiate_ext(SSL *s, unsigned char *d, int len,
211 int *al);
212 long ssl_get_algorithm2(SSL *s);
213-int tls1_process_sigalgs(SSL *s, const unsigned char *data, int dsize);
214+void tls1_process_sigalgs(SSL *s, const unsigned char *data, int dsize);
215 int tls12_get_req_sig_algs(SSL *s, unsigned char *p);
216
217 int ssl_add_clienthello_use_srtp_ext(SSL *s, unsigned char *p, int *len, int maxlen);
218diff --git a/ssl/t1_lib.c b/ssl/t1_lib.c
219index 26805e4..6af51a9 100644
220--- a/ssl/t1_lib.c
221+++ b/ssl/t1_lib.c
222@@ -897,6 +897,13 @@ int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, in
223
224 s->servername_done = 0;
225 s->tlsext_status_type = -1;
226+
227+ /* Reset TLS 1.2 digest functions to defaults because they don't carry
228+ * over to a renegotiation. */
229+ s->s3->digest_rsa = NULL;
230+ s->s3->digest_dsa = NULL;
231+ s->s3->digest_ecdsa = NULL;
232+
233 #ifndef OPENSSL_NO_NEXTPROTONEG
234 s->s3->next_proto_neg_seen = 0;
235 #endif
236@@ -1198,11 +1205,7 @@ int ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d, in
237 *al = SSL_AD_DECODE_ERROR;
238 return 0;
239 }
240- if (!tls1_process_sigalgs(s, data, dsize))
241- {
242- *al = SSL_AD_DECODE_ERROR;
243- return 0;
244- }
245+ tls1_process_sigalgs(s, data, dsize);
246 }
247 else if (type == TLSEXT_TYPE_status_request &&
248 s->version != DTLS1_VERSION && s->ctx->tlsext_status_cb)
249@@ -2354,18 +2357,6 @@ static int tls12_find_id(int nid, tls12_lookup *table, size_t tlen)
250 }
251 return -1;
252 }
253-#if 0
254-static int tls12_find_nid(int id, tls12_lookup *table, size_t tlen)
255- {
256- size_t i;
257- for (i = 0; i < tlen; i++)
258- {
259- if (table[i].id == id)
260- return table[i].nid;
261- }
262- return -1;
263- }
264-#endif
265
266 int tls12_get_sigandhash(unsigned char *p, const EVP_PKEY *pk, const EVP_MD *md)
267 {
268@@ -2384,6 +2375,8 @@ int tls12_get_sigandhash(unsigned char *p, const EVP_PKEY *pk, const EVP_MD *md)
269 return 1;
270 }
271
272+/* tls12_get_sigid returns the TLS 1.2 SignatureAlgorithm value corresponding
273+ * to the given public key, or -1 if not known. */
274 int tls12_get_sigid(const EVP_PKEY *pk)
275 {
276 return tls12_find_id(pk->type, tls12_sig,
277@@ -2403,47 +2396,49 @@ const EVP_MD *tls12_get_hash(unsigned char hash_alg)
278 return EVP_md5();
279 #endif
280 #ifndef OPENSSL_NO_SHA
281- case TLSEXT_hash_sha1:
282+ case TLSEXT_hash_sha1:
283 return EVP_sha1();
284 #endif
285 #ifndef OPENSSL_NO_SHA256
286- case TLSEXT_hash_sha224:
287+ case TLSEXT_hash_sha224:
288 return EVP_sha224();
289
290- case TLSEXT_hash_sha256:
291+ case TLSEXT_hash_sha256:
292 return EVP_sha256();
293 #endif
294 #ifndef OPENSSL_NO_SHA512
295- case TLSEXT_hash_sha384:
296+ case TLSEXT_hash_sha384:
297 return EVP_sha384();
298
299- case TLSEXT_hash_sha512:
300+ case TLSEXT_hash_sha512:
301 return EVP_sha512();
302 #endif
303- default:
304+ default:
305 return NULL;
306
307 }
308 }
309
310-/* Set preferred digest for each key type */
311-
312-int tls1_process_sigalgs(SSL *s, const unsigned char *data, int dsize)
313+/* tls1_process_sigalgs processes a signature_algorithms extension and sets the
314+ * digest functions accordingly for each key type.
315+ *
316+ * See RFC 5246, section 7.4.1.4.1.
317+ *
318+ * data: points to the content of the extension, not including type and length
319+ * headers.
320+ * dsize: the number of bytes of |data|. Must be even.
321+ */
322+void tls1_process_sigalgs(SSL *s, const unsigned char *data, int dsize)
323 {
324- int i, idx;
325- const EVP_MD *md;
326- CERT *c = s->cert;
327+ int i;
328+ const EVP_MD *md, **digest_ptr;
329 /* Extension ignored for TLS versions below 1.2 */
330 if (TLS1_get_version(s) < TLS1_2_VERSION)
331- return 1;
332- /* Should never happen */
333- if (!c)
334- return 0;
335+ return;
336
337- c->pkeys[SSL_PKEY_DSA_SIGN].digest = NULL;
338- c->pkeys[SSL_PKEY_RSA_SIGN].digest = NULL;
339- c->pkeys[SSL_PKEY_RSA_ENC].digest = NULL;
340- c->pkeys[SSL_PKEY_ECC].digest = NULL;
341+ s->s3->digest_rsa = NULL;
342+ s->s3->digest_dsa = NULL;
343+ s->s3->digest_ecdsa = NULL;
344
345 for (i = 0; i < dsize; i += 2)
346 {
347@@ -2453,56 +2448,31 @@ int tls1_process_sigalgs(SSL *s, const unsigned char *data, int dsize)
348 {
349 #ifndef OPENSSL_NO_RSA
350 case TLSEXT_signature_rsa:
351- idx = SSL_PKEY_RSA_SIGN;
352+ digest_ptr = &s->s3->digest_rsa;
353 break;
354 #endif
355 #ifndef OPENSSL_NO_DSA
356 case TLSEXT_signature_dsa:
357- idx = SSL_PKEY_DSA_SIGN;
358+ digest_ptr = &s->s3->digest_dsa;
359 break;
360 #endif
361 #ifndef OPENSSL_NO_ECDSA
362 case TLSEXT_signature_ecdsa:
363- idx = SSL_PKEY_ECC;
364+ digest_ptr = &s->s3->digest_ecdsa;
365 break;
366 #endif
367 default:
368 continue;
369 }
370
371- if (c->pkeys[idx].digest == NULL)
372+ if (*digest_ptr == NULL)
373 {
374 md = tls12_get_hash(hash_alg);
375 if (md)
376- {
377- c->pkeys[idx].digest = md;
378- if (idx == SSL_PKEY_RSA_SIGN)
379- c->pkeys[SSL_PKEY_RSA_ENC].digest = md;
380- }
381+ *digest_ptr = md;
382 }
383
384 }
385-
386-
387- /* Set any remaining keys to default values. NOTE: if alg is not
388- * supported it stays as NULL.
389- */
390-#ifndef OPENSSL_NO_DSA
391- if (!c->pkeys[SSL_PKEY_DSA_SIGN].digest)
392- c->pkeys[SSL_PKEY_DSA_SIGN].digest = EVP_sha1();
393-#endif
394-#ifndef OPENSSL_NO_RSA
395- if (!c->pkeys[SSL_PKEY_RSA_SIGN].digest)
396- {
397- c->pkeys[SSL_PKEY_RSA_SIGN].digest = EVP_sha1();
398- c->pkeys[SSL_PKEY_RSA_ENC].digest = EVP_sha1();
399- }
400-#endif
401-#ifndef OPENSSL_NO_ECDSA
402- if (!c->pkeys[SSL_PKEY_ECC].digest)
403- c->pkeys[SSL_PKEY_ECC].digest = EVP_sha1();
404-#endif
405- return 1;
406 }
407
408 #endif
409--
4101.8.2.1
411