int main(int argc, char **argv) { YK_KEY *yk = NULL; bool error = true; int exit_code = 0; /* Options */ bool verbose = false; char *action = ACTION_ADD_HMAC_CHALRESP; int slot = 1; ykp_errno = 0; yk_errno = 0; if (! parse_args(argc, argv, &slot, &verbose, &action, &exit_code)) goto err; exit_code = 1; if (! strcmp(action, ACTION_ADD_HMAC_CHALRESP)) { /* * Set up challenge-response login authentication */ if (! init_yubikey (&yk)) goto err; if (! check_firmware_version(yk, verbose, false)) goto err; if (! do_add_hmac_chalresp (yk, slot, verbose, NULL, &exit_code)) goto err; } else { fprintf (stderr, "Unknown action '%s'\n", action); goto err; } exit_code = 0; error = false; err: if (error || exit_code != 0) { report_yk_error (); } if (yk && !yk_close_key (yk)) { report_yk_error (); exit_code = 2; } if (!yk_release ()) { report_yk_error (); exit_code = 2; } exit (exit_code); }
int main(int argc, char **argv) { YK_KEY *yk = NULL; bool error = true; int exit_code = 0; /* Options */ bool verbose = false; char action[ACTION_MAX_LEN]; char *ptr = action; char *output_dir = NULL; int slot = 1; unsigned int iterations = CR_DEFAULT_ITERATIONS; ykp_errno = 0; yk_errno = 0; strcpy (action, ACTION_ADD_HMAC_CHALRESP); if (! parse_args(argc, argv, &slot, &verbose, &ptr, &output_dir, &iterations)) goto err; exit_code = 1; if (! strncmp(action, ACTION_ADD_HMAC_CHALRESP, ACTION_MAX_LEN)) { /* * Set up challenge-response login authentication */ if (! init_yubikey (&yk)) goto err; if (! check_firmware_version(yk, verbose, false)) goto err; if (! do_add_hmac_chalresp (yk, slot, verbose, output_dir, iterations, &exit_code)) goto err; } else { fprintf (stderr, "Unknown action '%s'\n", action); goto err; } exit_code = 0; error = false; err: if (error || exit_code != 0) { report_yk_error (); } if (yk && !yk_close_key (yk)) { report_yk_error (); exit_code = 2; } if (!yk_release ()) { report_yk_error (); exit_code = 2; } exit (exit_code); }
int main(int argc, char **argv) { YK_KEY *yk = 0; bool error = true; int exit_code = 0; /* Options */ bool verbose = false; bool may_block = true; char *otp_fmt_raw = "%%0%uu\n"; char otp_fmt_str[6]; int slot = 1; int digits = 6; // default to 6 digit OTP output int step = 30; // defaultto 30 second step unsigned int result; ykp_errno = 0; yk_errno = 0; if (! parse_args(argc, argv, &slot, &digits, &step, &verbose, &may_block, &exit_code)) goto err; if (!yk_init()) { exit_code = 1; goto err; } if (!(yk = yk_open_first_key())) { exit_code = 1; goto err; } if (! check_firmware(yk, verbose)) { exit_code = 1; goto err; } if (! totp_challenge(yk, slot, digits, step, may_block, verbose, &result)) { exit_code = 1; goto err; } sprintf(otp_fmt_str, otp_fmt_raw, digits); // create a print mask to zero padding to the right number of digits printf(otp_fmt_str, result); exit_code = 0; error = false; err: if (error || exit_code != 0) { report_yk_error(); } if (yk && !yk_close_key(yk)) { report_yk_error(); exit_code = 2; } if (!yk_release()) { report_yk_error(); exit_code = 2; } exit(exit_code); }
int main(int argc, char **argv) { YK_KEY *yk = 0; bool error = true; int exit_code = 0; /* Options */ bool serial_dec = false; bool serial_modhex = false; bool serial_hex = false; bool version = false; bool touch_level = false; bool pgm_seq = false; bool slot1 = false; bool slot2 = false; bool vid = false; bool pid = false; bool quiet = false; yk_errno = 0; if (! parse_args(argc, argv, &serial_dec, &serial_modhex, &serial_hex, &version, &touch_level, &pgm_seq, &quiet, &slot1, &slot2, &vid, &pid, &exit_code)) exit(exit_code); if (!yk_init()) { exit_code = 1; goto err; } if (!(yk = yk_open_first_key())) { exit_code = 1; goto err; } if(serial_dec || serial_modhex || serial_hex) { unsigned int serial; int ret = yk_get_serial(yk, 1, 0, &serial); if(!ret) { exit_code = 1; goto err; } if(serial_dec) { if(!quiet) printf("serial: "); printf("%d\n", serial); } if(serial_modhex || serial_hex) { char buf[64]; char hex_serial[64]; char modhex_serial[64]; char *ptr = buf; int chars = snprintf(buf + 1, 63, "%x", serial); if(chars % 2 == 1) { buf[0] = '0'; } else { ptr += 1; } if(serial_hex) { if(!quiet) printf("serial_hex: "); printf("%s\n", ptr); } if(serial_modhex) { yubikey_hex_decode(hex_serial, ptr, strlen(ptr)); yubikey_modhex_encode(modhex_serial, hex_serial, strlen(hex_serial)); if(!quiet) printf("serial_modhex: "); printf("%s\n", modhex_serial); } } } if(version || touch_level || pgm_seq || slot1 || slot2) { YK_STATUS *st = ykds_alloc(); if(!yk_get_status(yk, st)) { ykds_free(st); exit_code = 1; goto err; } if(version) { if(!quiet) printf("version: "); printf("%d.%d.%d\n", ykds_version_major(st), ykds_version_minor(st), ykds_version_build(st)); } if(touch_level) { if(!quiet) printf("touch_level: "); printf("%d\n", ykds_touch_level(st)); } if(pgm_seq) { if(!quiet) printf("programming_sequence: "); printf("%d\n", ykds_pgm_seq(st)); } if(slot1) { if(!quiet) printf("slot1_status: "); printf("%d\n", (ykds_touch_level(st) & CONFIG1_VALID) == CONFIG1_VALID); } if(slot2) { if(!quiet) printf("slot2_status: "); printf("%d\n", (ykds_touch_level(st) & CONFIG2_VALID) == CONFIG2_VALID); } ykds_free(st); } if(vid || pid) { int vendor_id, product_id; if(!yk_get_key_vid_pid(yk, &vendor_id, &product_id)) { exit_code = 1; goto err; } if(vid) { if(!quiet) printf("vendor_id: "); printf("%x\n", vendor_id); } if(pid) { if(!quiet) printf("product_id: "); printf("%x\n", product_id); } } exit_code = 0; error = false; err: if (error || exit_code != 0) { report_yk_error(); } if (yk && !yk_close_key(yk)) { report_yk_error(); exit_code = 2; } if (!yk_release()) { report_yk_error(); exit_code = 2; } exit(exit_code); }
int main(int argc, char **argv) { YK_KEY *yk = 0; bool error = true; int exit_code = 0; /* Options */ bool serial_dec = false; bool serial_modhex = false; bool serial_hex = false; bool version = false; bool touch_level = false; bool pgm_seq = false; bool quiet = false; yk_errno = 0; if (! parse_args(argc, argv, &serial_dec, &serial_modhex, &serial_hex, &version, &touch_level, &pgm_seq, &quiet, &exit_code)) exit(exit_code); if (!yk_init()) { exit_code = 1; goto err; } if (!(yk = yk_open_first_key())) { exit_code = 1; goto err; } if(serial_dec || serial_modhex || serial_hex) { unsigned int serial; int ret = yk_get_serial(yk, 1, 0, &serial); if(!ret) { exit_code = 1; goto err; } if(serial_dec) { if(!quiet) printf("serial: "); printf("%d\n", serial); } if(serial_hex) { if(!quiet) printf("serial_hex: "); printf("%x\n", serial); } if(serial_modhex) { char buf[64]; char hex_serial[64]; char modhex_serial[64]; snprintf(buf, 64, "%x", serial); yubikey_hex_decode(hex_serial, buf, strlen(buf)); yubikey_modhex_encode(modhex_serial, hex_serial, strlen(hex_serial)); if(!quiet) printf("serial_modhex: "); printf("%s\n", modhex_serial); } } if(version || touch_level || pgm_seq) { YK_STATUS *st = ykds_alloc(); if(!yk_get_status(yk, st)) { ykds_free(st); exit_code = 1; goto err; } if(version) { if(!quiet) printf("version: "); printf("%d.%d.%d\n", ykds_version_major(st), ykds_version_minor(st), ykds_version_build(st)); } if(touch_level) { if(!quiet) printf("touch_level: "); printf("%d\n", ykds_touch_level(st)); } if(pgm_seq) { if(!quiet) printf("programming_sequence: "); printf("%d\n", ykds_pgm_seq(st)); } ykds_free(st); } exit_code = 0; error = false; err: if (error || exit_code != 0) { report_yk_error(); } if (yk && !yk_close_key(yk)) { report_yk_error(); exit_code = 2; } if (!yk_release()) { report_yk_error(); exit_code = 2; } exit(exit_code); }
/* Returns 0 on error and length of response on success * slot = 1 or 2 (slot on yubikey) * challenge = challenge data (must be 32 bytes) * response = 64 byte buffer */ int yubi_hmac_challenge_response(unsigned char slot, unsigned char *challenge, unsigned char *response) { YK_KEY *yk = NULL; bool error = true; int exit_code = 0; int yk_cmd; unsigned int response_len = 0; if (!yk_init()) { printf("\nykchalresp.c:%d ykp_errno: %d yk_errno: %d\n", __LINE__, ykp_errno, yk_errno); exit_code = 2; goto err; } ykp_errno = 0; yk_errno = 0; if (!(yk = yk_open_first_key())) { printf("\nykchalresp.c:%d ykp_errno: %d yk_errno: %d\n", __LINE__, ykp_errno, yk_errno); exit_code = 1; goto err; } memset(response, 0, 64); switch(slot) { case 1: yk_cmd = SLOT_CHAL_HMAC1; break; case 2: yk_cmd = SLOT_CHAL_HMAC2; break; default: goto err; } while (! ( yk_write_to_key(yk, yk_cmd, challenge, 32) && yk_read_response_from_key(yk, slot, YK_FLAG_MAYBLOCK, response, 64, 20, &response_len) ) ) { if (yk_errno == 4) { yk_errno = 0; sleep(1); continue; } else { printf("\nykchalresp.c:%d ykp_errno: %d yk_errno: %d\n", __LINE__, ykp_errno, yk_errno); exit_code = 4; goto err; } } if (response_len > 20) { memset(&response[20], 0, 44); response_len = 20; } exit_code = 0; error = false; err: if (error || exit_code != 0) { report_yk_error(); #ifdef DEBUG SDMCKT_debug_tracking(__FILE__,__LINE__); #endif } if (yk && !yk_close_key(yk)) { report_yk_error(); #ifdef DEBUG SDMCKT_debug_tracking(__FILE__,__LINE__); #endif } if (!yk_release()) { report_yk_error(); #ifdef DEBUG SDMCKT_debug_tracking(__FILE__,__LINE__); #endif } if (response_len == 0) { memset(response, 0, 64); #ifdef DEBUG SDMCKT_debug_tracking(__FILE__,__LINE__); #endif } return response_len; }