Skip to content

Commit e9d23e9

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 5e7d74e commit e9d23e9

File tree

2 files changed

+77
-1
lines changed

2 files changed

+77
-1
lines changed

attesters/mocktsm/mocktsm.go

+21
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"
@@ -67,12 +69,31 @@ func (m *MockPlugin) GetEvidence(in *compositor.EvidenceIn) *compositor.Evidence
6769
return getEvidenceError(errMsg)
6870
}
6971

72+
options := make(map[string]string)
73+
if len(in.Options) > 0 {
74+
if err := json.Unmarshal([]byte(in.Options), &options); err != nil {
75+
errMsg := fmt.Errorf(
76+
"failed to parse %s: %v", in.Options, err)
77+
return getEvidenceError(errMsg)
78+
}
79+
}
80+
7081
if in.ContentType == mediaType {
7182
req := &report.Request{
7283
InBlob: in.Nonce,
7384
GetAuxBlob: true,
7485
}
7586

87+
if privlevel, ok := options["privilege_level"]; ok {
88+
level, err := strconv.Atoi(privlevel)
89+
if err != nil || level < 0 {
90+
errMsg := fmt.Errorf("privilege_level %s is invalid",
91+
privlevel)
92+
return getEvidenceError(errMsg)
93+
}
94+
req.Privilege = &report.Privilege{Level: uint(level)}
95+
}
96+
7697
resp, err := report.Get(m.client, req)
7798
if err != nil {
7899
errMsg := fmt.Errorf("failed to get mock TSM report: %v", err)

attesters/mocktsm/mocktsm_test.go

+56-1
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: 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: "{\"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)