Skip to content

Commit 4d868da

Browse files
DhanusMLthomas-fossatisetrofim
committed
fix: fixed length encoding for remaining maps
Uses the map_len macro to make maps used by coserv to be definite length. All structures except coswid use fixed length maps now. Fixed all unit tests. Note: Some maps in CoSWID still uses indefinite length encoding. Co-authored-by: Thomas Fossati <[email protected]> Co-authored-by: setrofim <[email protected]> Signed-off-by: Shefali Kamal <[email protected]> Signed-off-by: Dhanus M Lal <[email protected]>
1 parent 30fdcd0 commit 4d868da

File tree

6 files changed

+162
-149
lines changed

6 files changed

+162
-149
lines changed

src/comid.rs

Lines changed: 64 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,15 @@ impl Serialize for ConciseMidTag<'_> {
335335
S: serde::Serializer,
336336
{
337337
let is_human_readable = serializer.is_human_readable();
338-
let mut map = serializer.serialize_map(None)?;
338+
let len = map_len!(
339+
self,
340+
2 + // tag-identity, triples
341+
self.extensions.as_ref().map_or(0, |e| e.len()),
342+
language,
343+
entities,
344+
linked_tags,
345+
);
346+
let mut map = serializer.serialize_map(Some(len))?;
339347

340348
if is_human_readable {
341349
if let Some(language) = &self.language {
@@ -586,7 +594,8 @@ impl Serialize for TagIdentityMap<'_> {
586594
S: serde::Serializer,
587595
{
588596
let is_human_readable = serializer.is_human_readable();
589-
let mut map = serializer.serialize_map(None)?;
597+
let len = map_len!(self, 1, tag_version);
598+
let mut map = serializer.serialize_map(Some(len))?;
590599

591600
if is_human_readable {
592601
map.serialize_entry("tag-id", &self.tag_id)?;
@@ -880,7 +889,13 @@ impl Serialize for ComidEntityMap<'_> {
880889
S: serde::Serializer,
881890
{
882891
let is_human_readable = serializer.is_human_readable();
883-
let mut map = serializer.serialize_map(None)?;
892+
let len = map_len!(
893+
self,
894+
2 + // entity-name, role
895+
self.extensions.as_ref().map_or(0, |e| e.len()),
896+
reg_id,
897+
);
898+
let mut map = serializer.serialize_map(Some(len))?;
884899

885900
if is_human_readable {
886901
map.serialize_entry("entity-name", &self.entity_name)?;
@@ -1203,7 +1218,7 @@ impl Serialize for LinkedTagMap<'_> {
12031218
S: serde::Serializer,
12041219
{
12051220
let is_human_readable = serializer.is_human_readable();
1206-
let mut map = serializer.serialize_map(None)?;
1221+
let mut map = serializer.serialize_map(Some(2))?;
12071222

12081223
if is_human_readable {
12091224
map.serialize_entry("linked-tag-id", &self.linked_tag_id)?;
@@ -1450,9 +1465,15 @@ impl Serialize for TriplesMap<'_> {
14501465
let len = map_len!(
14511466
self,
14521467
0 + self.extensions.as_ref().map_or(0, |e| e.len()),
1453-
reference_triples, endorsed_triples, identity_triples, attest_key_triples,
1454-
dependency_triples, membership_triples, coswid_triples,
1455-
conditional_endorsement_triples, conditional_endorsement_series_triples,
1468+
reference_triples,
1469+
endorsed_triples,
1470+
identity_triples,
1471+
attest_key_triples,
1472+
dependency_triples,
1473+
membership_triples,
1474+
coswid_triples,
1475+
conditional_endorsement_triples,
1476+
conditional_endorsement_series_triples,
14561477
);
14571478
let mut map = serializer.serialize_map(Some(len))?;
14581479

@@ -2043,7 +2064,7 @@ mod tests {
20432064
ciborium::into_writer(&entity_map, &mut actual_cbor).unwrap();
20442065

20452066
let expected_cbor: Vec<u8> = vec![
2046-
0xbf, // map(indef)
2067+
0xa4, // map(4)
20472068
0x00, // key: 0 [entity-name]
20482069
0x63, // value: tstr(3)
20492070
0x66, 0x6f, 0x6f, // "foo"
@@ -2060,7 +2081,6 @@ mod tests {
20602081
0x6a, // value: tstr(10)
20612082
0x74, 0x65, 0x73, 0x74, 0x20, 0x76, 0x61, 0x6c, // "test val"
20622083
0x75, 0x65, // "ue"
2063-
0xff, // break
20642084
];
20652085

20662086
assert_eq!(actual_cbor, expected_cbor);
@@ -2091,13 +2111,12 @@ mod tests {
20912111
ciborium::into_writer(&tag_identity, &mut actual_cbor).unwrap();
20922112

20932113
let expected_cbor: Vec<u8> = vec![
2094-
0xbf, // map(indef)
2114+
0xa2, // map(2)
20952115
0x00, // key: 0 [tag-id]
20962116
0x63, // value: tstr(3)
20972117
0x66, 0x6f, 0x6f, // "foo"
20982118
0x01, // key: 1 [tag-version]
20992119
0x01, // value: 1
2100-
0xff,
21012120
];
21022121

21032122
assert_eq!(actual_cbor, expected_cbor);
@@ -2173,14 +2192,13 @@ mod tests {
21732192
ciborium::into_writer(&linked_tag_map, &mut actual_cbor).unwrap();
21742193

21752194
let expected_cbor: Vec<u8> = vec![
2176-
0xbf, // map(indef)
2195+
0xa2, // map(2)
21772196
0x00, // key: 0 [linked-tag-id]
21782197
0x50, // value: bstr(16)
21792198
0x55, 0x0e, 0x84, 0x00, 0xe2, 0x9b, 0x41, 0xd4,
21802199
0xa7, 0x16, 0x44, 0x66, 0x55, 0x44, 0x00, 0x00,
21812200
0x01, // key: 1 [tag-rel]
21822201
0x01, // value: 1 [replaces]
2183-
0xff, // break
21842202
];
21852203

21862204
assert_eq!(actual_cbor, expected_cbor);
@@ -2297,51 +2315,44 @@ mod tests {
22972315
0x00, // key: 0 [reference-triples]
22982316
0x81, // value: array(1)
22992317
0x82, // [0]array(2) [reference-triples-record]
2300-
0xbf, // [0]map(indef) [ref-env]
2318+
0xa1, // [0]map(1) [ref-env]
23012319
0x01, // key: 1 [instance]
23022320
0xd9, 0x02, 0x30, // value: tag(560) [tagged-bytes]
23032321
0x43, // bstr(3)
23042322
0x01, 0x02, 0x03,
2305-
0xff, // break
23062323
0x81, // [1]array(1) [rev-claims]
2307-
0xbf, // [0]map(indef) [measurement-values-map]
2324+
0xa1, // [0]map(1) [measurement-values-map]
23082325
0x01, // key: 1 [mval]
2309-
0xbf, // value: map(indef)
2326+
0xa1, // value: map(1)
23102327
0x01, // key: 1 [svn]
23112328
0x01, // value: 1
2312-
0xff, // break
2313-
0xff, // break
23142329
0x01, // key: 1 [endorsement-triples]
23152330
0x81, // value: array(1)
23162331
0x82, // [0]array(2) [endorsed-triples-record]
2317-
0xbf, // [0]map(indef) [condition]
2332+
0xa1, // [0]map(1) [condition]
23182333
0x01, // key: 1 [instance]
23192334
0xd9, 0x02, 0x30, // value: tag(560) [tagged-bytes]
23202335
0x43, // bstr(3)
23212336
0x01, 0x02, 0x03,
2322-
0xff, // break
23232337
0x81, // [1]array(1) [endorsement]
2324-
0xbf, // [0]map(indef) [measurement-values-map]
2338+
0xa1, // [0]map(1) [measurement-values-map]
23252339
0x01, // key: 1 [mval]
2326-
0xbf, // value: map(indef)
2340+
0xa1, // value: map(1)
23272341
0x01, // key: 1 [svn]
23282342
0x01, // value: 1
2329-
0xff, // break
2330-
0xff, // break
23312343
0x02, // key: 2 [identity-triples]
23322344
0x81, // value: array(1)
23332345
0x83, // [0]array(3) [identity-triple-record]
2334-
0xbf, // [0]map(indef) [environment]
2346+
0xa1, // [0]map(1) [environment]
23352347
0x01, // key: 1 [instance]
23362348
0xd9, 0x02, 0x30, // value: tag(560) [tagged-bytes]
23372349
0x43, // bstr(3)
23382350
0x01, 0x02, 0x03,
2339-
0xff, // break
23402351
0x81, // [1]array(1) [key_list]
23412352
0xd9, 0x02, 0x30, // value: tag(560) [tagged-bytes]
23422353
0x43, // bstr(3)
23432354
0x04, 0x05, 0x06,
2344-
0xbf, // [2]map(indef) [conditions]
2355+
0xa2, // [2]map(2) [conditions]
23452356
0x00, // key: 0 [mkey]
23462357
0x63, // value: tstr(3)
23472358
0x66, 0x6f, 0x6f, // "foo"
@@ -2350,21 +2361,19 @@ mod tests {
23502361
0xd9, 0x02, 0x30, // [0]tag(560) [tagged-bytes]
23512362
0x43, // bstr(3)
23522363
0x04, 0x05, 0x06,
2353-
0xff, // break
23542364
0x03, // key: 3 [attest-key-triples]
23552365
0x81, // value: array(1)
23562366
0x83, // [0]array(3) [attest-key-triple-record]
2357-
0xbf, // [0]map(indef) [environment]
2367+
0xa1, // [0]map(1) [environment]
23582368
0x01, // key: 1 [instance]
23592369
0xd9, 0x02, 0x30, // value: tag(560) [tagged-bytes]
23602370
0x43, // bstr(3)
23612371
0x01, 0x02, 0x03,
2362-
0xff, // break
23632372
0x81, // [1]array(1) [key_list]
23642373
0xd9, 0x02, 0x30, // value: tag(560) [tagged-bytes]
23652374
0x43, // bstr(3)
23662375
0x04, 0x05, 0x06,
2367-
0xbf, // [2]map(indef) [conditions]
2376+
0xa2, // [2]map(2) [conditions]
23682377
0x00, // key: 0 [mkey]
23692378
0x63, // value: tstr(3)
23702379
0x66, 0x6f, 0x6f, // "foo"
@@ -2373,116 +2382,99 @@ mod tests {
23732382
0xd9, 0x02, 0x30, // [0]tag(560) [tagged-bytes]
23742383
0x43, // bstr(3)
23752384
0x04, 0x05, 0x06,
2376-
0xff, // break
23772385
0x04, // key: 4 [dependency-triples]
23782386
0x81, // value: array(1)
23792387
0x82, // [0]array(2) [domain-dependency-triple-record]
23802388
0xd8, 0x6f, // [0]tag(111) [oid]
23812389
0x43, // bstr(3)
23822390
0x2a, 0x03, 0x04,
23832391
0x81, // [1]array(1)
2384-
0xbf, // [1]map(indef) [environment-map]
2392+
0xa1, // [1]map(1) [environment-map]
23852393
0x01, // key: 1 [instance]
23862394
0xd9, 0x02, 0x30, // value: tag(560) [tagged-bytes]
23872395
0x43, // bstr(3)
23882396
0x01, 0x02, 0x03,
2389-
0xff, // break
23902397
0x05, // key: 5 [membership-triples]
23912398
0x81, // value: array(1)
23922399
0x82, // [0]array(2) [domain-membership-triple-record]
23932400
0xd8, 0x6f, // [0]tag(111) [oid]
23942401
0x43, // bstr(3)
23952402
0x2a, 0x03, 0x04,
23962403
0x81, // [1]array(1)
2397-
0xbf, // [0]map(indef) [environment-map]
2404+
0xa1, // [0]map(1) [environment-map]
23982405
0x01, // key: 1 [instance]
23992406
0xd9, 0x02, 0x30, // value: tag(560) [tagged-bytes]
24002407
0x43, // bstr(3)
24012408
0x01, 0x02, 0x03,
2402-
0xff, // break
24032409
0x06, // key: 6 [coswid-triples]
24042410
0x81, // value: array(1)
24052411
0x82, // [0]array(2) [coswid-triple-record]
2406-
0xbf, // [0]map(indef) [environment-map]
2412+
0xa1, // [0]map(1) [environment-map]
24072413
0x01, // key: 1 [instance]
24082414
0xd9, 0x02, 0x30, // value: tag(560) [tagged-bytes]
24092415
0x43, // bstr(3)
24102416
0x01, 0x02, 0x03,
2411-
0xff, // break
24122417
0x81, // [1]array(1)
24132418
0x63, // [0]tstr(3)
24142419
0x62, 0x61, 0x72, // "bar"
24152420
0x08, // key: 8 [conditional-endorsement-series-triples]
24162421
0x81, // value: array(1)
24172422
0x82, // [0]array(2) [conditional-endorsement-series-triple-record]
24182423
0x82, // [0]array(2) [stateful-environment-record]
2419-
0xbf, // [0]map(indef) [environment]
2424+
0xa1, // [0]map(1) [environment]
24202425
0x01, // key: 1 [instance]
24212426
0xd9, 0x02, 0x30, // value: tag(560) [tagged-bytes]
24222427
0x43, // bstr(3)
24232428
0x01, 0x02, 0x03,
2424-
0xff, // break
24252429
0x81, // [1]array(1) [claims_list]
2426-
0xbf, // [0]map(indef) [measurement-map]
2430+
0xa1, // [0]map(1) [measurement-map]
24272431
0x01, // key: 1 [mval]
2428-
0xbf, // value: map(indef) [measurement-values-map]
2432+
0xa1, // value: map(1) [measurement-values-map]
24292433
0x01, // key: 1 [svn]
24302434
0x01, // value: 1
2431-
0xff, // break
2432-
0xff, // break
24332435
0x81, // [1]array(1) [series]
24342436
0x82, // [0]array(2) [conditional-series-record]
24352437
0x81, // [0]array(1) [selection]
2436-
0xbf, // [0]map(indef) [measurement-map]
2438+
0xa1, // [0]map(1) [measurement-map]
24372439
0x01, // key: 1 [mval]
2438-
0xbf, // value: map(indef) [measurement-values-map]
2440+
0xa1, // value: map(1) [measurement-values-map]
24392441
0x01, // key: 1 [svn]
24402442
0x01, // value: 1
2441-
0xff, // break
2442-
0xff, // break
24432443
0x81, // [1]array(1) [addition]
2444-
0xbf, // [0]map(indef) [measurement-map]
2444+
0xa1, // [0]map(1) [measurement-map]
24452445
0x01, // key: 1 [mval]
2446-
0xbf, // value: map(indef) [measurement-values-map]
2446+
0xa1, // value: map(1) [measurement-values-map]
24472447
0x01, // key: 1 [svn]
24482448
0x01, // value: 1
2449-
0xff, // break
2450-
0xff, // break
24512449
0x0a, // key: 10 [conditional-endorsement-triples]
24522450
0x81, // value: array(1)
24532451
0x82, // [0]array(2) [conditional-endorsement-triple-record]
24542452
0x81, // [0]array(1) [conditions]
24552453
0x82, // [0]array(2) [stateful-environment-record]
2456-
0xbf, // [0]map(indef) [environment]
2454+
0xa1, // [0]map(1) [environment]
24572455
0x01, // key: 1 [instance]
24582456
0xd9, 0x02, 0x30, // value: tag(560) [tagged-bytes]
24592457
0x43, // bstr(3)
24602458
0x01, 0x02, 0x03,
2461-
0xff, // break
24622459
0x81, // [1]array(1) [claims-list]
2463-
0xbf, // [0]map(indef) [measurement-map]
2460+
0xa1, // [0]map(1) [measurement-map]
24642461
0x01, // key: 1 [mval]
2465-
0xbf, // value: map(indef) [measurement-values-map]
2462+
0xa1, // value: map(1) [measurement-values-map]
24662463
0x01, // key: 1 [svn]
24672464
0x01, // value: 1
2468-
0xff, // break
2469-
0xff, // break
24702465
0x81, // [1]array(1) [endorsements]
24712466
0x82, // [0]array(2) [endorsed-triple-record]
2472-
0xbf, // [0]map(indef) [condition]
2467+
0xa1, // [0]map(1) [condition]
24732468
0x01, // key: 1 [instance]
24742469
0xd9, 0x02, 0x30, // value: tag(560) [tagged-bytes]
24752470
0x43, // bstr(3)
24762471
0x01, 0x02, 0x03,
2477-
0xff, // break
24782472
0x81, // [1]array(1) [endorsement]
2479-
0xbf, // [0]map(indef) [measurement-map]
2473+
0xa1, // [0]map(1) [measurement-map]
24802474
0x01, // key: 1 [mval]
2481-
0xbf, // value: map(indef) [measurement-values-map]
2475+
0xa1, // value: map(1) [measurement-values-map]
24822476
0x01, // key: 1 [svn]
24832477
0x01, // value: 1
2484-
0xff, // break
2485-
0xff, // break
24862478
0x19, 0x05, 0x39, // key: 1337 [extension(1337)]
24872479
0xf5, // value: true
24882480
];
@@ -2558,57 +2550,50 @@ mod tests {
25582550
ciborium::into_writer(&comid, &mut actual_cbor).unwrap();
25592551

25602552
let expected_cbor: Vec<u8> = vec![
2561-
0xbf, // map(indef) [concise-mid-tag]
2553+
0xa6, // map(6) [concise-mid-tag]
25622554
0x00, // key: 0 [language]
25632555
0x65, // value: tstr(5)
25642556
0x65, 0x6e, 0x2d, 0x47, 0x42, // "en-GB"
25652557
0x01, // key: 1 [tag-identity]
2566-
0xbf, // value: map(indef) [tag-identity-map]
2558+
0xa1, // value: map(1) [tag-identity-map]
25672559
0x00, // key: 0 [tag-id]
25682560
0x63, // value: tstr(3)
25692561
0x66, 0x6f, 0x6f, // "foo"
2570-
0xff, // break
25712562
0x02, // key: 2 [entities]
25722563
0x81, // value: array(1)
2573-
0xbf, // [0]map(indef) [comid-entity-map]
2564+
0xa2, // [0]map(2) [comid-entity-map]
25742565
0x00, // key: 0 [entity-name]
25752566
0x63, // value: tstr(3)
25762567
0x66, 0x6f, 0x6f, // "foo"
25772568
0x02, // key: 2 [role]
25782569
0x81, // value: array(1)
25792570
0x01, // [0]1 [creator]
2580-
0xff, // break
25812571
0x03, // key: 3 [linked-tags]
25822572
0x81, // value: array(0)
2583-
0xbf, // [0]map(indef) [linked-tag-map]
2573+
0xa2, // [0]map(2) [linked-tag-map]
25842574
0x00, // key: 0 [linked-tag-id]
25852575
0x63, // value: tstr(3)
25862576
0x62, 0x61, 0x72, // "bar"
25872577
0x01, // key: 1 [tag-rel]
25882578
0x00, // value: 0 [supplements]
2589-
0xff, // break
25902579
0x04, // key: 4 [triples]
25912580
0xa1, // value: map(1) [triples-map]
25922581
0x01, // key: 1 [endorsed-triples]
25932582
0x81, // value: array(1)
25942583
0x82, // [0]array(2) [endorsed-triple-record]
2595-
0xbf, // [0]map(indef) [environment-map]
2584+
0xa1, // [0]map(1) [environment-map]
25962585
0x01, // key: 1 [instance]
25972586
0xd9, 0x02, 0x30, // value: tag(560) [tagged-bytes[
25982587
0x43, // bstr(3)
25992588
0x01, 0x02, 0x03,
2600-
0xff, // break
26012589
0x81, // [1]array(1)
2602-
0xbf, // [0]map(indef) [measurement-map]
2590+
0xa1, // [0]map(1) [measurement-map]
26032591
0x01, // key: 1 [mval]
2604-
0xbf, // value: map(indef) [measurement-values-map]
2592+
0xa1, // value: map(1) [measurement-values-map]
26052593
0x01, // key: 1 [svn]
26062594
0x01, // value: 1
2607-
0xff, // break
2608-
0xff, // break
26092595
0x19, 0x05, 0x39, // key: 1337 [extension(1337)]
26102596
0xf4, // value: false
2611-
0xff, // break
26122597
];
26132598

26142599
assert_eq!(actual_cbor, expected_cbor);

0 commit comments

Comments
 (0)