⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pkcs15-init.c

📁 读写Smart卡加解密接口的程序
💻 C
📖 第 1 页 / 共 4 页
字号:
	printf("%s required", name);	if (flags & READ_PIN_OPTIONAL)		printf(" (press return for no PIN)");	printf(".\n");	*out = NULL;	while (retries--) {		pin = getpass("Please enter PIN: ");		if (pin == NULL)			return SC_ERROR_INTERNAL;		len = strlen(pin);		if (len == 0 && (flags & READ_PIN_OPTIONAL))			break;		if (info && len < info->min_length) {			error("Password too short (%u characters min)",					info->min_length);			continue;		}		if (info && len > info->max_length) {			error("Password too long (%u characters max)",					info->max_length);			continue;		}		*out = strdup(pin);		if (flags & READ_PIN_RETYPE) {			memset(pin, 0, len);			pin = getpass("Please type again to verify: ");			if (strcmp(*out, pin)) {				fprintf(stderr, "PINs do not match; "					       	"please try again.\n");				free(*out);				*out = NULL;				continue;			}		}		memset(pin, 0, len);		break;	}	if (retries < 0) {		error("Giving up.");		return 0;	}	return 1;}static intget_pin_callback(struct sc_profile *profile,		int id, const struct sc_pkcs15_pin_info *info,		const char *label,		u8 *pinbuf, size_t *pinsize){	char	namebuf[64];	char	*name = NULL, *secret = NULL;	size_t	len = 0;	int	allocated = 0;	if (label) {		snprintf(namebuf, sizeof(namebuf), "PIN [%s]", label);	} else {		snprintf(namebuf, sizeof(namebuf),			"Unspecified PIN [reference %u]",			info->reference);	}	name = namebuf;	if (!ignore_cmdline_pins) {		switch (id) {		case SC_PKCS15INIT_USER_PIN:			name = "User PIN";			secret = opt_pins[OPT_PIN1 & 3]; break;		case SC_PKCS15INIT_USER_PUK:			name = "User PIN unlock key";			secret = opt_pins[OPT_PUK1 & 3]; break;		case SC_PKCS15INIT_SO_PIN:			name = "Security officer PIN";			secret = opt_pins[OPT_PIN2 & 3]; break;		case SC_PKCS15INIT_SO_PUK:			name = "Security officer PIN unlock key";			secret = opt_pins[OPT_PUK2 & 3]; break;		}		if (secret)			len = strlen(secret);	}	/* See if we were given --secret @ID=.... */	if (!secret) {		unsigned int	n;		for (n = 0; n < opt_secret_count; n++) {			struct secret	*s = &opt_secrets[n];			if (sc_pkcs15_compare_id(&info->auth_id, &s->id)) {				secret = (char *) s->key;				len = s->len;				break;			}		}	}	if (!secret) {		if (!read_one_pin(profile, name, NULL, 0, &secret))			return SC_ERROR_INTERNAL;		len = strlen(secret);		allocated = 1;	}	if (len > *pinsize)		return SC_ERROR_BUFFER_TOO_SMALL;	memcpy(pinbuf, secret, len + 1);	*pinsize = len;	if (allocated)		free(secret);	return 0;}intget_key_callback(struct sc_profile *profile,			int method, int reference,			const u8 *def_key, size_t def_key_size,			u8 *key_buf, size_t *buf_size){	const char	*kind, *prompt, *key;	if (def_key_size && opt_use_defkeys) {use_default_key:		if (*buf_size < def_key_size)			return SC_ERROR_BUFFER_TOO_SMALL;		memcpy(key_buf, def_key, def_key_size);		*buf_size = def_key_size;		return 0;	}	switch (method) {	case SC_AC_PRO:		kind = "Secure messaging key";		break;	case SC_AC_AUT:		kind = "External authentication key";		break;	default: /* don't really know what sort of key */		kind = "Key";		break;	}	printf("Transport key (%s #%d) required.\n", kind, reference);	if (opt_no_prompt) {		printf("\n"		"Refusing to prompt for transport key because --no-prompt\n"		"was specified on the command line. Please invoke without\n"		"--no-prompt, or specify the --use-default-transport-keys\n"		"option to use the default transport keys without being\n"		"prompted.\n");		fprintf(stderr, "Aborting.\n");		exit(1);	}	printf("Please enter key in hexadecimal notation "	       "(e.g. 00:11:22:aa:bb:cc)%s.\n\n",	       def_key_size? ",\nor press return to accept default" : "");	printf("To use the default transport keys without being prompted,\n"	       "specify the --use-default-transport-keys option on the\n"	       "command line (or -T for short), or press Ctrl-C to abort.\n");	while (1) {		char	buffer[256];		prompt = "Please enter key";		if (def_key_size && def_key_size < 64) {			unsigned int	j, k = 0;			sprintf(buffer, "%s [", prompt);			k = strlen(buffer);			for (j = 0; j < def_key_size; j++, k += 2) {				if (j) buffer[k++] = ':';				sprintf(buffer+k, "%02x", def_key[j]);			}			buffer[k++] = ']';			buffer[k++] = '\0';			prompt = buffer;		}#ifdef GET_KEY_ECHO_OFF		/* Read key with echo off - will users really manage? */		key = getpass(prompt);#else		printf("%s: ", prompt);		fflush(stdout);		key = fgets(buffer, sizeof(buffer), stdin);		if (key)			buffer[strcspn(buffer, "\r\n")] = '\0';#endif		if (key == NULL)			return SC_ERROR_INTERNAL;		if (key[0] == '\0' && def_key_size)			goto use_default_key;		if (sc_hex_to_bin(key, key_buf, buf_size) >= 0)			return 0;	}}/* * Generate a private key */intdo_generate_key_soft(int algorithm, unsigned int bits, EVP_PKEY **res){	*res = EVP_PKEY_new();	switch (algorithm) {	case EVP_PKEY_RSA: {			RSA	*rsa;			BIO	*err;			err = BIO_new(BIO_s_mem());			rsa = RSA_generate_key(bits, 0x10001, NULL, err);			BIO_free(err);			if (rsa == 0)				fatal("RSA key generation error");			EVP_PKEY_assign_RSA(*res, rsa);			break;		}	case EVP_PKEY_DSA: {			DSA	*dsa;			int	r = 0;			dsa = DSA_generate_parameters(bits,					NULL, 0, NULL,					NULL, NULL, NULL);			if (dsa)				r = DSA_generate_key(dsa);			if (r == 0 || dsa == 0)				fatal("DSA key generation error");			EVP_PKEY_assign_DSA(*res, dsa);			break;		}	default:		fatal("Unable to generate key: unsupported algorithm");	}	return 0;}/* * Read a private key */static intdo_read_pem_private_key(const char *filename, const char *passphrase,			EVP_PKEY **key){	BIO	*bio;	bio = BIO_new(BIO_s_file());	if (BIO_read_filename(bio, filename) < 0)		fatal("Unable to open %s: %m", filename);	*key = PEM_read_bio_PrivateKey(bio, 0, 0, (char *) passphrase);	BIO_free(bio);	if (*key == NULL) {		ossl_print_errors();		return SC_ERROR_CANNOT_LOAD_KEY;	}	return 0;}static intdo_read_pkcs12_private_key(const char *filename, const char *passphrase,			EVP_PKEY **key, X509 **certs, unsigned int max_certs){	BIO		*bio;	PKCS12		*p12;	EVP_PKEY	*user_key = NULL;	X509		*user_cert = NULL;	STACK_OF(X509)	*cacerts = NULL;	int		i, ncerts = 0;	*key = NULL;	bio = BIO_new(BIO_s_file());	if (BIO_read_filename(bio, filename) < 0)		fatal("Unable to open %s: %m", filename);	p12 = d2i_PKCS12_bio(bio, NULL);	BIO_free(bio);	if (p12 == NULL	 || !PKCS12_parse(p12, passphrase, &user_key, &user_cert, &cacerts))		goto error;	if (!user_key) {		error("No key in pkcs12 file?!\n");		return SC_ERROR_CANNOT_LOAD_KEY;	}	CRYPTO_add(&user_key->references, 1, CRYPTO_LOCK_EVP_PKEY);	if (user_cert && max_certs)		certs[ncerts++] = user_cert;	/* Extract CA certificates, if any */	for(i = 0; cacerts && ncerts < max_certs && i < sk_X509_num(cacerts); i++)		certs[ncerts++] = sk_X509_value(cacerts, i);	/* bump reference counts for certificates */	for (i = 0; i < ncerts; i++) {		CRYPTO_add(&certs[i]->references, 1, CRYPTO_LOCK_X509);	}	if (cacerts)		sk_X509_free(cacerts);	*key = user_key;	return ncerts;error:	ossl_print_errors();	return SC_ERROR_CANNOT_LOAD_KEY;}static intdo_read_private_key(const char *filename, const char *format,			EVP_PKEY **pk, X509 **certs, unsigned int max_certs){	char	*passphrase = NULL;	int	r;	while (1) {		if (!format || !strcasecmp(format, "pem")) {			r = do_read_pem_private_key(filename, passphrase, pk);		} else if (!strcasecmp(format, "pkcs12")) {			r = do_read_pkcs12_private_key(filename,					passphrase,					pk, certs, max_certs);		} else {			error("Error when reading private key. "			      "Key file format \"%s\" not supported.\n",			      format);			return SC_ERROR_NOT_SUPPORTED;		}		if (r >= 0 || passphrase)			break;		if ((passphrase = opt_passphrase) != 0)			continue;		passphrase = getpass("Please enter passphrase "				     "to unlock secret key: ");		if (!passphrase)			break;	}	if (passphrase)		memset(passphrase, 0, strlen(passphrase));	if (r < 0)		fatal("Unable to read private key from %s\n", filename);	return r;}/* * Read a public key */static EVP_PKEY *do_read_pem_public_key(const char *filename){	BIO		*bio;	EVP_PKEY	*pk;	bio = BIO_new(BIO_s_file());	if (BIO_read_filename(bio, filename) < 0)		fatal("Unable to open %s: %m", filename);	pk = PEM_read_bio_PUBKEY(bio, 0, 0, NULL);	BIO_free(bio);	if (pk == NULL) 		ossl_print_errors();	return pk;}static EVP_PKEY *do_read_der_public_key(const char *filename){	BIO	*bio;	EVP_PKEY *pk;	bio = BIO_new(BIO_s_file());	if (BIO_read_filename(bio, filename) < 0)		fatal("Unable to open %s: %m", filename);	pk = d2i_PUBKEY_bio(bio, NULL);	BIO_free(bio);	if (pk == NULL) 		ossl_print_errors();	return pk;}static intdo_read_public_key(const char *name, const char *format, EVP_PKEY **out){	if (!format || !strcasecmp(format, "pem")) {		*out = do_read_pem_public_key(name);	} else if (!strcasecmp(format, "der")) {		*out = do_read_der_public_key(name);	} else {		fatal("Error when reading public key. "		      "File format \"%s\" not supported.\n",		      format);	}	if (!*out)		fatal("Unable to read public key from %s\n", name);	return 0;}#if 0/* * Write a PEM encoded public key */static intdo_write_pem_public_key(const char *filename, EVP_PKEY *pk){	BIO	*bio;	int	r;	bio = BIO_new(BIO_s_file());	if (BIO_write_filename(bio, (char *) filename) < 0)		fatal("Unable to open %s: %m", filename);	r = PEM_write_bio_PUBKEY(bio, pk);	BIO_free(bio);	if (r == 0) {		ossl_print_errors();		return -1;	}	return 0;}static intdo_write_public_key(const char *filename, const char *format, EVP_PKEY *pk){	int	r;	if (!format || !strcasecmp(format, "pem")) {		r = do_write_pem_public_key(filename, pk);	} else {		error("Error when writing public key. "		      "Key file format \"%s\" not supported.\n",		      format);		r = SC_ERROR_NOT_SUPPORTED;	}	return r;}#endif/* * Read a certificate */static X509 *do_read_pem_certificate(const char *filename){	BIO	*bio;	X509	*xp;	bio = BIO_new(BIO_s_file());	if (BIO_read_filename(bio, filename) < 0)		fatal("Unable to open %s: %m", filename);	xp = PEM_read_bio_X509(bio, 0, 0, 0);	BIO_free(bio);	if (xp == NULL) 		ossl_print_errors();	return xp;}static X509 *do_read_der_certificate(const char *filename){	BIO	*bio;	X509	*xp;	bio = BIO_new(BIO_s_file());	if (BIO_read_filename(bio, filename) < 0)		fatal("Unable to open %s: %m", filename);	xp = d2i_X509_bio(bio, NULL);	BIO_free(bio);	if (xp == NULL) 		ossl_print_errors();	return xp;}static intdo_read_certificate(const char *name, const char *format, X509 **out){

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -