@@ -1288,6 +1288,30 @@ CK_RV C_EncryptInit(CK_SESSION_HANDLE hSession,
12881288 break ;
12891289 }
12901290 #endif
1291+
1292+ #ifdef HAVE_AESCCM
1293+ case CKM_AES_CCM : {
1294+ CK_CCM_PARAMS * params ;
1295+
1296+ if (type != CKK_AES )
1297+ return CKR_KEY_TYPE_INCONSISTENT ;
1298+ if (pMechanism -> pParameter == NULL )
1299+ return CKR_MECHANISM_PARAM_INVALID ;
1300+ if (pMechanism -> ulParameterLen != sizeof (CK_CCM_PARAMS ))
1301+ return CKR_MECHANISM_PARAM_INVALID ;
1302+
1303+ params = (CK_CCM_PARAMS * )pMechanism -> pParameter ;
1304+ ret = WP11_Session_SetCcmParams (session ,
1305+ (int )params -> ulDataLen ,
1306+ params -> pIv , (int )params -> ulIvLen ,
1307+ params -> pAAD , (int )params -> ulAADLen ,
1308+ (int )params -> ulMacLen );
1309+ if (ret != 0 )
1310+ return CKR_MECHANISM_PARAM_INVALID ;
1311+ init = WP11_INIT_AES_CCM_ENC ;
1312+ break ;
1313+ }
1314+ #endif
12911315#endif
12921316 default :
12931317 (void )type ;
@@ -1471,6 +1495,27 @@ CK_RV C_Encrypt(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData,
14711495 * pulEncryptedDataLen = encDataLen ;
14721496 break ;
14731497 #endif
1498+ #ifdef HAVE_AESCCM
1499+ case CKM_AES_CCM :
1500+ if (!WP11_Session_IsOpInitialized (session , WP11_INIT_AES_CCM_ENC ))
1501+ return CKR_OPERATION_NOT_INITIALIZED ;
1502+
1503+ encDataLen = (word32 )ulDataLen +
1504+ WP11_AesCcm_GetMacLen (session );
1505+ if (pEncryptedData == NULL ) {
1506+ * pulEncryptedDataLen = encDataLen ;
1507+ return CKR_OK ;
1508+ }
1509+ if (encDataLen > (word32 )* pulEncryptedDataLen )
1510+ return CKR_BUFFER_TOO_SMALL ;
1511+
1512+ ret = WP11_AesCcm_Encrypt (pData , (int )ulDataLen , pEncryptedData ,
1513+ & encDataLen , obj , session );
1514+ if (ret < 0 )
1515+ return CKR_FUNCTION_FAILED ;
1516+ * pulEncryptedDataLen = encDataLen ;
1517+ break ;
1518+ #endif
14741519#endif
14751520 default :
14761521 (void )ret ;
@@ -1858,6 +1903,29 @@ CK_RV C_DecryptInit(CK_SESSION_HANDLE hSession,
18581903 break ;
18591904 }
18601905 #endif
1906+ #ifdef HAVE_AESCCM
1907+ case CKM_AES_CCM : {
1908+ CK_CCM_PARAMS * params ;
1909+
1910+ if (type != CKK_AES )
1911+ return CKR_KEY_TYPE_INCONSISTENT ;
1912+ if (pMechanism -> pParameter == NULL )
1913+ return CKR_MECHANISM_PARAM_INVALID ;
1914+ if (pMechanism -> ulParameterLen != sizeof (CK_CCM_PARAMS ))
1915+ return CKR_MECHANISM_PARAM_INVALID ;
1916+
1917+ params = (CK_CCM_PARAMS * )pMechanism -> pParameter ;
1918+ ret = WP11_Session_SetCcmParams (session ,
1919+ (int )params -> ulDataLen ,
1920+ params -> pIv , (int )params -> ulIvLen ,
1921+ params -> pAAD , (int )params -> ulAADLen ,
1922+ (int )params -> ulMacLen );
1923+ if (ret != 0 )
1924+ return CKR_MECHANISM_PARAM_INVALID ;
1925+ init = WP11_INIT_AES_CCM_DEC ;
1926+ break ;
1927+ }
1928+ #endif
18611929#endif
18621930 default :
18631931 (void )type ;
@@ -2042,6 +2110,27 @@ CK_RV C_Decrypt(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pEncryptedData,
20422110 * pulDataLen = decDataLen ;
20432111 break ;
20442112 #endif
2113+ #ifdef HAVE_AESCCM
2114+ case CKM_AES_CCM :
2115+ if (!WP11_Session_IsOpInitialized (session , WP11_INIT_AES_CCM_DEC ))
2116+ return CKR_OPERATION_NOT_INITIALIZED ;
2117+
2118+ decDataLen = (word32 )ulEncryptedDataLen -
2119+ WP11_AesCcm_GetMacLen (session );
2120+ if (pData == NULL ) {
2121+ * pulDataLen = decDataLen ;
2122+ return CKR_OK ;
2123+ }
2124+ if (decDataLen > (word32 )* pulDataLen )
2125+ return CKR_BUFFER_TOO_SMALL ;
2126+
2127+ ret = WP11_AesCcm_Decrypt (pEncryptedData , (int )ulEncryptedDataLen ,
2128+ pData , & decDataLen , obj , session );
2129+ if (ret < 0 )
2130+ return CKR_FUNCTION_FAILED ;
2131+ * pulDataLen = decDataLen ;
2132+ break ;
2133+ #endif
20452134#endif
20462135 default :
20472136 (void )decDataLen ;
0 commit comments