@@ -6644,7 +6644,7 @@ CK_RV C_DigestEncryptUpdate(CK_SESSION_HANDLE hSession,
66446644
66456645 (void )pEncryptedPart ;
66466646
6647- rv = CKR_OPERATION_NOT_INITIALIZED ;
6647+ rv = CKR_FUNCTION_NOT_SUPPORTED ;
66486648 WOLFPKCS11_LEAVE ("C_DigestEncryptUpdate" , rv );
66496649 return rv ;
66506650}
@@ -6700,7 +6700,7 @@ CK_RV C_DecryptDigestUpdate(CK_SESSION_HANDLE hSession,
67006700
67016701 (void )pPart ;
67026702
6703- rv = CKR_OPERATION_NOT_INITIALIZED ;
6703+ rv = CKR_FUNCTION_NOT_SUPPORTED ;
67046704 WOLFPKCS11_LEAVE ("C_DecryptDigestUpdate" , rv );
67056705 return rv ;
67066706}
@@ -6756,7 +6756,7 @@ CK_RV C_SignEncryptUpdate(CK_SESSION_HANDLE hSession,
67566756
67576757 (void )pEncryptedPart ;
67586758
6759- rv = CKR_OPERATION_NOT_INITIALIZED ;
6759+ rv = CKR_FUNCTION_NOT_SUPPORTED ;
67606760 WOLFPKCS11_LEAVE ("C_SignEncryptUpdate" , rv );
67616761 return rv ;
67626762}
@@ -6812,7 +6812,7 @@ CK_RV C_DecryptVerifyUpdate(CK_SESSION_HANDLE hSession,
68126812
68136813 (void )pPart ;
68146814
6815- rv = CKR_OPERATION_NOT_INITIALIZED ;
6815+ rv = CKR_FUNCTION_NOT_SUPPORTED ;
68166816 WOLFPKCS11_LEAVE ("C_DecryptVerifyUpdate" , rv );
68176817 return rv ;
68186818}
@@ -6870,6 +6870,24 @@ CK_RV C_GenerateKey(CK_SESSION_HANDLE hSession,
68706870 WOLFPKCS11_LEAVE ("C_GenerateKey" , rv );
68716871 return rv ;
68726872 }
6873+ /* Only require R/W session for token objects */
6874+ if (!WP11_Session_IsRW (session )) {
6875+ CK_ATTRIBUTE * tokenAttr = NULL ;
6876+ FindAttributeType (pTemplate , ulCount , CKA_TOKEN , & tokenAttr );
6877+ if (tokenAttr != NULL ) {
6878+ if (tokenAttr -> pValue == NULL ||
6879+ tokenAttr -> ulValueLen != sizeof (CK_BBOOL )) {
6880+ rv = CKR_ATTRIBUTE_VALUE_INVALID ;
6881+ WOLFPKCS11_LEAVE ("C_GenerateKey" , rv );
6882+ return rv ;
6883+ }
6884+ if (* (CK_BBOOL * )tokenAttr -> pValue == CK_TRUE ) {
6885+ rv = CKR_SESSION_READ_ONLY ;
6886+ WOLFPKCS11_LEAVE ("C_GenerateKey" , rv );
6887+ return rv ;
6888+ }
6889+ }
6890+ }
68736891
68746892 switch (pMechanism -> mechanism ) {
68756893#ifndef NO_AES
@@ -7287,6 +7305,32 @@ CK_RV C_GenerateKeyPair(CK_SESSION_HANDLE hSession,
72877305 WOLFPKCS11_LEAVE ("C_GenerateKeyPair" , rv );
72887306 return rv ;
72897307 }
7308+ /* Only require R/W session for token objects. Each template must be
7309+ * inspected independently — a public template with CKA_TOKEN=FALSE must
7310+ * not mask a private template requesting CKA_TOKEN=TRUE. */
7311+ if (!WP11_Session_IsRW (session )) {
7312+ CK_ATTRIBUTE_PTR tpls [2 ] = { pPublicKeyTemplate , pPrivateKeyTemplate };
7313+ CK_ULONG counts [2 ] = { ulPublicKeyAttributeCount ,
7314+ ulPrivateKeyAttributeCount };
7315+ int i ;
7316+ for (i = 0 ; i < 2 ; i ++ ) {
7317+ CK_ATTRIBUTE * tokenAttr = NULL ;
7318+ FindAttributeType (tpls [i ], counts [i ], CKA_TOKEN , & tokenAttr );
7319+ if (tokenAttr == NULL )
7320+ continue ;
7321+ if (tokenAttr -> pValue == NULL ||
7322+ tokenAttr -> ulValueLen != sizeof (CK_BBOOL )) {
7323+ rv = CKR_ATTRIBUTE_VALUE_INVALID ;
7324+ WOLFPKCS11_LEAVE ("C_GenerateKeyPair" , rv );
7325+ return rv ;
7326+ }
7327+ if (* (CK_BBOOL * )tokenAttr -> pValue == CK_TRUE ) {
7328+ rv = CKR_SESSION_READ_ONLY ;
7329+ WOLFPKCS11_LEAVE ("C_GenerateKeyPair" , rv );
7330+ return rv ;
7331+ }
7332+ }
7333+ }
72907334
72917335 switch (pMechanism -> mechanism ) {
72927336#if !defined(NO_RSA ) && defined(WOLFSSL_KEY_GEN )
@@ -8308,6 +8352,24 @@ CK_RV C_DeriveKey(CK_SESSION_HANDLE hSession,
83088352 WOLFPKCS11_LEAVE ("C_DeriveKey" , rv );
83098353 return rv ;
83108354 }
8355+ /* Only require R/W session for token objects */
8356+ if (!WP11_Session_IsRW (session )) {
8357+ CK_ATTRIBUTE * tokenAttr = NULL ;
8358+ FindAttributeType (pTemplate , ulAttributeCount , CKA_TOKEN , & tokenAttr );
8359+ if (tokenAttr != NULL ) {
8360+ if (tokenAttr -> pValue == NULL ||
8361+ tokenAttr -> ulValueLen != sizeof (CK_BBOOL )) {
8362+ rv = CKR_ATTRIBUTE_VALUE_INVALID ;
8363+ WOLFPKCS11_LEAVE ("C_DeriveKey" , rv );
8364+ return rv ;
8365+ }
8366+ if (* (CK_BBOOL * )tokenAttr -> pValue == CK_TRUE ) {
8367+ rv = CKR_SESSION_READ_ONLY ;
8368+ WOLFPKCS11_LEAVE ("C_DeriveKey" , rv );
8369+ return rv ;
8370+ }
8371+ }
8372+ }
83118373
83128374 ret = WP11_Object_Find (session , hBaseKey , & obj );
83138375 if (ret != 0 )
0 commit comments