@@ -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 */
180189typedef 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
22102219static 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