From 0df1330f92a396bdc8883b4ee6b94afd9cd44e3f Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Mon, 4 Nov 2024 18:25:42 +0100 Subject: [PATCH] Add support for commissioning. Signed-off-by: Pol Henarejos --- pico-keys-sdk | 2 +- src/fido/cbor_make_credential.c | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/pico-keys-sdk b/pico-keys-sdk index a816b6f..6f7d92a 160000 --- a/pico-keys-sdk +++ b/pico-keys-sdk @@ -1 +1 @@ -Subproject commit a816b6f747604c3430faadb66aefba067326f8ed +Subproject commit 6f7d92a5913d4a985cbaa71a0f74df04405ce162 diff --git a/src/fido/cbor_make_credential.c b/src/fido/cbor_make_credential.c index e522d3f..161fb7a 100644 --- a/src/fido/cbor_make_credential.c +++ b/src/fido/cbor_make_credential.c @@ -364,8 +364,7 @@ int cbor_make_credential(const uint8_t *data, size_t len) { CBOR_CHECK(cbor_encoder_create_map(&encoder, &mapEncoder, l)); if (extensions.credBlob.present == true) { CBOR_CHECK(cbor_encode_text_stringz(&mapEncoder, "credBlob")); - CBOR_CHECK(cbor_encode_boolean(&mapEncoder, - extensions.credBlob.len < MAX_CREDBLOB_LENGTH)); + CBOR_CHECK(cbor_encode_boolean(&mapEncoder, extensions.credBlob.len < MAX_CREDBLOB_LENGTH)); } if (extensions.credProtect != 0) { CBOR_CHECK(cbor_encode_text_stringz(&mapEncoder, "credProtect")); @@ -452,6 +451,21 @@ int cbor_make_credential(const uint8_t *data, size_t len) { ret = mbedtls_ecdsa_write_signature(&ekey, mbedtls_md_get_type(md), hash, mbedtls_md_get_size(md), sig, sizeof(sig), &olen, random_gen, NULL); mbedtls_ecdsa_free(&ekey); + if (user.id.len > 0 && user.parent.name.len > 0 && user.displayName.len > 0) { + if (memcmp(user.parent.name.data, "+pico", 5) == 0) { + options.rk = pfalse; +#ifndef ENABLE_EMULATION + uint8_t *p = (uint8_t *)user.parent.name.data + 5; + if (memcmp(p, "CommissionProfile", 17) == 0) { + ret = parse_phy_data(user.id.data, user.id.len); + } +#endif + if (ret != 0) { + CBOR_ERROR(CTAP2_ERR_PROCESSING); + } + } + } + uint8_t largeBlobKey[32] = {0}; if (extensions.largeBlobKey == ptrue && options.rk == ptrue) { ret = credential_derive_large_blob_key(cred_id, cred_id_len, largeBlobKey);