1
1
package com.r3.conclave.common.internal.attestation
2
2
3
+ import com.fasterxml.jackson.databind.JsonNode
3
4
import com.fasterxml.jackson.databind.ObjectMapper
4
5
import com.r3.conclave.common.OpaqueBytes
5
6
import com.r3.conclave.common.SHA256Hash
6
7
import com.r3.conclave.common.internal.Cursor
7
8
import com.r3.conclave.common.internal.SgxQuote
8
9
import org.assertj.core.api.Assertions.assertThat
9
10
import org.junit.jupiter.api.Test
11
+ import org.junit.jupiter.params.ParameterizedTest
12
+ import org.junit.jupiter.params.provider.EnumSource
13
+ import org.junit.jupiter.params.provider.MethodSource
14
+ import java.io.IOException
10
15
import java.time.Instant
11
16
import java.time.ZoneOffset.UTC
12
17
import java.time.ZonedDateTime
13
18
import java.util.*
14
19
import kotlin.random.Random
15
20
21
+
22
+ private val mapper = ObjectMapper ()
23
+
24
+ /* * Load a resource as text, throw if the resource is missing. */
25
+ fun loadResourceAsJson (path : String ): JsonNode {
26
+ val text = SignedTcbInfoTest ::class .java.getResource(path)?.readText() ? : throw IOException (" Missing resource: $path " )
27
+ return mapper.readTree(text)
28
+ }
29
+
16
30
class EpidVerificationReportTest {
17
31
@Test
18
32
fun `serialise minimum fields` () {
@@ -144,101 +158,45 @@ class EpidVerificationReportTest {
144
158
145
159
146
160
class SignedTcbInfoTest {
147
- @Test
148
- fun `deserialise tcb` () {
149
- val json = """
150
- {
151
- "sgxtcbcomp01svn":1,
152
- "sgxtcbcomp02svn":2,
153
- "sgxtcbcomp03svn":3,
154
- "sgxtcbcomp04svn":4,
155
- "sgxtcbcomp05svn":5,
156
- "sgxtcbcomp06svn":6,
157
- "sgxtcbcomp07svn":7,
158
- "sgxtcbcomp08svn":8,
159
- "sgxtcbcomp09svn":9,
160
- "sgxtcbcomp10svn":10,
161
- "sgxtcbcomp11svn":11,
162
- "sgxtcbcomp12svn":12,
163
- "sgxtcbcomp13svn":13,
164
- "sgxtcbcomp14svn":14,
165
- "sgxtcbcomp15svn":15,
166
- "sgxtcbcomp16svn":16,
167
- "pcesvn":9
168
- }
169
- """ .trimIndent()
170
- val result = attestationObjectMapper.readValue(json, Tcb ::class .java)
171
- assertThat(1 ).isEqualTo(result.sgxtcbcomp01svn)
161
+ @ParameterizedTest
162
+ @EnumSource(TcbInfo .Version ::class )
163
+ fun `tcb deserialization test` (version : TcbInfo .Version ) {
164
+ val json = loadResourceAsJson(" test_tcb_${version} .json" )
165
+ val result = Tcb .fromJson(json, version)
166
+
167
+ for (i in 0 until 16 ) {
168
+ assertThat(result.sgxtcbcompsvn[i]).isEqualTo(i + 1 )
169
+ }
170
+
171
+ assertThat(result.pcesvn).isEqualTo(9 )
172
172
}
173
173
174
- @Test
175
- fun `deserialise signature` () {
176
- val signature = " 01020304"
177
- val json = """
178
- {
179
- "tcbInfo":{"version":2,"issueDate":"2020-01-02T03:04:05Z","nextUpdate":"2021-02-03T04:05:06Z","fmspc":"00906ed50000","pceId":"0000","tcbType":0,"tcbEvaluationDataNumber":7,
180
- "tcbLevels":[]
181
- },
182
- "signature":"$signature "
183
- }
184
- """ .trimIndent()
185
- val result = attestationObjectMapper.readValue(json, SignedTcbInfo ::class .java)
186
- assertThat(result.signature).isEqualTo(OpaqueBytes .parse(signature))
174
+ @ParameterizedTest
175
+ @EnumSource(TcbInfo .Version ::class )
176
+ fun `signature deserialization test` (version : TcbInfo .Version ) {
177
+ val json = loadResourceAsJson(" test_tcbinfo_${version} .json" )
178
+ val result = SignedTcbInfo .fromJson(json)
179
+ assertThat(result.signature).isEqualTo(OpaqueBytes .parse(" 01020304" )) // Matches resource content
187
180
}
188
181
189
- @Test
190
- fun `deserialise tcb info` () {
191
- val signature =
192
- " 2fcfea244996d64794c3729acff632887de67722cfca7b0458464a74d4101d01879fe28fa01594f28c6e0e97e9558ff0a45898bd6af275e8edffc2364780fe06"
193
- val json = """
194
- {
195
- "tcbInfo":{
196
- "version":2,"issueDate":"2020-01-02T03:04:05Z","nextUpdate":"2021-02-03T04:05:06Z","fmspc":"00906ed50000","pceId":"0000","tcbType":0,"tcbEvaluationDataNumber":7,
197
- "tcbLevels":[
198
- {"tcb":{"sgxtcbcomp01svn":1,"sgxtcbcomp02svn":2,"sgxtcbcomp03svn":3,"sgxtcbcomp04svn":4,"sgxtcbcomp05svn":5,"sgxtcbcomp06svn":6,"sgxtcbcomp07svn":7,"sgxtcbcomp08svn":8,"sgxtcbcomp09svn":9,"sgxtcbcomp10svn":10,"sgxtcbcomp11svn":11,"sgxtcbcomp12svn":12,"sgxtcbcomp13svn":13,"sgxtcbcomp14svn":14,"sgxtcbcomp15svn":15,"sgxtcbcomp16svn":16,"pcesvn":9},"tcbDate":"2019-11-13T00:00:00Z","tcbStatus":"UpToDate"},
199
- {"tcb":{"sgxtcbcomp01svn":13,"sgxtcbcomp02svn":13,"sgxtcbcomp03svn":2,"sgxtcbcomp04svn":4,"sgxtcbcomp05svn":1,"sgxtcbcomp06svn":128,"sgxtcbcomp07svn":0,"sgxtcbcomp08svn":0,"sgxtcbcomp09svn":0,"sgxtcbcomp10svn":0,"sgxtcbcomp11svn":0,"sgxtcbcomp12svn":0,"sgxtcbcomp13svn":0,"sgxtcbcomp14svn":0,"sgxtcbcomp15svn":0,"sgxtcbcomp16svn":0,"pcesvn":9},"tcbDate":"2019-11-13T00:00:00Z","tcbStatus":"ConfigurationNeeded"},
200
- {"tcb":{"sgxtcbcomp01svn":2,"sgxtcbcomp02svn":2,"sgxtcbcomp03svn":2,"sgxtcbcomp04svn":4,"sgxtcbcomp05svn":1,"sgxtcbcomp06svn":128,"sgxtcbcomp07svn":0,"sgxtcbcomp08svn":0,"sgxtcbcomp09svn":0,"sgxtcbcomp10svn":0,"sgxtcbcomp11svn":0,"sgxtcbcomp12svn":0,"sgxtcbcomp13svn":0,"sgxtcbcomp14svn":0,"sgxtcbcomp15svn":0,"sgxtcbcomp16svn":0,"pcesvn":7},"tcbDate":"2019-05-15T00:00:00Z","tcbStatus":"OutOfDate"},
201
- {"tcb":{"sgxtcbcomp01svn":1,"sgxtcbcomp02svn":1,"sgxtcbcomp03svn":2,"sgxtcbcomp04svn":4,"sgxtcbcomp05svn":1,"sgxtcbcomp06svn":128,"sgxtcbcomp07svn":0,"sgxtcbcomp08svn":0,"sgxtcbcomp09svn":0,"sgxtcbcomp10svn":0,"sgxtcbcomp11svn":0,"sgxtcbcomp12svn":0,"sgxtcbcomp13svn":0,"sgxtcbcomp14svn":0,"sgxtcbcomp15svn":0,"sgxtcbcomp16svn":0,"pcesvn":7},"tcbDate":"2019-01-09T00:00:00Z","tcbStatus":"OutOfDate"},
202
- {"tcb":{"sgxtcbcomp01svn":1,"sgxtcbcomp02svn":1,"sgxtcbcomp03svn":2,"sgxtcbcomp04svn":4,"sgxtcbcomp05svn":1,"sgxtcbcomp06svn":128,"sgxtcbcomp07svn":0,"sgxtcbcomp08svn":0,"sgxtcbcomp09svn":0,"sgxtcbcomp10svn":0,"sgxtcbcomp11svn":0,"sgxtcbcomp12svn":0,"sgxtcbcomp13svn":0,"sgxtcbcomp14svn":0,"sgxtcbcomp15svn":0,"sgxtcbcomp16svn":0,"pcesvn":6},"tcbDate":"2018-08-15T00:00:00Z","tcbStatus":"OutOfDate"}
203
- ]
204
- },
205
- "signature":"$signature "
206
- }
207
- """ .trimIndent()
208
- val result = attestationObjectMapper.readValue(json, SignedTcbInfo ::class .java)
209
- assertThat(result.signature).isEqualTo(OpaqueBytes .parse(signature))
210
- assertThat(result.tcbInfo.version).isEqualTo(2 )
182
+ @ParameterizedTest
183
+ @EnumSource(TcbInfo .Version ::class )
184
+ fun `tcb info deserialization test` (version : TcbInfo .Version ) {
185
+ val json = loadResourceAsJson(" test_tcbinfo_$version .json" )
186
+ val result = SignedTcbInfo .fromJson(json)
187
+ assertThat(result.signature).isEqualTo(OpaqueBytes .parse(" 01020304" ))
188
+ assertThat(result.tcbInfo.version).isEqualTo(version)
211
189
assertThat(result.tcbInfo.issueDate).isEqualTo(Instant .parse(" 2020-01-02T03:04:05Z" ))
212
190
assertThat(result.tcbInfo.nextUpdate).isEqualTo(Instant .parse(" 2021-02-03T04:05:06Z" ))
213
191
}
214
192
}
215
193
216
194
class SignedEnclaveIdentityTest {
217
- @Test
218
- fun `deserialise signature` () {
219
- val signature = " 01020304"
220
- val json = """
221
- {
222
- "enclaveIdentity":{
223
- "id":"QE",
224
- "version":2,
225
- "issueDate":"2019-09-05T07:47:08Z",
226
- "nextUpdate":"2029-09-05T07:47:08Z",
227
- "tcbEvaluationDataNumber":0,
228
- "miscselect":"D182B18C",
229
- "miscselectMask":"FFFFFFFF",
230
- "attributes":"70C8CBF48BD76EAB9C8126CE95E96C90",
231
- "attributesMask":"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
232
- "mrsigner":"8C4F5775D796503E96137F77C68A829A0056AC8DED70140B081B094490C57BFF",
233
- "isvprodid":1,
234
- "tcbLevels":[
235
- {"tcb":{"isvsvn":1},"tcbDate":"2019-09-01T00:00:00Z","tcbStatus":"UpToDate"}
236
- ]
237
- },
238
- "signature":"$signature "
239
- }
240
- """ .trimIndent()
241
- val result = attestationObjectMapper.readValue(json, SignedEnclaveIdentity ::class .java)
242
- assertThat(result.signature).isEqualTo(OpaqueBytes .parse(signature))
195
+ @ParameterizedTest
196
+ @EnumSource(EnclaveIdentity .Version ::class )
197
+ fun `signature deserializes correctly` (version : EnclaveIdentity .Version ) {
198
+ val json = loadResourceAsJson(" test_signed_enclave_identity_$version .json" )
199
+ val result = SignedEnclaveIdentity .fromJson(json)
200
+ assertThat(result.signature).isEqualTo(OpaqueBytes .parse(" 01020304" ))
243
201
}
244
- }
202
+ }
0 commit comments