Added function for reading COSE keys.
Signed-off-by: Pol Henarejos <pol.henarejos@cttc.es>
This commit is contained in:
@@ -204,3 +204,32 @@ CborError COSE_public_key(int alg, CborEncoder *mapEncoderParent, CborEncoder *m
|
|||||||
err:
|
err:
|
||||||
return error;
|
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;
|
||||||
|
}
|
||||||
@@ -312,30 +312,7 @@ int cbor_client_pin(const uint8_t *data, size_t len) {
|
|||||||
CBOR_FIELD_GET_UINT(subcommand, 1);
|
CBOR_FIELD_GET_UINT(subcommand, 1);
|
||||||
}
|
}
|
||||||
else if (val_u == 0x03) {
|
else if (val_u == 0x03) {
|
||||||
int64_t key = 0;
|
CBOR_CHECK(COSE_read_key(&_f1, &kty, &alg, &crv, &kax, &kay));
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
else if (val_u == 0x04) {
|
else if (val_u == 0x04) {
|
||||||
CBOR_FIELD_GET_BYTES(pinUvAuthParam, 1);
|
CBOR_FIELD_GET_BYTES(pinUvAuthParam, 1);
|
||||||
|
|||||||
@@ -150,30 +150,7 @@ int cbor_get_assertion(const uint8_t *data, size_t len, bool next) {
|
|||||||
{
|
{
|
||||||
CBOR_FIELD_GET_UINT(ukey, 3);
|
CBOR_FIELD_GET_UINT(ukey, 3);
|
||||||
if (ukey == 0x01) {
|
if (ukey == 0x01) {
|
||||||
int64_t kkey = 0;
|
CBOR_CHECK(COSE_read_key(&_f3, &kty, &alg, &crv, &kax, &kay));
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
else if (ukey == 0x02) {
|
else if (ukey == 0x02) {
|
||||||
CBOR_FIELD_GET_BYTES(salt_enc, 3);
|
CBOR_FIELD_GET_BYTES(salt_enc, 3);
|
||||||
|
|||||||
@@ -84,30 +84,7 @@ int cbor_vendor_generic(uint8_t cmd, const uint8_t *data, size_t len) {
|
|||||||
CBOR_FIELD_GET_BYTES(vendorParam, 2);
|
CBOR_FIELD_GET_BYTES(vendorParam, 2);
|
||||||
}
|
}
|
||||||
else if (subpara == 0x02) {
|
else if (subpara == 0x02) {
|
||||||
int64_t key = 0;
|
CBOR_CHECK(COSE_read_key(&_f2, &kty, &alg, &crv, &kax, &kay));
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
CBOR_ADVANCE(2);
|
CBOR_ADVANCE(2);
|
||||||
|
|||||||
@@ -243,5 +243,6 @@ typedef struct CborCharString {
|
|||||||
extern CborError COSE_key(mbedtls_ecp_keypair *, CborEncoder *, CborEncoder *);
|
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_key_shared(mbedtls_ecdh_context *key, CborEncoder *mapEncoderParent, CborEncoder *mapEncoder);
|
||||||
extern CborError COSE_public_key(int alg, 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_
|
#endif //_CTAP2_CBOR_H_
|
||||||
|
|||||||
Reference in New Issue
Block a user