Index: nss/lib/softoken/pkcs11c.c |
=================================================================== |
--- nss/lib/softoken/pkcs11c.c (revision 228205) |
+++ nss/lib/softoken/pkcs11c.c (working copy) |
@@ -870,6 +870,39 @@ |
context->destroy = (SFTKDestroy) AES_DestroyContext; |
break; |
+ case CKM_NSS_CHACHA20_POLY1305: { |
+ CK_NSS_AEAD_PARAMS *params; |
+ if (pMechanism->ulParameterLen != sizeof(CK_NSS_AEAD_PARAMS)) { |
+ crv = CKR_MECHANISM_PARAM_INVALID; |
+ break; |
+ } |
+ params = (CK_NSS_AEAD_PARAMS*) pMechanism->pParameter; |
+ context->multi = PR_FALSE; |
+ if (key_type != CKK_NSS_CHACHA20) { |
+ crv = CKR_KEY_TYPE_INCONSISTENT; |
+ break; |
+ } |
+ att = sftk_FindAttribute(key,CKA_VALUE); |
+ if (att == NULL) { |
+ crv = CKR_KEY_HANDLE_INVALID; |
+ break; |
+ } |
+ context->cipherInfo = ChaCha20Poly1305_CreateContext( |
+ (unsigned char*) att->attrib.pValue, att->attrib.ulValueLen, |
+ params->pIv, params->ulIvLen, params->pAAD, params->ulAADLen, |
+ params->ulTagBits); |
+ sftk_FreeAttribute(att); |
+ if (context->cipherInfo == NULL) { |
+ /* XXX map error code */ |
+ crv = CKR_HOST_MEMORY; |
+ break; |
+ } |
+ context->update = (SFTKCipher) (isEncrypt ? ChaCha20Poly1305_Seal : |
+ ChaCha20Poly1305_Open); |
+ context->destroy = (SFTKDestroy) ChaCha20Poly1305_DestroyContext; |
+ break; |
+ } |
+ |
case CKM_NETSCAPE_AES_KEY_WRAP_PAD: |
context->doPad = PR_TRUE; |
/* fall thru */ |
@@ -3272,6 +3305,10 @@ |
*key_type = CKK_AES; |
if (*key_length == 0) crv = CKR_TEMPLATE_INCOMPLETE; |
break; |
+ case CKM_NSS_CHACHA20_KEY_GEN: |
+ *key_type = CKK_NSS_CHACHA20; |
+ if (*key_length == 0) crv = CKR_TEMPLATE_INCOMPLETE; |
+ break; |
default: |
PORT_Assert(0); |
crv = CKR_MECHANISM_INVALID; |
@@ -3516,6 +3553,7 @@ |
case CKM_SEED_KEY_GEN: |
case CKM_CAMELLIA_KEY_GEN: |
case CKM_AES_KEY_GEN: |
+ case CKM_NSS_CHACHA20_KEY_GEN: |
#if NSS_SOFTOKEN_DOES_RC5 |
case CKM_RC5_KEY_GEN: |
#endif |