Skip to content

Commit 1b61bb0

Browse files
authored
Added support for AES CBC Key Unwrap (#871)
1 parent c274be2 commit 1b61bb0

2 files changed

Lines changed: 50 additions & 7 deletions

File tree

src/lib/SoftHSM.cpp

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1212,7 +1212,7 @@ CK_RV SoftHSM::C_GetMechanismInfo(CK_SLOT_ID slotID, CK_MECHANISM_TYPE type, CK_
12121212
pInfo->flags = CKF_UNWRAP | CKF_WRAP;
12131213
/* FALLTHROUGH */
12141214
case CKM_AES_CBC:
1215-
pInfo->flags |= CKF_WRAP;
1215+
pInfo->flags |= CKF_WRAP | CKF_UNWRAP;
12161216
/* FALLTHROUGH */
12171217
case CKM_AES_ECB:
12181218
case CKM_AES_CTR:
@@ -6618,6 +6618,7 @@ CK_RV SoftHSM::WrapKeySym
66186618
break;
66196619
#endif
66206620
case CKM_AES_CBC:
6621+
blocksize = 16;
66216622
algo = SymAlgo::AES;
66226623
break;
66236624

@@ -7219,6 +7220,7 @@ CK_RV SoftHSM::UnwrapKeySym
72197220
mode = SymWrap::AES_KEYWRAP_PAD;
72207221
break;
72217222
#endif
7223+
case CKM_AES_CBC:
72227224
case CKM_AES_CBC_PAD:
72237225
algo = SymAlgo::AES;
72247226
blocksize = 16;
@@ -7251,9 +7253,36 @@ CK_RV SoftHSM::UnwrapKeySym
72517253
ByteString iv;
72527254
ByteString decryptedFinal;
72537255
CK_RV rv = CKR_OK;
7254-
7256+
72557257
switch(pMechanism->mechanism) {
72567258

7259+
case CKM_AES_CBC:
7260+
iv.resize(blocksize);
7261+
memcpy(&iv[0], pMechanism->pParameter, blocksize);
7262+
7263+
if (!cipher->decryptInit(unwrappingkey, SymMode::CBC, iv, false))
7264+
{
7265+
cipher->recycleKey(unwrappingkey);
7266+
CryptoFactory::i()->recycleSymmetricAlgorithm(cipher);
7267+
return CKR_MECHANISM_INVALID;
7268+
}
7269+
if (!cipher->decryptUpdate(wrapped, keydata))
7270+
{
7271+
cipher->recycleKey(unwrappingkey);
7272+
CryptoFactory::i()->recycleSymmetricAlgorithm(cipher);
7273+
return CKR_GENERAL_ERROR;
7274+
}
7275+
// Finalize decryption
7276+
if (!cipher->decryptFinal(decryptedFinal))
7277+
{
7278+
cipher->recycleKey(unwrappingkey);
7279+
CryptoFactory::i()->recycleSymmetricAlgorithm(cipher);
7280+
return CKR_GENERAL_ERROR;
7281+
}
7282+
keydata += decryptedFinal;
7283+
// No unpadding for CKM_AES_CBC - returns raw decrypted data
7284+
break;
7285+
72577286
case CKM_AES_CBC_PAD:
72587287
case CKM_DES3_CBC_PAD:
72597288
iv.resize(blocksize);
@@ -7565,6 +7594,7 @@ CK_RV SoftHSM::C_UnwrapKey
75657594
return rv;
75667595
break;
75677596

7597+
case CKM_AES_CBC:
75687598
case CKM_AES_CBC_PAD:
75697599
// TODO check block length
75707600
if (pMechanism->pParameter == NULL_PTR ||

src/lib/test/SymmetricAlgorithmTests.cpp

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1099,7 +1099,7 @@ void SymmetricAlgorithmTests::aesWrapUnwrapGeneric(CK_MECHANISM_TYPE mechanismTy
10991099

11001100
CK_RV rv;
11011101
CK_BYTE ivPtr[16];
1102-
if( mechanismType == CKM_AES_CBC_PAD ) {
1102+
if( mechanismType == CKM_AES_CBC_PAD || mechanismType == CKM_AES_CBC ) {
11031103
rv = CRYPTOKI_F_PTR( C_GenerateRandom(hSession, ivPtr, sizeof ivPtr) );
11041104
CPPUNIT_ASSERT(rv == CKR_OK);
11051105
mechanism.pParameter = ivPtr;
@@ -1148,7 +1148,12 @@ void SymmetricAlgorithmTests::aesWrapUnwrapGeneric(CK_MECHANISM_TYPE mechanismTy
11481148
CPPUNIT_ASSERT(rv == CKR_OK);
11491149

11501150
auto wrapOverhead = [mechanismType]() {
1151-
return (mechanismType == CKM_AES_KEY_WRAP || mechanismType == CKM_AES_KEY_WRAP_PAD) ? 8 : 16;
1151+
if (mechanismType == CKM_AES_KEY_WRAP || mechanismType == CKM_AES_KEY_WRAP_PAD)
1152+
return 8;
1153+
else if (mechanismType == CKM_AES_CBC)
1154+
return 0; // No padding overhead for CKM_AES_CBC
1155+
else
1156+
return 16; // CKM_AES_CBC_PAD adds padding
11521157
};
11531158
CPPUNIT_ASSERT(wrappedLen == rndKeyLen + wrapOverhead() );
11541159

@@ -1199,7 +1204,7 @@ void SymmetricAlgorithmTests::aesWrapUnwrapNonModifiableGeneric(CK_MECHANISM_TYP
11991204

12001205
CK_RV rv;
12011206
CK_BYTE ivPtr[16];
1202-
if( mechanismType == CKM_AES_CBC_PAD ) {
1207+
if( mechanismType == CKM_AES_CBC_PAD || mechanismType == CKM_AES_CBC ) {
12031208
rv = CRYPTOKI_F_PTR( C_GenerateRandom(hSession, ivPtr, sizeof ivPtr) );
12041209
CPPUNIT_ASSERT(rv == CKR_OK);
12051210
mechanism.pParameter = ivPtr;
@@ -1248,7 +1253,12 @@ void SymmetricAlgorithmTests::aesWrapUnwrapNonModifiableGeneric(CK_MECHANISM_TYP
12481253
CPPUNIT_ASSERT(rv == CKR_OK);
12491254

12501255
auto wrapOverhead = [mechanismType]() {
1251-
return (mechanismType == CKM_AES_KEY_WRAP || mechanismType == CKM_AES_KEY_WRAP_PAD) ? 8 : 16;
1256+
if (mechanismType == CKM_AES_KEY_WRAP || mechanismType == CKM_AES_KEY_WRAP_PAD)
1257+
return 8;
1258+
else if (mechanismType == CKM_AES_CBC)
1259+
return 0; // No padding overhead for CKM_AES_CBC
1260+
else
1261+
return 16; // CKM_AES_CBC_PAD adds padding
12521262
};
12531263
CPPUNIT_ASSERT(wrappedLen == rndKeyLen + wrapOverhead() );
12541264

@@ -1322,13 +1332,14 @@ void SymmetricAlgorithmTests::wrapUnwrapRsa(CK_MECHANISM_TYPE mechanismType, CK_
13221332

13231333
CK_BYTE ivPtr[16];
13241334
switch(mechanismType) {
1335+
case CKM_AES_CBC:
13251336
case CKM_AES_CBC_PAD:
13261337
case CKM_DES_CBC_PAD:
13271338
case CKM_DES3_CBC_PAD:
13281339
rv = CRYPTOKI_F_PTR( C_GenerateRandom(hSession, ivPtr, sizeof ivPtr) );
13291340
CPPUNIT_ASSERT(rv == CKR_OK);
13301341
mechanism.pParameter = ivPtr;
1331-
mechanism.ulParameterLen = mechanismType == CKM_AES_CBC_PAD ? 16 : 8;
1342+
mechanism.ulParameterLen = (mechanismType == CKM_AES_CBC_PAD || mechanismType == CKM_AES_CBC) ? 16 : 8;
13321343
// falls through
13331344
}
13341345

@@ -1756,8 +1767,10 @@ void SymmetricAlgorithmTests::testAesWrapUnwrap()
17561767

17571768
aesWrapUnwrapGeneric(CKM_AES_KEY_WRAP, hSession, hKey);
17581769
aesWrapUnwrapGeneric(CKM_AES_CBC_PAD, hSession, hKey);
1770+
aesWrapUnwrapGeneric(CKM_AES_CBC, hSession, hKey);
17591771
aesWrapUnwrapNonModifiableGeneric(CKM_AES_KEY_WRAP, hSession, hKey);
17601772
aesWrapUnwrapNonModifiableGeneric(CKM_AES_CBC_PAD, hSession, hKey);
1773+
aesWrapUnwrapNonModifiableGeneric(CKM_AES_CBC, hSession, hKey);
17611774
aesWrapUnwrapRsa(CKM_AES_KEY_WRAP, hSession, hKey);
17621775
aesWrapUnwrapRsa(CKM_AES_CBC_PAD, hSession, hKey);
17631776

0 commit comments

Comments
 (0)