Skip to content

Commit addf804

Browse files
Add the API to do more in-depth validation
This implements barely the canonical validation. Implemented features: - CborValidateShortestFloatingPoint - CborValidateNoIndeterminateLength - CborValidateNoUndefined - CborValidateNoTags - CborValidateCompleteData - CborValidateNoUnknownSimpleTypesSA - CborValidateNoUnknownSimpleTypes Signed-off-by: Thiago Macieira <[email protected]>
1 parent 7388112 commit addf804

File tree

7 files changed

+595
-2
lines changed

7 files changed

+595
-2
lines changed

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ TINYCBOR_SOURCES = \
2929
src/cborparser_dup_string.c \
3030
src/cborpretty.c \
3131
src/cbortojson.c \
32+
src/cborvalidation.c \
3233
#
3334
CBORDUMP_SOURCES = tools/cbordump/cbordump.c
3435

Makefile.nmake

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ TINYCBOR_SOURCES = \
77
src\cborencoder_close_container_checked.c \
88
src\cborparser.c \
99
src\cborparser_dup_string.c \
10-
src\cborpretty.c
10+
src\cborpretty.c \
11+
src/cborvalidation.c
1112
TINYCBOR_OBJS = \
1213
src\cborerrorstrings.obj \
1314
src\cborencoder.obj \

src/cbor.h

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,10 @@ typedef enum CborError {
140140
CborErrorInappropriateTagForType,
141141
CborErrorDuplicateObjectKeys,
142142
CborErrorInvalidUtf8TextString,
143+
CborErrorExcludedType,
144+
CborErrorExcludedValue,
145+
CborErrorImproperValue,
146+
CborErrorOverlongEncoding,
143147

144148
/* encoder errors */
145149
CborErrorTooManyItems = 768,
@@ -483,6 +487,51 @@ CBOR_INLINE_API CborError cbor_value_get_double(const CborValue *value, double *
483487
return CborNoError;
484488
}
485489

490+
/* Validation API */
491+
492+
enum CborValidationFlags {
493+
/* Bit mapping:
494+
* bits 0-7 (8 bits): canonical format
495+
* bits 8-11 (4 bits): canonical format & strict mode
496+
* bits 12-20 (8 bits): strict mode
497+
* bits 21-31 (10 bits): other
498+
*/
499+
500+
CborValidateShortestIntegrals = 0x0001,
501+
CborValidateShortestFloatingPoint = 0x0002,
502+
CborValidateShortestNumbers = CborValidateShortestIntegrals | CborValidateShortestFloatingPoint,
503+
CborValidateNoIndeterminateLength = 0x0100,
504+
CborValidateMapIsSorted = 0x0200 | CborValidateNoIndeterminateLength,
505+
506+
CborValidateCanonicalFormat = 0x0fff,
507+
508+
CborValidateMapKeysAreUnique = 0x1000 | CborValidateMapIsSorted,
509+
CborValidateTagUse = 0x2000,
510+
CborValidateUtf8 = 0x4000,
511+
512+
CborValidateStrictMode = 0xfff00,
513+
514+
CborValidateMapKeysAreString = 0x100000,
515+
CborValidateNoUndefined = 0x200000,
516+
CborValidateNoTags = 0x400000,
517+
CborValidateFiniteFloatingPoint = 0x800000,
518+
/* unused = 0x1000000, */
519+
/* unused = 0x2000000, */
520+
521+
CborValidateNoUnknownSimpleTypesSA = 0x4000000,
522+
CborValidateNoUnknownSimpleTypes = 0x8000000 | CborValidateNoUnknownSimpleTypesSA,
523+
CborValidateNoUnknownTagsSA = 0x10000000,
524+
CborValidateNoUnknownTagsSR = 0x20000000 | CborValidateNoUnknownTagsSA,
525+
CborValidateNoUnknownTags = 0x40000000 | CborValidateNoUnknownTagsSR,
526+
527+
CborValidateCompleteData = (int)0x80000000,
528+
529+
CborValidateStrictest = (int)~0U,
530+
CborValidateBasic = 0
531+
};
532+
533+
CBOR_API CborError cbor_value_validate(const CborValue *it, int flags);
534+
486535
/* Human-readable (dump) API */
487536

488537
enum CborPrettyFlags {

src/cborerrorstrings.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,16 @@ const char *cbor_error_string(CborError error)
134134
case CborErrorInvalidUtf8TextString:
135135
return _("invalid UTF-8 content in string");
136136

137+
case CborErrorExcludedType:
138+
return _("excluded type found");
139+
140+
case CborErrorExcludedValue:
141+
return _("excluded value found");
142+
143+
case CborErrorImproperValue:
144+
case CborErrorOverlongEncoding:
145+
return _("value encoded in non-canonical form");
146+
137147
case CborErrorTooManyItems:
138148
return _("too many items added to encoder");
139149

0 commit comments

Comments
 (0)