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 )