@@ -71,6 +71,7 @@ typedef struct pdata_st {
71
71
int tries_left ;
72
72
const unsigned char pad_char ;
73
73
int obj_flags ;
74
+ int cardmod ; /* only use with cardmod minidriver */
74
75
} pindata ;
75
76
76
77
typedef struct pubdata_st {
@@ -385,17 +386,30 @@ static int sc_pkcs15emu_piv_init(sc_pkcs15_card_t *p15card)
385
386
SC_PKCS15_PIN_FLAG_INITIALIZED |
386
387
SC_PKCS15_PIN_FLAG_LOCAL ,
387
388
-1 , 0xFF ,
388
- SC_PKCS15_CO_FLAG_PRIVATE },
389
+ SC_PKCS15_CO_FLAG_PRIVATE , 0 },
390
+
389
391
{ "02" , "PIV PUK" , "" , 0x81 ,
390
392
SC_PKCS15_PIN_TYPE_ASCII_NUMERIC ,
391
393
8 , 4 , 8 ,
392
394
SC_PKCS15_PIN_FLAG_NEEDS_PADDING |
393
395
SC_PKCS15_PIN_FLAG_INITIALIZED |
394
- SC_PKCS15_PIN_FLAG_LOCAL | SC_PKCS15_PIN_FLAG_SO_PIN |
396
+ SC_PKCS15_PIN_FLAG_SO_PIN |
395
397
SC_PKCS15_PIN_FLAG_UNBLOCKING_PIN ,
396
398
-1 , 0xFF ,
397
- SC_PKCS15_CO_FLAG_PRIVATE },
398
- { NULL , NULL , NULL , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }
399
+ SC_PKCS15_CO_FLAG_PRIVATE , 0 },
400
+
401
+ /* only used with minidriver */
402
+ { "03" , "PIN" , "" , 0x80 ,
403
+ /* used in minidriver as the sign key and for 9C key */
404
+ /* label, flag and ref will change if using global pin */
405
+ SC_PKCS15_PIN_TYPE_ASCII_NUMERIC ,
406
+ 8 , 4 , 8 ,
407
+ SC_PKCS15_PIN_FLAG_NEEDS_PADDING |
408
+ SC_PKCS15_PIN_FLAG_INITIALIZED |
409
+ SC_PKCS15_PIN_FLAG_LOCAL ,
410
+ -1 , 0xFF ,
411
+ SC_PKCS15_CO_FLAG_PRIVATE , 1 }, /* only use if cardmod */
412
+ { NULL , NULL , NULL , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }
399
413
};
400
414
// clang-format on
401
415
@@ -540,7 +554,7 @@ static int sc_pkcs15emu_piv_init(sc_pkcs15_card_t *p15card)
540
554
SC_PKCS15_PRKEY_USAGE_NONREPUDIATION ,
541
555
/*EC*/ SC_PKCS15_PRKEY_USAGE_SIGN |
542
556
SC_PKCS15_PRKEY_USAGE_NONREPUDIATION ,
543
- "" , 0x9C , "01" , SC_PKCS15_CO_FLAG_PRIVATE , 1 },
557
+ "" , 0x9C , "01" , SC_PKCS15_CO_FLAG_PRIVATE , 1 }, /* use sign pin and user_consent */
544
558
{ "03" , "KEY MAN key" ,
545
559
/*RSA*/ SC_PKCS15_PRKEY_USAGE_DECRYPT | SC_PKCS15_PRKEY_USAGE_UNWRAP ,
546
560
/*EC*/ SC_PKCS15_PRKEY_USAGE_DERIVE ,
@@ -952,6 +966,10 @@ static int sc_pkcs15emu_piv_init(sc_pkcs15_card_t *p15card)
952
966
const char * label ;
953
967
int pin_ref ;
954
968
969
+ /* the SignPIN is only used with minidriver */
970
+ if (pins [i ].cardmod && (strcmp (card -> ctx -> app_name , "cardmod" ) != 0 ))
971
+ continue ;
972
+
955
973
memset (& pin_info , 0 , sizeof (pin_info ));
956
974
memset (& pin_obj , 0 , sizeof (pin_obj ));
957
975
@@ -968,17 +986,17 @@ static int sc_pkcs15emu_piv_init(sc_pkcs15_card_t *p15card)
968
986
sc_format_path (pins [i ].path , & pin_info .path );
969
987
970
988
label = pins [i ].label ;
971
- if (i == 0 &&
989
+ if (( i == 0 || pins [ i ]. cardmod ) &&
972
990
sc_card_ctl (card , SC_CARDCTL_PIV_PIN_PREFERENCE ,
973
991
& pin_ref ) == 0 &&
974
992
pin_ref == 0x00 ) { /* must be 80 for PIV pin, or 00 for Global PIN */
975
993
pin_info .attrs .pin .reference = pin_ref ;
976
- pin_info .attrs .pin .flags &= ~SC_PKCS15_PIN_FLAG_LOCAL ;
977
994
label = "Global PIN" ;
978
995
}
996
+
979
997
strncpy (pin_obj .label , label , SC_PKCS15_MAX_LABEL_SIZE - 1 );
980
998
pin_obj .flags = pins [i ].obj_flags ;
981
- if (i == 0 && pin_info . attrs . pin . reference == 0x80 ) {
999
+ if (( i == 0 || pins [ i ]. cardmod ) ) {
982
1000
/*
983
1001
* according to description of "RESET RETRY COUNTER"
984
1002
* command in specs PUK can only unblock PIV PIN
@@ -1016,7 +1034,6 @@ static int sc_pkcs15emu_piv_init(sc_pkcs15_card_t *p15card)
1016
1034
1017
1035
pubkey_obj .flags = pubkeys [i ].obj_flags ;
1018
1036
1019
-
1020
1037
if (pubkeys [i ].auth_id )
1021
1038
sc_pkcs15_format_id (pubkeys [i ].auth_id , & pubkey_obj .auth_id );
1022
1039
@@ -1169,6 +1186,10 @@ static int sc_pkcs15emu_piv_init(sc_pkcs15_card_t *p15card)
1169
1186
if (prkeys [i ].auth_id )
1170
1187
sc_pkcs15_format_id (prkeys [i ].auth_id , & prkey_obj .auth_id );
1171
1188
1189
+ /* If using minidriver, use Sign PIN for 9C key */
1190
+ if (prkey_obj .user_consent && (strcmp (card -> ctx -> app_name , "cardmod" ) == 0 ))
1191
+ sc_pkcs15_format_id ("03" , & prkey_obj .auth_id );
1192
+
1172
1193
/*
1173
1194
* When no cert is present and a pubkey in a file was found,
1174
1195
* means the caller is initializing a card. A sign operation
0 commit comments