Skip to content

Commit ffea847

Browse files
committed
Fix CKO_DATA storage for TPM
Length calculation was incorrect, causing an error. In addition, lengths for arrays were double-stored.
1 parent 92afbe5 commit ffea847

1 file changed

Lines changed: 50 additions & 81 deletions

File tree

src/internal.c

Lines changed: 50 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -938,6 +938,15 @@ static int wolfPKCS11_Store_GetMaxSize(int type, int variableSz)
938938
variableSz /* keyIdLen + labelLen + issuerLen + serialLen + subjectLen */
939939
;
940940
break;
941+
case WOLFPKCS11_STORE_DATA:
942+
maxSz =
943+
sizeof(word32) /* id */ +
944+
sizeof(word32) /* dataLen */ +
945+
sizeof(word32) /* applicationLen */ +
946+
sizeof(word32) /* objectIdLen */ +
947+
variableSz /* dataLen + applicationLen + objectIdLen */
948+
;
949+
break;
941950
case WOLFPKCS11_STORE_SYMMKEY:
942951
case WOLFPKCS11_STORE_RSAKEY_PRIV:
943952
case WOLFPKCS11_STORE_RSAKEY_PUB:
@@ -947,7 +956,6 @@ static int wolfPKCS11_Store_GetMaxSize(int type, int variableSz)
947956
case WOLFPKCS11_STORE_DHKEY_PUB:
948957
case WOLFPKCS11_STORE_CERT:
949958
case WOLFPKCS11_STORE_TRUST:
950-
case WOLFPKCS11_STORE_DATA:
951959
maxSz = sizeof(word32) + variableSz;
952960
break;
953961

@@ -2624,61 +2632,30 @@ static int wp11_Object_Load_Data(WP11_Object* object, int tokenId, int objId)
26242632
ret = wp11_storage_open_readonly(WOLFPKCS11_STORE_DATA, tokenId, objId,
26252633
&storage);
26262634
if (ret == 0) {
2627-
/* Read data length and data. */
2628-
ret = wp11_storage_read_word32(storage,
2629-
&object->data.genericData.dataLen);
2630-
if (ret == 0 && object->data.genericData.dataLen > 0) {
2631-
tempLen = (int)object->data.genericData.dataLen;
2632-
ret = wp11_storage_read_alloc_array(storage,
2633-
&object->data.genericData.data,
2634-
&tempLen);
2635-
object->data.genericData.dataLen = (word32)tempLen;
2636-
}
2637-
else if (ret == 0) {
2638-
/* Ensure data is NULL when length is 0 */
2639-
object->data.genericData.data = NULL;
2640-
object->data.genericData.dataLen = 0;
2641-
}
2642-
2643-
/* Read application length and application. */
2644-
if (ret == 0) {
2645-
ret = wp11_storage_read_word32(storage,
2646-
&object->data.genericData.applicationLen);
2647-
}
2648-
if (ret == 0 && object->data.genericData.applicationLen > 0) {
2649-
tempLen = (int)object->data.genericData.applicationLen;
2650-
ret = wp11_storage_read_alloc_array(storage,
2651-
&object->data.genericData.application,
2652-
&tempLen);
2653-
object->data.genericData.applicationLen = (word32)tempLen;
2654-
}
2655-
else if (ret == 0) {
2656-
/* Ensure application is NULL when length is 0 */
2657-
object->data.genericData.application = NULL;
2658-
object->data.genericData.applicationLen = 0;
2659-
}
2635+
ret = wp11_storage_read_alloc_array(storage,
2636+
&object->data.genericData.data,
2637+
&tempLen);
2638+
object->data.genericData.dataLen = (word32)tempLen;
2639+
}
26602640

