FIDO-Raw
view release on metacpan or search on metacpan
deps/libfido2/src/u2f.c view on Meta::CPAN
if ((r = do_auth(dev, &fa->cdh, fa->rp_id, key_id, &sig, &ad,
ms)) != FIDO_OK) {
fido_log_debug("%s: do_auth", __func__);
goto fail;
}
if (fido_assert_set_authdata(fa, idx, ad.ptr, ad.len) != FIDO_OK ||
fido_assert_set_sig(fa, idx, sig.ptr, sig.len) != FIDO_OK) {
fido_log_debug("%s: fido_assert_set", __func__);
r = FIDO_ERR_INTERNAL;
goto fail;
}
r = FIDO_OK;
fail:
if (sig.ptr) {
explicit_bzero(sig.ptr, sig.len);
free(sig.ptr);
}
if (ad.ptr) {
explicit_bzero(ad.ptr, ad.len);
free(ad.ptr);
}
return (r);
}
int
u2f_authenticate(fido_dev_t *dev, fido_assert_t *fa, int ms)
{
size_t nfound = 0;
size_t nauth_ok = 0;
int r;
if (fa->uv == FIDO_OPT_TRUE || fa->allow_list.ptr == NULL) {
fido_log_debug("%s: uv=%d, allow_list=%p", __func__, fa->uv,
(void *)fa->allow_list.ptr);
return (FIDO_ERR_UNSUPPORTED_OPTION);
}
if ((r = fido_assert_set_count(fa, fa->allow_list.len)) != FIDO_OK) {
fido_log_debug("%s: fido_assert_set_count", __func__);
return (r);
}
for (size_t i = 0; i < fa->allow_list.len; i++) {
switch ((r = u2f_authenticate_single(dev,
&fa->allow_list.ptr[i], fa, nfound, ms))) {
case FIDO_OK:
nauth_ok++;
/* FALLTHROUGH */
case FIDO_ERR_USER_PRESENCE_REQUIRED:
nfound++;
break;
default:
if (r != FIDO_ERR_CREDENTIAL_EXCLUDED) {
fido_log_debug("%s: u2f_authenticate_single",
__func__);
return (r);
}
/* ignore credentials that don't exist */
}
}
fa->stmt_len = nfound;
if (nfound == 0)
return (FIDO_ERR_NO_CREDENTIALS);
if (nauth_ok == 0)
return (FIDO_ERR_USER_PRESENCE_REQUIRED);
return (FIDO_OK);
}
int
u2f_get_touch_begin(fido_dev_t *dev)
{
iso7816_apdu_t *apdu = NULL;
const char *clientdata = FIDO_DUMMY_CLIENTDATA;
const char *rp_id = FIDO_DUMMY_RP_ID;
unsigned char clientdata_hash[SHA256_DIGEST_LENGTH];
unsigned char rp_id_hash[SHA256_DIGEST_LENGTH];
unsigned char reply[FIDO_MAXMSG];
int r;
memset(&clientdata_hash, 0, sizeof(clientdata_hash));
memset(&rp_id_hash, 0, sizeof(rp_id_hash));
if (SHA256((const void *)clientdata, strlen(clientdata),
clientdata_hash) != clientdata_hash || SHA256((const void *)rp_id,
strlen(rp_id), rp_id_hash) != rp_id_hash) {
fido_log_debug("%s: sha256", __func__);
return (FIDO_ERR_INTERNAL);
}
if ((apdu = iso7816_new(U2F_CMD_REGISTER, 0, 2 *
SHA256_DIGEST_LENGTH)) == NULL ||
iso7816_add(apdu, clientdata_hash, sizeof(clientdata_hash)) < 0 ||
iso7816_add(apdu, rp_id_hash, sizeof(rp_id_hash)) < 0) {
fido_log_debug("%s: iso7816", __func__);
r = FIDO_ERR_INTERNAL;
goto fail;
}
if (dev->attr.flags & FIDO_CAP_WINK) {
fido_tx(dev, CTAP_CMD_WINK, NULL, 0);
fido_rx(dev, CTAP_CMD_WINK, &reply, sizeof(reply), 200);
}
if (fido_tx(dev, CTAP_CMD_MSG, iso7816_ptr(apdu),
iso7816_len(apdu)) < 0) {
fido_log_debug("%s: fido_tx", __func__);
r = FIDO_ERR_TX;
goto fail;
}
r = FIDO_OK;
fail:
iso7816_free(&apdu);
return (r);
( run in 0.891 second using v1.01-cache-2.11-cpan-f56aa216473 )