Blame src/pkcs11.c

Packit Service 4684c1
/*
Packit Service 4684c1
 * Copyright (C) 2010-2012 Free Software Foundation, Inc.
Packit Service 4684c1
 * Copyright (C) 2015-2016 Red Hat, Inc.
Packit Service 4684c1
 *
Packit Service 4684c1
 * Author: Nikos Mavrogiannopoulos
Packit Service 4684c1
 *
Packit Service 4684c1
 * This file is part of GnuTLS.
Packit Service 4684c1
 *
Packit Service 4684c1
 * GnuTLS is free software: you can redistribute it and/or modify
Packit Service 4684c1
 * it under the terms of the GNU General Public License as published by
Packit Service 4684c1
 * the Free Software Foundation, either version 3 of the License, or
Packit Service 4684c1
 * (at your option) any later version.
Packit Service 4684c1
 *
Packit Service 4684c1
 * GnuTLS is distributed in the hope that it will be useful,
Packit Service 4684c1
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 4684c1
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 4684c1
 * GNU General Public License for more details.
Packit Service 4684c1
 *
Packit Service 4684c1
 * You should have received a copy of the GNU General Public License
Packit Service 4684c1
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
Packit Service 4684c1
 */
Packit Service 4684c1
#include <config.h>
Packit Service 4684c1
Packit Service 4684c1
#include <gnutls/gnutls.h>
Packit Service 4684c1
#include <gnutls/pkcs11.h>
Packit Service 4684c1
#include <gnutls/abstract.h>
Packit Service 4684c1
#include <stdio.h>
Packit Service 4684c1
#include <stdlib.h>
Packit Service 4684c1
#include "p11tool.h"
Packit Service 4684c1
#include "certtool-cfg.h"
Packit Service 4684c1
#include "certtool-common.h"
Packit Service 4684c1
#include <unistd.h>
Packit Service 4684c1
#include <string.h>
Packit Service 4684c1
#include <stdint.h>
Packit Service 4684c1
#include <common.h>
Packit Service 4684c1
Packit Service 4684c1
#include <p11-kit/pkcs11.h>
Packit Service 4684c1
Packit Service 4684c1
#ifdef _WIN32
Packit Service 4684c1
# define sleep(x) Sleep(x*1000)
Packit Service 4684c1
#endif
Packit Service 4684c1
Packit Service 4684c1
static
Packit Service 4684c1
char *get_single_token_url(common_info_st * info);
Packit Service 4684c1
static char *_saved_url = NULL;
Packit Service 4684c1
Packit Service 4684c1
#define FIX(url, out, det, info) \
Packit Service 4684c1
	if (url == NULL) { \
Packit Service 4684c1
		url = get_single_token_url(info); \
Packit Service 4684c1
		if (url == NULL) { \
Packit Service 4684c1
			fprintf(stderr, "warning: no token URL was provided for this operation; the available tokens are:\n\n"); \
Packit Service 4684c1
			pkcs11_token_list(out, det, info, 1); \
Packit Service 4684c1
			app_exit(1); \
Packit Service 4684c1
		} \
Packit Service 4684c1
		_saved_url = (void*)url; \
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
#define UNFIX gnutls_free(_saved_url);_saved_url = NULL
Packit Service 4684c1
Packit Service 4684c1
#define KEEP_LOGIN_FLAGS(flags) (flags & (GNUTLS_PKCS11_OBJ_FLAG_LOGIN|GNUTLS_PKCS11_OBJ_FLAG_LOGIN_SO))
Packit Service 4684c1
Packit Service 4684c1
#define CHECK_LOGIN_FLAG(url, flags) \
Packit Service 4684c1
	if ((flags & KEEP_LOGIN_FLAGS(flags)) == 0) { \
Packit Service 4684c1
		unsigned _tflags; \
Packit Service 4684c1
		int _r = gnutls_pkcs11_token_get_flags(url, &_tflags); \
Packit Service 4684c1
		if (_r >= 0 && (_tflags & GNUTLS_PKCS11_TOKEN_LOGIN_REQUIRED)) { \
Packit Service 4684c1
			flags |= GNUTLS_PKCS11_OBJ_FLAG_LOGIN; \
Packit Service 4684c1
			fprintf(stderr, \
Packit Service 4684c1
				"note: assuming --login for this operation.\n"); \
Packit Service 4684c1
		} else { \
Packit Service 4684c1
			fprintf(stderr, \
Packit Service 4684c1
				"warning: --login was not specified and it may be required for this operation.\n"); \
Packit Service 4684c1
		} \
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
Packit Service 4684c1
void
Packit Service 4684c1
pkcs11_delete(FILE * outfile, const char *url,
Packit Service 4684c1
	      unsigned int login_flags, common_info_st * info)
Packit Service 4684c1
{
Packit Service 4684c1
	int ret;
Packit Service 4684c1
	unsigned int obj_flags = 0;
Packit Service 4684c1
Packit Service 4684c1
	if (login_flags) obj_flags = login_flags;
Packit Service 4684c1
Packit Service 4684c1
	pkcs11_common(info);
Packit Service 4684c1
Packit Service 4684c1
	if (info->batch == 0) {
Packit Service 4684c1
		pkcs11_list(outfile, url, PKCS11_TYPE_ALL, login_flags,
Packit Service 4684c1
			    GNUTLS_PKCS11_URL_LIB, info);
Packit Service 4684c1
		ret =
Packit Service 4684c1
		    read_yesno
Packit Service 4684c1
		    ("Are you sure you want to delete those objects? (y/N): ",
Packit Service 4684c1
		     0);
Packit Service 4684c1
		if (ret == 0) {
Packit Service 4684c1
			app_exit(1);
Packit Service 4684c1
		}
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_pkcs11_delete_url(url, obj_flags);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "Error in %s:%d: %s\n", __func__, __LINE__,
Packit Service 4684c1
			gnutls_strerror(ret));
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	fprintf(outfile, "\n%d objects deleted\n", ret);
Packit Service 4684c1
Packit Service 4684c1
	return;
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
static
Packit Service 4684c1
const char *get_key_algo_type(gnutls_pkcs11_obj_type_t otype, const char *objurl, unsigned flags, time_t *exp)
Packit Service 4684c1
{
Packit Service 4684c1
	int ret;
Packit Service 4684c1
	gnutls_pubkey_t pubkey = NULL;
Packit Service 4684c1
	gnutls_privkey_t privkey = NULL;
Packit Service 4684c1
	gnutls_x509_crt_t crt = NULL;
Packit Service 4684c1
	static char str[256];
Packit Service 4684c1
	const char *p;
Packit Service 4684c1
	unsigned int bits;
Packit Service 4684c1
	gnutls_pk_algorithm_t pk;
Packit Service 4684c1
	gnutls_ecc_curve_t curve;
Packit Service 4684c1
Packit Service 4684c1
	if (exp)
Packit Service 4684c1
		*exp = -1;
Packit Service 4684c1
Packit Service 4684c1
	switch (otype) {
Packit Service 4684c1
		case GNUTLS_PKCS11_OBJ_X509_CRT:
Packit Service 4684c1
			ret = gnutls_x509_crt_init(&crt;;
Packit Service 4684c1
			if (ret < 0)
Packit Service 4684c1
				goto fail;
Packit Service 4684c1
Packit Service 4684c1
			ret = gnutls_x509_crt_import_url(crt, objurl, flags);
Packit Service 4684c1
			if (ret < 0)
Packit Service 4684c1
				goto fail;
Packit Service 4684c1
			ret = gnutls_x509_crt_get_pk_algorithm(crt, &bits);
Packit Service 4684c1
			if (ret < 0)
Packit Service 4684c1
				goto fail;
Packit Service 4684c1
			pk = ret;
Packit Service 4684c1
Packit Service 4684c1
			p = gnutls_pk_get_name(pk);
Packit Service 4684c1
			if (p) {
Packit Service 4684c1
				if ((pk == GNUTLS_PK_RSA || pk == GNUTLS_PK_DSA) && bits > 0) {
Packit Service 4684c1
					snprintf(str, sizeof(str), "%s-%d", p, bits);
Packit Service 4684c1
					p = str;
Packit Service 4684c1
				} else if (pk == GNUTLS_PK_ECDSA && gnutls_x509_crt_get_pk_ecc_raw(crt, &curve, NULL, NULL) >= 0) {
Packit Service 4684c1
					snprintf(str, sizeof(str), "%s-%s", p, gnutls_ecc_curve_get_name(curve));
Packit Service 4684c1
					p = str;
Packit Service 4684c1
				}
Packit Service 4684c1
			}
Packit Service 4684c1
Packit Service 4684c1
			if (exp)
Packit Service 4684c1
				*exp = gnutls_x509_crt_get_expiration_time(crt);
Packit Service 4684c1
Packit Service 4684c1
			gnutls_x509_crt_deinit(crt);
Packit Service 4684c1
			return p;
Packit Service 4684c1
		case GNUTLS_PKCS11_OBJ_PUBKEY:
Packit Service 4684c1
			ret = gnutls_pubkey_init(&pubkey);
Packit Service 4684c1
			if (ret < 0)
Packit Service 4684c1
				goto fail;
Packit Service 4684c1
Packit Service 4684c1
			ret = gnutls_pubkey_import_url(pubkey, objurl, flags);
Packit Service 4684c1
			if (ret < 0)
Packit Service 4684c1
				goto fail;
Packit Service 4684c1
			ret = gnutls_pubkey_get_pk_algorithm(pubkey, &bits);
Packit Service 4684c1
			if (ret < 0)
Packit Service 4684c1
				goto fail;
Packit Service 4684c1
			pk = ret;
Packit Service 4684c1
Packit Service 4684c1
			p = gnutls_pk_get_name(pk);
Packit Service 4684c1
			if (p) {
Packit Service 4684c1
				if ((pk == GNUTLS_PK_RSA || pk == GNUTLS_PK_DSA) && bits > 0) {
Packit Service 4684c1
					snprintf(str, sizeof(str), "%s-%d", p, bits);
Packit Service 4684c1
					p = str;
Packit Service 4684c1
				} else if (pk == GNUTLS_PK_ECDSA && gnutls_pubkey_export_ecc_raw(pubkey, &curve, NULL, NULL) >= 0) {
Packit Service 4684c1
					snprintf(str, sizeof(str), "%s-%s", p, gnutls_ecc_curve_get_name(curve));
Packit Service 4684c1
					p = str;
Packit Service 4684c1
				}
Packit Service 4684c1
			}
Packit Service 4684c1
Packit Service 4684c1
			gnutls_pubkey_deinit(pubkey);
Packit Service 4684c1
			return p;
Packit Service 4684c1
		case GNUTLS_PKCS11_OBJ_PRIVKEY:
Packit Service 4684c1
			ret = gnutls_privkey_init(&privkey);
Packit Service 4684c1
			if (ret < 0)
Packit Service 4684c1
				goto fail;
Packit Service 4684c1
Packit Service 4684c1
			ret = gnutls_privkey_import_url(privkey, objurl, flags);
Packit Service 4684c1
			if (ret < 0)
Packit Service 4684c1
				goto fail;
Packit Service 4684c1
			ret = gnutls_privkey_get_pk_algorithm(privkey, &bits);
Packit Service 4684c1
			if (ret < 0)
Packit Service 4684c1
				goto fail;
Packit Service 4684c1
			pk = ret;
Packit Service 4684c1
Packit Service 4684c1
			p = gnutls_pk_get_name(pk);
Packit Service 4684c1
			if (p) {
Packit Service 4684c1
				if ((pk == GNUTLS_PK_RSA || pk == GNUTLS_PK_DSA) && bits > 0) {
Packit Service 4684c1
					snprintf(str, sizeof(str), "%s-%d", p, bits);
Packit Service 4684c1
					p = str;
Packit Service 4684c1
				} else if (pk == GNUTLS_PK_ECDSA && gnutls_privkey_export_ecc_raw(privkey, &curve, NULL, NULL, NULL) >= 0) {
Packit Service 4684c1
					snprintf(str, sizeof(str), "%s-%s", p, gnutls_ecc_curve_get_name(curve));
Packit Service 4684c1
					p = str;
Packit Service 4684c1
				}
Packit Service 4684c1
			}
Packit Service 4684c1
Packit Service 4684c1
			gnutls_privkey_deinit(privkey);
Packit Service 4684c1
			return p;
Packit Service 4684c1
		default:
Packit Service 4684c1
 fail:
Packit Service 4684c1
			if (crt)
Packit Service 4684c1
				gnutls_x509_crt_deinit(crt);
Packit Service 4684c1
			if (pubkey)
Packit Service 4684c1
				gnutls_pubkey_deinit(pubkey);
Packit Service 4684c1
			if (privkey)
Packit Service 4684c1
				gnutls_privkey_deinit(privkey);
Packit Service 4684c1
			return NULL;
Packit Service 4684c1
	}
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
/* lists certificates from a token
Packit Service 4684c1
 */
Packit Service 4684c1
void
Packit Service 4684c1
pkcs11_list(FILE * outfile, const char *url, int type, unsigned int flags,
Packit Service 4684c1
	    unsigned int detailed, common_info_st * info)
Packit Service 4684c1
{
Packit Service 4684c1
	gnutls_pkcs11_obj_t *crt_list;
Packit Service 4684c1
	unsigned int crt_list_size = 0, i, j;
Packit Service 4684c1
	int ret, otype;
Packit Service 4684c1
	char *output, *str;
Packit Service 4684c1
	int attrs, print_exts = 0;
Packit Service 4684c1
	gnutls_x509_ext_st *exts;
Packit Service 4684c1
	unsigned exts_size;
Packit Service 4684c1
	unsigned int obj_flags = flags;
Packit Service 4684c1
	time_t exp;
Packit Service 4684c1
Packit Service 4684c1
	pkcs11_common(info);
Packit Service 4684c1
Packit Service 4684c1
	FIX(url, outfile, detailed, info);
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_pkcs11_token_get_flags(url, &flags);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		flags = 0;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	if (flags & GNUTLS_PKCS11_TOKEN_TRUSTED)
Packit Service 4684c1
		print_exts = 1;
Packit Service 4684c1
Packit Service 4684c1
	if (type == PKCS11_TYPE_TRUSTED) {
Packit Service 4684c1
		attrs = GNUTLS_PKCS11_OBJ_ATTR_CRT_TRUSTED;
Packit Service 4684c1
	} else if (type == PKCS11_TYPE_PK) {
Packit Service 4684c1
		attrs = GNUTLS_PKCS11_OBJ_ATTR_CRT_WITH_PRIVKEY;
Packit Service 4684c1
	} else if (type == PKCS11_TYPE_CRT_ALL) {
Packit Service 4684c1
		attrs = GNUTLS_PKCS11_OBJ_ATTR_CRT_ALL;
Packit Service 4684c1
		if (print_exts != 0) print_exts++;
Packit Service 4684c1
	} else if (type == PKCS11_TYPE_PRIVKEY) {
Packit Service 4684c1
		attrs = GNUTLS_PKCS11_OBJ_ATTR_PRIVKEY;
Packit Service 4684c1
	} else { /* also PKCS11_TYPE_INFO */
Packit Service 4684c1
		attrs = GNUTLS_PKCS11_OBJ_ATTR_ALL;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	/* give some initial value to avoid asking for the pkcs11 pin twice.
Packit Service 4684c1
	 */
Packit Service 4684c1
	ret =
Packit Service 4684c1
	    gnutls_pkcs11_obj_list_import_url2(&crt_list, &crt_list_size,
Packit Service 4684c1
					       url, attrs, obj_flags);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "Error in crt_list_import (1): %s\n",
Packit Service 4684c1
			gnutls_strerror(ret));
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	if (crt_list_size == 0) {
Packit Service 4684c1
		fprintf(stderr, "No matching objects found\n");
Packit Service 4684c1
		app_exit(2);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	for (i = 0; i < crt_list_size; i++) {
Packit Service 4684c1
		char buf[256];
Packit Service 4684c1
		size_t size;
Packit Service 4684c1
		const char *p;
Packit Service 4684c1
		unsigned int oflags;
Packit Service 4684c1
		const char *vendor;
Packit Service 4684c1
		char *objurl;
Packit Service 4684c1
		char timebuf[SIMPLE_CTIME_BUF_SIZE];
Packit Service 4684c1
Packit Service 4684c1
		ret =
Packit Service 4684c1
		    gnutls_pkcs11_obj_export_url(crt_list[i], detailed,
Packit Service 4684c1
						 &output);
Packit Service 4684c1
		if (ret < 0) {
Packit Service 4684c1
			fprintf(stderr, "Error in %s:%d: %s\n", __func__,
Packit Service 4684c1
				__LINE__, gnutls_strerror(ret));
Packit Service 4684c1
			app_exit(1);
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
		if (info->only_urls) {
Packit Service 4684c1
			fprintf(outfile, "%s\n", output);
Packit Service 4684c1
			gnutls_free(output);
Packit Service 4684c1
			continue;
Packit Service 4684c1
		} else {
Packit Service 4684c1
			fprintf(outfile, "Object %d:\n\tURL: %s\n", i, output);
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
		/* copy vendor query (e.g. pin-value) from the original URL */
Packit Service 4684c1
		vendor = strrchr(url, '?');
Packit Service 4684c1
		if (vendor) {
Packit Service 4684c1
			objurl = gnutls_malloc(strlen(output) + strlen(vendor) + 1);
Packit Service 4684c1
			strcpy(objurl, output);
Packit Service 4684c1
			strcat(objurl, vendor);
Packit Service 4684c1
		} else {
Packit Service 4684c1
			objurl = gnutls_strdup(output);
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
		p = NULL;
Packit Service 4684c1
		otype = gnutls_pkcs11_obj_get_type(crt_list[i]);
Packit Service 4684c1
		if (otype == GNUTLS_PKCS11_OBJ_PRIVKEY ||
Packit Service 4684c1
		    otype == GNUTLS_PKCS11_OBJ_PUBKEY ||
Packit Service 4684c1
		    otype == GNUTLS_PKCS11_OBJ_X509_CRT) {
Packit Service 4684c1
			p = get_key_algo_type(otype, objurl, obj_flags, &exp);
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
		if (p) {
Packit Service 4684c1
			fprintf(outfile, "\tType: %s (%s)\n",
Packit Service 4684c1
				gnutls_pkcs11_type_get_name(otype), p);
Packit Service 4684c1
		} else {
Packit Service 4684c1
			fprintf(outfile, "\tType: %s\n",
Packit Service 4684c1
				gnutls_pkcs11_type_get_name(otype));
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
		if (otype == GNUTLS_PKCS11_OBJ_X509_CRT && exp != -1) {
Packit Service 4684c1
			fprintf(outfile, "\tExpires: %s\n", simple_ctime(&exp, timebuf));
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
		gnutls_free(output);
Packit Service 4684c1
		gnutls_free(objurl);
Packit Service 4684c1
Packit Service 4684c1
		size = sizeof(buf);
Packit Service 4684c1
		ret =
Packit Service 4684c1
		    gnutls_pkcs11_obj_get_info(crt_list[i],
Packit Service 4684c1
					       GNUTLS_PKCS11_OBJ_LABEL,
Packit Service 4684c1
					       buf, &size);
Packit Service 4684c1
		if (ret < 0) {
Packit Service 4684c1
			fprintf(stderr, "Error in %s:%d: %s\n", __func__,
Packit Service 4684c1
				__LINE__, gnutls_strerror(ret));
Packit Service 4684c1
			app_exit(1);
Packit Service 4684c1
		}
Packit Service 4684c1
		fprintf(outfile, "\tLabel: %s\n", buf);
Packit Service 4684c1
Packit Service 4684c1
		oflags = 0;
Packit Service 4684c1
		ret = gnutls_pkcs11_obj_get_flags(crt_list[i], &oflags);
Packit Service 4684c1
		if (ret < 0) {
Packit Service 4684c1
			fprintf(stderr, "Error in %s:%d: %s\n", __func__,
Packit Service 4684c1
				__LINE__, gnutls_strerror(ret));
Packit Service 4684c1
			app_exit(1);
Packit Service 4684c1
		}
Packit Service 4684c1
		str = gnutls_pkcs11_obj_flags_get_str(oflags);
Packit Service 4684c1
		if (str != NULL) {
Packit Service 4684c1
			fprintf(outfile, "\tFlags: %s\n", str);
Packit Service 4684c1
			gnutls_free(str);
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
		size = sizeof(buf);
Packit Service 4684c1
		ret =
Packit Service 4684c1
		    gnutls_pkcs11_obj_get_info(crt_list[i],
Packit Service 4684c1
					       GNUTLS_PKCS11_OBJ_ID_HEX,
Packit Service 4684c1
					       buf, &size);
Packit Service 4684c1
		if (ret < 0) {
Packit Service 4684c1
			if (ret == GNUTLS_E_SHORT_MEMORY_BUFFER) {
Packit Service 4684c1
				fprintf(outfile, "\tID: (too long)\n");
Packit Service 4684c1
			} else {
Packit Service 4684c1
				fprintf(stderr, "Error in %s:%d: %s\n", __func__,
Packit Service 4684c1
					__LINE__, gnutls_strerror(ret));
Packit Service 4684c1
				app_exit(1);
Packit Service 4684c1
			}
Packit Service 4684c1
		} else {
Packit Service 4684c1
			fprintf(outfile, "\tID: %s\n", buf);
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
		if (otype == GNUTLS_PKCS11_OBJ_X509_CRT && print_exts > 0) {
Packit Service 4684c1
			ret = gnutls_pkcs11_obj_get_exts(crt_list[i], &exts, &exts_size, 0);
Packit Service 4684c1
			if (ret >= 0 && exts_size > 0) {
Packit Service 4684c1
				gnutls_datum_t txt;
Packit Service 4684c1
Packit Service 4684c1
				if (print_exts > 1) {
Packit Service 4684c1
					fprintf(outfile, "\tAttached extensions:\n");
Packit Service 4684c1
					ret = gnutls_x509_ext_print(exts, exts_size, 0, &txt);
Packit Service 4684c1
					if (ret >= 0) {
Packit Service 4684c1
						fprintf(outfile, "%s", (char*)txt.data);
Packit Service 4684c1
						gnutls_free(txt.data);
Packit Service 4684c1
					}
Packit Service 4684c1
				} else {
Packit Service 4684c1
					fprintf(outfile, "\tAttached extensions:");
Packit Service 4684c1
					for (j=0;j
Packit Service 4684c1
						fprintf(outfile, "%s%s", exts[j].oid, (j!=exts_size-1)?",":" ");
Packit Service 4684c1
					}
Packit Service 4684c1
				}
Packit Service 4684c1
				for (j=0;j
Packit Service 4684c1
					gnutls_x509_ext_deinit(&exts[j]);
Packit Service 4684c1
				}
Packit Service 4684c1
				gnutls_free(exts);
Packit Service 4684c1
				fprintf(outfile, "\n");
Packit Service 4684c1
			}
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
		fprintf(outfile, "\n");
Packit Service 4684c1
		gnutls_pkcs11_obj_deinit(crt_list[i]);
Packit Service 4684c1
	}
Packit Service 4684c1
	gnutls_free(crt_list);
Packit Service 4684c1
Packit Service 4684c1
	UNFIX;
Packit Service 4684c1
	return;
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
#define TEST_DATA "Test data to sign"
Packit Service 4684c1
Packit Service 4684c1
void
Packit Service 4684c1
pkcs11_test_sign(FILE * outfile, const char *url, unsigned int flags,
Packit Service 4684c1
	    common_info_st * info)
Packit Service 4684c1
{
Packit Service 4684c1
	gnutls_privkey_t privkey;
Packit Service 4684c1
	gnutls_pubkey_t pubkey;
Packit Service 4684c1
	int ret;
Packit Service 4684c1
	gnutls_datum_t data, sig = {NULL, 0};
Packit Service 4684c1
	int pk;
Packit Service 4684c1
	gnutls_digest_algorithm_t hash;
Packit Service 4684c1
	gnutls_sign_algorithm_t sig_algo;
Packit Service 4684c1
Packit Service 4684c1
	pkcs11_common(info);
Packit Service 4684c1
Packit Service 4684c1
	FIX(url, outfile, 0, info);
Packit Service 4684c1
Packit Service 4684c1
	data.data = (void*)TEST_DATA;
Packit Service 4684c1
	data.size = sizeof(TEST_DATA)-1;
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_privkey_init(&privkey);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "Error in %s:%d: %s\n", __func__,
Packit Service 4684c1
			__LINE__, gnutls_strerror(ret));
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_pubkey_init(&pubkey);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "Error in %s:%d: %s\n", __func__,
Packit Service 4684c1
			__LINE__, gnutls_strerror(ret));
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_privkey_import_url(privkey, url, flags);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "Cannot import private key: %s\n",
Packit Service 4684c1
			gnutls_strerror(ret));
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_pubkey_import_privkey(pubkey, privkey, GNUTLS_KEY_DIGITAL_SIGNATURE, flags);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "Cannot import public key: %s\n",
Packit Service 4684c1
			gnutls_strerror(ret));
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	pk = gnutls_privkey_get_pk_algorithm(privkey, NULL);
Packit Service 4684c1
Packit Service 4684c1
	if (info->hash == GNUTLS_DIG_UNKNOWN)
Packit Service 4684c1
		hash = GNUTLS_DIG_SHA256;
Packit Service 4684c1
	else
Packit Service 4684c1
		hash = info->hash;
Packit Service 4684c1
Packit Service 4684c1
	if (info->rsa_pss_sign && pk == GNUTLS_PK_RSA)
Packit Service 4684c1
		pk = GNUTLS_PK_RSA_PSS;
Packit Service 4684c1
Packit Service 4684c1
	sig_algo = gnutls_pk_to_sign(pk, hash);
Packit Service 4684c1
	if (sig_algo == GNUTLS_SIGN_UNKNOWN) {
Packit Service 4684c1
		fprintf(stderr, "No supported signature algorithm for %s and %s\n",
Packit Service 4684c1
			gnutls_pk_get_name(pk), gnutls_digest_get_name(hash));
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	fprintf(stderr, "Signing using %s... ", gnutls_sign_get_name(sig_algo));
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_privkey_sign_data2(privkey, sig_algo, 0, &data, &sig);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "Cannot sign data: %s\n",
Packit Service 4684c1
			gnutls_strerror(ret));
Packit Service 4684c1
		/* in case of unsupported signature algorithm allow
Packit Service 4684c1
		 * calling apps to distinguish error codes (used
Packit Service 4684c1
		 * by testpkcs11.sh */
Packit Service 4684c1
		if (ret == GNUTLS_E_UNSUPPORTED_SIGNATURE_ALGORITHM)
Packit Service 4684c1
			app_exit(2);
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	fprintf(stderr, "ok\n");
Packit Service 4684c1
Packit Service 4684c1
	fprintf(stderr, "Verifying against private key parameters... ");
Packit Service 4684c1
	ret = gnutls_pubkey_verify_data2(pubkey, sig_algo,
Packit Service 4684c1
					 0, &data, &sig);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "Cannot verify signed data: %s\n",
Packit Service 4684c1
			gnutls_strerror(ret));
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	fprintf(stderr, "ok\n");
Packit Service 4684c1
Packit Service 4684c1
	/* now try to verify against a public key within the token */
Packit Service 4684c1
	gnutls_pubkey_deinit(pubkey);
Packit Service 4684c1
	ret = gnutls_pubkey_init(&pubkey);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "Error in %s:%d: %s\n", __func__,
Packit Service 4684c1
			__LINE__, gnutls_strerror(ret));
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_pubkey_import_url(pubkey, url, flags);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "Cannot find a corresponding public key object in token: %s\n",
Packit Service 4684c1
			gnutls_strerror(ret));
Packit Service 4684c1
		if (ret == GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE)
Packit Service 4684c1
			app_exit(0);
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	fprintf(stderr, "Verifying against public key in the token... ");
Packit Service 4684c1
	ret = gnutls_pubkey_verify_data2(pubkey, sig_algo,
Packit Service 4684c1
					 0, &data, &sig);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "Cannot verify signed data: %s\n",
Packit Service 4684c1
			gnutls_strerror(ret));
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	fprintf(stderr, "ok\n");
Packit Service 4684c1
Packit Service 4684c1
	gnutls_free(sig.data);
Packit Service 4684c1
	gnutls_pubkey_deinit(pubkey);
Packit Service 4684c1
	gnutls_privkey_deinit(privkey);
Packit Service 4684c1
	UNFIX;
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
void
Packit Service 4684c1
pkcs11_export(FILE * outfile, const char *url, unsigned int flags,
Packit Service 4684c1
	      common_info_st * info)
Packit Service 4684c1
{
Packit Service 4684c1
	gnutls_pkcs11_obj_t obj;
Packit Service 4684c1
	gnutls_datum_t t;
Packit Service 4684c1
	int ret;
Packit Service 4684c1
	unsigned int obj_flags = flags;
Packit Service 4684c1
Packit Service 4684c1
	pkcs11_common(info);
Packit Service 4684c1
Packit Service 4684c1
	FIX(url, outfile, 0, info);
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_pkcs11_obj_init(&obj);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "Error in %s:%d: %s\n", __func__, __LINE__,
Packit Service 4684c1
			gnutls_strerror(ret));
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_pkcs11_obj_import_url(obj, url, obj_flags);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "Error in %s:%d: %s\n", __func__, __LINE__,
Packit Service 4684c1
			gnutls_strerror(ret));
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_pkcs11_obj_export3(obj, info->outcert_format, &t);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "Error in %s:%d: %s\n", __func__,
Packit Service 4684c1
				__LINE__, gnutls_strerror(ret));
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	fwrite(t.data, 1, t.size, outfile);
Packit Service 4684c1
	gnutls_free(t.data);
Packit Service 4684c1
Packit Service 4684c1
	if (info->outcert_format == GNUTLS_X509_FMT_PEM)
Packit Service 4684c1
		fputs("\n\n", outfile);
Packit Service 4684c1
Packit Service 4684c1
	gnutls_pkcs11_obj_deinit(obj);
Packit Service 4684c1
Packit Service 4684c1
	UNFIX;
Packit Service 4684c1
	return;
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
void
Packit Service 4684c1
pkcs11_export_chain(FILE * outfile, const char *url, unsigned int flags,
Packit Service 4684c1
	      common_info_st * info)
Packit Service 4684c1
{
Packit Service 4684c1
	gnutls_pkcs11_obj_t obj;
Packit Service 4684c1
	gnutls_x509_crt_t xcrt;
Packit Service 4684c1
	gnutls_datum_t t;
Packit Service 4684c1
	int ret;
Packit Service 4684c1
	unsigned int obj_flags = flags;
Packit Service 4684c1
Packit Service 4684c1
	pkcs11_common(info);
Packit Service 4684c1
Packit Service 4684c1
	FIX(url, outfile, 0, info);
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_pkcs11_obj_init(&obj);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "Error in %s:%d: %s\n", __func__, __LINE__,
Packit Service 4684c1
			gnutls_strerror(ret));
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_pkcs11_obj_import_url(obj, url, obj_flags);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "Error in %s:%d: %s\n", __func__, __LINE__,
Packit Service 4684c1
			gnutls_strerror(ret));
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	/* make a crt */
Packit Service 4684c1
	ret = gnutls_x509_crt_init(&xcrt);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "Error in %s:%d: %s\n", __func__, __LINE__,
Packit Service 4684c1
			gnutls_strerror(ret));
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_x509_crt_import_pkcs11(xcrt, obj);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "Error in %s:%d: %s\n", __func__,
Packit Service 4684c1
				__LINE__, gnutls_strerror(ret));
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_pkcs11_obj_export3(obj, GNUTLS_X509_FMT_PEM, &t);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "Error in %s:%d: %s\n", __func__,
Packit Service 4684c1
				__LINE__, gnutls_strerror(ret));
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
	fwrite(t.data, 1, t.size, outfile);
Packit Service 4684c1
	fputs("\n\n", outfile);
Packit Service 4684c1
	gnutls_free(t.data);
Packit Service 4684c1
Packit Service 4684c1
	gnutls_pkcs11_obj_deinit(obj);
Packit Service 4684c1
Packit Service 4684c1
	do {
Packit Service 4684c1
		ret = gnutls_pkcs11_get_raw_issuer(url, xcrt, &t, GNUTLS_X509_FMT_PEM, 0);
Packit Service 4684c1
		if (ret == GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE)
Packit Service 4684c1
			break;
Packit Service 4684c1
		if (ret < 0) {
Packit Service 4684c1
			fprintf(stderr, "Error in %s:%d: %s\n", __func__,
Packit Service 4684c1
					__LINE__, gnutls_strerror(ret));
Packit Service 4684c1
			app_exit(1);
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
		fwrite(t.data, 1, t.size, outfile);
Packit Service 4684c1
		fputs("\n\n", outfile);
Packit Service 4684c1
Packit Service 4684c1
		gnutls_x509_crt_deinit(xcrt);
Packit Service 4684c1
Packit Service 4684c1
		ret = gnutls_x509_crt_init(&xcrt);
Packit Service 4684c1
		if (ret < 0) {
Packit Service 4684c1
			fprintf(stderr, "Error in %s:%d: %s\n", __func__,
Packit Service 4684c1
					__LINE__, gnutls_strerror(ret));
Packit Service 4684c1
			app_exit(1);
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
		ret = gnutls_x509_crt_import(xcrt, &t, GNUTLS_X509_FMT_PEM);
Packit Service 4684c1
		if (ret < 0) {
Packit Service 4684c1
			fprintf(stderr, "Error in %s:%d: %s\n", __func__,
Packit Service 4684c1
					__LINE__, gnutls_strerror(ret));
Packit Service 4684c1
			app_exit(1);
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
		gnutls_free(t.data);
Packit Service 4684c1
Packit Service 4684c1
		ret = gnutls_x509_crt_check_issuer(xcrt, xcrt);
Packit Service 4684c1
		if (ret != 0) {
Packit Service 4684c1
			/* self signed */
Packit Service 4684c1
			break;
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
	} while(1);
Packit Service 4684c1
Packit Service 4684c1
	UNFIX;
Packit Service 4684c1
	return;
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
/* If there is a single token only present, return its URL.
Packit Service 4684c1
 */
Packit Service 4684c1
static
Packit Service 4684c1
char *get_single_token_url(common_info_st * info)
Packit Service 4684c1
{
Packit Service 4684c1
	int ret;
Packit Service 4684c1
	char *url = NULL, *t = NULL;
Packit Service 4684c1
Packit Service 4684c1
	pkcs11_common(info);
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_pkcs11_token_get_url(0, 0, &url;;
Packit Service 4684c1
	if (ret < 0)
Packit Service 4684c1
		return NULL;
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_pkcs11_token_get_url(1, 0, &t);
Packit Service 4684c1
	if (ret != GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE) {
Packit Service 4684c1
		gnutls_free(t);
Packit Service 4684c1
		gnutls_free(url);
Packit Service 4684c1
		return NULL;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	return url;
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
static
Packit Service 4684c1
void print_type(FILE *outfile, unsigned flags)
Packit Service 4684c1
{
Packit Service 4684c1
	unsigned print = 0;
Packit Service 4684c1
Packit Service 4684c1
	fputs("\tType: ", outfile);
Packit Service 4684c1
	if (flags & GNUTLS_PKCS11_TOKEN_HW) {
Packit Service 4684c1
		fputs("Hardware token", outfile);
Packit Service 4684c1
		print++;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	if (flags & GNUTLS_PKCS11_TOKEN_TRUSTED) {
Packit Service 4684c1
		if (print != 0)
Packit Service 4684c1
			fputs(", ", outfile);
Packit Service 4684c1
		fputs("Trust module", outfile);
Packit Service 4684c1
		print++;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	if (print == 0)
Packit Service 4684c1
		fputs("Generic token", outfile);
Packit Service 4684c1
	fputc('\n', outfile);
Packit Service 4684c1
Packit Service 4684c1
	print = 0;
Packit Service 4684c1
	fputs("\tFlags: ", outfile);
Packit Service 4684c1
	if (flags & GNUTLS_PKCS11_TOKEN_RNG) {
Packit Service 4684c1
		fputs("RNG", outfile);
Packit Service 4684c1
		print++;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	if (flags & GNUTLS_PKCS11_TOKEN_LOGIN_REQUIRED) {
Packit Service 4684c1
		if (print != 0)
Packit Service 4684c1
			fputs(", ", outfile);
Packit Service 4684c1
		fputs("Requires login", outfile);
Packit Service 4684c1
		print++;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	if (flags & GNUTLS_PKCS11_TOKEN_PROTECTED_AUTHENTICATION_PATH) {
Packit Service 4684c1
		if (print != 0)
Packit Service 4684c1
			fputs(", ", outfile);
Packit Service 4684c1
		fputs("External PIN", outfile);
Packit Service 4684c1
		print++;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	if (!(flags & GNUTLS_PKCS11_TOKEN_INITIALIZED)) {
Packit Service 4684c1
		if (print != 0)
Packit Service 4684c1
			fputs(", ", outfile);
Packit Service 4684c1
		fputs("Uninitialized", outfile);
Packit Service 4684c1
		print++;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	if (flags & GNUTLS_PKCS11_TOKEN_USER_PIN_COUNT_LOW) {
Packit Service 4684c1
		if (print != 0)
Packit Service 4684c1
			fputs(", ", outfile);
Packit Service 4684c1
		fputs("uPIN low count", outfile);
Packit Service 4684c1
		print++;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	if (flags & GNUTLS_PKCS11_TOKEN_USER_PIN_FINAL_TRY) {
Packit Service 4684c1
		if (print != 0)
Packit Service 4684c1
			fputs(", ", outfile);
Packit Service 4684c1
		fputs("Final uPIN attempt", outfile);
Packit Service 4684c1
		print++;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	if (flags & GNUTLS_PKCS11_TOKEN_USER_PIN_FINAL_TRY) {
Packit Service 4684c1
		if (print != 0)
Packit Service 4684c1
			fputs(", ", outfile);
Packit Service 4684c1
		fputs("uPIN locked", outfile);
Packit Service 4684c1
		print++;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	if (flags & GNUTLS_PKCS11_TOKEN_SO_PIN_COUNT_LOW) {
Packit Service 4684c1
		if (print != 0)
Packit Service 4684c1
			fputs(", ", outfile);
Packit Service 4684c1
		fputs("SO-PIN low count", outfile);
Packit Service 4684c1
		print++;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	if (flags & GNUTLS_PKCS11_TOKEN_SO_PIN_FINAL_TRY) {
Packit Service 4684c1
		if (print != 0)
Packit Service 4684c1
			fputs(", ", outfile);
Packit Service 4684c1
		fputs("Final SO-PIN attempt", outfile);
Packit Service 4684c1
		print++;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	if (flags & GNUTLS_PKCS11_TOKEN_SO_PIN_FINAL_TRY) {
Packit Service 4684c1
		if (print != 0)
Packit Service 4684c1
			fputs(", ", outfile);
Packit Service 4684c1
		fputs("SO-PIN locked", outfile);
Packit Service 4684c1
		print++;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	if (!(flags & GNUTLS_PKCS11_TOKEN_USER_PIN_INITIALIZED)) {
Packit Service 4684c1
		if (print != 0)
Packit Service 4684c1
			fputs(", ", outfile);
Packit Service 4684c1
		fputs("uPIN uninitialized", outfile);
Packit Service 4684c1
		print++;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	if (flags & GNUTLS_PKCS11_TOKEN_ERROR_STATE) {
Packit Service 4684c1
		if (print != 0)
Packit Service 4684c1
			fputs(", ", outfile);
Packit Service 4684c1
		fputs("Error state", outfile);
Packit Service 4684c1
		print++;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	if (print == 0)
Packit Service 4684c1
		fputs("Generic token", outfile);
Packit Service 4684c1
	fputc('\n', outfile);
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
void
Packit Service 4684c1
pkcs11_token_list(FILE * outfile, unsigned int detailed,
Packit Service 4684c1
		  common_info_st * info, unsigned brief)
Packit Service 4684c1
{
Packit Service 4684c1
	int ret;
Packit Service 4684c1
	int i;
Packit Service 4684c1
	char *url;
Packit Service 4684c1
	char buf[128];
Packit Service 4684c1
	size_t size;
Packit Service 4684c1
	unsigned flags;
Packit Service 4684c1
Packit Service 4684c1
	pkcs11_common(info);
Packit Service 4684c1
Packit Service 4684c1
	for (i = 0;; i++) {
Packit Service 4684c1
		ret = gnutls_pkcs11_token_get_url(i, detailed, &url;;
Packit Service 4684c1
		if (ret == GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE)
Packit Service 4684c1
			break;
Packit Service 4684c1
Packit Service 4684c1
		if (ret < 0) {
Packit Service 4684c1
			fprintf(stderr, "Error in %s:%d: %s\n", __func__,
Packit Service 4684c1
				__LINE__, gnutls_strerror(ret));
Packit Service 4684c1
			app_exit(1);
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
		if (brief != 0) {
Packit Service 4684c1
			fprintf(outfile, "%s\n", url);
Packit Service 4684c1
			goto cont;
Packit Service 4684c1
		} else {
Packit Service 4684c1
			fprintf(outfile, "Token %d:\n\tURL: %s\n", i, url);
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
		size = sizeof(buf);
Packit Service 4684c1
		ret =
Packit Service 4684c1
		    gnutls_pkcs11_token_get_info(url,
Packit Service 4684c1
						 GNUTLS_PKCS11_TOKEN_LABEL,
Packit Service 4684c1
						 buf, &size);
Packit Service 4684c1
		if (ret < 0) {
Packit Service 4684c1
			fprintf(stderr, "Error in %s:%d: %s\n", __func__,
Packit Service 4684c1
				__LINE__, gnutls_strerror(ret));
Packit Service 4684c1
			app_exit(1);
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
		fprintf(outfile, "\tLabel: %s\n", buf);
Packit Service 4684c1
Packit Service 4684c1
		ret = gnutls_pkcs11_token_get_flags(url, &flags);
Packit Service 4684c1
		if (ret < 0) {
Packit Service 4684c1
			fprintf(stderr, "Error in %s:%d: %s\n", __func__,
Packit Service 4684c1
				__LINE__, gnutls_strerror(ret));
Packit Service 4684c1
		} else {
Packit Service 4684c1
			print_type(outfile, flags);
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
		size = sizeof(buf);
Packit Service 4684c1
		ret =
Packit Service 4684c1
		    gnutls_pkcs11_token_get_info(url,
Packit Service 4684c1
						 GNUTLS_PKCS11_TOKEN_MANUFACTURER,
Packit Service 4684c1
						 buf, &size);
Packit Service 4684c1
		if (ret < 0) {
Packit Service 4684c1
			fprintf(stderr, "Error in %s:%d: %s\n", __func__,
Packit Service 4684c1
				__LINE__, gnutls_strerror(ret));
Packit Service 4684c1
			app_exit(1);
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
		fprintf(outfile, "\tManufacturer: %s\n", buf);
Packit Service 4684c1
Packit Service 4684c1
		size = sizeof(buf);
Packit Service 4684c1
		ret =
Packit Service 4684c1
		    gnutls_pkcs11_token_get_info(url,
Packit Service 4684c1
						 GNUTLS_PKCS11_TOKEN_MODEL,
Packit Service 4684c1
						 buf, &size);
Packit Service 4684c1
		if (ret < 0) {
Packit Service 4684c1
			fprintf(stderr, "Error in %s:%d: %s\n", __func__,
Packit Service 4684c1
				__LINE__, gnutls_strerror(ret));
Packit Service 4684c1
			app_exit(1);
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
		fprintf(outfile, "\tModel: %s\n", buf);
Packit Service 4684c1
Packit Service 4684c1
		size = sizeof(buf);
Packit Service 4684c1
		ret =
Packit Service 4684c1
		    gnutls_pkcs11_token_get_info(url,
Packit Service 4684c1
						 GNUTLS_PKCS11_TOKEN_SERIAL,
Packit Service 4684c1
						 buf, &size);
Packit Service 4684c1
		if (ret < 0) {
Packit Service 4684c1
			fprintf(stderr, "Error in %s:%d: %s\n", __func__,
Packit Service 4684c1
				__LINE__, gnutls_strerror(ret));
Packit Service 4684c1
			app_exit(1);
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
		fprintf(outfile, "\tSerial: %s\n", buf);
Packit Service 4684c1
Packit Service 4684c1
		size = sizeof(buf);
Packit Service 4684c1
		ret =
Packit Service 4684c1
		    gnutls_pkcs11_token_get_info(url,
Packit Service 4684c1
						 GNUTLS_PKCS11_TOKEN_MODNAME,
Packit Service 4684c1
						 buf, &size);
Packit Service 4684c1
		if (ret >= 0) {
Packit Service 4684c1
			fprintf(outfile, "\tModule: %s\n", buf);
Packit Service 4684c1
		}
Packit Service 4684c1
		fprintf(outfile, "\n\n");
Packit Service 4684c1
 cont:
Packit Service 4684c1
		gnutls_free(url);
Packit Service 4684c1
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	return;
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
static void find_same_pubkey_with_id(const char *url, gnutls_x509_crt_t crt, gnutls_datum_t *cid, unsigned flags)
Packit Service 4684c1
{
Packit Service 4684c1
	gnutls_pkcs11_obj_t *obj_list;
Packit Service 4684c1
	unsigned int obj_list_size = 0, i;
Packit Service 4684c1
	int ret;
Packit Service 4684c1
	gnutls_datum_t praw = {NULL, 0};
Packit Service 4684c1
	gnutls_datum_t praw2 = {NULL, 0};
Packit Service 4684c1
	gnutls_pubkey_t pubkey;
Packit Service 4684c1
	uint8_t buf[128];
Packit Service 4684c1
	size_t size;
Packit Service 4684c1
	char *purl;
Packit Service 4684c1
	unsigned otype;
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_pubkey_init(&pubkey);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "memory error\n");
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_pubkey_import_x509(pubkey, crt, 0);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "error: cannot import public key from certificate\n");
Packit Service 4684c1
		gnutls_pubkey_deinit(pubkey);
Packit Service 4684c1
		return;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_pubkey_export2(pubkey, GNUTLS_X509_FMT_DER, &praw;;
Packit Service 4684c1
	gnutls_pubkey_deinit(pubkey);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "error: cannot export public key\n");
Packit Service 4684c1
		return;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	ret =
Packit Service 4684c1
	    gnutls_pkcs11_obj_list_import_url4(&obj_list, &obj_list_size,
Packit Service 4684c1
					       url, GNUTLS_PKCS11_OBJ_FLAG_PUBKEY|flags);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "Error in obj_list_import (1): %s\n",
Packit Service 4684c1
			gnutls_strerror(ret));
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	if (obj_list_size == 0)
Packit Service 4684c1
		return;
Packit Service 4684c1
Packit Service 4684c1
	for (i = 0; i < obj_list_size; i++) {
Packit Service 4684c1
		purl = NULL;
Packit Service 4684c1
Packit Service 4684c1
		otype = gnutls_pkcs11_obj_get_type(obj_list[i]);
Packit Service 4684c1
		if (otype != GNUTLS_PKCS11_OBJ_PUBKEY)
Packit Service 4684c1
			goto cont;
Packit Service 4684c1
Packit Service 4684c1
		ret =
Packit Service 4684c1
		    gnutls_pkcs11_obj_export_url(obj_list[i], 0,
Packit Service 4684c1
						 &purl);
Packit Service 4684c1
		if (ret < 0) {
Packit Service 4684c1
			fprintf(stderr, "Error in %s:%d: %s\n", __func__,
Packit Service 4684c1
				__LINE__, gnutls_strerror(ret));
Packit Service 4684c1
			goto cont;
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
		ret = gnutls_pkcs11_obj_export2(obj_list[i], &praw2);
Packit Service 4684c1
		if (ret < 0) {
Packit Service 4684c1
			fprintf(stderr, "error: cannot export object: %s\n", purl);
Packit Service 4684c1
			goto cont;
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
		if (praw2.size == praw.size && memcmp(praw2.data, praw.data, praw.size) == 0) {
Packit Service 4684c1
			/* found - now extract the CKA_ID */
Packit Service 4684c1
Packit Service 4684c1
			size = sizeof(buf);
Packit Service 4684c1
			ret =
Packit Service 4684c1
			    gnutls_pkcs11_obj_get_info(obj_list[i],
Packit Service 4684c1
					       GNUTLS_PKCS11_OBJ_ID,
Packit Service 4684c1
					       buf, &size);
Packit Service 4684c1
			if (ret < 0) {
Packit Service 4684c1
				fprintf(stderr, "Error in %s:%d: %s\n", __func__,
Packit Service 4684c1
					__LINE__, gnutls_strerror(ret));
Packit Service 4684c1
				app_exit(1);
Packit Service 4684c1
			}
Packit Service 4684c1
Packit Service 4684c1
			cid->data = gnutls_malloc(size);
Packit Service 4684c1
			cid->size = size;
Packit Service 4684c1
			if (cid->data == NULL) {
Packit Service 4684c1
				fprintf(stderr, "memory error\n");
Packit Service 4684c1
				app_exit(1);
Packit Service 4684c1
			}
Packit Service 4684c1
Packit Service 4684c1
			memcpy(cid->data, buf, size);
Packit Service 4684c1
Packit Service 4684c1
			return;
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
 cont:
Packit Service 4684c1
		gnutls_pkcs11_obj_deinit(obj_list[i]);
Packit Service 4684c1
		gnutls_free(purl);
Packit Service 4684c1
	}
Packit Service 4684c1
	gnutls_free(obj_list);
Packit Service 4684c1
Packit Service 4684c1
	UNFIX;
Packit Service 4684c1
	return;
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
static void find_same_privkey_with_id(const char *url, gnutls_x509_crt_t crt, gnutls_datum_t *cid, unsigned flags)
Packit Service 4684c1
{
Packit Service 4684c1
	gnutls_pkcs11_obj_t *obj_list;
Packit Service 4684c1
	unsigned int obj_list_size = 0, i;
Packit Service 4684c1
	int ret;
Packit Service 4684c1
	gnutls_datum_t praw = {NULL, 0};
Packit Service 4684c1
	gnutls_datum_t praw2 = {NULL, 0};
Packit Service 4684c1
	gnutls_pubkey_t pubkey;
Packit Service 4684c1
	gnutls_privkey_t privkey;
Packit Service 4684c1
	uint8_t buf[128];
Packit Service 4684c1
	size_t size;
Packit Service 4684c1
	char *purl;
Packit Service 4684c1
	unsigned otype;
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_pubkey_init(&pubkey);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "memory error\n");
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_pubkey_import_x509(pubkey, crt, 0);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "error: cannot import public key from certificate\n");
Packit Service 4684c1
		gnutls_pubkey_deinit(pubkey);
Packit Service 4684c1
		return;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_pubkey_export2(pubkey, GNUTLS_X509_FMT_DER, &praw;;
Packit Service 4684c1
	gnutls_pubkey_deinit(pubkey);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "error: cannot export public key\n");
Packit Service 4684c1
		return;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	ret =
Packit Service 4684c1
	    gnutls_pkcs11_obj_list_import_url4(&obj_list, &obj_list_size,
Packit Service 4684c1
					       url, GNUTLS_PKCS11_OBJ_FLAG_PRIVKEY|flags);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "Error in obj_list_import (1): %s\n",
Packit Service 4684c1
			gnutls_strerror(ret));
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	if (obj_list_size == 0)
Packit Service 4684c1
		return;
Packit Service 4684c1
Packit Service 4684c1
	for (i = 0; i < obj_list_size; i++) {
Packit Service 4684c1
		purl = NULL;
Packit Service 4684c1
		pubkey = NULL;
Packit Service 4684c1
		privkey = NULL;
Packit Service 4684c1
Packit Service 4684c1
		otype = gnutls_pkcs11_obj_get_type(obj_list[i]);
Packit Service 4684c1
		if (otype != GNUTLS_PKCS11_OBJ_PRIVKEY)
Packit Service 4684c1
			goto cont;
Packit Service 4684c1
Packit Service 4684c1
		ret =
Packit Service 4684c1
		    gnutls_pkcs11_obj_export_url(obj_list[i], 0,
Packit Service 4684c1
						 &purl);
Packit Service 4684c1
		if (ret < 0) {
Packit Service 4684c1
			fprintf(stderr, "Error in %s:%d: %s\n", __func__,
Packit Service 4684c1
				__LINE__, gnutls_strerror(ret));
Packit Service 4684c1
			goto cont;
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
		ret = gnutls_privkey_init(&privkey);
Packit Service 4684c1
		if (ret < 0) {
Packit Service 4684c1
			fprintf(stderr, "memory error\n");
Packit Service 4684c1
			app_exit(1);
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
		ret = gnutls_privkey_import_url(privkey, purl, 0);
Packit Service 4684c1
		if (ret < 0) {
Packit Service 4684c1
			fprintf(stderr, "error: cannot import key: %s: %s\n", purl, gnutls_strerror(ret));
Packit Service 4684c1
			goto cont;
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
		if (gnutls_privkey_get_pk_algorithm(privkey, NULL) != GNUTLS_PK_RSA) {
Packit Service 4684c1
			/* it is not possible to obtain parameters from non-RSA private keys in PKCS#11 */
Packit Service 4684c1
			goto cont;
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
		ret = gnutls_pubkey_init(&pubkey);
Packit Service 4684c1
		if (ret < 0) {
Packit Service 4684c1
			fprintf(stderr, "memory error\n");
Packit Service 4684c1
			app_exit(1);
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
		ret = gnutls_pubkey_import_privkey(pubkey, privkey, 0, 0);
Packit Service 4684c1
		if (ret < 0) {
Packit Service 4684c1
			fprintf(stderr, "error: cannot import key parameters for '%s': %s\n", purl, gnutls_strerror(ret));
Packit Service 4684c1
			goto cont;
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
		ret = gnutls_pubkey_export2(pubkey, GNUTLS_X509_FMT_DER, &praw2);
Packit Service 4684c1
		if (ret < 0) {
Packit Service 4684c1
			fprintf(stderr, "error: cannot export pubkey '%s': %s\n", purl, gnutls_strerror(ret));
Packit Service 4684c1
			goto cont;
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
Packit Service 4684c1
		if (praw2.size == praw.size && memcmp(praw2.data, praw.data, praw.size) == 0) {
Packit Service 4684c1
			/* found - now extract the CKA_ID */
Packit Service 4684c1
Packit Service 4684c1
			size = sizeof(buf);
Packit Service 4684c1
			ret =
Packit Service 4684c1
			    gnutls_pkcs11_obj_get_info(obj_list[i],
Packit Service 4684c1
					       GNUTLS_PKCS11_OBJ_ID,
Packit Service 4684c1
					       buf, &size);
Packit Service 4684c1
			if (ret < 0) {
Packit Service 4684c1
				fprintf(stderr, "Error in %s:%d: %s\n", __func__,
Packit Service 4684c1
					__LINE__, gnutls_strerror(ret));
Packit Service 4684c1
				app_exit(1);
Packit Service 4684c1
			}
Packit Service 4684c1
Packit Service 4684c1
			cid->data = gnutls_malloc(size);
Packit Service 4684c1
			cid->size = size;
Packit Service 4684c1
			if (cid->data == NULL) {
Packit Service 4684c1
				fprintf(stderr, "memory error\n");
Packit Service 4684c1
				app_exit(1);
Packit Service 4684c1
			}
Packit Service 4684c1
Packit Service 4684c1
			memcpy(cid->data, buf, size);
Packit Service 4684c1
Packit Service 4684c1
			return;
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
 cont:
Packit Service 4684c1
		if (privkey)
Packit Service 4684c1
			gnutls_privkey_deinit(privkey);
Packit Service 4684c1
		if (pubkey)
Packit Service 4684c1
			gnutls_pubkey_deinit(pubkey);
Packit Service 4684c1
		gnutls_pkcs11_obj_deinit(obj_list[i]);
Packit Service 4684c1
		gnutls_free(purl);
Packit Service 4684c1
	}
Packit Service 4684c1
	gnutls_free(obj_list);
Packit Service 4684c1
	UNFIX;
Packit Service 4684c1
	return;
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
void
Packit Service 4684c1
pkcs11_write(FILE * outfile, const char *url, const char *label,
Packit Service 4684c1
	     const char *id, unsigned flags, common_info_st * info)
Packit Service 4684c1
{
Packit Service 4684c1
	gnutls_x509_crt_t xcrt;
Packit Service 4684c1
	gnutls_x509_privkey_t xkey;
Packit Service 4684c1
	gnutls_pubkey_t xpubkey;
Packit Service 4684c1
	int ret;
Packit Service 4684c1
	gnutls_datum_t *secret_key;
Packit Service 4684c1
	unsigned key_usage = 0;
Packit Service 4684c1
	unsigned char raw_id[128];
Packit Service 4684c1
	size_t raw_id_size;
Packit Service 4684c1
	gnutls_datum_t cid = {NULL, 0};
Packit Service 4684c1
Packit Service 4684c1
	pkcs11_common(info);
Packit Service 4684c1
Packit Service 4684c1
	FIX(url, outfile, 0, info);
Packit Service 4684c1
Packit Service 4684c1
	CHECK_LOGIN_FLAG(url, flags);
Packit Service 4684c1
	if (label == NULL && info->batch == 0) {
Packit Service 4684c1
		label = read_str("warning: The object's label was not specified.\nLabel: ");
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	if (id != NULL) {
Packit Service 4684c1
		raw_id_size = sizeof(raw_id);
Packit Service 4684c1
		ret = gnutls_hex2bin(id, strlen(id), raw_id, &raw_id_size);
Packit Service 4684c1
		if (ret < 0) {
Packit Service 4684c1
			fprintf(stderr, "Error converting hex: %s\n", gnutls_strerror(ret));
Packit Service 4684c1
			app_exit(1);
Packit Service 4684c1
		}
Packit Service 4684c1
		cid.data = raw_id;
Packit Service 4684c1
		cid.size = raw_id_size;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	secret_key = load_secret_key(0, info);
Packit Service 4684c1
	if (secret_key != NULL) {
Packit Service 4684c1
		ret =
Packit Service 4684c1
		    gnutls_pkcs11_copy_secret_key(url, secret_key, label,
Packit Service 4684c1
						  info->key_usage,
Packit Service 4684c1
						  flags |
Packit Service 4684c1
						  GNUTLS_PKCS11_OBJ_FLAG_MARK_SENSITIVE);
Packit Service 4684c1
		if (ret < 0) {
Packit Service 4684c1
			fprintf(stderr, "Error in %s:%d: %s\n", __func__,
Packit Service 4684c1
				__LINE__, gnutls_strerror(ret));
Packit Service 4684c1
			app_exit(1);
Packit Service 4684c1
		}
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	xcrt = load_cert(0, info);
Packit Service 4684c1
	if (xcrt != NULL) {
Packit Service 4684c1
		if (cid.data == NULL && !(flags & GNUTLS_PKCS11_OBJ_FLAG_MARK_CA) && !(flags & GNUTLS_PKCS11_OBJ_FLAG_MARK_DISTRUSTED)) {
Packit Service 4684c1
			gnutls_datum_t hex;
Packit Service 4684c1
			/* attempting to discover public keys matching this one,
Packit Service 4684c1
			 * and if yes, re-use their ID. We don't do it for CAs (trusted/distrusted
Packit Service 4684c1
			 * or explicitly marked as such. */
Packit Service 4684c1
Packit Service 4684c1
			/* try without login */
Packit Service 4684c1
			find_same_pubkey_with_id(url, xcrt, &cid, 0);
Packit Service 4684c1
Packit Service 4684c1
			if (cid.data == NULL && KEEP_LOGIN_FLAGS(flags))
Packit Service 4684c1
				find_same_pubkey_with_id(url, xcrt, &cid, KEEP_LOGIN_FLAGS(flags));
Packit Service 4684c1
Packit Service 4684c1
			if (cid.data) {
Packit Service 4684c1
				ret = gnutls_hex_encode2(&cid, &hex;;
Packit Service 4684c1
				if (ret < 0) {
Packit Service 4684c1
					fprintf(stderr, "Error converting hex: %s\n", gnutls_strerror(ret));
Packit Service 4684c1
					app_exit(1);
Packit Service 4684c1
				}
Packit Service 4684c1
				fprintf(stderr, "note: will re-use ID %s from corresponding public key\n", hex.data);
Packit Service 4684c1
				gnutls_free(hex.data);
Packit Service 4684c1
Packit Service 4684c1
			} else { /* no luck, try to get a corresponding private key */
Packit Service 4684c1
				find_same_privkey_with_id(url, xcrt, &cid, KEEP_LOGIN_FLAGS(flags));
Packit Service 4684c1
				if (cid.data) {
Packit Service 4684c1
					ret = gnutls_hex_encode2(&cid, &hex;;
Packit Service 4684c1
					if (ret < 0) {
Packit Service 4684c1
						fprintf(stderr, "Error converting hex: %s\n", gnutls_strerror(ret));
Packit Service 4684c1
						app_exit(1);
Packit Service 4684c1
					}
Packit Service 4684c1
					fprintf(stderr, "note: will re-use ID %s from corresponding private key\n", hex.data);
Packit Service 4684c1
					gnutls_free(hex.data);
Packit Service 4684c1
				}
Packit Service 4684c1
			}
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
		ret = gnutls_pkcs11_copy_x509_crt2(url, xcrt, label, &cid, flags);
Packit Service 4684c1
		if (ret < 0) {
Packit Service 4684c1
			fprintf(stderr, "Error writing certificate: %s\n", gnutls_strerror(ret));
Packit Service 4684c1
			if (((flags & GNUTLS_PKCS11_OBJ_FLAG_MARK_CA) ||
Packit Service 4684c1
			     (flags & GNUTLS_PKCS11_OBJ_FLAG_MARK_TRUSTED)) &&
Packit Service 4684c1
			    (flags & GNUTLS_PKCS11_OBJ_FLAG_LOGIN_SO) == 0)
Packit Service 4684c1
				fprintf(stderr, "note: some tokens may require security officer login for this operation\n");
Packit Service 4684c1
			app_exit(1);
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
		gnutls_x509_crt_get_key_usage(xcrt, &key_usage, NULL);
Packit Service 4684c1
		gnutls_x509_crt_deinit(xcrt);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	xkey = load_x509_private_key(0, info);
Packit Service 4684c1
	if (xkey != NULL) {
Packit Service 4684c1
		ret =
Packit Service 4684c1
		    gnutls_pkcs11_copy_x509_privkey2(url, xkey, label,
Packit Service 4684c1
						     &cid, key_usage|info->key_usage,
Packit Service 4684c1
						     flags |
Packit Service 4684c1
						     GNUTLS_PKCS11_OBJ_FLAG_MARK_SENSITIVE);
Packit Service 4684c1
		if (ret < 0) {
Packit Service 4684c1
			fprintf(stderr, "Error in %s:%d: %s\n", __func__,
Packit Service 4684c1
				__LINE__, gnutls_strerror(ret));
Packit Service 4684c1
			app_exit(1);
Packit Service 4684c1
		}
Packit Service 4684c1
		gnutls_x509_privkey_deinit(xkey);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	xpubkey = load_pubkey(0, info);
Packit Service 4684c1
	if (xpubkey != NULL) {
Packit Service 4684c1
		ret =
Packit Service 4684c1
		    gnutls_pkcs11_copy_pubkey(url, xpubkey, label,
Packit Service 4684c1
						     &cid,
Packit Service 4684c1
						     0, flags);
Packit Service 4684c1
		if (ret < 0) {
Packit Service 4684c1
			fprintf(stderr, "Error in %s:%d: %s\n", __func__,
Packit Service 4684c1
				__LINE__, gnutls_strerror(ret));
Packit Service 4684c1
			app_exit(1);
Packit Service 4684c1
		}
Packit Service 4684c1
		gnutls_pubkey_deinit(xpubkey);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	if (xkey == NULL && xcrt == NULL && secret_key == NULL && xpubkey == NULL) {
Packit Service 4684c1
		fprintf(stderr,
Packit Service 4684c1
			"You must use --load-privkey, --load-certificate, --load-pubkey or --secret-key to load the file to be copied\n");
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	UNFIX;
Packit Service 4684c1
	return;
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
void
Packit Service 4684c1
pkcs11_generate(FILE * outfile, const char *url, gnutls_pk_algorithm_t pk,
Packit Service 4684c1
		unsigned int bits,
Packit Service 4684c1
		const char *label, const char *id, int detailed,
Packit Service 4684c1
		unsigned int flags, common_info_st * info)
Packit Service 4684c1
{
Packit Service 4684c1
	int ret;
Packit Service 4684c1
	gnutls_datum_t pubkey;
Packit Service 4684c1
	gnutls_datum_t cid = {NULL, 0};
Packit Service 4684c1
	unsigned char raw_id[128];
Packit Service 4684c1
	size_t raw_id_size;
Packit Service 4684c1
Packit Service 4684c1
	pkcs11_common(info);
Packit Service 4684c1
Packit Service 4684c1
	FIX(url, outfile, detailed, info);
Packit Service 4684c1
Packit Service 4684c1
	CHECK_LOGIN_FLAG(url, flags);
Packit Service 4684c1
Packit Service 4684c1
	if (id != NULL) {
Packit Service 4684c1
		raw_id_size = sizeof(raw_id);
Packit Service 4684c1
		ret = gnutls_hex2bin(id, strlen(id), raw_id, &raw_id_size);
Packit Service 4684c1
		if (ret < 0) {
Packit Service 4684c1
			fprintf(stderr, "Error converting hex: %s\n", gnutls_strerror(ret));
Packit Service 4684c1
			app_exit(1);
Packit Service 4684c1
		}
Packit Service 4684c1
		cid.data = raw_id;
Packit Service 4684c1
		cid.size = raw_id_size;
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	if (outfile == stderr || outfile == stdout) {
Packit Service 4684c1
		fprintf(stderr, "warning: no --outfile was specified and the generated public key will be printed on screen.\n");
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	if (label == NULL && info->batch == 0) {
Packit Service 4684c1
		label = read_str("warning: Label was not specified.\nLabel: ");
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	fprintf(stderr, "Generating an %s key...\n", gnutls_pk_get_name(pk));
Packit Service 4684c1
Packit Service 4684c1
	ret =
Packit Service 4684c1
	    gnutls_pkcs11_privkey_generate3(url, pk, bits, label, &cid,
Packit Service 4684c1
					    GNUTLS_X509_FMT_PEM, &pubkey,
Packit Service 4684c1
					    info->key_usage,
Packit Service 4684c1
					    flags|GNUTLS_PKCS11_OBJ_FLAG_MARK_SENSITIVE);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "Error in %s:%d: %s\n", __func__, __LINE__,
Packit Service 4684c1
			gnutls_strerror(ret));
Packit Service 4684c1
		if (bits != 1024 && pk == GNUTLS_PK_RSA)
Packit Service 4684c1
			fprintf(stderr,
Packit Service 4684c1
				"note: several smart cards do not support arbitrary size keys; try --bits 1024 or 2048.\n");
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	fwrite(pubkey.data, 1, pubkey.size, outfile);
Packit Service 4684c1
	gnutls_free(pubkey.data);
Packit Service 4684c1
Packit Service 4684c1
	UNFIX;
Packit Service 4684c1
	return;
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
void
Packit Service 4684c1
pkcs11_export_pubkey(FILE * outfile, const char *url, int detailed, unsigned int flags, common_info_st * info)
Packit Service 4684c1
{
Packit Service 4684c1
	int ret;
Packit Service 4684c1
	gnutls_datum_t pubkey;
Packit Service 4684c1
	gnutls_pkcs11_privkey_t pkey;
Packit Service 4684c1
Packit Service 4684c1
	pkcs11_common(info);
Packit Service 4684c1
Packit Service 4684c1
	FIX(url, outfile, detailed, info);
Packit Service 4684c1
Packit Service 4684c1
	CHECK_LOGIN_FLAG(url, flags);
Packit Service 4684c1
Packit Service 4684c1
	if (outfile == stderr || outfile == stdout) {
Packit Service 4684c1
		fprintf(stderr, "warning: no --outfile was specified and the public key will be printed on screen.\n");
Packit Service 4684c1
		sleep(3);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_pkcs11_privkey_init(&pkey);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "Error in %s:%d: %s\n", __func__, __LINE__,
Packit Service 4684c1
			gnutls_strerror(ret));
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_pkcs11_privkey_import_url(pkey, url, 0);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "Error in %s:%d: %s\n", __func__, __LINE__,
Packit Service 4684c1
			gnutls_strerror(ret));
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	ret =
Packit Service 4684c1
	    gnutls_pkcs11_privkey_export_pubkey(pkey,
Packit Service 4684c1
						GNUTLS_X509_FMT_PEM, &pubkey,
Packit Service 4684c1
						flags);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "Error in %s:%d: %s\n", __func__, __LINE__,
Packit Service 4684c1
			gnutls_strerror(ret));
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
	gnutls_pkcs11_privkey_deinit(pkey);
Packit Service 4684c1
Packit Service 4684c1
	fwrite(pubkey.data, 1, pubkey.size, outfile);
Packit Service 4684c1
	gnutls_free(pubkey.data);
Packit Service 4684c1
Packit Service 4684c1
	UNFIX;
Packit Service 4684c1
	return;
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
void
Packit Service 4684c1
pkcs11_init(FILE * outfile, const char *url, const char *label,
Packit Service 4684c1
	    common_info_st * info)
Packit Service 4684c1
{
Packit Service 4684c1
	int ret;
Packit Service 4684c1
	char so_pin[MAX_PIN_LEN];
Packit Service 4684c1
Packit Service 4684c1
	pkcs11_common(info);
Packit Service 4684c1
Packit Service 4684c1
	if (url == NULL) {
Packit Service 4684c1
		fprintf(stderr, "error: no token URL given to initialize!\n");
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	if (label == NULL) {
Packit Service 4684c1
		fprintf(stderr, "error: no label provided for token initialization!\n");
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	if (info->so_pin != NULL) {
Packit Service 4684c1
		snprintf(so_pin, sizeof(so_pin), "%s", info->so_pin);
Packit Service 4684c1
	} else {
Packit Service 4684c1
		getenv_copy(so_pin, sizeof(so_pin), "GNUTLS_SO_PIN");
Packit Service 4684c1
		if (so_pin[0] == 0 && info->batch == 0)
Packit Service 4684c1
			getpass_copy(so_pin, sizeof(so_pin), "Enter Security Officer's PIN: ");
Packit Service 4684c1
		if (so_pin[0] == 0)
Packit Service 4684c1
			app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	if (so_pin[0] == '\n' || so_pin[0] == 0)
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
Packit Service 4684c1
	fprintf(stderr, "Initializing token... ");
Packit Service 4684c1
	ret = gnutls_pkcs11_token_init(url, so_pin, label);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "\nError in %s:%d: %s\n", __func__, __LINE__,
Packit Service 4684c1
			gnutls_strerror(ret));
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
	fprintf(stderr, "done\n");
Packit Service 4684c1
Packit Service 4684c1
	fprintf(stderr, "\nToken was successfully initialized; use --initialize-pin and --initialize-so-pin to set or reset PINs\n");
Packit Service 4684c1
Packit Service 4684c1
	return;
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
void
Packit Service 4684c1
pkcs11_set_token_pin(FILE * outfile, const char *url, common_info_st * info, unsigned so)
Packit Service 4684c1
{
Packit Service 4684c1
	int ret;
Packit Service 4684c1
	char newpin[MAX_PIN_LEN] = "";
Packit Service 4684c1
Packit Service 4684c1
	pkcs11_common(info);
Packit Service 4684c1
Packit Service 4684c1
	if (url == NULL) {
Packit Service 4684c1
		fprintf(stderr, "error: no token URL given to initialize!\n");
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	if (so)
Packit Service 4684c1
		fprintf(stderr, "Setting admin's PIN...\n");
Packit Service 4684c1
	else
Packit Service 4684c1
		fprintf(stderr, "Setting user's PIN...\n");
Packit Service 4684c1
Packit Service 4684c1
	if (so) {
Packit Service 4684c1
		getenv_copy(newpin, sizeof(newpin), "GNUTLS_NEW_SO_PIN");
Packit Service 4684c1
		if (newpin[0] == 0 && info->batch == 0) {
Packit Service 4684c1
			getpass_copy(newpin, sizeof(newpin), "Enter Administrators's new PIN: ");
Packit Service 4684c1
		}
Packit Service 4684c1
	} else {
Packit Service 4684c1
		if (info->pin != NULL) {
Packit Service 4684c1
			snprintf(newpin, sizeof(newpin), "%s", info->pin);
Packit Service 4684c1
		} else {
Packit Service 4684c1
			getenv_copy(newpin, sizeof(newpin), "GNUTLS_PIN");
Packit Service 4684c1
			if (newpin[0] == 0 && info->batch == 0)
Packit Service 4684c1
				getpass_copy(newpin, sizeof(newpin), "Enter User's new PIN: ");
Packit Service 4684c1
		}
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	if (newpin[0] == 0 || newpin[0] == '\n') {
Packit Service 4684c1
		fprintf(stderr, "No PIN was given to change\n");
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_pkcs11_token_set_pin(url, NULL, newpin, (so!=0)?GNUTLS_PIN_SO:GNUTLS_PIN_USER);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "Error in %s:%d: %s\n", __func__, __LINE__,
Packit Service 4684c1
			gnutls_strerror(ret));
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	return;
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
#include "mech-list.h"
Packit Service 4684c1
Packit Service 4684c1
void
Packit Service 4684c1
pkcs11_mechanism_list(FILE * outfile, const char *url, unsigned int flags,
Packit Service 4684c1
		      common_info_st * info)
Packit Service 4684c1
{
Packit Service 4684c1
	int ret;
Packit Service 4684c1
	int idx;
Packit Service 4684c1
	unsigned long mechanism;
Packit Service 4684c1
	const char *str;
Packit Service 4684c1
	CK_MECHANISM_INFO minfo;
Packit Service 4684c1
Packit Service 4684c1
	pkcs11_common(info);
Packit Service 4684c1
Packit Service 4684c1
	FIX(url, outfile, 0, info);
Packit Service 4684c1
Packit Service 4684c1
	idx = 0;
Packit Service 4684c1
	do {
Packit Service 4684c1
		ret =
Packit Service 4684c1
		    gnutls_pkcs11_token_get_mechanism(url, idx++,
Packit Service 4684c1
						      &mechanism);
Packit Service 4684c1
		if (ret >= 0) {
Packit Service 4684c1
			str = NULL;
Packit Service 4684c1
			if (mechanism <
Packit Service 4684c1
			    sizeof(mech_list) / sizeof(mech_list[0]))
Packit Service 4684c1
				str = mech_list[mechanism];
Packit Service 4684c1
			if (str == NULL)
Packit Service 4684c1
				str = "UNKNOWN";
Packit Service 4684c1
Packit Service 4684c1
			fprintf(outfile, "[0x%.4lx] %s", mechanism, str);
Packit Service 4684c1
Packit Service 4684c1
			if (gnutls_pkcs11_token_check_mechanism(url, mechanism, &minfo, sizeof(minfo), 0) != 0) {
Packit Service 4684c1
				if (minfo.ulMaxKeySize != 0)
Packit Service 4684c1
					fprintf(outfile, " keysize range (%ld, %ld)", minfo.ulMinKeySize, minfo.ulMaxKeySize);
Packit Service 4684c1
				if (minfo.flags & CKF_HW)
Packit Service 4684c1
					printf(" hw");
Packit Service 4684c1
				if (minfo.flags & CKF_ENCRYPT)
Packit Service 4684c1
					printf(" encrypt");
Packit Service 4684c1
				if (minfo.flags & CKF_DECRYPT)
Packit Service 4684c1
					printf(" decrypt");
Packit Service 4684c1
				if (minfo.flags & CKF_DIGEST)
Packit Service 4684c1
					printf(" digest");
Packit Service 4684c1
				if (minfo.flags & CKF_SIGN)
Packit Service 4684c1
					printf(" sign");
Packit Service 4684c1
				if (minfo.flags & CKF_SIGN_RECOVER)
Packit Service 4684c1
					printf(" sign_recover");
Packit Service 4684c1
				if (minfo.flags & CKF_VERIFY)
Packit Service 4684c1
					printf(" verify");
Packit Service 4684c1
				if (minfo.flags & CKF_VERIFY_RECOVER)
Packit Service 4684c1
					printf(" verify_recover");
Packit Service 4684c1
				if (minfo.flags & CKF_GENERATE)
Packit Service 4684c1
					printf(" generate");
Packit Service 4684c1
				if (minfo.flags & CKF_GENERATE_KEY_PAIR)
Packit Service 4684c1
					printf(" generate_key_pair");
Packit Service 4684c1
				if (minfo.flags & CKF_WRAP)
Packit Service 4684c1
					printf(" wrap");
Packit Service 4684c1
				if (minfo.flags & CKF_UNWRAP)
Packit Service 4684c1
					printf(" unwrap");
Packit Service 4684c1
				if (minfo.flags & CKF_DERIVE)
Packit Service 4684c1
					printf(" derive");
Packit Service 4684c1
#ifdef CKF_EC_F_P
Packit Service 4684c1
				if (minfo.flags & CKF_EC_F_P)
Packit Service 4684c1
					printf(" ec_f_p");
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifdef CKF_EC_F_2M
Packit Service 4684c1
				if (minfo.flags & CKF_EC_F_2M)
Packit Service 4684c1
					printf(" ec_f_2m");
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifdef CKF_EC_ECPARAMETERS
Packit Service 4684c1
				if (minfo.flags & CKF_EC_ECPARAMETERS)
Packit Service 4684c1
					printf(" ec_ecparameters");
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifdef CKF_EC_NAMEDCURVE
Packit Service 4684c1
				if (minfo.flags & CKF_EC_NAMEDCURVE)
Packit Service 4684c1
					printf(" ec_namedcurve");
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifdef CKF_EC_UNCOMPRESS
Packit Service 4684c1
				if (minfo.flags & CKF_EC_UNCOMPRESS)
Packit Service 4684c1
					printf(" ec_uncompress");
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifdef CKF_EC_COMPRESS
Packit Service 4684c1
				if (minfo.flags & CKF_EC_COMPRESS)
Packit Service 4684c1
					printf(" ec_compress");
Packit Service 4684c1
#endif
Packit Service 4684c1
			}
Packit Service 4684c1
			fprintf(outfile, "\n");
Packit Service 4684c1
		}
Packit Service 4684c1
	}
Packit Service 4684c1
	while (ret >= 0);
Packit Service 4684c1
Packit Service 4684c1
Packit Service 4684c1
	return;
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
void
Packit Service 4684c1
pkcs11_get_random(FILE * outfile, const char *url, unsigned bytes,
Packit Service 4684c1
		  common_info_st * info)
Packit Service 4684c1
{
Packit Service 4684c1
	int ret;
Packit Service 4684c1
	uint8_t *output;
Packit Service 4684c1
Packit Service 4684c1
	pkcs11_common(info);
Packit Service 4684c1
Packit Service 4684c1
	FIX(url, outfile, 0, info);
Packit Service 4684c1
Packit Service 4684c1
	output = malloc(bytes);
Packit Service 4684c1
	if (output == NULL) {
Packit Service 4684c1
		fprintf(stderr, "Memory error\n");
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_pkcs11_token_get_random(url, output, bytes);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "gnutls_pkcs11_token_get_random: %s\n",
Packit Service 4684c1
			gnutls_strerror(ret));
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	fwrite(output, 1, bytes, outfile);
Packit Service 4684c1
	free(output);
Packit Service 4684c1
Packit Service 4684c1
	return;
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
static
Packit Service 4684c1
void pkcs11_set_val(FILE * outfile, const char *url, int detailed,
Packit Service 4684c1
		   unsigned int flags, common_info_st * info,
Packit Service 4684c1
		   gnutls_pkcs11_obj_info_t val_type, const char *val)
Packit Service 4684c1
{
Packit Service 4684c1
	int ret;
Packit Service 4684c1
	gnutls_pkcs11_obj_t obj;
Packit Service 4684c1
Packit Service 4684c1
	pkcs11_common(info);
Packit Service 4684c1
Packit Service 4684c1
	FIX(url, outfile, detailed, info);
Packit Service 4684c1
Packit Service 4684c1
	CHECK_LOGIN_FLAG(url, flags);
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_pkcs11_obj_init(&obj);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "Error in %s:%d: %s\n", __func__, __LINE__,
Packit Service 4684c1
			gnutls_strerror(ret));
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_pkcs11_obj_import_url(obj, url, flags);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "Error in %s:%d: %s\n", __func__, __LINE__,
Packit Service 4684c1
			gnutls_strerror(ret));
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
Packit Service 4684c1
	ret =
Packit Service 4684c1
	    gnutls_pkcs11_obj_set_info(obj, val_type, val, strlen(val), flags);
Packit Service 4684c1
	if (ret < 0) {
Packit Service 4684c1
		fprintf(stderr, "Error in %s:%d: %s\n", __func__, __LINE__,
Packit Service 4684c1
			gnutls_strerror(ret));
Packit Service 4684c1
		app_exit(1);
Packit Service 4684c1
	}
Packit Service 4684c1
	gnutls_pkcs11_obj_deinit(obj);
Packit Service 4684c1
Packit Service 4684c1
	return;
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
void pkcs11_set_id(FILE * outfile, const char *url, int detailed,
Packit Service 4684c1
		   unsigned int flags, common_info_st * info,
Packit Service 4684c1
		   const char *id)
Packit Service 4684c1
{
Packit Service 4684c1
	pkcs11_set_val(outfile, url, detailed, flags, info, GNUTLS_PKCS11_OBJ_ID_HEX, id);
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
void pkcs11_set_label(FILE * outfile, const char *url, int detailed,
Packit Service 4684c1
		   unsigned int flags, common_info_st * info,
Packit Service 4684c1
		   const char *label)
Packit Service 4684c1
{
Packit Service 4684c1
	pkcs11_set_val(outfile, url, detailed, flags, info, GNUTLS_PKCS11_OBJ_LABEL, label);
Packit Service 4684c1
}