/* For Myeid, all objects are files that can be deleted in any order */
static int myeid_delete_object(struct sc_profile *profile, 
		struct sc_card *card, unsigned int type, 
		const void *data, const sc_path_t *path)
{
	SC_FUNC_CALLED(card->ctx, 1);
	return sc_pkcs15init_delete_by_path(profile, card, path);
}
示例#2
0
/* For Myeid, all objects are files that can be deleted in any order */
static int 
myeid_delete_object(struct sc_profile *profile, struct sc_pkcs15_card *p15card, 
		struct sc_pkcs15_object *object, const struct sc_path *path)
{
	SC_FUNC_CALLED(p15card->card->ctx, SC_LOG_DEBUG_VERBOSE);
	return sc_pkcs15init_delete_by_path(profile, p15card, path);
}
示例#3
0
/* For Myeid, all objects are files that can be deleted in any order */
static int 
myeid_delete_object(struct sc_profile *profile, 
		struct sc_pkcs15_card *p15card, unsigned int type, 
		const void *data, const sc_path_t *path)
{
	SC_FUNC_CALLED(p15card->card->ctx, SC_LOG_DEBUG_VERBOSE);
	return sc_pkcs15init_delete_by_path(profile, p15card, path);
}
示例#4
0
static int
setcos_create_key(sc_profile_t *profile, sc_pkcs15_card_t *p15card,
		struct sc_pkcs15_object *object)
{
	struct sc_context *ctx = p15card->card->ctx;
	struct sc_pkcs15_prkey_info *key_info = (struct sc_pkcs15_prkey_info *)object->data;
	struct sc_file *file = NULL;
	int keybits = key_info->modulus_length, r;

	SC_FUNC_CALLED(ctx, SC_LOG_DEBUG_VERBOSE);
	if (object->type != SC_PKCS15_TYPE_PRKEY_RSA)
		SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_NOT_SUPPORTED, "Create key failed: RSA only supported");

	/* Parameter check */
	if ( (keybits < 512) || (keybits > 1024) || (keybits & 0x7))
		SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, SC_ERROR_INVALID_ARGUMENTS, "Invalid key length");

        sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "create private key ID:%s\n",  sc_pkcs15_print_id(&key_info->id));

	/* Get the private key file */
	r = setcos_new_file(profile, p15card->card, SC_PKCS15_TYPE_PRKEY_RSA, key_info->key_reference, &file);
	SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, r, "Cannot get new private key file");

	/* Take enough room for a 1024 bit key */
	if (file->size < 512)
		file->size = 512;

	/* Replace the path of instantiated key template by the path from the object data. */
        memcpy(&file->path, &key_info->path, sizeof(file->path));
        file->id = file->path.value[file->path.len - 2] * 0x100
		+ file->path.value[file->path.len - 1];

	key_info->key_reference = file->path.value[file->path.len - 1] & 0xFF;

        sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "Path of private key file to create %s\n", sc_print_path(&file->path));

        r = sc_select_file(p15card->card, &file->path, NULL);
        if (!r)   {
		r = sc_pkcs15init_delete_by_path(profile, p15card, &file->path);
		SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, r, "Failed to delete private key file");
	}
        else if (r != SC_ERROR_FILE_NOT_FOUND)    {
		SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, r, "Select private key file error");
	}

	/* Now create the key file */
	r = sc_pkcs15init_create_file(profile, p15card, file);
	SC_TEST_RET(ctx, SC_LOG_DEBUG_NORMAL, r, "Cannot create private key file");

	sc_file_free(file);
	SC_FUNC_RETURN(ctx, SC_LOG_DEBUG_NORMAL, r);
}
示例#5
0
/*
 * Delete object
 * 
 * Applied to private key: used to delete public part internal file
 */
static int rtecp_delete_object(struct sc_profile *profile, struct sc_pkcs15_card *p15card,
		struct sc_pkcs15_object *obj, const struct sc_path *path)
{
	sc_context_t *ctx;
	sc_file_t *df;
	sc_path_t pubkey_path;
	int key_ref;
	int r;

	if (!profile || !p15card || !p15card->card || !p15card->card->ctx)
		return SC_ERROR_INVALID_ARGUMENTS;

	ctx = p15card->card->ctx;
	LOG_FUNC_CALLED(ctx);
	sc_log(ctx, "delete object: type %X, path %s", obj->type, sc_print_path(path));

	if ((obj->type & SC_PKCS15_TYPE_CLASS_MASK) != SC_PKCS15_TYPE_PRKEY)
		LOG_FUNC_RETURN(ctx, SC_ERROR_NOT_SUPPORTED);

	key_ref = ((struct sc_pkcs15_prkey_info *)obj->data)->key_reference;
	sc_log(ctx, "key reference %04i", key_ref);

	r = sc_profile_get_file(profile, "PuKey-DF", &df);
	LOG_TEST_RET(ctx, r, "Get PuKey-DF info failed");
	pubkey_path = df->path;
	sc_file_free(df);

	r = sc_append_file_id(&pubkey_path, key_ref);
	LOG_TEST_RET(ctx, r, "Append ID to file failed");

	sc_log(ctx, "delete pubkey file %s", sc_print_path(&pubkey_path));
	r = sc_pkcs15init_delete_by_path(profile, p15card, &pubkey_path);
	if (r && r != SC_ERROR_FILE_NOT_FOUND)
		LOG_FUNC_RETURN(ctx, r);

	LOG_FUNC_RETURN(ctx, SC_ERROR_NOT_SUPPORTED);
}