Skip to content

Commit 051d8b6

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 a3cb5a1 commit 051d8b6

File tree

1 file changed

+50
-81
lines changed

1 file changed

+50
-81
lines changed

src/internal.c

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

@@ -2421,61 +2429,30 @@ static int wp11_Object_Load_Data(WP11_Object* object, int tokenId, int objId)
24212429
ret = wp11_storage_open_readonly(WOLFPKCS11_STORE_DATA, tokenId, objId,
24222430
&storage);
24232431
if (ret == 0) {
2424-
/* Read data length and data. */
2425-
ret = wp11_storage_read_word32(storage,
2426-
&object->data.genericData.dataLen);
2427-
if (ret == 0 && object->data.genericData.dataLen > 0) {
2428-
tempLen = (int)object->data.genericData.dataLen;
2429-
ret = wp11_storage_read_alloc_array(storage,
2430-
&object->data.genericData.data,
2431-
&tempLen);
2432-
object->data.genericData.dataLen = (word32)tempLen;
2433-
}
2434-
else if (ret == 0) {
2435-
/* Ensure data is NULL when length is 0 */
2436-
object->data.genericData.data = NULL;
2437-
object->data.genericData.dataLen = 0;
2438-
}
2439-
2440-
/* Read application length and application. */
2441-
if (ret == 0) {
2442-
ret = wp11_storage_read_word32(storage,
2443-
&object->data.genericData.applicationLen);
2444-
}
2445-
if (ret == 0 && object->data.genericData.applicationLen > 0) {
2446-
tempLen = (int)object->data.genericData.applicationLen;
2447-
ret = wp11_storage_read_alloc_array(storage,
2448-
&object->data.genericData.application,
2449-
&tempLen);
2450-
object->data.genericData.applicationLen = (word32)tempLen;
2451-
}
2452-
else if (ret == 0) {
2453-
/* Ensure application is NULL when length is 0 */
2454-
object->data.genericData.application = NULL;
2455-
object->data.genericData.applicationLen = 0;
2456-
}
2432+
ret = wp11_storage_read_alloc_array(storage,
2433+
&object->data.genericData.data,
2434+
&tempLen);
2435+
object->data.genericData.dataLen = (word32)tempLen;
2436+
}
24572437

2458-
/* Read object ID length and object ID. */
2459-
if (ret == 0) {
2460-
ret = wp11_storage_read_word32(storage,
2461-
&object->data.genericData.objectIdLen);
2462-
}
2463-
if (ret == 0 && object->data.genericData.objectIdLen > 0) {
2464-
tempLen = (int)object->data.genericData.objectIdLen;
2465-
ret = wp11_storage_read_alloc_array(storage,
2466-
&object->data.genericData.objectId,
2467-
&tempLen);
2468-
object->data.genericData.objectIdLen = (word32)tempLen;
2469-
}
2470-
else if (ret == 0) {
2471-
/* Ensure objectId is NULL when length is 0 */
2472-
object->data.genericData.objectId = NULL;
2473-
object->data.genericData.objectIdLen = 0;
2474-
}
2438+
/* Read application length and application. */
2439+
if (ret == 0) {
2440+
ret = wp11_storage_read_alloc_array(storage,
2441+
&object->data.genericData.application,
2442+
&tempLen);
2443+
object->data.genericData.applicationLen = (word32)tempLen;
2444+
}
24752445

2476-
wp11_storage_close(storage);
2446+
/* Read object ID length and object ID. */
2447+
if (ret == 0) {
2448+
ret = wp11_storage_read_alloc_array(storage,
2449+
&object->data.genericData.objectId,
2450+
&tempLen);
2451+
object->data.genericData.objectIdLen = (word32)tempLen;
24772452
}
24782453

2454+
wp11_storage_close(storage);
2455+
24792456
return ret;
24802457
}
24812458

@@ -2946,44 +2923,36 @@ static int wp11_Object_Store_Data(WP11_Object* object, int tokenId, int objId)
29462923
int ret;
29472924
void* storage = NULL;
29482925

2926+
int variableSz = (object->data.genericData.dataLen +
2927+
object->data.genericData.applicationLen +
2928+
object->data.genericData.objectIdLen);
2929+
29492930
/* Open access to data. */
29502931
ret = wp11_storage_open(WOLFPKCS11_STORE_DATA, tokenId, objId,
2951-
sizeof(WP11_GenericData), &storage);
2932+
variableSz, &storage);
2933+
/* Write data length and data. */
29522934
if (ret == 0) {
2953-
/* Write data length and data. */
2954-
ret = wp11_storage_write_word32(storage,
2935+
ret = wp11_storage_write_array(storage,
2936+
object->data.genericData.data,
29552937
object->data.genericData.dataLen);
2956-
if (ret == 0 && object->data.genericData.dataLen > 0) {
2957-
ret = wp11_storage_write_array(storage,
2958-
object->data.genericData.data,
2959-
object->data.genericData.dataLen);
2960-
}
2938+
}
29612939

2962-
/* Write application length and application. */
2963-
if (ret == 0) {
2964-
ret = wp11_storage_write_word32(storage,
2965-
object->data.genericData.applicationLen);
2966-
}
2967-
if (ret == 0 && object->data.genericData.applicationLen > 0) {
2968-
ret = wp11_storage_write_array(storage,
2969-
object->data.genericData.application,
2970-
object->data.genericData.applicationLen);
2971-
}
2940+
/* Write application length and application. */
2941+
if (ret == 0) {
2942+
ret = wp11_storage_write_array(storage,
2943+
object->data.genericData.application,
2944+
object->data.genericData.applicationLen);
2945+
}
29722946

29732947
/* Write object ID length and object ID. */
2974-
if (ret == 0) {
2975-
ret = wp11_storage_write_word32(storage,
2976-
object->data.genericData.objectIdLen);
2977-
}
2978-
if (ret == 0 && object->data.genericData.objectIdLen > 0) {
2979-
ret = wp11_storage_write_array(storage,
2980-
object->data.genericData.objectId,
2981-
object->data.genericData.objectIdLen);
2982-
}
2983-
2984-
wp11_storage_close(storage);
2948+
if (ret == 0) {
2949+
ret = wp11_storage_write_array(storage,
2950+
object->data.genericData.objectId,
2951+
object->data.genericData.objectIdLen);
29852952
}
29862953

2954+
wp11_storage_close(storage);
2955+
29872956
return ret;
29882957
}
29892958

0 commit comments

Comments
 (0)