📄 pkcs15-init.c
字号:
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 + -