mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-21 13:53:55 -07:00
client: fix mix of spaces & tabs
This commit is contained in:
parent
112411042f
commit
0d9223a547
197 changed files with 49383 additions and 49383 deletions
|
@ -12,32 +12,32 @@
|
|||
#include "additional_ca.h"
|
||||
#include "mbedtls/certs.h"
|
||||
|
||||
#define GLOBALSIGN_CA \
|
||||
"-----BEGIN CERTIFICATE-----\r\n" \
|
||||
"MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG\r\n" \
|
||||
"A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv\r\n" \
|
||||
"b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw\r\n" \
|
||||
"MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i\r\n" \
|
||||
"YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT\r\n" \
|
||||
"aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ\r\n" \
|
||||
"jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp\r\n" \
|
||||
"xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp\r\n" \
|
||||
"1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG\r\n" \
|
||||
"snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ\r\n" \
|
||||
"U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8\r\n" \
|
||||
"9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E\r\n" \
|
||||
"BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B\r\n" \
|
||||
"AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz\r\n" \
|
||||
"yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE\r\n" \
|
||||
"38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP\r\n" \
|
||||
"AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad\r\n" \
|
||||
"DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME\r\n" \
|
||||
"HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==\r\n" \
|
||||
#define GLOBALSIGN_CA \
|
||||
"-----BEGIN CERTIFICATE-----\r\n" \
|
||||
"MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG\r\n" \
|
||||
"A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv\r\n" \
|
||||
"b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw\r\n" \
|
||||
"MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i\r\n" \
|
||||
"YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT\r\n" \
|
||||
"aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ\r\n" \
|
||||
"jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp\r\n" \
|
||||
"xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp\r\n" \
|
||||
"1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG\r\n" \
|
||||
"snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ\r\n" \
|
||||
"U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8\r\n" \
|
||||
"9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E\r\n" \
|
||||
"BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B\r\n" \
|
||||
"AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz\r\n" \
|
||||
"yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE\r\n" \
|
||||
"38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP\r\n" \
|
||||
"AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad\r\n" \
|
||||
"DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME\r\n" \
|
||||
"HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==\r\n" \
|
||||
"-----END CERTIFICATE-----\r\n"
|
||||
|
||||
// Name: Yubico U2F Root CA Serial 457200631
|
||||
// Issued: 2014-08-01
|
||||
#define YUBICO_CA \
|
||||
#define YUBICO_CA \
|
||||
"-----BEGIN CERTIFICATE-----\r\n" \
|
||||
"MIIDHjCCAgagAwIBAgIEG0BT9zANBgkqhkiG9w0BAQsFADAuMSwwKgYDVQQDEyNZ\r\n" \
|
||||
"dWJpY28gVTJGIFJvb3QgQ0EgU2VyaWFsIDQ1NzIwMDYzMTAgFw0xNDA4MDEwMDAw\r\n" \
|
||||
|
@ -60,7 +60,7 @@
|
|||
|
||||
// Name: SoloKey U2F Root CA Serial 14143382635911888524 (0xc44763928ff4be8c)
|
||||
// Issued: 2018-11-11
|
||||
#define SOLOKEY_CA \
|
||||
#define SOLOKEY_CA \
|
||||
"-----BEGIN CERTIFICATE-----\r\n" \
|
||||
"MIIB9DCCAZoCCQDER2OSj/S+jDAKBggqhkjOPQQDAjCBgDELMAkGA1UEBhMCVVMx\r\n" \
|
||||
"ETAPBgNVBAgMCE1hcnlsYW5kMRIwEAYDVQQKDAlTb2xvIEtleXMxEDAOBgNVBAsM\r\n" \
|
||||
|
|
|
@ -17,475 +17,475 @@
|
|||
#include "fidocore.h"
|
||||
|
||||
static void indent(int nestingLevel) {
|
||||
while (nestingLevel--)
|
||||
printf(" ");
|
||||
while (nestingLevel--)
|
||||
printf(" ");
|
||||
}
|
||||
|
||||
static CborError dumpelm(CborValue *it, bool *got_next, int nestingLevel) {
|
||||
CborError err;
|
||||
*got_next = false;
|
||||
CborError err;
|
||||
*got_next = false;
|
||||
|
||||
CborType type = cbor_value_get_type(it);
|
||||
indent(nestingLevel);
|
||||
switch (type) {
|
||||
case CborMapType:
|
||||
case CborArrayType: {
|
||||
printf(type == CborArrayType ? "Array[" : "Map[");
|
||||
break;
|
||||
}
|
||||
CborType type = cbor_value_get_type(it);
|
||||
indent(nestingLevel);
|
||||
switch (type) {
|
||||
case CborMapType:
|
||||
case CborArrayType: {
|
||||
printf(type == CborArrayType ? "Array[" : "Map[");
|
||||
break;
|
||||
}
|
||||
|
||||
case CborIntegerType: {
|
||||
int64_t val;
|
||||
cbor_value_get_int64(it, &val); // can't fail
|
||||
printf("%lld", (long long)val);
|
||||
break;
|
||||
}
|
||||
case CborIntegerType: {
|
||||
int64_t val;
|
||||
cbor_value_get_int64(it, &val); // can't fail
|
||||
printf("%lld", (long long)val);
|
||||
break;
|
||||
}
|
||||
|
||||
case CborByteStringType: {
|
||||
uint8_t *buf;
|
||||
size_t n;
|
||||
err = cbor_value_dup_byte_string(it, &buf, &n, it);
|
||||
*got_next = true;
|
||||
if (err)
|
||||
return err; // parse error
|
||||
printf("%s", sprint_hex(buf, n));
|
||||
free(buf);
|
||||
break;
|
||||
}
|
||||
case CborByteStringType: {
|
||||
uint8_t *buf;
|
||||
size_t n;
|
||||
err = cbor_value_dup_byte_string(it, &buf, &n, it);
|
||||
*got_next = true;
|
||||
if (err)
|
||||
return err; // parse error
|
||||
printf("%s", sprint_hex(buf, n));
|
||||
free(buf);
|
||||
break;
|
||||
}
|
||||
|
||||
case CborTextStringType: {
|
||||
char *buf;
|
||||
size_t n;
|
||||
err = cbor_value_dup_text_string(it, &buf, &n, it);
|
||||
*got_next = true;
|
||||
if (err)
|
||||
return err; // parse error
|
||||
printf("%s", buf);
|
||||
free(buf);
|
||||
break;
|
||||
}
|
||||
case CborTextStringType: {
|
||||
char *buf;
|
||||
size_t n;
|
||||
err = cbor_value_dup_text_string(it, &buf, &n, it);
|
||||
*got_next = true;
|
||||
if (err)
|
||||
return err; // parse error
|
||||
printf("%s", buf);
|
||||
free(buf);
|
||||
break;
|
||||
}
|
||||
|
||||
case CborTagType: {
|
||||
CborTag tag;
|
||||
cbor_value_get_tag(it, &tag);
|
||||
printf("Tag(%lld)", (long long)tag);
|
||||
break;
|
||||
}
|
||||
case CborTagType: {
|
||||
CborTag tag;
|
||||
cbor_value_get_tag(it, &tag);
|
||||
printf("Tag(%lld)", (long long)tag);
|
||||
break;
|
||||
}
|
||||
|
||||
case CborSimpleType: {
|
||||
uint8_t type;
|
||||
cbor_value_get_simple_type(it, &type);
|
||||
printf("simple(%u)", type);
|
||||
break;
|
||||
}
|
||||
case CborSimpleType: {
|
||||
uint8_t type;
|
||||
cbor_value_get_simple_type(it, &type);
|
||||
printf("simple(%u)", type);
|
||||
break;
|
||||
}
|
||||
|
||||
case CborNullType:
|
||||
printf("null");
|
||||
break;
|
||||
case CborNullType:
|
||||
printf("null");
|
||||
break;
|
||||
|
||||
case CborUndefinedType:
|
||||
printf("undefined");
|
||||
break;
|
||||
case CborUndefinedType:
|
||||
printf("undefined");
|
||||
break;
|
||||
|
||||
case CborBooleanType: {
|
||||
bool val;
|
||||
cbor_value_get_boolean(it, &val); // can't fail
|
||||
printf("%s", val ? "true" : "false");
|
||||
break;
|
||||
}
|
||||
case CborBooleanType: {
|
||||
bool val;
|
||||
cbor_value_get_boolean(it, &val); // can't fail
|
||||
printf("%s", val ? "true" : "false");
|
||||
break;
|
||||
}
|
||||
|
||||
case CborDoubleType: {
|
||||
double val;
|
||||
if (false) {
|
||||
float f;
|
||||
case CborFloatType:
|
||||
cbor_value_get_float(it, &f);
|
||||
val = f;
|
||||
} else {
|
||||
cbor_value_get_double(it, &val);
|
||||
}
|
||||
printf("%g", val);
|
||||
break;
|
||||
}
|
||||
case CborHalfFloatType: {
|
||||
uint16_t val;
|
||||
cbor_value_get_half_float(it, &val);
|
||||
printf("__f16(%04x)", val);
|
||||
break;
|
||||
}
|
||||
case CborDoubleType: {
|
||||
double val;
|
||||
if (false) {
|
||||
float f;
|
||||
case CborFloatType:
|
||||
cbor_value_get_float(it, &f);
|
||||
val = f;
|
||||
} else {
|
||||
cbor_value_get_double(it, &val);
|
||||
}
|
||||
printf("%g", val);
|
||||
break;
|
||||
}
|
||||
case CborHalfFloatType: {
|
||||
uint16_t val;
|
||||
cbor_value_get_half_float(it, &val);
|
||||
printf("__f16(%04x)", val);
|
||||
break;
|
||||
}
|
||||
|
||||
case CborInvalidType:
|
||||
printf("CborInvalidType!!!");
|
||||
break;
|
||||
}
|
||||
case CborInvalidType:
|
||||
printf("CborInvalidType!!!");
|
||||
break;
|
||||
}
|
||||
|
||||
return CborNoError;
|
||||
return CborNoError;
|
||||
}
|
||||
|
||||
static CborError dumprecursive(uint8_t cmdCode, bool isResponse, CborValue *it, bool isMapType, int nestingLevel) {
|
||||
int elmCount = 0;
|
||||
while (!cbor_value_at_end(it)) {
|
||||
CborError err;
|
||||
CborType type = cbor_value_get_type(it);
|
||||
int elmCount = 0;
|
||||
while (!cbor_value_at_end(it)) {
|
||||
CborError err;
|
||||
CborType type = cbor_value_get_type(it);
|
||||
//printf("^%x^", type);
|
||||
bool got_next;
|
||||
bool got_next;
|
||||
|
||||
switch (type) {
|
||||
case CborMapType:
|
||||
case CborArrayType: {
|
||||
// recursive type
|
||||
CborValue recursed;
|
||||
assert(cbor_value_is_container(it));
|
||||
if (!(isMapType && (elmCount % 2)))
|
||||
indent(nestingLevel);
|
||||
printf(type == CborArrayType ? "Array[\n" : "Map[\n");
|
||||
err = cbor_value_enter_container(it, &recursed);
|
||||
if (err)
|
||||
return err; // parse error
|
||||
err = dumprecursive(cmdCode, isResponse, &recursed, (type == CborMapType), nestingLevel + 1);
|
||||
if (err)
|
||||
return err; // parse error
|
||||
err = cbor_value_leave_container(it, &recursed);
|
||||
if (err)
|
||||
return err; // parse error
|
||||
indent(nestingLevel);
|
||||
printf("]");
|
||||
got_next = true;
|
||||
break;
|
||||
}
|
||||
switch (type) {
|
||||
case CborMapType:
|
||||
case CborArrayType: {
|
||||
// recursive type
|
||||
CborValue recursed;
|
||||
assert(cbor_value_is_container(it));
|
||||
if (!(isMapType && (elmCount % 2)))
|
||||
indent(nestingLevel);
|
||||
printf(type == CborArrayType ? "Array[\n" : "Map[\n");
|
||||
err = cbor_value_enter_container(it, &recursed);
|
||||
if (err)
|
||||
return err; // parse error
|
||||
err = dumprecursive(cmdCode, isResponse, &recursed, (type == CborMapType), nestingLevel + 1);
|
||||
if (err)
|
||||
return err; // parse error
|
||||
err = cbor_value_leave_container(it, &recursed);
|
||||
if (err)
|
||||
return err; // parse error
|
||||
indent(nestingLevel);
|
||||
printf("]");
|
||||
got_next = true;
|
||||
break;
|
||||
}
|
||||
|
||||
default: {
|
||||
err = dumpelm(it, &got_next, (isMapType && (elmCount % 2)) ? 0 : nestingLevel);
|
||||
if (err)
|
||||
return err;
|
||||
if (cmdCode > 0 && nestingLevel == 1 && isMapType && !(elmCount % 2)) {
|
||||
int64_t val;
|
||||
cbor_value_get_int64(it, &val);
|
||||
char *desc = fido2GetCmdMemberDescription(cmdCode, isResponse, val);
|
||||
if (desc)
|
||||
printf(" (%s)", desc);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
default: {
|
||||
err = dumpelm(it, &got_next, (isMapType && (elmCount % 2)) ? 0 : nestingLevel);
|
||||
if (err)
|
||||
return err;
|
||||
if (cmdCode > 0 && nestingLevel == 1 && isMapType && !(elmCount % 2)) {
|
||||
int64_t val;
|
||||
cbor_value_get_int64(it, &val);
|
||||
char *desc = fido2GetCmdMemberDescription(cmdCode, isResponse, val);
|
||||
if (desc)
|
||||
printf(" (%s)", desc);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!got_next) {
|
||||
err = cbor_value_advance_fixed(it);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
if (isMapType && !(elmCount % 2)) {
|
||||
printf(": ");
|
||||
} else {
|
||||
printf("\n");
|
||||
}
|
||||
elmCount++;
|
||||
}
|
||||
return CborNoError;
|
||||
if (!got_next) {
|
||||
err = cbor_value_advance_fixed(it);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
if (isMapType && !(elmCount % 2)) {
|
||||
printf(": ");
|
||||
} else {
|
||||
printf("\n");
|
||||
}
|
||||
elmCount++;
|
||||
}
|
||||
return CborNoError;
|
||||
}
|
||||
|
||||
int TinyCborInit(uint8_t *data, size_t length, CborValue *cb) {
|
||||
CborParser parser;
|
||||
CborError err = cbor_parser_init(data, length, 0, &parser, cb);
|
||||
CborParser parser;
|
||||
CborError err = cbor_parser_init(data, length, 0, &parser, cb);
|
||||
if (err)
|
||||
return err;
|
||||
return err;
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int TinyCborPrintFIDOPackage(uint8_t cmdCode, bool isResponse, uint8_t *data, size_t length) {
|
||||
CborValue cb;
|
||||
int res;
|
||||
res = TinyCborInit(data, length, &cb);
|
||||
if (res)
|
||||
return res;
|
||||
CborValue cb;
|
||||
int res;
|
||||
res = TinyCborInit(data, length, &cb);
|
||||
if (res)
|
||||
return res;
|
||||
|
||||
CborError err = dumprecursive(cmdCode, isResponse, &cb, false, 0);
|
||||
|
||||
if (err) {
|
||||
fprintf(stderr,
|
||||
if (err) {
|
||||
fprintf(stderr,
|
||||
#if __WORDSIZE == 64
|
||||
"CBOR parsing failure at offset %" PRId64 " : %s\n",
|
||||
"CBOR parsing failure at offset %" PRId64 " : %s\n",
|
||||
#else
|
||||
"CBOR parsing failure at offset %" PRId32 " : %s\n",
|
||||
"CBOR parsing failure at offset %" PRId32 " : %s\n",
|
||||
#endif
|
||||
cb.ptr - data, cbor_error_string(err));
|
||||
return 1;
|
||||
}
|
||||
cb.ptr - data, cbor_error_string(err));
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int JsonObjElmCount(json_t *elm) {
|
||||
int res = 0;
|
||||
const char *key;
|
||||
json_t *value;
|
||||
int res = 0;
|
||||
const char *key;
|
||||
json_t *value;
|
||||
|
||||
if (!json_is_object(elm))
|
||||
return 0;
|
||||
if (!json_is_object(elm))
|
||||
return 0;
|
||||
|
||||
json_object_foreach(elm, key, value) {
|
||||
if (strlen(key) > 0 && key[0] != '.')
|
||||
res++;
|
||||
}
|
||||
json_object_foreach(elm, key, value) {
|
||||
if (strlen(key) > 0 && key[0] != '.')
|
||||
res++;
|
||||
}
|
||||
|
||||
return res;
|
||||
return res;
|
||||
}
|
||||
|
||||
int JsonToCbor(json_t *elm, CborEncoder *encoder) {
|
||||
if (!elm || !encoder)
|
||||
return 1;
|
||||
if (!elm || !encoder)
|
||||
return 1;
|
||||
|
||||
int res;
|
||||
int res;
|
||||
|
||||
// CBOR map == JSON object
|
||||
if (json_is_object(elm)) {
|
||||
CborEncoder map;
|
||||
const char *key;
|
||||
json_t *value;
|
||||
// CBOR map == JSON object
|
||||
if (json_is_object(elm)) {
|
||||
CborEncoder map;
|
||||
const char *key;
|
||||
json_t *value;
|
||||
|
||||
res = cbor_encoder_create_map(encoder, &map, JsonObjElmCount(elm));
|
||||
cbor_check(res);
|
||||
res = cbor_encoder_create_map(encoder, &map, JsonObjElmCount(elm));
|
||||
cbor_check(res);
|
||||
|
||||
json_object_foreach(elm, key, value) {
|
||||
if (strlen(key) > 0 && key[0] != '.') {
|
||||
res = cbor_encode_text_stringz(&map, key);
|
||||
cbor_check(res);
|
||||
json_object_foreach(elm, key, value) {
|
||||
if (strlen(key) > 0 && key[0] != '.') {
|
||||
res = cbor_encode_text_stringz(&map, key);
|
||||
cbor_check(res);
|
||||
|
||||
// RECURSION!
|
||||
JsonToCbor(value, &map);
|
||||
}
|
||||
}
|
||||
// RECURSION!
|
||||
JsonToCbor(value, &map);
|
||||
}
|
||||
}
|
||||
|
||||
res = cbor_encoder_close_container(encoder, &map);
|
||||
cbor_check(res);
|
||||
}
|
||||
res = cbor_encoder_close_container(encoder, &map);
|
||||
cbor_check(res);
|
||||
}
|
||||
|
||||
// CBOR array == JSON array
|
||||
if (json_is_array(elm)) {
|
||||
size_t index;
|
||||
json_t *value;
|
||||
CborEncoder array;
|
||||
// CBOR array == JSON array
|
||||
if (json_is_array(elm)) {
|
||||
size_t index;
|
||||
json_t *value;
|
||||
CborEncoder array;
|
||||
|
||||
res = cbor_encoder_create_array(encoder, &array, json_array_size(elm));
|
||||
cbor_check(res);
|
||||
res = cbor_encoder_create_array(encoder, &array, json_array_size(elm));
|
||||
cbor_check(res);
|
||||
|
||||
json_array_foreach(elm, index, value) {
|
||||
// RECURSION!
|
||||
JsonToCbor(value, &array);
|
||||
}
|
||||
json_array_foreach(elm, index, value) {
|
||||
// RECURSION!
|
||||
JsonToCbor(value, &array);
|
||||
}
|
||||
|
||||
res = cbor_encoder_close_container(encoder, &array);
|
||||
cbor_check(res);
|
||||
}
|
||||
res = cbor_encoder_close_container(encoder, &array);
|
||||
cbor_check(res);
|
||||
}
|
||||
|
||||
if (json_is_boolean(elm)) {
|
||||
res = cbor_encode_boolean(encoder, json_is_true(elm));
|
||||
cbor_check(res);
|
||||
}
|
||||
if (json_is_boolean(elm)) {
|
||||
res = cbor_encode_boolean(encoder, json_is_true(elm));
|
||||
cbor_check(res);
|
||||
}
|
||||
|
||||
if (json_is_integer(elm)) {
|
||||
res = cbor_encode_int(encoder, json_integer_value(elm));
|
||||
cbor_check(res);
|
||||
}
|
||||
if (json_is_integer(elm)) {
|
||||
res = cbor_encode_int(encoder, json_integer_value(elm));
|
||||
cbor_check(res);
|
||||
}
|
||||
|
||||
if (json_is_real(elm)) {
|
||||
res = cbor_encode_float(encoder, json_real_value(elm));
|
||||
cbor_check(res);
|
||||
}
|
||||
if (json_is_real(elm)) {
|
||||
res = cbor_encode_float(encoder, json_real_value(elm));
|
||||
cbor_check(res);
|
||||
}
|
||||
|
||||
if (json_is_string(elm)) {
|
||||
const char * val = json_string_value(elm);
|
||||
if (CheckStringIsHEXValue(val)) {
|
||||
size_t datalen = 0;
|
||||
uint8_t data[4096] = {0};
|
||||
res = JsonLoadBufAsHex(elm, "$", data, sizeof(data), &datalen);
|
||||
if (res)
|
||||
return 100;
|
||||
if (json_is_string(elm)) {
|
||||
const char * val = json_string_value(elm);
|
||||
if (CheckStringIsHEXValue(val)) {
|
||||
size_t datalen = 0;
|
||||
uint8_t data[4096] = {0};
|
||||
res = JsonLoadBufAsHex(elm, "$", data, sizeof(data), &datalen);
|
||||
if (res)
|
||||
return 100;
|
||||
|
||||
res = cbor_encode_byte_string(encoder, data, datalen);
|
||||
cbor_check(res);
|
||||
} else {
|
||||
res = cbor_encode_text_stringz(encoder, val);
|
||||
cbor_check(res);
|
||||
}
|
||||
}
|
||||
res = cbor_encode_byte_string(encoder, data, datalen);
|
||||
cbor_check(res);
|
||||
} else {
|
||||
res = cbor_encode_text_stringz(encoder, val);
|
||||
cbor_check(res);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int CborMapGetKeyById(CborParser *parser, CborValue *map, uint8_t *data, size_t dataLen, int key) {
|
||||
CborValue cb;
|
||||
CborValue cb;
|
||||
|
||||
CborError err = cbor_parser_init(data, dataLen, 0, parser, &cb);
|
||||
cbor_check(err);
|
||||
CborError err = cbor_parser_init(data, dataLen, 0, parser, &cb);
|
||||
cbor_check(err);
|
||||
|
||||
if (cbor_value_get_type(&cb) != CborMapType)
|
||||
return 1;
|
||||
if (cbor_value_get_type(&cb) != CborMapType)
|
||||
return 1;
|
||||
|
||||
err = cbor_value_enter_container(&cb, map);
|
||||
cbor_check(err);
|
||||
err = cbor_value_enter_container(&cb, map);
|
||||
cbor_check(err);
|
||||
|
||||
int64_t indx;
|
||||
while (!cbor_value_at_end(map)) {
|
||||
// check number
|
||||
if (cbor_value_get_type(map) != CborIntegerType)
|
||||
return 1;
|
||||
int64_t indx;
|
||||
while (!cbor_value_at_end(map)) {
|
||||
// check number
|
||||
if (cbor_value_get_type(map) != CborIntegerType)
|
||||
return 1;
|
||||
|
||||
cbor_value_get_int64(map, &indx);
|
||||
cbor_value_get_int64(map, &indx);
|
||||
|
||||
err = cbor_value_advance(map);
|
||||
cbor_check(err);
|
||||
err = cbor_value_advance(map);
|
||||
cbor_check(err);
|
||||
|
||||
if (indx == key)
|
||||
return 0;
|
||||
if (indx == key)
|
||||
return 0;
|
||||
|
||||
// pass value
|
||||
err = cbor_value_advance(map);
|
||||
cbor_check(err);
|
||||
}
|
||||
// pass value
|
||||
err = cbor_value_advance(map);
|
||||
cbor_check(err);
|
||||
}
|
||||
|
||||
err = cbor_value_leave_container(&cb, map);
|
||||
cbor_check(err);
|
||||
err = cbor_value_leave_container(&cb, map);
|
||||
cbor_check(err);
|
||||
|
||||
return 2;
|
||||
return 2;
|
||||
}
|
||||
|
||||
CborError CborGetArrayBinStringValue(CborValue *elm, uint8_t *data, size_t maxdatalen, size_t *datalen) {
|
||||
return CborGetArrayBinStringValueEx(elm, data, maxdatalen, datalen, NULL, 0);
|
||||
return CborGetArrayBinStringValueEx(elm, data, maxdatalen, datalen, NULL, 0);
|
||||
}
|
||||
|
||||
CborError CborGetArrayBinStringValueEx(CborValue *elm, uint8_t *data, size_t maxdatalen, size_t *datalen, uint8_t *delimeter, size_t delimeterlen) {
|
||||
CborValue array;
|
||||
if (datalen)
|
||||
*datalen = 0;
|
||||
CborValue array;
|
||||
if (datalen)
|
||||
*datalen = 0;
|
||||
|
||||
size_t slen = maxdatalen;
|
||||
size_t totallen = 0;
|
||||
size_t slen = maxdatalen;
|
||||
size_t totallen = 0;
|
||||
|
||||
CborError res = cbor_value_enter_container(elm, &array);
|
||||
cbor_check(res);
|
||||
CborError res = cbor_value_enter_container(elm, &array);
|
||||
cbor_check(res);
|
||||
|
||||
while (!cbor_value_at_end(&array)) {
|
||||
res = cbor_value_copy_byte_string(&array, &data[totallen], &slen, &array);
|
||||
cbor_check(res);
|
||||
while (!cbor_value_at_end(&array)) {
|
||||
res = cbor_value_copy_byte_string(&array, &data[totallen], &slen, &array);
|
||||
cbor_check(res);
|
||||
|
||||
totallen += slen;
|
||||
if (delimeter) {
|
||||
memcpy(&data[totallen], delimeter, delimeterlen);
|
||||
totallen += delimeterlen;
|
||||
}
|
||||
slen = maxdatalen - totallen;
|
||||
}
|
||||
totallen += slen;
|
||||
if (delimeter) {
|
||||
memcpy(&data[totallen], delimeter, delimeterlen);
|
||||
totallen += delimeterlen;
|
||||
}
|
||||
slen = maxdatalen - totallen;
|
||||
}
|
||||
|
||||
res = cbor_value_leave_container(elm, &array);
|
||||
cbor_check(res);
|
||||
res = cbor_value_leave_container(elm, &array);
|
||||
cbor_check(res);
|
||||
|
||||
if (datalen)
|
||||
*datalen = totallen;
|
||||
if (datalen)
|
||||
*datalen = totallen;
|
||||
|
||||
return CborNoError;
|
||||
return CborNoError;
|
||||
};
|
||||
|
||||
CborError CborGetBinStringValue(CborValue *elm, uint8_t *data, size_t maxdatalen, size_t *datalen) {
|
||||
if (datalen)
|
||||
*datalen = 0;
|
||||
if (datalen)
|
||||
*datalen = 0;
|
||||
|
||||
size_t slen = maxdatalen;
|
||||
size_t slen = maxdatalen;
|
||||
|
||||
CborError res = cbor_value_copy_byte_string(elm, data, &slen, elm);
|
||||
cbor_check(res);
|
||||
CborError res = cbor_value_copy_byte_string(elm, data, &slen, elm);
|
||||
cbor_check(res);
|
||||
|
||||
if (datalen)
|
||||
*datalen = slen;
|
||||
if (datalen)
|
||||
*datalen = slen;
|
||||
|
||||
return CborNoError;
|
||||
return CborNoError;
|
||||
};
|
||||
|
||||
CborError CborGetArrayStringValue(CborValue *elm, char *data, size_t maxdatalen, size_t *datalen, char *delimeter) {
|
||||
CborValue array;
|
||||
if (datalen)
|
||||
*datalen = 0;
|
||||
CborValue array;
|
||||
if (datalen)
|
||||
*datalen = 0;
|
||||
|
||||
size_t slen = maxdatalen;
|
||||
size_t totallen = 0;
|
||||
size_t slen = maxdatalen;
|
||||
size_t totallen = 0;
|
||||
|
||||
CborError res = cbor_value_enter_container(elm, &array);
|
||||
cbor_check(res);
|
||||
CborError res = cbor_value_enter_container(elm, &array);
|
||||
cbor_check(res);
|
||||
|
||||
while (!cbor_value_at_end(&array)) {
|
||||
res = cbor_value_copy_text_string(&array, &data[totallen], &slen, &array);
|
||||
cbor_check(res);
|
||||
while (!cbor_value_at_end(&array)) {
|
||||
res = cbor_value_copy_text_string(&array, &data[totallen], &slen, &array);
|
||||
cbor_check(res);
|
||||
|
||||
totallen += slen;
|
||||
if (delimeter) {
|
||||
strcat(data, delimeter);
|
||||
totallen += strlen(delimeter);
|
||||
}
|
||||
slen = maxdatalen - totallen;
|
||||
data[totallen] = 0x00;
|
||||
}
|
||||
totallen += slen;
|
||||
if (delimeter) {
|
||||
strcat(data, delimeter);
|
||||
totallen += strlen(delimeter);
|
||||
}
|
||||
slen = maxdatalen - totallen;
|
||||
data[totallen] = 0x00;
|
||||
}
|
||||
|
||||
res = cbor_value_leave_container(elm, &array);
|
||||
cbor_check(res);
|
||||
res = cbor_value_leave_container(elm, &array);
|
||||
cbor_check(res);
|
||||
|
||||
if (datalen)
|
||||
*datalen = totallen;
|
||||
if (datalen)
|
||||
*datalen = totallen;
|
||||
|
||||
return CborNoError;
|
||||
return CborNoError;
|
||||
};
|
||||
|
||||
CborError CborGetStringValue(CborValue *elm, char *data, size_t maxdatalen, size_t *datalen) {
|
||||
if (datalen)
|
||||
*datalen = 0;
|
||||
if (datalen)
|
||||
*datalen = 0;
|
||||
|
||||
size_t slen = maxdatalen;
|
||||
size_t slen = maxdatalen;
|
||||
|
||||
CborError res = cbor_value_copy_text_string(elm, data, &slen, elm);
|
||||
cbor_check(res);
|
||||
CborError res = cbor_value_copy_text_string(elm, data, &slen, elm);
|
||||
cbor_check(res);
|
||||
|
||||
if (datalen)
|
||||
*datalen = slen;
|
||||
if (datalen)
|
||||
*datalen = slen;
|
||||
|
||||
return CborNoError;
|
||||
return CborNoError;
|
||||
};
|
||||
|
||||
CborError CborGetStringValueBuf(CborValue *elm) {
|
||||
static char stringBuf[2048];
|
||||
memset(stringBuf, 0x00, sizeof(stringBuf));
|
||||
static char stringBuf[2048];
|
||||
memset(stringBuf, 0x00, sizeof(stringBuf));
|
||||
|
||||
return CborGetStringValue(elm, stringBuf, sizeof(stringBuf), NULL);
|
||||
return CborGetStringValue(elm, stringBuf, sizeof(stringBuf), NULL);
|
||||
};
|
||||
|
||||
int CBOREncodeElm(json_t *root, char *rootElmId, CborEncoder *encoder) {
|
||||
json_t *elm = NULL;
|
||||
if (rootElmId && strlen(rootElmId) && rootElmId[0] == '$')
|
||||
elm = json_path_get(root, rootElmId);
|
||||
else
|
||||
elm = json_object_get(root, rootElmId);
|
||||
json_t *elm = NULL;
|
||||
if (rootElmId && strlen(rootElmId) && rootElmId[0] == '$')
|
||||
elm = json_path_get(root, rootElmId);
|
||||
else
|
||||
elm = json_object_get(root, rootElmId);
|
||||
|
||||
if (!elm)
|
||||
return 1;
|
||||
if (!elm)
|
||||
return 1;
|
||||
|
||||
int res = JsonToCbor(elm, encoder);
|
||||
int res = JsonToCbor(elm, encoder);
|
||||
|
||||
return res;
|
||||
return res;
|
||||
}
|
||||
|
||||
CborError CBOREncodeClientDataHash(json_t *root, CborEncoder *encoder) {
|
||||
uint8_t buf[100] = {0};
|
||||
size_t jlen;
|
||||
uint8_t buf[100] = {0};
|
||||
size_t jlen;
|
||||
|
||||
JsonLoadBufAsHex(root, "$.ClientDataHash", buf, sizeof(buf), &jlen);
|
||||
JsonLoadBufAsHex(root, "$.ClientDataHash", buf, sizeof(buf), &jlen);
|
||||
|
||||
// fill with 0x00 if not found
|
||||
if (!jlen)
|
||||
jlen = 32;
|
||||
// fill with 0x00 if not found
|
||||
if (!jlen)
|
||||
jlen = 32;
|
||||
|
||||
int res = cbor_encode_byte_string(encoder, buf, jlen);
|
||||
cbor_check(res);
|
||||
int res = cbor_encode_byte_string(encoder, buf, jlen);
|
||||
cbor_check(res);
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -18,222 +18,222 @@
|
|||
static const char COSEEmptyStr[] = "";
|
||||
|
||||
typedef struct {
|
||||
int Value;
|
||||
char *Name;
|
||||
char *Description;
|
||||
int Value;
|
||||
char *Name;
|
||||
char *Description;
|
||||
} COSEValueNameDesc_t;
|
||||
|
||||
typedef struct {
|
||||
int Value;
|
||||
char *Type;
|
||||
char *Name;
|
||||
char *Description;
|
||||
int Value;
|
||||
char *Type;
|
||||
char *Name;
|
||||
char *Description;
|
||||
} COSEValueTypeNameDesc_t;
|
||||
|
||||
// kty - Key Type Values
|
||||
COSEValueNameDesc_t COSEKeyTypeValueDesc[] = {
|
||||
{0, "Reserved", "Reserved"},
|
||||
{1, "OKP", "Octet Key Pair"},
|
||||
{2, "EC2", "Elliptic Curve Key w/ x- and y-coordinate pair"},
|
||||
{4, "Symmetric", "Symmetric Key"},
|
||||
{0, "Reserved", "Reserved"},
|
||||
{1, "OKP", "Octet Key Pair"},
|
||||
{2, "EC2", "Elliptic Curve Key w/ x- and y-coordinate pair"},
|
||||
{4, "Symmetric", "Symmetric Key"},
|
||||
};
|
||||
|
||||
COSEValueNameDesc_t *GetCOSEktyElm(int id) {
|
||||
for (int i = 0; i < ARRAYLEN(COSEKeyTypeValueDesc); i++)
|
||||
if (COSEKeyTypeValueDesc[i].Value == id)
|
||||
return &COSEKeyTypeValueDesc[i];
|
||||
return NULL;
|
||||
for (int i = 0; i < ARRAYLEN(COSEKeyTypeValueDesc); i++)
|
||||
if (COSEKeyTypeValueDesc[i].Value == id)
|
||||
return &COSEKeyTypeValueDesc[i];
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const char *GetCOSEktyDescription(int id) {
|
||||
COSEValueNameDesc_t *elm = GetCOSEktyElm(id);
|
||||
if (elm)
|
||||
return elm->Description;
|
||||
return COSEEmptyStr;
|
||||
COSEValueNameDesc_t *elm = GetCOSEktyElm(id);
|
||||
if (elm)
|
||||
return elm->Description;
|
||||
return COSEEmptyStr;
|
||||
}
|
||||
|
||||
// keys
|
||||
COSEValueTypeNameDesc_t COSECurvesDesc[] = {
|
||||
{1, "EC2", "P-256", "NIST P-256 also known as secp256r1"},
|
||||
{2, "EC2", "P-384", "NIST P-384 also known as secp384r1"},
|
||||
{3, "EC2", "P-521", "NIST P-521 also known as secp521r1"},
|
||||
{4, "OKP", "X25519", "X25519 for use w/ ECDH only"},
|
||||
{5, "OKP", "X448", "X448 for use w/ ECDH only"},
|
||||
{6, "OKP", "Ed25519", "Ed25519 for use w/ EdDSA only"},
|
||||
{7, "OKP", "Ed448", "Ed448 for use w/ EdDSA only"},
|
||||
{1, "EC2", "P-256", "NIST P-256 also known as secp256r1"},
|
||||
{2, "EC2", "P-384", "NIST P-384 also known as secp384r1"},
|
||||
{3, "EC2", "P-521", "NIST P-521 also known as secp521r1"},
|
||||
{4, "OKP", "X25519", "X25519 for use w/ ECDH only"},
|
||||
{5, "OKP", "X448", "X448 for use w/ ECDH only"},
|
||||
{6, "OKP", "Ed25519", "Ed25519 for use w/ EdDSA only"},
|
||||
{7, "OKP", "Ed448", "Ed448 for use w/ EdDSA only"},
|
||||
};
|
||||
|
||||
COSEValueTypeNameDesc_t *GetCOSECurveElm(int id) {
|
||||
for (int i = 0; i < ARRAYLEN(COSECurvesDesc); i++)
|
||||
if (COSECurvesDesc[i].Value == id)
|
||||
return &COSECurvesDesc[i];
|
||||
return NULL;
|
||||
for (int i = 0; i < ARRAYLEN(COSECurvesDesc); i++)
|
||||
if (COSECurvesDesc[i].Value == id)
|
||||
return &COSECurvesDesc[i];
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const char *GetCOSECurveDescription(int id) {
|
||||
COSEValueTypeNameDesc_t *elm = GetCOSECurveElm(id);
|
||||
if (elm)
|
||||
return elm->Description;
|
||||
return COSEEmptyStr;
|
||||
COSEValueTypeNameDesc_t *elm = GetCOSECurveElm(id);
|
||||
if (elm)
|
||||
return elm->Description;
|
||||
return COSEEmptyStr;
|
||||
}
|
||||
|
||||
// RFC8152 https://www.iana.org/assignments/cose/cose.xhtml#algorithms
|
||||
COSEValueNameDesc_t COSEAlg[] = {
|
||||
{-65536, "Unassigned", "Unassigned"},
|
||||
{-65535, "RS1", "RSASSA-PKCS1-v1_5 w/ SHA-1"},
|
||||
{-259, "RS512", "RSASSA-PKCS1-v1_5 w/ SHA-512"},
|
||||
{-258, "RS384", "RSASSA-PKCS1-v1_5 w/ SHA-384"},
|
||||
{-257, "RS256", "RSASSA-PKCS1-v1_5 w/ SHA-256"},
|
||||
{-42, "RSAES-OAEP w/ SHA-512", "RSAES-OAEP w/ SHA-512"},
|
||||
{-41, "RSAES-OAEP w/ SHA-256", "RSAES-OAEP w/ SHA-256"},
|
||||
{-40, "RSAES-OAEP w/ RFC 8017 def param", "RSAES-OAEP w/ SHA-1"},
|
||||
{-39, "PS512", "RSASSA-PSS w/ SHA-512"},
|
||||
{-38, "PS384", "RSASSA-PSS w/ SHA-384"},
|
||||
{-37, "PS256", "RSASSA-PSS w/ SHA-256"},
|
||||
{-36, "ES512", "ECDSA w/ SHA-512"},
|
||||
{-35, "ES384", "ECDSA w/ SHA-384"},
|
||||
{-34, "ECDH-SS + A256KW", "ECDH SS w/ Concat KDF and AES Key Wrap w/ 256-bit key"},
|
||||
{-33, "ECDH-SS + A192KW", "ECDH SS w/ Concat KDF and AES Key Wrap w/ 192-bit key"},
|
||||
{-32, "ECDH-SS + A128KW", "ECDH SS w/ Concat KDF and AES Key Wrap w/ 128-bit key"},
|
||||
{-31, "ECDH-ES + A256KW", "ECDH ES w/ Concat KDF and AES Key Wrap w/ 256-bit key"},
|
||||
{-30, "ECDH-ES + A192KW", "ECDH ES w/ Concat KDF and AES Key Wrap w/ 192-bit key"},
|
||||
{-29, "ECDH-ES + A128KW", "ECDH ES w/ Concat KDF and AES Key Wrap w/ 128-bit key"},
|
||||
{-28, "ECDH-SS + HKDF-512", "ECDH SS w/ HKDF - generate key directly"},
|
||||
{-27, "ECDH-SS + HKDF-256", "ECDH SS w/ HKDF - generate key directly"},
|
||||
{-26, "ECDH-ES + HKDF-512", "ECDH ES w/ HKDF - generate key directly"},
|
||||
{-25, "ECDH-ES + HKDF-256", "ECDH ES w/ HKDF - generate key directly"},
|
||||
{-13, "direct+HKDF-AES-256", "Shared secret w/ AES-MAC 256-bit key"},
|
||||
{-12, "direct+HKDF-AES-128", "Shared secret w/ AES-MAC 128-bit key"},
|
||||
{-11, "direct+HKDF-SHA-512", "Shared secret w/ HKDF and SHA-512"},
|
||||
{-10, "direct+HKDF-SHA-256", "Shared secret w/ HKDF and SHA-256"},
|
||||
{-8, "EdDSA", "EdDSA"},
|
||||
{-7, "ES256", "ECDSA w/ SHA-256"},
|
||||
{-6, "direct", "Direct use of CEK"},
|
||||
{-5, "A256KW", "AES Key Wrap w/ 256-bit key"},
|
||||
{-4, "A192KW", "AES Key Wrap w/ 192-bit key"},
|
||||
{-3, "A128KW", "AES Key Wrap w/ 128-bit key"},
|
||||
{0, "Reserved", "Reserved"},
|
||||
{1, "A128GCM", "AES-GCM mode w/ 128-bit key, 128-bit tag"},
|
||||
{2, "A192GCM", "AES-GCM mode w/ 192-bit key, 128-bit tag"},
|
||||
{3, "A256GCM", "AES-GCM mode w/ 256-bit key, 128-bit tag"},
|
||||
{4, "HMAC 256/64", "HMAC w/ SHA-256 truncated to 64 bits"},
|
||||
{5, "HMAC 256/256", "HMAC w/ SHA-256"},
|
||||
{6, "HMAC 384/384", "HMAC w/ SHA-384"},
|
||||
{7, "HMAC 512/512", "HMAC w/ SHA-512"},
|
||||
{10, "AES-CCM-16-64-128", "AES-CCM mode 128-bit key, 64-bit tag, 13-byte nonce"},
|
||||
{11, "AES-CCM-16-64-256", "AES-CCM mode 256-bit key, 64-bit tag, 13-byte nonce"},
|
||||
{12, "AES-CCM-64-64-128", "AES-CCM mode 128-bit key, 64-bit tag, 7-byte nonce"},
|
||||
{13, "AES-CCM-64-64-256", "AES-CCM mode 256-bit key, 64-bit tag, 7-byte nonce"},
|
||||
{14, "AES-MAC 128/64", "AES-MAC 128-bit key, 64-bit tag"},
|
||||
{15, "AES-MAC 256/64", "AES-MAC 256-bit key, 64-bit tag"},
|
||||
{24, "ChaCha20/Poly1305", "ChaCha20/Poly1305 w/ 256-bit key, 128-bit tag"},
|
||||
{25, "AES-MAC 128/128", "AES-MAC 128-bit key, 128-bit tag"},
|
||||
{26, "AES-MAC 256/128", "AES-MAC 256-bit key, 128-bit tag"},
|
||||
{30, "AES-CCM-16-128-128", "AES-CCM mode 128-bit key, 128-bit tag, 13-byte nonce"},
|
||||
{31, "AES-CCM-16-128-256", "AES-CCM mode 256-bit key, 128-bit tag, 13-byte nonce"},
|
||||
{32, "AES-CCM-64-128-128", "AES-CCM mode 128-bit key, 128-bit tag, 7-byte nonce"},
|
||||
{33, "AES-CCM-64-128-256", "AES-CCM mode 256-bit key, 128-bit tag, 7-byte nonce"}
|
||||
{-65536, "Unassigned", "Unassigned"},
|
||||
{-65535, "RS1", "RSASSA-PKCS1-v1_5 w/ SHA-1"},
|
||||
{-259, "RS512", "RSASSA-PKCS1-v1_5 w/ SHA-512"},
|
||||
{-258, "RS384", "RSASSA-PKCS1-v1_5 w/ SHA-384"},
|
||||
{-257, "RS256", "RSASSA-PKCS1-v1_5 w/ SHA-256"},
|
||||
{-42, "RSAES-OAEP w/ SHA-512", "RSAES-OAEP w/ SHA-512"},
|
||||
{-41, "RSAES-OAEP w/ SHA-256", "RSAES-OAEP w/ SHA-256"},
|
||||
{-40, "RSAES-OAEP w/ RFC 8017 def param", "RSAES-OAEP w/ SHA-1"},
|
||||
{-39, "PS512", "RSASSA-PSS w/ SHA-512"},
|
||||
{-38, "PS384", "RSASSA-PSS w/ SHA-384"},
|
||||
{-37, "PS256", "RSASSA-PSS w/ SHA-256"},
|
||||
{-36, "ES512", "ECDSA w/ SHA-512"},
|
||||
{-35, "ES384", "ECDSA w/ SHA-384"},
|
||||
{-34, "ECDH-SS + A256KW", "ECDH SS w/ Concat KDF and AES Key Wrap w/ 256-bit key"},
|
||||
{-33, "ECDH-SS + A192KW", "ECDH SS w/ Concat KDF and AES Key Wrap w/ 192-bit key"},
|
||||
{-32, "ECDH-SS + A128KW", "ECDH SS w/ Concat KDF and AES Key Wrap w/ 128-bit key"},
|
||||
{-31, "ECDH-ES + A256KW", "ECDH ES w/ Concat KDF and AES Key Wrap w/ 256-bit key"},
|
||||
{-30, "ECDH-ES + A192KW", "ECDH ES w/ Concat KDF and AES Key Wrap w/ 192-bit key"},
|
||||
{-29, "ECDH-ES + A128KW", "ECDH ES w/ Concat KDF and AES Key Wrap w/ 128-bit key"},
|
||||
{-28, "ECDH-SS + HKDF-512", "ECDH SS w/ HKDF - generate key directly"},
|
||||
{-27, "ECDH-SS + HKDF-256", "ECDH SS w/ HKDF - generate key directly"},
|
||||
{-26, "ECDH-ES + HKDF-512", "ECDH ES w/ HKDF - generate key directly"},
|
||||
{-25, "ECDH-ES + HKDF-256", "ECDH ES w/ HKDF - generate key directly"},
|
||||
{-13, "direct+HKDF-AES-256", "Shared secret w/ AES-MAC 256-bit key"},
|
||||
{-12, "direct+HKDF-AES-128", "Shared secret w/ AES-MAC 128-bit key"},
|
||||
{-11, "direct+HKDF-SHA-512", "Shared secret w/ HKDF and SHA-512"},
|
||||
{-10, "direct+HKDF-SHA-256", "Shared secret w/ HKDF and SHA-256"},
|
||||
{-8, "EdDSA", "EdDSA"},
|
||||
{-7, "ES256", "ECDSA w/ SHA-256"},
|
||||
{-6, "direct", "Direct use of CEK"},
|
||||
{-5, "A256KW", "AES Key Wrap w/ 256-bit key"},
|
||||
{-4, "A192KW", "AES Key Wrap w/ 192-bit key"},
|
||||
{-3, "A128KW", "AES Key Wrap w/ 128-bit key"},
|
||||
{0, "Reserved", "Reserved"},
|
||||
{1, "A128GCM", "AES-GCM mode w/ 128-bit key, 128-bit tag"},
|
||||
{2, "A192GCM", "AES-GCM mode w/ 192-bit key, 128-bit tag"},
|
||||
{3, "A256GCM", "AES-GCM mode w/ 256-bit key, 128-bit tag"},
|
||||
{4, "HMAC 256/64", "HMAC w/ SHA-256 truncated to 64 bits"},
|
||||
{5, "HMAC 256/256", "HMAC w/ SHA-256"},
|
||||
{6, "HMAC 384/384", "HMAC w/ SHA-384"},
|
||||
{7, "HMAC 512/512", "HMAC w/ SHA-512"},
|
||||
{10, "AES-CCM-16-64-128", "AES-CCM mode 128-bit key, 64-bit tag, 13-byte nonce"},
|
||||
{11, "AES-CCM-16-64-256", "AES-CCM mode 256-bit key, 64-bit tag, 13-byte nonce"},
|
||||
{12, "AES-CCM-64-64-128", "AES-CCM mode 128-bit key, 64-bit tag, 7-byte nonce"},
|
||||
{13, "AES-CCM-64-64-256", "AES-CCM mode 256-bit key, 64-bit tag, 7-byte nonce"},
|
||||
{14, "AES-MAC 128/64", "AES-MAC 128-bit key, 64-bit tag"},
|
||||
{15, "AES-MAC 256/64", "AES-MAC 256-bit key, 64-bit tag"},
|
||||
{24, "ChaCha20/Poly1305", "ChaCha20/Poly1305 w/ 256-bit key, 128-bit tag"},
|
||||
{25, "AES-MAC 128/128", "AES-MAC 128-bit key, 128-bit tag"},
|
||||
{26, "AES-MAC 256/128", "AES-MAC 256-bit key, 128-bit tag"},
|
||||
{30, "AES-CCM-16-128-128", "AES-CCM mode 128-bit key, 128-bit tag, 13-byte nonce"},
|
||||
{31, "AES-CCM-16-128-256", "AES-CCM mode 256-bit key, 128-bit tag, 13-byte nonce"},
|
||||
{32, "AES-CCM-64-128-128", "AES-CCM mode 128-bit key, 128-bit tag, 7-byte nonce"},
|
||||
{33, "AES-CCM-64-128-256", "AES-CCM mode 256-bit key, 128-bit tag, 7-byte nonce"}
|
||||
};
|
||||
|
||||
COSEValueNameDesc_t *GetCOSEAlgElm(int id) {
|
||||
for (int i = 0; i < ARRAYLEN(COSEAlg); i++)
|
||||
if (COSEAlg[i].Value == id)
|
||||
return &COSEAlg[i];
|
||||
return NULL;
|
||||
for (int i = 0; i < ARRAYLEN(COSEAlg); i++)
|
||||
if (COSEAlg[i].Value == id)
|
||||
return &COSEAlg[i];
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const char *GetCOSEAlgName(int id) {
|
||||
COSEValueNameDesc_t *elm = GetCOSEAlgElm(id);
|
||||
if (elm)
|
||||
return elm->Name;
|
||||
return COSEEmptyStr;
|
||||
COSEValueNameDesc_t *elm = GetCOSEAlgElm(id);
|
||||
if (elm)
|
||||
return elm->Name;
|
||||
return COSEEmptyStr;
|
||||
}
|
||||
|
||||
const char *GetCOSEAlgDescription(int id) {
|
||||
COSEValueNameDesc_t *elm = GetCOSEAlgElm(id);
|
||||
if (elm)
|
||||
return elm->Description;
|
||||
return COSEEmptyStr;
|
||||
COSEValueNameDesc_t *elm = GetCOSEAlgElm(id);
|
||||
if (elm)
|
||||
return elm->Description;
|
||||
return COSEEmptyStr;
|
||||
}
|
||||
|
||||
int COSEGetECDSAKey(uint8_t *data, size_t datalen, bool verbose, uint8_t *public_key) {
|
||||
CborParser parser;
|
||||
CborValue map;
|
||||
int64_t i64;
|
||||
size_t len;
|
||||
CborParser parser;
|
||||
CborValue map;
|
||||
int64_t i64;
|
||||
size_t len;
|
||||
|
||||
if(verbose)
|
||||
PrintAndLog("----------- CBOR decode ----------------");
|
||||
if(verbose)
|
||||
PrintAndLog("----------- CBOR decode ----------------");
|
||||
|
||||
// kty
|
||||
int res = CborMapGetKeyById(&parser, &map, data, datalen, 1);
|
||||
if(!res) {
|
||||
cbor_value_get_int64(&map, &i64);
|
||||
if(verbose)
|
||||
PrintAndLog("kty [%lld] %s", (long long)i64, GetCOSEktyDescription(i64));
|
||||
if (i64 != 2)
|
||||
PrintAndLog("ERROR: kty must be 2.");
|
||||
}
|
||||
// kty
|
||||
int res = CborMapGetKeyById(&parser, &map, data, datalen, 1);
|
||||
if(!res) {
|
||||
cbor_value_get_int64(&map, &i64);
|
||||
if(verbose)
|
||||
PrintAndLog("kty [%lld] %s", (long long)i64, GetCOSEktyDescription(i64));
|
||||
if (i64 != 2)
|
||||
PrintAndLog("ERROR: kty must be 2.");
|
||||
}
|
||||
|
||||
// algorithm
|
||||
res = CborMapGetKeyById(&parser, &map, data, datalen, 3);
|
||||
if(!res) {
|
||||
cbor_value_get_int64(&map, &i64);
|
||||
if(verbose)
|
||||
PrintAndLog("algorithm [%lld] %s", (long long)i64, GetCOSEAlgDescription(i64));
|
||||
if (i64 != -7)
|
||||
PrintAndLog("ERROR: algorithm must be -7.");
|
||||
}
|
||||
// algorithm
|
||||
res = CborMapGetKeyById(&parser, &map, data, datalen, 3);
|
||||
if(!res) {
|
||||
cbor_value_get_int64(&map, &i64);
|
||||
if(verbose)
|
||||
PrintAndLog("algorithm [%lld] %s", (long long)i64, GetCOSEAlgDescription(i64));
|
||||
if (i64 != -7)
|
||||
PrintAndLog("ERROR: algorithm must be -7.");
|
||||
}
|
||||
|
||||
// curve
|
||||
res = CborMapGetKeyById(&parser, &map, data, datalen, -1);
|
||||
if(!res) {
|
||||
cbor_value_get_int64(&map, &i64);
|
||||
if(verbose)
|
||||
PrintAndLog("curve [%lld] %s", (long long)i64, GetCOSECurveDescription(i64));
|
||||
if (i64 != 1)
|
||||
PrintAndLog("ERROR: curve must be 1.");
|
||||
}
|
||||
// curve
|
||||
res = CborMapGetKeyById(&parser, &map, data, datalen, -1);
|
||||
if(!res) {
|
||||
cbor_value_get_int64(&map, &i64);
|
||||
if(verbose)
|
||||
PrintAndLog("curve [%lld] %s", (long long)i64, GetCOSECurveDescription(i64));
|
||||
if (i64 != 1)
|
||||
PrintAndLog("ERROR: curve must be 1.");
|
||||
}
|
||||
|
||||
// plain key
|
||||
public_key[0] = 0x04;
|
||||
// plain key
|
||||
public_key[0] = 0x04;
|
||||
|
||||
// x - coordinate
|
||||
res = CborMapGetKeyById(&parser, &map, data, datalen, -2);
|
||||
if(!res) {
|
||||
res = CborGetBinStringValue(&map, &public_key[1], 32, &len);
|
||||
cbor_check(res);
|
||||
if(verbose)
|
||||
PrintAndLog("x - coordinate [%d]: %s", len, sprint_hex(&public_key[1], 32));
|
||||
if (len != 32)
|
||||
PrintAndLog("ERROR: x - coordinate length must be 32.");
|
||||
}
|
||||
// x - coordinate
|
||||
res = CborMapGetKeyById(&parser, &map, data, datalen, -2);
|
||||
if(!res) {
|
||||
res = CborGetBinStringValue(&map, &public_key[1], 32, &len);
|
||||
cbor_check(res);
|
||||
if(verbose)
|
||||
PrintAndLog("x - coordinate [%d]: %s", len, sprint_hex(&public_key[1], 32));
|
||||
if (len != 32)
|
||||
PrintAndLog("ERROR: x - coordinate length must be 32.");
|
||||
}
|
||||
|
||||
// y - coordinate
|
||||
res = CborMapGetKeyById(&parser, &map, data, datalen, -3);
|
||||
if(!res) {
|
||||
res = CborGetBinStringValue(&map, &public_key[33], 32, &len);
|
||||
cbor_check(res);
|
||||
if(verbose)
|
||||
PrintAndLog("y - coordinate [%d]: %s", len, sprint_hex(&public_key[33], 32));
|
||||
if (len != 32)
|
||||
PrintAndLog("ERROR: y - coordinate length must be 32.");
|
||||
}
|
||||
// y - coordinate
|
||||
res = CborMapGetKeyById(&parser, &map, data, datalen, -3);
|
||||
if(!res) {
|
||||
res = CborGetBinStringValue(&map, &public_key[33], 32, &len);
|
||||
cbor_check(res);
|
||||
if(verbose)
|
||||
PrintAndLog("y - coordinate [%d]: %s", len, sprint_hex(&public_key[33], 32));
|
||||
if (len != 32)
|
||||
PrintAndLog("ERROR: y - coordinate length must be 32.");
|
||||
}
|
||||
|
||||
// d - private key
|
||||
uint8_t private_key[128] = {0};
|
||||
res = CborMapGetKeyById(&parser, &map, data, datalen, -4);
|
||||
if(!res) {
|
||||
res = CborGetBinStringValue(&map, private_key, sizeof(private_key), &len);
|
||||
cbor_check(res);
|
||||
if(verbose)
|
||||
PrintAndLog("d - private key [%d]: %s", len, sprint_hex(private_key, len));
|
||||
}
|
||||
// d - private key
|
||||
uint8_t private_key[128] = {0};
|
||||
res = CborMapGetKeyById(&parser, &map, data, datalen, -4);
|
||||
if(!res) {
|
||||
res = CborGetBinStringValue(&map, private_key, sizeof(private_key), &len);
|
||||
cbor_check(res);
|
||||
if(verbose)
|
||||
PrintAndLog("d - private key [%d]: %s", len, sprint_hex(private_key, len));
|
||||
}
|
||||
|
||||
if(verbose)
|
||||
PrintAndLog("----------- CBOR decode ----------------");
|
||||
if(verbose)
|
||||
PrintAndLog("----------- CBOR decode ----------------");
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -18,21 +18,21 @@
|
|||
#include "cmdhf14a.h"
|
||||
|
||||
typedef enum {
|
||||
fido2CmdMakeCredential = 0x01,
|
||||
fido2CmdGetAssertion = 0x02,
|
||||
fido2CmdCancel = 0x03,
|
||||
fido2CmdGetInfo = 0x04,
|
||||
fido2CmdClientPIN = 0x06,
|
||||
fido2CmdReset = 0x07,
|
||||
fido2CmdGetNextAssertion = 0x08,
|
||||
fido2CmdMakeCredential = 0x01,
|
||||
fido2CmdGetAssertion = 0x02,
|
||||
fido2CmdCancel = 0x03,
|
||||
fido2CmdGetInfo = 0x04,
|
||||
fido2CmdClientPIN = 0x06,
|
||||
fido2CmdReset = 0x07,
|
||||
fido2CmdGetNextAssertion = 0x08,
|
||||
|
||||
// another data
|
||||
fido2COSEKey = 0xF0
|
||||
// another data
|
||||
fido2COSEKey = 0xF0
|
||||
} fido2Commands;
|
||||
|
||||
typedef enum {
|
||||
ptQuery,
|
||||
ptResponse,
|
||||
ptQuery,
|
||||
ptResponse,
|
||||
} fido2PacketType;
|
||||
|
||||
extern int FIDOSelect(bool ActivateField, bool LeaveFieldON, uint8_t *Result, size_t MaxResultLen, size_t *ResultLen, uint16_t *sw);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue