refactoring and some functions in cbortools

This commit is contained in:
merlokk 2018-11-24 23:36:02 +02:00
commit 1a0f7e93de
3 changed files with 44 additions and 5 deletions

View file

@ -739,7 +739,7 @@ int MakeCredentionalParseRes(uint8_t *data, size_t dataLen, bool verbose, bool s
} }
if (!strcmp(key, "x5c")) { if (!strcmp(key, "x5c")) {
res = CborGetArrayBinStringValue(&mapsmt, der, sizeof(der), &derLen, NULL); res = CborGetArrayBinStringValue(&mapsmt, der, sizeof(der), &derLen);
cbor_check(res); cbor_check(res);
PrintAndLog("DER [%d]: %s", derLen, sprint_hex(der, derLen)); PrintAndLog("DER [%d]: %s", derLen, sprint_hex(der, derLen));
} }

View file

@ -348,7 +348,11 @@ int CborMapGetKeyById(CborParser *parser, CborValue *map, uint8_t *data, size_t
return 2; 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; CborValue array;
if (datalen) if (datalen)
*datalen = 0; *datalen = 0;
@ -365,8 +369,8 @@ CborError CborGetArrayBinStringValue(CborValue *elm, uint8_t *data, size_t maxda
totallen += slen; totallen += slen;
if (delimeter) { if (delimeter) {
memcpy(&data[totallen], delimeter, 1); // TODO: multibyte memcpy(&data[totallen], delimeter, delimeterlen);
totallen += 1; totallen += delimeterlen;
} }
slen = maxdatalen - totallen; slen = maxdatalen - totallen;
} }
@ -395,6 +399,39 @@ CborError CborGetBinStringValue(CborValue *elm, uint8_t *data, size_t maxdatalen
return CborNoError; 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) { CborError CborGetStringValue(CborValue *elm, char *data, size_t maxdatalen, size_t *datalen) {
if (datalen) if (datalen)
*datalen = 0; *datalen = 0;

View file

@ -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 JsonToCbor(json_t *elm, CborEncoder *encoder);
extern int CborMapGetKeyById(CborParser *parser, CborValue *map, uint8_t *data, size_t dataLen, int key); 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 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 CborGetStringValue(CborValue *elm, char *data, size_t maxdatalen, size_t *datalen);
extern CborError CborGetStringValueBuf(CborValue *elm); extern CborError CborGetStringValueBuf(CborValue *elm);