2661-
/* Read object ID length and object ID. */
2662-
if (ret == 0) {
2663-
ret = wp11_storage_read_word32(storage,
2664-
&object->data.genericData.objectIdLen);
2665-
}
2666-
if (ret == 0 && object->data.genericData.objectIdLen > 0) {
2667-
tempLen = (int)object->data.genericData.objectIdLen;
2668-
ret = wp11_storage_read_alloc_array(storage,
2669-
&object->data.genericData.objectId,
2670-
&tempLen);
2671-
object->data.genericData.objectIdLen = (word32)tempLen;
2672-
}
2673-
else if (ret == 0) {
2674-
/* Ensure objectId is NULL when length is 0 */
2675-
object->data.genericData.objectId = NULL;
2676-
object->data.genericData.objectIdLen = 0;
2677-
}
2641+
/* Read application length and application. */
2642+
if (ret == 0) {
2643+
ret = wp11_storage_read_alloc_array(storage,
2644+
&object->data.genericData.application,
2645+
&tempLen);
2646+
object->data.genericData.applicationLen = (word32)tempLen;
2647+
}
26782648

2679-
wp11_storage_close(storage);
2649+
/* Read object ID length and object ID. */
2650+
if (ret == 0) {
2651+
ret = wp11_storage_read_alloc_array(storage,
2652+
&object->data.genericData.objectId,
2653+
&tempLen);
2654+
object->data.genericData.objectIdLen = (word32)tempLen;
26802655
}
26812656

2657+
wp11_storage_close(storage);
2658+
26822659
return ret;
26832660
}
26842661

@@ -3164,44 +3141,36 @@ static int wp11_Object_Store_Data(WP11_Object* object, int tokenId, int objId)
31643141
int ret;
31653142
void* storage = NULL;
31663143

3144+
int variableSz = (object->data.genericData.dataLen +
3145+
object->data.genericData.applicationLen +
3146+
object->data.genericData.objectIdLen);
3147+
31673148
/* Open access to data. */
31683149
ret = wp11_storage_open(WOLFPKCS11_STORE_DATA, tokenId, objId,
3169-
sizeof(WP11_GenericData), &storage);
3150+
variableSz, &storage);
3151+
/* Write data length and data. */
31703152
if (ret == 0) {
3171-
/* Write data length and data. */
3172-
ret = wp11_storage_write_word32(storage,
3153+
ret = wp11_storage_write_array(storage,
3154+
object->data.genericData.data,
31733155
object->data.genericData.dataLen);
3174-
if (ret == 0 && object->data.genericData.dataLen > 0) {
3175-
ret = wp11_storage_write_array(storage,
3176-
object->data.genericData.data,
3177-
object->data.genericData.dataLen);
3178-
}
3156+
}
31793157

3180-
/* Write application length and application. */
3181-
if (ret == 0) {
3182-
ret = wp11_storage_write_word32(storage,
3183-
object->data.genericData.applicationLen);
3184-
}
3185-
if (ret == 0 && object->data.genericData.applicationLen > 0) {
3186-
ret = wp11_storage_write_array(storage,
3187-
object->data.genericData.application,
3188-
object->data.genericData.applicationLen);
3189-
}
3158+
/* Write application length and application. */
3159+
if (ret == 0) {
3160+
ret = wp11_storage_write_array(storage,
3161+
object->data.genericData.application,
3162+
object->data.genericData.applicationLen);
3163+
}
31903164

31913165
/* Write object ID length and object ID. */
3192-
if (ret == 0) {
3193-
ret = wp11_storage_write_word32(storage,
3194-
object->data.genericData.objectIdLen);
3195-
}
3196-
if (ret == 0 && object->data.genericData.objectIdLen > 0) {
3197-
ret = wp11_storage_write_array(storage,
3198-
object->data.genericData.objectId,
3199-
object->data.genericData.objectIdLen);
3200-
}
3201-
3202-
wp11_storage_close(storage);
3166+
if (ret == 0) {
3167+
ret = wp11_storage_write_array(storage,
3168+
object->data.genericData.objectId,
3169+
object->data.genericData.objectIdLen);
32033170
}
32043171

3172+
wp11_storage_close(storage);
3173+
32053174
return ret;
32063175
}
32073176

0 commit comments

Comments
 (0)