diff --git a/etc/opensc.conf.in b/etc/opensc.conf.in index e84f8f0f..645be28a 100644 --- a/etc/opensc.conf.in +++ b/etc/opensc.conf.in @@ -300,6 +300,12 @@ app default { # Parameters for the OpenSC PKCS11 module app opensc-pkcs11 { pkcs11 { + # Should the module work in PKCS#11 v2.20 (instead of v2.11) mode? + # This affects slot changes and PC/SC PnP, as v2.11 applications + # are not allowed to change the length of the slot list. + # Default: false + # v2_20_mode = true; + # Maximum Number of virtual slots. # If there are more slots than defined here, # the remaining slots will be hidden from PKCS#11. diff --git a/src/pkcs11/framework-pkcs15.c b/src/pkcs11/framework-pkcs15.c index e081ecbe..c40055aa 100644 --- a/src/pkcs11/framework-pkcs15.c +++ b/src/pkcs11/framework-pkcs15.c @@ -212,9 +212,9 @@ static void pkcs15_init_token_info(struct sc_pkcs15_card *card, CK_TOKEN_INFO_PT pToken->ulFreePublicMemory = CK_UNAVAILABLE_INFORMATION; pToken->ulTotalPrivateMemory = CK_UNAVAILABLE_INFORMATION; pToken->ulFreePrivateMemory = CK_UNAVAILABLE_INFORMATION; - pToken->hardwareVersion.major = 1; + pToken->hardwareVersion.major = 0; pToken->hardwareVersion.minor = 0; - pToken->firmwareVersion.major = 1; + pToken->firmwareVersion.major = 0; pToken->firmwareVersion.minor = 0; } diff --git a/src/pkcs11/framework-pkcs15init.c b/src/pkcs11/framework-pkcs15init.c index d5b74808..ac071bd9 100644 --- a/src/pkcs11/framework-pkcs15init.c +++ b/src/pkcs11/framework-pkcs15init.c @@ -82,9 +82,9 @@ static CK_RV pkcs15init_create_tokens(struct sc_pkcs11_card *p11card) pToken->ulFreePublicMemory = CK_UNAVAILABLE_INFORMATION; pToken->ulTotalPrivateMemory = CK_UNAVAILABLE_INFORMATION; pToken->ulFreePrivateMemory = CK_UNAVAILABLE_INFORMATION; - pToken->hardwareVersion.major = 1; + pToken->hardwareVersion.major = 0; pToken->hardwareVersion.minor = 0; - pToken->firmwareVersion.major = 1; + pToken->firmwareVersion.major = 0; pToken->firmwareVersion.minor = 0; } diff --git a/src/pkcs11/misc.c b/src/pkcs11/misc.c index ba6d1af8..c5da7e3c 100644 --- a/src/pkcs11/misc.c +++ b/src/pkcs11/misc.c @@ -317,6 +317,7 @@ void load_pkcs11_parameters(struct sc_pkcs11_config *conf, sc_context_t *ctx) int i; /* Set defaults */ + conf->v2_20_mode = 0; conf->max_virtual_slots = 16; conf->slots_per_card = 4; conf->hide_empty_tokens = 0; @@ -330,6 +331,7 @@ void load_pkcs11_parameters(struct sc_pkcs11_config *conf, sc_context_t *ctx) return; /* contains the defaults, if there is a "pkcs11" config block */ + conf->v2_20_mode = scconf_get_bool(conf_block, "v2_20_mode", conf->v2_20_mode); conf->max_virtual_slots = scconf_get_int(conf_block, "max_virtual_slots", conf->max_virtual_slots); /*XXX: rename the option in 0.12+ */ conf->slots_per_card = scconf_get_int(conf_block, "num_slots", conf->slots_per_card); diff --git a/src/pkcs11/pkcs11-global.c b/src/pkcs11/pkcs11-global.c index 36ca21be..55c4c875 100644 --- a/src/pkcs11/pkcs11-global.c +++ b/src/pkcs11/pkcs11-global.c @@ -295,15 +295,15 @@ CK_RV C_GetInfo(CK_INFO_PTR pInfo) memset(pInfo, 0, sizeof(CK_INFO)); pInfo->cryptokiVersion.major = 2; - pInfo->cryptokiVersion.minor = 11; + pInfo->cryptokiVersion.minor = sc_pkcs11_conf.v2_20_mode ? 20 : 11; strcpy_bp(pInfo->manufacturerID, "OpenSC (www.opensc-project.org)", sizeof(pInfo->manufacturerID)); strcpy_bp(pInfo->libraryDescription, "smart card PKCS#11 API", sizeof(pInfo->libraryDescription)); - pInfo->libraryVersion.major = 1; - pInfo->libraryVersion.minor = 0; + pInfo->libraryVersion.major = 0; + pInfo->libraryVersion.minor = 0; /* FIXME: use 0.116 for 0.11.6 from autoconf */ out: sc_pkcs11_unlock(); return rv; @@ -347,7 +347,8 @@ CK_RV C_GetSlotList(CK_BBOOL tokenPresent, /* only slots with token prese } sc_debug(context, "Getting slot listing\n"); - if (pSlotList == NULL_PTR) { + /* Slot list can only change in v2.20 */ + if (pSlotList == NULL_PTR && sc_pkcs11_conf.v2_20_mode) { sc_ctx_detect_readers(context); } card_detect_all(); @@ -684,7 +685,7 @@ sc_pkcs11_init_lock(CK_C_INITIALIZE_ARGS_PTR args) /* Shall be used in threaded envirnoment, must use app provided locking */ global_locking = args; } else if (!applock && !oslock) { - /* Shall not be used in threaded environemtn, use operating system locking */ + /* Shall not be used in threaded environment, use operating system locking */ global_locking = default_mutex_funcs; } @@ -753,7 +754,7 @@ void sc_pkcs11_free_lock(void) } CK_FUNCTION_LIST pkcs11_function_list = { - { 2, 11 }, + { 2, 11 }, /* Note: NSS/Firefox ignores this version number and uses C_GetInfo() */ C_Initialize, C_Finalize, C_GetInfo, diff --git a/src/pkcs11/sc-pkcs11.h b/src/pkcs11/sc-pkcs11.h index ddd7498b..6751484a 100644 --- a/src/pkcs11/sc-pkcs11.h +++ b/src/pkcs11/sc-pkcs11.h @@ -87,6 +87,7 @@ struct sc_pkcs11_pool { }; struct sc_pkcs11_config { + unsigned int v2_20_mode; unsigned int max_virtual_slots; unsigned int slots_per_card; unsigned char hide_empty_tokens;