diff options
author | markus <> | 2013-02-14 15:11:44 +0000 |
---|---|---|
committer | markus <> | 2013-02-14 15:11:44 +0000 |
commit | 9822d929c08eed1446dc09464293449326730af2 (patch) | |
tree | cd2035e8f8ac3d4ade1ee779dcaabbe671c2003a | |
parent | 692574e51be904b35cfcb2609fd641e93dc8cef7 (diff) | |
download | openbsd-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@
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 | |||
93 | extern unsigned int OPENSSL_ia32cap_P[2]; | 97 | extern 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 | ||
172 | static int aesni_cbc_hmac_sha1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | 179 | static 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. */ | ||
129 | int dtls1_enc(SSL *s, int send) | 137 | int 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 | |||
376 | dtls1_process_record(SSL *s) | 376 | dtls1_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. */ | ||
80 | static 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. */ | ||
87 | static 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. */ | ||
94 | static 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. */ | ||
109 | int 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. */ | ||
143 | int 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 | |||
254 | void 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. */ | ||
341 | static 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 | |||
350 | static 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 | ||
362 | static 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 | ||
377 | static 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. */ | ||
393 | char 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. ) */ | ||
436 | void 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 | |||
752 | void 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 | |||
93 | extern unsigned int OPENSSL_ia32cap_P[2]; | 97 | extern 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 | ||
172 | static int aesni_cbc_hmac_sha1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | 179 | static 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. */ | ||
129 | int dtls1_enc(SSL *s, int send) | 137 | int 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 | |||
376 | dtls1_process_record(SSL *s) | 376 | dtls1_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. */ | ||
80 | static 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. */ | ||
87 | static 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. */ | ||
94 | static 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. */ | ||
109 | int 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. */ | ||
143 | int 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 | |||
254 | void 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. */ | ||
341 | static 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 | |||
350 | static 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 | ||
362 | static 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 | ||
377 | static 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. */ | ||
393 | char 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. ) */ | ||
436 | void 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 | |||
752 | void 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 | */ | ||
469 | int ssl3_enc(SSL *s, int send) | 478 | int 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 | |||
1131 | int ssl_add_serverhello_use_srtp_ext(SSL *s, unsigned char *p, int *len, int maxlen); | 1140 | int ssl_add_serverhello_use_srtp_ext(SSL *s, unsigned char *p, int *len, int maxlen); |
1132 | int ssl_parse_serverhello_use_srtp_ext(SSL *s, unsigned char *d, int len,int *al); | 1141 | int ssl_parse_serverhello_use_srtp_ext(SSL *s, unsigned char *d, int len,int *al); |
1133 | 1142 | ||
1143 | /* s3_cbc.c */ | ||
1144 | void ssl3_cbc_copy_mac(unsigned char* out, | ||
1145 | const SSL3_RECORD *rec, | ||
1146 | unsigned md_size,unsigned orig_len); | ||
1147 | int ssl3_cbc_remove_padding(const SSL* s, | ||
1148 | SSL3_RECORD *rec, | ||
1149 | unsigned block_size, | ||
1150 | unsigned mac_size); | ||
1151 | int tls1_cbc_remove_padding(const SSL* s, | ||
1152 | SSL3_RECORD *rec, | ||
1153 | unsigned block_size, | ||
1154 | unsigned mac_size); | ||
1155 | char ssl3_cbc_record_digest_supported(const EVP_MD_CTX *ctx); | ||
1156 | void 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 | |||
1168 | void 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 | */ | ||
670 | int tls1_enc(SSL *s, int send) | 679 | int 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 | |||
904 | int tls1_cert_verify_mac(SSL *s, int md_nid, unsigned char *out) | 863 | int 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 |
1053 | printf("sec="); | 1044 | printf("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 | ||
3 | LIB= ssl | 3 | LIB= 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 |
25 | SRCS+= s3_cbc.c | ||
25 | 26 | ||
26 | HDRS= srtp.h ssl.h ssl2.h ssl3.h ssl23.h tls1.h dtls1.h kssl.h | 27 | HDRS= 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 | |||
1131 | int ssl_add_serverhello_use_srtp_ext(SSL *s, unsigned char *p, int *len, int maxlen); | 1140 | int ssl_add_serverhello_use_srtp_ext(SSL *s, unsigned char *p, int *len, int maxlen); |
1132 | int ssl_parse_serverhello_use_srtp_ext(SSL *s, unsigned char *d, int len,int *al); | 1141 | int ssl_parse_serverhello_use_srtp_ext(SSL *s, unsigned char *d, int len,int *al); |
1133 | 1142 | ||
1143 | /* s3_cbc.c */ | ||
1144 | void ssl3_cbc_copy_mac(unsigned char* out, | ||
1145 | const SSL3_RECORD *rec, | ||
1146 | unsigned md_size,unsigned orig_len); | ||
1147 | int ssl3_cbc_remove_padding(const SSL* s, | ||
1148 | SSL3_RECORD *rec, | ||
1149 | unsigned block_size, | ||
1150 | unsigned mac_size); | ||
1151 | int tls1_cbc_remove_padding(const SSL* s, | ||
1152 | SSL3_RECORD *rec, | ||
1153 | unsigned block_size, | ||
1154 | unsigned mac_size); | ||
1155 | char ssl3_cbc_record_digest_supported(const EVP_MD_CTX *ctx); | ||
1156 | void 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 | |||
1168 | void 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 | */ | ||
670 | int tls1_enc(SSL *s, int send) | 679 | int 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 | |||
904 | int tls1_cert_verify_mac(SSL *s, int md_nid, unsigned char *out) | 863 | int 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 |
1053 | printf("sec="); | 1044 | printf("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 */ |