Allow delete data objects by specifying application-name and label

git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@3608 c6295689-39f2-0310-b995-f0e70906c6a9
This commit is contained in:
alonbl 2008-12-28 21:28:53 +00:00
parent 8456a321f8
commit 8828faeccf
4 changed files with 59 additions and 4 deletions

View File

@ -128,6 +128,7 @@ sc_pkcs15_erase_pubkey
sc_pkcs15_find_cert_by_id
sc_pkcs15_find_data_object_by_app_oid
sc_pkcs15_find_data_object_by_id
sc_pkcs15_find_data_object_by_name
sc_pkcs15_find_object_by_id
sc_pkcs15_find_pin_by_auth_id
sc_pkcs15_find_pin_by_reference

View File

@ -1005,6 +1005,17 @@ static int compare_obj_path(sc_pkcs15_object_t *obj, const sc_path_t *path)
return 0;
}
static int compare_obj_data_name(sc_pkcs15_object_t *obj, const char *app_label, const char *label)
{
struct sc_pkcs15_data_info *cinfo = (struct sc_pkcs15_data_info *) obj->data;
if (obj->type != SC_PKCS15_TYPE_DATA_OBJECT)
return 0;
return !strcmp(cinfo->app_label, app_label) &&
!strcmp(obj->label, label);
}
static int compare_obj_key(struct sc_pkcs15_object *obj, void *arg)
{
struct sc_pkcs15_search_key *sk = (struct sc_pkcs15_search_key *) arg;
@ -1021,6 +1032,13 @@ static int compare_obj_key(struct sc_pkcs15_object *obj, void *arg)
return 0;
if (sk->path && !compare_obj_path(obj, sk->path))
return 0;
if (
sk->app_label && sk->label &&
!compare_obj_data_name(obj, sk->app_label, sk->label)
) {
return 0;
}
return 1;
}
@ -1146,6 +1164,28 @@ int sc_pkcs15_find_data_object_by_app_oid(struct sc_pkcs15_card *p15card,
return 0;
}
int sc_pkcs15_find_data_object_by_name(struct sc_pkcs15_card *p15card,
const char *app_label,
const char *label,
struct sc_pkcs15_object **out)
{
sc_pkcs15_search_key_t sk;
int r;
memset(&sk, 0, sizeof(sk));
sk.app_label = app_label;
sk.label = label;
r = __sc_pkcs15_search_objects(p15card, 0, SC_PKCS15_TYPE_DATA_OBJECT,
compare_obj_key, &sk,
out, 1);
if (r < 0)
return r;
if (r == 0)
return SC_ERROR_OBJECT_NOT_FOUND;
return 0;
}
int sc_pkcs15_find_prkey_by_id_usage(struct sc_pkcs15_card *p15card,
const struct sc_pkcs15_id *id,
unsigned int usage,

View File

@ -476,6 +476,10 @@ int sc_pkcs15_find_data_object_by_id(struct sc_pkcs15_card *p15card,
int sc_pkcs15_find_data_object_by_app_oid(struct sc_pkcs15_card *p15card,
const struct sc_object_id *app_oid,
struct sc_pkcs15_object **out);
int sc_pkcs15_find_data_object_by_name(struct sc_pkcs15_card *p15card,
const char *app_label,
const char *label,
struct sc_pkcs15_object **out);
void sc_pkcs15_free_data_object(struct sc_pkcs15_data *data_object);
int sc_pkcs15_read_certificate(struct sc_pkcs15_card *card,
@ -662,6 +666,8 @@ typedef struct sc_pkcs15_search_key {
unsigned int match_reference : 1;
int reference;
const char * app_label;
const char * label;
} sc_pkcs15_search_key_t;
int sc_pkcs15_search_objects(sc_pkcs15_card_t *, sc_pkcs15_search_key_t *,

View File

@ -1233,11 +1233,19 @@ do_delete_objects(struct sc_profile *profile, unsigned int myopt_delete_flags)
if (myopt_delete_flags & SC_PKCS15INIT_TYPE_DATA) {
struct sc_object_id app_oid;
sc_pkcs15_object_t *obj;
if (opt_application_id == NULL)
util_fatal("Specify the --application-id for the data object to be deleted\n");
sc_format_oid(&app_oid, opt_application_id);
r = sc_pkcs15_find_data_object_by_app_oid(p15card, &app_oid, &obj);
if (opt_application_id != NULL) {
sc_format_oid(&app_oid, opt_application_id);
r = sc_pkcs15_find_data_object_by_app_oid(p15card, &app_oid, &obj);
}
else if (opt_application_name != NULL && opt_label != NULL) {
r = sc_pkcs15_find_data_object_by_name(p15card, opt_application_name, opt_label, &obj);
}
else {
util_fatal("Specify the --application-id or --application-name and --label for the data object to be deleted\n");
}
if (r >= 0) {
r = sc_pkcs15init_delete_object(p15card, profile, obj);
if (r >= 0)