int main() { int r; card_t* card; reader_list* readerList = (reader_list*)malloc(sizeof(reader_list)); r = pcsc_detect_readers(readerList); if( !r==SC_SUCCESS) { printf("pcsc_detect_readers: %s\n",sc_strerror(r)); return -1; } connect_card(readerList->root->reader, &card); card_init(card); csVerifyAdminPIN(card, (unsigned char*)"12345678", 8); csGenerateAndImportKeyPair(card, 2048); return 0; }
int main(int argc, char * const argv[]) { int err = 0, r, c, long_optind = 0; int do_list_readers = 0; int do_list_drivers = 0; int do_list_rdrivers = 0; int do_list_files = 0; int do_send_apdu = 0; int do_print_atr = 0; int do_print_serial = 0; int do_print_name = 0; int action_count = 0; const char *opt_driver = NULL; sc_context_param_t ctx_param; setbuf(stderr, NULL); setbuf(stdout, NULL); while (1) { c = getopt_long(argc, argv, "nlfr:vs:DRc:aw", options, &long_optind); if (c == -1) break; if (c == '?') print_usage_and_die(app_name, options, option_help); switch (c) { case 'l': do_list_readers = 1; action_count++; break; case 'D': do_list_drivers = 1; action_count++; break; case 'R': do_list_rdrivers = 1; action_count++; break; case 'f': do_list_files = 1; action_count++; break; case 's': opt_apdus = (char **) realloc(opt_apdus, (opt_apdu_count + 1) * sizeof(char *)); opt_apdus[opt_apdu_count] = optarg; do_send_apdu++; if (opt_apdu_count == 0) action_count++; opt_apdu_count++; break; case 'a': do_print_atr = 1; action_count++; break; case 'n': do_print_name = 1; action_count++; break; case 'r': opt_reader = atoi(optarg); break; case 'v': verbose++; break; case 'c': opt_driver = optarg; break; case 'w': opt_wait = 1; break; case OPT_SERIAL: do_print_serial = 1; action_count++; break; } } if (action_count == 0) print_usage_and_die(app_name, options, option_help); memset(&ctx_param, 0, sizeof(ctx_param)); ctx_param.ver = 0; ctx_param.app_name = app_name; r = sc_context_create(&ctx, &ctx_param); if (r) { fprintf(stderr, "Failed to establish context: %s\n", sc_strerror(r)); return 1; } if (verbose > 1) ctx->debug = verbose-1; if (do_list_rdrivers) { if ((err = list_reader_drivers())) goto end; action_count--; } if (do_list_readers) { if ((err = list_readers())) goto end; action_count--; } if (do_list_drivers) { if ((err = list_drivers())) goto end; action_count--; } if (action_count <= 0) goto end; if (opt_driver != NULL) { err = sc_set_card_driver(ctx, opt_driver); if (err) { fprintf(stderr, "Driver '%s' not found!\n", opt_driver); err = 1; goto end; } } err = connect_card(ctx, &card, opt_reader, 0, opt_wait, verbose); if (err) goto end; if (do_print_atr) { if (verbose) { printf("Card ATR:\n"); hex_dump_asc(stdout, card->atr, card->atr_len, -1); } else { char tmp[SC_MAX_ATR_SIZE*3]; sc_bin_to_hex(card->atr, card->atr_len, tmp, sizeof(tmp) - 1, ':'); fprintf(stdout,"%s\n",tmp); } action_count--; } if (do_print_serial) { if (verbose) printf("Card serial number:"); print_serial(card); action_count--; } if (do_print_name) { if (verbose) printf("Card name: "); printf("%s\n", card->name); action_count--; } if (do_send_apdu) { if ((err = send_apdu())) goto end; action_count--; } if (do_list_files) { if ((err = list_files())) goto end; action_count--; } end: if (card) { sc_unlock(card); sc_disconnect_card(card, 0); } if (ctx) sc_release_context(ctx); return err; }
int main2() { // Seed RNG // Generate Key Pair ERR_load_crypto_strings(); char error[400]; int modulus_length = 2048; // bits unsigned long e = 65537; const char* e_hex = "100001"; RSA *rsa = NULL; rsa = RSA_generate_key(modulus_length, e, NULL /*keygen_progress*/, NULL); if (rsa == NULL) { ERR_error_string(ERR_get_error(), error); printf("Failed to generate RSA key pair.OpenSSL error:\n %s\n", error); return -1; } unsigned char *n_hex = (unsigned char*)calloc(1, 2*2048/8); unsigned char *d_hex = (unsigned char*)calloc(1, 2*2048/8); unsigned char *p_hex = (unsigned char*)calloc(1, 2*2048/8); unsigned char *q_hex = (unsigned char*)calloc(1, 2*2048/8); if (!( n_hex = (unsigned char*) BN_bn2hex((const BIGNUM*)rsa->n) )) { printf("Modulo parsing error\n"); return -1; } if (!( d_hex = (unsigned char*) BN_bn2hex((const BIGNUM*)rsa->d) )) { printf("Private exponent parsing error\n"); return -1; } if (!( p_hex = (unsigned char*) BN_bn2hex((const BIGNUM*)rsa->q) )) { printf("Private exponent parsing error\n"); return -1; } if (!( q_hex = (unsigned char*) BN_bn2hex((const BIGNUM*)rsa->p) )) { printf("Private exponent parsing error\n"); return -1; } printf("Public modulus:\n\t%s\n", n_hex); printf("Private exponent:\n\t%s\n", d_hex); printf("Prime p:\n\t%s\n", p_hex); printf("Prime q:\n\t%s\n", q_hex); // Import Key Pair sc_cardctl_openpgp_keystore_info_t key_info; key_info.keytype = SC_OPENPGP_KEY_ENCR; key_info.keyformat = SC_OPENPGP_KEYFORMAT_STD; /* n */ unsigned char* n_bin = (unsigned char*)calloc(1, modulus_length/8); key_info.n_len = BN_bn2bin(rsa->n, n_bin); key_info.n = n_bin; /* e */ key_info.e = (u8*)calloc(1, 4); hex_to_bin(e_hex, key_info.e, &(key_info.e_len)); /* p */ unsigned char* p_bin = (unsigned char*)calloc(1, strlen((const char*)p_hex)/2); key_info.p_len = BN_bn2bin(rsa->p, p_bin); key_info.p = p_bin; /* q */ unsigned char* q_bin = (unsigned char*)calloc(1, strlen((const char*)q_hex)/2); key_info.q_len = BN_bn2bin(rsa->q, q_bin); key_info.q = q_bin; printf("Lengths: n = %lu\ne= %lu\np = %lu\nq = %lu\n",key_info.n_len, key_info.e_len, key_info.p_len, key_info.q_len); // List readers int r; card_t* card; reader_list* readerList = (reader_list*)malloc(sizeof(reader_list)); r = pcsc_detect_readers(readerList); if( !r==SC_SUCCESS) { printf("pcsc_detect_readers: %s\n",sc_strerror(r)); return -1; } connect_card(readerList->root->reader, &card); card_init(card); csVerifyAdminPIN(card, (unsigned char*)"12345678", 8); if( (r = pgp_store_key(card, &key_info)) != 0) printf("pgp_store_key error: %d\n",r); // Cleanups free(rsa); free(n_bin); free(n_hex); free(d_hex); return 0; }
int main(int argc, char * const argv[]) { int r, c, long_optind = 0, err = 0; char *line; int cargc; char *cargv[20]; sc_context_param_t ctx_param; printf("OpenSC Explorer version %s\n", sc_get_version()); while (1) { c = getopt_long(argc, argv, "r:c:vw", options, &long_optind); if (c == -1) break; if (c == '?') print_usage_and_die(app_name, options, option_help); switch (c) { case 'r': opt_reader = atoi(optarg); break; case 'c': opt_driver = optarg; break; case 'w': opt_wait = 1; break; case 'v': verbose++; break; } } memset(&ctx_param, 0, sizeof(ctx_param)); ctx_param.ver = 0; ctx_param.app_name = app_name; r = sc_context_create(&ctx, &ctx_param); if (r) { fprintf(stderr, "Failed to establish context: %s\n", sc_strerror(r)); return 1; } if (verbose > 1) ctx->debug = verbose-1; if (opt_driver != NULL) { err = sc_set_card_driver(ctx, opt_driver); if (err) { fprintf(stderr, "Driver '%s' not found!\n", opt_driver); err = 1; goto end; } } err = connect_card(ctx, &card, opt_reader, 0, opt_wait, 0); if (err) goto end; sc_format_path("3F00", ¤t_path); r = sc_select_file(card, ¤t_path, ¤t_file); if (r) { printf("unable to select MF: %s\n", sc_strerror(r)); return 1; } while (1) { struct command *cmd; size_t i; char prompt[40]; sprintf(prompt, "OpenSC ["); for (i = 0; i < current_path.len; i++) { if ((i & 1) == 0 && i && current_path.type != SC_PATH_TYPE_DF_NAME) sprintf(prompt+strlen(prompt), "/"); sprintf(prompt+strlen(prompt), "%02X", current_path.value[i]); } sprintf(prompt+strlen(prompt), "]> "); line = my_readline(prompt); if (line == NULL) break; cargc = parse_line(line, cargv, DIM(cargv)); if (cargc < 1) continue; for (r=cargc; r < (int)DIM(cargv); r++) cargv[r] = ""; cmd = ambiguous_match(cmds, cargv[0]); if (cmd == NULL) { usage(); } else { cmd->func(cargc-1, cargv+1); } } end: die(err); return 0; /* not reached */ }