Add uint CBOR writer
Change-Id: I423e5c2445d9be3dc441b7081f3e035724bd57d6
Reviewed-on: https://pigweed-review.googlesource.com/c/open-dice/+/54540
Reviewed-by: Darren Krahn <dkrahn@google.com>
Commit-Queue: Andrew Scull <ascull@google.com>
diff --git a/include/dice/cbor_writer.h b/include/dice/cbor_writer.h
index 304f9f3..8a96afa 100644
--- a/include/dice/cbor_writer.h
+++ b/include/dice/cbor_writer.h
@@ -61,6 +61,7 @@
// caller is responsible for correct and deterministic encoding of complex
// types.
void CborWriteInt(int64_t val, struct CborOut* out);
+void CborWriteUint(uint64_t val, struct CborOut* out);
void CborWriteBstr(size_t data_size, const uint8_t* data, struct CborOut* out);
void CborWriteTstr(const char* str, struct CborOut* out);
void CborWriteArray(size_t num_elements, struct CborOut* out);
diff --git a/src/cbor_writer.c b/src/cbor_writer.c
index 986d1a1..bfa403f 100644
--- a/src/cbor_writer.c
+++ b/src/cbor_writer.c
@@ -114,6 +114,10 @@
}
}
+void CborWriteUint(uint64_t val, struct CborOut* out) {
+ CborWriteType(CBOR_TYPE_UINT, val, out);
+}
+
void CborWriteBstr(size_t data_size, const uint8_t* data, struct CborOut* out) {
CborWriteStr(CBOR_TYPE_BSTR, data_size, data, out);
}
diff --git a/src/cbor_writer_fuzzer.cc b/src/cbor_writer_fuzzer.cc
index afc4270..ebcb1e3 100644
--- a/src/cbor_writer_fuzzer.cc
+++ b/src/cbor_writer_fuzzer.cc
@@ -19,6 +19,7 @@
enum CborWriterFunction {
WriteInt,
+ WriteUint,
WriteBstr,
AllocBstr,
WriteTstr,
@@ -34,7 +35,7 @@
// Use data sizes that exceed the 16-bit range without being excessive.
constexpr size_t kMaxDataSize = 0xffff + 0x5000;
constexpr size_t kMaxBufferSize = kMaxDataSize * 3;
-constexpr size_t kIterations = 20;
+constexpr size_t kIterations = CborWriterFunction::kMaxValue * 2;
} // namespace
@@ -51,6 +52,9 @@
case WriteInt:
CborWriteInt(fdp.ConsumeIntegral<int64_t>(), &out);
break;
+ case WriteUint:
+ CborWriteUint(fdp.ConsumeIntegral<uint64_t>(), &out);
+ break;
case WriteBstr: {
auto bstr_data_size =
fdp.ConsumeIntegralInRange<size_t>(0, kMaxDataSize);
diff --git a/src/cbor_writer_test.cc b/src/cbor_writer_test.cc
index f664052..2ad72a4 100644
--- a/src/cbor_writer_test.cc
+++ b/src/cbor_writer_test.cc
@@ -91,6 +91,19 @@
EXPECT_EQ(0, memcmp(buffer, kExpectedEncoding, sizeof(kExpectedEncoding)));
}
+TEST(CborWriterTest, Uint9Bytes) {
+ const uint8_t kExpectedEncoding[] = {27, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 27, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
+ uint8_t buffer[64];
+ CborOut out;
+ CborOutInit(buffer, sizeof(buffer), &out);
+ CborWriteUint(0x100000000, &out);
+ CborWriteUint(UINT64_MAX, &out);
+ EXPECT_FALSE(CborOutOverflowed(&out));
+ EXPECT_EQ(0, memcmp(buffer, kExpectedEncoding, sizeof(kExpectedEncoding)));
+}
+
TEST(CborWriterTest, IntByteOrder) {
const uint8_t kExpectedEncoding[] = {
25, 0x12, 0x34, 26, 0x12, 0x34, 0x56, 0x78, 27,