Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

YubiAuth: Fix getting a device challenge #424

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/commands.c
Original file line number Diff line number Diff line change
Expand Up @@ -1857,9 +1857,9 @@ int yh_com_open_yksession(yubihsm_context *ctx, Argument *argv,
uint8_t host_challenge[YH_EC_P256_PUBKEY_LEN] = {0};
size_t host_challenge_len = sizeof(host_challenge);

ykhsmauthrc = ykhsmauth_get_challenge_ex(ctx->state, argv[1].s,
argv[2].x, argv[2].len,
host_challenge, &host_challenge_len);
ykhsmauthrc =
ykhsmauth_get_challenge_ex(ctx->state, argv[1].s, argv[2].x, argv[2].len,
host_challenge, &host_challenge_len);
if (ykhsmauthrc != YKHSMAUTHR_SUCCESS) {
fprintf(stderr, "Failed to get host challenge from the YubiKey: %s\n",
ykhsmauth_strerror(ykhsmauthrc));
Expand Down
46 changes: 37 additions & 9 deletions ykhsmauth/ykhsmauth.c
Original file line number Diff line number Diff line change
Expand Up @@ -296,9 +296,8 @@ ykhsmauth_rc ykhsmauth_list_readers(ykhsmauth_state *state, char *readers,
return YKHSMAUTHR_SUCCESS;
}

ykhsmauth_rc ykhsmauth_get_version(ykhsmauth_state *state, char *version,
size_t len) {
if (state == NULL || version == NULL) {
ykhsmauth_rc ykhsmauth_get_version_ex(ykhsmauth_state *state, uint8_t *major, uint8_t *minor, uint8_t *patch) {
if (state == NULL || major == NULL || minor == NULL || patch == NULL) {
return YKHSMAUTHR_INVALID_PARAMS;
}

Expand All @@ -312,17 +311,33 @@ ykhsmauth_rc ykhsmauth_get_version(ykhsmauth_state *state, char *version,
YKHSMAUTHR_SUCCESS) {
return res;
} else if (sw == SW_SUCCESS && recv_len == 3) {
int result = snprintf(version, len, "%d.%d.%d", data[0], data[1], data[2]);
*major = data[0];
*minor = data[1];
*patch = data[2];
return YKHSMAUTHR_SUCCESS;
} else {
return translate_error(sw, NULL);
}
}

ykhsmauth_rc ykhsmauth_get_version(ykhsmauth_state *state, char *version,
size_t len) {
if (version == NULL) {
return YKHSMAUTHR_INVALID_PARAMS;
}

uint8_t v[3] = {0};
ykhsmauth_rc res = ykhsmauth_get_version_ex(state, &v[0], &v[1], &v[2]);
if(res == YKHSMAUTHR_SUCCESS) {
int result = snprintf(version, len, "%d.%d.%d", v[0], v[1], v[2]);
if (result < 0) {
if (state->verbose) {
fprintf(stderr, "Version buffer too small\n");
}
return YKHSMAUTHR_GENERIC_ERROR;
}
return YKHSMAUTHR_SUCCESS;
} else {
return translate_error(sw, NULL);
}
return res;
}

ykhsmauth_rc ykhsmauth_put(ykhsmauth_state *state, const uint8_t *mgmkey,
Expand Down Expand Up @@ -603,18 +618,31 @@ ykhsmauth_rc ykhsmauth_get_challenge_ex(ykhsmauth_state *state, const char *labe
return YKHSMAUTHR_INVALID_PARAMS;
}

ykhsmauth_rc rc;

APDU apdu = {{0, YKHSMAUTH_INS_GET_CHALLENGE, 0, 0, 0, {0}}};

add_tag(&apdu, YKHSMAUTH_TAG_LABEL, label, strlen(label), 0);
if(cpw && cpw_len) {
add_tag(&apdu, YKHSMAUTH_TAG_PW, cpw, cpw_len, YKHSMAUTH_PW_LEN - cpw_len);
uint8_t major = 0, minor = 0, patch = 0;
rc = ykhsmauth_get_version_ex(state, &major, &minor, &patch);
if(rc != YKHSMAUTHR_SUCCESS) {
fprintf(stderr, "Unable to YubiKey version\n");
return false;
}

if (major > 5 || (major == 5 && minor > 7) ||
(major == 5 && minor == 7 && patch >= 1)) {
add_tag(&apdu, YKHSMAUTH_TAG_PW, cpw, cpw_len,
YKHSMAUTH_PW_LEN - cpw_len);
}
}

unsigned char data[256] = {0};
DWORD recv_len = sizeof(data);
uint16_t sw = 0;

ykhsmauth_rc rc = send_data(state, &apdu, data, &recv_len, &sw);
rc = send_data(state, &apdu, data, &recv_len, &sw);
if (rc != YKHSMAUTHR_SUCCESS) {
return rc;
} else if (sw != SW_SUCCESS) {
Expand Down
2 changes: 2 additions & 0 deletions ykhsmauth/ykhsmauth.h
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,8 @@ ykhsmauth_rc ykhsmauth_list_readers(ykhsmauth_state *state, char *readers,
size_t *len);
ykhsmauth_rc ykhsmauth_disconnect(ykhsmauth_state *state);

ykhsmauth_rc ykhsmauth_get_version_ex(ykhsmauth_state *state, uint8_t *major,
uint8_t *minor, uint8_t *patch);
ykhsmauth_rc ykhsmauth_get_version(ykhsmauth_state *state, char *version,
size_t len);

Expand Down
22 changes: 20 additions & 2 deletions yubihsm-auth/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -383,8 +383,26 @@ static bool get_challenge(ykhsmauth_state *state, char *label, char *credpasswor
return false;
}

ykhsmauth_rc ykhsmauthrc =
ykhsmauth_get_challenge_ex(state, label_parsed, cpw_parsed, cpw_parsed_len, challenge, &challenge_len);
ykhsmauth_rc ykhsmauthrc;

uint8_t major = 0, minor = 0, patch = 0;
ykhsmauthrc = ykhsmauth_get_version_ex(state, &major, &minor, &patch);
if (ykhsmauthrc != YKHSMAUTHR_SUCCESS) {
fprintf(stderr, "Unable to get YubiKey firmware version: %s\n",
ykhsmauth_strerror(ykhsmauthrc));
return false;
}

if (major < 5 || (major == 5 && minor < 7) ||
(major == 5 && minor == 7 && patch < 1)) {
ykhsmauthrc =
ykhsmauth_get_challenge(state, label_parsed, challenge, &challenge_len);
} else {
ykhsmauthrc =
ykhsmauth_get_challenge_ex(state, label_parsed, cpw_parsed,
cpw_parsed_len, challenge, &challenge_len);
}

if (ykhsmauthrc != YKHSMAUTHR_SUCCESS) {
fprintf(stderr, "Unable to get challenge: %s\n",
ykhsmauth_strerror(ykhsmauthrc));
Expand Down
Loading