Skip to content

Commit 77af9d6

Browse files
committed
Add attester-specific option support to MockTSM
MockTSM now takes the support of options, only privilege_level is supported at this time. The schema is defined as the following: mocktsm:{"privilege_level": "$level"}. Replace $level with number 0-3 Signed-off-by: Ian Chin Wang <[email protected]>
1 parent f8f45b0 commit 77af9d6

File tree

2 files changed

+77
-1
lines changed

2 files changed

+77
-1
lines changed

attesters/mocktsm/mocktsm.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
package mocktsm
44

55
import (
6+
"encoding/json"
67
"fmt"
8+
"strconv"
79

810
"github.com/google/go-configfs-tsm/configfs/configfsi"
911
"github.com/google/go-configfs-tsm/configfs/faketsm"
@@ -77,6 +79,25 @@ func (m *MockPlugin) GetEvidence(in *compositor.EvidenceIn) *compositor.Evidence
7779
GetAuxBlob: true,
7880
}
7981

82+
options := make(map[string]string)
83+
if len(in.Options) > 0 {
84+
if err := json.Unmarshal(in.Options, &options); err != nil {
85+
errMsg := fmt.Errorf(
86+
"failed to parse %s: %v", in.Options, err)
87+
return getEvidenceError(errMsg)
88+
}
89+
}
90+
91+
if privlevel, ok := options["privilege_level"]; ok {
92+
level, err := strconv.Atoi(privlevel)
93+
if err != nil || level < 0 {
94+
errMsg := fmt.Errorf("privilege_level %s is invalid",
95+
privlevel)
96+
return getEvidenceError(errMsg)
97+
}
98+
req.Privilege = &report.Privilege{Level: uint(level)}
99+
}
100+
80101
resp, err := report.Get(m.client, req)
81102
if err != nil {
82103
errMsg := fmt.Errorf("failed to get mock TSM report: %v", err)

attesters/mocktsm/mocktsm_test.go

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ func Test_GetEvidence_invalid_format(t *testing.T) {
7474
assert.Equal(t, expected, p.GetEvidence(in))
7575
}
7676

77-
func Test_GetEvidence(t *testing.T) {
77+
func Test_GetEvidence_No_Options(t *testing.T) {
7878
inblob := []byte(validNonceStr)
7979
in := &compositor.EvidenceIn{
8080
ContentType: string(mediaType),
@@ -97,3 +97,58 @@ func Test_GetEvidence(t *testing.T) {
9797

9898
assert.Equal(t, expected, p.GetEvidence(in))
9999
}
100+
101+
func TestGetEvidence_With_Invalid_Options(t *testing.T) {
102+
tests := []struct{name, params, msg string} {
103+
{"privilege level not integer", `{"privilege_level": "invalid"}`,
104+
"privilege_level invalid is invalid"},
105+
{"privilege level less than zero", `{"privilege_level": "-20"}`,
106+
"privilege_level -20 is invalid"},
107+
{"invalid json", `{"privilege_level"}`,
108+
`failed to parse {"privilege_level"}: invalid character '}' after object key`},
109+
}
110+
for _, tt := range tests {
111+
t.Run(tt.name, func(t *testing.T) {
112+
inblob := []byte(validNonceStr)
113+
in := &compositor.EvidenceIn{
114+
ContentType: string(mediaType),
115+
Nonce: inblob,
116+
Options: []byte(tt.params),
117+
}
118+
119+
expected := &compositor.EvidenceOut{
120+
Status: &compositor.Status{
121+
Result: false,
122+
Error: tt.msg,
123+
},
124+
}
125+
126+
assert.Equal(t, expected, p.GetEvidence(in))
127+
})
128+
}
129+
}
130+
131+
func Test_GetEvidence_With_Valid_Privilege_level(t *testing.T) {
132+
inblob := []byte(validNonceStr)
133+
in := &compositor.EvidenceIn{
134+
ContentType: string(mediaType),
135+
Nonce: inblob,
136+
Options: []byte(`{"privilege_level": "1"}`),
137+
}
138+
139+
expectedOutblob := fmt.Sprintf("privlevel: 1\ninblob: %s", hex.EncodeToString(inblob))
140+
out := &tokens.TSMReport {
141+
Provider: "fake\n",
142+
OutBlob: []byte(expectedOutblob),
143+
AuxBlob: []byte("auxblob"),
144+
}
145+
146+
outEncoded, _ := out.ToJSON()
147+
148+
expected := &compositor.EvidenceOut{
149+
Status: statusSucceeded,
150+
Evidence: outEncoded,
151+
}
152+
153+
assert.Equal(t, expected, p.GetEvidence(in))
154+
}

0 commit comments

Comments
 (0)