Skip to content

Commit 3543f30

Browse files
authored
Merge pull request #168 from LinuxJedi/f-fixes
Fix bugs found with static analysis
2 parents a1c6259 + 281c0a2 commit 3543f30

7 files changed

Lines changed: 554 additions & 14 deletions

File tree

src/crypto.c

Lines changed: 42 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -736,6 +736,17 @@ static CK_RV SetAttributeValue(WP11_Session* session, WP11_Object* obj,
736736
if ((getVar == CK_TRUE) && (*(CK_BBOOL*)attr->pValue == CK_FALSE))
737737
return CKR_ATTRIBUTE_READ_ONLY;
738738
}
739+
/* Cannot change extractable from false to true */
740+
if (!newObject && attr->type == CKA_EXTRACTABLE) {
741+
getVarLen = sizeof(getVar);
742+
rv = WP11_Object_GetAttr(obj, CKA_EXTRACTABLE, &getVar,
743+
&getVarLen);
744+
if (rv != CKR_OK)
745+
return rv;
746+
747+
if ((getVar == CK_FALSE) && (*(CK_BBOOL*)attr->pValue == CK_TRUE))
748+
return CKR_ATTRIBUTE_READ_ONLY;
749+
}
739750
ret = WP11_Object_SetAttr(obj, attr->type, (byte*)attr->pValue,
740751
attr->ulValueLen);
741752
if (ret == MEMORY_E)
@@ -779,15 +790,21 @@ static CK_RV NewObject(WP11_Session* session, CK_KEY_TYPE keyType,
779790
return CKR_FUNCTION_FAILED;
780791

781792
ret = WP11_Object_SetClass(obj, keyClass);
782-
if (ret != 0)
793+
if (ret != 0) {
794+
WP11_Object_Free(obj);
783795
return CKR_FUNCTION_FAILED;
796+
}
784797

785798
/* Now that object class is set, allocate type-specific data */
786799
ret = wp11_Object_AllocateTypeData(obj);
787-
if (ret == MEMORY_E)
800+
if (ret == MEMORY_E) {
801+
WP11_Object_Free(obj);
788802
return CKR_DEVICE_MEMORY;
789-
if (ret != 0)
803+
}
804+
if (ret != 0) {
805+
WP11_Object_Free(obj);
790806
return CKR_FUNCTION_FAILED;
807+
}
791808

792809
rv = SetAttributeValue(session, obj, pTemplate, ulCount, CK_TRUE);
793810
if (rv != CKR_OK) {
@@ -1238,15 +1255,21 @@ CK_RV C_CopyObject(CK_SESSION_HANDLE hSession, CK_OBJECT_HANDLE hObject,
12381255

12391256
/* Set the object class from the original object */
12401257
ret = WP11_Object_SetClass(newObj, WP11_Object_GetClass(obj));
1241-
if (ret != 0)
1258+
if (ret != 0) {
1259+
WP11_Object_Free(newObj);
12421260
return CKR_FUNCTION_FAILED;
1261+
}
12431262

12441263
/* Now that object class is set, allocate type-specific data */
12451264
ret = wp11_Object_AllocateTypeData(newObj);
1246-
if (ret == MEMORY_E)
1265+
if (ret == MEMORY_E) {
1266+
WP11_Object_Free(newObj);
12471267
return CKR_DEVICE_MEMORY;
1248-
if (ret != 0)
1268+
}
1269+
if (ret != 0) {
1270+
WP11_Object_Free(newObj);
12491271
return CKR_FUNCTION_FAILED;
1272+
}
12501273

12511274
/* copy all the attributes from the original object to the new object */
12521275
rv = WP11_Object_Copy(obj, newObj);
@@ -1605,7 +1628,7 @@ CK_RV C_FindObjectsInit(CK_SESSION_HANDLE hSession,
16051628
WOLFPKCS11_LEAVE("C_FindObjectsInit", rv);
16061629
return rv;
16071630
}
1608-
if (pTemplate == NULL) {
1631+
if (pTemplate == NULL && ulCount != 0) {
16091632
rv = CKR_ARGUMENTS_BAD;
16101633
WOLFPKCS11_LEAVE("C_FindObjectsInit", rv);
16111634
return rv;
@@ -7563,15 +7586,22 @@ static int SetKeyExtract(WP11_Session* session, byte* ptr, CK_ULONG length,
75637586
secretKeyData[1] = ptr + (length - symmKeyLen);
75647587
secretKeyLen[1] = symmKeyLen;
75657588
ret = WP11_Object_SetSecretKey(secret, secretKeyData, secretKeyLen);
7566-
if (ret != CKR_OK)
7589+
if (ret != CKR_OK) {
7590+
WP11_Object_Free(secret);
75677591
return CKR_FUNCTION_FAILED;
7592+
}
75687593
ret = (int)AddObject(session, secret, pTemplate, ulAttributeCount,
75697594
handle);
75707595
if (ret != CKR_OK) {
7596+
WP11_Object_Free(secret);
75717597
return ret;
75727598
}
75737599
}
7574-
if ((ret == 0) && (isMac)) {
7600+
else {
7601+
WP11_Object_Free(secret);
7602+
return ret;
7603+
}
7604+
if (isMac) {
75757605
ret = WP11_Object_SetAttr(secret, CKA_KEY_TYPE, (byte*)&keyType,
75767606
sizeof(keyType));
75777607
if (ret != CKR_OK)
@@ -8004,8 +8034,10 @@ CK_RV C_DeriveKey(CK_SESSION_HANDLE hSession,
80048034
secretKeyLen[1] = symmKeyLen;
80058035
ret = WP11_Object_SetSecretKey(obj, secretKeyData,
80068036
secretKeyLen);
8007-
if (ret != 0)
8037+
if (ret != 0) {
8038+
WP11_Object_Free(obj);
80088039
rv = CKR_FUNCTION_FAILED;
8040+
}
80098041
if (ret == 0) {
80108042
rv = AddObject(session, obj, pTemplate,
80118043
ulAttributeCount, phKey);

src/internal.c

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2876,6 +2876,7 @@ static int wp11_EncryptData(byte* out, byte* data, int len, byte* key,
28762876
ret = wc_AesGcmEncrypt(&aes, out, data, len, iv, ivSz, out + len,
28772877
AES_BLOCK_SIZE, NULL, 0);
28782878
}
2879+
wc_AesFree(&aes);
28792880

28802881
return ret;
28812882
}
@@ -2910,6 +2911,7 @@ static int wp11_DecryptData(byte* out, byte* data, int len, byte* key,
29102911
ret = wc_AesGcmDecrypt(&aes, out, data, len, iv, ivSz, data + len,
29112912
AES_BLOCK_SIZE, NULL, 0);
29122913
}
2914+
wc_AesFree(&aes);
29132915

29142916
return ret;
29152917
}
@@ -7335,6 +7337,17 @@ WP11_Slot* WP11_Session_GetSlot(WP11_Session* session)
73357337
return session->slot;
73367338
}
73377339

7340+
/**
7341+
* Get the slot id associated with the session.
7342+
*
7343+
* @param session [in] Session object.
7344+
* @return Slot id.
7345+
*/
7346+
CK_SLOT_ID WP11_Session_GetSlotId(WP11_Session* session)
7347+
{
7348+
return session->slotId;
7349+
}
7350+
73387351
/**
73397352
* Get the mechanism associated with the session.
73407353
*
@@ -9863,10 +9876,11 @@ static int GetSha1CheckValue(const byte* dataIn, int inLen, byte* dataOut,
98639876
}
98649877

98659878
ret = wc_Hash(WC_HASH_TYPE_SHA, dataIn, inLen, hash, WC_SHA_DIGEST_SIZE);
9866-
if (ret == 0) {
9867-
XMEMCPY(dataOut, hash, PKCS11_CHECK_VALUE_SIZE);
9868-
*outLen = PKCS11_CHECK_VALUE_SIZE;
9879+
if (ret != 0) {
9880+
return CKR_FUNCTION_FAILED;
98699881
}
9882+
XMEMCPY(dataOut, hash, PKCS11_CHECK_VALUE_SIZE);
9883+
*outLen = PKCS11_CHECK_VALUE_SIZE;
98709884

98719885
return CKR_OK;
98729886
}

src/slot.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -576,7 +576,7 @@ static CK_MECHANISM_INFO rsaOaepMechInfo = {
576576
#ifdef WC_RSA_PSS
577577
/* Info on RSA PKCS#1 PSS mechanism. */
578578
static CK_MECHANISM_INFO rsaPssMechInfo = {
579-
256, 521, CKF_SIGN | CKF_VERIFY
579+
1024, 4096, CKF_SIGN | CKF_VERIFY
580580
};
581581
#endif
582582
#ifndef NO_SHA256
@@ -1667,6 +1667,7 @@ CK_RV C_GetSessionInfo(CK_SESSION_HANDLE hSession,
16671667
return rv;
16681668
}
16691669

1670+
pInfo->slotID = WP11_Session_GetSlotId(session);
16701671
pInfo->state = WP11_Session_GetState(session);
16711672
pInfo->flags = CKF_SERIAL_SESSION;
16721673
if (WP11_Session_IsRW(session))

0 commit comments

Comments
 (0)