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

Side by Side Diff: nss/lib/softoken/pkcs11c.c

Issue 27510015: Support ChaCha20+Poly1305 cipher suites. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/nss/
Patch Set: Return SECFailure instead of NULL on failure Created 7 years, 1 month 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
OLDNEW
1 /* This Source Code Form is subject to the terms of the Mozilla Public 1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this 2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4 /* 4 /*
5 * This file implements PKCS 11 on top of our existing security modules 5 * This file implements PKCS 11 on top of our existing security modules
6 * 6 *
7 * For more information about PKCS 11 See PKCS 11 Token Inteface Standard. 7 * For more information about PKCS 11 See PKCS 11 Token Inteface Standard.
8 * This implementation has two slots: 8 * This implementation has two slots:
9 * slot 1 is our generic crypto support. It does not require login. 9 * slot 1 is our generic crypto support. It does not require login.
10 * It supports Public Key ops, and all they bulk ciphers and hashes. 10 * It supports Public Key ops, and all they bulk ciphers and hashes.
(...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after
468 468
469 static SECStatus 469 static SECStatus
470 sftk_DecryptOAEP(SFTKOAEPDecryptInfo *info, unsigned char *output, 470 sftk_DecryptOAEP(SFTKOAEPDecryptInfo *info, unsigned char *output,
471 unsigned int *outputLen, unsigned int maxLen, 471 unsigned int *outputLen, unsigned int maxLen,
472 unsigned char *input, unsigned int inputLen) 472 unsigned char *input, unsigned int inputLen)
473 { 473 {
474 return RSA_DecryptOAEP(info->params, info->key, output, outputLen, 474 return RSA_DecryptOAEP(info->params, info->key, output, outputLen,
475 maxLen, input, inputLen); 475 maxLen, input, inputLen);
476 } 476 }
477 477
478 static SFTKChaCha20Poly1305Info *
479 sftk_ChaCha20Poly1305_CreateContext(const unsigned char *key, unsigned int keyLe n,
agl 2013/10/23 14:24:28 (not about about local style, but this spills over
wtc 2013/10/23 20:04:20 Done.
480 const CK_NSS_AEAD_PARAMS* params)
481 {
482 SFTKChaCha20Poly1305Info *ctx;
483
484 if (params->ulIvLen != sizeof(ctx->nonce)) {
485 PORT_SetError(SEC_ERROR_INPUT_LEN);
486 return NULL;
487 }
488
489 ctx = PORT_New(SFTKChaCha20Poly1305Info);
490 if (ctx == NULL) {
491 return NULL;
492 }
493
494 if (ChaCha20Poly1305_InitContext(&ctx->freeblCtx, key, keyLen,
495 params->ulTagLen) != SECSuccess) {
496 PORT_Free(ctx);
497 return NULL;
498 }
499
500 memcpy(ctx->nonce, params->pIv, sizeof(ctx->nonce));
501
502 if (params->ulAADLen > sizeof(ctx->ad)) {
503 /* Need to allocate an overflow buffer for the additional data. */
504 ctx->adOverflow = (unsigned char *)PORT_Alloc(params->ulAADLen);
505 if (!ctx->adOverflow) {
506 PORT_Free(ctx);
507 return NULL;
508 }
509 memcpy(ctx->adOverflow, params->pAAD, params->ulAADLen);
510 } else {
511 ctx->adOverflow = NULL;
512 memcpy(ctx->ad, params->pAAD, params->ulAADLen);
513 }
514 ctx->adLen = params->ulAADLen;
515
516 return ctx;
517 }
518
519 static void
520 sftk_ChaCha20Poly1305_DestroyContext(SFTKChaCha20Poly1305Info *ctx, PRBool freei t)
521 {
522 ChaCha20Poly1305_DestroyContext(&ctx->freeblCtx, PR_FALSE);
523 if (ctx->adOverflow != NULL) {
524 PORT_Free(ctx->adOverflow);
525 ctx->adOverflow = NULL;
526 }
527 ctx->adLen = 0;
528 if (freeit) {
529 PORT_Free(ctx);
530 }
531 }
532
533 static SECStatus
534 sftk_ChaCha20Poly1305_Encrypt(const SFTKChaCha20Poly1305Info *ctx,
535 unsigned char *output, unsigned int *outputLen,
536 unsigned int maxOutputLen,
537 const unsigned char *input, unsigned int inputLen)
538 {
539 const unsigned char *ad = ctx->adOverflow;
540
541 if (ad == NULL) {
542 ad = ctx->ad;
543 }
544
545 return ChaCha20Poly1305_Seal(&ctx->freeblCtx, output, outputLen, maxOutputLe n,
546 input, inputLen, ctx->nonce, sizeof(ctx->nonce) ,
547 ad, ctx->adLen);
548 }
549
550 static SECStatus
551 sftk_ChaCha20Poly1305_Decrypt(const SFTKChaCha20Poly1305Info *ctx,
552 unsigned char *output, unsigned int *outputLen,
553 unsigned int maxOutputLen,
554 const unsigned char *input, unsigned int inputLen)
555 {
556 const unsigned char *ad = ctx->adOverflow;
557
558 if (ad == NULL) {
559 ad = ctx->ad;
560 }
561
562 return ChaCha20Poly1305_Open(&ctx->freeblCtx, output, outputLen, maxOutputLe n,
563 input, inputLen, ctx->nonce, sizeof(ctx->nonce) ,
564 ad, ctx->adLen);
565 }
566
478 /** NSC_CryptInit initializes an encryption/Decryption operation. 567 /** NSC_CryptInit initializes an encryption/Decryption operation.
479 * 568 *
480 * Always called by NSC_EncryptInit, NSC_DecryptInit, NSC_WrapKey,NSC_UnwrapKey. 569 * Always called by NSC_EncryptInit, NSC_DecryptInit, NSC_WrapKey,NSC_UnwrapKey.
481 * Called by NSC_SignInit, NSC_VerifyInit (via sftk_InitCBCMac) only for block 570 * Called by NSC_SignInit, NSC_VerifyInit (via sftk_InitCBCMac) only for block
482 * ciphers MAC'ing. 571 * ciphers MAC'ing.
483 */ 572 */
484 static CK_RV 573 static CK_RV
485 sftk_CryptInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism, 574 sftk_CryptInit(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pMechanism,
486 CK_OBJECT_HANDLE hKey, 575 CK_OBJECT_HANDLE hKey,
487 CK_ATTRIBUTE_TYPE mechUsage, CK_ATTRIBUTE_TYPE keyUsage, 576 CK_ATTRIBUTE_TYPE mechUsage, CK_ATTRIBUTE_TYPE keyUsage,
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after
863 isEncrypt, att->attrib.ulValueLen, 16); 952 isEncrypt, att->attrib.ulValueLen, 16);
864 sftk_FreeAttribute(att); 953 sftk_FreeAttribute(att);
865 if (context->cipherInfo == NULL) { 954 if (context->cipherInfo == NULL) {
866 crv = CKR_HOST_MEMORY; 955 crv = CKR_HOST_MEMORY;
867 break; 956 break;
868 } 957 }
869 context->update = (SFTKCipher) (isEncrypt ? AES_Encrypt : AES_Decrypt); 958 context->update = (SFTKCipher) (isEncrypt ? AES_Encrypt : AES_Decrypt);
870 context->destroy = (SFTKDestroy) AES_DestroyContext; 959 context->destroy = (SFTKDestroy) AES_DestroyContext;
871 break; 960 break;
872 961
962 case CKM_NSS_CHACHA20_POLY1305:
963 if (pMechanism->ulParameterLen != sizeof(CK_NSS_AEAD_PARAMS)) {
964 crv = CKR_MECHANISM_PARAM_INVALID;
965 break;
966 }
967 context->multi = PR_FALSE;
968 if (key_type != CKK_NSS_CHACHA20) {
969 crv = CKR_KEY_TYPE_INCONSISTENT;
970 break;
971 }
972 att = sftk_FindAttribute(key,CKA_VALUE);
973 if (att == NULL) {
974 crv = CKR_KEY_HANDLE_INVALID;
975 break;
976 }
977 context->cipherInfo = sftk_ChaCha20Poly1305_CreateContext(
978 (unsigned char*) att->attrib.pValue, att->attrib.ulValueLen,
979 (CK_NSS_AEAD_PARAMS*) pMechanism->pParameter);
980 sftk_FreeAttribute(att);
981 if (context->cipherInfo == NULL) {
982 /* XXX map error code */
983 crv = CKR_HOST_MEMORY;
984 break;
985 }
986 context->update = (SFTKCipher) (isEncrypt ? sftk_ChaCha20Poly1305_Encryp t :
987 sftk_ChaCha20Poly1305_Decrypt);
988 context->destroy = (SFTKDestroy) sftk_ChaCha20Poly1305_DestroyContext;
989 break;
990
873 case CKM_NETSCAPE_AES_KEY_WRAP_PAD: 991 case CKM_NETSCAPE_AES_KEY_WRAP_PAD:
874 context->doPad = PR_TRUE; 992 context->doPad = PR_TRUE;
875 /* fall thru */ 993 /* fall thru */
876 case CKM_NETSCAPE_AES_KEY_WRAP: 994 case CKM_NETSCAPE_AES_KEY_WRAP:
877 context->multi = PR_FALSE; 995 context->multi = PR_FALSE;
878 context->blockSize = 8; 996 context->blockSize = 8;
879 if (key_type != CKK_AES) { 997 if (key_type != CKK_AES) {
880 crv = CKR_KEY_TYPE_INCONSISTENT; 998 crv = CKR_KEY_TYPE_INCONSISTENT;
881 break; 999 break;
882 } 1000 }
(...skipping 2382 matching lines...) Expand 10 before | Expand all | Expand 10 after
3265 *key_length = 16; 3383 *key_length = 16;
3266 break; 3384 break;
3267 case CKM_CAMELLIA_KEY_GEN: 3385 case CKM_CAMELLIA_KEY_GEN:
3268 *key_type = CKK_CAMELLIA; 3386 *key_type = CKK_CAMELLIA;
3269 if (*key_length == 0) crv = CKR_TEMPLATE_INCOMPLETE; 3387 if (*key_length == 0) crv = CKR_TEMPLATE_INCOMPLETE;
3270 break; 3388 break;
3271 case CKM_AES_KEY_GEN: 3389 case CKM_AES_KEY_GEN:
3272 *key_type = CKK_AES; 3390 *key_type = CKK_AES;
3273 if (*key_length == 0) crv = CKR_TEMPLATE_INCOMPLETE; 3391 if (*key_length == 0) crv = CKR_TEMPLATE_INCOMPLETE;
3274 break; 3392 break;
3393 case CKM_NSS_CHACHA20_KEY_GEN:
3394 *key_type = CKK_NSS_CHACHA20;
3395 if (*key_length == 0) crv = CKR_TEMPLATE_INCOMPLETE;
3396 break;
3275 default: 3397 default:
3276 PORT_Assert(0); 3398 PORT_Assert(0);
3277 crv = CKR_MECHANISM_INVALID; 3399 crv = CKR_MECHANISM_INVALID;
3278 break; 3400 break;
3279 } 3401 }
3280 3402
3281 return crv; 3403 return crv;
3282 } 3404 }
3283 3405
3284 CK_RV 3406 CK_RV
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
3509 case CKM_DES_KEY_GEN: 3631 case CKM_DES_KEY_GEN:
3510 case CKM_DES2_KEY_GEN: 3632 case CKM_DES2_KEY_GEN:
3511 case CKM_DES3_KEY_GEN: 3633 case CKM_DES3_KEY_GEN:
3512 checkWeak = PR_TRUE; 3634 checkWeak = PR_TRUE;
3513 case CKM_RC2_KEY_GEN: 3635 case CKM_RC2_KEY_GEN:
3514 case CKM_RC4_KEY_GEN: 3636 case CKM_RC4_KEY_GEN:
3515 case CKM_GENERIC_SECRET_KEY_GEN: 3637 case CKM_GENERIC_SECRET_KEY_GEN:
3516 case CKM_SEED_KEY_GEN: 3638 case CKM_SEED_KEY_GEN:
3517 case CKM_CAMELLIA_KEY_GEN: 3639 case CKM_CAMELLIA_KEY_GEN:
3518 case CKM_AES_KEY_GEN: 3640 case CKM_AES_KEY_GEN:
3641 case CKM_NSS_CHACHA20_KEY_GEN:
3519 #if NSS_SOFTOKEN_DOES_RC5 3642 #if NSS_SOFTOKEN_DOES_RC5
3520 case CKM_RC5_KEY_GEN: 3643 case CKM_RC5_KEY_GEN:
3521 #endif 3644 #endif
3522 crv = nsc_SetupBulkKeyGen(pMechanism->mechanism,&key_type,&key_length); 3645 crv = nsc_SetupBulkKeyGen(pMechanism->mechanism,&key_type,&key_length);
3523 break; 3646 break;
3524 case CKM_SSL3_PRE_MASTER_KEY_GEN: 3647 case CKM_SSL3_PRE_MASTER_KEY_GEN:
3525 key_type = CKK_GENERIC_SECRET; 3648 key_type = CKK_GENERIC_SECRET;
3526 key_length = 48; 3649 key_length = 48;
3527 key_gen_type = nsc_ssl; 3650 key_gen_type = nsc_ssl;
3528 break; 3651 break;
(...skipping 3418 matching lines...) Expand 10 before | Expand all | Expand 10 after
6947 att = sftk_FindAttribute(key,CKA_VALUE); 7070 att = sftk_FindAttribute(key,CKA_VALUE);
6948 sftk_FreeObject(key); 7071 sftk_FreeObject(key);
6949 if (!att) { 7072 if (!att) {
6950 return CKR_KEY_HANDLE_INVALID; 7073 return CKR_KEY_HANDLE_INVALID;
6951 } 7074 }
6952 crv = NSC_DigestUpdate(hSession,(CK_BYTE_PTR)att->attrib.pValue, 7075 crv = NSC_DigestUpdate(hSession,(CK_BYTE_PTR)att->attrib.pValue,
6953 att->attrib.ulValueLen); 7076 att->attrib.ulValueLen);
6954 sftk_FreeAttribute(att); 7077 sftk_FreeAttribute(att);
6955 return crv; 7078 return crv;
6956 } 7079 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698