- Moved sc_pkcs15_bind_synthetic to a separate file
- Moved sc_pkcs15_print_card to ../tests/print.c - added dll_handle and preferred_language fields to p15card git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@1583 c6295689-39f2-0310-b995-f0e70906c6a9
This commit is contained in:
parent
78949a9bcb
commit
d91ecdc245
|
@ -27,36 +27,6 @@
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
|
|
||||||
static int sc_pkcs15_bind_synthetic(struct sc_pkcs15_card *);
|
|
||||||
|
|
||||||
void sc_pkcs15_print_card(const struct sc_pkcs15_card *card)
|
|
||||||
{
|
|
||||||
const char *flags[] = {
|
|
||||||
"Read-only",
|
|
||||||
"Login required",
|
|
||||||
"PRN generation",
|
|
||||||
"EID compliant"
|
|
||||||
};
|
|
||||||
int i;
|
|
||||||
|
|
||||||
assert(card != NULL);
|
|
||||||
printf("PKCS#15 Card [%s]:\n", card->label);
|
|
||||||
printf("\tVersion : %d\n", card->version);
|
|
||||||
printf("\tSerial number : %s\n", card->serial_number);
|
|
||||||
printf("\tManufacturer ID: %s\n", card->manufacturer_id);
|
|
||||||
printf("\tFlags : ");
|
|
||||||
for (i = 0; i < 4; i++) {
|
|
||||||
int count = 0;
|
|
||||||
if ((card->flags >> i) & 1) {
|
|
||||||
if (count)
|
|
||||||
printf(", ");
|
|
||||||
printf("%s", flags[i]);
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
printf("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct sc_asn1_entry c_asn1_toki[] = {
|
static const struct sc_asn1_entry c_asn1_toki[] = {
|
||||||
{ "version", SC_ASN1_INTEGER, ASN1_INTEGER, 0, NULL },
|
{ "version", SC_ASN1_INTEGER, ASN1_INTEGER, 0, NULL },
|
||||||
{ "serialNumber", SC_ASN1_OCTET_STRING, ASN1_OCTET_STRING, 0, NULL },
|
{ "serialNumber", SC_ASN1_OCTET_STRING, ASN1_OCTET_STRING, 0, NULL },
|
||||||
|
@ -445,6 +415,8 @@ void sc_pkcs15_card_free(struct sc_pkcs15_card *p15card)
|
||||||
free(p15card->serial_number);
|
free(p15card->serial_number);
|
||||||
if (p15card->manufacturer_id)
|
if (p15card->manufacturer_id)
|
||||||
free(p15card->manufacturer_id);
|
free(p15card->manufacturer_id);
|
||||||
|
if (p15card->preferred_language)
|
||||||
|
free(p15card->preferred_language);
|
||||||
free(p15card);
|
free(p15card);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -485,6 +457,22 @@ int sc_pkcs15_bind(struct sc_card *card,
|
||||||
SC_FUNC_RETURN(ctx, 1, err);
|
SC_FUNC_RETURN(ctx, 1, err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check for non-pkcs15 cards that we emulate. We do this
|
||||||
|
* twice - first, we check all emulators that list the ATRs
|
||||||
|
* they match - the OpenPGP emulator is one of them.
|
||||||
|
*
|
||||||
|
* If we find no emulator at this stage, we do the normal
|
||||||
|
* pkcs15 stuff - looking for EF(DIR), trying to locate the
|
||||||
|
* application DF, parsing EF(TokenInfo) etc etc.
|
||||||
|
*
|
||||||
|
* If that fails, too, we check all other emulators as a last
|
||||||
|
* resort.
|
||||||
|
*/
|
||||||
|
err = sc_pkcs15_bind_synthetic(p15card, 1);
|
||||||
|
if (err >= 0)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
/* Enumerate apps now */
|
||||||
if (card->app_count < 0) {
|
if (card->app_count < 0) {
|
||||||
err = sc_enum_apps(card);
|
err = sc_enum_apps(card);
|
||||||
if (err < 0 && err != SC_ERROR_FILE_NOT_FOUND) {
|
if (err < 0 && err != SC_ERROR_FILE_NOT_FOUND) {
|
||||||
|
@ -515,7 +503,7 @@ int sc_pkcs15_bind(struct sc_card *card,
|
||||||
err = sc_select_file(card, &p15card->file_app->path, NULL);
|
err = sc_select_file(card, &p15card->file_app->path, NULL);
|
||||||
card->ctx->suppress_errors--;
|
card->ctx->suppress_errors--;
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
err = sc_pkcs15_bind_synthetic(p15card);
|
err = sc_pkcs15_bind_synthetic(p15card, 0);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto error;
|
goto error;
|
||||||
goto done;
|
goto done;
|
||||||
|
@ -583,80 +571,6 @@ error:
|
||||||
SC_FUNC_RETURN(ctx, 1, err);
|
SC_FUNC_RETURN(ctx, 1, err);
|
||||||
}
|
}
|
||||||
|
|
||||||
int sc_pkcs15_bind_synthetic(struct sc_pkcs15_card *p15card)
|
|
||||||
{
|
|
||||||
int ret = SC_ERROR_INTERNAL, i;
|
|
||||||
struct sc_context *ctx = p15card->card->ctx;
|
|
||||||
const scconf_list *clist, *tmp;
|
|
||||||
scconf_block *conf_block = NULL, **blocks;
|
|
||||||
|
|
||||||
SC_FUNC_CALLED(ctx, 1);
|
|
||||||
|
|
||||||
assert(p15card);
|
|
||||||
|
|
||||||
for (i = 0; ctx->conf_blocks[i] != NULL; i++) {
|
|
||||||
blocks = scconf_find_blocks(ctx->conf, ctx->conf_blocks[i],
|
|
||||||
"framework", "pkcs15");
|
|
||||||
if (blocks[0] != NULL)
|
|
||||||
conf_block = blocks[0];
|
|
||||||
free(blocks);
|
|
||||||
}
|
|
||||||
if (!conf_block)
|
|
||||||
return SC_ERROR_INTERNAL;
|
|
||||||
/* get the pkcs15_syn libs from the conf file */
|
|
||||||
clist = scconf_find_list(conf_block, "pkcs15_syn");
|
|
||||||
if (!clist)
|
|
||||||
return SC_ERROR_INTERNAL;
|
|
||||||
|
|
||||||
/* iterate trough the list given in the config file */
|
|
||||||
for (tmp = clist; tmp != NULL; tmp = tmp->next) {
|
|
||||||
int r, tmp_r;
|
|
||||||
void *handle = NULL, *func_handle;
|
|
||||||
int (*init_func)(sc_pkcs15_card_t *);
|
|
||||||
|
|
||||||
if (ctx->debug >= 4) {
|
|
||||||
sc_debug(ctx, "Loading: %s\n", tmp->data);
|
|
||||||
}
|
|
||||||
/* try to open dynamic library */
|
|
||||||
r = sc_module_open(ctx, &handle, tmp->data);
|
|
||||||
if (r != SC_SUCCESS)
|
|
||||||
/* ignore error, try next one */
|
|
||||||
continue;
|
|
||||||
/* get a handle to the pkcs15 init function
|
|
||||||
* XXX the init_func should not modify the contents of
|
|
||||||
* sc_pkcs15_card_t unless the card is really the one
|
|
||||||
* the driver is intended for -- Nils
|
|
||||||
*/
|
|
||||||
r = sc_module_get_address(ctx, handle, &func_handle,
|
|
||||||
"sc_pkcs15_init_func");
|
|
||||||
init_func = (int (*)(sc_pkcs15_card_t *))func_handle;
|
|
||||||
if (r != SC_SUCCESS || !init_func)
|
|
||||||
return r;
|
|
||||||
/* try to initialize synthetic pkcs15 structures */
|
|
||||||
tmp_r = init_func(p15card);
|
|
||||||
r = sc_module_close(ctx, handle);
|
|
||||||
if (r != SC_SUCCESS)
|
|
||||||
return r;
|
|
||||||
if (tmp_r == SC_SUCCESS) {
|
|
||||||
p15card->flags |= SC_PKCS15_CARD_FLAG_READONLY;
|
|
||||||
p15card->magic = 0x10203040;
|
|
||||||
ret = SC_SUCCESS;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (tmp_r == SC_ERROR_WRONG_CARD) {
|
|
||||||
/* wrong init_func => try next one (if existing) */
|
|
||||||
if (ctx->debug >= 4) {
|
|
||||||
sc_debug(ctx, "init_func failed => trying next one\n");
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
/* some internal/card error occured => exit */
|
|
||||||
return tmp_r;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int sc_pkcs15_detect(struct sc_card *card)
|
int sc_pkcs15_detect(struct sc_card *card)
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
|
@ -673,6 +587,8 @@ int sc_pkcs15_unbind(struct sc_pkcs15_card *p15card)
|
||||||
{
|
{
|
||||||
assert(p15card != NULL && p15card->magic == SC_PKCS15_CARD_MAGIC);
|
assert(p15card != NULL && p15card->magic == SC_PKCS15_CARD_MAGIC);
|
||||||
SC_FUNC_CALLED(p15card->card->ctx, 1);
|
SC_FUNC_CALLED(p15card->card->ctx, 1);
|
||||||
|
if (p15card->dll_handle)
|
||||||
|
sc_module_close(p15card->card->ctx, p15card->dll_handle);
|
||||||
sc_pkcs15_card_free(p15card);
|
sc_pkcs15_card_free(p15card);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -353,6 +353,9 @@ typedef struct sc_pkcs15_card {
|
||||||
} opts;
|
} opts;
|
||||||
|
|
||||||
unsigned int magic;
|
unsigned int magic;
|
||||||
|
|
||||||
|
void *dll_handle; /* shared lib for emulated cards */
|
||||||
|
char *preferred_language;
|
||||||
} sc_pkcs15_card_t;
|
} sc_pkcs15_card_t;
|
||||||
|
|
||||||
#define SC_PKCS15_CARD_FLAG_READONLY 0x01
|
#define SC_PKCS15_CARD_FLAG_READONLY 0x01
|
||||||
|
@ -383,8 +386,6 @@ int sc_pkcs15_find_object_by_id(sc_pkcs15_card_t *, int,
|
||||||
struct sc_pkcs15_card * sc_pkcs15_card_new(void);
|
struct sc_pkcs15_card * sc_pkcs15_card_new(void);
|
||||||
void sc_pkcs15_card_free(struct sc_pkcs15_card *p15card);
|
void sc_pkcs15_card_free(struct sc_pkcs15_card *p15card);
|
||||||
|
|
||||||
void sc_pkcs15_print_card(const struct sc_pkcs15_card *card);
|
|
||||||
|
|
||||||
int sc_pkcs15_decipher(struct sc_pkcs15_card *p15card,
|
int sc_pkcs15_decipher(struct sc_pkcs15_card *p15card,
|
||||||
const struct sc_pkcs15_object *prkey_obj,
|
const struct sc_pkcs15_object *prkey_obj,
|
||||||
unsigned long flags,
|
unsigned long flags,
|
||||||
|
@ -600,6 +601,8 @@ typedef struct sc_pkcs15_search_key {
|
||||||
int sc_pkcs15_search_objects(sc_pkcs15_card_t *, sc_pkcs15_search_key_t *,
|
int sc_pkcs15_search_objects(sc_pkcs15_card_t *, sc_pkcs15_search_key_t *,
|
||||||
sc_pkcs15_object_t **, size_t);
|
sc_pkcs15_object_t **, size_t);
|
||||||
|
|
||||||
|
extern int sc_pkcs15_bind_synthetic(sc_pkcs15_card_t *, int);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue