From 1a0f7e93dec69472042d0af2a7992af559f917f1 Mon Sep 17 00:00:00 2001 From: merlokk <807634+merlokk@users.noreply.github.com> Date: Sat, 24 Nov 2018 23:36:02 +0200 Subject: [PATCH] refactoring and some functions in cbortools --- client/cmdhffido.c | 2 +- client/fido/cbortools.c | 43 ++++++++++++++++++++++++++++++++++++++--- client/fido/cbortools.h | 4 +++- 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/client/cmdhffido.c b/client/cmdhffido.c index 9ee4e5f1a..0e81aca6e 100644 --- a/client/cmdhffido.c +++ b/client/cmdhffido.c @@ -739,7 +739,7 @@ int MakeCredentionalParseRes(uint8_t *data, size_t dataLen, bool verbose, bool s } if (!strcmp(key, "x5c")) { - res = CborGetArrayBinStringValue(&mapsmt, der, sizeof(der), &derLen, NULL); + res = CborGetArrayBinStringValue(&mapsmt, der, sizeof(der), &derLen); cbor_check(res); PrintAndLog("DER [%d]: %s", derLen, sprint_hex(der, derLen)); } diff --git a/client/fido/cbortools.c b/client/fido/cbortools.c index 5bfb76b9a..cae5cdc7f 100644 --- a/client/fido/cbortools.c +++ b/client/fido/cbortools.c @@ -348,7 +348,11 @@ int CborMapGetKeyById(CborParser *parser, CborValue *map, uint8_t *data, size_t return 2; } -CborError CborGetArrayBinStringValue(CborValue *elm, uint8_t *data, size_t maxdatalen, size_t *datalen, uint8_t *delimeter) { +CborError CborGetArrayBinStringValue(CborValue *elm, uint8_t *data, size_t maxdatalen, size_t *datalen) { + 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; @@ -365,8 +369,8 @@ CborError CborGetArrayBinStringValue(CborValue *elm, uint8_t *data, size_t maxda totallen += slen; if (delimeter) { - memcpy(&data[totallen], delimeter, 1); // TODO: multibyte - totallen += 1; + memcpy(&data[totallen], delimeter, delimeterlen); + totallen += delimeterlen; } slen = maxdatalen - totallen; } @@ -395,6 +399,39 @@ CborError CborGetBinStringValue(CborValue *elm, uint8_t *data, size_t maxdatalen return CborNoError; }; +CborError CborGetArrayStringValue(CborValue *elm, char *data, size_t maxdatalen, size_t *datalen, char *delimeter) { + CborValue array; + if (datalen) + *datalen = 0; + + size_t slen = maxdatalen; + size_t totallen = 0; + + 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); + + 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); + + if (datalen) + *datalen = totallen; + + return CborNoError; +}; + CborError CborGetStringValue(CborValue *elm, char *data, size_t maxdatalen, size_t *datalen) { if (datalen) *datalen = 0; diff --git a/client/fido/cbortools.h b/client/fido/cbortools.h index 4d8b023ee..a57b4b761 100644 --- a/client/fido/cbortools.h +++ b/client/fido/cbortools.h @@ -25,8 +25,10 @@ extern int TinyCborPrintFIDOPackage(uint8_t cmdCode, bool isResponse, uint8_t *d extern int JsonToCbor(json_t *elm, CborEncoder *encoder); extern int CborMapGetKeyById(CborParser *parser, CborValue *map, uint8_t *data, size_t dataLen, int key); -extern CborError CborGetArrayBinStringValue(CborValue *elm, uint8_t *data, size_t maxdatalen, size_t *datalen, uint8_t *delimeter); +extern CborError CborGetArrayBinStringValue(CborValue *elm, uint8_t *data, size_t maxdatalen, size_t *datalen); +extern CborError CborGetArrayBinStringValueEx(CborValue *elm, uint8_t *data, size_t maxdatalen, size_t *datalen, uint8_t *delimeter, size_t delimeterlen); extern CborError CborGetBinStringValue(CborValue *elm, uint8_t *data, size_t maxdatalen, size_t *datalen); +extern CborError CborGetArrayStringValue(CborValue *elm, char *data, size_t maxdatalen, size_t *datalen, char *delimeter); extern CborError CborGetStringValue(CborValue *elm, char *data, size_t maxdatalen, size_t *datalen); extern CborError CborGetStringValueBuf(CborValue *elm);