FIDO-Raw
view release on metacpan or search on metacpan
deps/libfido2/src/assert.c view on Meta::CPAN
assert->stmt_len = 0; /* XXX */
return (0);
}
static int
parse_assert_reply(const cbor_item_t *key, const cbor_item_t *val, void *arg)
{
fido_assert_stmt *stmt = arg;
if (cbor_isa_uint(key) == false ||
cbor_int_get_width(key) != CBOR_INT_8) {
fido_log_debug("%s: cbor type", __func__);
return (0); /* ignore */
}
switch (cbor_get_uint8(key)) {
case 1: /* credential id */
return (cbor_decode_cred_id(val, &stmt->id));
case 2: /* authdata */
return (cbor_decode_assert_authdata(val, &stmt->authdata_cbor,
&stmt->authdata, &stmt->authdata_ext,
&stmt->hmac_secret_enc));
case 3: /* signature */
return (fido_blob_decode(val, &stmt->sig));
case 4: /* user attributes */
return (cbor_decode_user(val, &stmt->user));
default: /* ignore */
fido_log_debug("%s: cbor type", __func__);
return (0);
}
}
static int
fido_dev_get_assert_tx(fido_dev_t *dev, fido_assert_t *assert,
const es256_pk_t *pk, const fido_blob_t *ecdh, const char *pin)
{
fido_blob_t f;
cbor_item_t *argv[7];
int r;
memset(argv, 0, sizeof(argv));
memset(&f, 0, sizeof(f));
/* do we have everything we need? */
if (assert->rp_id == NULL || assert->cdh.ptr == NULL) {
fido_log_debug("%s: rp_id=%p, cdh.ptr=%p", __func__,
(void *)assert->rp_id, (void *)assert->cdh.ptr);
r = FIDO_ERR_INVALID_ARGUMENT;
goto fail;
}
if ((argv[0] = cbor_build_string(assert->rp_id)) == NULL ||
(argv[1] = fido_blob_encode(&assert->cdh)) == NULL) {
fido_log_debug("%s: cbor encode", __func__);
r = FIDO_ERR_INTERNAL;
goto fail;
}
/* allowed credentials */
if (assert->allow_list.len) {
const fido_blob_array_t *cl = &assert->allow_list;
if ((argv[2] = cbor_encode_pubkey_list(cl)) == NULL) {
fido_log_debug("%s: cbor_encode_pubkey_list", __func__);
r = FIDO_ERR_INTERNAL;
goto fail;
}
}
/* hmac-secret extension */
if (assert->ext & FIDO_EXT_HMAC_SECRET)
if ((argv[3] = cbor_encode_hmac_secret_param(ecdh, pk,
&assert->hmac_salt)) == NULL) {
fido_log_debug("%s: cbor_encode_hmac_secret_param",
__func__);
r = FIDO_ERR_INTERNAL;
goto fail;
}
/* options */
if (assert->up != FIDO_OPT_OMIT || assert->uv != FIDO_OPT_OMIT)
if ((argv[4] = cbor_encode_assert_options(assert->up,
assert->uv)) == NULL) {
fido_log_debug("%s: cbor_encode_assert_options",
__func__);
r = FIDO_ERR_INTERNAL;
goto fail;
}
/* pin authentication */
if (pin) {
if (pk == NULL || ecdh == NULL) {
fido_log_debug("%s: pin=%p, pk=%p, ecdh=%p", __func__,
(const void *)pin, (const void *)pk,
(const void *)ecdh);
r = FIDO_ERR_INVALID_ARGUMENT;
goto fail;
}
if ((r = cbor_add_pin_params(dev, &assert->cdh, pk, ecdh, pin,
&argv[5], &argv[6])) != FIDO_OK) {
fido_log_debug("%s: cbor_add_pin_params", __func__);
goto fail;
}
}
/* frame and transmit */
if (cbor_build_frame(CTAP_CBOR_ASSERT, argv, nitems(argv), &f) < 0 ||
fido_tx(dev, CTAP_CMD_CBOR, f.ptr, f.len) < 0) {
fido_log_debug("%s: fido_tx", __func__);
r = FIDO_ERR_TX;
goto fail;
}
r = FIDO_OK;
fail:
cbor_vector_free(argv, nitems(argv));
free(f.ptr);
return (r);
}
( run in 2.440 seconds using v1.01-cache-2.11-cpan-f56aa216473 )