Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 2df735f

Browse files
committedFeb 21, 2024·
Realm Reference Values
Signed-off-by: Yogesh Deshpande <yogesh.deshpande@arm.com>
1 parent 25d970d commit 2df735f

File tree

5 files changed

+341
-1
lines changed

5 files changed

+341
-1
lines changed
 
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
{
2+
"lang": "en-GB",
3+
"tag-identity": {
4+
"id": "43BBE37F-2E61-4B33-AED3-53CFF1428B16",
5+
"version": 0
6+
},
7+
"entities": [
8+
{
9+
"name": "Workload Client Ltd.",
10+
"regid": "https://workloadclient.example",
11+
"roles": [
12+
"tagCreator",
13+
"creator",
14+
"maintainer"
15+
]
16+
}
17+
],
18+
"triples": {
19+
"reference-values": [
20+
{
21+
"environment": {
22+
"class": {
23+
"id": {
24+
"type": "uuid",
25+
"value": "CD1F0E55-26F9-460D-B9D8-F7FDE171787C"
26+
},
27+
"vendor": "Workload Client Ltd"
28+
},
29+
"instance": {
30+
"type": "bytes",
31+
"value": "5Fty9cDAtXI="
32+
}
33+
},
34+
"measurements": [
35+
{
36+
"value": {
37+
"integrity-registers": {
38+
"rim": {
39+
"key_type": "text",
40+
"Value": [
41+
"sha-384;QoS1aUymwNLPR4mguVrIAlyBjeUjBDZL580pgbLS7caFsyInfsJYGZYkE9jJssH1"
42+
]
43+
},
44+
"rem": {
45+
"key_type": "text",
46+
"Value": [
47+
"sha-384;IQe752H8pS2VE2oTVNt6TdV7Gya+DT2nHZ6yOYazS6YVq/ZRTPNeWp6lWgMtBop4",
48+
"sha-384;JQe752H8pS2VE2oTVNt6TdV7Gya+DT2nHZ6yOYazS6YVq/ZRTPNeWp6lWgMtBop4",
49+
"sha-384;MQe752H8pS2VE2oTVNt6TdV7Gya+DT2nHZ6yOYazS6YVq/ZRTPNeWp6lWgMtBop4",
50+
"sha-384;NQe752H8pS2VE2oTVNt6TdV7Gya+DT2nHZ6yOYazS6YVq/ZRTPNeWp6lWgMtBop4"
51+
]
52+
}
53+
}
54+
}
55+
}
56+
]
57+
}
58+
]
59+
}
60+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{
2+
"corim-id": "5c57e8f4-46cd-421b-91c9-08cf93e13cfc",
3+
"dependent-rims": [
4+
{
5+
"href": "https://parent.example/rims/ccb3aa85-61b4-40f1-848e-02ad6e8a254b",
6+
"thumbprint": "sha-256:5Fty9cDAtXLbTY06t+l/No/3TmI0eoJN7LZ6hOUiTXU="
7+
}
8+
],
9+
"profiles": [
10+
"http://arm.com/cca/realm/1"
11+
],
12+
"validity": {
13+
"not-before": "2021-12-31T00:00:00Z",
14+
"not-after": "2025-12-31T00:00:00Z"
15+
},
16+
"entities": [
17+
{
18+
"name": "ACME Ltd.",
19+
"regid": "acme.example",
20+
"roles": [
21+
"manifestCreator"
22+
]
23+
}
24+
]
25+
}
+194
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
// Copyright 2024 Contributors to the Veraison project.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package comid
5+
6+
import (
7+
"fmt"
8+
"strings"
9+
)
10+
11+
func Example_cca_realm_refval() {
12+
comid := Comid{}
13+
14+
if err := comid.FromJSON([]byte(CCARealmRefValJSONTemplate)); err != nil {
15+
panic(err)
16+
}
17+
18+
if err := comid.Valid(); err != nil {
19+
panic(err)
20+
}
21+
22+
if err := extractRealmRefVals(&comid); err != nil {
23+
panic(err)
24+
}
25+
// output:
26+
// ClassID: cd1f0e5526f9460db9d8f7fde171787c
27+
// Vendor: Workload Client Ltd
28+
// InstanceID: e45b72f5c0c0b572
29+
// Index: rim
30+
// Alg: sha-384
31+
// Digest: 4284b5694ca6c0d2cf4789a0b95ac8025c818de52304364be7cd2981b2d2edc685b322277ec25819962413d8c9b2c1f5
32+
// Index: rem
33+
// Alg: sha-384
34+
// Digest: 2107bbe761fca52d95136a1354db7a4dd57b1b26be0d3da71d9eb23986b34ba615abf6514cf35e5a9ea55a032d068a78
35+
// Alg: sha-384
36+
// Digest: 2507bbe761fca52d95136a1354db7a4dd57b1b26be0d3da71d9eb23986b34ba615abf6514cf35e5a9ea55a032d068a78
37+
// Alg: sha-384
38+
// Digest: 3107bbe761fca52d95136a1354db7a4dd57b1b26be0d3da71d9eb23986b34ba615abf6514cf35e5a9ea55a032d068a78
39+
// Alg: sha-384
40+
// Digest: 3507bbe761fca52d95136a1354db7a4dd57b1b26be0d3da71d9eb23986b34ba615abf6514cf35e5a9ea55a032d068a78
41+
42+
}
43+
44+
func extractRealmRefVals(c *Comid) error {
45+
if c.Triples.ReferenceValues == nil {
46+
return fmt.Errorf("no reference values triples")
47+
}
48+
49+
for i, rv := range *c.Triples.ReferenceValues {
50+
if err := extractRealmRefVal(rv); err != nil {
51+
return fmt.Errorf("bad Realm reference value at index %d: %w", i, err)
52+
}
53+
}
54+
55+
return nil
56+
}
57+
58+
func extractRealmRefVal(rv ReferenceValue) error {
59+
class := rv.Environment.Class
60+
instance := rv.Environment.Instance
61+
62+
if err := extractRealmClass(class); err != nil {
63+
return fmt.Errorf("extracting uuid: %w", err)
64+
}
65+
66+
if err := extractRealmInstanceID(instance); err != nil {
67+
return fmt.Errorf("extracting realm instanceID: %w", err)
68+
}
69+
70+
measurements := rv.Measurements
71+
72+
if err := extractMeasurements(measurements); err != nil {
73+
return fmt.Errorf("extracting measurements: %w", err)
74+
}
75+
76+
return nil
77+
}
78+
79+
func extractMeasurements(m Measurements) error {
80+
if len(m) == 0 {
81+
return fmt.Errorf("no measurements")
82+
}
83+
84+
for i, m := range m {
85+
if err := extractMeasurement(m); err != nil {
86+
return fmt.Errorf("extracting measurement at index %d: %w", i, err)
87+
}
88+
}
89+
90+
return nil
91+
}
92+
93+
func extractMeasurement(m Measurement) error {
94+
if err := extractIntegrityRegisters(m.Val.IntegrityRegisters); err != nil {
95+
return fmt.Errorf("extracting digest: %w", err)
96+
}
97+
98+
return nil
99+
}
100+
101+
func extractRealmClass(c *Class) error {
102+
if c == nil {
103+
return fmt.Errorf("no class")
104+
}
105+
106+
classID := c.ClassID
107+
108+
if classID == nil {
109+
return fmt.Errorf("no class-id")
110+
}
111+
112+
if classID.Type() != "uuid" {
113+
return fmt.Errorf("class id is not a uuid")
114+
}
115+
116+
fmt.Printf("ClassID: %x\n", classID.Bytes())
117+
118+
if c.Vendor != nil {
119+
fmt.Printf("Vendor: %s\n", c.GetVendor())
120+
}
121+
return nil
122+
}
123+
124+
func extractRealmInstanceID(i *Instance) error {
125+
if i == nil {
126+
return fmt.Errorf("no instance")
127+
}
128+
129+
if i.Type() != "bytes" {
130+
return fmt.Errorf("instance id is not bytes")
131+
}
132+
133+
fmt.Printf("InstanceID: %x\n", i.Bytes())
134+
135+
return nil
136+
}
137+
138+
func extractIntegrityRegisters(r *IntegrityRegisters) error {
139+
if r == nil {
140+
return fmt.Errorf("no integrity registers")
141+
}
142+
143+
keys, err := extractRegisterIndex(r)
144+
if err != nil {
145+
return fmt.Errorf("unable to extract register index: %v", err)
146+
}
147+
148+
for _, k := range keys {
149+
d, ok := r.m[k]
150+
if !ok {
151+
return fmt.Errorf("unable to locate register index for: %s", k)
152+
}
153+
fmt.Printf("Index: %s\n", k)
154+
if err := extractRealmDigests(d); err != nil {
155+
return fmt.Errorf("invalid Digests for key: %s, %v", k, err)
156+
}
157+
}
158+
159+
return nil
160+
}
161+
162+
func extractRealmDigests(digests Digests) error {
163+
164+
if err := digests.Valid(); err != nil {
165+
return fmt.Errorf("invalid digest: %v", err)
166+
}
167+
for _, d := range digests {
168+
fmt.Printf("Alg: %s\n", d.AlgIDToString())
169+
fmt.Printf("Digest: %x\n", d.HashValue)
170+
}
171+
172+
return nil
173+
}
174+
175+
func extractRegisterIndex(r *IntegrityRegisters) ([]string, error) {
176+
var keys [2]string
177+
for k := range r.m {
178+
switch t := k.(type) {
179+
case string:
180+
key := strings.ToLower(t)
181+
switch key {
182+
case "rim":
183+
keys[0] = key
184+
case "rem":
185+
keys[1] = key
186+
default:
187+
return nil, fmt.Errorf("unexpected register index: %s", key)
188+
}
189+
default:
190+
return nil, fmt.Errorf("unexpected type for index: %T", t)
191+
}
192+
}
193+
return keys[:], nil
194+
}

‎comid/measurement.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,8 @@ func (o Mval) Valid() error {
355355
o.IPAddr == nil &&
356356
o.SerialNumber == nil &&
357357
o.UEID == nil &&
358-
o.UUID == nil {
358+
o.UUID == nil &&
359+
o.IntegrityRegisters == nil {
359360
return fmt.Errorf("no measurement value set")
360361
}
361362

‎comid/test_vars.go

+60
Original file line numberDiff line numberDiff line change
@@ -439,4 +439,64 @@ var (
439439
}
440440
}
441441
`
442+
CCARealmRefValJSONTemplate = `{
443+
"lang": "en-GB",
444+
"tag-identity": {
445+
"id": "99019224-57AA-44BC-BEF8-D36BDD6BD035",
446+
"version": 0
447+
},
448+
"entities": [
449+
{
450+
"name": "Workload Client Ltd.",
451+
"regid": "https://workloadclient.example",
452+
"roles": [
453+
"tagCreator",
454+
"creator",
455+
"maintainer"
456+
]
457+
}
458+
],
459+
"triples": {
460+
"reference-values": [
461+
{
462+
"environment": {
463+
"class": {
464+
"id": {
465+
"type": "uuid",
466+
"value": "CD1F0E55-26F9-460D-B9D8-F7FDE171787C"
467+
},
468+
"vendor": "Workload Client Ltd"
469+
},
470+
"instance": {
471+
"type": "bytes",
472+
"value": "5Fty9cDAtXI="
473+
}
474+
},
475+
"measurements": [
476+
{
477+
"value": {
478+
"integrity-registers": {
479+
"rim": {
480+
"key_type": "text",
481+
"Value": [
482+
"sha-384;QoS1aUymwNLPR4mguVrIAlyBjeUjBDZL580pgbLS7caFsyInfsJYGZYkE9jJssH1"
483+
]
484+
},
485+
"rem": {
486+
"key_type": "text",
487+
"Value": [
488+
"sha-384;IQe752H8pS2VE2oTVNt6TdV7Gya+DT2nHZ6yOYazS6YVq/ZRTPNeWp6lWgMtBop4",
489+
"sha-384;JQe752H8pS2VE2oTVNt6TdV7Gya+DT2nHZ6yOYazS6YVq/ZRTPNeWp6lWgMtBop4",
490+
"sha-384;MQe752H8pS2VE2oTVNt6TdV7Gya+DT2nHZ6yOYazS6YVq/ZRTPNeWp6lWgMtBop4",
491+
"sha-384;NQe752H8pS2VE2oTVNt6TdV7Gya+DT2nHZ6yOYazS6YVq/ZRTPNeWp6lWgMtBop4"
492+
]
493+
}
494+
}
495+
}
496+
}
497+
]
498+
}
499+
]
500+
}
501+
}`
442502
)

0 commit comments

Comments
 (0)
Please sign in to comment.