From 0bbdc7f1500067febd4358a8d2a1fb9fc7ea177a Mon Sep 17 00:00:00 2001 From: merlokk <807634+merlokk@users.noreply.github.com> Date: Sat, 24 Nov 2018 14:57:36 +0200 Subject: [PATCH] added CborGetArrayBinStringValue --- client/fido/cbortools.c | 39 +++++++++++++++++++++++++++++++++++---- client/fido/cbortools.h | 1 + 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/client/fido/cbortools.c b/client/fido/cbortools.c index 5c35bdae5..5bfb76b9a 100644 --- a/client/fido/cbortools.c +++ b/client/fido/cbortools.c @@ -329,8 +329,7 @@ int CborMapGetKeyById(CborParser *parser, CborValue *map, uint8_t *data, size_t if (cbor_value_get_type(map) != CborIntegerType) return 1; - cbor_value_get_int64(map, &indx); - printf("--id %lld\n", (long long)indx); + cbor_value_get_int64(map, &indx); err = cbor_value_advance(map); cbor_check(err); @@ -349,11 +348,43 @@ 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) { + 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_byte_string(&array, &data[totallen], &slen, &array); + cbor_check(res); + + totallen += slen; + if (delimeter) { + memcpy(&data[totallen], delimeter, 1); // TODO: multibyte + totallen += 1; + } + slen = maxdatalen - totallen; + } + + res = cbor_value_leave_container(elm, &array); + cbor_check(res); + + if (datalen) + *datalen = totallen; + + return CborNoError; +}; + CborError CborGetBinStringValue(CborValue *elm, uint8_t *data, size_t maxdatalen, size_t *datalen) { if (datalen) *datalen = 0; - size_t slen = 0; + size_t slen = maxdatalen; CborError res = cbor_value_copy_byte_string(elm, data, &slen, elm); cbor_check(res); @@ -368,7 +399,7 @@ CborError CborGetStringValue(CborValue *elm, char *data, size_t maxdatalen, size if (datalen) *datalen = 0; - size_t slen = 0; + size_t slen = maxdatalen; CborError res = cbor_value_copy_text_string(elm, data, &slen, elm); cbor_check(res); diff --git a/client/fido/cbortools.h b/client/fido/cbortools.h index 3d41c7db6..4d8b023ee 100644 --- a/client/fido/cbortools.h +++ b/client/fido/cbortools.h @@ -25,6 +25,7 @@ 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 CborGetBinStringValue(CborValue *elm, uint8_t *data, size_t maxdatalen, size_t *datalen); extern CborError CborGetStringValue(CborValue *elm, char *data, size_t maxdatalen, size_t *datalen); extern CborError CborGetStringValueBuf(CborValue *elm);