Skip to content

Commit 6a48d28

Browse files
committed
More support for CKO_DATA
1 parent 032586f commit 6a48d28

File tree

3 files changed

+241
-24
lines changed

3 files changed

+241
-24
lines changed

src/crypto.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,9 @@ static CK_ATTRIBUTE_TYPE secretKeyParams[] = {
109109

110110
/* Generic data attributes */
111111
static CK_ATTRIBUTE_TYPE genericDataParams[] = {
112-
CKA_VALUE_LEN,
113112
CKA_VALUE,
113+
CKA_APPLICATION,
114+
CKA_OBJECT_ID
114115
};
115116

116117
/* Count of generic data attributes */
@@ -604,8 +605,11 @@ static CK_RV SetAttributeValue(WP11_Session* session, WP11_Object* obj,
604605
if (attrs[i] == pTemplate[j].type) {
605606
attrsFound = 1;
606607
data[i] = (unsigned char*)pTemplate[j].pValue;
607-
if (data[i] == NULL)
608-
return CKR_ATTRIBUTE_VALUE_INVALID;
608+
if (data[i] == NULL) {
609+
/* For CKO_DATA, only CKA_VALUE is required */
610+
if (objClass != CKO_DATA || attrs[i] == CKA_VALUE)
611+
return CKR_ATTRIBUTE_VALUE_INVALID;
612+
}
609613
len[i] = (int)pTemplate[j].ulValueLen;
610614
break;
611615
}
@@ -666,6 +670,7 @@ static CK_RV SetAttributeValue(WP11_Session* session, WP11_Object* obj,
666670
/* Set remaining attributes - key specific attributes ignored. */
667671
for (i = 0; i < (int)ulCount; i++) {
668672
attr = &pTemplate[i];
673+
669674
/* Cannot change sensitive from true to false */
670675
if (attr->type == CKA_SENSITIVE) {
671676
rv = WP11_Object_GetAttr(obj, CKA_SENSITIVE, &getVar, &getVarLen);

src/internal.c

Lines changed: 200 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,15 @@ typedef struct WP11_Data {
176176
word32 len; /* Length of key data in bytes */
177177
} WP11_Data;
178178

179+
typedef struct WP11_GenericData {
180+
byte *data;
181+
word32 dataLen;
182+
byte *application;
183+
word32 applicationLen;
184+
byte *objectId; /* CKA_OBJECT_ID, a DER encoded ID */
185+
word32 objectIdLen;
186+
} WP11_GenericData;
187+
179188
/* Certificate */
180189
typedef struct WP11_Cert {
181190
byte *data; /* Certificate data */
@@ -214,7 +223,7 @@ struct WP11_Object {
214223
WP11_DhKey dhKey; /* DH parameters object */
215224
#endif
216225
WP11_Data symmKey; /* Symmetric key object */
217-
WP11_Data genericData; /* Generic data object */
226+
WP11_GenericData genericData; /* Generic data object */
218227
WP11_Cert cert; /* Certificate object */
219228
#ifdef WOLFPKCS11_NSS
220229
WP11_Trust trust; /* Trust object */
@@ -2209,8 +2218,8 @@ static void wp11_Object_Decode_Trust(WP11_Object* object)
22092218

22102219
static void wp11_Object_Decode_Data(WP11_Object* object)
22112220
{
2212-
XMEMCPY((unsigned char*)&object->data.genericData, object->keyData,
2213-
object->keyDataLen);
2221+
/* No longer needed since wp11_Object_Load_Data handles
2222+
* deserialization directly */
22142223
object->encoded = 0;
22152224
}
22162225

@@ -2281,16 +2290,65 @@ static int wp11_Object_Load_Data(WP11_Object* object, int tokenId, int objId)
22812290
{
22822291
int ret;
22832292
void* storage = NULL;
2293+
int tempLen;
22842294

22852295
/* Open access to data. */
22862296
ret = wp11_storage_open_readonly(WOLFPKCS11_STORE_DATA, tokenId, objId,
22872297
&storage);
22882298
if (ret == 0) {
2289-
/* Read data. */
2290-
ret = wp11_storage_read_alloc_array(storage, &object->keyData,
2291-
&object->keyDataLen);
2299+
/* Read data length and data. */
2300+
ret = wp11_storage_read_word32(storage,
2301+
&object->data.genericData.dataLen);
2302+
if (ret == 0 && object->data.genericData.dataLen > 0) {
2303+
tempLen = (int)object->data.genericData.dataLen;
2304+
ret = wp11_storage_read_alloc_array(storage,
2305+
&object->data.genericData.data,
2306+
&tempLen);
2307+
object->data.genericData.dataLen = (word32)tempLen;
2308+
}
2309+
else if (ret == 0) {
2310+
/* Ensure data is NULL when length is 0 */
2311+
object->data.genericData.data = NULL;
2312+
object->data.genericData.dataLen = 0;
2313+
}
2314+
2315+
/* Read application length and application. */
2316+
if (ret == 0) {
2317+
ret = wp11_storage_read_word32(storage,
2318+
&object->data.genericData.applicationLen);
2319+
}
2320+
if (ret == 0 && object->data.genericData.applicationLen > 0) {
2321+
tempLen = (int)object->data.genericData.applicationLen;
2322+
ret = wp11_storage_read_alloc_array(storage,
2323+
&object->data.genericData.application,
2324+
&tempLen);
2325+
object->data.genericData.applicationLen = (word32)tempLen;
2326+
}
2327+
else if (ret == 0) {
2328+
/* Ensure application is NULL when length is 0 */
2329+
object->data.genericData.application = NULL;
2330+
object->data.genericData.applicationLen = 0;
2331+
}
2332+
2333+
/* Read object ID length and object ID. */
2334+
if (ret == 0) {
2335+
ret = wp11_storage_read_word32(storage,
2336+
&object->data.genericData.objectIdLen);
2337+
}
2338+
if (ret == 0 && object->data.genericData.objectIdLen > 0) {
2339+
tempLen = (int)object->data.genericData.objectIdLen;
2340+
ret = wp11_storage_read_alloc_array(storage,
2341+
&object->data.genericData.objectId,
2342+
&tempLen);
2343+
object->data.genericData.objectIdLen = (word32)tempLen;
2344+
}
2345+
else if (ret == 0) {
2346+
/* Ensure objectId is NULL when length is 0 */
2347+
object->data.genericData.objectId = NULL;
2348+
object->data.genericData.objectIdLen = 0;
2349+
}
2350+
22922351
wp11_storage_close(storage);
2293-
wp11_Object_Decode_Data(object);
22942352
}
22952353

22962354
return ret;
@@ -2641,11 +2699,39 @@ static int wp11_Object_Store_Data(WP11_Object* object, int tokenId, int objId)
26412699

26422700
/* Open access to data. */
26432701
ret = wp11_storage_open(WOLFPKCS11_STORE_DATA, tokenId, objId,
2644-
sizeof(WP11_Data), &storage);
2702+
sizeof(WP11_GenericData), &storage);
26452703
if (ret == 0) {
2646-
/* Write data to storage. */
2647-
ret = wp11_storage_write_array(storage,
2648-
(unsigned char*)&object->data.genericData, sizeof(WP11_Data));
2704+
/* Write data length and data. */
2705+
ret = wp11_storage_write_word32(storage,
2706+
object->data.genericData.dataLen);
2707+
if (ret == 0 && object->data.genericData.dataLen > 0) {
2708+
ret = wp11_storage_write_array(storage,
2709+
object->data.genericData.data,
2710+
object->data.genericData.dataLen);
2711+
}
2712+
2713+
/* Write application length and application. */
2714+
if (ret == 0) {
2715+
ret = wp11_storage_write_word32(storage,
2716+
object->data.genericData.applicationLen);
2717+
}
2718+
if (ret == 0 && object->data.genericData.applicationLen > 0) {
2719+
ret = wp11_storage_write_array(storage,
2720+
object->data.genericData.application,
2721+
object->data.genericData.applicationLen);
2722+
}
2723+
2724+
/* Write object ID length and object ID. */
2725+
if (ret == 0) {
2726+
ret = wp11_storage_write_word32(storage,
2727+
object->data.genericData.objectIdLen);
2728+
}
2729+
if (ret == 0 && object->data.genericData.objectIdLen > 0) {
2730+
ret = wp11_storage_write_array(storage,
2731+
object->data.genericData.objectId,
2732+
object->data.genericData.objectIdLen);
2733+
}
2734+
26492735
wp11_storage_close(storage);
26502736
}
26512737

@@ -6668,6 +6754,11 @@ void WP11_Object_Free(WP11_Object* object)
66686754
XFREE(object->data.cert.data, NULL, DYNAMIC_TYPE_CERT);
66696755
certFreed = 1;
66706756
}
6757+
else if (object->objClass == CKO_DATA) {
6758+
XFREE(object->data.genericData.data, NULL, DYNAMIC_TYPE_CERT);
6759+
XFREE(object->data.genericData.application, NULL, DYNAMIC_TYPE_CERT);
6760+
XFREE(object->data.genericData.objectId, NULL, DYNAMIC_TYPE_CERT);
6761+
}
66716762
else {
66726763
#ifndef NO_RSA
66736764
if (object->type == CKK_RSA)
@@ -7165,13 +7256,74 @@ int WP11_Object_DataObject(WP11_Object* object, unsigned char** data,
71657256
if (object->onToken)
71667257
WP11_Lock_LockRW(object->lock);
71677258

7168-
if (data[1] == NULL || len[1] == 0 || len[1] > WP11_MAX_SYM_KEY_SZ)
7169-
ret = BAD_FUNC_ARG;
7170-
else if (data[1] != NULL) {
7171-
XMEMCPY(object->data.genericData.data, data[1], len[1]);
7172-
object->data.genericData.len = (word32)len[1];
7259+
if (data[0] != NULL && len[0] > 0) {
7260+
if (object->data.genericData.data != NULL) {
7261+
XFREE(object->data.genericData.data, NULL, DYNAMIC_TYPE_CERT);
7262+
}
7263+
object->data.genericData.data =
7264+
XMALLOC(len[0], NULL, DYNAMIC_TYPE_CERT);
7265+
if (object->data.genericData.data == NULL) {
7266+
ret = MEMORY_E;
7267+
}
7268+
else {
7269+
XMEMCPY(object->data.genericData.data, data[0], len[0]);
7270+
object->data.genericData.dataLen = (word32)len[0];
7271+
}
7272+
}
7273+
else if (data[0] == NULL) {
7274+
/* Clear data if not provided */
7275+
if (object->data.genericData.data != NULL) {
7276+
XFREE(object->data.genericData.data, NULL, DYNAMIC_TYPE_CERT);
7277+
object->data.genericData.data = NULL;
7278+
}
7279+
object->data.genericData.dataLen = 0;
7280+
}
7281+
7282+
if (ret == 0 && data[1] != NULL && len[1] > 0) {
7283+
if (object->data.genericData.application != NULL) {
7284+
XFREE(object->data.genericData.application, NULL, DYNAMIC_TYPE_CERT);
7285+
}
7286+
object->data.genericData.application =
7287+
XMALLOC(len[1], NULL, DYNAMIC_TYPE_CERT);
7288+
if (object->data.genericData.application == NULL) {
7289+
ret = MEMORY_E;
7290+
}
7291+
else {
7292+
XMEMCPY(object->data.genericData.application, data[1], len[1]);
7293+
object->data.genericData.applicationLen = (word32)len[1];
7294+
}
7295+
}
7296+
else if (ret == 0 && data[1] == NULL) {
7297+
/* Clear application if not provided */
7298+
if (object->data.genericData.application != NULL) {
7299+
XFREE(object->data.genericData.application, NULL, DYNAMIC_TYPE_CERT);
7300+
object->data.genericData.application = NULL;
7301+
}
7302+
object->data.genericData.applicationLen = 0;
71737303
}
71747304

7305+
if (ret == 0 && data[2] != NULL && len[2] > 0) {
7306+
if (object->data.genericData.objectId != NULL) {
7307+
XFREE(object->data.genericData.objectId, NULL, DYNAMIC_TYPE_CERT);
7308+
}
7309+
object->data.genericData.objectId =
7310+
XMALLOC(len[2], NULL, DYNAMIC_TYPE_CERT);
7311+
if (object->data.genericData.objectId == NULL) {
7312+
ret = MEMORY_E;
7313+
}
7314+
else {
7315+
XMEMCPY(object->data.genericData.objectId, data[2], len[2]);
7316+
object->data.genericData.objectIdLen = (word32)len[2];
7317+
}
7318+
}
7319+
else if (ret == 0 && data[2] == NULL) {
7320+
/* Clear object ID if not provided */
7321+
if (object->data.genericData.objectId != NULL) {
7322+
XFREE(object->data.genericData.objectId, NULL, DYNAMIC_TYPE_CERT);
7323+
object->data.genericData.objectId = NULL;
7324+
}
7325+
object->data.genericData.objectIdLen = 0;
7326+
}
71757327

71767328
if (object->onToken)
71777329
WP11_Lock_UnlockRW(object->lock);
@@ -7476,7 +7628,15 @@ static int GetDataAttr(WP11_Object* object, CK_ATTRIBUTE_TYPE type,
74767628
switch (type) {
74777629
case CKA_VALUE:
74787630
ret = GetData((byte*)object->data.genericData.data,
7479-
object->data.genericData.len, data, len);
7631+
object->data.genericData.dataLen, data, len);
7632+
break;
7633+
case CKA_APPLICATION:
7634+
ret = GetData((byte*)object->data.genericData.application,
7635+
object->data.genericData.applicationLen, data, len);
7636+
break;
7637+
case CKA_OBJECT_ID:
7638+
ret = GetData((byte*)object->data.genericData.objectId,
7639+
object->data.genericData.objectIdLen, data, len);
74807640
break;
74817641
default:
74827642
ret = NOT_AVAILABLE_E;
@@ -8026,7 +8186,13 @@ int WP11_Object_GetAttr(WP11_Object* object, CK_ATTRIBUTE_TYPE type, byte* data,
80268186
ret = GetBool(CK_TRUE, data, len);
80278187
break;
80288188
case CKA_APPLICATION:
8029-
/* Not available */
8189+
if (object->objClass == CKO_DATA) {
8190+
ret = GetDataAttr(object, type, data, len);
8191+
}
8192+
else {
8193+
/* Not available for other object types */
8194+
ret = NOT_AVAILABLE_E;
8195+
}
80308196
break;
80318197
case CKA_ID:
80328198
ret = GetData(object->keyId, object->keyIdLen, data, len);
@@ -8461,6 +8627,22 @@ int WP11_Object_SetAttr(WP11_Object* object, CK_ATTRIBUTE_TYPE type, byte* data,
84618627
break;
84628628
}
84638629
break;
8630+
case CKA_APPLICATION:
8631+
if (object->objClass == CKO_DATA) {
8632+
break; /* Handled in WP11_Object_DataObject */
8633+
}
8634+
else {
8635+
ret = BAD_FUNC_ARG;
8636+
}
8637+
break;
8638+
case CKA_OBJECT_ID:
8639+
if (object->objClass == CKO_DATA) {
8640+
break; /* Handled in WP11_Object_DataObject */
8641+
}
8642+
else {
8643+
ret = BAD_FUNC_ARG;
8644+
}
8645+
break;
84648646
#ifdef WOLFPKCS11_NSS
84658647
case CKA_CERT_SHA1_HASH:
84668648
case CKA_CERT_MD5_HASH:

0 commit comments

Comments
 (0)