summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormarkus <>2013-02-14 15:11:44 +0000
committermarkus <>2013-02-14 15:11:44 +0000
commit9822d929c08eed1446dc09464293449326730af2 (patch)
treecd2035e8f8ac3d4ade1ee779dcaabbe671c2003a
parent692574e51be904b35cfcb2609fd641e93dc8cef7 (diff)
downloadopenbsd-9822d929c08eed1446dc09464293449326730af2.tar.gz
openbsd-9822d929c08eed1446dc09464293449326730af2.tar.bz2
openbsd-9822d929c08eed1446dc09464293449326730af2.zip
cherry pick bugfixes for http://www.openssl.org/news/secadv_20130205.txt
from the openssl git (changes between openssl 1.0.1c and 1.0.1d). ok djm@
-rw-r--r--src/lib/libcrypto/asn1/a_verify.c6
-rw-r--r--src/lib/libcrypto/bn/bn_word.c25
-rw-r--r--src/lib/libcrypto/evp/e_aes_cbc_hmac_sha1.c216
-rw-r--r--src/lib/libcrypto/ocsp/ocsp_vfy.c9
-rw-r--r--src/lib/libcrypto/rsa/rsa_oaep.c2
-rw-r--r--src/lib/libssl/d1_enc.c59
-rw-r--r--src/lib/libssl/d1_pkt.c91
-rw-r--r--src/lib/libssl/s3_both.c2
-rw-r--r--src/lib/libssl/s3_cbc.c790
-rw-r--r--src/lib/libssl/s3_pkt.c98
-rw-r--r--src/lib/libssl/src/crypto/asn1/a_verify.c6
-rw-r--r--src/lib/libssl/src/crypto/bn/bn_word.c25
-rw-r--r--src/lib/libssl/src/crypto/evp/e_aes_cbc_hmac_sha1.c216
-rw-r--r--src/lib/libssl/src/crypto/ocsp/ocsp_vfy.c9
-rw-r--r--src/lib/libssl/src/crypto/rsa/rsa_oaep.c2
-rw-r--r--src/lib/libssl/src/ssl/d1_enc.c59
-rw-r--r--src/lib/libssl/src/ssl/d1_pkt.c91
-rw-r--r--src/lib/libssl/src/ssl/s2_clnt.c2
-rw-r--r--src/lib/libssl/src/ssl/s2_pkt.c3
-rw-r--r--src/lib/libssl/src/ssl/s3_both.c2
-rw-r--r--src/lib/libssl/src/ssl/s3_cbc.c790
-rw-r--r--src/lib/libssl/src/ssl/s3_enc.c123
-rw-r--r--src/lib/libssl/src/ssl/s3_pkt.c98
-rw-r--r--src/lib/libssl/src/ssl/ssl_locl.h38
-rw-r--r--src/lib/libssl/src/ssl/t1_enc.c157
-rw-r--r--src/lib/libssl/src/ssl/t1_lib.c2
-rw-r--r--src/lib/libssl/ssl/Makefile3
-rw-r--r--src/lib/libssl/ssl_locl.h38
-rw-r--r--src/lib/libssl/t1_enc.c157
-rw-r--r--src/lib/libssl/t1_lib.c2
30 files changed, 2564 insertions, 557 deletions
diff --git a/src/lib/libcrypto/asn1/a_verify.c b/src/lib/libcrypto/asn1/a_verify.c
index 432722e409..fc84cd3d19 100644
--- a/src/lib/libcrypto/asn1/a_verify.c
+++ b/src/lib/libcrypto/asn1/a_verify.c
@@ -140,6 +140,12 @@ int ASN1_item_verify(const ASN1_ITEM *it, X509_ALGOR *a,
140 140
141 int mdnid, pknid; 141 int mdnid, pknid;
142 142
143 if (!pkey)
144 {
145 ASN1err(ASN1_F_ASN1_ITEM_VERIFY, ERR_R_PASSED_NULL_PARAMETER);
146 return -1;
147 }
148
143 EVP_MD_CTX_init(&ctx); 149 EVP_MD_CTX_init(&ctx);
144 150
145 /* Convert signature OID into digest and public key OIDs */ 151 /* Convert signature OID into digest and public key OIDs */
diff --git a/src/lib/libcrypto/bn/bn_word.c b/src/lib/libcrypto/bn/bn_word.c
index ee7b87c45c..de83a15b99 100644
--- a/src/lib/libcrypto/bn/bn_word.c
+++ b/src/lib/libcrypto/bn/bn_word.c
@@ -144,26 +144,17 @@ int BN_add_word(BIGNUM *a, BN_ULONG w)
144 a->neg=!(a->neg); 144 a->neg=!(a->neg);
145 return(i); 145 return(i);
146 } 146 }
147 /* Only expand (and risk failing) if it's possibly necessary */ 147 for (i=0;w!=0 && i<a->top;i++)
148 if (((BN_ULONG)(a->d[a->top - 1] + 1) == 0) &&
149 (bn_wexpand(a,a->top+1) == NULL))
150 return(0);
151 i=0;
152 for (;;)
153 { 148 {
154 if (i >= a->top) 149 a->d[i] = l = (a->d[i]+w)&BN_MASK2;
155 l=w; 150 w = (w>l)?1:0;
156 else
157 l=(a->d[i]+w)&BN_MASK2;
158 a->d[i]=l;
159 if (w > l)
160 w=1;
161 else
162 break;
163 i++;
164 } 151 }
165 if (i >= a->top) 152 if (w && i==a->top)
153 {
154 if (bn_wexpand(a,a->top+1) == NULL) return 0;
166 a->top++; 155 a->top++;
156 a->d[i]=w;
157 }
167 bn_check_top(a); 158 bn_check_top(a);
168 return(1); 159 return(1);
169 } 160 }
diff --git a/src/lib/libcrypto/evp/e_aes_cbc_hmac_sha1.c b/src/lib/libcrypto/evp/e_aes_cbc_hmac_sha1.c
index 710fb79baf..483e04b605 100644
--- a/src/lib/libcrypto/evp/e_aes_cbc_hmac_sha1.c
+++ b/src/lib/libcrypto/evp/e_aes_cbc_hmac_sha1.c
@@ -1,5 +1,5 @@
1/* ==================================================================== 1/* ====================================================================
2 * Copyright (c) 2011 The OpenSSL Project. All rights reserved. 2 * Copyright (c) 2011-2013 The OpenSSL Project. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
@@ -90,6 +90,10 @@ typedef struct
90 defined(_M_AMD64) || defined(_M_X64) || \ 90 defined(_M_AMD64) || defined(_M_X64) || \
91 defined(__INTEL__) ) 91 defined(__INTEL__) )
92 92
93#if defined(__GNUC__) && __GNUC__>=2 && !defined(PEDANTIC)
94# define BSWAP(x) ({ unsigned int r=(x); asm ("bswapl %0":"=r"(r):"0"(r)); r; })
95#endif
96
93extern unsigned int OPENSSL_ia32cap_P[2]; 97extern unsigned int OPENSSL_ia32cap_P[2];
94#define AESNI_CAPABLE (1<<(57-32)) 98#define AESNI_CAPABLE (1<<(57-32))
95 99
@@ -167,6 +171,9 @@ static void sha1_update(SHA_CTX *c,const void *data,size_t len)
167 SHA1_Update(c,ptr,res); 171 SHA1_Update(c,ptr,res);
168} 172}
169 173
174#ifdef SHA1_Update
175#undef SHA1_Update
176#endif
170#define SHA1_Update sha1_update 177#define SHA1_Update sha1_update
171 178
172static int aesni_cbc_hmac_sha1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, 179static int aesni_cbc_hmac_sha1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
@@ -184,6 +191,8 @@ static int aesni_cbc_hmac_sha1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
184 sha_off = SHA_CBLOCK-key->md.num; 191 sha_off = SHA_CBLOCK-key->md.num;
185#endif 192#endif
186 193
194 key->payload_length = NO_PAYLOAD_LENGTH;
195
187 if (len%AES_BLOCK_SIZE) return 0; 196 if (len%AES_BLOCK_SIZE) return 0;
188 197
189 if (ctx->encrypt) { 198 if (ctx->encrypt) {
@@ -234,47 +243,210 @@ static int aesni_cbc_hmac_sha1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
234 &key->ks,ctx->iv,1); 243 &key->ks,ctx->iv,1);
235 } 244 }
236 } else { 245 } else {
237 unsigned char mac[SHA_DIGEST_LENGTH]; 246 union { unsigned int u[SHA_DIGEST_LENGTH/sizeof(unsigned int)];
247 unsigned char c[32+SHA_DIGEST_LENGTH]; } mac, *pmac;
248
249 /* arrange cache line alignment */
250 pmac = (void *)(((size_t)mac.c+31)&((size_t)0-32));
238 251
239 /* decrypt HMAC|padding at once */ 252 /* decrypt HMAC|padding at once */
240 aesni_cbc_encrypt(in,out,len, 253 aesni_cbc_encrypt(in,out,len,
241 &key->ks,ctx->iv,0); 254 &key->ks,ctx->iv,0);
242 255
243 if (plen) { /* "TLS" mode of operation */ 256 if (plen) { /* "TLS" mode of operation */
244 /* figure out payload length */ 257 size_t inp_len, mask, j, i;
245 if (len<(size_t)(out[len-1]+1+SHA_DIGEST_LENGTH)) 258 unsigned int res, maxpad, pad, bitlen;
246 return 0; 259 int ret = 1;
247 260 union { unsigned int u[SHA_LBLOCK];
248 len -= (out[len-1]+1+SHA_DIGEST_LENGTH); 261 unsigned char c[SHA_CBLOCK]; }
262 *data = (void *)key->md.data;
249 263
250 if ((key->aux.tls_aad[plen-4]<<8|key->aux.tls_aad[plen-3]) 264 if ((key->aux.tls_aad[plen-4]<<8|key->aux.tls_aad[plen-3])
251 >= TLS1_1_VERSION) { 265 >= TLS1_1_VERSION)
252 len -= AES_BLOCK_SIZE;
253 iv = AES_BLOCK_SIZE; 266 iv = AES_BLOCK_SIZE;
254 }
255 267
256 key->aux.tls_aad[plen-2] = len>>8; 268 if (len<(iv+SHA_DIGEST_LENGTH+1))
257 key->aux.tls_aad[plen-1] = len; 269 return 0;
270
271 /* omit explicit iv */
272 out += iv;
273 len -= iv;
274
275 /* figure out payload length */
276 pad = out[len-1];
277 maxpad = len-(SHA_DIGEST_LENGTH+1);
278 maxpad |= (255-maxpad)>>(sizeof(maxpad)*8-8);
279 maxpad &= 255;
280
281 inp_len = len - (SHA_DIGEST_LENGTH+pad+1);
282 mask = (0-((inp_len-len)>>(sizeof(inp_len)*8-1)));
283 inp_len &= mask;
284 ret &= (int)mask;
285
286 key->aux.tls_aad[plen-2] = inp_len>>8;
287 key->aux.tls_aad[plen-1] = inp_len;
258 288
259 /* calculate HMAC and verify it */ 289 /* calculate HMAC */
260 key->md = key->head; 290 key->md = key->head;
261 SHA1_Update(&key->md,key->aux.tls_aad,plen); 291 SHA1_Update(&key->md,key->aux.tls_aad,plen);
262 SHA1_Update(&key->md,out+iv,len);
263 SHA1_Final(mac,&key->md);
264 292
293#if 1
294 len -= SHA_DIGEST_LENGTH; /* amend mac */
295 if (len>=(256+SHA_CBLOCK)) {
296 j = (len-(256+SHA_CBLOCK))&(0-SHA_CBLOCK);
297 j += SHA_CBLOCK-key->md.num;
298 SHA1_Update(&key->md,out,j);
299 out += j;
300 len -= j;
301 inp_len -= j;
302 }
303
304 /* but pretend as if we hashed padded payload */
305 bitlen = key->md.Nl+(inp_len<<3); /* at most 18 bits */
306#ifdef BSWAP
307 bitlen = BSWAP(bitlen);
308#else
309 mac.c[0] = 0;
310 mac.c[1] = (unsigned char)(bitlen>>16);
311 mac.c[2] = (unsigned char)(bitlen>>8);
312 mac.c[3] = (unsigned char)bitlen;
313 bitlen = mac.u[0];
314#endif
315
316 pmac->u[0]=0;
317 pmac->u[1]=0;
318 pmac->u[2]=0;
319 pmac->u[3]=0;
320 pmac->u[4]=0;
321
322 for (res=key->md.num, j=0;j<len;j++) {
323 size_t c = out[j];
324 mask = (j-inp_len)>>(sizeof(j)*8-8);
325 c &= mask;
326 c |= 0x80&~mask&~((inp_len-j)>>(sizeof(j)*8-8));
327 data->c[res++]=(unsigned char)c;
328
329 if (res!=SHA_CBLOCK) continue;
330
331 mask = 0-((inp_len+8-j)>>(sizeof(j)*8-1));
332 data->u[SHA_LBLOCK-1] |= bitlen&mask;
333 sha1_block_data_order(&key->md,data,1);
334 mask &= 0-((j-inp_len-73)>>(sizeof(j)*8-1));
335 pmac->u[0] |= key->md.h0 & mask;
336 pmac->u[1] |= key->md.h1 & mask;
337 pmac->u[2] |= key->md.h2 & mask;
338 pmac->u[3] |= key->md.h3 & mask;
339 pmac->u[4] |= key->md.h4 & mask;
340 res=0;
341 }
342
343 for(i=res;i<SHA_CBLOCK;i++,j++) data->c[i]=0;
344
345 if (res>SHA_CBLOCK-8) {
346 mask = 0-((inp_len+8-j)>>(sizeof(j)*8-1));
347 data->u[SHA_LBLOCK-1] |= bitlen&mask;
348 sha1_block_data_order(&key->md,data,1);
349 mask &= 0-((j-inp_len-73)>>(sizeof(j)*8-1));
350 pmac->u[0] |= key->md.h0 & mask;
351 pmac->u[1] |= key->md.h1 & mask;
352 pmac->u[2] |= key->md.h2 & mask;
353 pmac->u[3] |= key->md.h3 & mask;
354 pmac->u[4] |= key->md.h4 & mask;
355
356 memset(data,0,SHA_CBLOCK);
357 j+=64;
358 }
359 data->u[SHA_LBLOCK-1] = bitlen;
360 sha1_block_data_order(&key->md,data,1);
361 mask = 0-((j-inp_len-73)>>(sizeof(j)*8-1));
362 pmac->u[0] |= key->md.h0 & mask;
363 pmac->u[1] |= key->md.h1 & mask;
364 pmac->u[2] |= key->md.h2 & mask;
365 pmac->u[3] |= key->md.h3 & mask;
366 pmac->u[4] |= key->md.h4 & mask;
367
368#ifdef BSWAP
369 pmac->u[0] = BSWAP(pmac->u[0]);
370 pmac->u[1] = BSWAP(pmac->u[1]);
371 pmac->u[2] = BSWAP(pmac->u[2]);
372 pmac->u[3] = BSWAP(pmac->u[3]);
373 pmac->u[4] = BSWAP(pmac->u[4]);
374#else
375 for (i=0;i<5;i++) {
376 res = pmac->u[i];
377 pmac->c[4*i+0]=(unsigned char)(res>>24);
378 pmac->c[4*i+1]=(unsigned char)(res>>16);
379 pmac->c[4*i+2]=(unsigned char)(res>>8);
380 pmac->c[4*i+3]=(unsigned char)res;
381 }
382#endif
383 len += SHA_DIGEST_LENGTH;
384#else
385 SHA1_Update(&key->md,out,inp_len);
386 res = key->md.num;
387 SHA1_Final(pmac->c,&key->md);
388
389 {
390 unsigned int inp_blocks, pad_blocks;
391
392 /* but pretend as if we hashed padded payload */
393 inp_blocks = 1+((SHA_CBLOCK-9-res)>>(sizeof(res)*8-1));
394 res += (unsigned int)(len-inp_len);
395 pad_blocks = res / SHA_CBLOCK;
396 res %= SHA_CBLOCK;
397 pad_blocks += 1+((SHA_CBLOCK-9-res)>>(sizeof(res)*8-1));
398 for (;inp_blocks<pad_blocks;inp_blocks++)
399 sha1_block_data_order(&key->md,data,1);
400 }
401#endif
265 key->md = key->tail; 402 key->md = key->tail;
266 SHA1_Update(&key->md,mac,SHA_DIGEST_LENGTH); 403 SHA1_Update(&key->md,pmac->c,SHA_DIGEST_LENGTH);
267 SHA1_Final(mac,&key->md); 404 SHA1_Final(pmac->c,&key->md);
268 405
269 if (memcmp(out+iv+len,mac,SHA_DIGEST_LENGTH)) 406 /* verify HMAC */
270 return 0; 407 out += inp_len;
408 len -= inp_len;
409#if 1
410 {
411 unsigned char *p = out+len-1-maxpad-SHA_DIGEST_LENGTH;
412 size_t off = out-p;
413 unsigned int c, cmask;
414
415 maxpad += SHA_DIGEST_LENGTH;
416 for (res=0,i=0,j=0;j<maxpad;j++) {
417 c = p[j];
418 cmask = ((int)(j-off-SHA_DIGEST_LENGTH))>>(sizeof(int)*8-1);
419 res |= (c^pad)&~cmask; /* ... and padding */
420 cmask &= ((int)(off-1-j))>>(sizeof(int)*8-1);
421 res |= (c^pmac->c[i])&cmask;
422 i += 1&cmask;
423 }
424 maxpad -= SHA_DIGEST_LENGTH;
425
426 res = 0-((0-res)>>(sizeof(res)*8-1));
427 ret &= (int)~res;
428 }
429#else
430 for (res=0,i=0;i<SHA_DIGEST_LENGTH;i++)
431 res |= out[i]^pmac->c[i];
432 res = 0-((0-res)>>(sizeof(res)*8-1));
433 ret &= (int)~res;
434
435 /* verify padding */
436 pad = (pad&~res) | (maxpad&res);
437 out = out+len-1-pad;
438 for (res=0,i=0;i<pad;i++)
439 res |= out[i]^pad;
440
441 res = (0-res)>>(sizeof(res)*8-1);
442 ret &= (int)~res;
443#endif
444 return ret;
271 } else { 445 } else {
272 SHA1_Update(&key->md,out,len); 446 SHA1_Update(&key->md,out,len);
273 } 447 }
274 } 448 }
275 449
276 key->payload_length = NO_PAYLOAD_LENGTH;
277
278 return 1; 450 return 1;
279 } 451 }
280 452
@@ -309,6 +481,8 @@ static int aesni_cbc_hmac_sha1_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void
309 SHA1_Init(&key->tail); 481 SHA1_Init(&key->tail);
310 SHA1_Update(&key->tail,hmac_key,sizeof(hmac_key)); 482 SHA1_Update(&key->tail,hmac_key,sizeof(hmac_key));
311 483
484 OPENSSL_cleanse(hmac_key,sizeof(hmac_key));
485
312 return 1; 486 return 1;
313 } 487 }
314 case EVP_CTRL_AEAD_TLS1_AAD: 488 case EVP_CTRL_AEAD_TLS1_AAD:
diff --git a/src/lib/libcrypto/ocsp/ocsp_vfy.c b/src/lib/libcrypto/ocsp/ocsp_vfy.c
index 415d67e61c..91a45c9133 100644
--- a/src/lib/libcrypto/ocsp/ocsp_vfy.c
+++ b/src/lib/libcrypto/ocsp/ocsp_vfy.c
@@ -91,9 +91,12 @@ int OCSP_basic_verify(OCSP_BASICRESP *bs, STACK_OF(X509) *certs,
91 { 91 {
92 EVP_PKEY *skey; 92 EVP_PKEY *skey;
93 skey = X509_get_pubkey(signer); 93 skey = X509_get_pubkey(signer);
94 ret = OCSP_BASICRESP_verify(bs, skey, 0); 94 if (skey)
95 EVP_PKEY_free(skey); 95 {
96 if(ret <= 0) 96 ret = OCSP_BASICRESP_verify(bs, skey, 0);
97 EVP_PKEY_free(skey);
98 }
99 if(!skey || ret <= 0)
97 { 100 {
98 OCSPerr(OCSP_F_OCSP_BASIC_VERIFY, OCSP_R_SIGNATURE_FAILURE); 101 OCSPerr(OCSP_F_OCSP_BASIC_VERIFY, OCSP_R_SIGNATURE_FAILURE);
99 goto end; 102 goto end;
diff --git a/src/lib/libcrypto/rsa/rsa_oaep.c b/src/lib/libcrypto/rsa/rsa_oaep.c
index 553d212ebe..e08ac151ff 100644
--- a/src/lib/libcrypto/rsa/rsa_oaep.c
+++ b/src/lib/libcrypto/rsa/rsa_oaep.c
@@ -149,7 +149,7 @@ int RSA_padding_check_PKCS1_OAEP(unsigned char *to, int tlen,
149 if (!EVP_Digest((void *)param, plen, phash, NULL, EVP_sha1(), NULL)) 149 if (!EVP_Digest((void *)param, plen, phash, NULL, EVP_sha1(), NULL))
150 return -1; 150 return -1;
151 151
152 if (memcmp(db, phash, SHA_DIGEST_LENGTH) != 0 || bad) 152 if (timingsafe_bcmp(db, phash, SHA_DIGEST_LENGTH) != 0 || bad)
153 goto decoding_err; 153 goto decoding_err;
154 else 154 else
155 { 155 {
diff --git a/src/lib/libssl/d1_enc.c b/src/lib/libssl/d1_enc.c
index 07a5e97ce5..712c4647f2 100644
--- a/src/lib/libssl/d1_enc.c
+++ b/src/lib/libssl/d1_enc.c
@@ -126,20 +126,28 @@
126#include <openssl/des.h> 126#include <openssl/des.h>
127#endif 127#endif
128 128
129/* dtls1_enc encrypts/decrypts the record in |s->wrec| / |s->rrec|, respectively.
130 *
131 * Returns:
132 * 0: (in non-constant time) if the record is publically invalid (i.e. too
133 * short etc).
134 * 1: if the record's padding is valid / the encryption was successful.
135 * -1: if the record's padding/AEAD-authenticator is invalid or, if sending,
136 * an internal error occured. */
129int dtls1_enc(SSL *s, int send) 137int dtls1_enc(SSL *s, int send)
130 { 138 {
131 SSL3_RECORD *rec; 139 SSL3_RECORD *rec;
132 EVP_CIPHER_CTX *ds; 140 EVP_CIPHER_CTX *ds;
133 unsigned long l; 141 unsigned long l;
134 int bs,i,ii,j,k,n=0; 142 int bs,i,j,k,mac_size=0;
135 const EVP_CIPHER *enc; 143 const EVP_CIPHER *enc;
136 144
137 if (send) 145 if (send)
138 { 146 {
139 if (EVP_MD_CTX_md(s->write_hash)) 147 if (EVP_MD_CTX_md(s->write_hash))
140 { 148 {
141 n=EVP_MD_CTX_size(s->write_hash); 149 mac_size=EVP_MD_CTX_size(s->write_hash);
142 if (n < 0) 150 if (mac_size < 0)
143 return -1; 151 return -1;
144 } 152 }
145 ds=s->enc_write_ctx; 153 ds=s->enc_write_ctx;
@@ -164,9 +172,8 @@ int dtls1_enc(SSL *s, int send)
164 { 172 {
165 if (EVP_MD_CTX_md(s->read_hash)) 173 if (EVP_MD_CTX_md(s->read_hash))
166 { 174 {
167 n=EVP_MD_CTX_size(s->read_hash); 175 mac_size=EVP_MD_CTX_size(s->read_hash);
168 if (n < 0) 176 OPENSSL_assert(mac_size >= 0);
169 return -1;
170 } 177 }
171 ds=s->enc_read_ctx; 178 ds=s->enc_read_ctx;
172 rec= &(s->s3->rrec); 179 rec= &(s->s3->rrec);
@@ -231,7 +238,7 @@ int dtls1_enc(SSL *s, int send)
231 if (!send) 238 if (!send)
232 { 239 {
233 if (l == 0 || l%bs != 0) 240 if (l == 0 || l%bs != 0)
234 return -1; 241 return 0;
235 } 242 }
236 243
237 EVP_Cipher(ds,rec->data,rec->input,l); 244 EVP_Cipher(ds,rec->data,rec->input,l);
@@ -246,43 +253,7 @@ int dtls1_enc(SSL *s, int send)
246#endif /* KSSL_DEBUG */ 253#endif /* KSSL_DEBUG */
247 254
248 if ((bs != 1) && !send) 255 if ((bs != 1) && !send)
249 { 256 return tls1_cbc_remove_padding(s, rec, bs, mac_size);
250 ii=i=rec->data[l-1]; /* padding_length */
251 i++;
252 if (s->options&SSL_OP_TLS_BLOCK_PADDING_BUG)
253 {
254 /* First packet is even in size, so check */
255 if ((memcmp(s->s3->read_sequence,
256 "\0\0\0\0\0\0\0\0",8) == 0) && !(ii & 1))
257 s->s3->flags|=TLS1_FLAGS_TLS_PADDING_BUG;
258 if (s->s3->flags & TLS1_FLAGS_TLS_PADDING_BUG)
259 i--;
260 }
261 /* TLS 1.0 does not bound the number of padding bytes by the block size.
262 * All of them must have value 'padding_length'. */
263 if (i + bs > (int)rec->length)
264 {
265 /* Incorrect padding. SSLerr() and ssl3_alert are done
266 * by caller: we don't want to reveal whether this is
267 * a decryption error or a MAC verification failure
268 * (see http://www.openssl.org/~bodo/tls-cbc.txt)
269 */
270 return -1;
271 }
272 for (j=(int)(l-i); j<(int)l; j++)
273 {
274 if (rec->data[j] != ii)
275 {
276 /* Incorrect padding */
277 return -1;
278 }
279 }
280 rec->length-=i;
281
282 rec->data += bs; /* skip the implicit IV */
283 rec->input += bs;
284 rec->length -= bs;
285 }
286 } 257 }
287 return(1); 258 return(1);
288 } 259 }
diff --git a/src/lib/libssl/d1_pkt.c b/src/lib/libssl/d1_pkt.c
index 987af60835..cfe4524553 100644
--- a/src/lib/libssl/d1_pkt.c
+++ b/src/lib/libssl/d1_pkt.c
@@ -376,15 +376,11 @@ static int
376dtls1_process_record(SSL *s) 376dtls1_process_record(SSL *s)
377{ 377{
378 int i,al; 378 int i,al;
379 int clear=0;
380 int enc_err; 379 int enc_err;
381 SSL_SESSION *sess; 380 SSL_SESSION *sess;
382 SSL3_RECORD *rr; 381 SSL3_RECORD *rr;
383 unsigned int mac_size; 382 unsigned int mac_size, orig_len;
384 unsigned char md[EVP_MAX_MD_SIZE]; 383 unsigned char md[EVP_MAX_MD_SIZE];
385 int decryption_failed_or_bad_record_mac = 0;
386 unsigned char *mac = NULL;
387
388 384
389 rr= &(s->s3->rrec); 385 rr= &(s->s3->rrec);
390 sess = s->session; 386 sess = s->session;
@@ -416,12 +412,16 @@ dtls1_process_record(SSL *s)
416 rr->data=rr->input; 412 rr->data=rr->input;
417 413
418 enc_err = s->method->ssl3_enc->enc(s,0); 414 enc_err = s->method->ssl3_enc->enc(s,0);
419 if (enc_err <= 0) 415 /* enc_err is:
416 * 0: (in non-constant time) if the record is publically invalid.
417 * 1: if the padding is valid
418 * -1: if the padding is invalid */
419 if (enc_err == 0)
420 { 420 {
421 /* To minimize information leaked via timing, we will always 421 /* For DTLS we simply ignore bad packets. */
422 * perform all computations before discarding the message. 422 rr->length = 0;
423 */ 423 s->packet_length = 0;
424 decryption_failed_or_bad_record_mac = 1; 424 goto err;
425 } 425 }
426 426
427#ifdef TLS_DEBUG 427#ifdef TLS_DEBUG
@@ -431,45 +431,62 @@ printf("\n");
431#endif 431#endif
432 432
433 /* r->length is now the compressed data plus mac */ 433 /* r->length is now the compressed data plus mac */
434 if ( (sess == NULL) || 434 if ((sess != NULL) &&
435 (s->enc_read_ctx == NULL) || 435 (s->enc_read_ctx != NULL) &&
436 (s->read_hash == NULL)) 436 (EVP_MD_CTX_md(s->read_hash) != NULL))
437 clear=1;
438
439 if (!clear)
440 { 437 {
441 /* !clear => s->read_hash != NULL => mac_size != -1 */ 438 /* s->read_hash != NULL => mac_size != -1 */
442 int t; 439 unsigned char *mac = NULL;
443 t=EVP_MD_CTX_size(s->read_hash); 440 unsigned char mac_tmp[EVP_MAX_MD_SIZE];
444 OPENSSL_assert(t >= 0); 441 mac_size=EVP_MD_CTX_size(s->read_hash);
445 mac_size=t; 442 OPENSSL_assert(mac_size <= EVP_MAX_MD_SIZE);
446 443
447 if (rr->length > SSL3_RT_MAX_COMPRESSED_LENGTH+mac_size) 444 /* kludge: *_cbc_remove_padding passes padding length in rr->type */
445 orig_len = rr->length+((unsigned int)rr->type>>8);
446
447 /* orig_len is the length of the record before any padding was
448 * removed. This is public information, as is the MAC in use,
449 * therefore we can safely process the record in a different
450 * amount of time if it's too short to possibly contain a MAC.
451 */
452 if (orig_len < mac_size ||
453 /* CBC records must have a padding length byte too. */
454 (EVP_CIPHER_CTX_mode(s->enc_read_ctx) == EVP_CIPH_CBC_MODE &&
455 orig_len < mac_size+1))
448 { 456 {
449#if 0 /* OK only for stream ciphers (then rr->length is visible from ciphertext anyway) */ 457 al=SSL_AD_DECODE_ERROR;
450 al=SSL_AD_RECORD_OVERFLOW; 458 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_LENGTH_TOO_SHORT);
451 SSLerr(SSL_F_DTLS1_PROCESS_RECORD,SSL_R_PRE_MAC_LENGTH_TOO_LONG);
452 goto f_err; 459 goto f_err;
453#else
454 decryption_failed_or_bad_record_mac = 1;
455#endif
456 } 460 }
457 /* check the MAC for rr->input (it's in mac_size bytes at the tail) */ 461
458 if (rr->length >= mac_size) 462 if (EVP_CIPHER_CTX_mode(s->enc_read_ctx) == EVP_CIPH_CBC_MODE)
459 { 463 {
464 /* We update the length so that the TLS header bytes
465 * can be constructed correctly but we need to extract
466 * the MAC in constant time from within the record,
467 * without leaking the contents of the padding bytes.
468 * */
469 mac = mac_tmp;
470 ssl3_cbc_copy_mac(mac_tmp, rr, mac_size, orig_len);
460 rr->length -= mac_size; 471 rr->length -= mac_size;
461 mac = &rr->data[rr->length];
462 } 472 }
463 else 473 else
464 rr->length = 0;
465 i=s->method->ssl3_enc->mac(s,md,0);
466 if (i < 0 || mac == NULL || memcmp(md, mac, mac_size) != 0)
467 { 474 {
468 decryption_failed_or_bad_record_mac = 1; 475 /* In this case there's no padding, so |orig_len|
476 * equals |rec->length| and we checked that there's
477 * enough bytes for |mac_size| above. */
478 rr->length -= mac_size;
479 mac = &rr->data[rr->length];
469 } 480 }
481
482 i=s->method->ssl3_enc->mac(s,md,0 /* not send */);
483 if (i < 0 || mac == NULL || timingsafe_bcmp(md, mac, (size_t)mac_size) != 0)
484 enc_err = -1;
485 if (rr->length > SSL3_RT_MAX_COMPRESSED_LENGTH+mac_size)
486 enc_err = -1;
470 } 487 }
471 488
472 if (decryption_failed_or_bad_record_mac) 489 if (enc_err < 0)
473 { 490 {
474 /* decryption failed, silently discard message */ 491 /* decryption failed, silently discard message */
475 rr->length = 0; 492 rr->length = 0;
diff --git a/src/lib/libssl/s3_both.c b/src/lib/libssl/s3_both.c
index b63460a56d..6981852b5b 100644
--- a/src/lib/libssl/s3_both.c
+++ b/src/lib/libssl/s3_both.c
@@ -263,7 +263,7 @@ int ssl3_get_finished(SSL *s, int a, int b)
263 goto f_err; 263 goto f_err;
264 } 264 }
265 265
266 if (memcmp(p, s->s3->tmp.peer_finish_md, i) != 0) 266 if (timingsafe_bcmp(p, s->s3->tmp.peer_finish_md, i) != 0)
267 { 267 {
268 al=SSL_AD_DECRYPT_ERROR; 268 al=SSL_AD_DECRYPT_ERROR;
269 SSLerr(SSL_F_SSL3_GET_FINISHED,SSL_R_DIGEST_CHECK_FAILED); 269 SSLerr(SSL_F_SSL3_GET_FINISHED,SSL_R_DIGEST_CHECK_FAILED);
diff --git a/src/lib/libssl/s3_cbc.c b/src/lib/libssl/s3_cbc.c
new file mode 100644
index 0000000000..443a31e746
--- /dev/null
+++ b/src/lib/libssl/s3_cbc.c
@@ -0,0 +1,790 @@
1/* ssl/s3_cbc.c */
2/* ====================================================================
3 * Copyright (c) 2012 The OpenSSL Project. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 *
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in
14 * the documentation and/or other materials provided with the
15 * distribution.
16 *
17 * 3. All advertising materials mentioning features or use of this
18 * software must display the following acknowledgment:
19 * "This product includes software developed by the OpenSSL Project
20 * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
21 *
22 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
23 * endorse or promote products derived from this software without
24 * prior written permission. For written permission, please contact
25 * openssl-core@openssl.org.
26 *
27 * 5. Products derived from this software may not be called "OpenSSL"
28 * nor may "OpenSSL" appear in their names without prior written
29 * permission of the OpenSSL Project.
30 *
31 * 6. Redistributions of any form whatsoever must retain the following
32 * acknowledgment:
33 * "This product includes software developed by the OpenSSL Project
34 * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
35 *
36 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
37 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
38 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
39 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
40 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
42 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
43 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
44 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
45 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
46 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
47 * OF THE POSSIBILITY OF SUCH DAMAGE.
48 * ====================================================================
49 *
50 * This product includes cryptographic software written by Eric Young
51 * (eay@cryptsoft.com). This product includes software written by Tim
52 * Hudson (tjh@cryptsoft.com).
53 *
54 */
55
56#include "ssl_locl.h"
57
58#include <openssl/md5.h>
59#include <openssl/sha.h>
60
61/* MAX_HASH_BIT_COUNT_BYTES is the maximum number of bytes in the hash's length
62 * field. (SHA-384/512 have 128-bit length.) */
63#define MAX_HASH_BIT_COUNT_BYTES 16
64
65/* MAX_HASH_BLOCK_SIZE is the maximum hash block size that we'll support.
66 * Currently SHA-384/512 has a 128-byte block size and that's the largest
67 * supported by TLS.) */
68#define MAX_HASH_BLOCK_SIZE 128
69
70/* Some utility functions are needed:
71 *
72 * These macros return the given value with the MSB copied to all the other
73 * bits. They use the fact that arithmetic shift shifts-in the sign bit.
74 * However, this is not ensured by the C standard so you may need to replace
75 * them with something else on odd CPUs. */
76#define DUPLICATE_MSB_TO_ALL(x) ( (unsigned)( (int)(x) >> (sizeof(int)*8-1) ) )
77#define DUPLICATE_MSB_TO_ALL_8(x) ((unsigned char)(DUPLICATE_MSB_TO_ALL(x)))
78
79/* constant_time_lt returns 0xff if a<b and 0x00 otherwise. */
80static unsigned constant_time_lt(unsigned a, unsigned b)
81 {
82 a -= b;
83 return DUPLICATE_MSB_TO_ALL(a);
84 }
85
86/* constant_time_ge returns 0xff if a>=b and 0x00 otherwise. */
87static unsigned constant_time_ge(unsigned a, unsigned b)
88 {
89 a -= b;
90 return DUPLICATE_MSB_TO_ALL(~a);
91 }
92
93/* constant_time_eq_8 returns 0xff if a==b and 0x00 otherwise. */
94static unsigned char constant_time_eq_8(unsigned a, unsigned b)
95 {
96 unsigned c = a ^ b;
97 c--;
98 return DUPLICATE_MSB_TO_ALL_8(c);
99 }
100
101/* ssl3_cbc_remove_padding removes padding from the decrypted, SSLv3, CBC
102 * record in |rec| by updating |rec->length| in constant time.
103 *
104 * block_size: the block size of the cipher used to encrypt the record.
105 * returns:
106 * 0: (in non-constant time) if the record is publicly invalid.
107 * 1: if the padding was valid
108 * -1: otherwise. */
109int ssl3_cbc_remove_padding(const SSL* s,
110 SSL3_RECORD *rec,
111 unsigned block_size,
112 unsigned mac_size)
113 {
114 unsigned padding_length, good;
115 const unsigned overhead = 1 /* padding length byte */ + mac_size;
116
117 /* These lengths are all public so we can test them in non-constant
118 * time. */
119 if (overhead > rec->length)
120 return 0;
121
122 padding_length = rec->data[rec->length-1];
123 good = constant_time_ge(rec->length, padding_length+overhead);
124 /* SSLv3 requires that the padding is minimal. */
125 good &= constant_time_ge(block_size, padding_length+1);
126 padding_length = good & (padding_length+1);
127 rec->length -= padding_length;
128 rec->type |= padding_length<<8; /* kludge: pass padding length */
129 return (int)((good & 1) | (~good & -1));
130}
131
132/* tls1_cbc_remove_padding removes the CBC padding from the decrypted, TLS, CBC
133 * record in |rec| in constant time and returns 1 if the padding is valid and
134 * -1 otherwise. It also removes any explicit IV from the start of the record
135 * without leaking any timing about whether there was enough space after the
136 * padding was removed.
137 *
138 * block_size: the block size of the cipher used to encrypt the record.
139 * returns:
140 * 0: (in non-constant time) if the record is publicly invalid.
141 * 1: if the padding was valid
142 * -1: otherwise. */
143int tls1_cbc_remove_padding(const SSL* s,
144 SSL3_RECORD *rec,
145 unsigned block_size,
146 unsigned mac_size)
147 {
148 unsigned padding_length, good, to_check, i;
149 const unsigned overhead = 1 /* padding length byte */ + mac_size;
150 /* Check if version requires explicit IV */
151 if (s->version >= TLS1_1_VERSION || s->version == DTLS1_BAD_VER)
152 {
153 /* These lengths are all public so we can test them in
154 * non-constant time.
155 */
156 if (overhead + block_size > rec->length)
157 return 0;
158 /* We can now safely skip explicit IV */
159 rec->data += block_size;
160 rec->input += block_size;
161 rec->length -= block_size;
162 }
163 else if (overhead > rec->length)
164 return 0;
165
166 padding_length = rec->data[rec->length-1];
167
168 /* NB: if compression is in operation the first packet may not be of
169 * even length so the padding bug check cannot be performed. This bug
170 * workaround has been around since SSLeay so hopefully it is either
171 * fixed now or no buggy implementation supports compression [steve]
172 */
173 if ( (s->options&SSL_OP_TLS_BLOCK_PADDING_BUG) && !s->expand)
174 {
175 /* First packet is even in size, so check */
176 if ((memcmp(s->s3->read_sequence, "\0\0\0\0\0\0\0\0",8) == 0) &&
177 !(padding_length & 1))
178 {
179 s->s3->flags|=TLS1_FLAGS_TLS_PADDING_BUG;
180 }
181 if ((s->s3->flags & TLS1_FLAGS_TLS_PADDING_BUG) &&
182 padding_length > 0)
183 {
184 padding_length--;
185 }
186 }
187
188 if (EVP_CIPHER_flags(s->enc_read_ctx->cipher)&EVP_CIPH_FLAG_AEAD_CIPHER)
189 {
190 /* padding is already verified */
191 rec->length -= padding_length + 1;
192 return 1;
193 }
194
195 good = constant_time_ge(rec->length, overhead+padding_length);
196 /* The padding consists of a length byte at the end of the record and
197 * then that many bytes of padding, all with the same value as the
198 * length byte. Thus, with the length byte included, there are i+1
199 * bytes of padding.
200 *
201 * We can't check just |padding_length+1| bytes because that leaks
202 * decrypted information. Therefore we always have to check the maximum
203 * amount of padding possible. (Again, the length of the record is
204 * public information so we can use it.) */
205 to_check = 255; /* maximum amount of padding. */
206 if (to_check > rec->length-1)
207 to_check = rec->length-1;
208
209 for (i = 0; i < to_check; i++)
210 {
211 unsigned char mask = constant_time_ge(padding_length, i);
212 unsigned char b = rec->data[rec->length-1-i];
213 /* The final |padding_length+1| bytes should all have the value
214 * |padding_length|. Therefore the XOR should be zero. */
215 good &= ~(mask&(padding_length ^ b));
216 }
217
218 /* If any of the final |padding_length+1| bytes had the wrong value,
219 * one or more of the lower eight bits of |good| will be cleared. We
220 * AND the bottom 8 bits together and duplicate the result to all the
221 * bits. */
222 good &= good >> 4;
223 good &= good >> 2;
224 good &= good >> 1;
225 good <<= sizeof(good)*8-1;
226 good = DUPLICATE_MSB_TO_ALL(good);
227
228 padding_length = good & (padding_length+1);
229 rec->length -= padding_length;
230 rec->type |= padding_length<<8; /* kludge: pass padding length */
231
232 return (int)((good & 1) | (~good & -1));
233 }
234
235/* ssl3_cbc_copy_mac copies |md_size| bytes from the end of |rec| to |out| in
236 * constant time (independent of the concrete value of rec->length, which may
237 * vary within a 256-byte window).
238 *
239 * ssl3_cbc_remove_padding or tls1_cbc_remove_padding must be called prior to
240 * this function.
241 *
242 * On entry:
243 * rec->orig_len >= md_size
244 * md_size <= EVP_MAX_MD_SIZE
245 *
246 * If CBC_MAC_ROTATE_IN_PLACE is defined then the rotation is performed with
247 * variable accesses in a 64-byte-aligned buffer. Assuming that this fits into
248 * a single or pair of cache-lines, then the variable memory accesses don't
249 * actually affect the timing. CPUs with smaller cache-lines [if any] are
250 * not multi-core and are not considered vulnerable to cache-timing attacks.
251 */
252#define CBC_MAC_ROTATE_IN_PLACE
253
254void ssl3_cbc_copy_mac(unsigned char* out,
255 const SSL3_RECORD *rec,
256 unsigned md_size,unsigned orig_len)
257 {
258#if defined(CBC_MAC_ROTATE_IN_PLACE)
259 unsigned char rotated_mac_buf[64+EVP_MAX_MD_SIZE];
260 unsigned char *rotated_mac;
261#else
262 unsigned char rotated_mac[EVP_MAX_MD_SIZE];
263#endif
264
265 /* mac_end is the index of |rec->data| just after the end of the MAC. */
266 unsigned mac_end = rec->length;
267 unsigned mac_start = mac_end - md_size;
268 /* scan_start contains the number of bytes that we can ignore because
269 * the MAC's position can only vary by 255 bytes. */
270 unsigned scan_start = 0;
271 unsigned i, j;
272 unsigned div_spoiler;
273 unsigned rotate_offset;
274
275 OPENSSL_assert(orig_len >= md_size);
276 OPENSSL_assert(md_size <= EVP_MAX_MD_SIZE);
277
278#if defined(CBC_MAC_ROTATE_IN_PLACE)
279 rotated_mac = rotated_mac_buf + ((0-(size_t)rotated_mac_buf)&63);
280#endif
281
282 /* This information is public so it's safe to branch based on it. */
283 if (orig_len > md_size + 255 + 1)
284 scan_start = orig_len - (md_size + 255 + 1);
285 /* div_spoiler contains a multiple of md_size that is used to cause the
286 * modulo operation to be constant time. Without this, the time varies
287 * based on the amount of padding when running on Intel chips at least.
288 *
289 * The aim of right-shifting md_size is so that the compiler doesn't
290 * figure out that it can remove div_spoiler as that would require it
291 * to prove that md_size is always even, which I hope is beyond it. */
292 div_spoiler = md_size >> 1;
293 div_spoiler <<= (sizeof(div_spoiler)-1)*8;
294 rotate_offset = (div_spoiler + mac_start - scan_start) % md_size;
295
296 memset(rotated_mac, 0, md_size);
297 for (i = scan_start, j = 0; i < orig_len; i++)
298 {
299 unsigned char mac_started = constant_time_ge(i, mac_start);
300 unsigned char mac_ended = constant_time_ge(i, mac_end);
301 unsigned char b = rec->data[i];
302 rotated_mac[j++] |= b & mac_started & ~mac_ended;
303 j &= constant_time_lt(j,md_size);
304 }
305
306 /* Now rotate the MAC */
307#if defined(CBC_MAC_ROTATE_IN_PLACE)
308 j = 0;
309 for (i = 0; i < md_size; i++)
310 {
311 /* in case cache-line is 32 bytes, touch second line */
312 ((volatile unsigned char *)rotated_mac)[rotate_offset^32];
313 out[j++] = rotated_mac[rotate_offset++];
314 rotate_offset &= constant_time_lt(rotate_offset,md_size);
315 }
316#else
317 memset(out, 0, md_size);
318 rotate_offset = md_size - rotate_offset;
319 rotate_offset &= constant_time_lt(rotate_offset,md_size);
320 for (i = 0; i < md_size; i++)
321 {
322 for (j = 0; j < md_size; j++)
323 out[j] |= rotated_mac[i] & constant_time_eq_8(j, rotate_offset);
324 rotate_offset++;
325 rotate_offset &= constant_time_lt(rotate_offset,md_size);
326 }
327#endif
328 }
329
330/* u32toLE serialises an unsigned, 32-bit number (n) as four bytes at (p) in
331 * little-endian order. The value of p is advanced by four. */
332#define u32toLE(n, p) \
333 (*((p)++)=(unsigned char)(n), \
334 *((p)++)=(unsigned char)(n>>8), \
335 *((p)++)=(unsigned char)(n>>16), \
336 *((p)++)=(unsigned char)(n>>24))
337
338/* These functions serialize the state of a hash and thus perform the standard
339 * "final" operation without adding the padding and length that such a function
340 * typically does. */
341static void tls1_md5_final_raw(void* ctx, unsigned char *md_out)
342 {
343 MD5_CTX *md5 = ctx;
344 u32toLE(md5->A, md_out);
345 u32toLE(md5->B, md_out);
346 u32toLE(md5->C, md_out);
347 u32toLE(md5->D, md_out);
348 }
349
350static void tls1_sha1_final_raw(void* ctx, unsigned char *md_out)
351 {
352 SHA_CTX *sha1 = ctx;
353 l2n(sha1->h0, md_out);
354 l2n(sha1->h1, md_out);
355 l2n(sha1->h2, md_out);
356 l2n(sha1->h3, md_out);
357 l2n(sha1->h4, md_out);
358 }
359#define LARGEST_DIGEST_CTX SHA_CTX
360
361#ifndef OPENSSL_NO_SHA256
362static void tls1_sha256_final_raw(void* ctx, unsigned char *md_out)
363 {
364 SHA256_CTX *sha256 = ctx;
365 unsigned i;
366
367 for (i = 0; i < 8; i++)
368 {
369 l2n(sha256->h[i], md_out);
370 }
371 }
372#undef LARGEST_DIGEST_CTX
373#define LARGEST_DIGEST_CTX SHA256_CTX
374#endif
375
376#ifndef OPENSSL_NO_SHA512
377static void tls1_sha512_final_raw(void* ctx, unsigned char *md_out)
378 {
379 SHA512_CTX *sha512 = ctx;
380 unsigned i;
381
382 for (i = 0; i < 8; i++)
383 {
384 l2n8(sha512->h[i], md_out);
385 }
386 }
387#undef LARGEST_DIGEST_CTX
388#define LARGEST_DIGEST_CTX SHA512_CTX
389#endif
390
391/* ssl3_cbc_record_digest_supported returns 1 iff |ctx| uses a hash function
392 * which ssl3_cbc_digest_record supports. */
393char ssl3_cbc_record_digest_supported(const EVP_MD_CTX *ctx)
394 {
395#ifdef OPENSSL_FIPS
396 if (FIPS_mode())
397 return 0;
398#endif
399 switch (EVP_MD_CTX_type(ctx))
400 {
401 case NID_md5:
402 case NID_sha1:
403#ifndef OPENSSL_NO_SHA256
404 case NID_sha224:
405 case NID_sha256:
406#endif
407#ifndef OPENSSL_NO_SHA512
408 case NID_sha384:
409 case NID_sha512:
410#endif
411 return 1;
412 default:
413 return 0;
414 }
415 }
416
417/* ssl3_cbc_digest_record computes the MAC of a decrypted, padded SSLv3/TLS
418 * record.
419 *
420 * ctx: the EVP_MD_CTX from which we take the hash function.
421 * ssl3_cbc_record_digest_supported must return true for this EVP_MD_CTX.
422 * md_out: the digest output. At most EVP_MAX_MD_SIZE bytes will be written.
423 * md_out_size: if non-NULL, the number of output bytes is written here.
424 * header: the 13-byte, TLS record header.
425 * data: the record data itself, less any preceeding explicit IV.
426 * data_plus_mac_size: the secret, reported length of the data and MAC
427 * once the padding has been removed.
428 * data_plus_mac_plus_padding_size: the public length of the whole
429 * record, including padding.
430 * is_sslv3: non-zero if we are to use SSLv3. Otherwise, TLS.
431 *
432 * On entry: by virtue of having been through one of the remove_padding
433 * functions, above, we know that data_plus_mac_size is large enough to contain
434 * a padding byte and MAC. (If the padding was invalid, it might contain the
435 * padding too. ) */
436void ssl3_cbc_digest_record(
437 const EVP_MD_CTX *ctx,
438 unsigned char* md_out,
439 size_t* md_out_size,
440 const unsigned char header[13],
441 const unsigned char *data,
442 size_t data_plus_mac_size,
443 size_t data_plus_mac_plus_padding_size,
444 const unsigned char *mac_secret,
445 unsigned mac_secret_length,
446 char is_sslv3)
447 {
448 union { double align;
449 unsigned char c[sizeof(LARGEST_DIGEST_CTX)]; } md_state;
450 void (*md_final_raw)(void *ctx, unsigned char *md_out);
451 void (*md_transform)(void *ctx, const unsigned char *block);
452 unsigned md_size, md_block_size = 64;
453 unsigned sslv3_pad_length = 40, header_length, variance_blocks,
454 len, max_mac_bytes, num_blocks,
455 num_starting_blocks, k, mac_end_offset, c, index_a, index_b;
456 unsigned int bits; /* at most 18 bits */
457 unsigned char length_bytes[MAX_HASH_BIT_COUNT_BYTES];
458 /* hmac_pad is the masked HMAC key. */
459 unsigned char hmac_pad[MAX_HASH_BLOCK_SIZE];
460 unsigned char first_block[MAX_HASH_BLOCK_SIZE];
461 unsigned char mac_out[EVP_MAX_MD_SIZE];
462 unsigned i, j, md_out_size_u;
463 EVP_MD_CTX md_ctx;
464 /* mdLengthSize is the number of bytes in the length field that terminates
465 * the hash. */
466 unsigned md_length_size = 8;
467 char length_is_big_endian = 1;
468
469 /* This is a, hopefully redundant, check that allows us to forget about
470 * many possible overflows later in this function. */
471 OPENSSL_assert(data_plus_mac_plus_padding_size < 1024*1024);
472
473 switch (EVP_MD_CTX_type(ctx))
474 {
475 case NID_md5:
476 MD5_Init((MD5_CTX*)md_state.c);
477 md_final_raw = tls1_md5_final_raw;
478 md_transform = (void(*)(void *ctx, const unsigned char *block)) MD5_Transform;
479 md_size = 16;
480 sslv3_pad_length = 48;
481 length_is_big_endian = 0;
482 break;
483 case NID_sha1:
484 SHA1_Init((SHA_CTX*)md_state.c);
485 md_final_raw = tls1_sha1_final_raw;
486 md_transform = (void(*)(void *ctx, const unsigned char *block)) SHA1_Transform;
487 md_size = 20;
488 break;
489#ifndef OPENSSL_NO_SHA256
490 case NID_sha224:
491 SHA224_Init((SHA256_CTX*)md_state.c);
492 md_final_raw = tls1_sha256_final_raw;
493 md_transform = (void(*)(void *ctx, const unsigned char *block)) SHA256_Transform;
494 md_size = 224/8;
495 break;
496 case NID_sha256:
497 SHA256_Init((SHA256_CTX*)md_state.c);
498 md_final_raw = tls1_sha256_final_raw;
499 md_transform = (void(*)(void *ctx, const unsigned char *block)) SHA256_Transform;
500 md_size = 32;
501 break;
502#endif
503#ifndef OPENSSL_NO_SHA512
504 case NID_sha384:
505 SHA384_Init((SHA512_CTX*)md_state.c);
506 md_final_raw = tls1_sha512_final_raw;
507 md_transform = (void(*)(void *ctx, const unsigned char *block)) SHA512_Transform;
508 md_size = 384/8;
509 md_block_size = 128;
510 md_length_size = 16;
511 break;
512 case NID_sha512:
513 SHA512_Init((SHA512_CTX*)md_state.c);
514 md_final_raw = tls1_sha512_final_raw;
515 md_transform = (void(*)(void *ctx, const unsigned char *block)) SHA512_Transform;
516 md_size = 64;
517 md_block_size = 128;
518 md_length_size = 16;
519 break;
520#endif
521 default:
522 /* ssl3_cbc_record_digest_supported should have been
523 * called first to check that the hash function is
524 * supported. */
525 OPENSSL_assert(0);
526 if (md_out_size)
527 *md_out_size = -1;
528 return;
529 }
530
531 OPENSSL_assert(md_length_size <= MAX_HASH_BIT_COUNT_BYTES);
532 OPENSSL_assert(md_block_size <= MAX_HASH_BLOCK_SIZE);
533 OPENSSL_assert(md_size <= EVP_MAX_MD_SIZE);
534
535 header_length = 13;
536 if (is_sslv3)
537 {
538 header_length =
539 mac_secret_length +
540 sslv3_pad_length +
541 8 /* sequence number */ +
542 1 /* record type */ +
543 2 /* record length */;
544 }
545
546 /* variance_blocks is the number of blocks of the hash that we have to
547 * calculate in constant time because they could be altered by the
548 * padding value.
549 *
550 * In SSLv3, the padding must be minimal so the end of the plaintext
551 * varies by, at most, 15+20 = 35 bytes. (We conservatively assume that
552 * the MAC size varies from 0..20 bytes.) In case the 9 bytes of hash
553 * termination (0x80 + 64-bit length) don't fit in the final block, we
554 * say that the final two blocks can vary based on the padding.
555 *
556 * TLSv1 has MACs up to 48 bytes long (SHA-384) and the padding is not
557 * required to be minimal. Therefore we say that the final six blocks
558 * can vary based on the padding.
559 *
560 * Later in the function, if the message is short and there obviously
561 * cannot be this many blocks then variance_blocks can be reduced. */
562 variance_blocks = is_sslv3 ? 2 : 6;
563 /* From now on we're dealing with the MAC, which conceptually has 13
564 * bytes of `header' before the start of the data (TLS) or 71/75 bytes
565 * (SSLv3) */
566 len = data_plus_mac_plus_padding_size + header_length;
567 /* max_mac_bytes contains the maximum bytes of bytes in the MAC, including
568 * |header|, assuming that there's no padding. */
569 max_mac_bytes = len - md_size - 1;
570 /* num_blocks is the maximum number of hash blocks. */
571 num_blocks = (max_mac_bytes + 1 + md_length_size + md_block_size - 1) / md_block_size;
572 /* In order to calculate the MAC in constant time we have to handle
573 * the final blocks specially because the padding value could cause the
574 * end to appear somewhere in the final |variance_blocks| blocks and we
575 * can't leak where. However, |num_starting_blocks| worth of data can
576 * be hashed right away because no padding value can affect whether
577 * they are plaintext. */
578 num_starting_blocks = 0;
579 /* k is the starting byte offset into the conceptual header||data where
580 * we start processing. */
581 k = 0;
582 /* mac_end_offset is the index just past the end of the data to be
583 * MACed. */
584 mac_end_offset = data_plus_mac_size + header_length - md_size;
585 /* c is the index of the 0x80 byte in the final hash block that
586 * contains application data. */
587 c = mac_end_offset % md_block_size;
588 /* index_a is the hash block number that contains the 0x80 terminating
589 * value. */
590 index_a = mac_end_offset / md_block_size;
591 /* index_b is the hash block number that contains the 64-bit hash
592 * length, in bits. */
593 index_b = (mac_end_offset + md_length_size) / md_block_size;
594 /* bits is the hash-length in bits. It includes the additional hash
595 * block for the masked HMAC key, or whole of |header| in the case of
596 * SSLv3. */
597
598 /* For SSLv3, if we're going to have any starting blocks then we need
599 * at least two because the header is larger than a single block. */
600 if (num_blocks > variance_blocks + (is_sslv3 ? 1 : 0))
601 {
602 num_starting_blocks = num_blocks - variance_blocks;
603 k = md_block_size*num_starting_blocks;
604 }
605
606 bits = 8*mac_end_offset;
607 if (!is_sslv3)
608 {
609 /* Compute the initial HMAC block. For SSLv3, the padding and
610 * secret bytes are included in |header| because they take more
611 * than a single block. */
612 bits += 8*md_block_size;
613 memset(hmac_pad, 0, md_block_size);
614 OPENSSL_assert(mac_secret_length <= sizeof(hmac_pad));
615 memcpy(hmac_pad, mac_secret, mac_secret_length);
616 for (i = 0; i < md_block_size; i++)
617 hmac_pad[i] ^= 0x36;
618
619 md_transform(md_state.c, hmac_pad);
620 }
621
622 if (length_is_big_endian)
623 {
624 memset(length_bytes,0,md_length_size-4);
625 length_bytes[md_length_size-4] = (unsigned char)(bits>>24);
626 length_bytes[md_length_size-3] = (unsigned char)(bits>>16);
627 length_bytes[md_length_size-2] = (unsigned char)(bits>>8);
628 length_bytes[md_length_size-1] = (unsigned char)bits;
629 }
630 else
631 {
632 memset(length_bytes,0,md_length_size);
633 length_bytes[md_length_size-5] = (unsigned char)(bits>>24);
634 length_bytes[md_length_size-6] = (unsigned char)(bits>>16);
635 length_bytes[md_length_size-7] = (unsigned char)(bits>>8);
636 length_bytes[md_length_size-8] = (unsigned char)bits;
637 }
638
639 if (k > 0)
640 {
641 if (is_sslv3)
642 {
643 /* The SSLv3 header is larger than a single block.
644 * overhang is the number of bytes beyond a single
645 * block that the header consumes: either 7 bytes
646 * (SHA1) or 11 bytes (MD5). */
647 unsigned overhang = header_length-md_block_size;
648 md_transform(md_state.c, header);
649 memcpy(first_block, header + md_block_size, overhang);
650 memcpy(first_block + overhang, data, md_block_size-overhang);
651 md_transform(md_state.c, first_block);
652 for (i = 1; i < k/md_block_size - 1; i++)
653 md_transform(md_state.c, data + md_block_size*i - overhang);
654 }
655 else
656 {
657 /* k is a multiple of md_block_size. */
658 memcpy(first_block, header, 13);
659 memcpy(first_block+13, data, md_block_size-13);
660 md_transform(md_state.c, first_block);
661 for (i = 1; i < k/md_block_size; i++)
662 md_transform(md_state.c, data + md_block_size*i - 13);
663 }
664 }
665
666 memset(mac_out, 0, sizeof(mac_out));
667
668 /* We now process the final hash blocks. For each block, we construct
669 * it in constant time. If the |i==index_a| then we'll include the 0x80
670 * bytes and zero pad etc. For each block we selectively copy it, in
671 * constant time, to |mac_out|. */
672 for (i = num_starting_blocks; i <= num_starting_blocks+variance_blocks; i++)
673 {
674 unsigned char block[MAX_HASH_BLOCK_SIZE];
675 unsigned char is_block_a = constant_time_eq_8(i, index_a);
676 unsigned char is_block_b = constant_time_eq_8(i, index_b);
677 for (j = 0; j < md_block_size; j++)
678 {
679 unsigned char b = 0, is_past_c, is_past_cp1;
680 if (k < header_length)
681 b = header[k];
682 else if (k < data_plus_mac_plus_padding_size + header_length)
683 b = data[k-header_length];
684 k++;
685
686 is_past_c = is_block_a & constant_time_ge(j, c);
687 is_past_cp1 = is_block_a & constant_time_ge(j, c+1);
688 /* If this is the block containing the end of the
689 * application data, and we are at the offset for the
690 * 0x80 value, then overwrite b with 0x80. */
691 b = (b&~is_past_c) | (0x80&is_past_c);
692 /* If this the the block containing the end of the
693 * application data and we're past the 0x80 value then
694 * just write zero. */
695 b = b&~is_past_cp1;
696 /* If this is index_b (the final block), but not
697 * index_a (the end of the data), then the 64-bit
698 * length didn't fit into index_a and we're having to
699 * add an extra block of zeros. */
700 b &= ~is_block_b | is_block_a;
701
702 /* The final bytes of one of the blocks contains the
703 * length. */
704 if (j >= md_block_size - md_length_size)
705 {
706 /* If this is index_b, write a length byte. */
707 b = (b&~is_block_b) | (is_block_b&length_bytes[j-(md_block_size-md_length_size)]);
708 }
709 block[j] = b;
710 }
711
712 md_transform(md_state.c, block);
713 md_final_raw(md_state.c, block);
714 /* If this is index_b, copy the hash value to |mac_out|. */
715 for (j = 0; j < md_size; j++)
716 mac_out[j] |= block[j]&is_block_b;
717 }
718
719 EVP_MD_CTX_init(&md_ctx);
720 EVP_DigestInit_ex(&md_ctx, ctx->digest, NULL /* engine */);
721 if (is_sslv3)
722 {
723 /* We repurpose |hmac_pad| to contain the SSLv3 pad2 block. */
724 memset(hmac_pad, 0x5c, sslv3_pad_length);
725
726 EVP_DigestUpdate(&md_ctx, mac_secret, mac_secret_length);
727 EVP_DigestUpdate(&md_ctx, hmac_pad, sslv3_pad_length);
728 EVP_DigestUpdate(&md_ctx, mac_out, md_size);
729 }
730 else
731 {
732 /* Complete the HMAC in the standard manner. */
733 for (i = 0; i < md_block_size; i++)
734 hmac_pad[i] ^= 0x6a;
735
736 EVP_DigestUpdate(&md_ctx, hmac_pad, md_block_size);
737 EVP_DigestUpdate(&md_ctx, mac_out, md_size);
738 }
739 EVP_DigestFinal(&md_ctx, md_out, &md_out_size_u);
740 if (md_out_size)
741 *md_out_size = md_out_size_u;
742 EVP_MD_CTX_cleanup(&md_ctx);
743 }
744
745#ifdef OPENSSL_FIPS
746
747/* Due to the need to use EVP in FIPS mode we can't reimplement digests but
748 * we can ensure the number of blocks processed is equal for all cases
749 * by digesting additional data.
750 */
751
752void tls_fips_digest_extra(
753 const EVP_CIPHER_CTX *cipher_ctx, EVP_MD_CTX *mac_ctx,
754 const unsigned char *data, size_t data_len, size_t orig_len)
755 {
756 size_t block_size, digest_pad, blocks_data, blocks_orig;
757 if (EVP_CIPHER_CTX_mode(cipher_ctx) != EVP_CIPH_CBC_MODE)
758 return;
759 block_size = EVP_MD_CTX_block_size(mac_ctx);
760 /* We are in FIPS mode if we get this far so we know we have only SHA*
761 * digests and TLS to deal with.
762 * Minimum digest padding length is 17 for SHA384/SHA512 and 9
763 * otherwise.
764 * Additional header is 13 bytes. To get the number of digest blocks
765 * processed round up the amount of data plus padding to the nearest
766 * block length. Block length is 128 for SHA384/SHA512 and 64 otherwise.
767 * So we have:
768 * blocks = (payload_len + digest_pad + 13 + block_size - 1)/block_size
769 * equivalently:
770 * blocks = (payload_len + digest_pad + 12)/block_size + 1
771 * HMAC adds a constant overhead.
772 * We're ultimately only interested in differences so this becomes
773 * blocks = (payload_len + 29)/128
774 * for SHA384/SHA512 and
775 * blocks = (payload_len + 21)/64
776 * otherwise.
777 */
778 digest_pad = block_size == 64 ? 21 : 29;
779 blocks_orig = (orig_len + digest_pad)/block_size;
780 blocks_data = (data_len + digest_pad)/block_size;
781 /* MAC enough blocks to make up the difference between the original
782 * and actual lengths plus one extra block to ensure this is never a
783 * no op. The "data" pointer should always have enough space to
784 * perform this operation as it is large enough for a maximum
785 * length TLS buffer.
786 */
787 EVP_DigestSignUpdate(mac_ctx, data,
788 (blocks_orig - blocks_data + 1) * block_size);
789 }
790#endif
diff --git a/src/lib/libssl/s3_pkt.c b/src/lib/libssl/s3_pkt.c
index adf8c387cc..a7d2defbea 100644
--- a/src/lib/libssl/s3_pkt.c
+++ b/src/lib/libssl/s3_pkt.c
@@ -290,11 +290,8 @@ static int ssl3_get_record(SSL *s)
290 unsigned char *p; 290 unsigned char *p;
291 unsigned char md[EVP_MAX_MD_SIZE]; 291 unsigned char md[EVP_MAX_MD_SIZE];
292 short version; 292 short version;
293 int mac_size; 293 unsigned mac_size, orig_len;
294 int clear=0;
295 size_t extra; 294 size_t extra;
296 int decryption_failed_or_bad_record_mac = 0;
297 unsigned char *mac = NULL;
298 295
299 rr= &(s->s3->rrec); 296 rr= &(s->s3->rrec);
300 sess=s->session; 297 sess=s->session;
@@ -403,17 +400,15 @@ fprintf(stderr, "Record type=%d, Length=%d\n", rr->type, rr->length);
403 rr->data=rr->input; 400 rr->data=rr->input;
404 401
405 enc_err = s->method->ssl3_enc->enc(s,0); 402 enc_err = s->method->ssl3_enc->enc(s,0);
406 if (enc_err <= 0) 403 /* enc_err is:
404 * 0: (in non-constant time) if the record is publically invalid.
405 * 1: if the padding is valid
406 * -1: if the padding is invalid */
407 if (enc_err == 0)
407 { 408 {
408 if (enc_err == 0) 409 al=SSL_AD_DECRYPTION_FAILED;
409 /* SSLerr() and ssl3_send_alert() have been called */ 410 SSLerr(SSL_F_TLS1_ENC,SSL_R_BLOCK_CIPHER_PAD_IS_WRONG);
410 goto err; 411 goto f_err;
411
412 /* Otherwise enc_err == -1, which indicates bad padding
413 * (rec->length has not been changed in this case).
414 * To minimize information leaked via timing, we will perform
415 * the MAC computation anyway. */
416 decryption_failed_or_bad_record_mac = 1;
417 } 412 }
418 413
419#ifdef TLS_DEBUG 414#ifdef TLS_DEBUG
@@ -423,53 +418,62 @@ printf("\n");
423#endif 418#endif
424 419
425 /* r->length is now the compressed data plus mac */ 420 /* r->length is now the compressed data plus mac */
426 if ( (sess == NULL) || 421 if ((sess != NULL) &&
427 (s->enc_read_ctx == NULL) || 422 (s->enc_read_ctx != NULL) &&
428 (EVP_MD_CTX_md(s->read_hash) == NULL)) 423 (EVP_MD_CTX_md(s->read_hash) != NULL))
429 clear=1;
430
431 if (!clear)
432 { 424 {
433 /* !clear => s->read_hash != NULL => mac_size != -1 */ 425 /* s->read_hash != NULL => mac_size != -1 */
426 unsigned char *mac = NULL;
427 unsigned char mac_tmp[EVP_MAX_MD_SIZE];
434 mac_size=EVP_MD_CTX_size(s->read_hash); 428 mac_size=EVP_MD_CTX_size(s->read_hash);
435 OPENSSL_assert(mac_size >= 0); 429 OPENSSL_assert(mac_size <= EVP_MAX_MD_SIZE);
436 430
437 if (rr->length > SSL3_RT_MAX_COMPRESSED_LENGTH+extra+mac_size) 431 /* kludge: *_cbc_remove_padding passes padding length in rr->type */
432 orig_len = rr->length+((unsigned int)rr->type>>8);
433
434 /* orig_len is the length of the record before any padding was
435 * removed. This is public information, as is the MAC in use,
436 * therefore we can safely process the record in a different
437 * amount of time if it's too short to possibly contain a MAC.
438 */
439 if (orig_len < mac_size ||
440 /* CBC records must have a padding length byte too. */
441 (EVP_CIPHER_CTX_mode(s->enc_read_ctx) == EVP_CIPH_CBC_MODE &&
442 orig_len < mac_size+1))
438 { 443 {
439#if 0 /* OK only for stream ciphers (then rr->length is visible from ciphertext anyway) */ 444 al=SSL_AD_DECODE_ERROR;
440 al=SSL_AD_RECORD_OVERFLOW; 445 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_LENGTH_TOO_SHORT);
441 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_PRE_MAC_LENGTH_TOO_LONG);
442 goto f_err; 446 goto f_err;
443#else
444 decryption_failed_or_bad_record_mac = 1;
445#endif
446 } 447 }
447 /* check the MAC for rr->input (it's in mac_size bytes at the tail) */ 448
448 if (rr->length >= (unsigned int)mac_size) 449 if (EVP_CIPHER_CTX_mode(s->enc_read_ctx) == EVP_CIPH_CBC_MODE)
449 { 450 {
451 /* We update the length so that the TLS header bytes
452 * can be constructed correctly but we need to extract
453 * the MAC in constant time from within the record,
454 * without leaking the contents of the padding bytes.
455 * */
456 mac = mac_tmp;
457 ssl3_cbc_copy_mac(mac_tmp, rr, mac_size, orig_len);
450 rr->length -= mac_size; 458 rr->length -= mac_size;
451 mac = &rr->data[rr->length];
452 } 459 }
453 else 460 else
454 { 461 {
455 /* record (minus padding) is too short to contain a MAC */ 462 /* In this case there's no padding, so |orig_len|
456#if 0 /* OK only for stream ciphers */ 463 * equals |rec->length| and we checked that there's
457 al=SSL_AD_DECODE_ERROR; 464 * enough bytes for |mac_size| above. */
458 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_LENGTH_TOO_SHORT); 465 rr->length -= mac_size;
459 goto f_err; 466 mac = &rr->data[rr->length];
460#else
461 decryption_failed_or_bad_record_mac = 1;
462 rr->length = 0;
463#endif
464 }
465 i=s->method->ssl3_enc->mac(s,md,0);
466 if (i < 0 || mac == NULL || memcmp(md, mac, (size_t)mac_size) != 0)
467 {
468 decryption_failed_or_bad_record_mac = 1;
469 } 467 }
468
469 i=s->method->ssl3_enc->mac(s,md,0 /* not send */);
470 if (i < 0 || mac == NULL || timingsafe_bcmp(md, mac, (size_t)mac_size) != 0)
471 enc_err = -1;
472 if (rr->length > SSL3_RT_MAX_COMPRESSED_LENGTH+extra+mac_size)
473 enc_err = -1;
470 } 474 }
471 475
472 if (decryption_failed_or_bad_record_mac) 476 if (enc_err < 0)
473 { 477 {
474 /* A separate 'decryption_failed' alert was introduced with TLS 1.0, 478 /* A separate 'decryption_failed' alert was introduced with TLS 1.0,
475 * SSL 3.0 only has 'bad_record_mac'. But unless a decryption 479 * SSL 3.0 only has 'bad_record_mac'. But unless a decryption
diff --git a/src/lib/libssl/src/crypto/asn1/a_verify.c b/src/lib/libssl/src/crypto/asn1/a_verify.c
index 432722e409..fc84cd3d19 100644
--- a/src/lib/libssl/src/crypto/asn1/a_verify.c
+++ b/src/lib/libssl/src/crypto/asn1/a_verify.c
@@ -140,6 +140,12 @@ int ASN1_item_verify(const ASN1_ITEM *it, X509_ALGOR *a,
140 140
141 int mdnid, pknid; 141 int mdnid, pknid;
142 142
143 if (!pkey)
144 {
145 ASN1err(ASN1_F_ASN1_ITEM_VERIFY, ERR_R_PASSED_NULL_PARAMETER);
146 return -1;
147 }
148
143 EVP_MD_CTX_init(&ctx); 149 EVP_MD_CTX_init(&ctx);
144 150
145 /* Convert signature OID into digest and public key OIDs */ 151 /* Convert signature OID into digest and public key OIDs */
diff --git a/src/lib/libssl/src/crypto/bn/bn_word.c b/src/lib/libssl/src/crypto/bn/bn_word.c
index ee7b87c45c..de83a15b99 100644
--- a/src/lib/libssl/src/crypto/bn/bn_word.c
+++ b/src/lib/libssl/src/crypto/bn/bn_word.c
@@ -144,26 +144,17 @@ int BN_add_word(BIGNUM *a, BN_ULONG w)
144 a->neg=!(a->neg); 144 a->neg=!(a->neg);
145 return(i); 145 return(i);
146 } 146 }
147 /* Only expand (and risk failing) if it's possibly necessary */ 147 for (i=0;w!=0 && i<a->top;i++)
148 if (((BN_ULONG)(a->d[a->top - 1] + 1) == 0) &&
149 (bn_wexpand(a,a->top+1) == NULL))
150 return(0);
151 i=0;
152 for (;;)
153 { 148 {
154 if (i >= a->top) 149 a->d[i] = l = (a->d[i]+w)&BN_MASK2;
155 l=w; 150 w = (w>l)?1:0;
156 else
157 l=(a->d[i]+w)&BN_MASK2;
158 a->d[i]=l;
159 if (w > l)
160 w=1;
161 else
162 break;
163 i++;
164 } 151 }
165 if (i >= a->top) 152 if (w && i==a->top)
153 {
154 if (bn_wexpand(a,a->top+1) == NULL) return 0;
166 a->top++; 155 a->top++;
156 a->d[i]=w;
157 }
167 bn_check_top(a); 158 bn_check_top(a);
168 return(1); 159 return(1);
169 } 160 }
diff --git a/src/lib/libssl/src/crypto/evp/e_aes_cbc_hmac_sha1.c b/src/lib/libssl/src/crypto/evp/e_aes_cbc_hmac_sha1.c
index 710fb79baf..483e04b605 100644
--- a/src/lib/libssl/src/crypto/evp/e_aes_cbc_hmac_sha1.c
+++ b/src/lib/libssl/src/crypto/evp/e_aes_cbc_hmac_sha1.c
@@ -1,5 +1,5 @@
1/* ==================================================================== 1/* ====================================================================
2 * Copyright (c) 2011 The OpenSSL Project. All rights reserved. 2 * Copyright (c) 2011-2013 The OpenSSL Project. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
@@ -90,6 +90,10 @@ typedef struct
90 defined(_M_AMD64) || defined(_M_X64) || \ 90 defined(_M_AMD64) || defined(_M_X64) || \
91 defined(__INTEL__) ) 91 defined(__INTEL__) )
92 92
93#if defined(__GNUC__) && __GNUC__>=2 && !defined(PEDANTIC)
94# define BSWAP(x) ({ unsigned int r=(x); asm ("bswapl %0":"=r"(r):"0"(r)); r; })
95#endif
96
93extern unsigned int OPENSSL_ia32cap_P[2]; 97extern unsigned int OPENSSL_ia32cap_P[2];
94#define AESNI_CAPABLE (1<<(57-32)) 98#define AESNI_CAPABLE (1<<(57-32))
95 99
@@ -167,6 +171,9 @@ static void sha1_update(SHA_CTX *c,const void *data,size_t len)
167 SHA1_Update(c,ptr,res); 171 SHA1_Update(c,ptr,res);
168} 172}
169 173
174#ifdef SHA1_Update
175#undef SHA1_Update
176#endif
170#define SHA1_Update sha1_update 177#define SHA1_Update sha1_update
171 178
172static int aesni_cbc_hmac_sha1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, 179static int aesni_cbc_hmac_sha1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
@@ -184,6 +191,8 @@ static int aesni_cbc_hmac_sha1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
184 sha_off = SHA_CBLOCK-key->md.num; 191 sha_off = SHA_CBLOCK-key->md.num;
185#endif 192#endif
186 193
194 key->payload_length = NO_PAYLOAD_LENGTH;
195
187 if (len%AES_BLOCK_SIZE) return 0; 196 if (len%AES_BLOCK_SIZE) return 0;
188 197
189 if (ctx->encrypt) { 198 if (ctx->encrypt) {
@@ -234,47 +243,210 @@ static int aesni_cbc_hmac_sha1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
234 &key->ks,ctx->iv,1); 243 &key->ks,ctx->iv,1);
235 } 244 }
236 } else { 245 } else {
237 unsigned char mac[SHA_DIGEST_LENGTH]; 246 union { unsigned int u[SHA_DIGEST_LENGTH/sizeof(unsigned int)];
247 unsigned char c[32+SHA_DIGEST_LENGTH]; } mac, *pmac;
248
249 /* arrange cache line alignment */
250 pmac = (void *)(((size_t)mac.c+31)&((size_t)0-32));
238 251
239 /* decrypt HMAC|padding at once */ 252 /* decrypt HMAC|padding at once */
240 aesni_cbc_encrypt(in,out,len, 253 aesni_cbc_encrypt(in,out,len,
241 &key->ks,ctx->iv,0); 254 &key->ks,ctx->iv,0);
242 255
243 if (plen) { /* "TLS" mode of operation */ 256 if (plen) { /* "TLS" mode of operation */
244 /* figure out payload length */ 257 size_t inp_len, mask, j, i;
245 if (len<(size_t)(out[len-1]+1+SHA_DIGEST_LENGTH)) 258 unsigned int res, maxpad, pad, bitlen;
246 return 0; 259 int ret = 1;
247 260 union { unsigned int u[SHA_LBLOCK];
248 len -= (out[len-1]+1+SHA_DIGEST_LENGTH); 261 unsigned char c[SHA_CBLOCK]; }
262 *data = (void *)key->md.data;
249 263
250 if ((key->aux.tls_aad[plen-4]<<8|key->aux.tls_aad[plen-3]) 264 if ((key->aux.tls_aad[plen-4]<<8|key->aux.tls_aad[plen-3])
251 >= TLS1_1_VERSION) { 265 >= TLS1_1_VERSION)
252 len -= AES_BLOCK_SIZE;
253 iv = AES_BLOCK_SIZE; 266 iv = AES_BLOCK_SIZE;
254 }
255 267
256 key->aux.tls_aad[plen-2] = len>>8; 268 if (len<(iv+SHA_DIGEST_LENGTH+1))
257 key->aux.tls_aad[plen-1] = len; 269 return 0;
270
271 /* omit explicit iv */
272 out += iv;
273 len -= iv;
274
275 /* figure out payload length */
276 pad = out[len-1];
277 maxpad = len-(SHA_DIGEST_LENGTH+1);
278 maxpad |= (255-maxpad)>>(sizeof(maxpad)*8-8);
279 maxpad &= 255;
280
281 inp_len = len - (SHA_DIGEST_LENGTH+pad+1);
282 mask = (0-((inp_len-len)>>(sizeof(inp_len)*8-1)));
283 inp_len &= mask;
284 ret &= (int)mask;
285
286 key->aux.tls_aad[plen-2] = inp_len>>8;
287 key->aux.tls_aad[plen-1] = inp_len;
258 288
259 /* calculate HMAC and verify it */ 289 /* calculate HMAC */
260 key->md = key->head; 290 key->md = key->head;
261 SHA1_Update(&key->md,key->aux.tls_aad,plen); 291 SHA1_Update(&key->md,key->aux.tls_aad,plen);
262 SHA1_Update(&key->md,out+iv,len);
263 SHA1_Final(mac,&key->md);
264 292
293#if 1
294 len -= SHA_DIGEST_LENGTH; /* amend mac */
295 if (len>=(256+SHA_CBLOCK)) {
296 j = (len-(256+SHA_CBLOCK))&(0-SHA_CBLOCK);
297 j += SHA_CBLOCK-key->md.num;
298 SHA1_Update(&key->md,out,j);
299 out += j;
300 len -= j;
301 inp_len -= j;
302 }
303
304 /* but pretend as if we hashed padded payload */
305 bitlen = key->md.Nl+(inp_len<<3); /* at most 18 bits */
306#ifdef BSWAP
307 bitlen = BSWAP(bitlen);
308#else
309 mac.c[0] = 0;
310 mac.c[1] = (unsigned char)(bitlen>>16);
311 mac.c[2] = (unsigned char)(bitlen>>8);
312 mac.c[3] = (unsigned char)bitlen;
313 bitlen = mac.u[0];
314#endif
315
316 pmac->u[0]=0;
317 pmac->u[1]=0;
318 pmac->u[2]=0;
319 pmac->u[3]=0;
320 pmac->u[4]=0;
321
322 for (res=key->md.num, j=0;j<len;j++) {
323 size_t c = out[j];
324 mask = (j-inp_len)>>(sizeof(j)*8-8);
325 c &= mask;
326 c |= 0x80&~mask&~((inp_len-j)>>(sizeof(j)*8-8));
327 data->c[res++]=(unsigned char)c;
328
329 if (res!=SHA_CBLOCK) continue;
330
331 mask = 0-((inp_len+8-j)>>(sizeof(j)*8-1));
332 data->u[SHA_LBLOCK-1] |= bitlen&mask;
333 sha1_block_data_order(&key->md,data,1);
334 mask &= 0-((j-inp_len-73)>>(sizeof(j)*8-1));
335 pmac->u[0] |= key->md.h0 & mask;
336 pmac->u[1] |= key->md.h1 & mask;
337 pmac->u[2] |= key->md.h2 & mask;
338 pmac->u[3] |= key->md.h3 & mask;
339 pmac->u[4] |= key->md.h4 & mask;
340 res=0;
341 }
342
343 for(i=res;i<SHA_CBLOCK;i++,j++) data->c[i]=0;
344
345 if (res>SHA_CBLOCK-8) {
346 mask = 0-((inp_len+8-j)>>(sizeof(j)*8-1));
347 data->u[SHA_LBLOCK-1] |= bitlen&mask;
348 sha1_block_data_order(&key->md,data,1);
349 mask &= 0-((j-inp_len-73)>>(sizeof(j)*8-1));
350 pmac->u[0] |= key->md.h0 & mask;
351 pmac->u[1] |= key->md.h1 & mask;
352 pmac->u[2] |= key->md.h2 & mask;
353 pmac->u[3] |= key->md.h3 & mask;
354 pmac->u[4] |= key->md.h4 & mask;
355
356 memset(data,0,SHA_CBLOCK);
357 j+=64;
358 }
359 data->u[SHA_LBLOCK-1] = bitlen;
360 sha1_block_data_order(&key->md,data,1);
361 mask = 0-((j-inp_len-73)>>(sizeof(j)*8-1));
362 pmac->u[0] |= key->md.h0 & mask;
363 pmac->u[1] |= key->md.h1 & mask;
364 pmac->u[2] |= key->md.h2 & mask;
365 pmac->u[3] |= key->md.h3 & mask;
366 pmac->u[4] |= key->md.h4 & mask;
367
368#ifdef BSWAP
369 pmac->u[0] = BSWAP(pmac->u[0]);
370 pmac->u[1] = BSWAP(pmac->u[1]);
371 pmac->u[2] = BSWAP(pmac->u[2]);
372 pmac->u[3] = BSWAP(pmac->u[3]);
373 pmac->u[4] = BSWAP(pmac->u[4]);
374#else
375 for (i=0;i<5;i++) {
376 res = pmac->u[i];
377 pmac->c[4*i+0]=(unsigned char)(res>>24);
378 pmac->c[4*i+1]=(unsigned char)(res>>16);
379 pmac->c[4*i+2]=(unsigned char)(res>>8);
380 pmac->c[4*i+3]=(unsigned char)res;
381 }
382#endif
383 len += SHA_DIGEST_LENGTH;
384#else
385 SHA1_Update(&key->md,out,inp_len);
386 res = key->md.num;
387 SHA1_Final(pmac->c,&key->md);
388
389 {
390 unsigned int inp_blocks, pad_blocks;
391
392 /* but pretend as if we hashed padded payload */
393 inp_blocks = 1+((SHA_CBLOCK-9-res)>>(sizeof(res)*8-1));
394 res += (unsigned int)(len-inp_len);
395 pad_blocks = res / SHA_CBLOCK;
396 res %= SHA_CBLOCK;
397 pad_blocks += 1+((SHA_CBLOCK-9-res)>>(sizeof(res)*8-1));
398 for (;inp_blocks<pad_blocks;inp_blocks++)
399 sha1_block_data_order(&key->md,data,1);
400 }
401#endif
265 key->md = key->tail; 402 key->md = key->tail;
266 SHA1_Update(&key->md,mac,SHA_DIGEST_LENGTH); 403 SHA1_Update(&key->md,pmac->c,SHA_DIGEST_LENGTH);
267 SHA1_Final(mac,&key->md); 404 SHA1_Final(pmac->c,&key->md);
268 405
269 if (memcmp(out+iv+len,mac,SHA_DIGEST_LENGTH)) 406 /* verify HMAC */
270 return 0; 407 out += inp_len;
408 len -= inp_len;
409#if 1
410 {
411 unsigned char *p = out+len-1-maxpad-SHA_DIGEST_LENGTH;
412 size_t off = out-p;
413 unsigned int c, cmask;
414
415 maxpad += SHA_DIGEST_LENGTH;
416 for (res=0,i=0,j=0;j<maxpad;j++) {
417 c = p[j];
418 cmask = ((int)(j-off-SHA_DIGEST_LENGTH))>>(sizeof(int)*8-1);
419 res |= (c^pad)&~cmask; /* ... and padding */
420 cmask &= ((int)(off-1-j))>>(sizeof(int)*8-1);
421 res |= (c^pmac->c[i])&cmask;
422 i += 1&cmask;
423 }
424 maxpad -= SHA_DIGEST_LENGTH;
425
426 res = 0-((0-res)>>(sizeof(res)*8-1));
427 ret &= (int)~res;
428 }
429#else
430 for (res=0,i=0;i<SHA_DIGEST_LENGTH;i++)
431 res |= out[i]^pmac->c[i];
432 res = 0-((0-res)>>(sizeof(res)*8-1));
433 ret &= (int)~res;
434
435 /* verify padding */
436 pad = (pad&~res) | (maxpad&res);
437 out = out+len-1-pad;
438 for (res=0,i=0;i<pad;i++)
439 res |= out[i]^pad;
440
441 res = (0-res)>>(sizeof(res)*8-1);
442 ret &= (int)~res;
443#endif
444 return ret;
271 } else { 445 } else {
272 SHA1_Update(&key->md,out,len); 446 SHA1_Update(&key->md,out,len);
273 } 447 }
274 } 448 }
275 449
276 key->payload_length = NO_PAYLOAD_LENGTH;
277
278 return 1; 450 return 1;
279 } 451 }
280 452
@@ -309,6 +481,8 @@ static int aesni_cbc_hmac_sha1_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void
309 SHA1_Init(&key->tail); 481 SHA1_Init(&key->tail);
310 SHA1_Update(&key->tail,hmac_key,sizeof(hmac_key)); 482 SHA1_Update(&key->tail,hmac_key,sizeof(hmac_key));
311 483
484 OPENSSL_cleanse(hmac_key,sizeof(hmac_key));
485
312 return 1; 486 return 1;
313 } 487 }
314 case EVP_CTRL_AEAD_TLS1_AAD: 488 case EVP_CTRL_AEAD_TLS1_AAD:
diff --git a/src/lib/libssl/src/crypto/ocsp/ocsp_vfy.c b/src/lib/libssl/src/crypto/ocsp/ocsp_vfy.c
index 415d67e61c..91a45c9133 100644
--- a/src/lib/libssl/src/crypto/ocsp/ocsp_vfy.c
+++ b/src/lib/libssl/src/crypto/ocsp/ocsp_vfy.c
@@ -91,9 +91,12 @@ int OCSP_basic_verify(OCSP_BASICRESP *bs, STACK_OF(X509) *certs,
91 { 91 {
92 EVP_PKEY *skey; 92 EVP_PKEY *skey;
93 skey = X509_get_pubkey(signer); 93 skey = X509_get_pubkey(signer);
94 ret = OCSP_BASICRESP_verify(bs, skey, 0); 94 if (skey)
95 EVP_PKEY_free(skey); 95 {
96 if(ret <= 0) 96 ret = OCSP_BASICRESP_verify(bs, skey, 0);
97 EVP_PKEY_free(skey);
98 }
99 if(!skey || ret <= 0)
97 { 100 {
98 OCSPerr(OCSP_F_OCSP_BASIC_VERIFY, OCSP_R_SIGNATURE_FAILURE); 101 OCSPerr(OCSP_F_OCSP_BASIC_VERIFY, OCSP_R_SIGNATURE_FAILURE);
99 goto end; 102 goto end;
diff --git a/src/lib/libssl/src/crypto/rsa/rsa_oaep.c b/src/lib/libssl/src/crypto/rsa/rsa_oaep.c
index 553d212ebe..e08ac151ff 100644
--- a/src/lib/libssl/src/crypto/rsa/rsa_oaep.c
+++ b/src/lib/libssl/src/crypto/rsa/rsa_oaep.c
@@ -149,7 +149,7 @@ int RSA_padding_check_PKCS1_OAEP(unsigned char *to, int tlen,
149 if (!EVP_Digest((void *)param, plen, phash, NULL, EVP_sha1(), NULL)) 149 if (!EVP_Digest((void *)param, plen, phash, NULL, EVP_sha1(), NULL))
150 return -1; 150 return -1;
151 151
152 if (memcmp(db, phash, SHA_DIGEST_LENGTH) != 0 || bad) 152 if (timingsafe_bcmp(db, phash, SHA_DIGEST_LENGTH) != 0 || bad)
153 goto decoding_err; 153 goto decoding_err;
154 else 154 else
155 { 155 {
diff --git a/src/lib/libssl/src/ssl/d1_enc.c b/src/lib/libssl/src/ssl/d1_enc.c
index 07a5e97ce5..712c4647f2 100644
--- a/src/lib/libssl/src/ssl/d1_enc.c
+++ b/src/lib/libssl/src/ssl/d1_enc.c
@@ -126,20 +126,28 @@
126#include <openssl/des.h> 126#include <openssl/des.h>
127#endif 127#endif
128 128
129/* dtls1_enc encrypts/decrypts the record in |s->wrec| / |s->rrec|, respectively.
130 *
131 * Returns:
132 * 0: (in non-constant time) if the record is publically invalid (i.e. too
133 * short etc).
134 * 1: if the record's padding is valid / the encryption was successful.
135 * -1: if the record's padding/AEAD-authenticator is invalid or, if sending,
136 * an internal error occured. */
129int dtls1_enc(SSL *s, int send) 137int dtls1_enc(SSL *s, int send)
130 { 138 {
131 SSL3_RECORD *rec; 139 SSL3_RECORD *rec;
132 EVP_CIPHER_CTX *ds; 140 EVP_CIPHER_CTX *ds;
133 unsigned long l; 141 unsigned long l;
134 int bs,i,ii,j,k,n=0; 142 int bs,i,j,k,mac_size=0;
135 const EVP_CIPHER *enc; 143 const EVP_CIPHER *enc;
136 144
137 if (send) 145 if (send)
138 { 146 {
139 if (EVP_MD_CTX_md(s->write_hash)) 147 if (EVP_MD_CTX_md(s->write_hash))
140 { 148 {
141 n=EVP_MD_CTX_size(s->write_hash); 149 mac_size=EVP_MD_CTX_size(s->write_hash);
142 if (n < 0) 150 if (mac_size < 0)
143 return -1; 151 return -1;
144 } 152 }
145 ds=s->enc_write_ctx; 153 ds=s->enc_write_ctx;
@@ -164,9 +172,8 @@ int dtls1_enc(SSL *s, int send)
164 { 172 {
165 if (EVP_MD_CTX_md(s->read_hash)) 173 if (EVP_MD_CTX_md(s->read_hash))
166 { 174 {
167 n=EVP_MD_CTX_size(s->read_hash); 175 mac_size=EVP_MD_CTX_size(s->read_hash);
168 if (n < 0) 176 OPENSSL_assert(mac_size >= 0);
169 return -1;
170 } 177 }
171 ds=s->enc_read_ctx; 178 ds=s->enc_read_ctx;
172 rec= &(s->s3->rrec); 179 rec= &(s->s3->rrec);
@@ -231,7 +238,7 @@ int dtls1_enc(SSL *s, int send)
231 if (!send) 238 if (!send)
232 { 239 {
233 if (l == 0 || l%bs != 0) 240 if (l == 0 || l%bs != 0)
234 return -1; 241 return 0;
235 } 242 }
236 243
237 EVP_Cipher(ds,rec->data,rec->input,l); 244 EVP_Cipher(ds,rec->data,rec->input,l);
@@ -246,43 +253,7 @@ int dtls1_enc(SSL *s, int send)
246#endif /* KSSL_DEBUG */ 253#endif /* KSSL_DEBUG */
247 254
248 if ((bs != 1) && !send) 255 if ((bs != 1) && !send)
249 { 256 return tls1_cbc_remove_padding(s, rec, bs, mac_size);
250 ii=i=rec->data[l-1]; /* padding_length */
251 i++;
252 if (s->options&SSL_OP_TLS_BLOCK_PADDING_BUG)
253 {
254 /* First packet is even in size, so check */
255 if ((memcmp(s->s3->read_sequence,
256 "\0\0\0\0\0\0\0\0",8) == 0) && !(ii & 1))
257 s->s3->flags|=TLS1_FLAGS_TLS_PADDING_BUG;
258 if (s->s3->flags & TLS1_FLAGS_TLS_PADDING_BUG)
259 i--;
260 }
261 /* TLS 1.0 does not bound the number of padding bytes by the block size.
262 * All of them must have value 'padding_length'. */
263 if (i + bs > (int)rec->length)
264 {
265 /* Incorrect padding. SSLerr() and ssl3_alert are done
266 * by caller: we don't want to reveal whether this is
267 * a decryption error or a MAC verification failure
268 * (see http://www.openssl.org/~bodo/tls-cbc.txt)
269 */
270 return -1;
271 }
272 for (j=(int)(l-i); j<(int)l; j++)
273 {
274 if (rec->data[j] != ii)
275 {
276 /* Incorrect padding */
277 return -1;
278 }
279 }
280 rec->length-=i;
281
282 rec->data += bs; /* skip the implicit IV */
283 rec->input += bs;
284 rec->length -= bs;
285 }
286 } 257 }
287 return(1); 258 return(1);
288 } 259 }
diff --git a/src/lib/libssl/src/ssl/d1_pkt.c b/src/lib/libssl/src/ssl/d1_pkt.c
index 987af60835..cfe4524553 100644
--- a/src/lib/libssl/src/ssl/d1_pkt.c
+++ b/src/lib/libssl/src/ssl/d1_pkt.c
@@ -376,15 +376,11 @@ static int
376dtls1_process_record(SSL *s) 376dtls1_process_record(SSL *s)
377{ 377{
378 int i,al; 378 int i,al;
379 int clear=0;
380 int enc_err; 379 int enc_err;
381 SSL_SESSION *sess; 380 SSL_SESSION *sess;
382 SSL3_RECORD *rr; 381 SSL3_RECORD *rr;
383 unsigned int mac_size; 382 unsigned int mac_size, orig_len;
384 unsigned char md[EVP_MAX_MD_SIZE]; 383 unsigned char md[EVP_MAX_MD_SIZE];
385 int decryption_failed_or_bad_record_mac = 0;
386 unsigned char *mac = NULL;
387
388 384
389 rr= &(s->s3->rrec); 385 rr= &(s->s3->rrec);
390 sess = s->session; 386 sess = s->session;
@@ -416,12 +412,16 @@ dtls1_process_record(SSL *s)
416 rr->data=rr->input; 412 rr->data=rr->input;
417 413
418 enc_err = s->method->ssl3_enc->enc(s,0); 414 enc_err = s->method->ssl3_enc->enc(s,0);
419 if (enc_err <= 0) 415 /* enc_err is:
416 * 0: (in non-constant time) if the record is publically invalid.
417 * 1: if the padding is valid
418 * -1: if the padding is invalid */
419 if (enc_err == 0)
420 { 420 {
421 /* To minimize information leaked via timing, we will always 421 /* For DTLS we simply ignore bad packets. */
422 * perform all computations before discarding the message. 422 rr->length = 0;
423 */ 423 s->packet_length = 0;
424 decryption_failed_or_bad_record_mac = 1; 424 goto err;
425 } 425 }
426 426
427#ifdef TLS_DEBUG 427#ifdef TLS_DEBUG
@@ -431,45 +431,62 @@ printf("\n");
431#endif 431#endif
432 432
433 /* r->length is now the compressed data plus mac */ 433 /* r->length is now the compressed data plus mac */
434 if ( (sess == NULL) || 434 if ((sess != NULL) &&
435 (s->enc_read_ctx == NULL) || 435 (s->enc_read_ctx != NULL) &&
436 (s->read_hash == NULL)) 436 (EVP_MD_CTX_md(s->read_hash) != NULL))
437 clear=1;
438
439 if (!clear)
440 { 437 {
441 /* !clear => s->read_hash != NULL => mac_size != -1 */ 438 /* s->read_hash != NULL => mac_size != -1 */
442 int t; 439 unsigned char *mac = NULL;
443 t=EVP_MD_CTX_size(s->read_hash); 440 unsigned char mac_tmp[EVP_MAX_MD_SIZE];
444 OPENSSL_assert(t >= 0); 441 mac_size=EVP_MD_CTX_size(s->read_hash);
445 mac_size=t; 442 OPENSSL_assert(mac_size <= EVP_MAX_MD_SIZE);
446 443
447 if (rr->length > SSL3_RT_MAX_COMPRESSED_LENGTH+mac_size) 444 /* kludge: *_cbc_remove_padding passes padding length in rr->type */
445 orig_len = rr->length+((unsigned int)rr->type>>8);
446
447 /* orig_len is the length of the record before any padding was
448 * removed. This is public information, as is the MAC in use,
449 * therefore we can safely process the record in a different
450 * amount of time if it's too short to possibly contain a MAC.
451 */
452 if (orig_len < mac_size ||
453 /* CBC records must have a padding length byte too. */
454 (EVP_CIPHER_CTX_mode(s->enc_read_ctx) == EVP_CIPH_CBC_MODE &&
455 orig_len < mac_size+1))
448 { 456 {
449#if 0 /* OK only for stream ciphers (then rr->length is visible from ciphertext anyway) */ 457 al=SSL_AD_DECODE_ERROR;
450 al=SSL_AD_RECORD_OVERFLOW; 458 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_LENGTH_TOO_SHORT);
451 SSLerr(SSL_F_DTLS1_PROCESS_RECORD,SSL_R_PRE_MAC_LENGTH_TOO_LONG);
452 goto f_err; 459 goto f_err;
453#else
454 decryption_failed_or_bad_record_mac = 1;
455#endif
456 } 460 }
457 /* check the MAC for rr->input (it's in mac_size bytes at the tail) */ 461
458 if (rr->length >= mac_size) 462 if (EVP_CIPHER_CTX_mode(s->enc_read_ctx) == EVP_CIPH_CBC_MODE)
459 { 463 {
464 /* We update the length so that the TLS header bytes
465 * can be constructed correctly but we need to extract
466 * the MAC in constant time from within the record,
467 * without leaking the contents of the padding bytes.
468 * */
469 mac = mac_tmp;
470 ssl3_cbc_copy_mac(mac_tmp, rr, mac_size, orig_len);
460 rr->length -= mac_size; 471 rr->length -= mac_size;
461 mac = &rr->data[rr->length];
462 } 472 }
463 else 473 else
464 rr->length = 0;
465 i=s->method->ssl3_enc->mac(s,md,0);
466 if (i < 0 || mac == NULL || memcmp(md, mac, mac_size) != 0)
467 { 474 {
468 decryption_failed_or_bad_record_mac = 1; 475 /* In this case there's no padding, so |orig_len|
476 * equals |rec->length| and we checked that there's
477 * enough bytes for |mac_size| above. */
478 rr->length -= mac_size;
479 mac = &rr->data[rr->length];
469 } 480 }
481
482 i=s->method->ssl3_enc->mac(s,md,0 /* not send */);
483 if (i < 0 || mac == NULL || timingsafe_bcmp(md, mac, (size_t)mac_size) != 0)
484 enc_err = -1;
485 if (rr->length > SSL3_RT_MAX_COMPRESSED_LENGTH+mac_size)
486 enc_err = -1;
470 } 487 }
471 488
472 if (decryption_failed_or_bad_record_mac) 489 if (enc_err < 0)
473 { 490 {
474 /* decryption failed, silently discard message */ 491 /* decryption failed, silently discard message */
475 rr->length = 0; 492 rr->length = 0;
diff --git a/src/lib/libssl/src/ssl/s2_clnt.c b/src/lib/libssl/src/ssl/s2_clnt.c
index 00ac158f9b..c65d27946f 100644
--- a/src/lib/libssl/src/ssl/s2_clnt.c
+++ b/src/lib/libssl/src/ssl/s2_clnt.c
@@ -937,7 +937,7 @@ static int get_server_verify(SSL *s)
937 s->msg_callback(0, s->version, 0, p, len, s, s->msg_callback_arg); /* SERVER-VERIFY */ 937 s->msg_callback(0, s->version, 0, p, len, s, s->msg_callback_arg); /* SERVER-VERIFY */
938 p += 1; 938 p += 1;
939 939
940 if (memcmp(p,s->s2->challenge,s->s2->challenge_length) != 0) 940 if (timingsafe_bcmp(p,s->s2->challenge,s->s2->challenge_length) != 0)
941 { 941 {
942 ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR); 942 ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
943 SSLerr(SSL_F_GET_SERVER_VERIFY,SSL_R_CHALLENGE_IS_DIFFERENT); 943 SSLerr(SSL_F_GET_SERVER_VERIFY,SSL_R_CHALLENGE_IS_DIFFERENT);
diff --git a/src/lib/libssl/src/ssl/s2_pkt.c b/src/lib/libssl/src/ssl/s2_pkt.c
index ac963b2d47..b6ac9caf4a 100644
--- a/src/lib/libssl/src/ssl/s2_pkt.c
+++ b/src/lib/libssl/src/ssl/s2_pkt.c
@@ -269,8 +269,7 @@ static int ssl2_read_internal(SSL *s, void *buf, int len, int peek)
269 s->s2->ract_data_length-=mac_size; 269 s->s2->ract_data_length-=mac_size;
270 ssl2_mac(s,mac,0); 270 ssl2_mac(s,mac,0);
271 s->s2->ract_data_length-=s->s2->padding; 271 s->s2->ract_data_length-=s->s2->padding;
272 if ( (memcmp(mac,s->s2->mac_data, 272 if ( (timingsafe_bcmp(mac,s->s2->mac_data,mac_size) != 0) ||
273 (unsigned int)mac_size) != 0) ||
274 (s->s2->rlength%EVP_CIPHER_CTX_block_size(s->enc_read_ctx) != 0)) 273 (s->s2->rlength%EVP_CIPHER_CTX_block_size(s->enc_read_ctx) != 0))
275 { 274 {
276 SSLerr(SSL_F_SSL2_READ_INTERNAL,SSL_R_BAD_MAC_DECODE); 275 SSLerr(SSL_F_SSL2_READ_INTERNAL,SSL_R_BAD_MAC_DECODE);
diff --git a/src/lib/libssl/src/ssl/s3_both.c b/src/lib/libssl/src/ssl/s3_both.c
index b63460a56d..6981852b5b 100644
--- a/src/lib/libssl/src/ssl/s3_both.c
+++ b/src/lib/libssl/src/ssl/s3_both.c
@@ -263,7 +263,7 @@ int ssl3_get_finished(SSL *s, int a, int b)
263 goto f_err; 263 goto f_err;
264 } 264 }
265 265
266 if (memcmp(p, s->s3->tmp.peer_finish_md, i) != 0) 266 if (timingsafe_bcmp(p, s->s3->tmp.peer_finish_md, i) != 0)
267 { 267 {
268 al=SSL_AD_DECRYPT_ERROR; 268 al=SSL_AD_DECRYPT_ERROR;
269 SSLerr(SSL_F_SSL3_GET_FINISHED,SSL_R_DIGEST_CHECK_FAILED); 269 SSLerr(SSL_F_SSL3_GET_FINISHED,SSL_R_DIGEST_CHECK_FAILED);
diff --git a/src/lib/libssl/src/ssl/s3_cbc.c b/src/lib/libssl/src/ssl/s3_cbc.c
new file mode 100644
index 0000000000..443a31e746
--- /dev/null
+++ b/src/lib/libssl/src/ssl/s3_cbc.c
@@ -0,0 +1,790 @@
1/* ssl/s3_cbc.c */
2/* ====================================================================
3 * Copyright (c) 2012 The OpenSSL Project. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 *
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in
14 * the documentation and/or other materials provided with the
15 * distribution.
16 *
17 * 3. All advertising materials mentioning features or use of this
18 * software must display the following acknowledgment:
19 * "This product includes software developed by the OpenSSL Project
20 * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
21 *
22 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
23 * endorse or promote products derived from this software without
24 * prior written permission. For written permission, please contact
25 * openssl-core@openssl.org.
26 *
27 * 5. Products derived from this software may not be called "OpenSSL"
28 * nor may "OpenSSL" appear in their names without prior written
29 * permission of the OpenSSL Project.
30 *
31 * 6. Redistributions of any form whatsoever must retain the following
32 * acknowledgment:
33 * "This product includes software developed by the OpenSSL Project
34 * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
35 *
36 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
37 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
38 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
39 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
40 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
42 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
43 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
44 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
45 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
46 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
47 * OF THE POSSIBILITY OF SUCH DAMAGE.
48 * ====================================================================
49 *
50 * This product includes cryptographic software written by Eric Young
51 * (eay@cryptsoft.com). This product includes software written by Tim
52 * Hudson (tjh@cryptsoft.com).
53 *
54 */
55
56#include "ssl_locl.h"
57
58#include <openssl/md5.h>
59#include <openssl/sha.h>
60
61/* MAX_HASH_BIT_COUNT_BYTES is the maximum number of bytes in the hash's length
62 * field. (SHA-384/512 have 128-bit length.) */
63#define MAX_HASH_BIT_COUNT_BYTES 16
64
65/* MAX_HASH_BLOCK_SIZE is the maximum hash block size that we'll support.
66 * Currently SHA-384/512 has a 128-byte block size and that's the largest
67 * supported by TLS.) */
68#define MAX_HASH_BLOCK_SIZE 128
69
70/* Some utility functions are needed:
71 *
72 * These macros return the given value with the MSB copied to all the other
73 * bits. They use the fact that arithmetic shift shifts-in the sign bit.
74 * However, this is not ensured by the C standard so you may need to replace
75 * them with something else on odd CPUs. */
76#define DUPLICATE_MSB_TO_ALL(x) ( (unsigned)( (int)(x) >> (sizeof(int)*8-1) ) )
77#define DUPLICATE_MSB_TO_ALL_8(x) ((unsigned char)(DUPLICATE_MSB_TO_ALL(x)))
78
79/* constant_time_lt returns 0xff if a<b and 0x00 otherwise. */
80static unsigned constant_time_lt(unsigned a, unsigned b)
81 {
82 a -= b;
83 return DUPLICATE_MSB_TO_ALL(a);
84 }
85
86/* constant_time_ge returns 0xff if a>=b and 0x00 otherwise. */
87static unsigned constant_time_ge(unsigned a, unsigned b)
88 {
89 a -= b;
90 return DUPLICATE_MSB_TO_ALL(~a);
91 }
92
93/* constant_time_eq_8 returns 0xff if a==b and 0x00 otherwise. */
94static unsigned char constant_time_eq_8(unsigned a, unsigned b)
95 {
96 unsigned c = a ^ b;
97 c--;
98 return DUPLICATE_MSB_TO_ALL_8(c);
99 }
100
101/* ssl3_cbc_remove_padding removes padding from the decrypted, SSLv3, CBC
102 * record in |rec| by updating |rec->length| in constant time.
103 *
104 * block_size: the block size of the cipher used to encrypt the record.
105 * returns:
106 * 0: (in non-constant time) if the record is publicly invalid.
107 * 1: if the padding was valid
108 * -1: otherwise. */
109int ssl3_cbc_remove_padding(const SSL* s,
110 SSL3_RECORD *rec,
111 unsigned block_size,
112 unsigned mac_size)
113 {
114 unsigned padding_length, good;
115 const unsigned overhead = 1 /* padding length byte */ + mac_size;
116
117 /* These lengths are all public so we can test them in non-constant
118 * time. */
119 if (overhead > rec->length)
120 return 0;
121
122 padding_length = rec->data[rec->length-1];
123 good = constant_time_ge(rec->length, padding_length+overhead);
124 /* SSLv3 requires that the padding is minimal. */
125 good &= constant_time_ge(block_size, padding_length+1);
126 padding_length = good & (padding_length+1);
127 rec->length -= padding_length;
128 rec->type |= padding_length<<8; /* kludge: pass padding length */
129 return (int)((good & 1) | (~good & -1));
130}
131
132/* tls1_cbc_remove_padding removes the CBC padding from the decrypted, TLS, CBC
133 * record in |rec| in constant time and returns 1 if the padding is valid and
134 * -1 otherwise. It also removes any explicit IV from the start of the record
135 * without leaking any timing about whether there was enough space after the
136 * padding was removed.
137 *
138 * block_size: the block size of the cipher used to encrypt the record.
139 * returns:
140 * 0: (in non-constant time) if the record is publicly invalid.
141 * 1: if the padding was valid
142 * -1: otherwise. */
143int tls1_cbc_remove_padding(const SSL* s,
144 SSL3_RECORD *rec,
145 unsigned block_size,
146 unsigned mac_size)
147 {
148 unsigned padding_length, good, to_check, i;
149 const unsigned overhead = 1 /* padding length byte */ + mac_size;
150 /* Check if version requires explicit IV */
151 if (s->version >= TLS1_1_VERSION || s->version == DTLS1_BAD_VER)
152 {
153 /* These lengths are all public so we can test them in
154 * non-constant time.
155 */
156 if (overhead + block_size > rec->length)
157 return 0;
158 /* We can now safely skip explicit IV */
159 rec->data += block_size;
160 rec->input += block_size;
161 rec->length -= block_size;
162 }
163 else if (overhead > rec->length)
164 return 0;
165
166 padding_length = rec->data[rec->length-1];
167
168 /* NB: if compression is in operation the first packet may not be of
169 * even length so the padding bug check cannot be performed. This bug
170 * workaround has been around since SSLeay so hopefully it is either
171 * fixed now or no buggy implementation supports compression [steve]
172 */
173 if ( (s->options&SSL_OP_TLS_BLOCK_PADDING_BUG) && !s->expand)
174 {
175 /* First packet is even in size, so check */
176 if ((memcmp(s->s3->read_sequence, "\0\0\0\0\0\0\0\0",8) == 0) &&
177 !(padding_length & 1))
178 {
179 s->s3->flags|=TLS1_FLAGS_TLS_PADDING_BUG;
180 }
181 if ((s->s3->flags & TLS1_FLAGS_TLS_PADDING_BUG) &&
182 padding_length > 0)
183 {
184 padding_length--;
185 }
186 }
187
188 if (EVP_CIPHER_flags(s->enc_read_ctx->cipher)&EVP_CIPH_FLAG_AEAD_CIPHER)
189 {
190 /* padding is already verified */
191 rec->length -= padding_length + 1;
192 return 1;
193 }
194
195 good = constant_time_ge(rec->length, overhead+padding_length);
196 /* The padding consists of a length byte at the end of the record and
197 * then that many bytes of padding, all with the same value as the
198 * length byte. Thus, with the length byte included, there are i+1
199 * bytes of padding.
200 *
201 * We can't check just |padding_length+1| bytes because that leaks
202 * decrypted information. Therefore we always have to check the maximum
203 * amount of padding possible. (Again, the length of the record is
204 * public information so we can use it.) */
205 to_check = 255; /* maximum amount of padding. */
206 if (to_check > rec->length-1)
207 to_check = rec->length-1;
208
209 for (i = 0; i < to_check; i++)
210 {
211 unsigned char mask = constant_time_ge(padding_length, i);
212 unsigned char b = rec->data[rec->length-1-i];
213 /* The final |padding_length+1| bytes should all have the value
214 * |padding_length|. Therefore the XOR should be zero. */
215 good &= ~(mask&(padding_length ^ b));
216 }
217
218 /* If any of the final |padding_length+1| bytes had the wrong value,
219 * one or more of the lower eight bits of |good| will be cleared. We
220 * AND the bottom 8 bits together and duplicate the result to all the
221 * bits. */
222 good &= good >> 4;
223 good &= good >> 2;
224 good &= good >> 1;
225 good <<= sizeof(good)*8-1;
226 good = DUPLICATE_MSB_TO_ALL(good);
227
228 padding_length = good & (padding_length+1);
229 rec->length -= padding_length;
230 rec->type |= padding_length<<8; /* kludge: pass padding length */
231
232 return (int)((good & 1) | (~good & -1));
233 }
234
235/* ssl3_cbc_copy_mac copies |md_size| bytes from the end of |rec| to |out| in
236 * constant time (independent of the concrete value of rec->length, which may
237 * vary within a 256-byte window).
238 *
239 * ssl3_cbc_remove_padding or tls1_cbc_remove_padding must be called prior to
240 * this function.
241 *
242 * On entry:
243 * rec->orig_len >= md_size
244 * md_size <= EVP_MAX_MD_SIZE
245 *
246 * If CBC_MAC_ROTATE_IN_PLACE is defined then the rotation is performed with
247 * variable accesses in a 64-byte-aligned buffer. Assuming that this fits into
248 * a single or pair of cache-lines, then the variable memory accesses don't
249 * actually affect the timing. CPUs with smaller cache-lines [if any] are
250 * not multi-core and are not considered vulnerable to cache-timing attacks.
251 */
252#define CBC_MAC_ROTATE_IN_PLACE
253
254void ssl3_cbc_copy_mac(unsigned char* out,
255 const SSL3_RECORD *rec,
256 unsigned md_size,unsigned orig_len)
257 {
258#if defined(CBC_MAC_ROTATE_IN_PLACE)
259 unsigned char rotated_mac_buf[64+EVP_MAX_MD_SIZE];
260 unsigned char *rotated_mac;
261#else
262 unsigned char rotated_mac[EVP_MAX_MD_SIZE];
263#endif
264
265 /* mac_end is the index of |rec->data| just after the end of the MAC. */
266 unsigned mac_end = rec->length;
267 unsigned mac_start = mac_end - md_size;
268 /* scan_start contains the number of bytes that we can ignore because
269 * the MAC's position can only vary by 255 bytes. */
270 unsigned scan_start = 0;
271 unsigned i, j;
272 unsigned div_spoiler;
273 unsigned rotate_offset;
274
275 OPENSSL_assert(orig_len >= md_size);
276 OPENSSL_assert(md_size <= EVP_MAX_MD_SIZE);
277
278#if defined(CBC_MAC_ROTATE_IN_PLACE)
279 rotated_mac = rotated_mac_buf + ((0-(size_t)rotated_mac_buf)&63);
280#endif
281
282 /* This information is public so it's safe to branch based on it. */
283 if (orig_len > md_size + 255 + 1)
284 scan_start = orig_len - (md_size + 255 + 1);
285 /* div_spoiler contains a multiple of md_size that is used to cause the
286 * modulo operation to be constant time. Without this, the time varies
287 * based on the amount of padding when running on Intel chips at least.
288 *
289 * The aim of right-shifting md_size is so that the compiler doesn't
290 * figure out that it can remove div_spoiler as that would require it
291 * to prove that md_size is always even, which I hope is beyond it. */
292 div_spoiler = md_size >> 1;
293 div_spoiler <<= (sizeof(div_spoiler)-1)*8;
294 rotate_offset = (div_spoiler + mac_start - scan_start) % md_size;
295
296 memset(rotated_mac, 0, md_size);
297 for (i = scan_start, j = 0; i < orig_len; i++)
298 {
299 unsigned char mac_started = constant_time_ge(i, mac_start);
300 unsigned char mac_ended = constant_time_ge(i, mac_end);
301 unsigned char b = rec->data[i];
302 rotated_mac[j++] |= b & mac_started & ~mac_ended;
303 j &= constant_time_lt(j,md_size);
304 }
305
306 /* Now rotate the MAC */
307#if defined(CBC_MAC_ROTATE_IN_PLACE)
308 j = 0;
309 for (i = 0; i < md_size; i++)
310 {
311 /* in case cache-line is 32 bytes, touch second line */
312 ((volatile unsigned char *)rotated_mac)[rotate_offset^32];
313 out[j++] = rotated_mac[rotate_offset++];
314 rotate_offset &= constant_time_lt(rotate_offset,md_size);
315 }
316#else
317 memset(out, 0, md_size);
318 rotate_offset = md_size - rotate_offset;
319 rotate_offset &= constant_time_lt(rotate_offset,md_size);
320 for (i = 0; i < md_size; i++)
321 {
322 for (j = 0; j < md_size; j++)
323 out[j] |= rotated_mac[i] & constant_time_eq_8(j, rotate_offset);
324 rotate_offset++;
325 rotate_offset &= constant_time_lt(rotate_offset,md_size);
326 }
327#endif
328 }
329
330/* u32toLE serialises an unsigned, 32-bit number (n) as four bytes at (p) in
331 * little-endian order. The value of p is advanced by four. */
332#define u32toLE(n, p) \
333 (*((p)++)=(unsigned char)(n), \
334 *((p)++)=(unsigned char)(n>>8), \
335 *((p)++)=(unsigned char)(n>>16), \
336 *((p)++)=(unsigned char)(n>>24))
337
338/* These functions serialize the state of a hash and thus perform the standard
339 * "final" operation without adding the padding and length that such a function
340 * typically does. */
341static void tls1_md5_final_raw(void* ctx, unsigned char *md_out)
342 {
343 MD5_CTX *md5 = ctx;
344 u32toLE(md5->A, md_out);
345 u32toLE(md5->B, md_out);
346 u32toLE(md5->C, md_out);
347 u32toLE(md5->D, md_out);
348 }
349
350static void tls1_sha1_final_raw(void* ctx, unsigned char *md_out)
351 {
352 SHA_CTX *sha1 = ctx;
353 l2n(sha1->h0, md_out);
354 l2n(sha1->h1, md_out);
355 l2n(sha1->h2, md_out);
356 l2n(sha1->h3, md_out);
357 l2n(sha1->h4, md_out);
358 }
359#define LARGEST_DIGEST_CTX SHA_CTX
360
361#ifndef OPENSSL_NO_SHA256
362static void tls1_sha256_final_raw(void* ctx, unsigned char *md_out)
363 {
364 SHA256_CTX *sha256 = ctx;
365 unsigned i;
366
367 for (i = 0; i < 8; i++)
368 {
369 l2n(sha256->h[i], md_out);
370 }
371 }
372#undef LARGEST_DIGEST_CTX
373#define LARGEST_DIGEST_CTX SHA256_CTX
374#endif
375
376#ifndef OPENSSL_NO_SHA512
377static void tls1_sha512_final_raw(void* ctx, unsigned char *md_out)
378 {
379 SHA512_CTX *sha512 = ctx;
380 unsigned i;
381
382 for (i = 0; i < 8; i++)
383 {
384 l2n8(sha512->h[i], md_out);
385 }
386 }
387#undef LARGEST_DIGEST_CTX
388#define LARGEST_DIGEST_CTX SHA512_CTX
389#endif
390
391/* ssl3_cbc_record_digest_supported returns 1 iff |ctx| uses a hash function
392 * which ssl3_cbc_digest_record supports. */
393char ssl3_cbc_record_digest_supported(const EVP_MD_CTX *ctx)
394 {
395#ifdef OPENSSL_FIPS
396 if (FIPS_mode())
397 return 0;
398#endif
399 switch (EVP_MD_CTX_type(ctx))
400 {
401 case NID_md5:
402 case NID_sha1:
403#ifndef OPENSSL_NO_SHA256
404 case NID_sha224:
405 case NID_sha256:
406#endif
407#ifndef OPENSSL_NO_SHA512
408 case NID_sha384:
409 case NID_sha512:
410#endif
411 return 1;
412 default:
413 return 0;
414 }
415 }
416
417/* ssl3_cbc_digest_record computes the MAC of a decrypted, padded SSLv3/TLS
418 * record.
419 *
420 * ctx: the EVP_MD_CTX from which we take the hash function.
421 * ssl3_cbc_record_digest_supported must return true for this EVP_MD_CTX.
422 * md_out: the digest output. At most EVP_MAX_MD_SIZE bytes will be written.
423 * md_out_size: if non-NULL, the number of output bytes is written here.
424 * header: the 13-byte, TLS record header.
425 * data: the record data itself, less any preceeding explicit IV.
426 * data_plus_mac_size: the secret, reported length of the data and MAC
427 * once the padding has been removed.
428 * data_plus_mac_plus_padding_size: the public length of the whole
429 * record, including padding.
430 * is_sslv3: non-zero if we are to use SSLv3. Otherwise, TLS.
431 *
432 * On entry: by virtue of having been through one of the remove_padding
433 * functions, above, we know that data_plus_mac_size is large enough to contain
434 * a padding byte and MAC. (If the padding was invalid, it might contain the
435 * padding too. ) */
436void ssl3_cbc_digest_record(
437 const EVP_MD_CTX *ctx,
438 unsigned char* md_out,
439 size_t* md_out_size,
440 const unsigned char header[13],
441 const unsigned char *data,
442 size_t data_plus_mac_size,
443 size_t data_plus_mac_plus_padding_size,
444 const unsigned char *mac_secret,
445 unsigned mac_secret_length,
446 char is_sslv3)
447 {
448 union { double align;
449 unsigned char c[sizeof(LARGEST_DIGEST_CTX)]; } md_state;
450 void (*md_final_raw)(void *ctx, unsigned char *md_out);
451 void (*md_transform)(void *ctx, const unsigned char *block);
452 unsigned md_size, md_block_size = 64;
453 unsigned sslv3_pad_length = 40, header_length, variance_blocks,
454 len, max_mac_bytes, num_blocks,
455 num_starting_blocks, k, mac_end_offset, c, index_a, index_b;
456 unsigned int bits; /* at most 18 bits */
457 unsigned char length_bytes[MAX_HASH_BIT_COUNT_BYTES];
458 /* hmac_pad is the masked HMAC key. */
459 unsigned char hmac_pad[MAX_HASH_BLOCK_SIZE];
460 unsigned char first_block[MAX_HASH_BLOCK_SIZE];
461 unsigned char mac_out[EVP_MAX_MD_SIZE];
462 unsigned i, j, md_out_size_u;
463 EVP_MD_CTX md_ctx;
464 /* mdLengthSize is the number of bytes in the length field that terminates
465 * the hash. */
466 unsigned md_length_size = 8;
467 char length_is_big_endian = 1;
468
469 /* This is a, hopefully redundant, check that allows us to forget about
470 * many possible overflows later in this function. */
471 OPENSSL_assert(data_plus_mac_plus_padding_size < 1024*1024);
472
473 switch (EVP_MD_CTX_type(ctx))
474 {
475 case NID_md5:
476 MD5_Init((MD5_CTX*)md_state.c);
477 md_final_raw = tls1_md5_final_raw;
478 md_transform = (void(*)(void *ctx, const unsigned char *block)) MD5_Transform;
479 md_size = 16;
480 sslv3_pad_length = 48;
481 length_is_big_endian = 0;
482 break;
483 case NID_sha1:
484 SHA1_Init((SHA_CTX*)md_state.c);
485 md_final_raw = tls1_sha1_final_raw;
486 md_transform = (void(*)(void *ctx, const unsigned char *block)) SHA1_Transform;
487 md_size = 20;
488 break;
489#ifndef OPENSSL_NO_SHA256
490 case NID_sha224:
491 SHA224_Init((SHA256_CTX*)md_state.c);
492 md_final_raw = tls1_sha256_final_raw;
493 md_transform = (void(*)(void *ctx, const unsigned char *block)) SHA256_Transform;
494 md_size = 224/8;
495 break;
496 case NID_sha256:
497 SHA256_Init((SHA256_CTX*)md_state.c);
498 md_final_raw = tls1_sha256_final_raw;
499 md_transform = (void(*)(void *ctx, const unsigned char *block)) SHA256_Transform;
500 md_size = 32;
501 break;
502#endif
503#ifndef OPENSSL_NO_SHA512
504 case NID_sha384:
505 SHA384_Init((SHA512_CTX*)md_state.c);
506 md_final_raw = tls1_sha512_final_raw;
507 md_transform = (void(*)(void *ctx, const unsigned char *block)) SHA512_Transform;
508 md_size = 384/8;
509 md_block_size = 128;
510 md_length_size = 16;
511 break;
512 case NID_sha512:
513 SHA512_Init((SHA512_CTX*)md_state.c);
514 md_final_raw = tls1_sha512_final_raw;
515 md_transform = (void(*)(void *ctx, const unsigned char *block)) SHA512_Transform;
516 md_size = 64;
517 md_block_size = 128;
518 md_length_size = 16;
519 break;
520#endif
521 default:
522 /* ssl3_cbc_record_digest_supported should have been
523 * called first to check that the hash function is
524 * supported. */
525 OPENSSL_assert(0);
526 if (md_out_size)
527 *md_out_size = -1;
528 return;
529 }
530
531 OPENSSL_assert(md_length_size <= MAX_HASH_BIT_COUNT_BYTES);
532 OPENSSL_assert(md_block_size <= MAX_HASH_BLOCK_SIZE);
533 OPENSSL_assert(md_size <= EVP_MAX_MD_SIZE);
534
535 header_length = 13;
536 if (is_sslv3)
537 {
538 header_length =
539 mac_secret_length +
540 sslv3_pad_length +
541 8 /* sequence number */ +
542 1 /* record type */ +
543 2 /* record length */;
544 }
545
546 /* variance_blocks is the number of blocks of the hash that we have to
547 * calculate in constant time because they could be altered by the
548 * padding value.
549 *
550 * In SSLv3, the padding must be minimal so the end of the plaintext
551 * varies by, at most, 15+20 = 35 bytes. (We conservatively assume that
552 * the MAC size varies from 0..20 bytes.) In case the 9 bytes of hash
553 * termination (0x80 + 64-bit length) don't fit in the final block, we
554 * say that the final two blocks can vary based on the padding.
555 *
556 * TLSv1 has MACs up to 48 bytes long (SHA-384) and the padding is not
557 * required to be minimal. Therefore we say that the final six blocks
558 * can vary based on the padding.
559 *
560 * Later in the function, if the message is short and there obviously
561 * cannot be this many blocks then variance_blocks can be reduced. */
562 variance_blocks = is_sslv3 ? 2 : 6;
563 /* From now on we're dealing with the MAC, which conceptually has 13
564 * bytes of `header' before the start of the data (TLS) or 71/75 bytes
565 * (SSLv3) */
566 len = data_plus_mac_plus_padding_size + header_length;
567 /* max_mac_bytes contains the maximum bytes of bytes in the MAC, including
568 * |header|, assuming that there's no padding. */
569 max_mac_bytes = len - md_size - 1;
570 /* num_blocks is the maximum number of hash blocks. */
571 num_blocks = (max_mac_bytes + 1 + md_length_size + md_block_size - 1) / md_block_size;
572 /* In order to calculate the MAC in constant time we have to handle
573 * the final blocks specially because the padding value could cause the
574 * end to appear somewhere in the final |variance_blocks| blocks and we
575 * can't leak where. However, |num_starting_blocks| worth of data can
576 * be hashed right away because no padding value can affect whether
577 * they are plaintext. */
578 num_starting_blocks = 0;
579 /* k is the starting byte offset into the conceptual header||data where
580 * we start processing. */
581 k = 0;
582 /* mac_end_offset is the index just past the end of the data to be
583 * MACed. */
584 mac_end_offset = data_plus_mac_size + header_length - md_size;
585 /* c is the index of the 0x80 byte in the final hash block that
586 * contains application data. */
587 c = mac_end_offset % md_block_size;
588 /* index_a is the hash block number that contains the 0x80 terminating
589 * value. */
590 index_a = mac_end_offset / md_block_size;
591 /* index_b is the hash block number that contains the 64-bit hash
592 * length, in bits. */
593 index_b = (mac_end_offset + md_length_size) / md_block_size;
594 /* bits is the hash-length in bits. It includes the additional hash
595 * block for the masked HMAC key, or whole of |header| in the case of
596 * SSLv3. */
597
598 /* For SSLv3, if we're going to have any starting blocks then we need
599 * at least two because the header is larger than a single block. */
600 if (num_blocks > variance_blocks + (is_sslv3 ? 1 : 0))
601 {
602 num_starting_blocks = num_blocks - variance_blocks;
603 k = md_block_size*num_starting_blocks;
604 }
605
606 bits = 8*mac_end_offset;
607 if (!is_sslv3)
608 {
609 /* Compute the initial HMAC block. For SSLv3, the padding and
610 * secret bytes are included in |header| because they take more
611 * than a single block. */
612 bits += 8*md_block_size;
613 memset(hmac_pad, 0, md_block_size);
614 OPENSSL_assert(mac_secret_length <= sizeof(hmac_pad));
615 memcpy(hmac_pad, mac_secret, mac_secret_length);
616 for (i = 0; i < md_block_size; i++)
617 hmac_pad[i] ^= 0x36;
618
619 md_transform(md_state.c, hmac_pad);
620 }
621
622 if (length_is_big_endian)
623 {
624 memset(length_bytes,0,md_length_size-4);
625 length_bytes[md_length_size-4] = (unsigned char)(bits>>24);
626 length_bytes[md_length_size-3] = (unsigned char)(bits>>16);
627 length_bytes[md_length_size-2] = (unsigned char)(bits>>8);
628 length_bytes[md_length_size-1] = (unsigned char)bits;
629 }
630 else
631 {
632 memset(length_bytes,0,md_length_size);
633 length_bytes[md_length_size-5] = (unsigned char)(bits>>24);
634 length_bytes[md_length_size-6] = (unsigned char)(bits>>16);
635 length_bytes[md_length_size-7] = (unsigned char)(bits>>8);
636 length_bytes[md_length_size-8] = (unsigned char)bits;
637 }
638
639 if (k > 0)
640 {
641 if (is_sslv3)
642 {
643 /* The SSLv3 header is larger than a single block.
644 * overhang is the number of bytes beyond a single
645 * block that the header consumes: either 7 bytes
646 * (SHA1) or 11 bytes (MD5). */
647 unsigned overhang = header_length-md_block_size;
648 md_transform(md_state.c, header);
649 memcpy(first_block, header + md_block_size, overhang);
650 memcpy(first_block + overhang, data, md_block_size-overhang);
651 md_transform(md_state.c, first_block);
652 for (i = 1; i < k/md_block_size - 1; i++)
653 md_transform(md_state.c, data + md_block_size*i - overhang);
654 }
655 else
656 {
657 /* k is a multiple of md_block_size. */
658 memcpy(first_block, header, 13);
659 memcpy(first_block+13, data, md_block_size-13);
660 md_transform(md_state.c, first_block);
661 for (i = 1; i < k/md_block_size; i++)
662 md_transform(md_state.c, data + md_block_size*i - 13);
663 }
664 }
665
666 memset(mac_out, 0, sizeof(mac_out));
667
668 /* We now process the final hash blocks. For each block, we construct
669 * it in constant time. If the |i==index_a| then we'll include the 0x80
670 * bytes and zero pad etc. For each block we selectively copy it, in
671 * constant time, to |mac_out|. */
672 for (i = num_starting_blocks; i <= num_starting_blocks+variance_blocks; i++)
673 {
674 unsigned char block[MAX_HASH_BLOCK_SIZE];
675 unsigned char is_block_a = constant_time_eq_8(i, index_a);
676 unsigned char is_block_b = constant_time_eq_8(i, index_b);
677 for (j = 0; j < md_block_size; j++)
678 {
679 unsigned char b = 0, is_past_c, is_past_cp1;
680 if (k < header_length)
681 b = header[k];
682 else if (k < data_plus_mac_plus_padding_size + header_length)
683 b = data[k-header_length];
684 k++;
685
686 is_past_c = is_block_a & constant_time_ge(j, c);
687 is_past_cp1 = is_block_a & constant_time_ge(j, c+1);
688 /* If this is the block containing the end of the
689 * application data, and we are at the offset for the
690 * 0x80 value, then overwrite b with 0x80. */
691 b = (b&~is_past_c) | (0x80&is_past_c);
692 /* If this the the block containing the end of the
693 * application data and we're past the 0x80 value then
694 * just write zero. */
695 b = b&~is_past_cp1;
696 /* If this is index_b (the final block), but not
697 * index_a (the end of the data), then the 64-bit
698 * length didn't fit into index_a and we're having to
699 * add an extra block of zeros. */
700 b &= ~is_block_b | is_block_a;
701
702 /* The final bytes of one of the blocks contains the
703 * length. */
704 if (j >= md_block_size - md_length_size)
705 {
706 /* If this is index_b, write a length byte. */
707 b = (b&~is_block_b) | (is_block_b&length_bytes[j-(md_block_size-md_length_size)]);
708 }
709 block[j] = b;
710 }
711
712 md_transform(md_state.c, block);
713 md_final_raw(md_state.c, block);
714 /* If this is index_b, copy the hash value to |mac_out|. */
715 for (j = 0; j < md_size; j++)
716 mac_out[j] |= block[j]&is_block_b;
717 }
718
719 EVP_MD_CTX_init(&md_ctx);
720 EVP_DigestInit_ex(&md_ctx, ctx->digest, NULL /* engine */);
721 if (is_sslv3)
722 {
723 /* We repurpose |hmac_pad| to contain the SSLv3 pad2 block. */
724 memset(hmac_pad, 0x5c, sslv3_pad_length);
725
726 EVP_DigestUpdate(&md_ctx, mac_secret, mac_secret_length);
727 EVP_DigestUpdate(&md_ctx, hmac_pad, sslv3_pad_length);
728 EVP_DigestUpdate(&md_ctx, mac_out, md_size);
729 }
730 else
731 {
732 /* Complete the HMAC in the standard manner. */
733 for (i = 0; i < md_block_size; i++)
734 hmac_pad[i] ^= 0x6a;
735
736 EVP_DigestUpdate(&md_ctx, hmac_pad, md_block_size);
737 EVP_DigestUpdate(&md_ctx, mac_out, md_size);
738 }
739 EVP_DigestFinal(&md_ctx, md_out, &md_out_size_u);
740 if (md_out_size)
741 *md_out_size = md_out_size_u;
742 EVP_MD_CTX_cleanup(&md_ctx);
743 }
744
745#ifdef OPENSSL_FIPS
746
747/* Due to the need to use EVP in FIPS mode we can't reimplement digests but
748 * we can ensure the number of blocks processed is equal for all cases
749 * by digesting additional data.
750 */
751
752void tls_fips_digest_extra(
753 const EVP_CIPHER_CTX *cipher_ctx, EVP_MD_CTX *mac_ctx,
754 const unsigned char *data, size_t data_len, size_t orig_len)
755 {
756 size_t block_size, digest_pad, blocks_data, blocks_orig;
757 if (EVP_CIPHER_CTX_mode(cipher_ctx) != EVP_CIPH_CBC_MODE)
758 return;
759 block_size = EVP_MD_CTX_block_size(mac_ctx);
760 /* We are in FIPS mode if we get this far so we know we have only SHA*
761 * digests and TLS to deal with.
762 * Minimum digest padding length is 17 for SHA384/SHA512 and 9
763 * otherwise.
764 * Additional header is 13 bytes. To get the number of digest blocks
765 * processed round up the amount of data plus padding to the nearest
766 * block length. Block length is 128 for SHA384/SHA512 and 64 otherwise.
767 * So we have:
768 * blocks = (payload_len + digest_pad + 13 + block_size - 1)/block_size
769 * equivalently:
770 * blocks = (payload_len + digest_pad + 12)/block_size + 1
771 * HMAC adds a constant overhead.
772 * We're ultimately only interested in differences so this becomes
773 * blocks = (payload_len + 29)/128
774 * for SHA384/SHA512 and
775 * blocks = (payload_len + 21)/64
776 * otherwise.
777 */
778 digest_pad = block_size == 64 ? 21 : 29;
779 blocks_orig = (orig_len + digest_pad)/block_size;
780 blocks_data = (data_len + digest_pad)/block_size;
781 /* MAC enough blocks to make up the difference between the original
782 * and actual lengths plus one extra block to ensure this is never a
783 * no op. The "data" pointer should always have enough space to
784 * perform this operation as it is large enough for a maximum
785 * length TLS buffer.
786 */
787 EVP_DigestSignUpdate(mac_ctx, data,
788 (blocks_orig - blocks_data + 1) * block_size);
789 }
790#endif
diff --git a/src/lib/libssl/src/ssl/s3_enc.c b/src/lib/libssl/src/ssl/s3_enc.c
index c5df2cb90a..e3cd4f062c 100644
--- a/src/lib/libssl/src/ssl/s3_enc.c
+++ b/src/lib/libssl/src/ssl/s3_enc.c
@@ -466,12 +466,21 @@ void ssl3_cleanup_key_block(SSL *s)
466 s->s3->tmp.key_block_length=0; 466 s->s3->tmp.key_block_length=0;
467 } 467 }
468 468
469/* ssl3_enc encrypts/decrypts the record in |s->wrec| / |s->rrec|, respectively.
470 *
471 * Returns:
472 * 0: (in non-constant time) if the record is publically invalid (i.e. too
473 * short etc).
474 * 1: if the record's padding is valid / the encryption was successful.
475 * -1: if the record's padding is invalid or, if sending, an internal error
476 * occured.
477 */
469int ssl3_enc(SSL *s, int send) 478int ssl3_enc(SSL *s, int send)
470 { 479 {
471 SSL3_RECORD *rec; 480 SSL3_RECORD *rec;
472 EVP_CIPHER_CTX *ds; 481 EVP_CIPHER_CTX *ds;
473 unsigned long l; 482 unsigned long l;
474 int bs,i; 483 int bs,i,mac_size=0;
475 const EVP_CIPHER *enc; 484 const EVP_CIPHER *enc;
476 485
477 if (send) 486 if (send)
@@ -522,32 +531,16 @@ int ssl3_enc(SSL *s, int send)
522 if (!send) 531 if (!send)
523 { 532 {
524 if (l == 0 || l%bs != 0) 533 if (l == 0 || l%bs != 0)
525 {
526 SSLerr(SSL_F_SSL3_ENC,SSL_R_BLOCK_CIPHER_PAD_IS_WRONG);
527 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECRYPTION_FAILED);
528 return 0; 534 return 0;
529 }
530 /* otherwise, rec->length >= bs */ 535 /* otherwise, rec->length >= bs */
531 } 536 }
532 537
533 EVP_Cipher(ds,rec->data,rec->input,l); 538 EVP_Cipher(ds,rec->data,rec->input,l);
534 539
540 if (EVP_MD_CTX_md(s->read_hash) != NULL)
541 mac_size = EVP_MD_CTX_size(s->read_hash);
535 if ((bs != 1) && !send) 542 if ((bs != 1) && !send)
536 { 543 return ssl3_cbc_remove_padding(s, rec, bs, mac_size);
537 i=rec->data[l-1]+1;
538 /* SSL 3.0 bounds the number of padding bytes by the block size;
539 * padding bytes (except the last one) are arbitrary */
540 if (i > bs)
541 {
542 /* Incorrect padding. SSLerr() and ssl3_alert are done
543 * by caller: we don't want to reveal whether this is
544 * a decryption error or a MAC verification failure
545 * (see http://www.openssl.org/~bodo/tls-cbc.txt) */
546 return -1;
547 }
548 /* now i <= bs <= rec->length */
549 rec->length-=i;
550 }
551 } 544 }
552 return(1); 545 return(1);
553 } 546 }
@@ -716,7 +709,7 @@ int n_ssl3_mac(SSL *ssl, unsigned char *md, int send)
716 EVP_MD_CTX md_ctx; 709 EVP_MD_CTX md_ctx;
717 const EVP_MD_CTX *hash; 710 const EVP_MD_CTX *hash;
718 unsigned char *p,rec_char; 711 unsigned char *p,rec_char;
719 unsigned int md_size; 712 size_t md_size, orig_len;
720 int npad; 713 int npad;
721 int t; 714 int t;
722 715
@@ -741,28 +734,72 @@ int n_ssl3_mac(SSL *ssl, unsigned char *md, int send)
741 md_size=t; 734 md_size=t;
742 npad=(48/md_size)*md_size; 735 npad=(48/md_size)*md_size;
743 736
744 /* Chop the digest off the end :-) */ 737 /* kludge: ssl3_cbc_remove_padding passes padding length in rec->type */
745 EVP_MD_CTX_init(&md_ctx); 738 orig_len = rec->length+md_size+((unsigned int)rec->type>>8);
746 739 rec->type &= 0xff;
747 EVP_MD_CTX_copy_ex( &md_ctx,hash); 740
748 EVP_DigestUpdate(&md_ctx,mac_sec,md_size); 741 if (!send &&
749 EVP_DigestUpdate(&md_ctx,ssl3_pad_1,npad); 742 EVP_CIPHER_CTX_mode(ssl->enc_read_ctx) == EVP_CIPH_CBC_MODE &&
750 EVP_DigestUpdate(&md_ctx,seq,8); 743 ssl3_cbc_record_digest_supported(hash))
751 rec_char=rec->type; 744 {
752 EVP_DigestUpdate(&md_ctx,&rec_char,1); 745 /* This is a CBC-encrypted record. We must avoid leaking any
753 p=md; 746 * timing-side channel information about how many blocks of
754 s2n(rec->length,p); 747 * data we are hashing because that gives an attacker a
755 EVP_DigestUpdate(&md_ctx,md,2); 748 * timing-oracle. */
756 EVP_DigestUpdate(&md_ctx,rec->input,rec->length); 749
757 EVP_DigestFinal_ex( &md_ctx,md,NULL); 750 /* npad is, at most, 48 bytes and that's with MD5:
758 751 * 16 + 48 + 8 (sequence bytes) + 1 + 2 = 75.
759 EVP_MD_CTX_copy_ex( &md_ctx,hash); 752 *
760 EVP_DigestUpdate(&md_ctx,mac_sec,md_size); 753 * With SHA-1 (the largest hash speced for SSLv3) the hash size
761 EVP_DigestUpdate(&md_ctx,ssl3_pad_2,npad); 754 * goes up 4, but npad goes down by 8, resulting in a smaller
762 EVP_DigestUpdate(&md_ctx,md,md_size); 755 * total size. */
763 EVP_DigestFinal_ex( &md_ctx,md,&md_size); 756 unsigned char header[75];
764 757 unsigned j = 0;
765 EVP_MD_CTX_cleanup(&md_ctx); 758 memcpy(header+j, mac_sec, md_size);
759 j += md_size;
760 memcpy(header+j, ssl3_pad_1, npad);
761 j += npad;
762 memcpy(header+j, seq, 8);
763 j += 8;
764 header[j++] = rec->type;
765 header[j++] = rec->length >> 8;
766 header[j++] = rec->length & 0xff;
767
768 ssl3_cbc_digest_record(
769 hash,
770 md, &md_size,
771 header, rec->input,
772 rec->length + md_size, orig_len,
773 mac_sec, md_size,
774 1 /* is SSLv3 */);
775 }
776 else
777 {
778 unsigned int md_size_u;
779 /* Chop the digest off the end :-) */
780 EVP_MD_CTX_init(&md_ctx);
781
782 EVP_MD_CTX_copy_ex( &md_ctx,hash);
783 EVP_DigestUpdate(&md_ctx,mac_sec,md_size);
784 EVP_DigestUpdate(&md_ctx,ssl3_pad_1,npad);
785 EVP_DigestUpdate(&md_ctx,seq,8);
786 rec_char=rec->type;
787 EVP_DigestUpdate(&md_ctx,&rec_char,1);
788 p=md;
789 s2n(rec->length,p);
790 EVP_DigestUpdate(&md_ctx,md,2);
791 EVP_DigestUpdate(&md_ctx,rec->input,rec->length);
792 EVP_DigestFinal_ex( &md_ctx,md,NULL);
793
794 EVP_MD_CTX_copy_ex( &md_ctx,hash);
795 EVP_DigestUpdate(&md_ctx,mac_sec,md_size);
796 EVP_DigestUpdate(&md_ctx,ssl3_pad_2,npad);
797 EVP_DigestUpdate(&md_ctx,md,md_size);
798 EVP_DigestFinal_ex( &md_ctx,md,&md_size_u);
799 md_size = md_size_u;
800
801 EVP_MD_CTX_cleanup(&md_ctx);
802 }
766 803
767 ssl3_record_sequence_update(seq); 804 ssl3_record_sequence_update(seq);
768 return(md_size); 805 return(md_size);
diff --git a/src/lib/libssl/src/ssl/s3_pkt.c b/src/lib/libssl/src/ssl/s3_pkt.c
index adf8c387cc..a7d2defbea 100644
--- a/src/lib/libssl/src/ssl/s3_pkt.c
+++ b/src/lib/libssl/src/ssl/s3_pkt.c
@@ -290,11 +290,8 @@ static int ssl3_get_record(SSL *s)
290 unsigned char *p; 290 unsigned char *p;
291 unsigned char md[EVP_MAX_MD_SIZE]; 291 unsigned char md[EVP_MAX_MD_SIZE];
292 short version; 292 short version;
293 int mac_size; 293 unsigned mac_size, orig_len;
294 int clear=0;
295 size_t extra; 294 size_t extra;
296 int decryption_failed_or_bad_record_mac = 0;
297 unsigned char *mac = NULL;
298 295
299 rr= &(s->s3->rrec); 296 rr= &(s->s3->rrec);
300 sess=s->session; 297 sess=s->session;
@@ -403,17 +400,15 @@ fprintf(stderr, "Record type=%d, Length=%d\n", rr->type, rr->length);
403 rr->data=rr->input; 400 rr->data=rr->input;
404 401
405 enc_err = s->method->ssl3_enc->enc(s,0); 402 enc_err = s->method->ssl3_enc->enc(s,0);
406 if (enc_err <= 0) 403 /* enc_err is:
404 * 0: (in non-constant time) if the record is publically invalid.
405 * 1: if the padding is valid
406 * -1: if the padding is invalid */
407 if (enc_err == 0)
407 { 408 {
408 if (enc_err == 0) 409 al=SSL_AD_DECRYPTION_FAILED;
409 /* SSLerr() and ssl3_send_alert() have been called */ 410 SSLerr(SSL_F_TLS1_ENC,SSL_R_BLOCK_CIPHER_PAD_IS_WRONG);
410 goto err; 411 goto f_err;
411
412 /* Otherwise enc_err == -1, which indicates bad padding
413 * (rec->length has not been changed in this case).
414 * To minimize information leaked via timing, we will perform
415 * the MAC computation anyway. */
416 decryption_failed_or_bad_record_mac = 1;
417 } 412 }
418 413
419#ifdef TLS_DEBUG 414#ifdef TLS_DEBUG
@@ -423,53 +418,62 @@ printf("\n");
423#endif 418#endif
424 419
425 /* r->length is now the compressed data plus mac */ 420 /* r->length is now the compressed data plus mac */
426 if ( (sess == NULL) || 421 if ((sess != NULL) &&
427 (s->enc_read_ctx == NULL) || 422 (s->enc_read_ctx != NULL) &&
428 (EVP_MD_CTX_md(s->read_hash) == NULL)) 423 (EVP_MD_CTX_md(s->read_hash) != NULL))
429 clear=1;
430
431 if (!clear)
432 { 424 {
433 /* !clear => s->read_hash != NULL => mac_size != -1 */ 425 /* s->read_hash != NULL => mac_size != -1 */
426 unsigned char *mac = NULL;
427 unsigned char mac_tmp[EVP_MAX_MD_SIZE];
434 mac_size=EVP_MD_CTX_size(s->read_hash); 428 mac_size=EVP_MD_CTX_size(s->read_hash);
435 OPENSSL_assert(mac_size >= 0); 429 OPENSSL_assert(mac_size <= EVP_MAX_MD_SIZE);
436 430
437 if (rr->length > SSL3_RT_MAX_COMPRESSED_LENGTH+extra+mac_size) 431 /* kludge: *_cbc_remove_padding passes padding length in rr->type */
432 orig_len = rr->length+((unsigned int)rr->type>>8);
433
434 /* orig_len is the length of the record before any padding was
435 * removed. This is public information, as is the MAC in use,
436 * therefore we can safely process the record in a different
437 * amount of time if it's too short to possibly contain a MAC.
438 */
439 if (orig_len < mac_size ||
440 /* CBC records must have a padding length byte too. */
441 (EVP_CIPHER_CTX_mode(s->enc_read_ctx) == EVP_CIPH_CBC_MODE &&
442 orig_len < mac_size+1))
438 { 443 {
439#if 0 /* OK only for stream ciphers (then rr->length is visible from ciphertext anyway) */ 444 al=SSL_AD_DECODE_ERROR;
440 al=SSL_AD_RECORD_OVERFLOW; 445 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_LENGTH_TOO_SHORT);
441 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_PRE_MAC_LENGTH_TOO_LONG);
442 goto f_err; 446 goto f_err;
443#else
444 decryption_failed_or_bad_record_mac = 1;
445#endif
446 } 447 }
447 /* check the MAC for rr->input (it's in mac_size bytes at the tail) */ 448
448 if (rr->length >= (unsigned int)mac_size) 449 if (EVP_CIPHER_CTX_mode(s->enc_read_ctx) == EVP_CIPH_CBC_MODE)
449 { 450 {
451 /* We update the length so that the TLS header bytes
452 * can be constructed correctly but we need to extract
453 * the MAC in constant time from within the record,
454 * without leaking the contents of the padding bytes.
455 * */
456 mac = mac_tmp;
457 ssl3_cbc_copy_mac(mac_tmp, rr, mac_size, orig_len);
450 rr->length -= mac_size; 458 rr->length -= mac_size;
451 mac = &rr->data[rr->length];
452 } 459 }
453 else 460 else
454 { 461 {
455 /* record (minus padding) is too short to contain a MAC */ 462 /* In this case there's no padding, so |orig_len|
456#if 0 /* OK only for stream ciphers */ 463 * equals |rec->length| and we checked that there's
457 al=SSL_AD_DECODE_ERROR; 464 * enough bytes for |mac_size| above. */
458 SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_LENGTH_TOO_SHORT); 465 rr->length -= mac_size;
459 goto f_err; 466 mac = &rr->data[rr->length];
460#else
461 decryption_failed_or_bad_record_mac = 1;
462 rr->length = 0;
463#endif
464 }
465 i=s->method->ssl3_enc->mac(s,md,0);
466 if (i < 0 || mac == NULL || memcmp(md, mac, (size_t)mac_size) != 0)
467 {
468 decryption_failed_or_bad_record_mac = 1;
469 } 467 }
468
469 i=s->method->ssl3_enc->mac(s,md,0 /* not send */);
470 if (i < 0 || mac == NULL || timingsafe_bcmp(md, mac, (size_t)mac_size) != 0)
471 enc_err = -1;
472 if (rr->length > SSL3_RT_MAX_COMPRESSED_LENGTH+extra+mac_size)
473 enc_err = -1;
470 } 474 }
471 475
472 if (decryption_failed_or_bad_record_mac) 476 if (enc_err < 0)
473 { 477 {
474 /* A separate 'decryption_failed' alert was introduced with TLS 1.0, 478 /* A separate 'decryption_failed' alert was introduced with TLS 1.0,
475 * SSL 3.0 only has 'bad_record_mac'. But unless a decryption 479 * SSL 3.0 only has 'bad_record_mac'. But unless a decryption
diff --git a/src/lib/libssl/src/ssl/ssl_locl.h b/src/lib/libssl/src/ssl/ssl_locl.h
index d87fd51cfa..7fc110df64 100644
--- a/src/lib/libssl/src/ssl/ssl_locl.h
+++ b/src/lib/libssl/src/ssl/ssl_locl.h
@@ -215,6 +215,15 @@
215 *((c)++)=(unsigned char)(((l)>> 8)&0xff), \ 215 *((c)++)=(unsigned char)(((l)>> 8)&0xff), \
216 *((c)++)=(unsigned char)(((l) )&0xff)) 216 *((c)++)=(unsigned char)(((l) )&0xff))
217 217
218#define l2n8(l,c) (*((c)++)=(unsigned char)(((l)>>56)&0xff), \
219 *((c)++)=(unsigned char)(((l)>>48)&0xff), \
220 *((c)++)=(unsigned char)(((l)>>40)&0xff), \
221 *((c)++)=(unsigned char)(((l)>>32)&0xff), \
222 *((c)++)=(unsigned char)(((l)>>24)&0xff), \
223 *((c)++)=(unsigned char)(((l)>>16)&0xff), \
224 *((c)++)=(unsigned char)(((l)>> 8)&0xff), \
225 *((c)++)=(unsigned char)(((l) )&0xff))
226
218#define n2l6(c,l) (l =((BN_ULLONG)(*((c)++)))<<40, \ 227#define n2l6(c,l) (l =((BN_ULLONG)(*((c)++)))<<40, \
219 l|=((BN_ULLONG)(*((c)++)))<<32, \ 228 l|=((BN_ULLONG)(*((c)++)))<<32, \
220 l|=((BN_ULLONG)(*((c)++)))<<24, \ 229 l|=((BN_ULLONG)(*((c)++)))<<24, \
@@ -1131,4 +1140,33 @@ int ssl_parse_clienthello_use_srtp_ext(SSL *s, unsigned char *d, int len,int *al
1131int ssl_add_serverhello_use_srtp_ext(SSL *s, unsigned char *p, int *len, int maxlen); 1140int ssl_add_serverhello_use_srtp_ext(SSL *s, unsigned char *p, int *len, int maxlen);
1132int ssl_parse_serverhello_use_srtp_ext(SSL *s, unsigned char *d, int len,int *al); 1141int ssl_parse_serverhello_use_srtp_ext(SSL *s, unsigned char *d, int len,int *al);
1133 1142
1143/* s3_cbc.c */
1144void ssl3_cbc_copy_mac(unsigned char* out,
1145 const SSL3_RECORD *rec,
1146 unsigned md_size,unsigned orig_len);
1147int ssl3_cbc_remove_padding(const SSL* s,
1148 SSL3_RECORD *rec,
1149 unsigned block_size,
1150 unsigned mac_size);
1151int tls1_cbc_remove_padding(const SSL* s,
1152 SSL3_RECORD *rec,
1153 unsigned block_size,
1154 unsigned mac_size);
1155char ssl3_cbc_record_digest_supported(const EVP_MD_CTX *ctx);
1156void ssl3_cbc_digest_record(
1157 const EVP_MD_CTX *ctx,
1158 unsigned char* md_out,
1159 size_t* md_out_size,
1160 const unsigned char header[13],
1161 const unsigned char *data,
1162 size_t data_plus_mac_size,
1163 size_t data_plus_mac_plus_padding_size,
1164 const unsigned char *mac_secret,
1165 unsigned mac_secret_length,
1166 char is_sslv3);
1167
1168void tls_fips_digest_extra(
1169 const EVP_CIPHER_CTX *cipher_ctx, EVP_MD_CTX *mac_ctx,
1170 const unsigned char *data, size_t data_len, size_t orig_len);
1171
1134#endif 1172#endif
diff --git a/src/lib/libssl/src/ssl/t1_enc.c b/src/lib/libssl/src/ssl/t1_enc.c
index f7bdeb3b9d..448eef274f 100644
--- a/src/lib/libssl/src/ssl/t1_enc.c
+++ b/src/lib/libssl/src/ssl/t1_enc.c
@@ -667,12 +667,21 @@ err:
667 return(ret); 667 return(ret);
668 } 668 }
669 669
670/* tls1_enc encrypts/decrypts the record in |s->wrec| / |s->rrec|, respectively.
671 *
672 * Returns:
673 * 0: (in non-constant time) if the record is publically invalid (i.e. too
674 * short etc).
675 * 1: if the record's padding is valid / the encryption was successful.
676 * -1: if the record's padding/AEAD-authenticator is invalid or, if sending,
677 * an internal error occured.
678 */
670int tls1_enc(SSL *s, int send) 679int tls1_enc(SSL *s, int send)
671 { 680 {
672 SSL3_RECORD *rec; 681 SSL3_RECORD *rec;
673 EVP_CIPHER_CTX *ds; 682 EVP_CIPHER_CTX *ds;
674 unsigned long l; 683 unsigned long l;
675 int bs,i,ii,j,k,pad=0; 684 int bs,i,j,k,pad=0,ret,mac_size=0;
676 const EVP_CIPHER *enc; 685 const EVP_CIPHER *enc;
677 686
678 if (send) 687 if (send)
@@ -729,11 +738,11 @@ int tls1_enc(SSL *s, int send)
729 printf("tls1_enc(%d)\n", send); 738 printf("tls1_enc(%d)\n", send);
730#endif /* KSSL_DEBUG */ 739#endif /* KSSL_DEBUG */
731 740
732 if ((s->session == NULL) || (ds == NULL) || 741 if ((s->session == NULL) || (ds == NULL) || (enc == NULL))
733 (enc == NULL))
734 { 742 {
735 memmove(rec->data,rec->input,rec->length); 743 memmove(rec->data,rec->input,rec->length);
736 rec->input=rec->data; 744 rec->input=rec->data;
745 ret = 1;
737 } 746 }
738 else 747 else
739 { 748 {
@@ -797,13 +806,13 @@ int tls1_enc(SSL *s, int send)
797 806
798#ifdef KSSL_DEBUG 807#ifdef KSSL_DEBUG
799 { 808 {
800 unsigned long ui; 809 unsigned long ui;
801 printf("EVP_Cipher(ds=%p,rec->data=%p,rec->input=%p,l=%ld) ==>\n", 810 printf("EVP_Cipher(ds=%p,rec->data=%p,rec->input=%p,l=%ld) ==>\n",
802 ds,rec->data,rec->input,l); 811 ds,rec->data,rec->input,l);
803 printf("\tEVP_CIPHER_CTX: %d buf_len, %d key_len [%d %d], %d iv_len\n", 812 printf("\tEVP_CIPHER_CTX: %d buf_len, %d key_len [%d %d], %d iv_len\n",
804 ds->buf_len, ds->cipher->key_len, 813 ds->buf_len, ds->cipher->key_len,
805 DES_KEY_SZ, DES_SCHEDULE_SZ, 814 DES_KEY_SZ, DES_SCHEDULE_SZ,
806 ds->cipher->iv_len); 815 ds->cipher->iv_len);
807 printf("\t\tIV: "); 816 printf("\t\tIV: ");
808 for (i=0; i<ds->cipher->iv_len; i++) printf("%02X", ds->iv[i]); 817 for (i=0; i<ds->cipher->iv_len; i++) printf("%02X", ds->iv[i]);
809 printf("\n"); 818 printf("\n");
@@ -816,13 +825,7 @@ int tls1_enc(SSL *s, int send)
816 if (!send) 825 if (!send)
817 { 826 {
818 if (l == 0 || l%bs != 0) 827 if (l == 0 || l%bs != 0)
819 {
820 if (s->version >= TLS1_1_VERSION)
821 return -1;
822 SSLerr(SSL_F_TLS1_ENC,SSL_R_BLOCK_CIPHER_PAD_IS_WRONG);
823 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECRYPTION_FAILED);
824 return 0; 828 return 0;
825 }
826 } 829 }
827 830
828 i = EVP_Cipher(ds,rec->data,rec->input,l); 831 i = EVP_Cipher(ds,rec->data,rec->input,l);
@@ -839,68 +842,24 @@ int tls1_enc(SSL *s, int send)
839 842
840#ifdef KSSL_DEBUG 843#ifdef KSSL_DEBUG
841 { 844 {
842 unsigned long i; 845 unsigned long i;
843 printf("\trec->data="); 846 printf("\trec->data=");
844 for (i=0; i<l; i++) 847 for (i=0; i<l; i++)
845 printf(" %02x", rec->data[i]); printf("\n"); 848 printf(" %02x", rec->data[i]); printf("\n");
846 } 849 }
847#endif /* KSSL_DEBUG */ 850#endif /* KSSL_DEBUG */
848 851
852 ret = 1;
853 if (EVP_MD_CTX_md(s->read_hash) != NULL)
854 mac_size = EVP_MD_CTX_size(s->read_hash);
849 if ((bs != 1) && !send) 855 if ((bs != 1) && !send)
850 { 856 ret = tls1_cbc_remove_padding(s, rec, bs, mac_size);
851 ii=i=rec->data[l-1]; /* padding_length */
852 i++;
853 /* NB: if compression is in operation the first packet
854 * may not be of even length so the padding bug check
855 * cannot be performed. This bug workaround has been
856 * around since SSLeay so hopefully it is either fixed
857 * now or no buggy implementation supports compression
858 * [steve]
859 */
860 if ( (s->options&SSL_OP_TLS_BLOCK_PADDING_BUG)
861 && !s->expand)
862 {
863 /* First packet is even in size, so check */
864 if ((memcmp(s->s3->read_sequence,
865 "\0\0\0\0\0\0\0\0",8) == 0) && !(ii & 1))
866 s->s3->flags|=TLS1_FLAGS_TLS_PADDING_BUG;
867 if (s->s3->flags & TLS1_FLAGS_TLS_PADDING_BUG)
868 i--;
869 }
870 /* TLS 1.0 does not bound the number of padding bytes by the block size.
871 * All of them must have value 'padding_length'. */
872 if (i > (int)rec->length)
873 {
874 /* Incorrect padding. SSLerr() and ssl3_alert are done
875 * by caller: we don't want to reveal whether this is
876 * a decryption error or a MAC verification failure
877 * (see http://www.openssl.org/~bodo/tls-cbc.txt) */
878 return -1;
879 }
880 for (j=(int)(l-i); j<(int)l; j++)
881 {
882 if (rec->data[j] != ii)
883 {
884 /* Incorrect padding */
885 return -1;
886 }
887 }
888 rec->length -=i;
889 if (s->version >= TLS1_1_VERSION
890 && EVP_CIPHER_CTX_mode(ds) == EVP_CIPH_CBC_MODE)
891 {
892 if (bs > (int)rec->length)
893 return -1;
894 rec->data += bs; /* skip the explicit IV */
895 rec->input += bs;
896 rec->length -= bs;
897 }
898 }
899 if (pad && !send) 857 if (pad && !send)
900 rec->length -= pad; 858 rec->length -= pad;
901 } 859 }
902 return(1); 860 return ret;
903 } 861 }
862
904int tls1_cert_verify_mac(SSL *s, int md_nid, unsigned char *out) 863int tls1_cert_verify_mac(SSL *s, int md_nid, unsigned char *out)
905 { 864 {
906 unsigned int ret; 865 unsigned int ret;
@@ -990,10 +949,10 @@ int tls1_mac(SSL *ssl, unsigned char *md, int send)
990 SSL3_RECORD *rec; 949 SSL3_RECORD *rec;
991 unsigned char *seq; 950 unsigned char *seq;
992 EVP_MD_CTX *hash; 951 EVP_MD_CTX *hash;
993 size_t md_size; 952 size_t md_size, orig_len;
994 int i; 953 int i;
995 EVP_MD_CTX hmac, *mac_ctx; 954 EVP_MD_CTX hmac, *mac_ctx;
996 unsigned char buf[5]; 955 unsigned char header[13];
997 int stream_mac = (send?(ssl->mac_flags & SSL_MAC_FLAG_WRITE_MAC_STREAM):(ssl->mac_flags&SSL_MAC_FLAG_READ_MAC_STREAM)); 956 int stream_mac = (send?(ssl->mac_flags & SSL_MAC_FLAG_WRITE_MAC_STREAM):(ssl->mac_flags&SSL_MAC_FLAG_READ_MAC_STREAM));
998 int t; 957 int t;
999 958
@@ -1014,12 +973,6 @@ int tls1_mac(SSL *ssl, unsigned char *md, int send)
1014 OPENSSL_assert(t >= 0); 973 OPENSSL_assert(t >= 0);
1015 md_size=t; 974 md_size=t;
1016 975
1017 buf[0]=rec->type;
1018 buf[1]=(unsigned char)(ssl->version>>8);
1019 buf[2]=(unsigned char)(ssl->version);
1020 buf[3]=rec->length>>8;
1021 buf[4]=rec->length&0xff;
1022
1023 /* I should fix this up TLS TLS TLS TLS TLS XXXXXXXX */ 976 /* I should fix this up TLS TLS TLS TLS TLS XXXXXXXX */
1024 if (stream_mac) 977 if (stream_mac)
1025 { 978 {
@@ -1038,17 +991,55 @@ int tls1_mac(SSL *ssl, unsigned char *md, int send)
1038 s2n(send?ssl->d1->w_epoch:ssl->d1->r_epoch, p); 991 s2n(send?ssl->d1->w_epoch:ssl->d1->r_epoch, p);
1039 memcpy (p,&seq[2],6); 992 memcpy (p,&seq[2],6);
1040 993
1041 EVP_DigestSignUpdate(mac_ctx,dtlsseq,8); 994 memcpy(header, dtlsseq, 8);
1042 } 995 }
1043 else 996 else
1044 EVP_DigestSignUpdate(mac_ctx,seq,8); 997 memcpy(header, seq, 8);
1045 998
1046 EVP_DigestSignUpdate(mac_ctx,buf,5); 999 /* kludge: tls1_cbc_remove_padding passes padding length in rec->type */
1047 EVP_DigestSignUpdate(mac_ctx,rec->input,rec->length); 1000 orig_len = rec->length+md_size+((unsigned int)rec->type>>8);
1048 t=EVP_DigestSignFinal(mac_ctx,md,&md_size); 1001 rec->type &= 0xff;
1049 OPENSSL_assert(t > 0); 1002
1003 header[8]=rec->type;
1004 header[9]=(unsigned char)(ssl->version>>8);
1005 header[10]=(unsigned char)(ssl->version);
1006 header[11]=(rec->length)>>8;
1007 header[12]=(rec->length)&0xff;
1008
1009 if (!send &&
1010 EVP_CIPHER_CTX_mode(ssl->enc_read_ctx) == EVP_CIPH_CBC_MODE &&
1011 ssl3_cbc_record_digest_supported(mac_ctx))
1012 {
1013 /* This is a CBC-encrypted record. We must avoid leaking any
1014 * timing-side channel information about how many blocks of
1015 * data we are hashing because that gives an attacker a
1016 * timing-oracle. */
1017 ssl3_cbc_digest_record(
1018 mac_ctx,
1019 md, &md_size,
1020 header, rec->input,
1021 rec->length + md_size, orig_len,
1022 ssl->s3->read_mac_secret,
1023 ssl->s3->read_mac_secret_size,
1024 0 /* not SSLv3 */);
1025 }
1026 else
1027 {
1028 EVP_DigestSignUpdate(mac_ctx,header,sizeof(header));
1029 EVP_DigestSignUpdate(mac_ctx,rec->input,rec->length);
1030 t=EVP_DigestSignFinal(mac_ctx,md,&md_size);
1031 OPENSSL_assert(t > 0);
1032#ifdef OPENSSL_FIPS
1033 if (!send && FIPS_mode())
1034 tls_fips_digest_extra(
1035 ssl->enc_read_ctx,
1036 mac_ctx, rec->input,
1037 rec->length, orig_len);
1038#endif
1039 }
1050 1040
1051 if (!stream_mac) EVP_MD_CTX_cleanup(&hmac); 1041 if (!stream_mac)
1042 EVP_MD_CTX_cleanup(&hmac);
1052#ifdef TLS_DEBUG 1043#ifdef TLS_DEBUG
1053printf("sec="); 1044printf("sec=");
1054{unsigned int z; for (z=0; z<md_size; z++) printf("%02X ",mac_sec[z]); printf("\n"); } 1045{unsigned int z; for (z=0; z<md_size; z++) printf("%02X ",mac_sec[z]); printf("\n"); }
diff --git a/src/lib/libssl/src/ssl/t1_lib.c b/src/lib/libssl/src/ssl/t1_lib.c
index 27c8e3460d..bfd4731365 100644
--- a/src/lib/libssl/src/ssl/t1_lib.c
+++ b/src/lib/libssl/src/ssl/t1_lib.c
@@ -2189,7 +2189,7 @@ static int tls_decrypt_ticket(SSL *s, const unsigned char *etick, int eticklen,
2189 HMAC_Update(&hctx, etick, eticklen); 2189 HMAC_Update(&hctx, etick, eticklen);
2190 HMAC_Final(&hctx, tick_hmac, NULL); 2190 HMAC_Final(&hctx, tick_hmac, NULL);
2191 HMAC_CTX_cleanup(&hctx); 2191 HMAC_CTX_cleanup(&hctx);
2192 if (memcmp(tick_hmac, etick + eticklen, mlen)) 2192 if (timingsafe_bcmp(tick_hmac, etick + eticklen, mlen))
2193 return 2; 2193 return 2;
2194 /* Attempt to decrypt session data */ 2194 /* Attempt to decrypt session data */
2195 /* Move p after IV to start of encrypted ticket, update length */ 2195 /* Move p after IV to start of encrypted ticket, update length */
diff --git a/src/lib/libssl/ssl/Makefile b/src/lib/libssl/ssl/Makefile
index 74e3baa94a..15b761c9a8 100644
--- a/src/lib/libssl/ssl/Makefile
+++ b/src/lib/libssl/ssl/Makefile
@@ -1,4 +1,4 @@
1# $OpenBSD: Makefile,v 1.26 2012/10/13 21:31:56 djm Exp $ 1# $OpenBSD: Makefile,v 1.27 2013/02/14 15:11:44 markus Exp $
2 2
3LIB= ssl 3LIB= ssl
4 4
@@ -22,6 +22,7 @@ SRCS=\
22 ssl_ciph.c ssl_stat.c ssl_rsa.c \ 22 ssl_ciph.c ssl_stat.c ssl_rsa.c \
23 ssl_asn1.c ssl_txt.c ssl_algs.c \ 23 ssl_asn1.c ssl_txt.c ssl_algs.c \
24 bio_ssl.c ssl_err.c kssl.c tls_srp.c t1_reneg.c 24 bio_ssl.c ssl_err.c kssl.c tls_srp.c t1_reneg.c
25SRCS+= s3_cbc.c
25 26
26HDRS= srtp.h ssl.h ssl2.h ssl3.h ssl23.h tls1.h dtls1.h kssl.h 27HDRS= srtp.h ssl.h ssl2.h ssl3.h ssl23.h tls1.h dtls1.h kssl.h
27 28
diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h
index d87fd51cfa..7fc110df64 100644
--- a/src/lib/libssl/ssl_locl.h
+++ b/src/lib/libssl/ssl_locl.h
@@ -215,6 +215,15 @@
215 *((c)++)=(unsigned char)(((l)>> 8)&0xff), \ 215 *((c)++)=(unsigned char)(((l)>> 8)&0xff), \
216 *((c)++)=(unsigned char)(((l) )&0xff)) 216 *((c)++)=(unsigned char)(((l) )&0xff))
217 217
218#define l2n8(l,c) (*((c)++)=(unsigned char)(((l)>>56)&0xff), \
219 *((c)++)=(unsigned char)(((l)>>48)&0xff), \
220 *((c)++)=(unsigned char)(((l)>>40)&0xff), \
221 *((c)++)=(unsigned char)(((l)>>32)&0xff), \
222 *((c)++)=(unsigned char)(((l)>>24)&0xff), \
223 *((c)++)=(unsigned char)(((l)>>16)&0xff), \
224 *((c)++)=(unsigned char)(((l)>> 8)&0xff), \
225 *((c)++)=(unsigned char)(((l) )&0xff))
226
218#define n2l6(c,l) (l =((BN_ULLONG)(*((c)++)))<<40, \ 227#define n2l6(c,l) (l =((BN_ULLONG)(*((c)++)))<<40, \
219 l|=((BN_ULLONG)(*((c)++)))<<32, \ 228 l|=((BN_ULLONG)(*((c)++)))<<32, \
220 l|=((BN_ULLONG)(*((c)++)))<<24, \ 229 l|=((BN_ULLONG)(*((c)++)))<<24, \
@@ -1131,4 +1140,33 @@ int ssl_parse_clienthello_use_srtp_ext(SSL *s, unsigned char *d, int len,int *al
1131int ssl_add_serverhello_use_srtp_ext(SSL *s, unsigned char *p, int *len, int maxlen); 1140int ssl_add_serverhello_use_srtp_ext(SSL *s, unsigned char *p, int *len, int maxlen);
1132int ssl_parse_serverhello_use_srtp_ext(SSL *s, unsigned char *d, int len,int *al); 1141int ssl_parse_serverhello_use_srtp_ext(SSL *s, unsigned char *d, int len,int *al);
1133 1142
1143/* s3_cbc.c */
1144void ssl3_cbc_copy_mac(unsigned char* out,
1145 const SSL3_RECORD *rec,
1146 unsigned md_size,unsigned orig_len);
1147int ssl3_cbc_remove_padding(const SSL* s,
1148 SSL3_RECORD *rec,
1149 unsigned block_size,
1150 unsigned mac_size);
1151int tls1_cbc_remove_padding(const SSL* s,
1152 SSL3_RECORD *rec,
1153 unsigned block_size,
1154 unsigned mac_size);
1155char ssl3_cbc_record_digest_supported(const EVP_MD_CTX *ctx);
1156void ssl3_cbc_digest_record(
1157 const EVP_MD_CTX *ctx,
1158 unsigned char* md_out,
1159 size_t* md_out_size,
1160 const unsigned char header[13],
1161 const unsigned char *data,
1162 size_t data_plus_mac_size,
1163 size_t data_plus_mac_plus_padding_size,
1164 const unsigned char *mac_secret,
1165 unsigned mac_secret_length,
1166 char is_sslv3);
1167
1168void tls_fips_digest_extra(
1169 const EVP_CIPHER_CTX *cipher_ctx, EVP_MD_CTX *mac_ctx,
1170 const unsigned char *data, size_t data_len, size_t orig_len);
1171
1134#endif 1172#endif
diff --git a/src/lib/libssl/t1_enc.c b/src/lib/libssl/t1_enc.c
index f7bdeb3b9d..448eef274f 100644
--- a/src/lib/libssl/t1_enc.c
+++ b/src/lib/libssl/t1_enc.c
@@ -667,12 +667,21 @@ err:
667 return(ret); 667 return(ret);
668 } 668 }
669 669
670/* tls1_enc encrypts/decrypts the record in |s->wrec| / |s->rrec|, respectively.
671 *
672 * Returns:
673 * 0: (in non-constant time) if the record is publically invalid (i.e. too
674 * short etc).
675 * 1: if the record's padding is valid / the encryption was successful.
676 * -1: if the record's padding/AEAD-authenticator is invalid or, if sending,
677 * an internal error occured.
678 */
670int tls1_enc(SSL *s, int send) 679int tls1_enc(SSL *s, int send)
671 { 680 {
672 SSL3_RECORD *rec; 681 SSL3_RECORD *rec;
673 EVP_CIPHER_CTX *ds; 682 EVP_CIPHER_CTX *ds;
674 unsigned long l; 683 unsigned long l;
675 int bs,i,ii,j,k,pad=0; 684 int bs,i,j,k,pad=0,ret,mac_size=0;
676 const EVP_CIPHER *enc; 685 const EVP_CIPHER *enc;
677 686
678 if (send) 687 if (send)
@@ -729,11 +738,11 @@ int tls1_enc(SSL *s, int send)
729 printf("tls1_enc(%d)\n", send); 738 printf("tls1_enc(%d)\n", send);
730#endif /* KSSL_DEBUG */ 739#endif /* KSSL_DEBUG */
731 740
732 if ((s->session == NULL) || (ds == NULL) || 741 if ((s->session == NULL) || (ds == NULL) || (enc == NULL))
733 (enc == NULL))
734 { 742 {
735 memmove(rec->data,rec->input,rec->length); 743 memmove(rec->data,rec->input,rec->length);
736 rec->input=rec->data; 744 rec->input=rec->data;
745 ret = 1;
737 } 746 }
738 else 747 else
739 { 748 {
@@ -797,13 +806,13 @@ int tls1_enc(SSL *s, int send)
797 806
798#ifdef KSSL_DEBUG 807#ifdef KSSL_DEBUG
799 { 808 {
800 unsigned long ui; 809 unsigned long ui;
801 printf("EVP_Cipher(ds=%p,rec->data=%p,rec->input=%p,l=%ld) ==>\n", 810 printf("EVP_Cipher(ds=%p,rec->data=%p,rec->input=%p,l=%ld) ==>\n",
802 ds,rec->data,rec->input,l); 811 ds,rec->data,rec->input,l);
803 printf("\tEVP_CIPHER_CTX: %d buf_len, %d key_len [%d %d], %d iv_len\n", 812 printf("\tEVP_CIPHER_CTX: %d buf_len, %d key_len [%d %d], %d iv_len\n",
804 ds->buf_len, ds->cipher->key_len, 813 ds->buf_len, ds->cipher->key_len,
805 DES_KEY_SZ, DES_SCHEDULE_SZ, 814 DES_KEY_SZ, DES_SCHEDULE_SZ,
806 ds->cipher->iv_len); 815 ds->cipher->iv_len);
807 printf("\t\tIV: "); 816 printf("\t\tIV: ");
808 for (i=0; i<ds->cipher->iv_len; i++) printf("%02X", ds->iv[i]); 817 for (i=0; i<ds->cipher->iv_len; i++) printf("%02X", ds->iv[i]);
809 printf("\n"); 818 printf("\n");
@@ -816,13 +825,7 @@ int tls1_enc(SSL *s, int send)
816 if (!send) 825 if (!send)
817 { 826 {
818 if (l == 0 || l%bs != 0) 827 if (l == 0 || l%bs != 0)
819 {
820 if (s->version >= TLS1_1_VERSION)
821 return -1;
822 SSLerr(SSL_F_TLS1_ENC,SSL_R_BLOCK_CIPHER_PAD_IS_WRONG);
823 ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECRYPTION_FAILED);
824 return 0; 828 return 0;
825 }
826 } 829 }
827 830
828 i = EVP_Cipher(ds,rec->data,rec->input,l); 831 i = EVP_Cipher(ds,rec->data,rec->input,l);
@@ -839,68 +842,24 @@ int tls1_enc(SSL *s, int send)
839 842
840#ifdef KSSL_DEBUG 843#ifdef KSSL_DEBUG
841 { 844 {
842 unsigned long i; 845 unsigned long i;
843 printf("\trec->data="); 846 printf("\trec->data=");
844 for (i=0; i<l; i++) 847 for (i=0; i<l; i++)
845 printf(" %02x", rec->data[i]); printf("\n"); 848 printf(" %02x", rec->data[i]); printf("\n");
846 } 849 }
847#endif /* KSSL_DEBUG */ 850#endif /* KSSL_DEBUG */
848 851
852 ret = 1;
853 if (EVP_MD_CTX_md(s->read_hash) != NULL)
854 mac_size = EVP_MD_CTX_size(s->read_hash);
849 if ((bs != 1) && !send) 855 if ((bs != 1) && !send)
850 { 856 ret = tls1_cbc_remove_padding(s, rec, bs, mac_size);
851 ii=i=rec->data[l-1]; /* padding_length */
852 i++;
853 /* NB: if compression is in operation the first packet
854 * may not be of even length so the padding bug check
855 * cannot be performed. This bug workaround has been
856 * around since SSLeay so hopefully it is either fixed
857 * now or no buggy implementation supports compression
858 * [steve]
859 */
860 if ( (s->options&SSL_OP_TLS_BLOCK_PADDING_BUG)
861 && !s->expand)
862 {
863 /* First packet is even in size, so check */
864 if ((memcmp(s->s3->read_sequence,
865 "\0\0\0\0\0\0\0\0",8) == 0) && !(ii & 1))
866 s->s3->flags|=TLS1_FLAGS_TLS_PADDING_BUG;
867 if (s->s3->flags & TLS1_FLAGS_TLS_PADDING_BUG)
868 i--;
869 }
870 /* TLS 1.0 does not bound the number of padding bytes by the block size.
871 * All of them must have value 'padding_length'. */
872 if (i > (int)rec->length)
873 {
874 /* Incorrect padding. SSLerr() and ssl3_alert are done
875 * by caller: we don't want to reveal whether this is
876 * a decryption error or a MAC verification failure
877 * (see http://www.openssl.org/~bodo/tls-cbc.txt) */
878 return -1;
879 }
880 for (j=(int)(l-i); j<(int)l; j++)
881 {
882 if (rec->data[j] != ii)
883 {
884 /* Incorrect padding */
885 return -1;
886 }
887 }
888 rec->length -=i;
889 if (s->version >= TLS1_1_VERSION
890 && EVP_CIPHER_CTX_mode(ds) == EVP_CIPH_CBC_MODE)
891 {
892 if (bs > (int)rec->length)
893 return -1;
894 rec->data += bs; /* skip the explicit IV */
895 rec->input += bs;
896 rec->length -= bs;
897 }
898 }
899 if (pad && !send) 857 if (pad && !send)
900 rec->length -= pad; 858 rec->length -= pad;
901 } 859 }
902 return(1); 860 return ret;
903 } 861 }
862
904int tls1_cert_verify_mac(SSL *s, int md_nid, unsigned char *out) 863int tls1_cert_verify_mac(SSL *s, int md_nid, unsigned char *out)
905 { 864 {
906 unsigned int ret; 865 unsigned int ret;
@@ -990,10 +949,10 @@ int tls1_mac(SSL *ssl, unsigned char *md, int send)
990 SSL3_RECORD *rec; 949 SSL3_RECORD *rec;
991 unsigned char *seq; 950 unsigned char *seq;
992 EVP_MD_CTX *hash; 951 EVP_MD_CTX *hash;
993 size_t md_size; 952 size_t md_size, orig_len;
994 int i; 953 int i;
995 EVP_MD_CTX hmac, *mac_ctx; 954 EVP_MD_CTX hmac, *mac_ctx;
996 unsigned char buf[5]; 955 unsigned char header[13];
997 int stream_mac = (send?(ssl->mac_flags & SSL_MAC_FLAG_WRITE_MAC_STREAM):(ssl->mac_flags&SSL_MAC_FLAG_READ_MAC_STREAM)); 956 int stream_mac = (send?(ssl->mac_flags & SSL_MAC_FLAG_WRITE_MAC_STREAM):(ssl->mac_flags&SSL_MAC_FLAG_READ_MAC_STREAM));
998 int t; 957 int t;
999 958
@@ -1014,12 +973,6 @@ int tls1_mac(SSL *ssl, unsigned char *md, int send)
1014 OPENSSL_assert(t >= 0); 973 OPENSSL_assert(t >= 0);
1015 md_size=t; 974 md_size=t;
1016 975
1017 buf[0]=rec->type;
1018 buf[1]=(unsigned char)(ssl->version>>8);
1019 buf[2]=(unsigned char)(ssl->version);
1020 buf[3]=rec->length>>8;
1021 buf[4]=rec->length&0xff;
1022
1023 /* I should fix this up TLS TLS TLS TLS TLS XXXXXXXX */ 976 /* I should fix this up TLS TLS TLS TLS TLS XXXXXXXX */
1024 if (stream_mac) 977 if (stream_mac)
1025 { 978 {
@@ -1038,17 +991,55 @@ int tls1_mac(SSL *ssl, unsigned char *md, int send)
1038 s2n(send?ssl->d1->w_epoch:ssl->d1->r_epoch, p); 991 s2n(send?ssl->d1->w_epoch:ssl->d1->r_epoch, p);
1039 memcpy (p,&seq[2],6); 992 memcpy (p,&seq[2],6);
1040 993
1041 EVP_DigestSignUpdate(mac_ctx,dtlsseq,8); 994 memcpy(header, dtlsseq, 8);
1042 } 995 }
1043 else 996 else
1044 EVP_DigestSignUpdate(mac_ctx,seq,8); 997 memcpy(header, seq, 8);
1045 998
1046 EVP_DigestSignUpdate(mac_ctx,buf,5); 999 /* kludge: tls1_cbc_remove_padding passes padding length in rec->type */
1047 EVP_DigestSignUpdate(mac_ctx,rec->input,rec->length); 1000 orig_len = rec->length+md_size+((unsigned int)rec->type>>8);
1048 t=EVP_DigestSignFinal(mac_ctx,md,&md_size); 1001 rec->type &= 0xff;
1049 OPENSSL_assert(t > 0); 1002
1003 header[8]=rec->type;
1004 header[9]=(unsigned char)(ssl->version>>8);
1005 header[10]=(unsigned char)(ssl->version);
1006 header[11]=(rec->length)>>8;
1007 header[12]=(rec->length)&0xff;
1008
1009 if (!send &&
1010 EVP_CIPHER_CTX_mode(ssl->enc_read_ctx) == EVP_CIPH_CBC_MODE &&
1011 ssl3_cbc_record_digest_supported(mac_ctx))
1012 {
1013 /* This is a CBC-encrypted record. We must avoid leaking any
1014 * timing-side channel information about how many blocks of
1015 * data we are hashing because that gives an attacker a
1016 * timing-oracle. */
1017 ssl3_cbc_digest_record(
1018 mac_ctx,
1019 md, &md_size,
1020 header, rec->input,
1021 rec->length + md_size, orig_len,
1022 ssl->s3->read_mac_secret,
1023 ssl->s3->read_mac_secret_size,
1024 0 /* not SSLv3 */);
1025 }
1026 else
1027 {
1028 EVP_DigestSignUpdate(mac_ctx,header,sizeof(header));
1029 EVP_DigestSignUpdate(mac_ctx,rec->input,rec->length);
1030 t=EVP_DigestSignFinal(mac_ctx,md,&md_size);
1031 OPENSSL_assert(t > 0);
1032#ifdef OPENSSL_FIPS
1033 if (!send && FIPS_mode())
1034 tls_fips_digest_extra(
1035 ssl->enc_read_ctx,
1036 mac_ctx, rec->input,
1037 rec->length, orig_len);
1038#endif
1039 }
1050 1040
1051 if (!stream_mac) EVP_MD_CTX_cleanup(&hmac); 1041 if (!stream_mac)
1042 EVP_MD_CTX_cleanup(&hmac);
1052#ifdef TLS_DEBUG 1043#ifdef TLS_DEBUG
1053printf("sec="); 1044printf("sec=");
1054{unsigned int z; for (z=0; z<md_size; z++) printf("%02X ",mac_sec[z]); printf("\n"); } 1045{unsigned int z; for (z=0; z<md_size; z++) printf("%02X ",mac_sec[z]); printf("\n"); }
diff --git a/src/lib/libssl/t1_lib.c b/src/lib/libssl/t1_lib.c
index 27c8e3460d..bfd4731365 100644
--- a/src/lib/libssl/t1_lib.c
+++ b/src/lib/libssl/t1_lib.c
@@ -2189,7 +2189,7 @@ static int tls_decrypt_ticket(SSL *s, const unsigned char *etick, int eticklen,
2189 HMAC_Update(&hctx, etick, eticklen); 2189 HMAC_Update(&hctx, etick, eticklen);
2190 HMAC_Final(&hctx, tick_hmac, NULL); 2190 HMAC_Final(&hctx, tick_hmac, NULL);
2191 HMAC_CTX_cleanup(&hctx); 2191 HMAC_CTX_cleanup(&hctx);
2192 if (memcmp(tick_hmac, etick + eticklen, mlen)) 2192 if (timingsafe_bcmp(tick_hmac, etick + eticklen, mlen))
2193 return 2; 2193 return 2;
2194 /* Attempt to decrypt session data */ 2194 /* Attempt to decrypt session data */
2195 /* Move p after IV to start of encrypted ticket, update length */ 2195 /* Move p after IV to start of encrypted ticket, update length */