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,