diff --git a/src/fido/cbor_get_info.c b/src/fido/cbor_get_info.c index 656df99..f213d1a 100644 --- a/src/fido/cbor_get_info.c +++ b/src/fido/cbor_get_info.c @@ -36,9 +36,10 @@ int cbor_get_info() { CBOR_CHECK(cbor_encoder_close_container(&mapEncoder, &arrayEncoder)); CBOR_CHECK(cbor_encode_uint(&mapEncoder, 0x02)); - CBOR_CHECK(cbor_encoder_create_array(&mapEncoder, &arrayEncoder, 2)); + CBOR_CHECK(cbor_encoder_create_array(&mapEncoder, &arrayEncoder, 3)); CBOR_CHECK(cbor_encode_text_stringz(&arrayEncoder, "credProtect")); CBOR_CHECK(cbor_encode_text_stringz(&arrayEncoder, "hmac-secret")); + CBOR_CHECK(cbor_encode_text_stringz(&arrayEncoder, "minPinLength")); CBOR_CHECK(cbor_encoder_close_container(&mapEncoder, &arrayEncoder)); CBOR_CHECK(cbor_encode_uint(&mapEncoder, 0x03)); diff --git a/src/fido/cbor_make_credential.c b/src/fido/cbor_make_credential.c index 011bc20..99be982 100644 --- a/src/fido/cbor_make_credential.c +++ b/src/fido/cbor_make_credential.c @@ -118,6 +118,7 @@ int cbor_make_credential(const uint8_t *data, size_t len) { CBOR_FIELD_GET_KEY_TEXT(2); CBOR_FIELD_KEY_TEXT_VAL_BOOL(2, "hmac-secret", extensions.hmac_secret); CBOR_FIELD_KEY_TEXT_VAL_UINT(2, "credProtect", extensions.credProtect); + CBOR_FIELD_KEY_TEXT_VAL_BOOL(2, "minPinLength", extensions.minPinLength); CBOR_ADVANCE(2); } CBOR_PARSE_MAP_END(_f1, 2); @@ -274,10 +275,25 @@ int cbor_make_credential(const uint8_t *data, size_t len) { if (extensions.present == true) { cbor_encoder_init(&encoder, ext, sizeof(ext), 0); int l = 0; + uint8_t minPinLen = 0; if (extensions.hmac_secret != NULL) l++; if (extensions.credProtect != 0) l++; + if (extensions.minPinLength != NULL) { + file_t *ef_minpin = search_by_fid(EF_MINPINLEN, NULL, SPECIFY_EF); + if (file_has_data(ef_minpin)) { + uint8_t *minpin_data = file_get_data(ef_minpin); + for (int o = 2; o < file_get_size(ef_minpin); o += 32) { + if (memcmp(minpin_data + o, rp_id_hash, 32) == 0) { + minPinLen = minpin_data[0]; + if (minPinLen > 0) + l++; + break; + } + } + } + } CBOR_CHECK(cbor_encoder_create_map(&encoder, &mapEncoder, l)); if (extensions.credProtect != 0) { CBOR_CHECK(cbor_encode_text_stringz(&mapEncoder, "credProtect")); @@ -288,6 +304,11 @@ int cbor_make_credential(const uint8_t *data, size_t len) { CBOR_CHECK(cbor_encode_text_stringz(&mapEncoder, "hmac-secret")); CBOR_CHECK(cbor_encode_boolean(&mapEncoder, *extensions.hmac_secret)); } + if (minPinLen > 0) { + + CBOR_CHECK(cbor_encode_text_stringz(&mapEncoder, "minPinLength")); + CBOR_CHECK(cbor_encode_uint(&mapEncoder, minPinLen)); + } CBOR_CHECK(cbor_encoder_close_container(&encoder, &mapEncoder)); ext_len = cbor_encoder_get_buffer_size(&encoder, ext); diff --git a/src/fido/credential.h b/src/fido/credential.h index 95d5f97..87d9cb1 100644 --- a/src/fido/credential.h +++ b/src/fido/credential.h @@ -30,6 +30,7 @@ typedef struct CredOptions { typedef struct CredExtensions { const bool *hmac_secret; uint64_t credProtect; + const bool *minPinLength; bool present; } CredExtensions;