diff --git a/src/fido/cbor.c b/src/fido/cbor.c index 548a96f..d8ece1d 100644 --- a/src/fido/cbor.c +++ b/src/fido/cbor.c @@ -204,3 +204,32 @@ CborError COSE_public_key(int alg, CborEncoder *mapEncoderParent, CborEncoder *m err: return error; } +CborError COSE_read_key(CborValue *f, int64_t *kty, int64_t *alg, int64_t *crv, CborByteString *kax, CborByteString *kay) { + int64_t kkey = 0; + CborError error = CborNoError; + CBOR_PARSE_MAP_START(*f, 0) + { + CBOR_FIELD_GET_INT(kkey, 0); + if (kkey == 1) { + CBOR_FIELD_GET_INT(*kty, 0); + } + else if (kkey == 3) { + CBOR_FIELD_GET_INT(*alg, 0); + } + else if (kkey == -1) { + CBOR_FIELD_GET_INT(*crv, 0); + } + else if (kkey == -2) { + CBOR_FIELD_GET_BYTES(*kax, 0); + } + else if (kkey == -3) { + CBOR_FIELD_GET_BYTES(*kay, 0); + } + else { + CBOR_ADVANCE(0); + } + } + CBOR_PARSE_MAP_END(*f, 0); + err: + return error; +} \ No newline at end of file diff --git a/src/fido/cbor_client_pin.c b/src/fido/cbor_client_pin.c index 7ecbcbd..f47c09e 100644 --- a/src/fido/cbor_client_pin.c +++ b/src/fido/cbor_client_pin.c @@ -312,30 +312,7 @@ int cbor_client_pin(const uint8_t *data, size_t len) { CBOR_FIELD_GET_UINT(subcommand, 1); } else if (val_u == 0x03) { - int64_t key = 0; - CBOR_PARSE_MAP_START(_f1, 2) - { - CBOR_FIELD_GET_INT(key, 2); - if (key == 1) { - CBOR_FIELD_GET_INT(kty, 2); - } - else if (key == 3) { - CBOR_FIELD_GET_INT(alg, 2); - } - else if (key == -1) { - CBOR_FIELD_GET_INT(crv, 2); - } - else if (key == -2) { - CBOR_FIELD_GET_BYTES(kax, 2); - } - else if (key == -3) { - CBOR_FIELD_GET_BYTES(kay, 2); - } - else { - CBOR_ADVANCE(2); - } - } - CBOR_PARSE_MAP_END(_f1, 2); + CBOR_CHECK(COSE_read_key(&_f1, &kty, &alg, &crv, &kax, &kay)); } else if (val_u == 0x04) { CBOR_FIELD_GET_BYTES(pinUvAuthParam, 1); diff --git a/src/fido/cbor_get_assertion.c b/src/fido/cbor_get_assertion.c index 7967c28..8dfb206 100644 --- a/src/fido/cbor_get_assertion.c +++ b/src/fido/cbor_get_assertion.c @@ -150,30 +150,7 @@ int cbor_get_assertion(const uint8_t *data, size_t len, bool next) { { CBOR_FIELD_GET_UINT(ukey, 3); if (ukey == 0x01) { - int64_t kkey = 0; - CBOR_PARSE_MAP_START(_f3, 4) - { - CBOR_FIELD_GET_INT(kkey, 4); - if (kkey == 1) { - CBOR_FIELD_GET_INT(kty, 4); - } - else if (kkey == 3) { - CBOR_FIELD_GET_INT(alg, 4); - } - else if (kkey == -1) { - CBOR_FIELD_GET_INT(crv, 4); - } - else if (kkey == -2) { - CBOR_FIELD_GET_BYTES(kax, 4); - } - else if (kkey == -3) { - CBOR_FIELD_GET_BYTES(kay, 4); - } - else { - CBOR_ADVANCE(4); - } - } - CBOR_PARSE_MAP_END(_f3, 4); + CBOR_CHECK(COSE_read_key(&_f3, &kty, &alg, &crv, &kax, &kay)); } else if (ukey == 0x02) { CBOR_FIELD_GET_BYTES(salt_enc, 3); diff --git a/src/fido/cbor_vendor.c b/src/fido/cbor_vendor.c index 466bc67..f76de3c 100644 --- a/src/fido/cbor_vendor.c +++ b/src/fido/cbor_vendor.c @@ -84,30 +84,7 @@ int cbor_vendor_generic(uint8_t cmd, const uint8_t *data, size_t len) { CBOR_FIELD_GET_BYTES(vendorParam, 2); } else if (subpara == 0x02) { - int64_t key = 0; - CBOR_PARSE_MAP_START(_f2, 3) - { - CBOR_FIELD_GET_INT(key, 3); - if (key == 1) { - CBOR_FIELD_GET_INT(kty, 3); - } - else if (key == 3) { - CBOR_FIELD_GET_INT(alg, 3); - } - else if (key == -1) { - CBOR_FIELD_GET_INT(crv, 3); - } - else if (key == -2) { - CBOR_FIELD_GET_BYTES(kax, 3); - } - else if (key == -3) { - CBOR_FIELD_GET_BYTES(kay, 3); - } - else { - CBOR_ADVANCE(3); - } - } - CBOR_PARSE_MAP_END(_f2, 3); + CBOR_CHECK(COSE_read_key(&_f2, &kty, &alg, &crv, &kax, &kay)); } else { CBOR_ADVANCE(2); diff --git a/src/fido/ctap2_cbor.h b/src/fido/ctap2_cbor.h index 7d03fa8..1706ed8 100644 --- a/src/fido/ctap2_cbor.h +++ b/src/fido/ctap2_cbor.h @@ -243,5 +243,6 @@ typedef struct CborCharString { extern CborError COSE_key(mbedtls_ecp_keypair *, CborEncoder *, CborEncoder *); extern CborError COSE_key_shared(mbedtls_ecdh_context *key, CborEncoder *mapEncoderParent, CborEncoder *mapEncoder); extern CborError COSE_public_key(int alg, CborEncoder *mapEncoderParent, CborEncoder *mapEncoder); +extern CborError COSE_read_key(CborValue *f, int64_t *kty, int64_t *alg, int64_t *crv, CborByteString *kax, CborByteString *kay); #endif //_CTAP2_CBOR_H_