/* SPDX-License-Identifier: LGPL-2.1-or-later */ /* Copyright: Jookia 2021 <contact@jookia.org> */ #include <stdio.h> #include <fido.h> unsigned char cred_id[] = { 0x91, 0x46, 0xaf, 0x4c, 0x2a, 0x36, 0xdd, 0x72, 0xc0, 0x79, 0x8f, 0x9a, 0x1b, 0x42, 0x59, 0x2c, 0xe6, 0x49, 0xba, 0x6c, 0x29, 0x95, 0x8e, 0x98, 0xe5, 0x44, 0x14, 0x40, 0x73, 0x42, 0x69, 0x14, 0xc6, 0x9f, 0x0c, 0xe0, 0xcb, 0x44, 0x3e, 0x71, 0x29, 0x78, 0x01, 0xe2, 0x4a, 0xe4, 0xe4, 0xdd, 0xea, 0x0c, 0x6b, 0xff, 0xe1, 0x86, 0x54, 0x36, 0x04, 0xb2, 0x46, 0x4c, 0x19, 0x20, 0x7b, 0x5c, 0x4d, 0x88, 0x45, 0xdc, 0xa3, 0x2f, 0xbf, 0xb5, 0x6c, 0xde, 0x1a, 0x49, 0x94, 0x3b, 0x30, 0xe6, 0xe4, 0xfe, 0x88, 0x57, 0xee, 0x38, 0x01, 0x0b, 0x88, 0x1e, 0xf5, 0x81, 0x9a, 0x73, 0x2b, 0x1a }; unsigned int cred_id_len = 96; unsigned char cd_hash[] = { 0xc0, 0x9e, 0xfa, 0x40, 0x30, 0x66, 0x31, 0xbd, 0xd9, 0x3a, 0xcf, 0xbd, 0xab, 0x8d, 0x63, 0xc4, 0x0c, 0x99, 0x43, 0x43, 0xe4, 0x13, 0x85, 0x20, 0xe2, 0x59, 0x2d, 0x41, 0xe9, 0xa0, 0xdd, 0xb1 }; unsigned int cd_hash_len = 32; #define MAX_FIDO_DEVICES 8 #define FIDO_CHECK(x) do { int err = x; if(err != FIDO_OK) { printf("FIDO ERR %i line %i\n", err, __LINE__); } } while(0) int main(void) { printf("SigningTool assert\n"); fido_init(FIDO_DEBUG); printf("Searching for devices\n"); fido_dev_info_t *devs = fido_dev_info_new(MAX_FIDO_DEVICES); FIDO_CHECK(!devs); size_t found = 0; FIDO_CHECK(fido_dev_info_manifest(devs, MAX_FIDO_DEVICES, &found)); printf("Found %zu devices\n", found); const char *path; for(size_t i = 0; i < found; ++i) { fido_dev_info_t const *dev_info = fido_dev_info_ptr(devs, i); FIDO_CHECK(!dev_info); path = fido_dev_info_path(dev_info); printf("Device %zu is %s\n", i, path); } printf("Opening device\n"); fido_dev_t *dev = fido_dev_new(); FIDO_CHECK(!dev); FIDO_CHECK(fido_dev_open(dev, path)); fido_dev_info_free(&devs, MAX_FIDO_DEVICES); printf("Making assertion\n"); fido_assert_t* assert = fido_assert_new(); FIDO_CHECK(!assert); FIDO_CHECK(fido_assert_set_rp(assert, "id")); FIDO_CHECK(fido_assert_set_clientdata_hash(assert, cd_hash, cd_hash_len)); FIDO_CHECK(fido_assert_allow_cred(assert, cred_id, cred_id_len)); FIDO_CHECK(fido_assert_set_extensions(assert, 0)); printf("Generating assertion\n"); FIDO_CHECK(fido_dev_get_assert(dev, assert, NULL)); fido_dev_close(dev); fido_dev_free(&dev); printf("Getting generated data\n"); unsigned char const *signature = fido_assert_sig_ptr(assert, 0); unsigned char const *authdata = fido_assert_authdata_ptr(assert, 0); size_t signature_len = fido_assert_sig_len(assert, 0); size_t authdata_len = fido_assert_authdata_len(assert, 0); FIDO_CHECK(!signature); FIDO_CHECK(!authdata); printf("Write generated data\n"); FILE *file = fopen("assert_signature.bin", "w"); fwrite(signature, signature_len, 1, file); fclose(file); file = fopen("assert_authdata.bin", "w"); fwrite(authdata, authdata_len, 1, file); fclose(file); file = fopen("assert_hash.bin", "w"); fwrite(cd_hash, cd_hash_len, 1, file); fclose(file); /* Cleanup */ fido_assert_free(&assert); return 0; }