@@ -169,6 +169,12 @@ char socket_dir[PATH_MAX];
169169/* Pattern-list of allowed PKCS#11/Security key paths */
170170static char * allowed_providers ;
171171
172+ /*
173+ * Allows PKCS11 providers or SK keys that use non-internal providers to
174+ * be added over a remote connection (identified by [email protected] ). 175+ */
176+ static int remote_add_provider ;
177+
172178/* locking */
173179#define LOCK_SIZE 32
174180#define LOCK_SALT_SIZE 16
@@ -1228,6 +1234,12 @@ process_add_identity(SocketEntry *e)
12281234 if (strcasecmp (sk_provider , "internal" ) == 0 ) {
12291235 debug_f ("internal provider" );
12301236 } else {
1237+ if (e -> nsession_ids != 0 && !remote_add_provider ) {
1238+ verbose ("failed add of SK provider \"%.100s\": "
1239+ "remote addition of providers is disabled" ,
1240+ sk_provider );
1241+ goto out ;
1242+ }
12311243 if (realpath (sk_provider , canonical_provider ) == NULL ) {
12321244 verbose ("failed provider \"%.100s\": "
12331245 "realpath: %s" , sk_provider ,
@@ -1391,6 +1403,11 @@ process_add_smartcard_key(SocketEntry *e)
13911403 error_f ("failed to parse constraints" );
13921404 goto send ;
13931405 }
1406+ if (e -> nsession_ids != 0 && !remote_add_provider ) {
1407+ verbose ("failed PKCS#11 add of \"%.100s\": remote addition of "
1408+ "providers is disabled" , provider );
1409+ goto send ;
1410+ }
13941411 if (realpath (provider , canonical_provider ) == NULL ) {
13951412 verbose ("failed PKCS#11 add of \"%.100s\": realpath: %s" ,
13961413 provider , strerror (errno ));
@@ -2050,7 +2067,9 @@ main(int ac, char **av)
20502067 break ;
20512068 case 'O' :
20522069 if (strcmp (optarg , "no-restrict-websafe" ) == 0 )
2053- restrict_websafe = 0 ;
2070+ restrict_websafe = 0 ;
2071+ else if (strcmp (optarg , "allow-remote-pkcs11" ) == 0 )
2072+ remote_add_provider = 1 ;
20542073 else
20552074 fatal ("Unknown -O option" );
20562075 break ;
0 commit comments