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

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

Issue 295043002: Add RSA-OAEP support from upstream NSS bugs 1009794 and 1009785 (Closed) Base URL: http://src.chromium.org/svn/trunk/deps/third_party/nss
Patch Set: Created 6 years, 7 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
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 284 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 case CKG_MGF1_SHA384: 295 case CKG_MGF1_SHA384:
296 return HASH_AlgSHA384; 296 return HASH_AlgSHA384;
297 case CKM_SHA512: 297 case CKM_SHA512:
298 case CKG_MGF1_SHA512: 298 case CKG_MGF1_SHA512:
299 return HASH_AlgSHA512; 299 return HASH_AlgSHA512;
300 default: 300 default:
301 return HASH_AlgNULL; 301 return HASH_AlgNULL;
302 } 302 }
303 } 303 }
304 304
305 /*
306 * Returns true if "params" contains a valid set of PSS parameters
307 */
308 static PRBool
309 sftk_ValidatePssParams(const CK_RSA_PKCS_PSS_PARAMS *params)
310 {
311 if (!params) {
312 return PR_FALSE;
313 }
314 if (GetHashTypeFromMechanism(params->hashAlg) == HASH_AlgNULL ||
315 GetHashTypeFromMechanism(params->mgf) == HASH_AlgNULL) {
316 return PR_FALSE;
317 }
318 return PR_TRUE;
319 }
320
321 /*
322 * Returns true if "params" contains a valid set of OAEP parameters
323 */
324 static PRBool
325 sftk_ValidateOaepParams(const CK_RSA_PKCS_OAEP_PARAMS *params)
326 {
327 if (!params) {
328 return PR_FALSE;
329 }
330 /* The requirements of ulSourceLen/pSourceData come from PKCS #11, which
331 * state:
332 * If the parameter is empty, pSourceData must be NULL and
333 * ulSourceDataLen must be zero.
334 */
335 if (params->source != CKZ_DATA_SPECIFIED ||
336 (GetHashTypeFromMechanism(params->hashAlg) == HASH_AlgNULL) ||
337 (GetHashTypeFromMechanism(params->mgf) == HASH_AlgNULL) ||
338 (params->ulSourceDataLen == 0 && params->pSourceData != NULL) ||
339 (params->ulSourceDataLen != 0 && params->pSourceData == NULL)) {
340 return PR_FALSE;
341 }
342 return PR_TRUE;
343 }
344
305 /* 345 /*
306 * return a context based on the SFTKContext type. 346 * return a context based on the SFTKContext type.
307 */ 347 */
308 SFTKSessionContext * 348 SFTKSessionContext *
309 sftk_ReturnContextByType(SFTKSession *session, SFTKContextType type) 349 sftk_ReturnContextByType(SFTKSession *session, SFTKContextType type)
310 { 350 {
311 switch (type) { 351 switch (type) {
312 case SFTK_ENCRYPT: 352 case SFTK_ENCRYPT:
313 case SFTK_DECRYPT: 353 case SFTK_DECRYPT:
314 return session->enc_context; 354 return session->enc_context;
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after
581 621
582 PORT_Assert(info->key->keyType == NSSLOWKEYRSAKey); 622 PORT_Assert(info->key->keyType == NSSLOWKEYRSAKey);
583 if (info->key->keyType != NSSLOWKEYRSAKey) { 623 if (info->key->keyType != NSSLOWKEYRSAKey) {
584 PORT_SetError(SEC_ERROR_INVALID_KEY); 624 PORT_SetError(SEC_ERROR_INVALID_KEY);
585 return SECFailure; 625 return SECFailure;
586 } 626 }
587 627
588 hashAlg = GetHashTypeFromMechanism(info->params->hashAlg); 628 hashAlg = GetHashTypeFromMechanism(info->params->hashAlg);
589 maskHashAlg = GetHashTypeFromMechanism(info->params->mgf); 629 maskHashAlg = GetHashTypeFromMechanism(info->params->mgf);
590 630
591 if (info->params->source != CKZ_DATA_SPECIFIED) {
592 PORT_SetError(SEC_ERROR_INVALID_ALGORITHM);
593 return SECFailure;
594 }
595
596 return RSA_EncryptOAEP(&info->key->u.rsa, hashAlg, maskHashAlg, 631 return RSA_EncryptOAEP(&info->key->u.rsa, hashAlg, maskHashAlg,
597 (const unsigned char*)info->params->pSourceData, 632 (const unsigned char*)info->params->pSourceData,
598 info->params->ulSourceDataLen, NULL, 0, 633 info->params->ulSourceDataLen, NULL, 0,
599 output, outputLen, maxLen, input, inputLen); 634 output, outputLen, maxLen, input, inputLen);
600 } 635 }
601 636
602 static SECStatus 637 static SECStatus
603 sftk_RSADecryptOAEP(SFTKOAEPDecryptInfo *info, unsigned char *output, 638 sftk_RSADecryptOAEP(SFTKOAEPDecryptInfo *info, unsigned char *output,
604 unsigned int *outputLen, unsigned int maxLen, 639 unsigned int *outputLen, unsigned int maxLen,
605 const unsigned char *input, unsigned int inputLen) 640 const unsigned char *input, unsigned int inputLen)
606 { 641 {
607 SECStatus rv = SECFailure; 642 SECStatus rv = SECFailure;
608 HASH_HashType hashAlg; 643 HASH_HashType hashAlg;
609 HASH_HashType maskHashAlg; 644 HASH_HashType maskHashAlg;
610 645
611 PORT_Assert(info->key->keyType == NSSLOWKEYRSAKey); 646 PORT_Assert(info->key->keyType == NSSLOWKEYRSAKey);
612 if (info->key->keyType != NSSLOWKEYRSAKey) { 647 if (info->key->keyType != NSSLOWKEYRSAKey) {
613 PORT_SetError(SEC_ERROR_INVALID_KEY); 648 PORT_SetError(SEC_ERROR_INVALID_KEY);
614 return SECFailure; 649 return SECFailure;
615 } 650 }
616 651
617 hashAlg = GetHashTypeFromMechanism(info->params->hashAlg); 652 hashAlg = GetHashTypeFromMechanism(info->params->hashAlg);
618 maskHashAlg = GetHashTypeFromMechanism(info->params->mgf); 653 maskHashAlg = GetHashTypeFromMechanism(info->params->mgf);
619 654
620 if (info->params->source != CKZ_DATA_SPECIFIED) {
621 PORT_SetError(SEC_ERROR_INVALID_ALGORITHM);
622 return SECFailure;
623 }
624
625 rv = RSA_DecryptOAEP(&info->key->u.rsa, hashAlg, maskHashAlg, 655 rv = RSA_DecryptOAEP(&info->key->u.rsa, hashAlg, maskHashAlg,
626 (const unsigned char*)info->params->pSourceData, 656 (const unsigned char*)info->params->pSourceData,
627 info->params->ulSourceDataLen, 657 info->params->ulSourceDataLen,
628 output, outputLen, maxLen, input, inputLen); 658 output, outputLen, maxLen, input, inputLen);
629 if (rv != SECSuccess && PORT_GetError() == SEC_ERROR_LIBRARY_FAILURE) { 659 if (rv != SECSuccess && PORT_GetError() == SEC_ERROR_LIBRARY_FAILURE) {
630 sftk_fatalError = PR_TRUE; 660 sftk_fatalError = PR_TRUE;
631 } 661 }
632 return rv; 662 return rv;
633 } 663 }
634 664
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
794 break; 824 break;
795 } 825 }
796 context->maxLen = nsslowkey_PrivateModulusLen(privKey); 826 context->maxLen = nsslowkey_PrivateModulusLen(privKey);
797 context->cipherInfo = (void *)privKey; 827 context->cipherInfo = (void *)privKey;
798 context->update = (SFTKCipher) 828 context->update = (SFTKCipher)
799 (pMechanism->mechanism == CKM_RSA_X_509 829 (pMechanism->mechanism == CKM_RSA_X_509
800 ? sftk_RSADecryptRaw : sftk_RSADecrypt); 830 ? sftk_RSADecryptRaw : sftk_RSADecrypt);
801 } 831 }
802 context->destroy = sftk_Null; 832 context->destroy = sftk_Null;
803 break; 833 break;
804 /* XXX: Disabled until unit tests land.
805 case CKM_RSA_PKCS_OAEP: 834 case CKM_RSA_PKCS_OAEP:
806 if (key_type != CKK_RSA) { 835 if (key_type != CKK_RSA) {
807 crv = CKR_KEY_TYPE_INCONSISTENT; 836 crv = CKR_KEY_TYPE_INCONSISTENT;
808 break; 837 break;
809 } 838 }
810 » context->multi = PR_FALSE; 839 » if (pMechanism->ulParameterLen != sizeof(CK_RSA_PKCS_OAEP_PARAMS) ||
811 » context->rsa = PR_TRUE; 840 » !sftk_ValidateOaepParams((CK_RSA_PKCS_OAEP_PARAMS*)pMechanism->pPara meter)) {
812 » if (pMechanism->ulParameterLen != sizeof(CK_RSA_PKCS_OAEP_PARAMS)) {
813 crv = CKR_MECHANISM_PARAM_INVALID; 841 crv = CKR_MECHANISM_PARAM_INVALID;
814 break; 842 break;
815 } 843 }
816 » /\* XXX: Need Parameter validation here *\/ 844 » context->multi = PR_FALSE;
845 » context->rsa = PR_TRUE;
817 if (isEncrypt) { 846 if (isEncrypt) {
818 SFTKOAEPEncryptInfo *info = PORT_New(SFTKOAEPEncryptInfo); 847 SFTKOAEPEncryptInfo *info = PORT_New(SFTKOAEPEncryptInfo);
819 if (info == NULL) { 848 if (info == NULL) {
820 crv = CKR_HOST_MEMORY; 849 crv = CKR_HOST_MEMORY;
821 break; 850 break;
822 } 851 }
823 info->params = pMechanism->pParameter; 852 info->params = pMechanism->pParameter;
824 info->key = sftk_GetPubKey(key, CKK_RSA, &crv); 853 info->key = sftk_GetPubKey(key, CKK_RSA, &crv);
825 if (info->key == NULL) { 854 if (info->key == NULL) {
826 PORT_Free(info); 855 PORT_Free(info);
(...skipping 15 matching lines...) Expand all
842 PORT_Free(info); 871 PORT_Free(info);
843 crv = CKR_KEY_HANDLE_INVALID; 872 crv = CKR_KEY_HANDLE_INVALID;
844 break; 873 break;
845 } 874 }
846 context->update = (SFTKCipher) sftk_RSADecryptOAEP; 875 context->update = (SFTKCipher) sftk_RSADecryptOAEP;
847 context->maxLen = nsslowkey_PrivateModulusLen(info->key); 876 context->maxLen = nsslowkey_PrivateModulusLen(info->key);
848 context->cipherInfo = info; 877 context->cipherInfo = info;
849 } 878 }
850 context->destroy = (SFTKDestroy) sftk_Space; 879 context->destroy = (SFTKDestroy) sftk_Space;
851 break; 880 break;
852 */
853 case CKM_RC2_CBC_PAD: 881 case CKM_RC2_CBC_PAD:
854 context->doPad = PR_TRUE; 882 context->doPad = PR_TRUE;
855 /* fall thru */ 883 /* fall thru */
856 case CKM_RC2_ECB: 884 case CKM_RC2_ECB:
857 case CKM_RC2_CBC: 885 case CKM_RC2_CBC:
858 context->blockSize = 8; 886 context->blockSize = 8;
859 if (key_type != CKK_RC2) { 887 if (key_type != CKK_RC2) {
860 crv = CKR_KEY_TYPE_INCONSISTENT; 888 crv = CKR_KEY_TYPE_INCONSISTENT;
861 break; 889 break;
862 } 890 }
(...skipping 1636 matching lines...) Expand 10 before | Expand all | Expand 10 after
2499 context->destroy = (SFTKDestroy)sftk_Null; 2527 context->destroy = (SFTKDestroy)sftk_Null;
2500 } 2528 }
2501 context->maxLen = nsslowkey_PrivateModulusLen(privKey); 2529 context->maxLen = nsslowkey_PrivateModulusLen(privKey);
2502 break; 2530 break;
2503 case CKM_RSA_PKCS_PSS: 2531 case CKM_RSA_PKCS_PSS:
2504 if (key_type != CKK_RSA) { 2532 if (key_type != CKK_RSA) {
2505 crv = CKR_KEY_TYPE_INCONSISTENT; 2533 crv = CKR_KEY_TYPE_INCONSISTENT;
2506 break; 2534 break;
2507 } 2535 }
2508 context->rsa = PR_TRUE; 2536 context->rsa = PR_TRUE;
2509 » if (pMechanism->ulParameterLen != sizeof(CK_RSA_PKCS_PSS_PARAMS)) { 2537 » if (pMechanism->ulParameterLen != sizeof(CK_RSA_PKCS_PSS_PARAMS) ||
2538 » !sftk_ValidatePssParams((const CK_RSA_PKCS_PSS_PARAMS*)pMechanism->p Parameter)) {
2510 crv = CKR_MECHANISM_PARAM_INVALID; 2539 crv = CKR_MECHANISM_PARAM_INVALID;
2511 break; 2540 break;
2512 } 2541 }
2513 info = PORT_New(SFTKHashSignInfo); 2542 info = PORT_New(SFTKHashSignInfo);
2514 if (info == NULL) { 2543 if (info == NULL) {
2515 crv = CKR_HOST_MEMORY; 2544 crv = CKR_HOST_MEMORY;
2516 break; 2545 break;
2517 } 2546 }
2518 info->params = pMechanism->pParameter; 2547 info->params = pMechanism->pParameter;
2519 info->key = sftk_GetPrivKey(key,CKK_RSA,&crv); 2548 info->key = sftk_GetPrivKey(key,CKK_RSA,&crv);
(...skipping 616 matching lines...) Expand 10 before | Expand all | Expand 10 after
3136 context->cipherInfo = pubKey; 3165 context->cipherInfo = pubKey;
3137 context->destroy = sftk_Null; 3166 context->destroy = sftk_Null;
3138 } 3167 }
3139 break; 3168 break;
3140 case CKM_RSA_PKCS_PSS: 3169 case CKM_RSA_PKCS_PSS:
3141 if (key_type != CKK_RSA) { 3170 if (key_type != CKK_RSA) {
3142 crv = CKR_KEY_TYPE_INCONSISTENT; 3171 crv = CKR_KEY_TYPE_INCONSISTENT;
3143 break; 3172 break;
3144 } 3173 }
3145 context->rsa = PR_TRUE; 3174 context->rsa = PR_TRUE;
3146 » if (pMechanism->ulParameterLen != sizeof(CK_RSA_PKCS_PSS_PARAMS)) { 3175 » if (pMechanism->ulParameterLen != sizeof(CK_RSA_PKCS_PSS_PARAMS) ||
3176 » !sftk_ValidatePssParams((const CK_RSA_PKCS_PSS_PARAMS*)pMechanism->p Parameter)) {
3147 crv = CKR_MECHANISM_PARAM_INVALID; 3177 crv = CKR_MECHANISM_PARAM_INVALID;
3148 break; 3178 break;
3149 } 3179 }
3150 info = PORT_New(SFTKHashVerifyInfo); 3180 info = PORT_New(SFTKHashVerifyInfo);
3151 if (info == NULL) { 3181 if (info == NULL) {
3152 crv = CKR_HOST_MEMORY; 3182 crv = CKR_HOST_MEMORY;
3153 break; 3183 break;
3154 } 3184 }
3155 info->params = pMechanism->pParameter; 3185 info->params = pMechanism->pParameter;
3156 info->key = sftk_GetPubKey(key,CKK_RSA,&crv); 3186 info->key = sftk_GetPubKey(key,CKK_RSA,&crv);
(...skipping 4252 matching lines...) Expand 10 before | Expand all | Expand 10 after
7409 att = sftk_FindAttribute(key,CKA_VALUE); 7439 att = sftk_FindAttribute(key,CKA_VALUE);
7410 sftk_FreeObject(key); 7440 sftk_FreeObject(key);
7411 if (!att) { 7441 if (!att) {
7412 return CKR_KEY_HANDLE_INVALID; 7442 return CKR_KEY_HANDLE_INVALID;
7413 } 7443 }
7414 crv = NSC_DigestUpdate(hSession,(CK_BYTE_PTR)att->attrib.pValue, 7444 crv = NSC_DigestUpdate(hSession,(CK_BYTE_PTR)att->attrib.pValue,
7415 att->attrib.ulValueLen); 7445 att->attrib.ulValueLen);
7416 sftk_FreeAttribute(att); 7446 sftk_FreeAttribute(att);
7417 return crv; 7447 return crv;
7418 } 7448 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698