Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(16)

Side by Side Diff: net/third_party/nss/ssl/sslplatf.c

Issue 14772023: Implement TLS 1.2. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Move the assertion in sslplatf.c Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/third_party/nss/ssl/sslimpl.h ('k') | net/third_party/nss/ssl/sslproto.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Platform specific crypto wrappers 2 * Platform specific crypto wrappers
3 * 3 *
4 * ***** BEGIN LICENSE BLOCK ***** 4 * ***** BEGIN LICENSE BLOCK *****
5 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 5 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
6 * 6 *
7 * The contents of this file are subject to the Mozilla Public License Version 7 * The contents of this file are subject to the Mozilla Public License Version
8 * 1.1 (the "License"); you may not use this file except in compliance with 8 * 1.1 (the "License"); you may not use this file except in compliance with
9 * the License. You may obtain a copy of the License at 9 * the License. You may obtain a copy of the License at
10 * http://www.mozilla.org/MPL/ 10 * http://www.mozilla.org/MPL/
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 PRBool isTLS, KeyType keyType) 205 PRBool isTLS, KeyType keyType)
206 { 206 {
207 SECStatus rv = SECFailure; 207 SECStatus rv = SECFailure;
208 SECURITY_STATUS ncrypt_status; 208 SECURITY_STATUS ncrypt_status;
209 PRBool doDerEncode = PR_FALSE; 209 PRBool doDerEncode = PR_FALSE;
210 SECItem hashItem; 210 SECItem hashItem;
211 DWORD signatureLen = 0; 211 DWORD signatureLen = 0;
212 DWORD dwFlags = 0; 212 DWORD dwFlags = 0;
213 VOID *pPaddingInfo = NULL; 213 VOID *pPaddingInfo = NULL;
214 214
215 /* Always encode using PKCS#1 block type, with no OID/encoded DigestInfo */ 215 /* Always encode using PKCS#1 block type. */
216 BCRYPT_PKCS1_PADDING_INFO rsaPaddingInfo; 216 BCRYPT_PKCS1_PADDING_INFO rsaPaddingInfo;
217 rsaPaddingInfo.pszAlgId = NULL;
218 217
219 if (key->dwKeySpec != CERT_NCRYPT_KEY_SPEC) { 218 if (key->dwKeySpec != CERT_NCRYPT_KEY_SPEC) {
220 PR_SetError(SEC_ERROR_LIBRARY_FAILURE, 0); 219 PR_SetError(SEC_ERROR_LIBRARY_FAILURE, 0);
221 return SECFailure; 220 return SECFailure;
222 } 221 }
223 if (ssl_InitCng() != SECSuccess) { 222 if (ssl_InitCng() != SECSuccess) {
224 PR_SetError(SEC_ERROR_LIBRARY_FAILURE, 0); 223 PR_SetError(SEC_ERROR_LIBRARY_FAILURE, 0);
225 return SECFailure; 224 return SECFailure;
226 } 225 }
227 226
228 switch (keyType) { 227 switch (keyType) {
229 case rsaKey: 228 case rsaKey:
230 hashItem.data = hash->md5; 229 switch (hash->hashAlg) {
231 hashItem.len = sizeof(SSL3Hashes); 230 case SEC_OID_UNKNOWN:
231 /* No OID/encoded DigestInfo. */
232 rsaPaddingInfo.pszAlgId = NULL;
233 break;
234 case SEC_OID_SHA1:
235 rsaPaddingInfo.pszAlgId = BCRYPT_SHA1_ALGORITHM;
236 break;
237 case SEC_OID_SHA256:
238 rsaPaddingInfo.pszAlgId = BCRYPT_SHA256_ALGORITHM;
239 break;
240 case SEC_OID_SHA384:
241 rsaPaddingInfo.pszAlgId = BCRYPT_SHA384_ALGORITHM;
242 break;
243 case SEC_OID_SHA512:
244 rsaPaddingInfo.pszAlgId = BCRYPT_SHA512_ALGORITHM;
245 break;
246 default:
247 PORT_SetError(SSL_ERROR_UNSUPPORTED_HASH_ALGORITHM);
248 return SECFailure;
249 }
250 hashItem.data = hash->u.raw;
251 hashItem.len = hash->len;
232 dwFlags = BCRYPT_PAD_PKCS1; 252 dwFlags = BCRYPT_PAD_PKCS1;
233 pPaddingInfo = &rsaPaddingInfo; 253 pPaddingInfo = &rsaPaddingInfo;
234 break; 254 break;
235 case dsaKey: 255 case dsaKey:
236 case ecKey: 256 case ecKey:
237 if (keyType == ecKey) { 257 if (keyType == ecKey) {
238 doDerEncode = PR_TRUE; 258 doDerEncode = PR_TRUE;
239 } else { 259 } else {
240 doDerEncode = isTLS; 260 doDerEncode = isTLS;
241 } 261 }
242 hashItem.data = hash->sha; 262 if (hash->hashAlg == SEC_OID_UNKNOWN) {
243 hashItem.len = sizeof(hash->sha); 263 hashItem.data = hash->u.s.sha;
264 hashItem.len = sizeof(hash->u.s.sha);
265 } else {
266 hashItem.data = hash->u.raw;
267 hashItem.len = hash->len;
268 }
244 break; 269 break;
245 default: 270 default:
246 PORT_SetError(SEC_ERROR_INVALID_KEY); 271 PORT_SetError(SEC_ERROR_INVALID_KEY);
247 goto done; 272 goto done;
248 } 273 }
249 PRINT_BUF(60, (NULL, "hash(es) to be signed", hashItem.data, hashItem.len)); 274 PRINT_BUF(60, (NULL, "hash(es) to be signed", hashItem.data, hashItem.len));
250 275
251 ncrypt_status = (*pNCryptSignHash)(key->hNCryptKey, pPaddingInfo, 276 ncrypt_status = (*pNCryptSignHash)(key->hNCryptKey, pPaddingInfo,
252 (PBYTE)hashItem.data, hashItem.len, 277 (PBYTE)hashItem.data, hashItem.len,
253 NULL, 0, &signatureLen, dwFlags); 278 NULL, 0, &signatureLen, dwFlags);
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
308 SECItem hashItem; 333 SECItem hashItem;
309 DWORD argLen = 0; 334 DWORD argLen = 0;
310 DWORD signatureLen = 0; 335 DWORD signatureLen = 0;
311 ALG_ID hashAlg = 0; 336 ALG_ID hashAlg = 0;
312 HCRYPTHASH hHash = 0; 337 HCRYPTHASH hHash = 0;
313 DWORD hashLen = 0; 338 DWORD hashLen = 0;
314 unsigned int i = 0; 339 unsigned int i = 0;
315 340
316 buf->data = NULL; 341 buf->data = NULL;
317 342
343 switch (hash->hashAlg) {
344 case SEC_OID_UNKNOWN:
345 hashAlg = 0;
346 break;
347 case SEC_OID_SHA1:
348 hashAlg = CALG_SHA1;
349 break;
350 case SEC_OID_SHA256:
351 hashAlg = CALG_SHA_256;
352 break;
353 case SEC_OID_SHA384:
354 hashAlg = CALG_SHA_384;
355 break;
356 case SEC_OID_SHA512:
357 hashAlg = CALG_SHA_512;
358 break;
359 default:
360 PORT_SetError(SSL_ERROR_UNSUPPORTED_HASH_ALGORITHM);
361 return SECFailure;
362 }
363
318 switch (keyType) { 364 switch (keyType) {
319 case rsaKey: 365 case rsaKey:
320 hashAlg = CALG_SSL3_SHAMD5; 366 if (hashAlg == 0) {
321 hashItem.data = hash->md5; 367 hashAlg = CALG_SSL3_SHAMD5;
322 hashItem.len = sizeof(SSL3Hashes); 368 }
369 hashItem.data = hash->u.raw;
370 hashItem.len = hash->len;
323 break; 371 break;
324 case dsaKey: 372 case dsaKey:
325 case ecKey: 373 case ecKey:
326 if (keyType == ecKey) { 374 if (keyType == ecKey) {
327 doDerEncode = PR_TRUE; 375 doDerEncode = PR_TRUE;
328 } else { 376 } else {
329 doDerEncode = isTLS; 377 doDerEncode = isTLS;
330 } 378 }
331 hashAlg = CALG_SHA1; 379 if (hashAlg == 0) {
332 hashItem.data = hash->sha; 380 hashAlg = CALG_SHA1;
333 hashItem.len = sizeof(hash->sha); 381 hashItem.data = hash->u.s.sha;
382 hashItem.len = sizeof(hash->u.s.sha);
383 } else {
384 hashItem.data = hash->u.raw;
385 hashItem.len = hash->len;
386 }
334 break; 387 break;
335 default: 388 default:
336 PORT_SetError(SEC_ERROR_INVALID_KEY); 389 PORT_SetError(SEC_ERROR_INVALID_KEY);
337 goto done; 390 goto done;
338 } 391 }
339 PRINT_BUF(60, (NULL, "hash(es) to be signed", hashItem.data, hashItem.len)); 392 PRINT_BUF(60, (NULL, "hash(es) to be signed", hashItem.data, hashItem.len));
340 393
341 if (!CryptCreateHash(key->hCryptProv, hashAlg, 0, 0, &hHash)) { 394 if (!CryptCreateHash(key->hCryptProv, hashAlg, 0, 0, &hHash)) {
342 PR_SetError(SSL_ERROR_SIGN_HASHES_FAILURE, GetLastError()); 395 PR_SetError(SSL_ERROR_SIGN_HASHES_FAILURE, GetLastError());
343 goto done; 396 goto done;
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
461 if (signatureLen == 0) { 514 if (signatureLen == 0) {
462 PORT_SetError(SEC_ERROR_INVALID_KEY); 515 PORT_SetError(SEC_ERROR_INVALID_KEY);
463 goto done; 516 goto done;
464 } 517 }
465 518
466 buf->data = (unsigned char *)PORT_Alloc(signatureLen); 519 buf->data = (unsigned char *)PORT_Alloc(signatureLen);
467 if (!buf->data) 520 if (!buf->data)
468 goto done; /* error code was set. */ 521 goto done; /* error code was set. */
469 522
470 sigAlg = cssmKey->KeyHeader.AlgorithmId; 523 sigAlg = cssmKey->KeyHeader.AlgorithmId;
524 if (keyType == rsaKey) {
525 PORT_Assert(sigAlg == CSSM_ALGID_RSA);
526 switch (hash->hashAlg) {
527 case SEC_OID_UNKNOWN:
528 break;
529 case SEC_OID_SHA1:
530 sigAlg = CSSM_ALGID_SHA1WithRSA;
531 break;
532 case SEC_OID_SHA224:
533 sigAlg = CSSM_ALGID_SHA224WithRSA;
534 break;
535 case SEC_OID_SHA256:
536 sigAlg = CSSM_ALGID_SHA256WithRSA;
537 break;
538 case SEC_OID_SHA384:
539 sigAlg = CSSM_ALGID_SHA384WithRSA;
540 break;
541 case SEC_OID_SHA512:
542 sigAlg = CSSM_ALGID_SHA512WithRSA;
543 break;
544 default:
545 PORT_SetError(SSL_ERROR_UNSUPPORTED_HASH_ALGORITHM);
546 goto done;
547 }
548 }
549
471 switch (keyType) { 550 switch (keyType) {
472 case rsaKey: 551 case rsaKey:
473 PORT_Assert(sigAlg == CSSM_ALGID_RSA); 552 hashData.Data = hash->u.raw;
474 hashData.Data = hash->md5; 553 hashData.Length = hash->len;
475 hashData.Length = sizeof(SSL3Hashes);
476 break; 554 break;
477 case dsaKey: 555 case dsaKey:
478 case ecKey: 556 case ecKey:
479 if (keyType == ecKey) { 557 if (keyType == ecKey) {
480 PORT_Assert(sigAlg == CSSM_ALGID_ECDSA); 558 PORT_Assert(sigAlg == CSSM_ALGID_ECDSA);
481 doDerEncode = PR_TRUE; 559 doDerEncode = PR_TRUE;
482 } else { 560 } else {
483 PORT_Assert(sigAlg == CSSM_ALGID_DSA); 561 PORT_Assert(sigAlg == CSSM_ALGID_DSA);
484 doDerEncode = isTLS; 562 doDerEncode = isTLS;
485 } 563 }
486 hashData.Data = hash->sha; 564 if (hash->hashAlg == SEC_OID_UNKNOWN) {
487 hashData.Length = sizeof(hash->sha); 565 hashData.Data = hash->u.s.sha;
566 hashData.Length = sizeof(hash->u.s.sha);
567 } else {
568 hashData.Data = hash->u.raw;
569 hashData.Length = hash->len;
570 }
488 break; 571 break;
489 default: 572 default:
490 PORT_SetError(SEC_ERROR_INVALID_KEY); 573 PORT_SetError(SEC_ERROR_INVALID_KEY);
491 goto done; 574 goto done;
492 } 575 }
493 PRINT_BUF(60, (NULL, "hash(es) to be signed", hashData.Data, hashData.Length )); 576 PRINT_BUF(60, (NULL, "hash(es) to be signed", hashData.Data, hashData.Length ));
494 577
495 /* TODO(rsleevi): Should it be kSecCredentialTypeNoUI? In Win32, at least, 578 /* TODO(rsleevi): Should it be kSecCredentialTypeNoUI? In Win32, at least,
496 * you can prevent the UI by setting the provider handle on the 579 * you can prevent the UI by setting the provider handle on the
497 * certificate to be opened with CRYPT_SILENT, but is there an equivalent? 580 * certificate to be opened with CRYPT_SILENT, but is there an equivalent?
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
574 SECStatus 657 SECStatus
575 ssl3_PlatformSignHashes(SSL3Hashes *hash, PlatformKey key, SECItem *buf, 658 ssl3_PlatformSignHashes(SSL3Hashes *hash, PlatformKey key, SECItem *buf,
576 PRBool isTLS, KeyType keyType) 659 PRBool isTLS, KeyType keyType)
577 { 660 {
578 PORT_SetError(PR_NOT_IMPLEMENTED_ERROR); 661 PORT_SetError(PR_NOT_IMPLEMENTED_ERROR);
579 return SECFailure; 662 return SECFailure;
580 } 663 }
581 #endif 664 #endif
582 665
583 #endif /* NSS_PLATFORM_CLIENT_AUTH */ 666 #endif /* NSS_PLATFORM_CLIENT_AUTH */
OLDNEW
« no previous file with comments | « net/third_party/nss/ssl/sslimpl.h ('k') | net/third_party/nss/ssl/sslproto.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698