@@ -7012,11 +7012,20 @@ int WP11_Slot_CheckSOPin(WP11_Slot* slot, char* pin, int pinLen)
70127012
70137013 if (token -> state != WP11_TOKEN_STATE_INITIALIZED )
70147014 ret = PIN_NOT_SET_E ;
7015- /* NSS PK11_InitPin tries to login with an empty pin before setting the pin.
7016- * This is effectively a public access, so should be OK.
7015+ /* When the SO PIN has not been set, reject any PIN check; otherwise an
7016+ * empty PIN would constant-compare equal to the unset zero-length
7017+ * stored PIN and grant SO authentication. NSS's PK11_InitPin bootstraps
7018+ * a fresh database by calling C_Login(CKU_SO, "", 0) before any SO PIN
7019+ * exists and relies on that probe succeeding, so for NSS builds the
7020+ * empty-PIN path is left intact and only non-empty PINs are rejected.
70177021 */
7022+ #ifdef WOLFPKCS11_NSS
70187023 if (!(token -> tokenFlags & WP11_TOKEN_FLAG_SO_PIN_SET ) && pinLen > 0 )
70197024 ret = PIN_NOT_SET_E ;
7025+ #else
7026+ if (!(token -> tokenFlags & WP11_TOKEN_FLAG_SO_PIN_SET ))
7027+ ret = PIN_NOT_SET_E ;
7028+ #endif
70207029
70217030 if (ret == 0 ) {
70227031 WP11_Lock_UnlockRO (& slot -> lock );
@@ -8941,6 +8950,32 @@ CK_OBJECT_CLASS WP11_Object_GetClass(WP11_Object* object)
89418950 return object -> objClass ;
89428951}
89438952
8953+ /**
8954+ * Check whether the object is copyable.
8955+ *
8956+ * Reads the underlying WP11_FLAG_NOT_COPYABLE bit directly so the result is
8957+ * not affected by the WOLFPKCS11_LEGACY_COPYABLE_FALSE_DEFAULT macro that
8958+ * controls the C_GetAttributeValue view.
8959+ *
8960+ * @param object [in] Object object.
8961+ * @return 1 when copyable, 0 when not.
8962+ */
8963+ int WP11_Object_IsCopyable (WP11_Object * object )
8964+ {
8965+ return (object -> opFlag & WP11_FLAG_NOT_COPYABLE ) == 0 ;
8966+ }
8967+
8968+ /**
8969+ * Check whether the object is destroyable.
8970+ *
8971+ * @param object [in] Object object.
8972+ * @return 1 when destroyable, 0 when not.
8973+ */
8974+ int WP11_Object_IsDestroyable (WP11_Object * object )
8975+ {
8976+ return (object -> opFlag & WP11_FLAG_NOT_DESTROYABLE ) == 0 ;
8977+ }
8978+
89448979#if !defined(NO_RSA ) || defined(HAVE_ECC )
89458980/**
89468981 * Set the multi-precision integer from the data.
@@ -10866,10 +10901,16 @@ int WP11_Object_GetAttr(WP11_Object* object, CK_ATTRIBUTE_TYPE type, byte* data,
1086610901 ret = GetOpFlagBool (object -> opFlag , WP11_FLAG_TRUSTED , data , len );
1086710902 break ;
1086810903 case CKA_COPYABLE :
10904+ #ifdef WOLFPKCS11_LEGACY_COPYABLE_FALSE_DEFAULT
1086910905 ret = GetBool (CK_FALSE , data , len );
10906+ #else
10907+ ret = GetBool (
10908+ !(object -> opFlag & WP11_FLAG_NOT_COPYABLE ), data , len );
10909+ #endif
1087010910 break ;
1087110911 case CKA_DESTROYABLE :
10872- ret = GetBool (CK_TRUE , data , len );
10912+ ret = GetBool (
10913+ !(object -> opFlag & WP11_FLAG_NOT_DESTROYABLE ), data , len );
1087310914 break ;
1087410915 case CKA_APPLICATION :
1087510916 if (object -> objClass == CKO_DATA ) {
@@ -11220,6 +11261,15 @@ int WP11_Object_SetAttr(WP11_Object* object, CK_ATTRIBUTE_TYPE type, byte* data,
1122011261 case CKA_DERIVE :
1122111262 WP11_Object_SetOpFlag (object , WP11_FLAG_DERIVE , * (CK_BBOOL * )data );
1122211263 break ;
11264+ case CKA_COPYABLE :
11265+ /* Stored as the inverse: flag set when value is CK_FALSE. */
11266+ WP11_Object_SetOpFlag (object , WP11_FLAG_NOT_COPYABLE ,
11267+ !* (CK_BBOOL * )data );
11268+ break ;
11269+ case CKA_DESTROYABLE :
11270+ WP11_Object_SetOpFlag (object , WP11_FLAG_NOT_DESTROYABLE ,
11271+ !* (CK_BBOOL * )data );
11272+ break ;
1122311273 case CKA_ID :
1122411274 ret = WP11_Object_SetKeyId (object , data , (int )len );
1122511275 break ;
0 commit comments