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 )