diff options
| author | markus <> | 2013-02-14 15:11:44 +0000 |
|---|---|---|
| committer | markus <> | 2013-02-14 15:11:44 +0000 |
| commit | 4383d44ca79eba8836d9f92c612c44ba8aeb87bd (patch) | |
| tree | cd2035e8f8ac3d4ade1ee779dcaabbe671c2003a | |
| parent | 4fd69672e5f9867343486cefcdfdd970465430d6 (diff) | |
| download | openbsd-4383d44ca79eba8836d9f92c612c44ba8aeb87bd.tar.gz openbsd-4383d44ca79eba8836d9f92c612c44ba8aeb87bd.tar.bz2 openbsd-4383d44ca79eba8836d9f92c612c44ba8aeb87bd.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@
Diffstat (limited to '')
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 */ |
