fix a bunch of tag processing
diff --git a/inc/qcbor/qcbor_common.h b/inc/qcbor/qcbor_common.h
index a38e13a..37b910b 100644
--- a/inc/qcbor/qcbor_common.h
+++ b/inc/qcbor/qcbor_common.h
@@ -160,6 +160,10 @@
/** Tag for COSE format encryption. See [RFC 8152, COSE]
(https://tools.ietf.org/html/rfc8152). No API is provided for this
tag. */
+
+#define CBOR_TAG_CBOR_SEQUENCE 63
+
+
#define CBOR_TAG_ENCRYPT 96
/** Tag for COSE format MAC. See [RFC 8152, COSE]
(https://tools.ietf.org/html/rfc8152). No API is provided for this
diff --git a/inc/qcbor/qcbor_decode.h b/inc/qcbor/qcbor_decode.h
index df145d2..3961449 100644
--- a/inc/qcbor/qcbor_decode.h
+++ b/inc/qcbor/qcbor_decode.h
@@ -256,6 +256,8 @@
#define QBCOR_TYPE_WRAPPED_CBOR 39
+#define QBCOR_TYPE_WRAPPED_CBOR_SEQUENCE 40 // TODO: implement this
+
#define QCBOR_TYPE_OPTTAG 254 // Used internally; never returned
@@ -1362,16 +1364,21 @@
void QCBORDecode_GetEpochDateInMapSZ(QCBORDecodeContext *pCtx, uint8_t uTagRequired, const char *szLabel, int64_t *puTime);
-/*
+/**
@brief Decode the next item as a big number.
@param[in] pCtx The decode context.
@param[in] uTagRequirement One of @c QCBOR_TAGSPEC_MATCH_XXX.
-@param[out] pURI The decoded URI.
+@param[out] pValue The big number.
+ @param[out] pbIsNegative Is @c true if the big number is negative. This is only
+ valid when @c uTagRequirement is @ref QCBOR_TAGSPEC_MATCH_TAG
Error handling is like QCBORDecode_GetBytes().
-See XYZ for discussion on tag requirements.
+See XYZ for discussion on tag requirements. If the tag
+ requirement is Content type, then there is no indication
+ whether the number is positive or negative. The caller
+ must know this from context.
*/
void QCBORDecode_GetBignum(QCBORDecodeContext *pCtx,
uint8_t uTagRequirement,
@@ -2239,13 +2246,17 @@
#define QCBOR_TAGSPEC_MATCH_TAG 0
#define QCBOR_TAGSPEC_MATCH_TAG_CONTENT_TYPE 1 // When the tag type is known from the context of the protocol
#define QCBOR_TAGSPEC_MATCH_EITHER 2 // CBOR protocols that need this are designed against recommended tag use !!
+
+#define QCBOR_TAGSPEC_NUM_TYPES 3
+/* This structure can probably be rearrange so the initialization
+ of it takes much less code. */
typedef struct {
/* One of QCBOR_TAGSPEC_MATCH_xxx */
uint8_t uTagRequirement;
/* The tagged type translated into QCBOR_TYPE_XXX. Used to match explicit tagging */
- uint8_t uTaggedType;
+ uint8_t uTaggedTypes[QCBOR_TAGSPEC_NUM_TYPES];
/* The types of the content, which are used to match implicit tagging */
- uint8_t uAllowedContentTypes[6];
+ uint8_t uAllowedContentTypes[QCBOR_TAGSPEC_NUM_TYPES];
} TagSpecification;
// Semi private
@@ -2283,21 +2294,29 @@
static inline void QCBORDecode_GetBytes(QCBORDecodeContext *pMe, UsefulBufC *pValue)
{
// Complier should make this just 64-bit integer parameter
- const TagSpecification TagSpec = {QCBOR_TAGSPEC_MATCH_TAG_CONTENT_TYPE, QCBOR_TYPE_BYTE_STRING, {QCBOR_TYPE_BYTE_STRING, 0,0,0,0,0}};
+ const TagSpecification TagSpec = {QCBOR_TAGSPEC_MATCH_TAG_CONTENT_TYPE,
+ {QCBOR_TYPE_BYTE_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE},
+ {QCBOR_TYPE_BYTE_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
QCBORDecode_GetTaggedStringInternal(pMe, TagSpec, pValue);
}
inline static void QCBORDecode_GetBytesInMapN(QCBORDecodeContext *pMe, int64_t nLabel, UsefulBufC *pBstr)
{
- const TagSpecification TagSpec = {QCBOR_TAGSPEC_MATCH_TAG_CONTENT_TYPE, QCBOR_TYPE_BYTE_STRING, {QCBOR_TYPE_BYTE_STRING, 0,0,0,0,0}};
-
+ const TagSpecification TagSpec = {QCBOR_TAGSPEC_MATCH_TAG_CONTENT_TYPE,
+ {QCBOR_TYPE_BYTE_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE},
+ {QCBOR_TYPE_BYTE_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
QCBORDecode_GetTaggedStringInMapN(pMe, nLabel, TagSpec, pBstr);
}
inline static void QCBORDecode_GetBytesInMapSZ(QCBORDecodeContext *pMe, const char *szLabel, UsefulBufC *pBstr)
{
- const TagSpecification TagSpec = {QCBOR_TAGSPEC_MATCH_TAG_CONTENT_TYPE, QCBOR_TYPE_BYTE_STRING, {QCBOR_TYPE_BYTE_STRING, 0,0,0,0,0}};
+ const TagSpecification TagSpec = {QCBOR_TAGSPEC_MATCH_TAG_CONTENT_TYPE,
+ {QCBOR_TYPE_BYTE_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE},
+ {QCBOR_TYPE_BYTE_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
QCBORDecode_GetTaggedStringInMapSZ(pMe, szLabel, TagSpec, pBstr);
}
@@ -2305,7 +2324,10 @@
static inline void QCBORDecode_GetText(QCBORDecodeContext *pMe, UsefulBufC *pValue)
{
// Complier should make this just 64-bit integer parameter
- const TagSpecification TagSpec = {0, QCBOR_TYPE_TEXT_STRING, {QCBOR_TYPE_TEXT_STRING, QCBOR_TYPE_NONE,QCBOR_TYPE_NONE,QCBOR_TYPE_NONE,QCBOR_TYPE_NONE,QCBOR_TYPE_NONE}};
+ const TagSpecification TagSpec = {QCBOR_TAGSPEC_MATCH_TAG_CONTENT_TYPE,
+ {QCBOR_TYPE_TEXT_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE},
+ {QCBOR_TYPE_TEXT_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
QCBORDecode_GetTaggedStringInternal(pMe, TagSpec, pValue);
}
@@ -2313,7 +2335,10 @@
inline static void QCBORDecode_GetTextInMapN(QCBORDecodeContext *pMe, int64_t nLabel, UsefulBufC *pText)
{
// This TagSpec only matches text strings; it also should optimize down to passing a 64-bit integer
- const TagSpecification TagSpec = {QCBOR_TAGSPEC_MATCH_TAG_CONTENT_TYPE, QCBOR_TYPE_TEXT_STRING, {QCBOR_TYPE_TEXT_STRING, 0,0,0,0,0}};
+ const TagSpecification TagSpec = {QCBOR_TAGSPEC_MATCH_TAG_CONTENT_TYPE,
+ {QCBOR_TYPE_TEXT_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE},
+ {QCBOR_TYPE_TEXT_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };;
QCBORDecode_GetTaggedStringInMapN(pMe, nLabel, TagSpec, pText);
}
@@ -2321,7 +2346,10 @@
inline static void QCBORDecode_GetTextInMapSZ(QCBORDecodeContext *pMe, const char *szLabel, UsefulBufC *pText)
{
- const TagSpecification TagSpec = {QCBOR_TAGSPEC_MATCH_TAG_CONTENT_TYPE, QCBOR_TYPE_TEXT_STRING, {QCBOR_TYPE_TEXT_STRING, 0,0,0,0,0}};
+ const TagSpecification TagSpec = {QCBOR_TAGSPEC_MATCH_TAG_CONTENT_TYPE,
+ {QCBOR_TYPE_TEXT_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE},
+ {QCBOR_TYPE_TEXT_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
QCBORDecode_GetTaggedStringInMapSZ(pMe, szLabel, TagSpec, pText);
}
@@ -2329,7 +2357,10 @@
static inline void QCBORDecode_GetDateString(QCBORDecodeContext *pMe, uint8_t uTagRequirement, UsefulBufC *pValue)
{
- const TagSpecification TagSpec = {uTagRequirement, QCBOR_TYPE_DATE_STRING, {QCBOR_TYPE_TEXT_STRING, 0,0,0,0,0}};
+ const TagSpecification TagSpec = {uTagRequirement,
+ {QCBOR_TYPE_DATE_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE},
+ {QCBOR_TYPE_TEXT_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
QCBORDecode_GetTaggedStringInternal(pMe, TagSpec, pValue);
}
@@ -2340,7 +2371,10 @@
int64_t nLabel,
UsefulBufC *pText)
{
- const TagSpecification TagSpec = {uTagRequirement, QCBOR_TYPE_DATE_STRING, {QCBOR_TYPE_TEXT_STRING, 0,0,0,0,0}};
+ const TagSpecification TagSpec = {uTagRequirement,
+ {QCBOR_TYPE_DATE_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE},
+ {QCBOR_TYPE_TEXT_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
QCBORDecode_GetTaggedStringInMapN(pMe, nLabel, TagSpec, pText);
}
@@ -2350,7 +2384,10 @@
const char *szLabel,
UsefulBufC *pText)
{
- const TagSpecification TagSpec = {uTagRequirement, QCBOR_TYPE_DATE_STRING, {QCBOR_TYPE_TEXT_STRING, 0,0,0,0,0}};
+ const TagSpecification TagSpec = {uTagRequirement,
+ {QCBOR_TYPE_DATE_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE},
+ {QCBOR_TYPE_TEXT_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
QCBORDecode_GetTaggedStringInMapSZ(pMe, szLabel, TagSpec, pText);
}
@@ -2362,7 +2399,10 @@
uint8_t uTagRequirement,
UsefulBufC *pUUID)
{
- const TagSpecification TagSpec = {uTagRequirement, QCBOR_TYPE_URI, {QCBOR_TYPE_TEXT_STRING, 0,0,0,0,0}};
+ const TagSpecification TagSpec = {uTagRequirement,
+ {QCBOR_TYPE_URI, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE},
+ {QCBOR_TYPE_TEXT_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
QCBORDecode_GetTaggedStringInternal(pMe, TagSpec, pUUID);
}
@@ -2373,7 +2413,10 @@
int64_t nLabel,
UsefulBufC *pUUID)
{
- const TagSpecification TagSpec = {uTagRequirement, QCBOR_TYPE_URI, {QCBOR_TYPE_TEXT_STRING, 0,0,0,0,0}};
+ const TagSpecification TagSpec = {uTagRequirement,
+ {QCBOR_TYPE_URI, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE},
+ {QCBOR_TYPE_TEXT_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
QCBORDecode_GetTaggedStringInMapN(pMe, nLabel, TagSpec, pUUID);
}
@@ -2383,7 +2426,10 @@
const char *szLabel,
UsefulBufC *pUUID)
{
- const TagSpecification TagSpec = {uTagRequirement, QCBOR_TYPE_URI, {QCBOR_TYPE_TEXT_STRING, 0,0,0,0,0}};
+ const TagSpecification TagSpec = {uTagRequirement,
+ {QCBOR_TYPE_URI, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE},
+ {QCBOR_TYPE_TEXT_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
QCBORDecode_GetTaggedStringInMapSZ(pMe, szLabel, TagSpec, pUUID);
}
@@ -2394,7 +2440,10 @@
uint8_t uTagRequirement,
UsefulBufC *pB64Text)
{
- const TagSpecification TagSpec = {uTagRequirement, QCBOR_TYPE_BASE64, {QCBOR_TYPE_TEXT_STRING, 0,0,0,0,0}};
+ const TagSpecification TagSpec = {uTagRequirement,
+ {QCBOR_TYPE_BASE64, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE},
+ {QCBOR_TYPE_TEXT_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
QCBORDecode_GetTaggedStringInternal(pMe, TagSpec, pB64Text);
}
@@ -2405,7 +2454,10 @@
int64_t nLabel,
UsefulBufC *pB64Text)
{
- const TagSpecification TagSpec = {uTagRequirement, QCBOR_TYPE_BASE64, {QCBOR_TYPE_TEXT_STRING, 0,0,0,0,0}};
+ const TagSpecification TagSpec = {uTagRequirement,
+ {QCBOR_TYPE_BASE64, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE},
+ {QCBOR_TYPE_TEXT_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
QCBORDecode_GetTaggedStringInMapN(pMe, nLabel, TagSpec, pB64Text);
}
@@ -2415,8 +2467,10 @@
const char *szLabel,
UsefulBufC *pB64Text)
{
- const TagSpecification TagSpec = {uTagRequirement, QCBOR_TYPE_BASE64, {QCBOR_TYPE_TEXT_STRING, 0,0,0,0,0}};
-
+ const TagSpecification TagSpec = {uTagRequirement,
+ {QCBOR_TYPE_BASE64, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE},
+ {QCBOR_TYPE_TEXT_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
QCBORDecode_GetTaggedStringInMapSZ(pMe, szLabel, TagSpec, pB64Text);
}
@@ -2426,7 +2480,10 @@
uint8_t uTagRequirement,
UsefulBufC *pRegex)
{
- const TagSpecification TagSpec = {uTagRequirement, QCBOR_TYPE_REGEX, {QCBOR_TYPE_TEXT_STRING, 0,0,0,0,0}};
+ const TagSpecification TagSpec = {uTagRequirement,
+ {QCBOR_TYPE_REGEX, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE},
+ {QCBOR_TYPE_TEXT_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
QCBORDecode_GetTaggedStringInternal(pMe, TagSpec, pRegex);
}
@@ -2436,7 +2493,10 @@
int64_t nLabel,
UsefulBufC *pRegex)
{
- const TagSpecification TagSpec = {uTagRequirement, QCBOR_TYPE_REGEX, {QCBOR_TYPE_TEXT_STRING, 0,0,0,0,0}};
+ const TagSpecification TagSpec = {uTagRequirement,
+ {QCBOR_TYPE_REGEX, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE},
+ {QCBOR_TYPE_TEXT_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
QCBORDecode_GetTaggedStringInMapN(pMe, nLabel, TagSpec, pRegex);
}
@@ -2446,7 +2506,10 @@
const char * szLabel,
UsefulBufC *pRegex)
{
- const TagSpecification TagSpec = {uTagRequirement, QCBOR_TYPE_REGEX, {QCBOR_TYPE_TEXT_STRING, 0,0,0,0,0}};
+ const TagSpecification TagSpec = {uTagRequirement,
+ {QCBOR_TYPE_REGEX, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE},
+ {QCBOR_TYPE_TEXT_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
QCBORDecode_GetTaggedStringInMapSZ(pMe, szLabel, TagSpec, pRegex);
}
@@ -2502,7 +2565,10 @@
uint8_t uTagRequirement,
UsefulBufC *pUUID)
{
- const TagSpecification TagSpec = {uTagRequirement, QCBOR_TYPE_UUID, {QCBOR_TYPE_BYTE_STRING, 0,0,0,0,0}};
+ const TagSpecification TagSpec = {uTagRequirement,
+ {QCBOR_TYPE_UUID, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE},
+ {QCBOR_TYPE_BYTE_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
QCBORDecode_GetTaggedStringInternal(pMe, TagSpec, pUUID);
}
@@ -2513,7 +2579,10 @@
int64_t nLabel,
UsefulBufC *pUUID)
{
- const TagSpecification TagSpec = {uTagRequirement, QCBOR_TYPE_UUID, {QCBOR_TYPE_BYTE_STRING, 0,0,0,0,0}};
+ const TagSpecification TagSpec = {uTagRequirement,
+ {QCBOR_TYPE_UUID, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE},
+ {QCBOR_TYPE_BYTE_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
QCBORDecode_GetTaggedStringInMapN(pMe, nLabel, TagSpec, pUUID);
}
@@ -2523,7 +2592,10 @@
const char *szLabel,
UsefulBufC *pUUID)
{
- const TagSpecification TagSpec = {uTagRequirement, QCBOR_TYPE_UUID, {QCBOR_TYPE_BYTE_STRING, 0,0,0,0,0}};
+ const TagSpecification TagSpec = {uTagRequirement,
+ {QCBOR_TYPE_UUID, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE},
+ {QCBOR_TYPE_BYTE_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
QCBORDecode_GetTaggedStringInMapSZ(pMe, szLabel, TagSpec, pUUID);
}
@@ -2534,7 +2606,10 @@
int64_t nLabel,
int64_t *puTime)
{
- const TagSpecification TagSpec = {uTagRequirement, QCBOR_TYPE_DATE_EPOCH, {QCBOR_TYPE_INT64, QCBOR_TYPE_DOUBLE,0,0,0,0}};
+ const TagSpecification TagSpec = {uTagRequirement,
+ {QCBOR_TYPE_DATE_EPOCH, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE},
+ {QCBOR_TYPE_INT64, QCBOR_TYPE_DOUBLE, QCBOR_TYPE_NONE}
+ };
QCBORItem Item;
QCBORDecode_GetTaggedItemInMapN(pMe, nLabel, TagSpec, &Item);
diff --git a/src/qcbor_decode.c b/src/qcbor_decode.c
index 902c924..f9ab55b 100644
--- a/src/qcbor_decode.c
+++ b/src/qcbor_decode.c
@@ -1737,6 +1737,16 @@
return QCBOR_SUCCESS;
}
+
+inline static QCBORError DecodeWrappedCBORSequence(QCBORItem *pDecodedItem)
+{
+ if(pDecodedItem->uDataType != QCBOR_TYPE_BYTE_STRING) {
+ return QCBOR_ERR_BAD_OPT_TAG;
+ }
+ pDecodedItem->uDataType = QBCOR_TYPE_WRAPPED_CBOR_SEQUENCE;
+ return QCBOR_SUCCESS;
+}
+
inline static QCBORError DecodeMIME(QCBORItem *pDecodedItem)
{
if(pDecodedItem->uDataType == QCBOR_TYPE_TEXT_STRING) {
@@ -1806,6 +1816,10 @@
nReturn = DecodeWrappedCBOR(pDecodedItem);
break;
+ case CBOR_TAG_CBOR_SEQUENCE:
+ nReturn = DecodeWrappedCBORSequence(pDecodedItem);
+ break;
+
case CBOR_TAG_URI:
nReturn = DecodeURI(pDecodedItem);
break;
@@ -2535,6 +2549,17 @@
}
+
+static QCBORError CheckTypeList(uint8_t uDataType, const uint8_t puTypeList[QCBOR_TAGSPEC_NUM_TYPES])
+{
+ for(size_t i = 0; i < QCBOR_TAGSPEC_NUM_TYPES; i++) {
+ if(uDataType == puTypeList[i]) {
+ return QCBOR_SUCCESS;
+ }
+ }
+ return QCBOR_ERR_UNEXPECTED_TYPE;
+}
+
/**
@param[in] TagSpec Specification for matching tags.
@param[in] uDataType A QCBOR data type
@@ -2547,28 +2572,27 @@
static QCBORError CheckTagRequirement(const TagSpecification TagSpec, uint8_t uDataType)
{
if(TagSpec.uTagRequirement == QCBOR_TAGSPEC_MATCH_TAG) {
- /* Must match the tag */
- if(uDataType == TagSpec.uTaggedType) {
- return QCBOR_SUCCESS;
- }
- } else {
- /* QCBOR_TAGSPEC_MATCH_TAG_CONTENT_TYPE or QCBOR_TAGSPEC_MATCH_EITHER */
- /* Must check all the possible types for the tag content */
- for(size_t i = 0; i < sizeof(TagSpec.uAllowedContentTypes); i++) {
- if(uDataType == TagSpec.uAllowedContentTypes[i]) {
- return QCBOR_SUCCESS;
- }
- }
- /* Didn't match any of the tag content types */
- /* Check the tag for the either case */
- if(TagSpec.uTagRequirement == QCBOR_TAGSPEC_MATCH_EITHER) {
- if(uDataType == TagSpec.uTaggedType) {
- return QCBOR_SUCCESS;
- }
- }
+ // Must match the tag and only the tag
+ return CheckTypeList(uDataType, TagSpec.uTaggedTypes);
}
- return QCBOR_ERR_UNEXPECTED_TYPE;
+ QCBORError uReturn = CheckTypeList(uDataType, TagSpec.uAllowedContentTypes);
+ if(uReturn == QCBOR_SUCCESS) {
+ return QCBOR_SUCCESS;
+ }
+
+ if(TagSpec.uTagRequirement == QCBOR_TAGSPEC_MATCH_TAG_CONTENT_TYPE) {
+ /* Must match the content type and only the content type.
+ There was no match just above so it is a fail. */
+ return QCBOR_ERR_UNEXPECTED_TYPE;
+ }
+
+ /* If here it can match either the tag or the content
+ and it hasn't matched the content, so the end
+ result is whether it matches the tag. This is
+ also the case that the CBOR standard discourages. */
+
+ return CheckTypeList(uDataType, TagSpec.uTaggedTypes);
}
@@ -2892,8 +2916,10 @@
goto Done;;
}
- // TODO: check for the other wrapped CBOR tag
- const TagSpecification TagSpec = {uTagRequirement, QBCOR_TYPE_WRAPPED_CBOR, {QCBOR_TYPE_BYTE_STRING, 0,0,0,0,0}};
+ const TagSpecification TagSpec = {uTagRequirement,
+ {QBCOR_TYPE_WRAPPED_CBOR, QBCOR_TYPE_WRAPPED_CBOR_SEQUENCE, QCBOR_TYPE_NONE},
+ {QCBOR_TYPE_BYTE_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
uError = CheckTagRequirement(TagSpec, pItem->uDataType);
if(uError != QCBOR_SUCCESS) {
@@ -3115,52 +3141,35 @@
-static QCBORError ConvertBigNum(uint8_t uTagRequirement, const QCBORItem *pItem, UsefulBufC *pValue, bool *pbIsNegative)
+static QCBORError ConvertBigNum(uint8_t uTagRequirement,
+ const QCBORItem *pItem,
+ UsefulBufC *pValue,
+ bool *pbIsNegative)
{
- *pbIsNegative = false;
+ const TagSpecification TagSpec = {uTagRequirement,
+ {QCBOR_TYPE_POSBIGNUM, QCBOR_TYPE_NEGBIGNUM, QCBOR_TYPE_NONE},
+ {QCBOR_TYPE_BYTE_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
- bool bMustBeTagged = true; // TODO: fix this --- they have to tell us if they are expecting positive or negative
-
- switch(pItem->uDataType) {
- case QCBOR_TYPE_BYTE_STRING:
- // TODO: check that there is no tag here?
- if(bMustBeTagged) {
- return QCBOR_ERR_UNEXPECTED_TYPE;
- } else {
- *pValue = pItem->val.string;
- return QCBOR_SUCCESS;
- }
- break;
-
- case QCBOR_TYPE_POSBIGNUM:
- *pValue = pItem->val.string;
- return QCBOR_SUCCESS;
- break;
-
- case QCBOR_TYPE_NEGBIGNUM:
- *pbIsNegative = true;
- *pValue = pItem->val.string;
- return QCBOR_SUCCESS;
- break;
-
- default:
- return QCBOR_ERR_UNEXPECTED_TYPE;
- break;
+ QCBORError uErr = CheckTagRequirement(TagSpec, pItem->uDataType);
+ if(uErr != QCBOR_SUCCESS) {
+ return uErr;
}
+
+ *pValue = pItem->val.string;
+
+ if(pItem->uDataType == QCBOR_TYPE_POSBIGNUM) {
+ *pbIsNegative = false;
+ } else if(pItem->uDataType == QCBOR_TYPE_NEGBIGNUM) {
+ *pbIsNegative = true;
+ }
+
+ return QCBOR_SUCCESS;
}
-/*
- @param[in] bMustBeTagged If \c true, then the data item must be tagged as either
- a positive or negative bignum. If \c false, then it only must be a byte string and bIsNegative
- will always be false on the asumption that it is positive, but it can be interpretted as
- negative if the the sign is know from other context.
- @param[out] pValue The bytes that make up the big num
- @param[out] pbIsNegative \c true if tagged as a negative big num. \c false otherwise.
-
- if bMustBeTagged is false, then this will succeed if the data item is a plain byte string,
- a positive big num or a negative big num.
-
+/**
+ Public function, see header qcbor/qcbor_decode.h
*/
void QCBORDecode_GetBignum(QCBORDecodeContext *pMe, uint8_t uTagRequirement, UsefulBufC *pValue, bool *pbIsNegative)
{
@@ -3180,7 +3189,7 @@
}
/*
-Public function, see header qcbor/qcbor_decode.h file
+Public function, see header qcbor/qcbor_decode.h
*/
void QCBORDecode_GetBignumInMapN(QCBORDecodeContext *pMe, int64_t nLabel, uint8_t uTagRequirement, UsefulBufC *pValue, bool *pbIsNegative)
{
@@ -3191,7 +3200,7 @@
}
/*
-Public function, see header qcbor/qcbor_decode.h file
+Public function, see header qcbor/qcbor_decode.h
*/
void QCBORDecode_GetBignumInMapSZ(QCBORDecodeContext *pMe, const char *szLabel, uint8_t uTagRequirement, UsefulBufC *pValue, bool *pbIsNegative)
{
@@ -3206,9 +3215,18 @@
// Semi private
QCBORError FarfMIME(uint8_t uTagRequirement, const QCBORItem *pItem, UsefulBufC *pMessage, bool *pbIsNot7Bit)
{
- const TagSpecification TagSpecText = {uTagRequirement, QCBOR_TYPE_MIME, {QCBOR_TYPE_TEXT_STRING, 0,0,0,0,0}};
- const TagSpecification TagSpecBinary = {uTagRequirement, QCBOR_TYPE_BINARY_MIME, {QCBOR_TYPE_BYTE_STRING, 0,0,0,0,0}};
-
+
+
+ const TagSpecification TagSpecText = {uTagRequirement,
+ {QCBOR_TYPE_MIME, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE},
+ {QCBOR_TYPE_TEXT_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
+ const TagSpecification TagSpecBinary = {uTagRequirement,
+ {QCBOR_TYPE_BINARY_MIME, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE},
+ {QCBOR_TYPE_BYTE_STRING, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
+
+
QCBORError uReturn;
if(CheckTagRequirement(TagSpecText, pItem->uDataType)) {
@@ -3517,13 +3535,12 @@
int64_t *pnValue,
QCBORItem *pItem)
{
- QCBORItem Item;
- QCBORDecode_GetItemInMapN(pMe, nLabel, QCBOR_TYPE_ANY, &Item);
+ QCBORDecode_GetItemInMapN(pMe, nLabel, QCBOR_TYPE_ANY, pItem);
if(pMe->uLastError != QCBOR_SUCCESS) {
return;
}
- pMe->uLastError = (uint8_t)ConvertInt64(&Item, uOptions, pnValue);
+ pMe->uLastError = (uint8_t)ConvertInt64(pItem, uOptions, pnValue);
}
@@ -3537,13 +3554,12 @@
return;
}
- QCBORItem Item;
- QCBORDecode_GetItemInMapSZ(pMe, szLabel, QCBOR_TYPE_ANY, &Item);
+ QCBORDecode_GetItemInMapSZ(pMe, szLabel, QCBOR_TYPE_ANY, pItem);
if(pMe->uLastError != QCBOR_SUCCESS) {
return;
}
- pMe->uLastError = (uint8_t)ConvertInt64(&Item, uOptions, pnValue);
+ pMe->uLastError = (uint8_t)ConvertInt64(pItem, uOptions, pnValue);
}
@@ -3869,13 +3885,12 @@
uint64_t *puValue,
QCBORItem *pItem)
{
- QCBORItem Item;
- QCBORDecode_GetItemInMapN(pMe, nLabel, QCBOR_TYPE_ANY, &Item);
+ QCBORDecode_GetItemInMapN(pMe, nLabel, QCBOR_TYPE_ANY, pItem);
if(pMe->uLastError != QCBOR_SUCCESS) {
return;
}
- pMe->uLastError = (uint8_t)ConvertUint64(&Item, uOptions, puValue);
+ pMe->uLastError = (uint8_t)ConvertUint64(pItem, uOptions, puValue);
}
@@ -3889,13 +3904,12 @@
return;
}
- QCBORItem Item;
- QCBORDecode_GetItemInMapSZ(pMe, szLabel, QCBOR_TYPE_ANY, &Item);
+ QCBORDecode_GetItemInMapSZ(pMe, szLabel, QCBOR_TYPE_ANY, pItem);
if(pMe->uLastError != QCBOR_SUCCESS) {
return;
}
- pMe->uLastError = (uint8_t)ConvertUint64(&Item, uOptions, puValue);
+ pMe->uLastError = (uint8_t)ConvertUint64(pItem, uOptions, puValue);
}
/*
@@ -4142,13 +4156,12 @@
double *pdValue,
QCBORItem *pItem)
{
- QCBORItem Item;
- QCBORDecode_GetItemInMapN(pMe, nLabel, QCBOR_TYPE_ANY, &Item);
+ QCBORDecode_GetItemInMapN(pMe, nLabel, QCBOR_TYPE_ANY, pItem);
if(pMe->uLastError != QCBOR_SUCCESS) {
return;
}
- pMe->uLastError = (uint8_t)ConvertDouble(&Item, uOptions, pdValue);
+ pMe->uLastError = (uint8_t)ConvertDouble(pItem, uOptions, pdValue);
}
void QCBORDecode_GetDoubleConvertInternalInMapSZ(QCBORDecodeContext *pMe,
@@ -4161,13 +4174,12 @@
return;
}
- QCBORItem Item;
- QCBORDecode_GetItemInMapSZ(pMe, szLabel, QCBOR_TYPE_ANY, &Item);
+ QCBORDecode_GetItemInMapSZ(pMe, szLabel, QCBOR_TYPE_ANY, pItem);
if(pMe->uLastError != QCBOR_SUCCESS) {
return;
}
- pMe->uLastError = (uint8_t)ConvertDouble(&Item, uOptions, pdValue);
+ pMe->uLastError = (uint8_t)ConvertDouble(pItem, uOptions, pdValue);
}
@@ -4467,8 +4479,22 @@
{
QCBORItem Item;
QCBORError uErr;
-
+
QCBORDecode_GetItemInMapN(pMe, nLabel, QCBOR_TYPE_ANY, &Item);
+ if(pMe->uLastError != QCBOR_SUCCESS) {
+ return;
+ }
+
+ const TagSpecification TagSpec = {uTagRequirement,
+ {QCBOR_TYPE_DECIMAL_FRACTION, QCBOR_TYPE_DECIMAL_FRACTION_POS_BIGNUM, QCBOR_TYPE_DECIMAL_FRACTION_NEG_BIGNUM},
+ {QCBOR_TYPE_ARRAY, QCBOR_TYPE_NONE, QCBOR_TYPE_NONE}
+ };
+
+ uErr = CheckTagRequirement(TagSpec, Item.uDataType);
+ if(uErr != QCBOR_SUCCESS) {
+ pMe->uLastError = (uint8_t)uErr;
+ return;
+ }
if(Item.uDataType == QCBOR_TYPE_ARRAY) {
uErr = QCBORDecode_MantissaAndExponent(pMe, &Item);