diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d9e63fc9..894b8758 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,6 +23,9 @@ jobs: name: Build+Test runs-on: ubuntu-20.04 + env: + PCS_API_KEY: ${{ secrets.PCS_API_KEY }} + steps: - uses: actions/checkout@v4 @@ -53,6 +56,9 @@ jobs: - name: cargo test -p async-usercalls --target x86_64-fortanix-unknown-sgx --no-run run: cargo +nightly test --verbose --locked -p async-usercalls --target x86_64-fortanix-unknown-sgx --no-run + - name: Nightly test -p dcap-artifact-retrieval --target x86_64-fortanix-unknown-sgx --no-default-features --no-run + run: cargo +nightly test --verbose --locked -p dcap-artifact-retrieval --target x86_64-fortanix-unknown-sgx --no-default-features --no-run + - name: Cargo test -p dcap-ql --features link run: cargo test --verbose --locked -p dcap-ql --features link @@ -76,6 +82,12 @@ jobs: - name: Nightly test -p sgx-isa --features sgxstd --target x86_64-fortanix-unknown-sgx --no-run run: cargo +nightly test --verbose --locked -p sgx-isa --features sgxstd --target x86_64-fortanix-unknown-sgx --no-run + - name: Nightly test -p pcs --target x86_64-fortanix-unknown-sgx + run: cargo +nightly test --verbose --locked -p pcs --target x86_64-fortanix-unknown-sgx --no-run + + - name: Nightly test -p pcs --features verify + run: cargo +nightly test --verbose --locked -p pcs --features verify + # Unfortunately running `faketime '2021-09-10 11:00:00 GMT' cargo test -p nitro-attestation-verify` causes a segmentation # fault while compiling. We only execute `faketime` during the tests #- run: cargo test --locked -p nitro-attestation-verify --no-run && faketime '2021-09-08 11:00:00 GMT' cargo test --locked -p nitro-attestation-verify --lib diff --git a/Cargo.lock b/Cargo.lock index 2fcbb550..3d996c13 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -34,7 +34,7 @@ dependencies = [ "protobuf", "protoc-rust", "report-test", - "sgx-isa", + "sgx-isa 0.4.1", "sgxs", "sgxs-loaders", "thiserror", @@ -51,6 +51,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "ansi_term" version = "0.12.1" @@ -78,6 +87,12 @@ dependencies = [ "rand 0.8.5", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "atty" version = "0.2.14" @@ -147,6 +162,17 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac1e8deebfdca687fcef6fe024fc92cf8183f203075ce4fda263ae6ea13a8dc3" +[[package]] +name = "backoff" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" +dependencies = [ + "getrandom 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "instant", + "rand 0.8.5", +] + [[package]] name = "backtrace" version = "0.3.69" @@ -162,6 +188,12 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "base16" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d27c3610c36aee21ce8ac510e6224498de4228ad772a171ed65643a24693a5a8" + [[package]] name = "base64" version = "0.9.3" @@ -193,6 +225,12 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + [[package]] name = "bindgen" version = "0.58.1" @@ -327,9 +365,9 @@ checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" [[package]] name = "bytes" -version = "1.1.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" +checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" [[package]] name = "cargo_toml" @@ -370,15 +408,17 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.19" +version = "0.4.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f" dependencies = [ - "libc", + "iana-time-zone", + "js-sys", "num-integer", "num-traits", "serde", "time 0.1.44", + "wasm-bindgen", "winapi", ] @@ -619,6 +659,28 @@ dependencies = [ "syn 1.0.81", ] +[[package]] +name = "dcap-artifact-retrieval" +version = "0.1.0" +dependencies = [ + "backoff", + "clap", + "lazy_static", + "lru-cache", + "mbedtls", + "num_enum", + "pcs", + "percent-encoding 2.1.0", + "pkix 0.2.1", + "quick-error", + "reqwest 0.12.4", + "rustc-serialize", + "serde", + "serde_cbor", + "serde_json", + "yasna 0.3.2", +] + [[package]] name = "dcap-provider" version = "0.4.0" @@ -629,7 +691,7 @@ dependencies = [ "lazy_static", "log 0.4.21", "report-test", - "reqwest", + "reqwest 0.11.10", "rustc-serialize", ] @@ -649,7 +711,7 @@ dependencies = [ "report-test", "serde", "serde_json", - "sgx-isa", + "sgx-isa 0.4.1", "sgxs", "sgxs-loaders", "yasna 0.3.2", @@ -661,7 +723,7 @@ version = "0.2.1" dependencies = [ "num-derive 0.2.5", "num-traits", - "sgx-isa", + "sgx-isa 0.4.1", ] [[package]] @@ -672,7 +734,7 @@ dependencies = [ "anyhow", "dcap-ql", "report-test", - "sgx-isa", + "sgx-isa 0.4.1", "sgxs-loaders", ] @@ -797,15 +859,15 @@ dependencies = [ "em-node-agent-client", "hyper 0.10.16", "mbedtls", - "pkix", + "pkix 0.1.2", "rustc-serialize", "sdkms", "serde", "serde_bytes", "serde_derive 1.0.132", "serde_json", - "sgx-isa", - "sgx_pkix", + "sgx-isa 0.4.1", + "sgx_pkix 0.2.2", "url 1.7.2", "uuid 0.6.5", "uuid 0.8.2", @@ -871,7 +933,7 @@ dependencies = [ "nix 0.13.1", "num_cpus", "openssl", - "sgx-isa", + "sgx-isa 0.4.1", "sgxs", "thiserror", "tokio", @@ -952,6 +1014,28 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "failure" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" +dependencies = [ + "backtrace", + "failure_derive", +] + +[[package]] +name = "failure_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" +dependencies = [ + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 1.0.81", + "synstructure", +] + [[package]] name = "fake-simd" version = "0.1.2" @@ -1056,7 +1140,7 @@ dependencies = [ "num_cpus", "serde", "serde_derive 1.0.132", - "sgx-isa", + "sgx-isa 0.4.1", "sgxs", "sgxs-loaders", "thiserror", @@ -1287,12 +1371,12 @@ version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" dependencies = [ - "bytes 1.1.0", + "bytes 1.7.1", "fnv", "futures-core", "futures-sink", "futures-util", - "http", + "http 0.2.5", "indexmap 1.6.0", "slab", "tokio", @@ -1300,6 +1384,25 @@ dependencies = [ "tracing", ] +[[package]] +name = "h2" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" +dependencies = [ + "atomic-waker", + "bytes 1.7.1", + "fnv", + "futures-core", + "futures-sink", + "http 1.1.0", + "indexmap 2.2.6", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "half" version = "1.8.2" @@ -1355,27 +1458,61 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1323096b05d41827dadeaee54c9981958c0f94e670bc94ed80037d1a7b8b186b" dependencies = [ - "bytes 1.1.0", + "bytes 1.7.1", "fnv", "itoa 0.4.8", ] +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes 1.7.1", + "fnv", + "itoa 1.0.1", +] + [[package]] name = "http-body" version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" dependencies = [ - "bytes 1.1.0", - "http", + "bytes 1.7.1", + "http 0.2.5", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes 1.7.1", + "http 1.1.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes 1.7.1", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", "pin-project-lite", ] [[package]] name = "httparse" -version = "1.5.1" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acd94fdbe1d4ff688b67b04eee2e17bd50995534a61539e45adfefb45e5e5503" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" [[package]] name = "httpdate" @@ -1423,13 +1560,13 @@ version = "0.14.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "436ec0091e4f20e655156a30a0df3770fe2900aa301e548e08446ec794b6953c" dependencies = [ - "bytes 1.1.0", + "bytes 1.7.1", "futures-channel", "futures-core", "futures-util", - "h2", - "http", - "http-body", + "h2 0.3.21", + "http 0.2.5", + "http-body 0.4.4", "httparse", "httpdate", "itoa 0.4.8", @@ -1441,13 +1578,33 @@ dependencies = [ "want", ] +[[package]] +name = "hyper" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +dependencies = [ + "bytes 1.7.1", + "futures-channel", + "futures-util", + "h2 0.4.6", + "http 1.1.0", + "http-body 1.0.1", + "httparse", + "itoa 1.0.1", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + [[package]] name = "hyper-openssl" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9d52322a69f0a93f177d76ca82073fcec8d5b4eb6e28525d5b3142fa718195c" dependencies = [ - "http", + "http 0.2.5", "hyper 0.14.15", "linked_hash_set", "once_cell", @@ -1465,13 +1622,49 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ - "bytes 1.1.0", + "bytes 1.7.1", "hyper 0.14.15", "native-tls", "tokio", "tokio-native-tls", ] +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes 1.7.1", + "http-body-util", + "hyper 1.4.1", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da62f120a8a37763efb0cf8fdf264b884c7b8b9ac8660b900c8661030c00e6ba" +dependencies = [ + "bytes 1.7.1", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "hyper 1.4.1", + "pin-project-lite", + "socket2 0.5.5", + "tokio", + "tower", + "tower-service", + "tracing", +] + [[package]] name = "hyperlocal" version = "0.8.0" @@ -1485,6 +1678,29 @@ dependencies = [ "tokio", ] +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "ias" version = "0.2.1" @@ -1499,15 +1715,15 @@ dependencies = [ "log 0.4.21", "mbedtls", "percent-encoding 2.1.0", - "pkix", + "pkix 0.1.2", "report-test", - "reqwest", + "reqwest 0.11.10", "serde", "serde-bytes-repr", "serde_bytes", "serde_json", - "sgx-isa", - "sgx_pkix", + "sgx-isa 0.4.1", + "sgx_pkix 0.2.2", "sgxs", "sgxs-loaders", "tokio", @@ -1752,6 +1968,15 @@ version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +[[package]] +name = "lru-cache" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" +dependencies = [ + "linked-hash-map", +] + [[package]] name = "matches" version = "0.1.8" @@ -1942,7 +2167,7 @@ dependencies = [ "lazy_static", "mbedtls", "num-bigint 0.4.3", - "pkix", + "pkix 0.1.2", "serde", "serde_bytes", "serde_cbor", @@ -2081,7 +2306,7 @@ name = "nsm-test" version = "0.1.0" dependencies = [ "nsm", - "pkix", + "pkix 0.1.2", ] [[package]] @@ -2210,6 +2435,27 @@ dependencies = [ "libc", ] +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro-crate", + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 2.0.50", +] + [[package]] name = "num_threads" version = "0.1.6" @@ -2230,9 +2476,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.9.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da32515d9f6e6e489d7bc9d84c71b060db7247dc035bbe44eac88cf87486d8d5" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" @@ -2349,7 +2595,7 @@ dependencies = [ "libc", "redox_syscall 0.4.1", "smallvec", - "windows-targets", + "windows-targets 0.48.5", ] [[package]] @@ -2361,6 +2607,29 @@ dependencies = [ "thiserror", ] +[[package]] +name = "pcs" +version = "0.1.0" +dependencies = [ + "anyhow", + "b64-ct", + "base16", + "dcap-ql", + "failure", + "hex 0.4.3", + "mbedtls", + "num", + "percent-encoding 2.1.0", + "pkix 0.2.1", + "quick-error", + "rustc-serialize", + "serde", + "serde_json", + "sgx-isa 0.4.1", + "sgx_pkix 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "yasna 0.3.2", +] + [[package]] name = "peeking_take_while" version = "0.1.2" @@ -2501,6 +2770,21 @@ dependencies = [ "yasna 0.3.2", ] +[[package]] +name = "pkix" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3627d36de10749cd6bba01a975d64c01f1deb95d22823dbfbb4d7a913a240850" +dependencies = [ + "b64-ct", + "bit-vec 0.6.2", + "chrono", + "lazy_static", + "num-bigint 0.2.6", + "num-integer", + "yasna 0.3.2", +] + [[package]] name = "plugin" version = "0.2.6" @@ -2522,6 +2806,15 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c36fa947111f5c62a733b652544dd0016a43ce89619538a8ef92724a6f501a20" +[[package]] +name = "proc-macro-crate" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +dependencies = [ + "toml_edit", +] + [[package]] name = "proc-macro-hack" version = "0.5.19" @@ -2582,7 +2875,7 @@ version = "2.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6653d384a260fedff0a466e894e05c5b8d75e261a14e9f93e81e43ef86cad23" dependencies = [ - "log 0.4.21", + "log 0.3.9", "which 4.0.2", ] @@ -2878,7 +3171,7 @@ version = "0.4.0" dependencies = [ "anyhow", "enclave-runner", - "sgx-isa", + "sgx-isa 0.4.1", "sgxs", ] @@ -2889,15 +3182,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46a1f7aa4f35e5e8b4160449f51afc758f0ce6454315a9fa7d0d113e958c41eb" dependencies = [ "base64 0.13.0", - "bytes 1.1.0", + "bytes 1.7.1", "encoding_rs", "futures-core", "futures-util", - "h2", - "http", - "http-body", + "h2 0.3.21", + "http 0.2.5", + "http-body 0.4.4", "hyper 0.14.15", - "hyper-tls", + "hyper-tls 0.5.0", "ipnet", "js-sys", "lazy_static", @@ -2915,7 +3208,50 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winreg", + "winreg 0.10.1", +] + +[[package]] +name = "reqwest" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" +dependencies = [ + "base64 0.22.1", + "bytes 1.7.1", + "encoding_rs", + "futures-channel", + "futures-core", + "futures-util", + "h2 0.4.6", + "http 1.1.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.4.1", + "hyper-tls 0.6.0", + "hyper-util", + "ipnet", + "js-sys", + "log 0.4.21", + "mime 0.3.16", + "native-tls", + "once_cell", + "percent-encoding 2.1.0", + "pin-project-lite", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-native-tls", + "tower-service", + "url 2.2.2", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg 0.52.0", ] [[package]] @@ -2964,6 +3300,22 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1956f5517128a2b6f23ab2dadf1a976f4f5b27962e7724c2bf3d45e539ec098c" +[[package]] +name = "rustls-pemfile" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" +dependencies = [ + "base64 0.22.1", + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" + [[package]] name = "rustversion" version = "1.0.3" @@ -3201,15 +3553,37 @@ dependencies = [ "serde", ] +[[package]] +name = "sgx-isa" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0746ac51caf664e67fdb6643b27f0e29d4b9e1cea0b374644ab28bfa2b83fc9" +dependencies = [ + "bitflags 1.2.1", +] + [[package]] name = "sgx_pkix" version = "0.2.2" dependencies = [ "byteorder 1.3.4", "lazy_static", - "pkix", + "pkix 0.1.2", "quick-error", - "sgx-isa", + "sgx-isa 0.4.1", +] + +[[package]] +name = "sgx_pkix" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbd99155dbd1b4c45ad6a742cb0415387b68f22ab7e8f4cabba4e49d606e5ded" +dependencies = [ + "byteorder 1.3.4", + "lazy_static", + "pkix 0.1.2", + "quick-error", + "sgx-isa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3222,7 +3596,7 @@ dependencies = [ "foreign-types", "openssl", "openssl-sys", - "sgx-isa", + "sgx-isa 0.4.1", "sha2 0.8.2", "thiserror", "time 0.3.36", @@ -3238,7 +3612,7 @@ dependencies = [ "libloading 0.5.2", "nix 0.15.0", "report-test", - "sgx-isa", + "sgx-isa 0.4.1", "sgxs", "thiserror", "winapi", @@ -3269,11 +3643,11 @@ dependencies = [ "quote 0.6.13", "regex", "report-test", - "reqwest", + "reqwest 0.11.10", "serde", "serde_derive 1.0.132", "serde_yaml", - "sgx-isa", + "sgx-isa 0.4.1", "sgxs", "sgxs-loaders", "syn 0.15.44", @@ -3326,7 +3700,7 @@ checksum = "1e468265908f45299c26571dad9a2e5cb3656eceb51cd58f1441cf61aa71aad6" dependencies = [ "base64 0.13.0", "byteorder 1.3.4", - "bytes 1.1.0", + "bytes 1.7.1", "chrono", "flate2", "futures-util", @@ -3384,9 +3758,9 @@ checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" [[package]] name = "smallvec" -version = "1.7.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" @@ -3459,6 +3833,45 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2 1.0.78", + "quote 1.0.35", + "syn 1.0.81", + "unicode-xid 0.2.1", +] + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.2.1", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "tar" version = "0.4.37" @@ -3599,7 +4012,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" dependencies = [ "backtrace", - "bytes 1.1.0", + "bytes 1.7.1", "libc", "mio", "num_cpus", @@ -3661,7 +4074,7 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0edfdeb067411dba2044da6d1cb2df793dd35add7888d73c16e3381ded401764" dependencies = [ - "bytes 1.1.0", + "bytes 1.7.1", "futures-core", "futures-sink", "pin-project-lite", @@ -3712,6 +4125,21 @@ dependencies = [ "winnow", ] +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project 1.0.8", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" version = "0.3.1" @@ -3726,11 +4154,10 @@ checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" [[package]] name = "tracing" -version = "0.1.29" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "375a639232caf30edfc78e8d89b2d4c375515393e7af7e16f01cd96917fb2105" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "cfg-if 1.0.0", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -3738,22 +4165,22 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.21" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc6b8ad3567499f98a1db7a752b07a7c8c7c7c34c332ec00effb2b0027974b7c" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2 1.0.78", "quote 1.0.35", - "syn 1.0.81", + "syn 2.0.50", ] [[package]] name = "tracing-core" -version = "0.1.21" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4ed65637b8390770814083d20756f87bfa2c21bf2f110babdc5438351746e4" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ - "lazy_static", + "once_cell", ] [[package]] @@ -3931,7 +4358,7 @@ name = "vme-pkix" version = "0.1.1" dependencies = [ "lazy_static", - "pkix", + "pkix 0.1.2", ] [[package]] @@ -4124,13 +4551,22 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", ] [[package]] @@ -4139,13 +4575,29 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -4154,42 +4606,90 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + [[package]] name = "winnow" version = "0.6.18" @@ -4208,6 +4708,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "winreg" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +dependencies = [ + "cfg-if 1.0.0", + "windows-sys", +] + [[package]] name = "xattr" version = "0.2.2" diff --git a/Cargo.toml b/Cargo.toml index 39ecc2ca..e142b5a5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,6 +17,7 @@ members = [ "fortanix-vme/vme-pkix", "intel-sgx/aesm-client", "intel-sgx/async-usercalls", + "intel-sgx/dcap-artifact-retrieval", "intel-sgx/dcap-provider", "intel-sgx/dcap-ql-sys", "intel-sgx/dcap-ql", @@ -25,6 +26,7 @@ members = [ "intel-sgx/fortanix-sgx-abi", "intel-sgx/fortanix-sgx-tools", "intel-sgx/ias", + "intel-sgx/pcs", "intel-sgx/report-test", "intel-sgx/sgx_pkix", "intel-sgx/sgx-isa", diff --git a/fortanix-vme/aws-nitro-enclaves/nitro-attestation-verify/src/lib.rs b/fortanix-vme/aws-nitro-enclaves/nitro-attestation-verify/src/lib.rs index b94f09f0..fea6d241 100644 --- a/fortanix-vme/aws-nitro-enclaves/nitro-attestation-verify/src/lib.rs +++ b/fortanix-vme/aws-nitro-enclaves/nitro-attestation-verify/src/lib.rs @@ -327,7 +327,7 @@ mod tests { // Not Before: Sep 9 10:19:20 2021 GMT // Not After : Sep 9 13:19:20 2021 GMT static ref PROPER_TOKEN : Vec = include_bytes!("../data/request_proper.bin").to_vec(); - static ref PROPER_VALIDITY: (DateTime, DateTime) = (Utc.ymd(2021, 9, 9).and_hms(10, 19, 19), Utc.ymd(2021, 9, 9).and_hms(13, 19, 21)); + static ref PROPER_VALIDITY: (DateTime, DateTime) = (Utc.with_ymd_and_hms(2021, 9, 9, 10, 19, 19).unwrap(), Utc.with_ymd_and_hms(2021, 9, 9, 13, 19, 21).unwrap()); static ref NOT_VALID_YET_ERR: NitroError = NitroError::CertificateVerifyFailure("Certificate verify failure: X509CertVerifyFailed, The certificate validity starts in the future\n".to_string()); static ref EXPIRED_ERR: NitroError = NitroError::CertificateVerifyFailure("Certificate verify failure: X509CertVerifyFailed, The certificate validity has expired\n".to_string()); static ref TAMPERED_SIGNATURE : Vec = include_bytes!("../data/tampered_signature.bin").to_vec(); diff --git a/intel-sgx/dcap-artifact-retrieval/Cargo.toml b/intel-sgx/dcap-artifact-retrieval/Cargo.toml new file mode 100644 index 00000000..9f6e4bc2 --- /dev/null +++ b/intel-sgx/dcap-artifact-retrieval/Cargo.toml @@ -0,0 +1,38 @@ +[package] +name = "dcap-artifact-retrieval" +version = "0.1.0" +authors = ["Raoul Strackx ", "Nikita Shyrei "] +edition = "2018" + +[dependencies] +backoff = "0.4.0" +clap = { version = "2.23.3", optional = true } +lazy_static = "1" +lru-cache = "0.1.2" +mbedtls = { version = "0.12.3", features = [ + "x509", + "ssl", + "std", +], default-features = false } +num_enum = { version = "0.7", features = ["complex-expressions"] } +pcs = { path = "../pcs" } +percent-encoding = "2.1.0" +pkix = "0.2.0" +quick-error = "1.1.0" +rustc-serialize = "0.3" +reqwest = { version = "0.12", features = ["blocking", "native-tls"], optional = true } +serde_cbor = "0.11" +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" + +[features] +default = ["clap", "reqwest"] + +[dev-dependencies] +yasna = { version = "0.3", features = ["num-bigint", "bit-vec"] } +pcs = { path = "../pcs", features = ["verify"] } + +[build-dependencies] +mbedtls = { version = "0.12.3", features = ["ssl", "x509"] } +pkix = "0.2.0" +serde_cbor = "0.11" diff --git a/intel-sgx/dcap-artifact-retrieval/Readme.md b/intel-sgx/dcap-artifact-retrieval/Readme.md new file mode 100644 index 00000000..a7ec5ddc --- /dev/null +++ b/intel-sgx/dcap-artifact-retrieval/Readme.md @@ -0,0 +1,188 @@ +# Description +This Rust program is a command-line tool for retrieving and storing Data Center Attestation Primitives (DCAP) artifacts (to know more about DCAP you can see [presentation](#) and its [recording](#)) for attestation purposes, either from Intel or Azure. + +## CLI API + +### Console arguments + +| Argument | Description | Required | Notes | +|---------------|---------------------------------------------------------------------------|----------|---------------------| +| --origin | Specifies the source of the artifacts (intel or azure). Default is intel. | No | | +| --pckid-file | Path to the file describing the PCK identity. | Yes | | +| --output-dir | Directory where the fetched artifacts will be stored. | Yes | | +| --api-key | API key for authenticating with Intel provisioning service. | No | | +| --verbose | Flag to enable verbose output for debugging and information. | No | | + +## File Input +Format of the input provided by the user to run the program. + +### PckID +Describes a CSV file containing a list of Platform Certification Key (PCK) Identities used in the context of DCAP (Data Center Attestation Primitives) attestation. The format of each identity is the following: + +| Field name | Description | Type | +|------------|-------------------------------------------------|-----------------| +| enc_ppid | Represents the encrypted Platform Provisioning ID (PPID) | Array of bytes | +| pce_id | Represents the Platform Configuration Enclave ID (PCE ID). | Integer | +| cpu_svn | Represents the CPU Security Version Number (SVN) | Array of bytes | +| pce_isvsvn | Represents the PCE ISV Security Version Number (ISVSVN) | Integer | +| qe_id | Represents the Quoting Enclave ID (QE ID). | Array of bytes | + +#### Example file: +```csv +enc_ppid,pce_id,cpu_svn,pce_isvsvn,qe_id +5133c5451dff82456e83fd5f8b4402304bf7b8edf5ea93e23e33,0000,08080e0dffff01000000000000000000,0d00,4041a3c4d3af9f15e68513108e773a7f +``` +## File output +The following artifacts are written to the file specified by `--output-dir` argument one by one: + +### PckCert or Platform Certification Keys Certificates (PCK Certs) +This certificate is used in Intel's Software Guard Extensions (SGX) technology to authenticate and ensure the integrity of a platform's enclave. + +It has the following format: + +| Field name | Description | Type | +|------------|-----------------------------------------|------------------| +| cert | The actual certificate string | String | +| ca_chain | Represents the Platform Configuration Enclave ID (PCE ID). | Vector of Strings | + +#### Example output: +```json +{ + "cert": "-----BEGIN CERTIFICATE-----\nMIIEjjCCBDSgAwIBAgIVAKiHtqpAgwVmQnvUbNnRRzB\n-----END CERTIFICATE-----\n", + "ca_chain": [ + "-----BEGIN CERTIFICATE-----\nMIICizCCAjKgAwIBAgIUfjiC1ftVKU==\n-----END CERTIFICATE-----\n", + "-----BEGIN CERTIFICATE-----\nMIICjzCCAjSgAwIBAgIUImUM1lqdNInzg=\n-----END CERTIFICATE-----\n" + ] +} +``` +## TcbInfo +This struct is related to managing and handling Trust Center Base (TCB) information in a security context. It has the following format: + +| Field name | Description | Type | +|--------------|----------------------------------------------------------|-------------------| +| raw_tcb_info | Contains raw TCB information in a string format | String | +| signature | Contains the digital signature of the TCB information | Vector of bytes | +| ca_chain | Holds a chain of certificate authority (CA) certificates. The CA chain is used to validate the trustworthiness of the raw_tcb_info and its signature by providing a path to a trusted root CA. | Vector of strings | + +### Example output: +```json +{ + "raw_tcb_info": "{\"id\":\"SGX\",\"version\":3,\"issueDate\":\"2024-06-28T17:01:07Z\",\"nextUpdate\":\"2024-07-28T17:01:07Z\",\"fmspc\":\"00906ea10000\",\"pceId\":\"0000\",\"tcbType\":0,\"tcbEvaluationDataNumber\":16,\"tcbLevels\":[{\"tcb\":{\"sgxtcbcomponents\":[{\"svn\":20},{\"svn\":20},{\"svn\":2},{\"svn\":4},{\"svn\":1},{\"svn\":128},{\"svn\":0}],\"pcesvn\":13},\"tcbDate\":\"2023-08-09T00:00:00Z\",\"tcbStatus\":\"SWHardeningNeeded\",\"advisoryIDs\":[\"INTEL-SA-00334\",\"INTEL-SA-00615\"]}]}", + "signature": [ + 253, + 22, + 179, + 179, + 217, + 164, + 44, + 4 + ], + "ca_chain": [ + "-----BEGIN CERTIFICATE-----\nMIICizCCAjKgAwIBAgIUfjiC1ftVKU==\n-----END CERTIFICATE-----\n", + "-----BEGIN CERTIFICATE-----\nMIICjzCCAjSgAwIBAgIUImUM1lqdNInzg=\n-----END CERTIFICATE-----\n" + ] +} +``` +# PckCrl + +Represents a Certificate Revocation List (CRL) for Platform Certification Keys (PCK), along with the associated certification authority (CA) chain. CRLs are used in certificate management to list certificates that have been revoked and should no longer be trusted. It has the following format: + +## Table Format + +| **Field** | **Description** | **Type** | +|-------------|------------------------------------------------------------------------------------------------------|-------------------| +| `crl` | Contains the CRL data as a string. The CRL is a list of revoked certificates. | String | +| `ca_chain` | Contains the chain of CA certificates as a vector of strings. Each string represents a CA certificate, and the chain is used to validate the CRL itself. | Vector of String | + +## Example Output + +```json +{ + "crl": "-----BEGIN X509 CRL-----\nMIIBKjCB0QIBATAdIwQY\nMBaAFNDoqtp11/kuSRebkoJH+OPq5WbSEO3PJ7y\n8zkHsHTgNjst7rhFDA8=\n-----END X509 CRL-----\n", + "ca_chain": [ + "-----BEGIN CERTIFICATE-----\nMIICmDCCAj6gAwIBAgIVANDoqtp11/kBLQq5s5A70pdoiaRJ8z/0uDz4NgV91k=\n-----END CERTIFICATE-----\n", + "-----BEGIN CERTIFICATE-----\nMIICjzCCAjSgAwIBAgIUImUM1lqdNInzg7SVUr9QX6O9QWxHRAvZUGOdRQ7cvqRXaqI=\n-----END CERTIFICATE-----\n" + ] +} +``` +# QeIdentitySigned + +This struct is a part of the system dealing with the verification and management of Quoting Enclave (QE) identities. It has the following format: + +## Fields + +| **Field** | **Description** | **Type** | +|-------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------| +| `raw_enclave_identity` | Contains the raw data representing the enclave identity. | String | +| `signature` | Holds the digital signature associated with the `raw_enclave_identity`. The signature is used to verify the authenticity and integrity of the `raw_enclave_identity`. | Vector of String | +| `ca_chain` | Contains a chain of certificate authority (CA) certificates in the form of strings. Each string represents a CA certificate, and the chain is used to validate the digital signature and the `raw_enclave_identity` by providing a trust path to a trusted root CA. | Vector of String | + +## Example Output + +```json +{ + "raw_enclave_identity": "{\"id\":\"QE\",\"version\":2,\"issueDate\":\"2024-06-28T16:42:00Z\",\"nextUpdate\":\"2024-07-28T16:42:00Z\",\"tcbEvaluationDataNumber\":16,\"miscselect\":\"00000000\",\"miscselectMask\":\"FFFFFFFF\",\"attributes\":\"11000000000000000000000000000000\",\"attributesMask\":\"FBFFFFFFFFFFFFFF0000000000000000\",\"mrsigner\":\"8C4F5775D796503E96137F77C68A829A0056AC8DED70140B081B094490C57BFF\",\"isvprodid\":1,\"tcbLevels\":[{\"tcb\":{\"isvsvn\":8},\"tcbDate\":\"2023-08-09T00:00:00Z\",\"tcbStatus\":\"UpToDate\"},{\"tcb\":{\"isvsvn\":6},\"tcbDate\":\"2021-11-10T00:00:00Z\",\"tcbStatus\":\"OutOfDate\",\"advisoryIDs\":[\"INTEL-SA-00615\"]},{\"tcb\":{\"isvsvn\":5},\"tcbDate\":\"2020-11-11T00:00:00Z\",\"tcbStatus\":\"OutOfDate\",\"advisoryIDs\":[\"INTEL-SA-00477\",\"INTEL-SA-00615\"]},{\"tcb\":{\"isvsvn\":4},\"tcbDate\":\"2019-11-13T00:00:00Z\",\"tcbStatus\":\"OutOfDate\",\"advisoryIDs\":[\"INTEL-SA-00334\",\"INTEL-SA-00477\",\"INTEL-SA-00615\"]},{\"tcb\":{\"isvsvn\":2},\"tcbDate\":\"2019-05-15T00:00:00Z\",\"tcbStatus\":\"OutOfDate\",\"advisoryIDs\":[\"INTEL-SA-00219\",\"INTEL-SA-00293\",\"INTEL-SA-00334\",\"INTEL-SA-00477\",\"INTEL-SA-00615\"]},{\"tcb\":{\"isvsvn\":1},\"tcbDate\":\"2018-08-15T00:00:00Z\",\"tcbStatus\":\"OutOfDate\",\"advisoryIDs\":[\"INTEL-SA-00202\",\"INTEL-SA-00219\",\"INTEL-SA-00293\",\"INTEL-SA-00334\",\"INTEL-SA-00477\",\"INTEL-SA-00615\"]}]}", + "signature": [ + 99, + 75, + 157, + 16, + 107, + 78, + 218, + 178, + 245, + 0, + 4, + 50, + 83, + 75, + 17, + 33, + 204 + ], + "ca_chain": [ + "-----BEGIN CERTIFICATE-----\nMIICizCCAjKgAwIBAgIUU2FudGEgQ2xhcmExCzP+mAh91PEyV7Jh6FGJd5ndE9aBH7RK\nQEmORYQD6RSRvfRVMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMAoGCCqG\nSM49BAMCA0cAMEQCIB9C8wOAN/ImxDtGACV246KcqjagZOR0kyctyBrsGGJVAiAj\nftbrNGsGU8YH211dRiYNoPPu19Zp/ze8JmhujB0oBw==\n-----END CERTIFICATE-----\n", + "-----BEGIN CERTIFICATE-----\nMIICjzCCAjSgAwIBmF0\naW9TELMAHQ4EFgQUImUM1lqdNInzg7SV\nUr9QGzknBqwwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwCgYI\nKoZIzj0EAwIDSQAwRgIhAOW/5QkR+S9CiSDcNoowLuPRLsWGf/Yi7GSX94BgwTwg\nAiEA4J0lrHoMs+Xo5o/sX6O9QWxHRAvZUGOdRQ7cvqRXaqI=\n-----END CERTIFICATE-----\n" + ] +} +``` +# Console Output + +The following output is provided to the user if specific flags are applied when running the program. + +## Artifact Information (When verbose is enabled) + +For each artifact associated with a PckID entry, the output includes the following information: + +| **Field Name** | **Description** | **Type** | +|----------------|--------------------------------------------------|----------| +| `pck certs` | The path to the stored PCK certificates file. | String | +| `tcb info` | The path to the stored TCB info file. | String | + +### Example Output + +```plaintext +PckID: def456 +------------------------ +pck certs: /path/to/pck_certificates/def456_cert.pem +tcb info: /path/to/tcb_info/def456_tcb.json +``` +## Generic Artifact Information (When verbose is enabled) + +After iterating over all PckID entries, the output includes information about generic artifacts: + +| **Field Name** | **Description** | **Type** | +|----------------|-------------------------------------|----------| +| `pck crl` | The path to the stored PCK CRL file. | String | +| `qe identity` | The path to the stored QE identity file. | String | + +### Example Output + +```plaintext +PckID: def456 +------------------------ +pck crl: /path/to/pck_crl/crl.pem +qe identity: /path/to/qe_identity/identity.json + diff --git a/intel-sgx/dcap-artifact-retrieval/src/lib.rs b/intel-sgx/dcap-artifact-retrieval/src/lib.rs new file mode 100644 index 00000000..9c955861 --- /dev/null +++ b/intel-sgx/dcap-artifact-retrieval/src/lib.rs @@ -0,0 +1,119 @@ +/* Copyright (c) Fortanix, Inc. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +//! DCAP attestations require access to Intel-signed artifacts. This library provides clients to +//! access these artifacts both from Intel directly, and from Microsoft Azure. + +mod provisioning_client; +pub use provisioning_client::*; + +use std::borrow::Cow; +use std::io::Error as IoError; +use std::str::Utf8Error; + +#[cfg(feature = "reqwest")] +pub use reqwest::blocking::{Client as ReqwestClient}; +use pcs::Error as OAError; +use pkix::ASN1Error; +use quick_error::quick_error; + +quick_error! { + #[derive(Debug)] + pub enum Error { + PckIdParseError(msg: &'static str) { + description("Error during parsing PCKID file") + display("Error parsing PCKID file: {}", msg) + } + ReadResponseError(msg: Cow<'static, str>) { + from() + display("{}", msg) + } + FetcherFailure(err: String) { + from() + display("{}", err) + } + IoError(err: IoError) { + from() + } + PCSError(status_code: StatusCode, msg : &'static str ) { + description("Certification services returned an unexpected response") + display("{}", msg) + } + PCSParseError(err: serde_json::error::Error) { + description("Intel PCS response failed to parse correctly") + display("json parse error: {}", err) + } + PCSDecodeError(error: Cow<'static, str>) { + description("Intel PCS response could not be decoded") + display("percent decoding failed: {}", error) + } + HeaderMissing(msg : &'static str) { + description("Expected header was not present") + display("Expected header \"{}\" missing", msg) + } + HeaderDecodeError(err : Utf8Error) { + description("Intel certification services returned a header that could not be decoded") + display("Failed to decode header") + } + HeaderParseError(msg : &'static str) { + description("Header could not be parsed") + display("Failed to parse header {}", msg) + } + CertificateParseError(msg: &'static str) { + description("Certificate could not be parsed") + display("Failed to parse certificate {}", msg) + } + CertificateEncodingError(err: ASN1Error) { + from() + } + NoEncPPID { + description("Enc_ppid is required, but not provided") + display("No enc_ppid was provided") + } + NoCPUSVN { + description("CPU_svn is required, but not provided") + display("No cpu_svn was provided") + } + NoPCEISVSVN { + description("PCE ISVSVN is required, but not provided") + display("No pce_isvsvn was provided") + } + NoPCEID { + description("PCEID is required, but not provided") + display("No pce_id was provided") + } + NoQeID { + description("QEID is required, but not provided") + display("No QE ID was provided") + } + NoAPIKey { + description("PCS key is required, but not provided") + display("No api_key was provided") + } + OfflineAttestationError(err: OAError) { + from() + } + BadRequest(err: &'static str) { + description("Bad Request") + display("{}", err) + } + RequestNotSupported { + description("Client does not support this request") + display("Client does not support this request") + } + } +} + +pub type Result = std::result::Result; + +#[cfg(feature = "reqwest")] +pub fn reqwest_client() -> ReqwestClient { + ReqwestClient::builder() + .use_native_tls() + .build() + .expect("Failed to build reqwest client") +} diff --git a/intel-sgx/dcap-artifact-retrieval/src/main.rs b/intel-sgx/dcap-artifact-retrieval/src/main.rs new file mode 100644 index 00000000..daf00f5e --- /dev/null +++ b/intel-sgx/dcap-artifact-retrieval/src/main.rs @@ -0,0 +1,162 @@ +/* Copyright (c) Fortanix, Inc. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#[cfg(not(target_env = "sgx"))] +use clap::clap_app; + +use std::path::{Path, PathBuf}; + +use dcap_artifact_retrieval::{ + AzureProvisioningClientBuilder, IntelProvisioningClientBuilder, ProvisioningClient, PcsVersion, +}; +use dcap_artifact_retrieval::{Error, StatusCode}; +use pcs::PckID; +use rustc_serialize::hex::ToHex; +use serde::de::{value, IntoDeserializer}; +use serde::Deserialize; +use std::convert::TryInto; + +#[derive(Debug, Deserialize, Copy, Clone, Eq, PartialEq, Hash)] +#[serde(rename_all = "kebab-case")] +enum Origin { + Intel, + Azure, +} + +fn str_deserialize(s: &str) -> value::StrDeserializer { + s.into_deserializer() +} + +fn parse_origin(p: &str) -> std::result::Result { + Origin::deserialize(str_deserialize(p)).map_err(|e| e.to_string()) +} + +pub fn download_dcap_artifacts( + prov_client: &dyn ProvisioningClient, + pckid_file: &str, + output_dir: &str, + verbose: bool, +) -> Result<(), Error> { + for (idx, pckid) in PckID::parse_file(&PathBuf::from(&pckid_file).as_path())?.iter().enumerate() { + let enc_ppid = &pckid.enc_ppid.as_slice(); + if verbose { + println!("==[ entry {} ]==", idx); + println!(" Info:"); + println!( + " Encr. PPID: {}..{}", + enc_ppid[..12].to_hex(), + enc_ppid[enc_ppid.len() - 3..].to_hex() + ); + println!(" pce_id: {}", &&pckid.pce_id.to_le_bytes().to_hex()); + println!(" cpu svn: {}", pckid.cpu_svn.as_slice().to_hex()); + println!(" pce isvsvn: {}", pckid.pce_isvsvn.to_le_bytes().to_hex()); + println!(" qe_id: {}", pckid.qe_id.as_slice().to_hex()); + println!(" Storing artifacts:"); + } + + // Fetch pckcerts, note that Azure does not support this API, instead we mimic it + let pckcerts = match prov_client.pckcerts(&pckid.enc_ppid, pckid.pce_id) { + Ok(pckcerts) => pckcerts, + Err(Error::RequestNotSupported) => prov_client.pckcert(None, &pckid.pce_id, &pckid.cpu_svn, pckid.pce_isvsvn, Some(&pckid.qe_id))? + .try_into() + .map_err(|e| Error::PCSDecodeError(format!("{}", e).into()))?, + Err(e) => return Err(e), + }; + let pckcerts_file = pckcerts.store(output_dir, pckid.qe_id.as_slice())?; + + if verbose { + println!(" pckcerts: {}", pckcerts_file); + } + + let fmspc = pckcerts.fmspc()?; + let tcbinfo = prov_client.tcbinfo(&fmspc)?; + let tcbinfo_file = tcbinfo.store(output_dir).map_err(|e| Error::OfflineAttestationError(e))?; + + if verbose { + println!(" tcb info: {}\n", tcbinfo_file); + } + } + let pckcrl = prov_client + .pckcrl() + .and_then(|crl| crl.write_to_file(output_dir).map_err(|e| e.into()))?; + let qe_identity = prov_client + .qe_identity() + .and_then(|qe_id| qe_id.write_to_file(output_dir).map_err(|e| e.into()))?; + if verbose { + println!("==[ generic ]=="); + println!(" pckcrl: {}", pckcrl); + println!(" QE identity: {}", qe_identity); + } + Ok(()) +} + +#[cfg(not(target_env = "sgx"))] +fn main() { + fn is_directory(directory_path: String) -> std::result::Result<(), String> { + let path = Path::new(&directory_path); + + match (path.exists(), path.is_dir()) { + (true, true) => return Ok(()), + (true, false) => return Err(format!("Path {} exists, but is not a directory", directory_path)), + (false, _) => return Err(format!("Directory {} does not exists", directory_path)), + }; + } + + fn is_pckid_file(filename: String) -> std::result::Result<(), String> { + if Path::new(&filename).exists() { + Ok(()) + } else { + Err(format!("Cannot open {}", filename)) + } + } + + let matches = clap::clap_app!(tool => + (author: "Fortanix") + (about: "Fortanix ecdsa artifact retrieval tool for DCAP attestation") + (@arg ORIGIN: --("origin") +takes_value validator(|s| parse_origin(s.as_str()).map(|_| ())) "Location from where artifacts need to be fetched. Options are: \"intel\" and \"azure\". Note that Azure does not provide access to all artifacts. Intel will be contacted as a fallback (default: \"intel\")") + (@arg PCKID_FILE: --("pckid-file") +takes_value +required requires("PCKID_FILE") validator(is_pckid_file) "File describing the PCK identity (outputed by PCKIDRetrievalTool)") + (@arg OUTPUT_DIR: --("output-dir") +takes_value +required requires("OUTPUT_DIR") validator(is_directory) "Destination folder for data retrieved from Intel certification services") + (@arg API_KEY: --("api-key") +takes_value "API key for authenticating with Intel provisioning service") + (@arg VERBOSE: -v --verbose "Print information of which files are fetched") + ) + .get_matches(); + + let result = match (matches.value_of("PCKID_FILE"), matches.value_of("OUTPUT_DIR")) { + (Some(pckid_file), Some(output_dir)) => { + let verboseness = matches.occurrences_of("VERBOSE"); + let origin = parse_origin(matches.value_of("ORIGIN").unwrap_or("intel")).expect("validated"); + let fetcher = dcap_artifact_retrieval::reqwest_client(); + let client: Box = match origin { + Origin::Intel => { + let mut client_builder = IntelProvisioningClientBuilder::new(PcsVersion::V3); + if let Some(api_key) = matches.value_of("API_KEY") { + client_builder.set_api_key(api_key.into()); + } + Box::new(client_builder.build(fetcher)) + } + Origin::Azure => { + let client_builder = AzureProvisioningClientBuilder::new(PcsVersion::V3); + Box::new(client_builder.build(fetcher)) + } + }; + download_dcap_artifacts(&*client, pckid_file, output_dir, 0 < verboseness) + } + _ => unreachable!("validated"), + }; + + match result { + Ok(()) => {} + Err(Error::PCSError(StatusCode::NotFound, _)) => { + eprintln!("Error: Artifact not found. Perhaps specify a different origin?"); + std::process::exit(1); + } + Err(err) => { + eprintln!("Error downloading artifact: {}", err); + std::process::exit(1); + } + } +} diff --git a/intel-sgx/dcap-artifact-retrieval/src/provisioning_client/azure.rs b/intel-sgx/dcap-artifact-retrieval/src/provisioning_client/azure.rs new file mode 100644 index 00000000..71146e3d --- /dev/null +++ b/intel-sgx/dcap-artifact-retrieval/src/provisioning_client/azure.rs @@ -0,0 +1,248 @@ +/* Copyright (c) Fortanix, Inc. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +use pcs::{CpuSvn, EncPpid, PceId, PceIsvsvn, PckCert, PckCerts, QeId, Unverified}; +use rustc_serialize::hex::ToHex; +use serde::Deserialize; +use std::time::Duration; + +use super::{Fetcher, ProvisioningServiceApi, StatusCode}; +use super::intel::{PckCrlApi, QeIdApi, TcbInfoApi}; +use crate::provisioning_client::{Client, ClientBuilder, PckCertService, PckCertsService, PckCertIn, PckCertsIn, PcsVersion}; +use crate::Error; + +/// A Provisioning Certificate client builder for Azure. It is based on the internal logic of the Azure DCAP +/// provider. Only the PCK certificates are downloaded from Azure. For others Intel is contacted. +/// This is required because Azure by default provides an older `tcbinfo` with a `next_update` +/// field in the past (see PROD-5800). +/// For info on the Azure DCAP provider: https://github.com/microsoft/Azure-DCAP-Client +pub struct AzureProvisioningClientBuilder { + api_version: PcsVersion, + client_builder: ClientBuilder, +} + +impl AzureProvisioningClientBuilder { + pub fn new(api_version: PcsVersion) -> Self { + Self { + api_version, + client_builder: ClientBuilder::new(), + } + } + + pub fn set_retry_timeout(mut self, retry_timeout: Duration) -> Self { + self.client_builder = self.client_builder.set_retry_timeout(retry_timeout); + self + } + + pub fn build Fetcher<'a>>(self, fetcher: F) -> Client { + let pck_certs = PckCertsApi::new(None); + let pck_cert = PckCertApi::new(self.api_version.clone()); + let pck_crl = PckCrlApi::new(self.api_version.clone()); + let qeid = QeIdApi::new(self.api_version.clone()); + let tcbinfo = TcbInfoApi::new(self.api_version.clone()); + self.client_builder.build(pck_certs, pck_cert, pck_crl, qeid, tcbinfo, fetcher) + } +} + +pub struct PckCertsApi { + api_key: Option, +} + +impl PckCertsApi { + pub(crate) fn new(api_key: Option) -> PckCertsApi { + PckCertsApi { + api_key, + } + } +} + +impl<'inp> PckCertsService<'inp> for PckCertsApi { + fn build_input(&'inp self, enc_ppid: &'inp EncPpid, pce_id: PceId) -> >::Input { + PckCertsIn { + enc_ppid, + pce_id, + api_key: &self.api_key, + api_version: PcsVersion::V3, + } + } +} + +/// Implementation of pckcerts +/// https://api.portal.trustedservices.intel.com/documentation#pcs-certificates-v4 +impl<'inp> ProvisioningServiceApi<'inp> for PckCertsApi { + type Input = PckCertsIn<'inp>; + type Output = PckCerts; + + fn build_request(&self, _input: &Self::Input) -> Result<(String, Vec<(String, String)>), Error> { + Err(Error::RequestNotSupported) + } + + fn validate_response(&self, _status_code: StatusCode) -> Result<(), Error> { + Err(Error::RequestNotSupported) + } + + fn parse_response(&self, _response_body: String, _response_headers: Vec<(String, String)>, _api_version: PcsVersion) -> Result { + Err(Error::RequestNotSupported) + } +} + + +pub struct PckCertApi { + api_version: PcsVersion, +} + +impl PckCertApi { + // Constants from the Azure DCAP client: + // (host of primary URL is down) + const SECONDARY_CERT_URL: &'static str = "https://global.acccache.azure.net/sgx/certification"; + const DEFAULT_CLIENT_ID: &'static str = "production_client"; + const API_VERSION_07_2021: &'static str = "2021-07-22-preview"; +} + +impl PckCertApi { + pub(crate) fn new(api_version: PcsVersion) -> PckCertApi { + PckCertApi { + api_version, + } + } +} + +impl<'inp> PckCertService<'inp> for PckCertApi { + fn build_input(&'inp self, encrypted_ppid: Option<&'inp EncPpid>, pce_id: &'inp PceId, cpu_svn: &'inp CpuSvn, pce_isvsvn: PceIsvsvn, qe_id: Option<&'inp QeId>) -> >::Input { + PckCertIn { + encrypted_ppid, + pce_id, + cpu_svn, + pce_isvsvn, + qe_id, + api_version: self.api_version, + api_key: &None, + } + } +} + +impl<'inp> ProvisioningServiceApi<'inp> for PckCertApi { + type Input = PckCertIn<'inp>; + type Output = PckCert; + + fn build_request(&self, input: &Self::Input) -> Result<(String, Vec<(String, String)>), Error> { + // Re-implements `build_pck_cert_url` from Azure's DCAP Client + // https://github.com/microsoft/Azure-DCAP-Client/blob/master/src/dcap_provider.cpp#L677 + fn build_pck_cert_url(pce_id: &PceId, cpu_svn: &CpuSvn, pce_isvsvn: PceIsvsvn, qe_id: &QeId, api_version: PcsVersion) -> String { + // Constants from the Azure DCAP client: + // (host of primary URL is down) + let base_url = PckCertApi::SECONDARY_CERT_URL; + let version = api_version as u8; + let qeid = qe_id.to_hex(); + let cpusvn = cpu_svn.to_hex(); + let pcesvn = pce_isvsvn.to_le_bytes().to_hex(); + let pceid = pce_id.to_le_bytes().to_hex(); + let clientid = PckCertApi::DEFAULT_CLIENT_ID; + let api_version = PckCertApi::API_VERSION_07_2021; + format!("{base_url}/v{version}/pckcert?qeid={qeid}&cpusvn={cpusvn}&pcesvn={pcesvn}&pceid={pceid}&clientid={clientid}&api-version={api_version}") + } + + let qe_id = input.qe_id.ok_or(Error::NoQeID)?; + let url = build_pck_cert_url(input.pce_id, input.cpu_svn, input.pce_isvsvn, qe_id, input.api_version); + Ok((url, Vec::new())) + } + + fn validate_response(&self, status_code: StatusCode) -> Result<(), Error> { + match &status_code { + StatusCode::Ok => Ok(()), + StatusCode::BadRequest => Err(Error::PCSError(status_code, "Invalid parameter")), + StatusCode::Unauthorized => Err(Error::PCSError( + status_code, + "Failed to authenticate or authorize the request (check your PCS key)", + )), + StatusCode::NotFound => Err(Error::PCSError(status_code, "Cannot find the requested certificate")), + StatusCode::InternalServerError => Err(Error::PCSError(status_code, "PCS suffered from an internal server error")), + StatusCode::ServiceUnavailable => Err(Error::PCSError(status_code, "PCS is temporarily unavailable")), + __ => Err(Error::PCSError(status_code.clone(), "Unexpected response from PCS server")), + } + } + + fn parse_response(&self, response_body: String, _response_headers: Vec<(String, String)>, _api_version: PcsVersion) -> Result, Error> { + #[derive(Deserialize)] + struct AzurePckCertResp { + #[serde(rename = "pckCert")] + pck_cert: String, + // Azure funny business: the `sgx-Pck-Certificate-Issuer-Chain` field is percent + // encoded. The `pck_cert` field is not. + #[serde(rename = "sgx-Pck-Certificate-Issuer-Chain")] + cert_chain: String, + } + + let AzurePckCertResp { pck_cert, cert_chain } = + serde_json::from_str(&response_body).map_err(|e| Error::PCSDecodeError(format!("{}", e).into()))?; + + let cert_chain: Vec = percent_encoding::percent_decode_str(&cert_chain) + .decode_utf8() + .map_err(|e| Error::PCSDecodeError(format!("{}", e).into()))? + .split_inclusive("-----END CERTIFICATE-----\n") + .map(|c| c.trim().to_string()) + .collect(); + Ok(PckCert::new(pck_cert, cert_chain)) + } +} + +#[cfg(all(test, feature = "reqwest"))] +mod tests { + use std::path::PathBuf; + use std::time::Duration; + + use pcs::PckID; + + use crate::reqwest_client; + use crate::provisioning_client::{ + AzureProvisioningClientBuilder, test_helpers, PcsVersion, ProvisioningClient + }; + + const PCKID_TEST_FILE: &str = "./tests/data/azure_icelake_pckid.csv"; + + const TIME_RETRY_TIMEOUT: Duration = Duration::from_secs(180); + + #[test] + pub fn pcks_azure() { + let client = AzureProvisioningClientBuilder::new(PcsVersion::V3) + .set_retry_timeout(TIME_RETRY_TIMEOUT) + .build(reqwest_client()); + let root_ca = include_bytes!("../../tests/data/root_SGX_CA_der.cert"); + let root_cas = [&root_ca[..]]; + + // TODO [EDP-105] Enable `PcsVersion::V4` tests + for pckid in PckID::parse_file(&PathBuf::from(PCKID_TEST_FILE).as_path()).unwrap().iter() { + let pck = client.pckcert(None, &pckid.pce_id, &pckid.cpu_svn, pckid.pce_isvsvn, Some(&pckid.qe_id)).unwrap(); + + let pck = pck.verify(&root_cas).unwrap(); + assert_eq!( + test_helpers::get_cert_subject(&pck.ca_chain().last().unwrap()), + "Intel SGX Root CA" + ); + assert_eq!(test_helpers::get_cert_subject(&pck.pck_pem()), "Intel SGX PCK Certificate"); + + let fmspc = pck.fmspc().unwrap(); + assert!(client.tcbinfo(&fmspc).is_ok()); + } + } + + #[test] + pub fn pck_crl() { + let client = AzureProvisioningClientBuilder::new(PcsVersion::V3) + .set_retry_timeout(TIME_RETRY_TIMEOUT) + .build(reqwest_client()); + assert!(client.pckcrl().is_ok()); + } + + #[test] + pub fn qe_identity() { + let client = AzureProvisioningClientBuilder::new(PcsVersion::V3) + .set_retry_timeout(TIME_RETRY_TIMEOUT) + .build(reqwest_client()); + assert!(client.qe_identity().is_ok()); + } +} diff --git a/intel-sgx/dcap-artifact-retrieval/src/provisioning_client/intel.rs b/intel-sgx/dcap-artifact-retrieval/src/provisioning_client/intel.rs new file mode 100644 index 00000000..fb5293e0 --- /dev/null +++ b/intel-sgx/dcap-artifact-retrieval/src/provisioning_client/intel.rs @@ -0,0 +1,725 @@ +/* Copyright (c) Fortanix, Inc. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +//! Interface to the Intel DCAP attestation API +//! Origins: +//! - https://api.portal.trustedservices.intel.com/provisioning-certification +//! - https://download.01.org/intel-sgx/dcap-1.1/linux/docs/Intel_SGX_PCK_Certificate_CRL_Spec-1.1.pdf + +use percent_encoding::percent_decode; +use pcs::{CpuSvn, EncPpid, PceId, PceIsvsvn, PckCert, PckCerts, PckCrl, QeId, QeIdentitySigned, TcbInfo, Unverified}; +use pkix::pem::PemBlock; +use rustc_serialize::hex::ToHex; +use std::time::Duration; + +use super::{Fetcher, PckCertIn, PckCertsIn, PckCertService, PckCertsService, PckCrlIn, PckCrlService, ProvisioningServiceApi, QeIdIn, QeIdService, StatusCode, TcbInfoIn, TcbInfoService}; +use crate::provisioning_client::{Client, ClientBuilder, PcsVersion}; +use crate::Error; + +pub struct IntelProvisioningClientBuilder { + api_key: Option, + api_version: PcsVersion, + client_builder: ClientBuilder, +} + +impl IntelProvisioningClientBuilder { + pub fn new(api_version: PcsVersion) -> Self { + Self { + api_version, + api_key: None, + client_builder: ClientBuilder::new(), + } + } + + pub fn set_api_key(&mut self, api_key: String) -> &mut Self { + self.api_key = Some(api_key); + self + } + + pub fn set_retry_timeout(mut self, retry_timeout: Duration) -> Self { + self.client_builder = self.client_builder.set_retry_timeout(retry_timeout); + self + } + + pub fn build Fetcher<'a>>(self, fetcher: F) -> Client { + let pck_certs = PckCertsApi::new(self.api_version.clone(), self.api_key.clone()); + let pck_cert = PckCertApi::new(self.api_version.clone(), self.api_key.clone()); + let pck_crl = PckCrlApi::new(self.api_version.clone()); + let qeid = QeIdApi::new(self.api_version.clone()); + let tcbinfo = TcbInfoApi::new(self.api_version.clone()); + self.client_builder.build(pck_certs, pck_cert, pck_crl, qeid, tcbinfo, fetcher) + } +} + +pub struct PckCertsApi { + api_key: Option, + api_version: PcsVersion, +} + +impl PckCertsApi { + pub(crate) fn new(api_version: PcsVersion, api_key: Option) -> PckCertsApi { + PckCertsApi { + api_version, + api_key, + } + } +} + +impl<'inp> PckCertsService<'inp> for PckCertsApi { + fn build_input(&'inp self, enc_ppid: &'inp EncPpid, pce_id: PceId) -> >::Input { + PckCertsIn { + enc_ppid, + pce_id, + api_key: &self.api_key, + api_version: self.api_version.clone(), + } + } +} + +impl<'inp> PckCertService<'inp> for PckCertApi { + fn build_input(&'inp self, encrypted_ppid: Option<&'inp EncPpid>, pce_id: &'inp PceId, cpu_svn: &'inp CpuSvn, pce_isvsvn: PceIsvsvn, qe_id: Option<&'inp QeId>) -> >::Input { + PckCertIn { + encrypted_ppid, + pce_id, + cpu_svn, + pce_isvsvn, + qe_id, + api_key: &self.api_key, + api_version: self.api_version, + } + } +} + +/// Implementation of pckcerts +/// https://api.portal.trustedservices.intel.com/documentation#pcs-certificates-v4 +impl<'inp> ProvisioningServiceApi<'inp> for PckCertsApi { + type Input = PckCertsIn<'inp>; + type Output = PckCerts; + + fn build_request(&self, input: &Self::Input) -> Result<(String, Vec<(String, String)>), Error> { + let api_version = input.api_version as u8; + let encrypted_ppid = input.enc_ppid.to_hex(); + let pceid = input.pce_id.to_le_bytes().to_hex(); + let url = format!( + "https://api.trustedservices.intel.com/sgx/certification/v{api_version}/pckcerts?encrypted_ppid={encrypted_ppid}&pceid={pceid}", + ); + let headers = if let Some(api_key) = &input.api_key { + vec![("Ocp-Apim-Subscription-Key".to_owned(), api_key.to_string())] + } else { + Vec::new() + }; + Ok((url, headers)) + } + + fn validate_response(&self, status_code: StatusCode) -> Result<(), Error> { + match status_code { + StatusCode::Ok => Ok(()), + StatusCode::BadRequest => Err(Error::PCSError(status_code, "Invalid parameter")), + StatusCode::Unauthorized => Err(Error::PCSError( + status_code, + "Failed to authenticate or authorize the request (check your PCS key)", + )), + StatusCode::NotFound => Err(Error::PCSError(status_code, "Cannot find the requested certificate")), + StatusCode::TooManyRequests => Err(Error::PCSError(status_code, "Too many requests")), + StatusCode::InternalServerError => { + Err(Error::PCSError(status_code, "PCS suffered from an internal server error")) + } + StatusCode::ServiceUnavailable => { + Err(Error::PCSError(status_code, "PCS is temporarily unavailable")) + } + _ => Err(Error::PCSError(status_code, "Unexpected response from PCS server")), + } + } + + fn parse_response(&self, response_body: String, response_headers: Vec<(String, String)>, _api_version: PcsVersion) -> Result { + let ca_chain = parse_issuer_header(&response_headers, "SGX-PCK-Certificate-Issuer-Chain")?; + PckCerts::parse(&response_body, ca_chain).map_err(|e| Error::OfflineAttestationError(e)) + } +} + +pub struct PckCertApi { + api_key: Option, + api_version: PcsVersion, +} + +impl PckCertApi { + pub(crate) fn new(api_version: PcsVersion, api_key: Option) -> PckCertApi { + PckCertApi { + api_version, + api_key, + } + } +} + +/// Implementation of pckcert +/// https://api.portal.trustedservices.intel.com/content/documentation.html#pcs-certificate-v4 +impl<'inp> ProvisioningServiceApi<'inp> for PckCertApi { + type Input = PckCertIn<'inp>; + type Output = PckCert; + + fn build_request(&self, input: &Self::Input) -> Result<(String, Vec<(String, String)>), Error> { + let api_version = input.api_version as u8; + let encrypted_ppid = input.encrypted_ppid.ok_or(Error::NoEncPPID).map(|e_ppid| e_ppid.to_hex())?; + let cpusvn = input.cpu_svn.to_hex(); + let pcesvn = input.pce_isvsvn.to_le_bytes().to_hex(); + let pceid = input.pce_id.to_le_bytes().to_hex(); + let url = format!( + "https://api.trustedservices.intel.com/sgx/certification/v{api_version}/pckcert?encrypted_ppid={encrypted_ppid}&cpusvn={cpusvn}&pcesvn={pcesvn}&pceid={pceid}" + ); + let headers = if let Some(api_key) = input.api_key { + vec![("Ocp-Apim-Subscription-Key".to_owned(), api_key.to_string())] + } else { + Vec::new() + }; + Ok((url, headers)) + } + + fn validate_response(&self, status_code: StatusCode) -> Result<(), Error> { + match status_code { + StatusCode::Ok => Ok(()), + StatusCode::BadRequest => Err(Error::PCSError(status_code, "Invalid parameter")), + StatusCode::Unauthorized => Err(Error::PCSError( + status_code, + "Failed to authenticate or authorize the request (check your PCS key)", + )), + StatusCode::NotFound => Err(Error::PCSError(status_code, "Cannot find the requested certificate")), + StatusCode::TooManyRequests => Err(Error::PCSError(status_code, "Too many requests")), + StatusCode::InternalServerError => { + Err(Error::PCSError(status_code, "PCS suffered from an internal server error")) + } + StatusCode::ServiceUnavailable => { + Err(Error::PCSError(status_code, "PCS is temporarily unavailable")) + } + _ => Err(Error::PCSError(status_code, "Unexpected response from PCS server")), + } + } + + fn parse_response(&self, response_body: String, response_headers: Vec<(String, String)>, _api_version: PcsVersion) -> Result { + let ca_chain = parse_issuer_header(&response_headers, "SGX-PCK-Certificate-Issuer-Chain")?; + Ok(PckCert::new(response_body, ca_chain)) + } +} + +pub struct PckCrlApi { + api_version: PcsVersion, +} + +impl PckCrlApi { + pub fn new(api_version: PcsVersion) -> Self { + PckCrlApi { + api_version, + } + } +} + +impl<'inp> PckCrlService<'inp> for PckCrlApi { + fn build_input(&'inp self) -> >::Input { + PckCrlIn { + api_version: self.api_version.clone(), + } + } +} + +/// Implementation of pckcrl +/// See: https://api.portal.trustedservices.intel.com/documentation#pcs-revocation-v4 +impl<'inp> ProvisioningServiceApi<'inp> for PckCrlApi { + type Input = PckCrlIn; + type Output = PckCrl; + + fn build_request(&self, input: &Self::Input) -> Result<(String, Vec<(String, String)>), Error> { + let url = format!( + "https://api.trustedservices.intel.com/sgx/certification/v{}/pckcrl?ca=processor&encoding=pem", + input.api_version as u8 + ); + Ok((url, Vec::new())) + } + + fn validate_response(&self, status_code: StatusCode) -> Result<(), Error> { + match &status_code { + StatusCode::Ok => Ok(()), + StatusCode::BadRequest => Err(Error::PCSError(status_code, "Invalid parameter")), + StatusCode::Unauthorized => Err(Error::PCSError( + status_code, + "Failed to authenticate or authorize the request (check your PCS key)", + )), + StatusCode::InternalServerError => { + Err(Error::PCSError(status_code, "PCS suffered from an internal server error")) + } + StatusCode::ServiceUnavailable => { + Err(Error::PCSError(status_code, "PCS is temporarily unavailable")) + } + __ => Err(Error::PCSError(status_code, "Unexpected response from PCS server")), + } + } + + fn parse_response(&self, response_body: String, response_headers: Vec<(String, String)>, _api_version: PcsVersion) -> Result { + let ca_chain = parse_issuer_header(&response_headers, "SGX-PCK-CRL-Issuer-Chain")?; + let crl = PckCrl::new(response_body, ca_chain)?; + Ok(crl) + } +} + +pub struct TcbInfoApi { + api_version: PcsVersion, +} + +impl TcbInfoApi { + pub fn new(api_version: PcsVersion) -> Self { + TcbInfoApi { + api_version, + } + } +} + +impl<'inp> TcbInfoService<'inp> for TcbInfoApi { + fn build_input(&'inp self, fmspc: &'inp Vec) -> >::Input { + TcbInfoIn { + api_version: self.api_version.clone(), + fmspc, + } + } +} + +// Implementation of Get TCB Info +// https://api.portal.trustedservices.intel.com/documentation#pcs-tcb-info-v4 +impl<'inp> ProvisioningServiceApi<'inp> for TcbInfoApi { + type Input = TcbInfoIn<'inp>; + type Output = TcbInfo; + + fn build_request(&self, input: &Self::Input) -> Result<(String, Vec<(String, String)>), Error> { + let api_version = input.api_version as u8; + let fmspc = input.fmspc.to_hex(); + let url = format!( + "https://api.trustedservices.intel.com/sgx/certification/v{}/tcb?fmspc={fmspc}", + api_version + ); + Ok((url, Vec::new())) + } + + fn validate_response(&self, status_code: StatusCode) -> Result<(), Error> { + match &status_code { + StatusCode::Ok => Ok(()), + StatusCode::BadRequest => Err(Error::PCSError(status_code, "Invalid parameter")), + StatusCode::Unauthorized => Err(Error::PCSError( + status_code, + "Failed to authenticate or authorize the request (check your PCS key)", + )), + StatusCode::NotFound => Err(Error::PCSError(status_code, "QE identity Cannot be found")), + StatusCode::InternalServerError => { + Err(Error::PCSError(status_code, "PCS suffered from an internal server error")) + } + StatusCode::ServiceUnavailable => { + Err(Error::PCSError(status_code, "PCS is temporarily unavailable")) + } + __ => Err(Error::PCSError(status_code, "Unexpected response from PCS server")), + } + } + + fn parse_response(&self, response_body: String, response_headers: Vec<(String, String)>, api_version: PcsVersion) -> Result { + let key = match api_version { + PcsVersion::V3 => "SGX-TCB-Info-Issuer-Chain", + PcsVersion::V4 => "TCB-Info-Issuer-Chain", + }; + let ca_chain = parse_issuer_header(&response_headers, key)?; + let tcb_info = TcbInfo::parse(&response_body, ca_chain)?; + Ok(tcb_info) + } +} + +pub struct QeIdApi { + api_version: PcsVersion, +} + +impl QeIdApi { + pub fn new(api_version: PcsVersion) -> Self { + QeIdApi { + api_version, + } + } +} + +impl<'inp> QeIdService<'inp> for QeIdApi { + fn build_input(&'inp self) -> >::Input { + QeIdIn { + api_version: self.api_version.clone(), + } + } +} + +/// Implementation of qe/identity +/// https://api.portal.trustedservices.intel.com/documentation#pcs-certificates-v://api.portal.trustedservices.intel.com/documentation#pcs-qe-identity-v4 +impl<'inp> ProvisioningServiceApi<'inp> for QeIdApi { + type Input = QeIdIn; + type Output = QeIdentitySigned; + + fn build_request(&self, input: &Self::Input) -> Result<(String, Vec<(String, String)>), Error> { + let api_version = input.api_version as u8; + let url = format!( + "https://api.trustedservices.intel.com/sgx/certification/v{api_version}/qe/identity", + ); + Ok((url, Vec::new())) + } + + fn validate_response(&self, status_code: StatusCode) -> Result<(), Error> { + match &status_code { + StatusCode::Ok => Ok(()), + StatusCode::BadRequest => Err(Error::PCSError(status_code, "Invalid parameter")), + StatusCode::Unauthorized => Err(Error::PCSError( + status_code, + "Failed to authenticate or authorize the request (check your PCS key)", + )), + StatusCode::NotFound => Err(Error::PCSError(status_code, "QE identity Cannot be found")), + StatusCode::InternalServerError => { + Err(Error::PCSError(status_code, "PCS suffered from an internal server error")) + } + StatusCode::ServiceUnavailable => { + Err(Error::PCSError(status_code, "PCS is temporarily unavailable")) + } + __ => Err(Error::PCSError(status_code, "Unexpected response from PCS server")), + } + } + + fn parse_response(&self, response_body: String, response_headers: Vec<(String, String)>, _api_version: PcsVersion) -> Result { + let ca_chain = parse_issuer_header(&response_headers, "SGX-Enclave-Identity-Issuer-Chain")?; + let id = QeIdentitySigned::parse(&response_body, ca_chain)?; + Ok(id) + } +} + +/// Returns the certificate chain starting from the leaf CA +fn parse_issuer_header(headers: &Vec<(String, String)>, header: &'static str) -> Result, Error> { + let certchain = headers + .iter() + .find_map(|(key, value)| { + if key.to_lowercase() == header.to_lowercase() { + Some(value) + } else { + None + } + }) + .ok_or(Error::HeaderMissing(header))?; + let certchain = percent_decode(certchain.as_bytes()) + .decode_utf8() + .map_err(|e| Error::HeaderDecodeError(e))?; + let mut chain: Vec = vec![]; + for cert in PemBlock::new(certchain.as_bytes()) { + let cert = String::from_utf8(cert.to_vec()) + .map_err(|_| Error::CertificateParseError("Cert could not be decoded into utf8"))?; + chain.push(cert); + } + Ok(chain) +} + + +#[cfg(all(test, feature = "reqwest"))] +mod tests { + use std::path::PathBuf; + use std::time::Duration; + use std::hash::Hash; + use std::hash::Hasher; + + use pcs::PckID; + + use crate::reqwest_client; + use crate::provisioning_client::{ + test_helpers, IntelProvisioningClientBuilder, PcsVersion, ProvisioningClient + }; + use std::hash::DefaultHasher; + + const PCKID_TEST_FILE: &str = "./tests/data/pckid_retrieval.csv"; + const OUTPUT_TEST_DIR: &str = "./tests/data/"; + const TIME_RETRY_TIMEOUT: Duration = Duration::from_secs(180); + + fn pcs_api_key() -> String { + std::env::var("PCS_API_KEY").expect("PCS_API_KEY must be set") + } + + #[test] + pub fn pcks() { + for api_version in [PcsVersion::V3, PcsVersion::V4] { + let mut intel_builder = IntelProvisioningClientBuilder::new(api_version) + .set_retry_timeout(TIME_RETRY_TIMEOUT); + if api_version == PcsVersion::V3 { + intel_builder.set_api_key(pcs_api_key()); + } + let client = intel_builder.build(reqwest_client()); + + for pckid in PckID::parse_file(&PathBuf::from(PCKID_TEST_FILE).as_path()).unwrap().iter() { + let pcks = client.pckcerts(&pckid.enc_ppid, pckid.pce_id.clone()).unwrap(); + assert_eq!( + test_helpers::get_cert_subject(pcks.ca_chain().last().unwrap()), + "Intel SGX Root CA" + ); + pcks.fmspc().unwrap(); + pcks.store(OUTPUT_TEST_DIR, pckid.qe_id.as_slice()).unwrap(); + } + } + } + + #[test] + pub fn pcks_cached() { + for api_version in [PcsVersion::V3, PcsVersion::V4] { + let mut intel_builder = IntelProvisioningClientBuilder::new(api_version) + .set_retry_timeout(TIME_RETRY_TIMEOUT); + if api_version == PcsVersion::V3 { + intel_builder.set_api_key(pcs_api_key()); + } + let client = intel_builder.build(reqwest_client()); + + for pckid in PckID::parse_file(&PathBuf::from(PCKID_TEST_FILE).as_path()).unwrap().iter() { + let pcks = client.pckcerts(&pckid.enc_ppid, pckid.pce_id.clone()).unwrap(); + + // The cache should be populated after initial service call + { + let mut cache = client.pckcerts_service.cache.lock().unwrap(); + + assert!(cache.len() > 0); + + let (cached_pcks, _) = { + let mut hasher = DefaultHasher::new(); + let input = client.pckcerts_service.pcs_service().build_input(&pckid.enc_ppid, pckid.pce_id.clone()); + input.hash(&mut hasher); + + cache.get_mut(&hasher.finish()).expect("Can't find key in cache").to_owned() + }; + + assert_eq!(pcks.fmspc().unwrap(), cached_pcks.fmspc().unwrap()); + assert_eq!(pcks, cached_pcks); + } + + // Second service call should return value from cache + let pcks_from_service = client.pckcerts(&pckid.enc_ppid, pckid.pce_id.clone()) + .unwrap(); + + assert_eq!(pcks, pcks_from_service); + assert_eq!(pcks.fmspc().unwrap(), pcks_from_service.fmspc().unwrap()); + } + } + } + + #[test] + pub fn pck() { + for api_version in [PcsVersion::V3, PcsVersion::V4] { + let mut intel_builder = IntelProvisioningClientBuilder::new(api_version) + .set_retry_timeout(TIME_RETRY_TIMEOUT); + if api_version == PcsVersion::V3 { + intel_builder.set_api_key(pcs_api_key()); + } + let client = intel_builder.build(reqwest_client()); + for pckid in PckID::parse_file(&PathBuf::from(PCKID_TEST_FILE).as_path()).unwrap().iter() { + let pck = client.pckcert(Some(&pckid.enc_ppid), &pckid.pce_id, &pckid.cpu_svn, pckid.pce_isvsvn, None) + .unwrap(); + assert_eq!( + test_helpers::get_cert_subject(pck.ca_chain().last().unwrap()), + "Intel SGX Root CA" + ); + } + } + } + + #[test] + pub fn pck_cached() { + for api_version in [PcsVersion::V3, PcsVersion::V4] { + let mut intel_builder = IntelProvisioningClientBuilder::new(api_version) + .set_retry_timeout(TIME_RETRY_TIMEOUT); + if api_version == PcsVersion::V3 { + intel_builder.set_api_key(pcs_api_key()); + } + let client = intel_builder.build(reqwest_client()); + for pckid in PckID::parse_file(&PathBuf::from(PCKID_TEST_FILE).as_path()).unwrap().iter() { + let pck = client.pckcert(Some(&pckid.enc_ppid), &pckid.pce_id, &pckid.cpu_svn, pckid.pce_isvsvn, None) + .unwrap(); + + // The cache should be populated after initial service call + { + let mut cache = client.pckcert_service.cache.lock().unwrap(); + + assert!(cache.len() > 0); + + let (cached_pck, _) = { + let mut hasher = DefaultHasher::new(); + let input = client.pckcert_service.pcs_service().build_input(Some(&pckid.enc_ppid), &pckid.pce_id, &pckid.cpu_svn, pckid.pce_isvsvn, None); + input.hash(&mut hasher); + + cache.get_mut(&hasher.finish()).expect("Can't find key in cache").to_owned() + }; + + assert_eq!(pck.fmspc().unwrap(), cached_pck.fmspc().unwrap()); + assert_eq!(pck.ca_chain(), cached_pck.ca_chain()); + } + + // Second service call should return value from cache + let pck_from_service = client.pckcert(Some(&pckid.enc_ppid), &pckid.pce_id, &pckid.cpu_svn, pckid.pce_isvsvn, None) + .unwrap(); + + assert_eq!(pck.fmspc().unwrap(), pck_from_service.fmspc().unwrap()); + assert_eq!(pck.ca_chain(), pck_from_service.ca_chain()); + } + } + } + + #[test] + pub fn tcb_info() { + for api_version in [PcsVersion::V3, PcsVersion::V4] { + let mut intel_builder = IntelProvisioningClientBuilder::new(api_version) + .set_retry_timeout(TIME_RETRY_TIMEOUT); + if api_version == PcsVersion::V3 { + intel_builder.set_api_key(pcs_api_key()); + } + let client = intel_builder.build(reqwest_client()); + for pckid in PckID::parse_file(&PathBuf::from(PCKID_TEST_FILE).as_path()).unwrap().iter() { + let pckcerts = client.pckcerts(&pckid.enc_ppid, pckid.pce_id.clone()).unwrap(); + assert!(client + .tcbinfo(&pckcerts.fmspc().unwrap()) + .and_then(|tcb| { Ok(tcb.store(OUTPUT_TEST_DIR).unwrap()) }) + .is_ok()); + } + } + } + + #[test] + pub fn tcb_info_cached() { + for api_version in [PcsVersion::V3, PcsVersion::V4] { + let mut intel_builder = IntelProvisioningClientBuilder::new(api_version) + .set_retry_timeout(TIME_RETRY_TIMEOUT); + if api_version == PcsVersion::V3 { + intel_builder.set_api_key(pcs_api_key()); + } + let client = intel_builder.build(reqwest_client()); + for pckid in PckID::parse_file(&PathBuf::from(PCKID_TEST_FILE).as_path()).unwrap().iter() { + let pckcerts = client.pckcerts(&pckid.enc_ppid, pckid.pce_id.clone()).unwrap(); + let fmspc = pckcerts.fmspc().unwrap(); + let tcb_info = client.tcbinfo(&fmspc).unwrap(); + + // The cache should be populated after initial service call + { + let mut cache = client.tcbinfo_service.cache.lock().unwrap(); + + assert!(cache.len() > 0); + + let (cached_tcb_info, _) = { + let mut hasher = DefaultHasher::new(); + let input = client.tcbinfo_service.pcs_service().build_input(&fmspc); + input.hash(&mut hasher); + + cache.get_mut(&hasher.finish()).expect("Can't find key in cache").to_owned() + }; + + assert_eq!(tcb_info, cached_tcb_info); + } + + // Second service call should return value from cache + let tcb_info_from_service = client.tcbinfo(&fmspc).unwrap(); + + assert_eq!(tcb_info, tcb_info_from_service); + } + } + } + + #[test] + pub fn pckcrl() { + for api_version in [PcsVersion::V3, PcsVersion::V4] { + let mut intel_builder = IntelProvisioningClientBuilder::new(api_version) + .set_retry_timeout(TIME_RETRY_TIMEOUT); + if api_version == PcsVersion::V3 { + intel_builder.set_api_key(pcs_api_key()); + } + let client = intel_builder.build(reqwest_client()); + assert!(client + .pckcrl() + .and_then(|crl| { Ok(crl.write_to_file(OUTPUT_TEST_DIR).unwrap()) }) + .is_ok()); + } + } + + #[test] + pub fn pckcrl_cached() { + for api_version in [PcsVersion::V3, PcsVersion::V4] { + let mut intel_builder = IntelProvisioningClientBuilder::new(api_version) + .set_retry_timeout(TIME_RETRY_TIMEOUT); + if api_version == PcsVersion::V3 { + intel_builder.set_api_key(pcs_api_key()); + } + let client = intel_builder.build(reqwest_client()); + let pckcrl = client.pckcrl().unwrap(); + + // The cache should be populated after initial service call + { + let mut cache = client.pckcrl_service.cache.lock().unwrap(); + + assert!(cache.len() > 0); + + let (cached_pckcrl, _) = { + let mut hasher = DefaultHasher::new(); + let input = client.pckcrl_service.pcs_service().build_input(); + input.hash(&mut hasher); + + cache.get_mut(&hasher.finish()).expect("Can't find key in cache").to_owned() + }; + + assert_eq!(pckcrl, cached_pckcrl); + } + + // Second service call should return value from cache + let pckcrl_from_service = client.pckcrl() + .unwrap(); + + assert_eq!(pckcrl, pckcrl_from_service); + } + } + + #[test] + pub fn qe_identity() { + for api_version in [PcsVersion::V3, PcsVersion::V4] { + let mut intel_builder = IntelProvisioningClientBuilder::new(api_version) + .set_retry_timeout(TIME_RETRY_TIMEOUT); + if api_version == PcsVersion::V3 { + intel_builder.set_api_key(pcs_api_key()); + } + let client = intel_builder.build(reqwest_client()); + let qe_id = client.qe_identity(); + assert!(qe_id.is_ok()); + assert!(qe_id.unwrap().write_to_file(OUTPUT_TEST_DIR).is_ok()); + } + } + + #[test] + pub fn qe_identity_cached() { + for api_version in [PcsVersion::V3, PcsVersion::V4] { + let mut intel_builder = IntelProvisioningClientBuilder::new(api_version) + .set_retry_timeout(TIME_RETRY_TIMEOUT); + if api_version == PcsVersion::V3 { + intel_builder.set_api_key(pcs_api_key()); + } + let client = intel_builder.build(reqwest_client()); + let qe_id = client.qe_identity().unwrap(); + + // The cache should be populated after initial service call + { + let mut cache = client.qeid_service.cache.lock().unwrap(); + + assert!(cache.len() > 0); + + let (cached_qeid, _) = { + let mut hasher = DefaultHasher::new(); + let input = client.qeid_service.pcs_service().build_input(); + input.hash(&mut hasher); + + cache.get_mut(&hasher.finish()).expect("Can't find key in cache").to_owned() + }; + + assert_eq!(qe_id, cached_qeid); + } + + // Second service call should return value from cache + let qeid_from_service = client.qe_identity() + .unwrap(); + + assert_eq!(qe_id, qeid_from_service); + } + } +} diff --git a/intel-sgx/dcap-artifact-retrieval/src/provisioning_client/mod.rs b/intel-sgx/dcap-artifact-retrieval/src/provisioning_client/mod.rs new file mode 100644 index 00000000..13baaed5 --- /dev/null +++ b/intel-sgx/dcap-artifact-retrieval/src/provisioning_client/mod.rs @@ -0,0 +1,654 @@ +/* Copyright (c) Fortanix, Inc. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +use std::convert::TryFrom; +use std::io::Read; +use std::time::{Duration, SystemTime}; + +use num_enum::TryFromPrimitive; +use pcs::{CpuSvn, EncPpid, PceId, PceIsvsvn, PckCert, PckCerts, PckCrl, QeId, QeIdentitySigned, TcbInfo, Unverified}; +#[cfg(feature = "reqwest")] +use reqwest::blocking::{Client as ReqwestClient, Response as ReqwestResponse}; +pub use azure::AzureProvisioningClientBuilder; +pub use intel::IntelProvisioningClientBuilder; +use std::sync::Mutex; +use lru_cache::LruCache; +use std::clone::Clone; +use std::hash::{Hash, DefaultHasher, Hasher}; +use crate::Error; + +mod azure; +mod intel; + + + +// Taken from https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml +#[derive(Clone, Debug, Eq, PartialEq, TryFromPrimitive)] +#[repr(u16)] +pub enum StatusCode { + Continue = 100, + SwitchingProtocols = 101, + Processing = 102, + EarlyHints = 103, + //104-199 Unassigned + Ok = 200, + Created = 201, + Accepted = 202, + NonAuthoritativeInformation = 203, + NoContent = 204, + ResetContent = 205, + PartialContent = 206, + MultiStatus = 207, + AlreadyReported = 208, + //209-225 Unassigned + ImUsed = 226, + //227-299 Unassigned + MultipleChoices = 300, + MovedPermanently = 301, + Found = 302, + SeeOther = 303, + NotModified = 304, + UseProxy = 305, + #[num_enum(alternatives = [418])] + Unused = 306, + TemporaryRedirect = 307, + PermanentRedirect = 308, + // 309-399 Unassigned + BadRequest = 400, + Unauthorized = 401, + PaymentRequired = 402, + Forbidden = 403, + NotFound = 404, + MethodNotAllowed = 405, + NotAcceptable = 406, + ProxyAuthenticationRequired = 407, + RequestTimeout = 408, + Conflict = 409, + Gone = 410, + LengthRequired = 411, + PreconditionFailed = 412, + ContentTooLarge = 413, + UriTooLong = 414, + UnsupportedMediaType = 415, + RangeNotSatisfiable = 416, + ExpectationFailed = 417, + //418 Unused + //419-420 Unassigned, + MisdirectedRequest = 421, + UnprocessableContent = 422, + Locked = 423, + FailedDependency = 424, + TooEarly = 425, + UpgradeRequired = 426, + // 427 Unassigned + PreconditionRequired = 428, + TooManyRequests = 429, + //430 Unassigned + RequestHeaderFieldsTooLarge = 431, + //432-450 Unassigned, + UnavailableForLegalReasons = 451, + //452-499 Unassigned, + InternalServerError = 500, + NotImplemented = 501, + BadGateway = 502, + ServiceUnavailable = 503, + GatewayTimeout = 504, + HttpVersionNotSupported = 505, + VariantAlsoNegotiates = 506, + InsufficientStorage = 507, + LoopDetected = 508, + //509 Unassigned + NotExtended = 510, // OBSOLETED + NetworkAuthenticationRequired = 511, + //512-599 Unassigned + #[num_enum(alternatives = [104..=199, 209..=225, 227..=299, 309..=399, 419, 420, 427, 430, 432..=450, 452..=499, 509, 512..=598])] + Unassigned = 599, +} + +#[derive(Copy, Clone, PartialEq, Eq, Hash)] +pub enum PcsVersion { + V3 = 3, + V4 = 4, +} + +pub trait WithApiVersion { + fn api_version(&self) -> PcsVersion; +} + +impl WithApiVersion for PcsVersion { + fn api_version(&self) -> PcsVersion { + *self + } +} + +#[derive(Hash)] +pub struct PckCertsIn<'a> { + enc_ppid: &'a EncPpid, + pce_id: PceId, + api_key: &'a Option, + api_version: PcsVersion, +} + +impl WithApiVersion for PckCertsIn<'_> { + fn api_version(&self) -> PcsVersion { + self.api_version + } +} + +pub trait PckCertsService<'inp> : ProvisioningServiceApi<'inp, Input = PckCertsIn<'inp>, Output = PckCerts> { + fn build_input(&'inp self, enc_ppid: &'inp EncPpid, pce_id: PceId) -> >::Input; +} + +#[derive(Hash)] +pub struct PckCertIn<'a> { + encrypted_ppid: Option<&'a EncPpid>, + pce_id: &'a PceId, + cpu_svn: &'a CpuSvn, + pce_isvsvn: PceIsvsvn, + qe_id: Option<&'a QeId>, + api_version: PcsVersion, + api_key: &'a Option, +} + +impl WithApiVersion for PckCertIn<'_> { + fn api_version(&self) -> PcsVersion { + self.api_version + } +} + +pub trait PckCertService<'inp> : ProvisioningServiceApi<'inp, Input = PckCertIn<'inp>, Output = PckCert> { + fn build_input(&'inp self, encrypted_ppid: Option<&'inp EncPpid>, pce_id: &'inp PceId, cpu_svn: &'inp CpuSvn, pce_isvsvn: PceIsvsvn, qe_id: Option<&'inp QeId>) -> >::Input; +} + +#[derive(Hash)] +pub struct PckCrlIn { + api_version: PcsVersion, +} + +impl WithApiVersion for PckCrlIn { + fn api_version(&self) -> PcsVersion { + self.api_version + } +} + +pub trait PckCrlService<'inp> : ProvisioningServiceApi<'inp, Input = PckCrlIn, Output = PckCrl> { + fn build_input(&'inp self) -> >::Input; +} + +#[derive(Hash)] +pub struct QeIdIn { + pub api_version: PcsVersion, +} + +impl WithApiVersion for QeIdIn { + fn api_version(&self) -> PcsVersion { + self.api_version + } +} + +pub trait QeIdService<'inp> : ProvisioningServiceApi<'inp, Input = QeIdIn, Output = QeIdentitySigned> { + fn build_input(&'inp self) -> >::Input; +} + +#[derive(Hash)] +pub struct TcbInfoIn<'i> { + pub(crate) api_version: PcsVersion, + pub(crate) fmspc: &'i Vec, +} + +impl WithApiVersion for TcbInfoIn<'_> { + fn api_version(&self) -> PcsVersion { + self.api_version + } +} + +pub trait TcbInfoService<'inp> : ProvisioningServiceApi<'inp, Input = TcbInfoIn<'inp>, Output = TcbInfo> { + fn build_input(&'inp self, fmspc: &'inp Vec) -> >::Input; +} + +pub struct ClientBuilder { + retry_timeout: Option, + cache_capacity: usize, + cache_shelf_time: Duration, +} + +impl Default for ClientBuilder { + fn default() -> Self { + ClientBuilder { + retry_timeout: None, + cache_capacity: 10, + cache_shelf_time: Duration::from_secs(60), + } + } +} + +impl ClientBuilder { + pub(crate) fn new() -> Self { + ClientBuilder::default() + } + + pub(crate) fn set_retry_timeout(mut self, retry_timeout: Duration) -> Self { + self.retry_timeout = Some(retry_timeout); + self + } + + pub(crate) fn build(self, pckcerts_service: PSS, pckcert_service: PS, pckcrl_service: PC, qeid_service: QS, tcbinfo_service: TS, fetcher: F) -> Client + where + PSS: for<'a> PckCertsService<'a> + Sync + Send + 'static, + PS: for<'a> PckCertService<'a> + Sync + Send + 'static, + PC: for<'a> PckCrlService<'a> + Sync + Send + 'static, + QS: for<'a> QeIdService<'a> + Sync + Send + 'static, + TS: for<'a> TcbInfoService<'a> + Sync + Send + 'static, + F: for<'a> Fetcher<'a>, + { + Client::new(pckcerts_service, pckcert_service, pckcrl_service, qeid_service, tcbinfo_service, fetcher, self.retry_timeout, self.cache_capacity, self.cache_shelf_time) + } +} + +struct PcsService ProvisioningServiceApi<'a> + Sync + ?Sized> { + service: Box, +} + +impl ProvisioningServiceApi<'a> + Sync + ?Sized> PcsService { + pub fn new(service: Box) -> Self { + Self { + service, + } + } +} + +impl ProvisioningServiceApi<'a> + Sync + ?Sized> PcsService { + pub(crate) fn pcs_service(&self) -> &T { + &self.service + } + + fn call_service<'a, F: Fetcher<'a>>(&'a self, fetcher: &'a F, input: &>::Input) -> Result<>::Output, Error> { + let (url, headers) = >::build_request(&self.pcs_service(), input)?; + let req = fetcher.build_request(&url, headers)?; + let api_version = input.api_version(); + + let (status_code, resp) = fetcher.send(req)?; + >::validate_response(self.pcs_service(), status_code)?; + let (response_body, response_headers) = fetcher.parse_response(resp)?; + >::parse_response(self.pcs_service(), response_body, response_headers, api_version) + } +} + +struct CachedService ProvisioningServiceApi<'a, Output = O> + Sync + ?Sized> { + service: BackoffService, + cache: Mutex>, + cache_shelf_time: Duration +} + +impl ProvisioningServiceApi<'a, Output = O> + Sync + ?Sized> CachedService { + pub fn new(service: BackoffService, capacity: usize, cache_shelf_time: Duration) -> Self { + Self { + service, + cache: Mutex::new(LruCache::new(capacity)), + cache_shelf_time, + } + } +} + +impl ProvisioningServiceApi<'a, Output = O> + Sync + ?Sized> CachedService { + pub(crate) fn pcs_service(&self) -> &T { + &self.service.pcs_service() + } + + pub fn call_service<'a, F: Fetcher<'a>>(&'a self, fetcher: &'a F, input: &>::Input) -> Result<>::Output, Error> { + let key = { + let mut hasher = DefaultHasher::new(); + input.hash(&mut hasher); + hasher.finish() + }; + + let mut cache = self.cache.lock().unwrap(); + if let Some((value, time)) = cache.get_mut(&key) { + if self.cache_shelf_time < time.elapsed().unwrap_or(Duration::MAX) { + cache.remove(&key); + } else { + return Ok(value.to_owned()); + } + } + let value = self.service.call_service::(fetcher, input)?; + cache.insert(key, (value.clone(), SystemTime::now())); + Ok(value) + } +} + +struct BackoffService ProvisioningServiceApi<'a> + Sync + ?Sized> { + service: PcsService, + retry_timeout: Option, +} + +impl ProvisioningServiceApi<'a> + Sync + ?Sized> BackoffService { + pub fn new(service: PcsService, retry_timeout: Option) -> Self { + Self { + service, + retry_timeout + } + } +} + +impl ProvisioningServiceApi<'a> + Sync + ?Sized> BackoffService { + const RETRY_INITIAL_INTERVAL: Duration = Duration::from_secs(2); + const RETRY_INTERVAL_MULTIPLIER: f64 = 2.0; + + pub(crate) fn pcs_service(&self) -> &T { + &self.service.pcs_service() + } + + pub fn call_service<'a, F: Fetcher<'a>>(&'a self, fetcher: &'a F, input: &>::Input) -> Result<>::Output, Error> { + if let Some(retry_timeout) = self.retry_timeout { + let op = || { + match self.service.call_service::(fetcher, input) { + Ok(output) => Ok(output), + Err(err) => match err { + Error::PCSError(status_code, msg) => { + if status_code.clone() as u16 >= 500 { + Err(backoff::Error::transient(Error::PCSError(status_code, msg))) + } else { + Err(backoff::Error::permanent(Error::PCSError(status_code, msg))) + } + } + err @ _ => Err(backoff::Error::Permanent(err)), + }, + } + }; + + let backoff = backoff::ExponentialBackoffBuilder::default() + .with_initial_interval(Self::RETRY_INITIAL_INTERVAL) + .with_multiplier(Self::RETRY_INTERVAL_MULTIPLIER) + .with_max_elapsed_time(Some(retry_timeout)) + .build(); + backoff::retry(backoff, op).map_err(|backoff_err| match backoff_err { + backoff::Error::Permanent(err) => err, + backoff::Error::Transient { err, .. } => err, + }) + } else { + self.service.call_service::(fetcher, input) + } + } +} + +pub struct Client Fetcher<'a>> { + pckcerts_service: CachedService PckCertsService<'a> + Sync + Send>, + pckcert_service: CachedService, dyn for<'a> PckCertService<'a> + Sync + Send>, + pckcrl_service: CachedService PckCrlService<'a> + Sync + Send>, + qeid_service: CachedService QeIdService<'a> + Sync + Send>, + tcbinfo_service: CachedService TcbInfoService<'a> + Sync + Send>, + fetcher: F, +} + +impl Fetcher<'a>> Client { + fn new(pckcerts_service: PSS, pckcert_service: PS, pckcrl_service: PC, qeid_service: QS, tcbinfo_service: TS, fetcher: F,retry_timeout: Option, cache_capacity: usize, cache_shelf_time: Duration) -> Client + where + PSS: for<'a> PckCertsService<'a> + Sync + Send + 'static, + PS: for<'a> PckCertService<'a> + Sync + Send + 'static, + PC: for<'a> PckCrlService<'a> + Sync + Send + 'static, + QS: for<'a> QeIdService<'a> + Sync + Send + 'static, + TS: for<'a> TcbInfoService<'a> + Sync + Send + 'static, + { + Client { + pckcerts_service: CachedService::new(BackoffService::new(PcsService::new(Box::new(pckcerts_service)), retry_timeout.clone()), cache_capacity, cache_shelf_time), + pckcert_service: CachedService::new(BackoffService::new(PcsService::new(Box::new(pckcert_service)), retry_timeout.clone()), cache_capacity, cache_shelf_time), + pckcrl_service: CachedService::new(BackoffService::new(PcsService::new(Box::new(pckcrl_service)), retry_timeout.clone()), cache_capacity, cache_shelf_time), + qeid_service: CachedService::new(BackoffService::new(PcsService::new(Box::new(qeid_service)), retry_timeout.clone()), cache_capacity, cache_shelf_time), + tcbinfo_service: CachedService::new(BackoffService::new(PcsService::new(Box::new(tcbinfo_service)), retry_timeout.clone()), cache_capacity, cache_shelf_time), + fetcher, + } + } +} + +pub trait ProvisioningClient { + fn pckcerts(&self, enc_ppid: &EncPpid, pce_id: PceId) -> Result; + + fn pckcert(&self, encrypted_ppid: Option<&EncPpid>, pce_id: &PceId, cpu_svn: &CpuSvn, pce_isvsvn: PceIsvsvn, qe_id: Option<&QeId>) -> Result, Error>; + + fn tcbinfo(&self, fmspc: &Vec) -> Result; + + fn pckcrl(&self) -> Result; + + fn qe_identity(&self) -> Result; +} + +impl Fetcher<'a>> ProvisioningClient for Client { + fn pckcerts(&self, encrypted_ppid: &EncPpid, pce_id: PceId) -> Result { + let input = self.pckcerts_service.pcs_service().build_input(encrypted_ppid, pce_id); + self.pckcerts_service.call_service(&self.fetcher, &input) + } + + fn pckcert(&self, encrypted_ppid: Option<&EncPpid>, pce_id: &PceId, cpu_svn: &CpuSvn, pce_isvsvn: PceIsvsvn, qe_id: Option<&QeId>) -> Result, Error> { + let input = self.pckcert_service.pcs_service().build_input(encrypted_ppid, pce_id, cpu_svn, pce_isvsvn, qe_id); + self.pckcert_service.call_service(&self.fetcher, &input) + } + + fn tcbinfo(&self, fmspc: &Vec) -> Result { + let input = self.tcbinfo_service.pcs_service().build_input(fmspc); + self.tcbinfo_service.call_service(&self.fetcher, &input) + } + + fn pckcrl(&self) -> Result { + let input = self.pckcrl_service.pcs_service().build_input(); + self.pckcrl_service.call_service(&self.fetcher, &input) + } + + fn qe_identity(&self) -> Result { + let input = self.qeid_service.pcs_service().build_input(); + self.qeid_service.call_service(&self.fetcher, &input) + } +} + +pub trait Fetcher<'req> { + type Request; + type Response; + + fn build_request(&'req self, url: &String, headers: Vec<(String, String)>) -> Result; + fn send(&'req self, request: Self::Request) -> Result<(StatusCode, Self::Response), Error>; + fn parse_response(&'req self, response: Self::Response) -> Result<(String, Vec<(String, String)>), Error>; +} + +#[cfg(feature = "reqwest")] +impl<'req> Fetcher<'req> for ReqwestClient { + type Request = reqwest::blocking::RequestBuilder; + type Response = ReqwestResponse; + + fn build_request(&'req self, url: &String, headers: Vec<(String, String)>) -> Result { + let url = reqwest::Url::parse(url).map_err(|e| e.to_string())?; + + let mut result = self.get(url); + + for (name, value) in headers { + result = result.header(name, value); + } + + Ok(result) + } + + fn send(&'req self, request: Self::Request) -> Result<(StatusCode, Self::Response), Error> { + let response = request.send().map_err(|e| e.to_string())?; + let status_code = StatusCode::try_from(response.status().as_u16()).map_err(|e| e.to_string())?; + + Ok((status_code, response)) + } + + fn parse_response(&'req self, mut response: Self::Response) -> Result<(String, Vec<(String, String)>), Error> { + let mut body = Vec::new(); + response.read_to_end(&mut body) + .map_err(|e| Error::ReadResponseError(format!("Error while trying to read response body. Error: {}", e).into()))?; + + let body = String::from_utf8(body) + .map_err(|e| Error::ReadResponseError(format!("{}", e).into()))?; + + let headers: Vec<(String, String)> = response + .headers() + .iter() + .map(|(header, value)| (header.to_string(), value.to_str().unwrap_or("").to_string())) + .collect(); + Ok((body, headers)) + } +} + + +pub trait ProvisioningServiceApi<'inp> { + type Input: 'inp + WithApiVersion + Hash; + type Output: Clone; + + fn build_request(&'inp self, input: &Self::Input) -> Result<(String, Vec<(String, String)>), Error>; + fn validate_response(&'inp self, code: StatusCode) -> Result<(), Error>; + fn parse_response(&'inp self, response_body: String, response_headers: Vec<(String, String)>, api_version: PcsVersion) -> Result; +} + +#[cfg(test)] +mod test_helpers { + use pkix::FromBer; + + pub fn get_cert_subject(cert: &str) -> String { + let cert = &pkix::pem::pem_to_der(cert.trim(), Some(pkix::pem::PEM_CERTIFICATE)) + .ok_or(yasna::ASN1Error::new(yasna::ASN1ErrorKind::Invalid)) + .unwrap(); + let cert = pkix::x509::GenericCertificate::from_ber(&cert).unwrap(); + let name = cert.tbscert.subject.get(&*pkix::oid::commonName).unwrap(); + String::from_utf8_lossy(&name.value()).to_string() + } +} + +#[cfg(test)] +mod tests { + use super::*; + use std::string::String; + + + struct MockService; + + #[derive(Hash, Clone, PartialEq, Eq, Debug)] + struct MockInput(u64); + + impl WithApiVersion for MockInput { + fn api_version(&self) -> PcsVersion { + PcsVersion::V3 + } + } + + #[derive(Clone, PartialEq, Eq, Debug)] + struct MockOutput(String); + + impl<'a> ProvisioningServiceApi<'a> for MockService { + type Input = MockInput; + type Output = MockOutput; + + fn build_request(&'a self, _input: &Self::Input) -> Result<(String, Vec<(String, String)>), Error> { + Ok((_input.0.to_string(), vec![])) + } + + fn validate_response(&'a self, _code: StatusCode) -> Result<(), Error> { + Ok(()) + } + + fn parse_response(&'a self, response_body: String, _response_headers: Vec<(std::string::String, std::string::String)>, _api_version: PcsVersion) -> Result { + Ok(MockOutput(format!("response to: {}", response_body))) + } + } + + struct MockFetcher; + + impl<'req> Fetcher<'req> for MockFetcher { + type Request = String; + type Response = String; + + fn build_request(&'req self, url: &String, _headers: Vec<(String, String)>) -> Result { + Ok(url.clone()) + } + + fn send(&'req self, request: Self::Request) -> Result<(StatusCode, Self::Response), Error> { + Ok((StatusCode::Ok, request)) + } + + fn parse_response(&'req self, response: Self::Response) -> Result<(String, Vec<(String, String)>), Error> { + Ok((response, vec![])) + } + } + + #[test] + fn test_call_service_cache_miss() { + let service = PcsService { service: Box::new(MockService) }; + let service = BackoffService::new(service, None); + let cached_service = CachedService::new(service, 5, Duration::from_secs(120)); + let fetcher = MockFetcher; + let input_a = MockInput(42); + let input_b = MockInput(420); + + // Initial call to populate the cache for `input_a` + cached_service.call_service(&fetcher, &input_a).unwrap(); + + // input_b should provoke cache miss and add new key to the cache + let result = cached_service.call_service(&fetcher, &input_b).unwrap(); + + let (cached_value, _) = { + let mut cache = cached_service.cache.lock().unwrap(); + cache.get_mut(&calculate_key(&input_b)).unwrap().to_owned() + }; + + assert_eq!(result, cached_value); + } + + #[test] + fn test_call_service_cache_hit() { + let service = PcsService { service: Box::new(MockService) }; + let service = BackoffService::new(service, None); + let cached_service = CachedService::new(service, 5, Duration::from_secs(120)); + let fetcher = MockFetcher; + let input = MockInput(42); + + // Initial call to populate the cache + let _ = cached_service.call_service(&fetcher, &input).unwrap(); + + // Now the service should not be called, and the cached result should be returned + let (cached_value, _) = { + let mut cache = cached_service.cache.lock().unwrap(); + cache.get_mut(&calculate_key(&input)).unwrap().to_owned() + }; + + let result = cached_service.call_service(&fetcher, &input).unwrap(); + assert_eq!(result, cached_value); + } + + #[test] + fn test_cache_capacity_eviction() { + let service = PcsService { service: Box::new(MockService) }; + let service = BackoffService::new(service, None); + let cached_service = CachedService::new(service, 2, Duration::from_secs(120)); + let fetcher = MockFetcher; + + // Insert entries into the cache, exceeding its capacity + for i in 0..3 { + let input = MockInput(i); + let _ = cached_service.call_service(&fetcher, &input).unwrap(); + } + + // At this point, the cache should have evicted the first inserted entry (MockInput(0)) + let mut cache = cached_service.cache.lock().unwrap(); + + // The cache should only have 2 items (capacity is 2) + assert_eq!(cache.len(), 2); + + // The first inserted key (MockInput(0)) should be evicted + let key_first = calculate_key(&MockInput(0)); + assert!(!cache.contains_key(&key_first)); + + // The last inserted key (MockInput(2)) should be present + let key_last = calculate_key(&MockInput(2)); + assert!(cache.contains_key(&key_last)); + } + + // Helper function to calculate the cache key based on the input + fn calculate_key(input: &MockInput) -> u64 { + let mut hasher = DefaultHasher::new(); + input.hash(&mut hasher); + hasher.finish() + } +} diff --git a/intel-sgx/dcap-artifact-retrieval/tests/data/00906ea10000.tcb b/intel-sgx/dcap-artifact-retrieval/tests/data/00906ea10000.tcb new file mode 100644 index 00000000..be6d8183 --- /dev/null +++ b/intel-sgx/dcap-artifact-retrieval/tests/data/00906ea10000.tcb @@ -0,0 +1 @@ +{"raw_tcb_info":"{\"id\":\"SGX\",\"version\":3,\"issueDate\":\"2024-06-28T17:01:07Z\",\"nextUpdate\":\"2024-07-28T17:01:07Z\",\"fmspc\":\"00906ea10000\",\"pceId\":\"0000\",\"tcbType\":0,\"tcbEvaluationDataNumber\":16,\"tcbLevels\":[{\"tcb\":{\"sgxtcbcomponents\":[{\"svn\":20},{\"svn\":20},{\"svn\":2},{\"svn\":4},{\"svn\":1},{\"svn\":128},{\"svn\":7},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0}],\"pcesvn\":13},\"tcbDate\":\"2023-08-09T00:00:00Z\",\"tcbStatus\":\"SWHardeningNeeded\",\"advisoryIDs\":[\"INTEL-SA-00334\",\"INTEL-SA-00615\"]},{\"tcb\":{\"sgxtcbcomponents\":[{\"svn\":20},{\"svn\":20},{\"svn\":2},{\"svn\":4},{\"svn\":1},{\"svn\":128},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0}],\"pcesvn\":13},\"tcbDate\":\"2023-08-09T00:00:00Z\",\"tcbStatus\":\"ConfigurationAndSWHardeningNeeded\",\"advisoryIDs\":[\"INTEL-SA-00161\",\"INTEL-SA-00219\",\"INTEL-SA-00289\",\"INTEL-SA-00334\",\"INTEL-SA-00615\"]},{\"tcb\":{\"sgxtcbcomponents\":[{\"svn\":19},{\"svn\":19},{\"svn\":2},{\"svn\":4},{\"svn\":1},{\"svn\":128},{\"svn\":7},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0}],\"pcesvn\":13},\"tcbDate\":\"2023-02-15T00:00:00Z\",\"tcbStatus\":\"OutOfDate\",\"advisoryIDs\":[\"INTEL-SA-00828\",\"INTEL-SA-00161\",\"INTEL-SA-00219\",\"INTEL-SA-00289\",\"INTEL-SA-00334\",\"INTEL-SA-00615\"]},{\"tcb\":{\"sgxtcbcomponents\":[{\"svn\":19},{\"svn\":19},{\"svn\":2},{\"svn\":4},{\"svn\":1},{\"svn\":128},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0}],\"pcesvn\":13},\"tcbDate\":\"2023-02-15T00:00:00Z\",\"tcbStatus\":\"OutOfDateConfigurationNeeded\",\"advisoryIDs\":[\"INTEL-SA-00161\",\"INTEL-SA-00219\",\"INTEL-SA-00289\",\"INTEL-SA-00828\",\"INTEL-SA-00334\",\"INTEL-SA-00615\"]},{\"tcb\":{\"sgxtcbcomponents\":[{\"svn\":17},{\"svn\":17},{\"svn\":2},{\"svn\":4},{\"svn\":1},{\"svn\":128},{\"svn\":7},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0}],\"pcesvn\":11},\"tcbDate\":\"2021-11-10T00:00:00Z\",\"tcbStatus\":\"OutOfDate\",\"advisoryIDs\":[\"INTEL-SA-00614\",\"INTEL-SA-00617\",\"INTEL-SA-00161\",\"INTEL-SA-00219\",\"INTEL-SA-00289\",\"INTEL-SA-00828\",\"INTEL-SA-00334\",\"INTEL-SA-00615\"]},{\"tcb\":{\"sgxtcbcomponents\":[{\"svn\":17},{\"svn\":17},{\"svn\":2},{\"svn\":4},{\"svn\":1},{\"svn\":128},{\"svn\":7},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0}],\"pcesvn\":10},\"tcbDate\":\"2020-11-11T00:00:00Z\",\"tcbStatus\":\"OutOfDate\",\"advisoryIDs\":[\"INTEL-SA-00161\",\"INTEL-SA-00219\",\"INTEL-SA-00289\",\"INTEL-SA-00614\",\"INTEL-SA-00617\",\"INTEL-SA-00828\",\"INTEL-SA-00334\",\"INTEL-SA-00615\"]},{\"tcb\":{\"sgxtcbcomponents\":[{\"svn\":17},{\"svn\":17},{\"svn\":2},{\"svn\":4},{\"svn\":1},{\"svn\":128},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0}],\"pcesvn\":11},\"tcbDate\":\"2021-11-10T00:00:00Z\",\"tcbStatus\":\"OutOfDateConfigurationNeeded\",\"advisoryIDs\":[\"INTEL-SA-00161\",\"INTEL-SA-00219\",\"INTEL-SA-00289\",\"INTEL-SA-00614\",\"INTEL-SA-00617\",\"INTEL-SA-00828\",\"INTEL-SA-00334\",\"INTEL-SA-00615\"]},{\"tcb\":{\"sgxtcbcomponents\":[{\"svn\":17},{\"svn\":17},{\"svn\":2},{\"svn\":4},{\"svn\":1},{\"svn\":128},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0}],\"pcesvn\":10},\"tcbDate\":\"2020-11-11T00:00:00Z\",\"tcbStatus\":\"OutOfDateConfigurationNeeded\",\"advisoryIDs\":[\"INTEL-SA-00477\",\"INTEL-SA-00161\",\"INTEL-SA-00219\",\"INTEL-SA-00289\",\"INTEL-SA-00614\",\"INTEL-SA-00617\",\"INTEL-SA-00828\",\"INTEL-SA-00334\",\"INTEL-SA-00615\"]},{\"tcb\":{\"sgxtcbcomponents\":[{\"svn\":15},{\"svn\":15},{\"svn\":2},{\"svn\":4},{\"svn\":1},{\"svn\":128},{\"svn\":7},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0}],\"pcesvn\":10},\"tcbDate\":\"2020-06-10T00:00:00Z\",\"tcbStatus\":\"OutOfDate\",\"advisoryIDs\":[\"INTEL-SA-00381\",\"INTEL-SA-00389\",\"INTEL-SA-00477\",\"INTEL-SA-00161\",\"INTEL-SA-00219\",\"INTEL-SA-00289\",\"INTEL-SA-00614\",\"INTEL-SA-00617\",\"INTEL-SA-00828\",\"INTEL-SA-00334\",\"INTEL-SA-00615\"]},{\"tcb\":{\"sgxtcbcomponents\":[{\"svn\":15},{\"svn\":15},{\"svn\":2},{\"svn\":4},{\"svn\":1},{\"svn\":128},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0}],\"pcesvn\":10},\"tcbDate\":\"2020-06-10T00:00:00Z\",\"tcbStatus\":\"OutOfDateConfigurationNeeded\",\"advisoryIDs\":[\"INTEL-SA-00161\",\"INTEL-SA-00219\",\"INTEL-SA-00289\",\"INTEL-SA-00381\",\"INTEL-SA-00389\",\"INTEL-SA-00477\",\"INTEL-SA-00614\",\"INTEL-SA-00617\",\"INTEL-SA-00828\",\"INTEL-SA-00334\",\"INTEL-SA-00615\"]},{\"tcb\":{\"sgxtcbcomponents\":[{\"svn\":14},{\"svn\":14},{\"svn\":2},{\"svn\":4},{\"svn\":1},{\"svn\":128},{\"svn\":7},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0}],\"pcesvn\":10},\"tcbDate\":\"2019-12-11T00:00:00Z\",\"tcbStatus\":\"OutOfDate\",\"advisoryIDs\":[\"INTEL-SA-00320\",\"INTEL-SA-00329\",\"INTEL-SA-00161\",\"INTEL-SA-00219\",\"INTEL-SA-00289\",\"INTEL-SA-00381\",\"INTEL-SA-00389\",\"INTEL-SA-00477\",\"INTEL-SA-00614\",\"INTEL-SA-00617\",\"INTEL-SA-00828\",\"INTEL-SA-00334\",\"INTEL-SA-00615\"]},{\"tcb\":{\"sgxtcbcomponents\":[{\"svn\":14},{\"svn\":14},{\"svn\":2},{\"svn\":4},{\"svn\":1},{\"svn\":128},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0}],\"pcesvn\":10},\"tcbDate\":\"2019-12-11T00:00:00Z\",\"tcbStatus\":\"OutOfDateConfigurationNeeded\",\"advisoryIDs\":[\"INTEL-SA-00161\",\"INTEL-SA-00219\",\"INTEL-SA-00289\",\"INTEL-SA-00320\",\"INTEL-SA-00329\",\"INTEL-SA-00381\",\"INTEL-SA-00389\",\"INTEL-SA-00477\",\"INTEL-SA-00614\",\"INTEL-SA-00617\",\"INTEL-SA-00828\",\"INTEL-SA-00334\",\"INTEL-SA-00615\"]},{\"tcb\":{\"sgxtcbcomponents\":[{\"svn\":13},{\"svn\":13},{\"svn\":2},{\"svn\":4},{\"svn\":1},{\"svn\":128},{\"svn\":3},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0}],\"pcesvn\":9},\"tcbDate\":\"2019-11-13T00:00:00Z\",\"tcbStatus\":\"OutOfDate\",\"advisoryIDs\":[\"INTEL-SA-00161\",\"INTEL-SA-00219\",\"INTEL-SA-00289\",\"INTEL-SA-00320\",\"INTEL-SA-00329\",\"INTEL-SA-00381\",\"INTEL-SA-00389\",\"INTEL-SA-00477\",\"INTEL-SA-00614\",\"INTEL-SA-00617\",\"INTEL-SA-00828\",\"INTEL-SA-00334\",\"INTEL-SA-00615\"]},{\"tcb\":{\"sgxtcbcomponents\":[{\"svn\":13},{\"svn\":13},{\"svn\":2},{\"svn\":4},{\"svn\":1},{\"svn\":128},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0}],\"pcesvn\":9},\"tcbDate\":\"2019-11-13T00:00:00Z\",\"tcbStatus\":\"OutOfDateConfigurationNeeded\",\"advisoryIDs\":[\"INTEL-SA-00161\",\"INTEL-SA-00219\",\"INTEL-SA-00289\",\"INTEL-SA-00320\",\"INTEL-SA-00329\",\"INTEL-SA-00381\",\"INTEL-SA-00389\",\"INTEL-SA-00477\",\"INTEL-SA-00614\",\"INTEL-SA-00617\",\"INTEL-SA-00828\",\"INTEL-SA-00334\",\"INTEL-SA-00615\"]},{\"tcb\":{\"sgxtcbcomponents\":[{\"svn\":6},{\"svn\":6},{\"svn\":2},{\"svn\":4},{\"svn\":1},{\"svn\":128},{\"svn\":1},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0}],\"pcesvn\":7},\"tcbDate\":\"2019-05-15T00:00:00Z\",\"tcbStatus\":\"OutOfDate\",\"advisoryIDs\":[\"INTEL-SA-00220\",\"INTEL-SA-00270\",\"INTEL-SA-00293\",\"INTEL-SA-00161\",\"INTEL-SA-00219\",\"INTEL-SA-00289\",\"INTEL-SA-00320\",\"INTEL-SA-00329\",\"INTEL-SA-00381\",\"INTEL-SA-00389\",\"INTEL-SA-00477\",\"INTEL-SA-00614\",\"INTEL-SA-00617\",\"INTEL-SA-00828\",\"INTEL-SA-00334\",\"INTEL-SA-00615\"]},{\"tcb\":{\"sgxtcbcomponents\":[{\"svn\":6},{\"svn\":6},{\"svn\":2},{\"svn\":4},{\"svn\":1},{\"svn\":128},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0}],\"pcesvn\":7},\"tcbDate\":\"2019-05-15T00:00:00Z\",\"tcbStatus\":\"OutOfDateConfigurationNeeded\",\"advisoryIDs\":[\"INTEL-SA-00161\",\"INTEL-SA-00220\",\"INTEL-SA-00270\",\"INTEL-SA-00293\",\"INTEL-SA-00219\",\"INTEL-SA-00289\",\"INTEL-SA-00320\",\"INTEL-SA-00329\",\"INTEL-SA-00381\",\"INTEL-SA-00389\",\"INTEL-SA-00477\",\"INTEL-SA-00614\",\"INTEL-SA-00617\",\"INTEL-SA-00828\",\"INTEL-SA-00334\",\"INTEL-SA-00615\"]},{\"tcb\":{\"sgxtcbcomponents\":[{\"svn\":5},{\"svn\":5},{\"svn\":2},{\"svn\":4},{\"svn\":1},{\"svn\":128},{\"svn\":1},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0}],\"pcesvn\":7},\"tcbDate\":\"2019-01-09T00:00:00Z\",\"tcbStatus\":\"OutOfDate\",\"advisoryIDs\":[\"INTEL-SA-00233\",\"INTEL-SA-00161\",\"INTEL-SA-00220\",\"INTEL-SA-00270\",\"INTEL-SA-00293\",\"INTEL-SA-00219\",\"INTEL-SA-00289\",\"INTEL-SA-00320\",\"INTEL-SA-00329\",\"INTEL-SA-00381\",\"INTEL-SA-00389\",\"INTEL-SA-00477\",\"INTEL-SA-00614\",\"INTEL-SA-00617\",\"INTEL-SA-00828\",\"INTEL-SA-00334\",\"INTEL-SA-00615\"]},{\"tcb\":{\"sgxtcbcomponents\":[{\"svn\":5},{\"svn\":5},{\"svn\":2},{\"svn\":4},{\"svn\":1},{\"svn\":128},{\"svn\":1},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0}],\"pcesvn\":6},\"tcbDate\":\"2018-08-15T00:00:00Z\",\"tcbStatus\":\"OutOfDate\",\"advisoryIDs\":[\"INTEL-SA-00161\",\"INTEL-SA-00233\",\"INTEL-SA-00220\",\"INTEL-SA-00270\",\"INTEL-SA-00293\",\"INTEL-SA-00219\",\"INTEL-SA-00289\",\"INTEL-SA-00320\",\"INTEL-SA-00329\",\"INTEL-SA-00381\",\"INTEL-SA-00389\",\"INTEL-SA-00477\",\"INTEL-SA-00614\",\"INTEL-SA-00617\",\"INTEL-SA-00828\",\"INTEL-SA-00334\",\"INTEL-SA-00615\"]},{\"tcb\":{\"sgxtcbcomponents\":[{\"svn\":5},{\"svn\":5},{\"svn\":2},{\"svn\":4},{\"svn\":1},{\"svn\":128},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0}],\"pcesvn\":7},\"tcbDate\":\"2019-01-09T00:00:00Z\",\"tcbStatus\":\"OutOfDateConfigurationNeeded\",\"advisoryIDs\":[\"INTEL-SA-00161\",\"INTEL-SA-00233\",\"INTEL-SA-00220\",\"INTEL-SA-00270\",\"INTEL-SA-00293\",\"INTEL-SA-00219\",\"INTEL-SA-00289\",\"INTEL-SA-00320\",\"INTEL-SA-00329\",\"INTEL-SA-00381\",\"INTEL-SA-00389\",\"INTEL-SA-00477\",\"INTEL-SA-00614\",\"INTEL-SA-00617\",\"INTEL-SA-00828\",\"INTEL-SA-00334\",\"INTEL-SA-00615\"]},{\"tcb\":{\"sgxtcbcomponents\":[{\"svn\":5},{\"svn\":5},{\"svn\":2},{\"svn\":4},{\"svn\":1},{\"svn\":128},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0}],\"pcesvn\":6},\"tcbDate\":\"2018-08-15T00:00:00Z\",\"tcbStatus\":\"OutOfDateConfigurationNeeded\",\"advisoryIDs\":[\"INTEL-SA-00203\",\"INTEL-SA-00161\",\"INTEL-SA-00233\",\"INTEL-SA-00220\",\"INTEL-SA-00270\",\"INTEL-SA-00293\",\"INTEL-SA-00219\",\"INTEL-SA-00289\",\"INTEL-SA-00320\",\"INTEL-SA-00329\",\"INTEL-SA-00381\",\"INTEL-SA-00389\",\"INTEL-SA-00477\",\"INTEL-SA-00614\",\"INTEL-SA-00617\",\"INTEL-SA-00828\",\"INTEL-SA-00334\",\"INTEL-SA-00615\"]},{\"tcb\":{\"sgxtcbcomponents\":[{\"svn\":4},{\"svn\":4},{\"svn\":2},{\"svn\":4},{\"svn\":1},{\"svn\":128},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0}],\"pcesvn\":5},\"tcbDate\":\"2018-01-04T00:00:00Z\",\"tcbStatus\":\"OutOfDate\",\"advisoryIDs\":[\"INTEL-SA-00106\",\"INTEL-SA-00115\",\"INTEL-SA-00135\",\"INTEL-SA-00203\",\"INTEL-SA-00161\",\"INTEL-SA-00233\",\"INTEL-SA-00220\",\"INTEL-SA-00270\",\"INTEL-SA-00293\",\"INTEL-SA-00219\",\"INTEL-SA-00289\",\"INTEL-SA-00320\",\"INTEL-SA-00329\",\"INTEL-SA-00381\",\"INTEL-SA-00389\",\"INTEL-SA-00477\",\"INTEL-SA-00614\",\"INTEL-SA-00617\",\"INTEL-SA-00828\",\"INTEL-SA-00334\",\"INTEL-SA-00615\"]},{\"tcb\":{\"sgxtcbcomponents\":[{\"svn\":2},{\"svn\":2},{\"svn\":2},{\"svn\":4},{\"svn\":1},{\"svn\":128},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0}],\"pcesvn\":4},\"tcbDate\":\"2017-07-26T00:00:00Z\",\"tcbStatus\":\"OutOfDate\",\"advisoryIDs\":[\"INTEL-SA-00088\",\"INTEL-SA-00106\",\"INTEL-SA-00115\",\"INTEL-SA-00135\",\"INTEL-SA-00203\",\"INTEL-SA-00161\",\"INTEL-SA-00233\",\"INTEL-SA-00220\",\"INTEL-SA-00270\",\"INTEL-SA-00293\",\"INTEL-SA-00219\",\"INTEL-SA-00289\",\"INTEL-SA-00320\",\"INTEL-SA-00329\",\"INTEL-SA-00381\",\"INTEL-SA-00389\",\"INTEL-SA-00477\",\"INTEL-SA-00614\",\"INTEL-SA-00617\",\"INTEL-SA-00828\",\"INTEL-SA-00334\",\"INTEL-SA-00615\"]}]}","signature":[48,69,2,33,0,221,216,165,29,244,22,157,122,77,194,167,48,255,167,235,173,204,16,106,18,62,205,151,182,214,58,208,209,39,164,7,41,2,32,19,87,119,60,132,47,205,202,182,14,178,146,200,123,37,225,242,238,21,140,14,50,47,5,253,22,179,179,217,164,44,4],"ca_chain":["-----BEGIN CERTIFICATE-----\nMIICizCCAjKgAwIBAgIUfjiC1ftVKUpASY5FhAPpFJG99FUwCgYIKoZIzj0EAwIw\naDEaMBgGA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENv\ncnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJ\nBgNVBAYTAlVTMB4XDTE4MDUyMTEwNTAxMFoXDTI1MDUyMTEwNTAxMFowbDEeMBwG\nA1UEAwwVSW50ZWwgU0dYIFRDQiBTaWduaW5nMRowGAYDVQQKDBFJbnRlbCBDb3Jw\nb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNVBAgMAkNBMQswCQYD\nVQQGEwJVUzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABENFG8xzydWRfK92bmGv\nP+mAh91PEyV7Jh6FGJd5ndE9aBH7R3E4A7ubrlh/zN3C4xvpoouGlirMba+W2lju\nypajgbUwgbIwHwYDVR0jBBgwFoAUImUM1lqdNInzg7SVUr9QGzknBqwwUgYDVR0f\nBEswSTBHoEWgQ4ZBaHR0cHM6Ly9jZXJ0aWZpY2F0ZXMudHJ1c3RlZHNlcnZpY2Vz\nLmludGVsLmNvbS9JbnRlbFNHWFJvb3RDQS5kZXIwHQYDVR0OBBYEFH44gtX7VSlK\nQEmORYQD6RSRvfRVMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMAoGCCqG\nSM49BAMCA0cAMEQCIB9C8wOAN/ImxDtGACV246KcqjagZOR0kyctyBrsGGJVAiAj\nftbrNGsGU8YH211dRiYNoPPu19Zp/ze8JmhujB0oBw==\n-----END CERTIFICATE-----\n","-----BEGIN CERTIFICATE-----\nMIICjzCCAjSgAwIBAgIUImUM1lqdNInzg7SVUr9QGzknBqwwCgYIKoZIzj0EAwIw\naDEaMBgGA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENv\ncnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJ\nBgNVBAYTAlVTMB4XDTE4MDUyMTEwNDUxMFoXDTQ5MTIzMTIzNTk1OVowaDEaMBgG\nA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENvcnBvcmF0\naW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJBgNVBAYT\nAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEC6nEwMDIYZOj/iPWsCzaEKi7\n1OiOSLRFhWGjbnBVJfVnkY4u3IjkDYYL0MxO4mqsyYjlBalTVYxFP2sJBK5zlKOB\nuzCBuDAfBgNVHSMEGDAWgBQiZQzWWp00ifODtJVSv1AbOScGrDBSBgNVHR8ESzBJ\nMEegRaBDhkFodHRwczovL2NlcnRpZmljYXRlcy50cnVzdGVkc2VydmljZXMuaW50\nZWwuY29tL0ludGVsU0dYUm9vdENBLmRlcjAdBgNVHQ4EFgQUImUM1lqdNInzg7SV\nUr9QGzknBqwwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwCgYI\nKoZIzj0EAwIDSQAwRgIhAOW/5QkR+S9CiSDcNoowLuPRLsWGf/Yi7GSX94BgwTwg\nAiEA4J0lrHoMs+Xo5o/sX6O9QWxHRAvZUGOdRQ7cvqRXaqI=\n-----END CERTIFICATE-----\n"]} \ No newline at end of file diff --git a/intel-sgx/dcap-artifact-retrieval/tests/data/16a5b41ebb076d263a1e39e64e7175e7.certs b/intel-sgx/dcap-artifact-retrieval/tests/data/16a5b41ebb076d263a1e39e64e7175e7.certs new file mode 100644 index 00000000..4797865e --- /dev/null +++ b/intel-sgx/dcap-artifact-retrieval/tests/data/16a5b41ebb076d263a1e39e64e7175e7.certs @@ -0,0 +1 @@ +{"pck_data":[{"tcb":{"sgxtcbcomponents":[{"svn":20,"category":"","type":""},{"svn":20,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":7,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":13},"tcbm":"141402040180070000000000000000000D00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjTCCBDSgAwIBAgIVAIXG51ITZhjZ8TsE24nlWh2l0uxCMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NTdaFw0zMTA2MjgxNzM4\nNTdaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nPd02hqxQsJEYY0Zdu7K5K4NysP6VRz+P0Earf5CnxxF991hWyu93G3elyzSIWET8\nYtJWxjHfGEmC9FU/TPezS6OCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFJqZmxvecQhTg9uNiM9/\nkvGB99rGMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQiiX4TAHuJiOdGQvi6RASkDCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgEUMBAGCyqGSIb4TQENAQIC\nAgEUMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBBzAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBDTAfBgsqhkiG+E0BDQEC\nEgQQFBQCBAGABwAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNHADBEAiBz\na8d5xkrqcL9Jse/b2AfbSBxLv5UVQJWgwiaM2i6kyQIgXC00Y8IlAklheGi0+LE7\nEjCh8uHwWQSVJFjKoo/OMsY=\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":20,"category":"","type":""},{"svn":20,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":13},"tcbm":"141402040180000000000000000000000D00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDSgAwIBAgIVAKiHtqpAgwVmQnvUbNnRRzBrC4HLMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NTdaFw0zMTA2MjgxNzM4\nNTdaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\n7FxCzKhIM6kTCcn6GRFz3S/xPP/3V8RpOj/pa5jmtLw3ahm5LQvLFHbevrYoHNhH\njsWVR56nJDIDYeqnJ4J3KaOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFI1dDNsbHMu9wy14FiGh\nFkofrhc4MA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQiiX4TAHuJiOdGQvi6RASkDCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgEUMBAGCyqGSIb4TQENAQIC\nAgEUMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBADAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBDTAfBgsqhkiG+E0BDQEC\nEgQQFBQCBAGAAAAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNIADBFAiBp\ngtT3EwoiB7ecP7aJBZM/ya0w63VIOWizbMn7UGcNIAIhALiJxWP7Xm0KD/AgHmLk\nrBTOj3lYCWmDVjnSwRPNULja\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":19,"category":"","type":""},{"svn":19,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":7,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":13},"tcbm":"131302040180070000000000000000000D00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjTCCBDOgAwIBAgIUCMAzy5GzHCYEQxGHSuttdD3uP2MwCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1N1oXDTMxMDYyODE3Mzg1\nN1owcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAT7\np9kLLOIYoEhowQdIeGWe/YnoMKNtbqLX5UtCdNOJ0eNMa4RhKs9YYIIxduxdWuVk\npeGLUC8ibs9CAVKtv9cwo4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQU9cahVgAz2iq6ncgxFWD4\nJE/9KkEwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCKJfhMAe4mI50ZC+LpEBKQMIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECARMwEAYLKoZIhvhNAQ0BAgIC\nARMwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEHMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgENMB8GCyqGSIb4TQENAQIS\nBBATEwIEAYAHAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0gAMEUCIQDx\n9KscQxGiJWbH9FKgC+RK8oS9BjSsPAh0Yno+AOXE3QIgCY4vKIi+ZguEz7Oo8BOJ\n9Ixl6mjFQZ7E021l6adusJ8=\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":19,"category":"","type":""},{"svn":19,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":13},"tcbm":"131302040180000000000000000000000D00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDOgAwIBAgIUUDIr3p1PQakAjhCI9HtMZeJl1zMwCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1N1oXDTMxMDYyODE3Mzg1\nN1owcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASA\noHu6he3Cj/ntWQygD7elV2UoE/NPKu0w9R6t9n42lfNq0J1kyDkuUIU3aXVdg90w\ny1N3ZF+uusN1NZZIfILmo4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQUtaPAcScn1956ZOOL9nPQ\nNhd59z8wDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCKJfhMAe4mI50ZC+LpEBKQMIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECARMwEAYLKoZIhvhNAQ0BAgIC\nARMwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEAMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgENMB8GCyqGSIb4TQENAQIS\nBBATEwIEAYAAAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0kAMEYCIQDH\ntNFYiWKkrrLDh1LYCJC1qgdBkNhVZvU3xJmItYtdXgIhAIxQe2JZjhmHpVnJdqyU\nBxcYf+81iCGqQnphJi7BmghV\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":17,"category":"","type":""},{"svn":17,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":7,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":11},"tcbm":"111102040180070000000000000000000B00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDSgAwIBAgIVANDaO9oj0UHoLy+pELIdXKh1lyETMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NTdaFw0zMTA2MjgxNzM4\nNTdaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nN+pJYkSdRkjCWRXKG6nPCgAIbASNC5gBVDS1cDkOihwqB1XbmJq6ptSovrZzbRev\nGt/98ltZbCDXZs1HGIn9fqOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFH21wvZ0Y6EMafEd8zK7\nR6kFo5CqMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQiiX4TAHuJiOdGQvi6RASkDCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgERMBAGCyqGSIb4TQENAQIC\nAgERMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBBzAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBCzAfBgsqhkiG+E0BDQEC\nEgQQERECBAGABwAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNIADBFAiAr\nvUfywcmywzTVrQrvtHm60ynlfSXrkzldmLThkTnpPAIhAJ20CSjzHCC/1uIQ7zwI\ny6qVmaTK3uviWtQbOw/YRq4p\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":17,"category":"","type":""},{"svn":17,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":7,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":10},"tcbm":"111102040180070000000000000000000A00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDOgAwIBAgIUU4vNoONgGWlpV7HLnX1QTIYRpY8wCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1N1oXDTMxMDYyODE3Mzg1\nN1owcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATw\nR0K22EMjUPTYKhci6GlGWOsIPjU9KCV55vu/bxxp+Cjx6hqN/RVJr5xLndjethZX\n1TQUnSf4AlGjeJ5UtfG2o4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQU8Tp+81/fNU3pe2pZvpfc\n2Y1chKAwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCKJfhMAe4mI50ZC+LpEBKQMIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAREwEAYLKoZIhvhNAQ0BAgIC\nAREwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEHMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgEKMB8GCyqGSIb4TQENAQIS\nBBAREQIEAYAHAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0kAMEYCIQCF\nbvMAh4b1a0duKenPR5CHHwtS8uSyx1AmyO+/oV/L7gIhAJsLp75Pd8Uuwnt4s3g2\nEWwJTMJKUJRzHCW6/tLtJpr/\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":17,"category":"","type":""},{"svn":17,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":11},"tcbm":"111102040180000000000000000000000B00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDSgAwIBAgIVAIBwMps4i9bo2kA50WW+9XlZJmRAMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NTdaFw0zMTA2MjgxNzM4\nNTdaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nxrFUo5qnqF+hA/6G7L3ZQv6lxFljJrPklFaar3R/W2qmIMPHS/PJMgyQdYvY7QfH\nOdYivSQTXwaZ0k2p/7lhU6OCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFCXufndH006ombv1scKs\nQvmEP2TeMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQiiX4TAHuJiOdGQvi6RASkDCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgERMBAGCyqGSIb4TQENAQIC\nAgERMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBADAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBCzAfBgsqhkiG+E0BDQEC\nEgQQERECBAGAAAAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNIADBFAiEA\niQUj+HTL4l6gGhD29VORm+aml4E1qZ+lkjdkPc7jvHQCIB/uMaTvvsIBLMjamvxL\nfgvp977lTL2GiLeKHUk+lXSj\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":17,"category":"","type":""},{"svn":17,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":10},"tcbm":"111102040180000000000000000000000A00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDSgAwIBAgIVAIsgdM4j1hH20+6b8bg2glRo8yBIMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NTdaFw0zMTA2MjgxNzM4\nNTdaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nj2TTyDdE1Xa/fWLCtZPSdASBgVXd2e+g2d0QuSMTdu5v3zn4rJIo6NFTlh2CETJM\nqapvbnmC9ekoOezDjdtr8qOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFEBlYkuIeqziIyg8bsZA\nGN/qs3D0MA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQiiX4TAHuJiOdGQvi6RASkDCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgERMBAGCyqGSIb4TQENAQIC\nAgERMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBADAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBCjAfBgsqhkiG+E0BDQEC\nEgQQERECBAGAAAAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNIADBFAiAE\nc8M2qqPb6l3wL9gG683sZx63tbXBS8BWz6OaLJopEQIhALFAup0xkvfPDK/t9yck\n8Yr/qjSS9LioS4KLJSJXmCkl\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":15,"category":"","type":""},{"svn":15,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":7,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":10},"tcbm":"0F0F02040180070000000000000000000A00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDSgAwIBAgIVAIpOeGiztAaVpCCNoAJTupTcMgXvMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NTdaFw0zMTA2MjgxNzM4\nNTdaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\npQLJAHcVQnsYPDg2z26TT4y+oHpDqBzkrLFLQw/1mWWl7P1nW167YuaJPyYxpT7e\nLzySlPvMDU8DEgCyHFFbyqOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFGevdYViUlETy/WP/BNJ\naVIiPwOuMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQiiX4TAHuJiOdGQvi6RASkDCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgEPMBAGCyqGSIb4TQENAQIC\nAgEPMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBBzAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBCjAfBgsqhkiG+E0BDQEC\nEgQQDw8CBAGABwAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNIADBFAiEA\n7IPVAyGvl6e6hYTBEYIOkdPlo3iAJQjM/iluO+Olv4cCICm04qjZTEHfkGZtUiGo\n7KSWzoyqIsqX875UxoJrM5F6\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":15,"category":"","type":""},{"svn":15,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":10},"tcbm":"0F0F02040180000000000000000000000A00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjDCCBDOgAwIBAgIUc0lS0Rx9xbH7//5qrR2kylMhQgUwCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1N1oXDTMxMDYyODE3Mzg1\nN1owcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARY\nW68Gcr+oYIdkZjN+ADA+E1qeubn9qJp1WTxNCOu2RK81txu8qblYTgBuXVqAiSLr\nIC2hN9vRzWzlN9orhSkZo4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQUfkP4nuMwmBcjjZbwBhlR\nysJluFcwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCKJfhMAe4mI50ZC+LpEBKQMIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAQ8wEAYLKoZIhvhNAQ0BAgIC\nAQ8wEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEAMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgEKMB8GCyqGSIb4TQENAQIS\nBBAPDwIEAYAAAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0cAMEQCIDy9\npKt/lEXMkx+s5pE563S5jGCQevG3UZyXVPaNdq/dAiA+Wv/ENpKRcYonFL/7Ddr+\nTWjwvkjRnmMN4xbAygYvNQ==\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":14,"category":"","type":""},{"svn":14,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":7,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":10},"tcbm":"0E0E02040180070000000000000000000A00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjDCCBDOgAwIBAgIUaA6/OlxWura+UThAcuAuQ99oS2gwCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1N1oXDTMxMDYyODE3Mzg1\nN1owcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR5\nYgwAQkLkCL/umv1RT0MyBc+6a353iz8IeASaLIJrx/DHblhrCckmN6P13Cyan1xE\nHeEn2EefqTQSmWc4gkwpo4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQU0fRvmbB+iNyGOzWtw0cy\nXuqc7CEwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCKJfhMAe4mI50ZC+LpEBKQMIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAQ4wEAYLKoZIhvhNAQ0BAgIC\nAQ4wEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEHMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgEKMB8GCyqGSIb4TQENAQIS\nBBAODgIEAYAHAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0cAMEQCIFr0\nGc5NRbawTM9TM4+aDv2R+t82+3Gp/q/Dg35hSa1HAiAjzbWoMpzVkxyR3fU8Chje\nzqrM2n/hrDRlpGKFxZsiJw==\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":14,"category":"","type":""},{"svn":14,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":10},"tcbm":"0E0E02040180000000000000000000000A00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjTCCBDOgAwIBAgIUFEg/XACiFiY7o4Pe/DRhTBzy/FMwCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1N1oXDTMxMDYyODE3Mzg1\nN1owcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQE\nMWwbalWtJf7ttIUuZiQuTBJXm/RMttOBXWdYWJ+S8wdKzRwf9DPkXbWbB4V01uP5\n4B2L0pL4lEyV1+3BBUt7o4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQUO3KgZCzCCC2LqGxkRnhz\n5u0p7eIwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCKJfhMAe4mI50ZC+LpEBKQMIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAQ4wEAYLKoZIhvhNAQ0BAgIC\nAQ4wEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEAMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgEKMB8GCyqGSIb4TQENAQIS\nBBAODgIEAYAAAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0gAMEUCIQCx\nyVcvHc9hRZ5O4orBh3V5wqu52YtrcUct1jZJSNKLcwIgLekl4UargOwbqw3QaSA0\npXzC7rB9zR3iLJjb1GyfCyQ=\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":13,"category":"","type":""},{"svn":13,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":3,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":9},"tcbm":"0D0D02040180030000000000000000000900","cert":"-----BEGIN CERTIFICATE-----\nMIIEjTCCBDOgAwIBAgIUAISq+XrTHIjD8SJmFtsVX7yXZfcwCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1N1oXDTMxMDYyODE3Mzg1\nN1owcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATR\n/AdaOnn0hItQjKtL3yPtzrcvT2BFh3d67ThV34Yy/Hx+DMrryhJd6AuRk1abZPD1\nmP500fLy2/hEpZEI0zdIo4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQUWtlGVt6QYDqkVUijMR3e\n4HSi1sgwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCKJfhMAe4mI50ZC+LpEBKQMIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAQ0wEAYLKoZIhvhNAQ0BAgIC\nAQ0wEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEDMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgEJMB8GCyqGSIb4TQENAQIS\nBBANDQIEAYADAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0gAMEUCIQCk\nlRsk70MX2o/PWCprCHudEN/e8KTFohFUtMQjqJDqmgIgPRmoa0t11LaCCijLCHWC\naDG/HYGBkjMmFFJFd7jdVOQ=\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":13,"category":"","type":""},{"svn":13,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":9},"tcbm":"0D0D02040180000000000000000000000900","cert":"-----BEGIN CERTIFICATE-----\nMIIEjDCCBDOgAwIBAgIUbM7SX/lKO+HIt1TUsMBYJadH7CwwCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1N1oXDTMxMDYyODE3Mzg1\nN1owcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARV\nCE0MNpONh06OxeMhIYMZswkFzTbw8IKUP3DBOkRo5EWC3GTgbKlhW9rpUjgzKEYt\nq9LCQYACY8Np1glF7MIVo4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQUxsvdneHrK5CWHy6EcV+R\ne4OWejMwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCKJfhMAe4mI50ZC+LpEBKQMIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAQ0wEAYLKoZIhvhNAQ0BAgIC\nAQ0wEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEAMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgEJMB8GCyqGSIb4TQENAQIS\nBBANDQIEAYAAAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0cAMEQCIBwX\ntNXlhG/zS0lFkKt5C4fnAhKtX6ZUEsk0/e5AAL4MAiAai6WcVnLqeSri/4+yGkhs\nZlTz+PPuDFVw/OPGUGF6tA==\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":6,"category":"","type":""},{"svn":6,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":7},"tcbm":"060602040180010000000000000000000700","cert":"-----BEGIN CERTIFICATE-----\nMIIEjTCCBDSgAwIBAgIVAOrAVvYS5WpzAQvbdDs6RWPcKeCXMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NTdaFw0zMTA2MjgxNzM4\nNTdaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nOOhPgl2oGn++1eMTKO/MwQ9oXDV7z5i2Tk3XTGk3dY97BW4KWS5MmuFw/SNzx5BE\nWTHkGiebO5k/AEgZxb78tKOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFIQr6knjx4EzmN7JjesA\nxeCzhdTgMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQiiX4TAHuJiOdGQvi6RASkDCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgEGMBAGCyqGSIb4TQENAQIC\nAgEGMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBATAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBBzAfBgsqhkiG+E0BDQEC\nEgQQBgYCBAGAAQAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNHADBEAiB/\nKu08r/BbYvfWkTZWOFBRHoJ6NtNt8MvzDDDGIjw1EgIgRrF/GF7i17VzVTms8dXE\nuRaJw4UXaGBRIOC/Y8Q5J0I=\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":6,"category":"","type":""},{"svn":6,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":7},"tcbm":"060602040180000000000000000000000700","cert":"-----BEGIN CERTIFICATE-----\nMIIEjzCCBDSgAwIBAgIVAKAXnoCsWOuZX2uqV7U2U5jPN+jTMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NTdaFw0zMTA2MjgxNzM4\nNTdaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\n1NTfASxQBZuA3X14ChhaLrz/+w+zhi55kUDd7OSqeLQ9K0OcwbQGpYJrPnetUkiE\nnDakks/8Y6gIhtOLfwrfTqOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFC18mc89PVpAzwIf/he4\nwD1gta5kMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQiiX4TAHuJiOdGQvi6RASkDCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgEGMBAGCyqGSIb4TQENAQIC\nAgEGMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBADAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBBzAfBgsqhkiG+E0BDQEC\nEgQQBgYCBAGAAAAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNJADBGAiEA\nkNUuwsh64k98A9sJZV9psSHZarAIahQLih5CJCSpGrkCIQD2gBvOUIW7dYlYYO1C\nWesvEOYwuh///POFISbylr+qgQ==\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":5,"category":"","type":""},{"svn":5,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":7},"tcbm":"050502040180010000000000000000000700","cert":"-----BEGIN CERTIFICATE-----\nMIIEjzCCBDSgAwIBAgIVAKyf8iOkx9l1pG2msZXSDg+ad75aMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NTdaFw0zMTA2MjgxNzM4\nNTdaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\n9YDa+UwVuIWzZ9uLtJiKHcO88DmOY6iX6bM8wE6+lB6tbzwpXX3qZgknRxEX8mjT\ni3OqXbUckuGSotIanXeRGqOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFHZG//9OWGT1XcAFAWZT\nqQrzZS3wMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQiiX4TAHuJiOdGQvi6RASkDCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgEFMBAGCyqGSIb4TQENAQIC\nAgEFMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBATAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBBzAfBgsqhkiG+E0BDQEC\nEgQQBQUCBAGAAQAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNJADBGAiEA\nls9+xcjuEnai0Ej0KDXQhiwAj81+CgL0IiJUVdlckt4CIQD1dgXRG3OiNhrA/lb0\nqoVKDwE/TBr/4U6QCV6zjKoRNQ==\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":5,"category":"","type":""},{"svn":5,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":6},"tcbm":"050502040180010000000000000000000600","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDSgAwIBAgIVAOIlvuhq58Mxj5+WQxxBthBgDfGwMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NTdaFw0zMTA2MjgxNzM4\nNTdaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nc39I9pqv5jyC0NPoP5KPFLcpPadl7Rg+85jmeIC7GQrJcbIsgs9Y1iOXSlzF2KtC\nk1H3gbV3fr9AWP/x+J8PfKOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFGnmZLE2bmotcLrrb2JY\niV38lMjUMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQiiX4TAHuJiOdGQvi6RASkDCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgEFMBAGCyqGSIb4TQENAQIC\nAgEFMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBATAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBBjAfBgsqhkiG+E0BDQEC\nEgQQBQUCBAGAAQAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNIADBFAiAe\nAjJRWkcKqBbXaWHjTUSBobcFtn0jh2wUygpzpwt/6wIhAJKe60QxtWYcd8HNVqAy\nq/smAo9C15zm0f97SKS4uznM\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":5,"category":"","type":""},{"svn":5,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":7},"tcbm":"050502040180000000000000000000000700","cert":"-----BEGIN CERTIFICATE-----\nMIIEjDCCBDOgAwIBAgIUPOEcgi7nXTd3vXKF1FlEIomj/kEwCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1N1oXDTMxMDYyODE3Mzg1\nN1owcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAST\nu57n8UgmvMvL4sOv3zPcLFXIaj+v/squEcIoCMK7Gvnjyi+twY0WXJ+3fbpbgOcZ\nvqiumstQHg/1YgoGUxt4o4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQUOxhxxzEPvw98Ubk/qxLG\nlca6j90wDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCKJfhMAe4mI50ZC+LpEBKQMIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAQUwEAYLKoZIhvhNAQ0BAgIC\nAQUwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEAMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgEHMB8GCyqGSIb4TQENAQIS\nBBAFBQIEAYAAAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0cAMEQCICM7\nuFGGG4nRH0vWK6KsJSFz3DDhktpB2nzDEvj81OVvAiAIl9I12nXCs/FWVEO/peD6\nL/poYtFn7R6JeFhFeTOjfg==\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":5,"category":"","type":""},{"svn":5,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":6},"tcbm":"050502040180000000000000000000000600","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDSgAwIBAgIVAMrc0FNx0ZIQwPgBqiDyTvdYAxMuMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NTdaFw0zMTA2MjgxNzM4\nNTdaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nQcat/j9g4Uhbjo9wLdKGQHRIshSdTp/FDTECIgsRCdmrU503vGT5dKpt07Tv8/Zs\nnedCgcCSi9xNkUX4vKPOaqOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFEH1IL40Bd0GPJbsh5Ua\nayfXQcmQMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQiiX4TAHuJiOdGQvi6RASkDCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgEFMBAGCyqGSIb4TQENAQIC\nAgEFMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBADAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBBjAfBgsqhkiG+E0BDQEC\nEgQQBQUCBAGAAAAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNIADBFAiAI\njS69K4T1BfxcPjD88z8UUyFPPvjLTTJb8mMVor12eQIhAILA0deoB+ETPXHHZSGT\nY03A43V6zANKmjGOIjvhcu+l\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":4,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":5},"tcbm":"040402040180000000000000000000000500","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDSgAwIBAgIVAIe4WqHapTuI5OsPxchRPLiUBzFeMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NTdaFw0zMTA2MjgxNzM4\nNTdaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nBKhhMdxTGcSjtvsZuOEr98wjth//p1+EU5Adc/WeFXt2U+rczZ3y1a25kQOaAmN4\njj1xzSh/JBMQ5Eb2OWfuNqOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFEDr/Ccsz0rtCBUmtI8A\nZ/JSofdSMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQiiX4TAHuJiOdGQvi6RASkDCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgEEMBAGCyqGSIb4TQENAQIC\nAgEEMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBADAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBBTAfBgsqhkiG+E0BDQEC\nEgQQBAQCBAGAAAAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNIADBFAiB1\neKJIdwLeXEZ0Ns3SmrgyryyvQogfcnSIW+R2IoaGigIhAIFa55guq1b08k+nNBx3\nKg4i+9Oa/KnTm56IArdgTrVa\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":2,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":4},"tcbm":"020202040180000000000000000000000400","cert":"-----BEGIN CERTIFICATE-----\nMIIEjTCCBDOgAwIBAgIUSC2YgjY27wNHGe3nZJNZR91Gl08wCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1N1oXDTMxMDYyODE3Mzg1\nN1owcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR4\nu0VJTljEyBhxghJkIGqSGFsq/SL65vVheliqeD8F1rw5I9zphB/DsnFMsdQxOygS\ng8cIv0rdYHNCT7C3mVdio4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQUMZj6hRnZT6MPat51axfR\nl3R5sH8wDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCKJfhMAe4mI50ZC+LpEBKQMIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAQIwEAYLKoZIhvhNAQ0BAgIC\nAQIwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEAMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgEEMB8GCyqGSIb4TQENAQIS\nBBACAgIEAYAAAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0gAMEUCIQCE\nNZaUJcC+ZkvxznysIl+ucx7gX781ceGmM5UlDAEajQIgRKBfZaJmBmsjbbA5KnQm\nh2ZDgn+FaGx5p4BJyNOgdA4=\n-----END CERTIFICATE-----\n"}],"ca_chain":["-----BEGIN CERTIFICATE-----\nMIICmDCCAj6gAwIBAgIVANDoqtp11/kuSReYPHsUZdDV8llNMAoGCCqGSM49BAMC\nMGgxGjAYBgNVBAMMEUludGVsIFNHWCBSb290IENBMRowGAYDVQQKDBFJbnRlbCBD\nb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNVBAgMAkNBMQsw\nCQYDVQQGEwJVUzAeFw0xODA1MjExMDUwMTBaFw0zMzA1MjExMDUwMTBaMHExIzAh\nBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQKDBFJbnRl\nbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNVBAgMAkNB\nMQswCQYDVQQGEwJVUzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABL9q+NMp2IOg\ntdl1bk/uWZ5+TGQm8aCi8z78fs+fKCQ3d+uDzXnVTAT2ZhDCifyIuJwvN3wNBp9i\nHBSSMJMJrBOjgbswgbgwHwYDVR0jBBgwFoAUImUM1lqdNInzg7SVUr9QGzknBqww\nUgYDVR0fBEswSTBHoEWgQ4ZBaHR0cHM6Ly9jZXJ0aWZpY2F0ZXMudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9JbnRlbFNHWFJvb3RDQS5kZXIwHQYDVR0OBBYEFNDo\nqtp11/kuSReYPHsUZdDV8llNMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAG\nAQH/AgEAMAoGCCqGSM49BAMCA0gAMEUCIQCJgTbtVqOyZ1m3jqiAXM6QYa6r5sWS\n4y/G7y8uIJGxdwIgRqPvBSKzzQagBLQq5s5A70pdoiaRJ8z/0uDz4NgV91k=\n-----END CERTIFICATE-----\n","-----BEGIN CERTIFICATE-----\nMIICjzCCAjSgAwIBAgIUImUM1lqdNInzg7SVUr9QGzknBqwwCgYIKoZIzj0EAwIw\naDEaMBgGA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENv\ncnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJ\nBgNVBAYTAlVTMB4XDTE4MDUyMTEwNDUxMFoXDTQ5MTIzMTIzNTk1OVowaDEaMBgG\nA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENvcnBvcmF0\naW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJBgNVBAYT\nAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEC6nEwMDIYZOj/iPWsCzaEKi7\n1OiOSLRFhWGjbnBVJfVnkY4u3IjkDYYL0MxO4mqsyYjlBalTVYxFP2sJBK5zlKOB\nuzCBuDAfBgNVHSMEGDAWgBQiZQzWWp00ifODtJVSv1AbOScGrDBSBgNVHR8ESzBJ\nMEegRaBDhkFodHRwczovL2NlcnRpZmljYXRlcy50cnVzdGVkc2VydmljZXMuaW50\nZWwuY29tL0ludGVsU0dYUm9vdENBLmRlcjAdBgNVHQ4EFgQUImUM1lqdNInzg7SV\nUr9QGzknBqwwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwCgYI\nKoZIzj0EAwIDSQAwRgIhAOW/5QkR+S9CiSDcNoowLuPRLsWGf/Yi7GSX94BgwTwg\nAiEA4J0lrHoMs+Xo5o/sX6O9QWxHRAvZUGOdRQ7cvqRXaqI=\n-----END CERTIFICATE-----\n"]} \ No newline at end of file diff --git a/intel-sgx/dcap-artifact-retrieval/tests/data/53700d9403f4b311b9c5ec7d04c558bd.certs b/intel-sgx/dcap-artifact-retrieval/tests/data/53700d9403f4b311b9c5ec7d04c558bd.certs new file mode 100644 index 00000000..29c13e92 --- /dev/null +++ b/intel-sgx/dcap-artifact-retrieval/tests/data/53700d9403f4b311b9c5ec7d04c558bd.certs @@ -0,0 +1 @@ +{"pck_data":[{"tcb":{"sgxtcbcomponents":[{"svn":20,"category":"","type":""},{"svn":20,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":7,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":13},"tcbm":"141402040180070000000000000000000D00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjTCCBDOgAwIBAgIUTcVCtvuTbZykvBXE5xwXArcjMs8wCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1N1oXDTMxMDYyODE3Mzg1\nN1owcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARJ\ntDbsQVwc+sWaQZIXbQ09OhbTi2lK5yxf7CLxRFw2ZuTGcskjV/rdyd1PHyXOgVmf\n9yAMDNvtcf3of9uDWRD+o4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQU7neXMt1bG0fzhijPJODg\nxRMmlPcwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCp8jmoBbfZOPWw6oc7adunMIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECARQwEAYLKoZIhvhNAQ0BAgIC\nARQwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEHMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgENMB8GCyqGSIb4TQENAQIS\nBBAUFAIEAYAHAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0gAMEUCIQC0\nzNTGlZ6dtQeyOVGYRCZyWTRHaPFFdo6X7ZxbdXeUigIgUtGs+zpNJXddrWtu/Zi9\nzAUUawKej4/IxARYcZLdJF8=\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":20,"category":"","type":""},{"svn":20,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":13},"tcbm":"141402040180000000000000000000000D00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjTCCBDOgAwIBAgIUNw+BYfCulx4iNDNLPVg/sHUC+tgwCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1N1oXDTMxMDYyODE3Mzg1\nN1owcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASL\nTDFrnz8jO9ZCWIniTe7Bjoaum7Tww6COJfk7Z8Wmx2X8N8D7KZgs8xtYlotWieNW\nqngEdYDCmJellWR7qsYYo4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQUL5CqcolqZiT+TBjDQwS7\nHq6XzlAwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCp8jmoBbfZOPWw6oc7adunMIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECARQwEAYLKoZIhvhNAQ0BAgIC\nARQwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEAMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgENMB8GCyqGSIb4TQENAQIS\nBBAUFAIEAYAAAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0gAMEUCIGhb\nXXk82MnGTkJZ6CAbixNzy19M6WA2bynIri85ZxTVAiEAm/4ICSY8MKgXtZkS1Ttm\nK0fTj6tzDcHirkFj0i3prfo=\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":19,"category":"","type":""},{"svn":19,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":7,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":13},"tcbm":"131302040180070000000000000000000D00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDSgAwIBAgIVANqAZgHrcDBUlTQrrzQ3q7oMmvpxMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NTdaFw0zMTA2MjgxNzM4\nNTdaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\n6Ioin0sSl8oTgG5k9BFcQHrTUndotlaoyOBqDMAKR5Y8FGk8lVGO6Ok6Y4G3lbfO\nIEdkY3Kc32HSu3YNFrikKqOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFIASgy18lqFIR2iNrf9D\ngaxtJeROMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQqfI5qAW32Tj1sOqHO2nbpzCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgETMBAGCyqGSIb4TQENAQIC\nAgETMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBBzAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBDTAfBgsqhkiG+E0BDQEC\nEgQQExMCBAGABwAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNIADBFAiEA\ngapwQVZ5FYBTgcpmrl3MEs0k94VHNi4htwQfuDjifhwCIHd6faZnf5Ga02gnpSSM\nlI69UVepCPA5OIZWXqfcAhLE\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":19,"category":"","type":""},{"svn":19,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":13},"tcbm":"131302040180000000000000000000000D00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjzCCBDSgAwIBAgIVANp47XoMQGrk4v19Fxowq+B6WtlFMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NTdaFw0zMTA2MjgxNzM4\nNTdaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nd227/LfI0u349NaV6xaP2uR8Mgo2GRDQvdm9pN6NdBzQeRxoPjGb2/zijx+/mK04\nBd2G8gCGqNu17tJEqikqGqOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFDauNPmRTTos5aY/xnz8\nNVtSLeCOMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQqfI5qAW32Tj1sOqHO2nbpzCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgETMBAGCyqGSIb4TQENAQIC\nAgETMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBADAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBDTAfBgsqhkiG+E0BDQEC\nEgQQExMCBAGAAAAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNJADBGAiEA\nmdCjiP2oAfLkkhkUQQldfpZcKgwrc0mJQw9YnmwHYfgCIQCtlsBYDnNxKhrxm7uw\nMEW76GfthUbdbjJP1TJMkktDDA==\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":17,"category":"","type":""},{"svn":17,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":7,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":11},"tcbm":"111102040180070000000000000000000B00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjzCCBDSgAwIBAgIVAJLACX/R8uiJZYo0Nvxg9a0AIVB7MAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NTdaFw0zMTA2MjgxNzM4\nNTdaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nyjzsUbkJyqlQP3I8KpAYeVk+kZX3XIECkgl1v9G11dywglITkctP0Tn7LhrhkzXH\nmamBXkGK8Mt5e/fWWDM1KqOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFO7Cp1XppQrz0ajMn2f3\n3SZSzm3KMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQqfI5qAW32Tj1sOqHO2nbpzCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgERMBAGCyqGSIb4TQENAQIC\nAgERMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBBzAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBCzAfBgsqhkiG+E0BDQEC\nEgQQERECBAGABwAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNJADBGAiEA\nvnMRnWUaSQL0mfK74PghmWvAytxXE++cOfUg6hQX13cCIQCvOiBRgkGyjpQdc1l9\nUvI4tJjGhT843dOFZc4mj+/Y1A==\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":17,"category":"","type":""},{"svn":17,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":7,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":10},"tcbm":"111102040180070000000000000000000A00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjTCCBDOgAwIBAgIUD1/5Ak8qrvs2PfXRVOcOcWanjbswCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1N1oXDTMxMDYyODE3Mzg1\nN1owcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARO\noNQdyvkbn7/ROgZMLqMvKzrjFXbXpMvGPVtOBhWQJuf6IVuXmHnN2ZxUltISWaW/\nGnTIgMov1NcQoJfU+lh2o4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQUVxM3pi5Wt2G5DyNB2lPp\nnFFh4LYwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCp8jmoBbfZOPWw6oc7adunMIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAREwEAYLKoZIhvhNAQ0BAgIC\nAREwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEHMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgEKMB8GCyqGSIb4TQENAQIS\nBBAREQIEAYAHAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0gAMEUCIBwT\nDA8q3XOCE3i7tulXtC0jC9ZSFG0pmGZTm7vUhwK/AiEAyttBxaTB1PEu6hhEzuPY\nG34WtxL9lBOxCb5J/OspygM=\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":17,"category":"","type":""},{"svn":17,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":11},"tcbm":"111102040180000000000000000000000B00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDOgAwIBAgIUSVl0Esqru78zFV+1PB0N8PxJxBMwCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1N1oXDTMxMDYyODE3Mzg1\nN1owcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR6\n0e3lftJXEkADt17lfzpLwHtokdIjaQ8anzxQ0hT9yvcVV3REaXJ3HtEZQbaZl3+N\n2O5tOC2na5moaqhUvizKo4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQUoF9BhM/Ohm/UlvsGVU/y\nPPjF8dMwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCp8jmoBbfZOPWw6oc7adunMIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAREwEAYLKoZIhvhNAQ0BAgIC\nAREwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEAMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgELMB8GCyqGSIb4TQENAQIS\nBBAREQIEAYAAAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0kAMEYCIQDV\n/IXssqpQ5O6GH8Og+TD/AkZfwBUDo5VKAerminXA9gIhAMuLyUVu3BH6tu+PSi/j\nsRifY7k0oYTJaJ7P253loR7T\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":17,"category":"","type":""},{"svn":17,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":10},"tcbm":"111102040180000000000000000000000A00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjzCCBDSgAwIBAgIVANnbYDuBJC/7bK05ECJZs1pB8+kdMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NTdaFw0zMTA2MjgxNzM4\nNTdaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nQbx7gEOp0p/UJzbLyKZKQqmcuiyugiFrdHcbUXvkwYW2PF3eVLxz5PfwbJNHAZ3H\nkC8u54IbNBbL50YPtRw2DqOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFB/5cacdtBhaj54TmnLt\nQTSV/UB5MA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQqfI5qAW32Tj1sOqHO2nbpzCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgERMBAGCyqGSIb4TQENAQIC\nAgERMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBADAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBCjAfBgsqhkiG+E0BDQEC\nEgQQERECBAGAAAAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNJADBGAiEA\ntE8+RtwY0iIrJqVSwy2Gmi4SoN0/+rKKKZKcsxxltusCIQCXu6kiF0X4Y61Gx++d\n1vkRTY3dwq+KKksyqd9YiYW0jg==\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":15,"category":"","type":""},{"svn":15,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":7,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":10},"tcbm":"0F0F02040180070000000000000000000A00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjDCCBDOgAwIBAgIUUpFJGs0tYiPrZsSOEQGyDRNSCecwCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1N1oXDTMxMDYyODE3Mzg1\nN1owcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASS\nNuYPrjQCh0yO5UaxS28AJZLdg9Y9LXtUoYsGuFjGBN9sd2wGVf9kCZZz9dU8opLQ\nCXv6Lxjur059uZOmg8pYo4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQUdckCms3MO5Jy3V1IHG22\nXV9+PlIwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCp8jmoBbfZOPWw6oc7adunMIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAQ8wEAYLKoZIhvhNAQ0BAgIC\nAQ8wEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEHMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgEKMB8GCyqGSIb4TQENAQIS\nBBAPDwIEAYAHAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0cAMEQCIB2c\nyY7rB+Yzr098IHo4nxGGuQ8vlTzcJGxAycpepZNWAiAeWMXXP774jZjzlFRTZ2fK\nUMjvazhPTTfdxNNzYZrkfQ==\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":15,"category":"","type":""},{"svn":15,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":10},"tcbm":"0F0F02040180000000000000000000000A00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDOgAwIBAgIUHT//VW8tqJNa1YsUfsR7SHWYc6MwCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1N1oXDTMxMDYyODE3Mzg1\nN1owcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQF\nq1pTyWXXFiZRiTHVpXme+dEZvQIBSRZuJDLr2vCaAkt2bk8og1b5IHDucTkORjiT\n9dBx0BpB+1XnMdVe6Z1ao4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQUWKbLo1gWHKbrgJDlKtZi\nlpucX3MwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCp8jmoBbfZOPWw6oc7adunMIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAQ8wEAYLKoZIhvhNAQ0BAgIC\nAQ8wEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEAMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgEKMB8GCyqGSIb4TQENAQIS\nBBAPDwIEAYAAAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0kAMEYCIQDl\ndWg1CHcyxgf6hqd9HD8CfKK3QXaCis9M/khalfcfpAIhAJYgdGGubcIvQrXdxPoo\nmZn/NcGIyzmrXfok5n934jsF\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":14,"category":"","type":""},{"svn":14,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":7,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":10},"tcbm":"0E0E02040180070000000000000000000A00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjzCCBDSgAwIBAgIVAPUD3UDEkiX74m6c/uCnfwn7FrP3MAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NTdaFw0zMTA2MjgxNzM4\nNTdaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\n8kudNrhnH9XbFCUcA68DBN2RkAd9JY59CuyreHi0abx7GbWm+cmGhtG48HvAkVQ0\nS6mieIanHsL4h2jLz3Iiy6OCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFFjt8jgz4lRG9AUftOnH\nE3box/3XMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQqfI5qAW32Tj1sOqHO2nbpzCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgEOMBAGCyqGSIb4TQENAQIC\nAgEOMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBBzAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBCjAfBgsqhkiG+E0BDQEC\nEgQQDg4CBAGABwAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNJADBGAiEA\nqCzJr0i6pQpUg1bwGFOBVYNUYayvEjT3fA3TKF+nHe8CIQDZmzw4KbSnlhdvG39B\nSv67zPOPlDD+P6neLupn7I56AA==\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":14,"category":"","type":""},{"svn":14,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":10},"tcbm":"0E0E02040180000000000000000000000A00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDOgAwIBAgIUPlktsWdJbbG6Jq9A1d65lJdHPXAwCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1N1oXDTMxMDYyODE3Mzg1\nN1owcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS9\no+AqmG57pyoYQOhSkRgU4LlDO82UO5keC3L/J4HbMFXIvk1r2z654ChFS1IKjIzV\nKHxSNXGRXNnIS95yvf7Ro4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQUyHNLv7w7wJNMkJJW01k9\njpAUQt0wDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCp8jmoBbfZOPWw6oc7adunMIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAQ4wEAYLKoZIhvhNAQ0BAgIC\nAQ4wEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEAMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgEKMB8GCyqGSIb4TQENAQIS\nBBAODgIEAYAAAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0kAMEYCIQCq\nV+oem0b3gVZSdMkB09jXQQ5bEVZSpzPZP7cVzy7jXQIhAP5OSS/lN4yuYWd9329o\nFeo2QBTzZSkopn2gY8O5PBjq\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":13,"category":"","type":""},{"svn":13,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":3,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":9},"tcbm":"0D0D02040180030000000000000000000900","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDOgAwIBAgIUCOZBVXQa1sUTzlM30BN03Vv/PAgwCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1N1oXDTMxMDYyODE3Mzg1\nN1owcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR1\nHjpWjSeM061ehmta6Lmse33w8R/t9uOJ+wZ5L5Qa2Q4JzmtfSvgMeikL7+0EQgcY\n63uWC4RlMEsBRo/OYHvoo4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQU0RJoZpJ1jPMAKUK+6MfD\nR7i/2T0wDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCp8jmoBbfZOPWw6oc7adunMIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAQ0wEAYLKoZIhvhNAQ0BAgIC\nAQ0wEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEDMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgEJMB8GCyqGSIb4TQENAQIS\nBBANDQIEAYADAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0kAMEYCIQCV\nyTW5qX8C8djA85nxkhCJwCvd62jGXhC0GHpasnnPSQIhAOdb0sO8XUmGUqRoJ8sl\n7tx0dPnXaf1+708Qx2F8KZsR\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":13,"category":"","type":""},{"svn":13,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":9},"tcbm":"0D0D02040180000000000000000000000900","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDOgAwIBAgIUfap0gkOAWvQsuT8/Wc7DranpY6UwCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1N1oXDTMxMDYyODE3Mzg1\nN1owcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASH\nCl3EVj7hSdV0EmTmCST4gIJyocfqxK1sQPVClXxkEuFDOkfNsRrb35FrYOLJAwqR\ng368pqt1hf5Y/q53Qf02o4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQUk8PDAz62K7sAih/uFRH6\n7NUtILowDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCp8jmoBbfZOPWw6oc7adunMIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAQ0wEAYLKoZIhvhNAQ0BAgIC\nAQ0wEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEAMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgEJMB8GCyqGSIb4TQENAQIS\nBBANDQIEAYAAAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0kAMEYCIQDJ\n1z8qbKgSD2roalZJFmk2VOwSUYmcXfEmn/ReDGmLagIhAJkeRKmeAj7FCt6jZkT9\naA35fgi9KayXKzy+u5g2nDY8\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":6,"category":"","type":""},{"svn":6,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":7},"tcbm":"060602040180010000000000000000000700","cert":"-----BEGIN CERTIFICATE-----\nMIIEjTCCBDOgAwIBAgIUVyrAUEXxpTgCUHGnPBBg3I1eonwwCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1N1oXDTMxMDYyODE3Mzg1\nN1owcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAT9\nxZfPFzIdmqN6GjdXQtdfPggyYuSOge8jS/SE0T4h/0J7ZiZvut0RYQq89Tj5Ykp8\n9T1SWejkky0eX3vGgLhLo4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQU1ZyIjpWJnkhiBmR7pcua\n/G3xSB0wDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCp8jmoBbfZOPWw6oc7adunMIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAQYwEAYLKoZIhvhNAQ0BAgIC\nAQYwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEBMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgEHMB8GCyqGSIb4TQENAQIS\nBBAGBgIEAYABAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0gAMEUCIFDs\nxiHRG0cJ1ar89BkJiGbUkyhxl2qlDQFR35f9VI90AiEAqR/EG3zW5XH4qT0YjnVN\ntlMlO+zOG4BRTvXQIaWxoNs=\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":6,"category":"","type":""},{"svn":6,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":7},"tcbm":"060602040180000000000000000000000700","cert":"-----BEGIN CERTIFICATE-----\nMIIEjzCCBDSgAwIBAgIVANSM/11ZfE0c77Bz9s4YfenjamPzMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NTdaFw0zMTA2MjgxNzM4\nNTdaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nrUZVnTDdY3JD4V66br8hj3nb/T+U5qWvRQsAs2YRk4WB2Oh2zaByql46rvRaNo3h\nbCRVvk/IY+dB5kdQf057eaOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFJrU7Xz2x97jrjLGTE4S\niMwt+cK+MA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQqfI5qAW32Tj1sOqHO2nbpzCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgEGMBAGCyqGSIb4TQENAQIC\nAgEGMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBADAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBBzAfBgsqhkiG+E0BDQEC\nEgQQBgYCBAGAAAAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNJADBGAiEA\n14yOOq8AdEBR3X75eO5XfgaAYuy5lkClovxveeySdxUCIQDUJT8pscjue1VxzFut\n8vqN+mBx7WTz2rkOZQpbsWtyDg==\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":5,"category":"","type":""},{"svn":5,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":7},"tcbm":"050502040180010000000000000000000700","cert":"-----BEGIN CERTIFICATE-----\nMIIEjTCCBDSgAwIBAgIVAIa8y3wdSxAc2sB0ck0dI4DfHpwDMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NTdaFw0zMTA2MjgxNzM4\nNTdaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nRhdXXvKyIZpgcl04E6HvaNtestcHcKQJiG0eYNmpLCrVfoUx9QZK8stgbsMb3Hmb\nV5VuOQeMrf6eZt9TYC57AqOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFDQJdIHvwOGVTo9nnpNY\nW/SEYCPRMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQqfI5qAW32Tj1sOqHO2nbpzCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgEFMBAGCyqGSIb4TQENAQIC\nAgEFMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBATAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBBzAfBgsqhkiG+E0BDQEC\nEgQQBQUCBAGAAQAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNHADBEAiAS\nvQMAUha4rhFUS0/U1mE9xrnbTd40wxqCDDJ9zwmF6AIgPXJR1ueeDO0zHdCygGR0\nhh1NQmwl0InZvDvL3mtWrXw=\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":5,"category":"","type":""},{"svn":5,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":6},"tcbm":"050502040180010000000000000000000600","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDOgAwIBAgIUThfWoWp2b3eFyMhJkK9vjKP0r0UwCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1N1oXDTMxMDYyODE3Mzg1\nN1owcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQW\ntknTn9EPRml50Z1G9DD17SK4x8FGb/fj2kOs3SNqDzpd2ycQ2SS41lAiVpVM0vKO\nm9wyXDIDNtkvqbao7xpio4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQUe+14C/F3mtU8LrAF536w\nZUJUrn4wDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCp8jmoBbfZOPWw6oc7adunMIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAQUwEAYLKoZIhvhNAQ0BAgIC\nAQUwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEBMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgEGMB8GCyqGSIb4TQENAQIS\nBBAFBQIEAYABAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0kAMEYCIQDG\nKuIkxcxURkmS0DB1bLnAcBDihke8Lsm6YqZD4dgJQwIhAMNkNPefbTsLCwb/z2mQ\nk/TeVBE4/B41DtK4RVOCe3Ev\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":5,"category":"","type":""},{"svn":5,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":7},"tcbm":"050502040180000000000000000000000700","cert":"-----BEGIN CERTIFICATE-----\nMIIEjTCCBDOgAwIBAgIUMcrVhL8cKIOa801Fpd7rmYgOLNUwCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1N1oXDTMxMDYyODE3Mzg1\nN1owcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQ8\n8ifcr2QxltE0E3V08MtqjQ/12c5KCo/bXYj9IuZBGkLGQMvL+6aNgbWMRhs4/Fcx\nHmi4bdeipCtemCO6v1ioo4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQUwQQbHLwIx5rN7/Dse398\nhcjf7BAwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCp8jmoBbfZOPWw6oc7adunMIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAQUwEAYLKoZIhvhNAQ0BAgIC\nAQUwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEAMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgEHMB8GCyqGSIb4TQENAQIS\nBBAFBQIEAYAAAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0gAMEUCIDZL\n1qpMsZsZd7RlAjYSFRiQrdZ5/LrnAXQSOiS6ZBldAiEAnkF2f7E/jMCHGZPQ/10k\nunK3P8Lp2F8WI0vedQBOS7M=\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":5,"category":"","type":""},{"svn":5,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":6},"tcbm":"050502040180000000000000000000000600","cert":"-----BEGIN CERTIFICATE-----\nMIIEjzCCBDSgAwIBAgIVAPJ/u7kYDXlgmOEsYoP0ekwEYijrMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NTdaFw0zMTA2MjgxNzM4\nNTdaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nAlR8tB3jsvA9jbI07MGIK8vOdrJp0QxK8OQiCIWg7QQSmlKaIULq1dPXkI8Di3GC\n3FAc9iFv0Wt+iKag/8WsnaOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFEFeeJWdpQEzJ+Fv24ha\nZkURXdkbMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQqfI5qAW32Tj1sOqHO2nbpzCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgEFMBAGCyqGSIb4TQENAQIC\nAgEFMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBADAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBBjAfBgsqhkiG+E0BDQEC\nEgQQBQUCBAGAAAAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNJADBGAiEA\n14cISa9NGyfCixXOtKFW9Ykji/hMuAMVTJvu+2cNqDUCIQDoqz0EZCiAicZKK783\n1FKDE7E6vRg3qJDdj1Cez4oC6A==\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":4,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":5},"tcbm":"040402040180000000000000000000000500","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDOgAwIBAgIUaF7Blhpd4lnjSJu0noC5V4D0E5UwCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1N1oXDTMxMDYyODE3Mzg1\nN1owcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARp\nJpKG6dE7Fvi8bfzPcR/cf4mLK/xUQiay3a04cbjqaAhcMf1Nm12xvU10G6x5XiPm\n0vbp4K2avxrQ+4MhIRY6o4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQU28poe68MJ60Ez7Lzwb3q\nApCHmzMwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCp8jmoBbfZOPWw6oc7adunMIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAQQwEAYLKoZIhvhNAQ0BAgIC\nAQQwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEAMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgEFMB8GCyqGSIb4TQENAQIS\nBBAEBAIEAYAAAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0kAMEYCIQCw\nbkVzkFiceNQyzNR7DsIiX0pl5CH4qHIkkhYrTPYM0AIhAJTYXM0ub3otqeWBRZqY\nnlvMxACjv8yRQMFo805VAdN6\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":2,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":4},"tcbm":"020202040180000000000000000000000400","cert":"-----BEGIN CERTIFICATE-----\nMIIEjDCCBDOgAwIBAgIUNADX1BaTuXNka97mztiVA7q5iA4wCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1N1oXDTMxMDYyODE3Mzg1\nN1owcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR5\nC+QzTunjvplu18g9Ii2EDBm2uejscmNFlCaHNT6u90qNbutjGC0NLf3bF1VycLGT\n0Ev/ECDoZMpUe4MSTASIo4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQUvdv8jTC/5xWAye4QUOB2\nUzvvdlswDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCp8jmoBbfZOPWw6oc7adunMIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAQIwEAYLKoZIhvhNAQ0BAgIC\nAQIwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEAMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgEEMB8GCyqGSIb4TQENAQIS\nBBACAgIEAYAAAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0cAMEQCICUd\nUmJ4mybXF1s4UekoEweBT2r2WBUF5XmSSSiiFIAgAiA5vVNurI+441g22JzkN6/G\nVIxh1VWjn2RC4QNF5HbX4Q==\n-----END CERTIFICATE-----\n"}],"ca_chain":["-----BEGIN CERTIFICATE-----\nMIICmDCCAj6gAwIBAgIVANDoqtp11/kuSReYPHsUZdDV8llNMAoGCCqGSM49BAMC\nMGgxGjAYBgNVBAMMEUludGVsIFNHWCBSb290IENBMRowGAYDVQQKDBFJbnRlbCBD\nb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNVBAgMAkNBMQsw\nCQYDVQQGEwJVUzAeFw0xODA1MjExMDUwMTBaFw0zMzA1MjExMDUwMTBaMHExIzAh\nBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQKDBFJbnRl\nbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNVBAgMAkNB\nMQswCQYDVQQGEwJVUzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABL9q+NMp2IOg\ntdl1bk/uWZ5+TGQm8aCi8z78fs+fKCQ3d+uDzXnVTAT2ZhDCifyIuJwvN3wNBp9i\nHBSSMJMJrBOjgbswgbgwHwYDVR0jBBgwFoAUImUM1lqdNInzg7SVUr9QGzknBqww\nUgYDVR0fBEswSTBHoEWgQ4ZBaHR0cHM6Ly9jZXJ0aWZpY2F0ZXMudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9JbnRlbFNHWFJvb3RDQS5kZXIwHQYDVR0OBBYEFNDo\nqtp11/kuSReYPHsUZdDV8llNMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAG\nAQH/AgEAMAoGCCqGSM49BAMCA0gAMEUCIQCJgTbtVqOyZ1m3jqiAXM6QYa6r5sWS\n4y/G7y8uIJGxdwIgRqPvBSKzzQagBLQq5s5A70pdoiaRJ8z/0uDz4NgV91k=\n-----END CERTIFICATE-----\n","-----BEGIN CERTIFICATE-----\nMIICjzCCAjSgAwIBAgIUImUM1lqdNInzg7SVUr9QGzknBqwwCgYIKoZIzj0EAwIw\naDEaMBgGA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENv\ncnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJ\nBgNVBAYTAlVTMB4XDTE4MDUyMTEwNDUxMFoXDTQ5MTIzMTIzNTk1OVowaDEaMBgG\nA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENvcnBvcmF0\naW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJBgNVBAYT\nAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEC6nEwMDIYZOj/iPWsCzaEKi7\n1OiOSLRFhWGjbnBVJfVnkY4u3IjkDYYL0MxO4mqsyYjlBalTVYxFP2sJBK5zlKOB\nuzCBuDAfBgNVHSMEGDAWgBQiZQzWWp00ifODtJVSv1AbOScGrDBSBgNVHR8ESzBJ\nMEegRaBDhkFodHRwczovL2NlcnRpZmljYXRlcy50cnVzdGVkc2VydmljZXMuaW50\nZWwuY29tL0ludGVsU0dYUm9vdENBLmRlcjAdBgNVHQ4EFgQUImUM1lqdNInzg7SV\nUr9QGzknBqwwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwCgYI\nKoZIzj0EAwIDSQAwRgIhAOW/5QkR+S9CiSDcNoowLuPRLsWGf/Yi7GSX94BgwTwg\nAiEA4J0lrHoMs+Xo5o/sX6O9QWxHRAvZUGOdRQ7cvqRXaqI=\n-----END CERTIFICATE-----\n"]} \ No newline at end of file diff --git a/intel-sgx/dcap-artifact-retrieval/tests/data/7baedb1f28d2222cb3acee6891efb40f.certs b/intel-sgx/dcap-artifact-retrieval/tests/data/7baedb1f28d2222cb3acee6891efb40f.certs new file mode 100644 index 00000000..e237ec5c --- /dev/null +++ b/intel-sgx/dcap-artifact-retrieval/tests/data/7baedb1f28d2222cb3acee6891efb40f.certs @@ -0,0 +1 @@ +{"pck_data":[{"tcb":{"sgxtcbcomponents":[{"svn":20,"category":"","type":""},{"svn":20,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":7,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":13},"tcbm":"141402040180070000000000000000000D00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjTCCBDSgAwIBAgIVAP/UvJO1tYrqx3a1Upr6438xJtGTMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NThaFw0zMTA2MjgxNzM4\nNThaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nsb1XZsaMDX5M4fmfR/cQXZBPjvjvgjDjXsXiUUuMY+cyhSZrJDAf1t76rcAxaRGu\n6b1rsibQQHGnqZmxSl9GKKOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFLCNdxxWV0BPIa9mRrhy\nK9kpICcSMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQiFid1YvU6AwrEkmGIqNIdzCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgEUMBAGCyqGSIb4TQENAQIC\nAgEUMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBBzAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBDTAfBgsqhkiG+E0BDQEC\nEgQQFBQCBAGABwAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNHADBEAiAG\n1H5qa4CChj1i3Makn3jvrX8UKY8q6NwJezHhxBaJCgIgauyw0dYqHNkVfFrncV/3\nf3UdufjPMcX6cXuOm2cJKJk=\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":20,"category":"","type":""},{"svn":20,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":13},"tcbm":"141402040180000000000000000000000D00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDOgAwIBAgIUFS6MC6HvfbkOBMiQwETKLY6wPvEwCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1OFoXDTMxMDYyODE3Mzg1\nOFowcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR6\njBv6yyw5UwOKTq/MQcrF9h3sS1fimBDub5X5jc8ip90rGB5lCslv8E3iYHQBtWQf\n2EgSq7dk0FPtMy/n24xio4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQUlhnV1WL0GQfv3MfRmnw3\n2ZsHDbMwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCIWJ3Vi9ToDCsSSYYio0h3MIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECARQwEAYLKoZIhvhNAQ0BAgIC\nARQwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEAMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgENMB8GCyqGSIb4TQENAQIS\nBBAUFAIEAYAAAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0kAMEYCIQCn\nOrdNbvYV9YAiUN2K5z/QtackoptInP4axC5q4SXPEwIhAMxkaJ15gLLoHfunkN3y\n08i/SdTieIE04o8NQdXF/7bM\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":19,"category":"","type":""},{"svn":19,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":7,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":13},"tcbm":"131302040180070000000000000000000D00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjDCCBDOgAwIBAgIUIzIAA5icSGusLf687zrEIaluyDkwCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1OFoXDTMxMDYyODE3Mzg1\nOFowcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASP\nv14T+eyoMPhix4dmXdrgennoydQpGrDjBKtXa1jtOdMO5IDyX3u3LYxcOora19VU\n4sPLfTNsrOZaNUURHs/mo4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQUk5+KdlJs0zJ96YD5s8HJ\nlPPsuSowDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCIWJ3Vi9ToDCsSSYYio0h3MIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECARMwEAYLKoZIhvhNAQ0BAgIC\nARMwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEHMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgENMB8GCyqGSIb4TQENAQIS\nBBATEwIEAYAHAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0cAMEQCIHnB\nrkXMo5W850+NXx2VfP7rq8kUKnkq1Ijhxgjr+3TwAiAuNHY53+pwoBAf9nZGJ6bO\nLDn/8RcBCQuPvyoCcCitjw==\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":19,"category":"","type":""},{"svn":19,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":13},"tcbm":"131302040180000000000000000000000D00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDOgAwIBAgIUQWWBWkZy5oPn/Q84swQvHRQCIiswCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1OFoXDTMxMDYyODE3Mzg1\nOFowcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATU\na/yAlc4n1Dik0UVjc+O9qBtj0yP5VFDTiU6uSYW+aiOEKCdUSCC+6ZKYRUIi5wRp\nk5b2xod3w92Ll9/+HJABo4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQUBJPgkrS6/W+jxVc0FLmp\nz57627wwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCIWJ3Vi9ToDCsSSYYio0h3MIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECARMwEAYLKoZIhvhNAQ0BAgIC\nARMwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEAMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgENMB8GCyqGSIb4TQENAQIS\nBBATEwIEAYAAAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0kAMEYCIQDn\nKrPSjOkT7pmRFbj5eiVv4+MkAD4DZBN9kpMA4lw1cQIhAKPusLMiy3nhYU+t70Dj\nIPU0cFlWyIUYIvqFXc1/WFih\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":17,"category":"","type":""},{"svn":17,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":7,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":11},"tcbm":"111102040180070000000000000000000B00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDOgAwIBAgIUQgli3TWKfCx9+ZLMRrF5wwg4E3gwCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1OFoXDTMxMDYyODE3Mzg1\nOFowcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARY\n+lR6D2gH1mW8Tc1DBsHYZ6ZcWUU57x1e4GlQBeJnPQ7SVlt7uX0+u13574kdz21u\nrRz1dS6ZwpGlGe3ryb55o4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQU70i5qPCvXLzN8qpcZZvB\ngFgdb78wDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCIWJ3Vi9ToDCsSSYYio0h3MIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAREwEAYLKoZIhvhNAQ0BAgIC\nAREwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEHMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgELMB8GCyqGSIb4TQENAQIS\nBBAREQIEAYAHAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0kAMEYCIQD8\n9GZrVaq9IyyprE0Nzx0yrCOpwownmNXA2apYcEz57QIhAJlIBmhdu7MgEIsW+N/y\n9P+IY11VsCKQs77BYe3uG+rW\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":17,"category":"","type":""},{"svn":17,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":7,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":10},"tcbm":"111102040180070000000000000000000A00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDOgAwIBAgIUQ5UwZP04VbLXzEgyT9X7A7j+GQswCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1OFoXDTMxMDYyODE3Mzg1\nOFowcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAT9\n+farAd0GiDOQrZ2ur+3OhIACH6IT+0L9WZnRnio4Mw3+BRfLfNLuHelBbQYpURAS\n5yK7H4ftzNu/+bLaBLXxo4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQUwAm872S/AnEmvmlYwUPL\nyTfFZ6swDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCIWJ3Vi9ToDCsSSYYio0h3MIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAREwEAYLKoZIhvhNAQ0BAgIC\nAREwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEHMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgEKMB8GCyqGSIb4TQENAQIS\nBBAREQIEAYAHAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0kAMEYCIQCu\nqdUf1LXsNWOQyxp9r6OoV+Gw4LRvf9eZIM1P7hKEOAIhAK4fjkKx5NA/Fs67h0s3\nnlXTjJBW/ZFH9LO5jFJF7/84\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":17,"category":"","type":""},{"svn":17,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":11},"tcbm":"111102040180000000000000000000000B00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjDCCBDOgAwIBAgIUVf24y8RcCrQ1CbdxXGhiyyIFDH0wCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1OFoXDTMxMDYyODE3Mzg1\nOFowcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATg\nGtZqeIx+/t7PjuoPHik6o0IuikIIno/8Mi3rw7rpKaItwzOIgaMxe9TO3PrpPjcL\nQhzwGvnDwjN4BjTvniuJo4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQU8mLw/ZJyF3SVMM+ylI1h\nl/Bk+KEwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCIWJ3Vi9ToDCsSSYYio0h3MIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAREwEAYLKoZIhvhNAQ0BAgIC\nAREwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEAMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgELMB8GCyqGSIb4TQENAQIS\nBBAREQIEAYAAAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0cAMEQCIA5k\ngvmhwkyRvAyIzjqfqdxa+wsuvvqO/Hbgplw0UxY/AiAtr0qnEGi795oht5w5ENBR\nqN+jJhhrykE2g2Ln0Fm0Kw==\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":17,"category":"","type":""},{"svn":17,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":10},"tcbm":"111102040180000000000000000000000A00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDSgAwIBAgIVAOe6CENFf2ws6gmjDyzSwCPzTbVHMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NThaFw0zMTA2MjgxNzM4\nNThaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nqC1XQ8aGQuqJFrv7C2PZNllmWSPdYr/VpTk64TyxPEklJ7Yi1EWruZGMgBKpiSTy\nI2Ahfy9snZ35Dy779Yjp6qOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFCBwrKgYU3bRyRLUzj/u\nPo+gADMkMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQiFid1YvU6AwrEkmGIqNIdzCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgERMBAGCyqGSIb4TQENAQIC\nAgERMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBADAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBCjAfBgsqhkiG+E0BDQEC\nEgQQERECBAGAAAAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNIADBFAiEA\ns1CNTiYF4HJie7kgTnV7hvbvyrOht8wuTYh70sJtH4gCIBDPxkXwUG1DFI0eLHBn\n0dtZ1NlSkJwObOZZ7MkQPRLH\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":15,"category":"","type":""},{"svn":15,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":7,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":10},"tcbm":"0F0F02040180070000000000000000000A00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDSgAwIBAgIVAK+zQehax9m4IIoQGQ0M8kwEFAXqMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NThaFw0zMTA2MjgxNzM4\nNThaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\n2UL04lQJQhDvIqUAm95tLValCMPE+kcqXavu9Gh+3q0F5CKc1ZNOSr+TcJi1bJ+N\nS2QtdEl5BE7iPRCo4MNRr6OCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFGbHwQAIXKc1Y8AzDgfT\nG4UgcxkLMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQiFid1YvU6AwrEkmGIqNIdzCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgEPMBAGCyqGSIb4TQENAQIC\nAgEPMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBBzAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBCjAfBgsqhkiG+E0BDQEC\nEgQQDw8CBAGABwAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNIADBFAiB7\n+KQYohX6xFEA3sGX0dFxRnxhbrfiO4lLeU2mfMhb4QIhAKCBirOCWF58+jWEICNq\njRLaV15I02IAKK7GejWEszkA\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":15,"category":"","type":""},{"svn":15,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":10},"tcbm":"0F0F02040180000000000000000000000A00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDSgAwIBAgIVAKU/mswQLMstdsF9WUR3FVgZ3mzpMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NThaFw0zMTA2MjgxNzM4\nNThaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nJWWR9dJN9lA1iiL88aMQieYZCBnMwUT4ETYYkmpaBmLrqRfz8ydZA7C5LdEUWk0c\ngxXtJoan/kIWHU/FnTCgF6OCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFGa8wLy3aW7ttp5681O4\noFyzZIN5MA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQiFid1YvU6AwrEkmGIqNIdzCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgEPMBAGCyqGSIb4TQENAQIC\nAgEPMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBADAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBCjAfBgsqhkiG+E0BDQEC\nEgQQDw8CBAGAAAAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNIADBFAiEA\n+h9+KsRayOKvvJEM99N7eatpr+PwKSfei6vpaGCgYRwCIGknEUwCI18VD2q7c0Re\n+gxxBwxMS/zCYnHiNnBojwwc\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":14,"category":"","type":""},{"svn":14,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":7,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":10},"tcbm":"0E0E02040180070000000000000000000A00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDSgAwIBAgIVAOF7HtX6N/RJvSZ2s1W11lct3HrQMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NThaFw0zMTA2MjgxNzM4\nNThaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nmE34mtKPpOf5KkcPKYs6m9+n2Q6KqPktCzYNzBhxP4o0gDjSnaLRVZB59sfdGduf\nVtb9lmbjBFDxoj5wTq89n6OCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFBp2gaCSQvw6CvdCLqYg\nZkwKJwtAMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQiFid1YvU6AwrEkmGIqNIdzCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgEOMBAGCyqGSIb4TQENAQIC\nAgEOMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBBzAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBCjAfBgsqhkiG+E0BDQEC\nEgQQDg4CBAGABwAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNIADBFAiBN\n0vxji0XLNeGeqnvAhq0e2dv+0HMGvrzV/7i3++/k1QIhAIoEzxVyn5jg/3mFJQL+\n/TgsFMpC2RQUZ6rU30jJEG+H\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":14,"category":"","type":""},{"svn":14,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":10},"tcbm":"0E0E02040180000000000000000000000A00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjTCCBDSgAwIBAgIVAOBwIg6T/Lsfw+xmqwI3+O1+Dev4MAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NThaFw0zMTA2MjgxNzM4\nNThaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\n1PnI8HKr4fM8u2e7SJPE4XrhHxnMkwnf7U9ZLLdhk4EjBkuJ4+Wdb2ekcTypLo7h\nAxwfkKR/mYvWFPtqu7nlcKOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFM2KILDuh3YsRK7bK2Ai\nU3FovGgvMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQiFid1YvU6AwrEkmGIqNIdzCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgEOMBAGCyqGSIb4TQENAQIC\nAgEOMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBADAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBCjAfBgsqhkiG+E0BDQEC\nEgQQDg4CBAGAAAAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNHADBEAiBT\nBMTnBtxTSQqdO9pUL7bpWYXEi4FvGBUZk5fdZ6YdywIgURpcpAfa8NlDyN7Ld7tR\n8JDC+3mMtW0Cg2Et0r4ConQ=\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":13,"category":"","type":""},{"svn":13,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":3,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":9},"tcbm":"0D0D02040180030000000000000000000900","cert":"-----BEGIN CERTIFICATE-----\nMIIEjTCCBDSgAwIBAgIVANFknnKg4wr+Bwd6sNEjcQAZdbFXMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NThaFw0zMTA2MjgxNzM4\nNThaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nVnZYt8Z03m+nc+EhdYTl3JceLtEesqEKkAqyfbuMZhmciRP/XUwk1/bnpyCVyUrc\nD0H3UOpR7zhwqdhCM1f0LqOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFFgjwbEewab3efLNxYC1\n30Ul/wgGMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQiFid1YvU6AwrEkmGIqNIdzCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgENMBAGCyqGSIb4TQENAQIC\nAgENMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBAzAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBCTAfBgsqhkiG+E0BDQEC\nEgQQDQ0CBAGAAwAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNHADBEAiA3\n/LfEe7QZW7IUi9ZIGFLzAzwxW3YqQGid0mGyYp+FDgIgE1y9uOmoxGcSRj2rV5Gs\nPmezyCMNnqubtUei0eU0qmI=\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":13,"category":"","type":""},{"svn":13,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":9},"tcbm":"0D0D02040180000000000000000000000900","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDOgAwIBAgIURRxz52zUHgLCvl79L5Q998SwAe0wCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1OFoXDTMxMDYyODE3Mzg1\nOFowcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARQ\nPHTyvf+QWaEmtcSbqEiCBnhmBkGYNZnaE5nvtcFSQGDxVCxiNNP6HxIs7oXnJNoy\nDYUX4vHpZvgOtx5qk3Wyo4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQUN7XOhfEIUW/yvuHo5207\n99hcXnkwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCIWJ3Vi9ToDCsSSYYio0h3MIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAQ0wEAYLKoZIhvhNAQ0BAgIC\nAQ0wEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEAMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgEJMB8GCyqGSIb4TQENAQIS\nBBANDQIEAYAAAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0kAMEYCIQDF\nkVNL4z9X8L24IXknXKkcn6bdgFVNcY5gg0ufO03ygAIhAJSQ4EO1jgSgaz7uaRu8\n6e2MFLZ6PGeK4PD5YmAsS4tp\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":6,"category":"","type":""},{"svn":6,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":7},"tcbm":"060602040180010000000000000000000700","cert":"-----BEGIN CERTIFICATE-----\nMIIEjTCCBDSgAwIBAgIVAPx73FgnQTxNPJ6hZzXPhmhVrBksMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NThaFw0zMTA2MjgxNzM4\nNThaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\noJBZ/h4Rf2WqY6FULAvhZowa81fXvhJ+1K+gmtS5hO8B8d+Kl3SjrwyjeEGadzq9\nu6i/coNfPRzPxl48N9JMPKOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFCgD91XC5jkrHxCoNfOu\nWG2+QwjCMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQiFid1YvU6AwrEkmGIqNIdzCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgEGMBAGCyqGSIb4TQENAQIC\nAgEGMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBATAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBBzAfBgsqhkiG+E0BDQEC\nEgQQBgYCBAGAAQAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNHADBEAiA/\nVsAcEBNX44MRyXuH5qRsDhM+XK3s/eY+WvlchvaZRAIgMwcq3bQwDVgZZ/j3Z9cS\nhKDAkcW6eMb+KxqwuHO4XKo=\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":6,"category":"","type":""},{"svn":6,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":7},"tcbm":"060602040180000000000000000000000700","cert":"-----BEGIN CERTIFICATE-----\nMIIEjTCCBDOgAwIBAgIUGzzHjZR47vquoyj7LX9dkzeUXHEwCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1OFoXDTMxMDYyODE3Mzg1\nOFowcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASD\nGklTKiJt0DtZZFCgOlAIMsgFgqCaEgNSn4Y7Ipd/JK6Pl2f1lFX7Oql1JGy7bEs3\nRf6aEKksZHcfz69Y6/lfo4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQULVmsPvYi1svHog9EssOY\nqlQ7CYowDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCIWJ3Vi9ToDCsSSYYio0h3MIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAQYwEAYLKoZIhvhNAQ0BAgIC\nAQYwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEAMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgEHMB8GCyqGSIb4TQENAQIS\nBBAGBgIEAYAAAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0gAMEUCIQDb\nF3ZIQ9mMUqxxU6MI5WiieO0j1+eGdESPAtqNeaodsAIgSl8LUh6njXUN3hv4kg+8\ni1zDCP8CB0GHwqsJEPFGp/E=\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":5,"category":"","type":""},{"svn":5,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":7},"tcbm":"050502040180010000000000000000000700","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDSgAwIBAgIVAMdK0XR9exEKBMbWW4pRlVwqgXuCMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NThaFw0zMTA2MjgxNzM4\nNThaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\n+sf+0HoCcPg5BzJ6HzYY3UVVlGUtRxFvRvQeNUkolEDCaX7BP4Uyat7fgrO/LTgi\nySufgnqLBmVCe/ngYM6Ud6OCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFAiM1O/RORgc53bXCVUc\n7aO4DgPAMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQiFid1YvU6AwrEkmGIqNIdzCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgEFMBAGCyqGSIb4TQENAQIC\nAgEFMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBATAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBBzAfBgsqhkiG+E0BDQEC\nEgQQBQUCBAGAAQAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNIADBFAiBI\nulMNjPTrnh/XB/OPbIlRGyNkVjrVtVn6lpUYhnuYAgIhAIxjGF1nS8zL9PAMC2z8\nlgo7NHvDC1CFHm1PHeby8n/F\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":5,"category":"","type":""},{"svn":5,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":6},"tcbm":"050502040180010000000000000000000600","cert":"-----BEGIN CERTIFICATE-----\nMIIEjDCCBDOgAwIBAgIUCfCSgHmHVUMHQCqqfSW5gYdHpcUwCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1OFoXDTMxMDYyODE3Mzg1\nOFowcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARE\nwHdtkjbYnEzDeKE0c2oOsxtz0fjZ/xcxisNpvl3ERViSrnWV764zqm+Y6A2vJo8z\nVPDk754k+mxBoaibGOcMo4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQUs/bkOX2qR7GeSb7c6I/5\nTUzWb4wwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCIWJ3Vi9ToDCsSSYYio0h3MIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAQUwEAYLKoZIhvhNAQ0BAgIC\nAQUwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEBMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgEGMB8GCyqGSIb4TQENAQIS\nBBAFBQIEAYABAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0cAMEQCIBbT\nUOqfMNz3SrojiHJ5WMxJJpx07UZFnrpJ+fWanjT/AiBpt/Cv65fPhUCUxG3b0rwT\nbQ7RF5WEjBNwNkqvLZPZyA==\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":5,"category":"","type":""},{"svn":5,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":7},"tcbm":"050502040180000000000000000000000700","cert":"-----BEGIN CERTIFICATE-----\nMIIEjTCCBDSgAwIBAgIVAK93ZZkgMsJZIh8ECo04DAUpWyQ4MAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NThaFw0zMTA2MjgxNzM4\nNThaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\n/IJqhF+p7hXWXtmAKZ6NOTaA1DhckNLhoxEngZDX1jCfgYizUSZ5u2G3iwNSMlyo\nmJIY2Uue/RVlssJpc1T5SqOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFFD2q5eC/0DE6LbIE7Tz\nwwjyMqzaMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQiFid1YvU6AwrEkmGIqNIdzCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgEFMBAGCyqGSIb4TQENAQIC\nAgEFMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBADAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBBzAfBgsqhkiG+E0BDQEC\nEgQQBQUCBAGAAAAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNHADBEAiAI\nega9eKTqMsQJIXZZJsrlQ6zx4W7eHpaIRqCxwdCbAwIgVwGPjP86sFtBQLKmKc7k\nXKoSpUyuGOCfYHbSZ7JptI4=\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":5,"category":"","type":""},{"svn":5,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":6},"tcbm":"050502040180000000000000000000000600","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDSgAwIBAgIVAKNgMNkm5keprcTSzDYB3DYwbmyTMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NThaFw0zMTA2MjgxNzM4\nNThaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nr26u6KTuj5orovQALXC7aFNg+yfb3F5eeSqDRmTm3/YTJmpLGTbzpeDoWJfwFZvV\n3h5YcNEsOQRPkm6MhY78FaOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFNOHEQpXK0nzJjrKDpCZ\nxZRpF5jFMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQiFid1YvU6AwrEkmGIqNIdzCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgEFMBAGCyqGSIb4TQENAQIC\nAgEFMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBADAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBBjAfBgsqhkiG+E0BDQEC\nEgQQBQUCBAGAAAAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNIADBFAiBy\nRWO3cROK7SFP3xFvtTJx01p4WVS3KV7UDmjs76oK4QIhAJLJEeLAH0++pkYoFu/p\nRGJszQBpEOpelOC9YFDD+ksu\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":4,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":5},"tcbm":"040402040180000000000000000000000500","cert":"-----BEGIN CERTIFICATE-----\nMIIEjTCCBDOgAwIBAgIUZK+AsmRdVjoVOjz/SvsNq4S0yTAwCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1OFoXDTMxMDYyODE3Mzg1\nOFowcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQU\n0y8STTUICJhlRlBDCva+LSSrZULEXIkGWZXcHlqbhHSCmj43YljdSmx3WAausxKJ\nUYD6OJ667hxy+k94rzA6o4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQUOV87I2Sd2zJXKCE+FKkH\nq8DLTa8wDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBCIWJ3Vi9ToDCsSSYYio0h3MIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAQQwEAYLKoZIhvhNAQ0BAgIC\nAQQwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEAMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgEFMB8GCyqGSIb4TQENAQIS\nBBAEBAIEAYAAAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0gAMEUCIDpi\n/HvdqUXdrEJMICqQMnKKPU2diXWzuWkYJVLxz91WAiEAh+HsP1xQYt/qsEBmR5y7\n7a4qDJT1M0w1IxdogyP0obE=\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":2,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":4},"tcbm":"020202040180000000000000000000000400","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDSgAwIBAgIVAL5EGQUplCtLMNUai8dTDZXm2qKXMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NThaFw0zMTA2MjgxNzM4\nNThaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nzw15nNLnDH1zAztzwxP8W7UZjUz1jml/UTuDGW8aUFQ9QIOWhKDZpHI80Q5SEIgJ\ny9zbxBUcyPRmISw8Eah+SqOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFPdQ8K1Uyyf+C1vzPuyB\nRTb9S/1nMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQiFid1YvU6AwrEkmGIqNIdzCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgECMBAGCyqGSIb4TQENAQIC\nAgECMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBADAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBBDAfBgsqhkiG+E0BDQEC\nEgQQAgICBAGAAAAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNIADBFAiEA\n65FDgUPYlGbc8DYxwFFYC321cS/NWApTWlRNITlIH6MCIHB5ITW126d5TLYlcj5D\nxD0aEOUKJ2XjlVBNvVinE8HM\n-----END CERTIFICATE-----\n"}],"ca_chain":["-----BEGIN CERTIFICATE-----\nMIICmDCCAj6gAwIBAgIVANDoqtp11/kuSReYPHsUZdDV8llNMAoGCCqGSM49BAMC\nMGgxGjAYBgNVBAMMEUludGVsIFNHWCBSb290IENBMRowGAYDVQQKDBFJbnRlbCBD\nb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNVBAgMAkNBMQsw\nCQYDVQQGEwJVUzAeFw0xODA1MjExMDUwMTBaFw0zMzA1MjExMDUwMTBaMHExIzAh\nBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQKDBFJbnRl\nbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNVBAgMAkNB\nMQswCQYDVQQGEwJVUzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABL9q+NMp2IOg\ntdl1bk/uWZ5+TGQm8aCi8z78fs+fKCQ3d+uDzXnVTAT2ZhDCifyIuJwvN3wNBp9i\nHBSSMJMJrBOjgbswgbgwHwYDVR0jBBgwFoAUImUM1lqdNInzg7SVUr9QGzknBqww\nUgYDVR0fBEswSTBHoEWgQ4ZBaHR0cHM6Ly9jZXJ0aWZpY2F0ZXMudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9JbnRlbFNHWFJvb3RDQS5kZXIwHQYDVR0OBBYEFNDo\nqtp11/kuSReYPHsUZdDV8llNMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAG\nAQH/AgEAMAoGCCqGSM49BAMCA0gAMEUCIQCJgTbtVqOyZ1m3jqiAXM6QYa6r5sWS\n4y/G7y8uIJGxdwIgRqPvBSKzzQagBLQq5s5A70pdoiaRJ8z/0uDz4NgV91k=\n-----END CERTIFICATE-----\n","-----BEGIN CERTIFICATE-----\nMIICjzCCAjSgAwIBAgIUImUM1lqdNInzg7SVUr9QGzknBqwwCgYIKoZIzj0EAwIw\naDEaMBgGA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENv\ncnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJ\nBgNVBAYTAlVTMB4XDTE4MDUyMTEwNDUxMFoXDTQ5MTIzMTIzNTk1OVowaDEaMBgG\nA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENvcnBvcmF0\naW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJBgNVBAYT\nAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEC6nEwMDIYZOj/iPWsCzaEKi7\n1OiOSLRFhWGjbnBVJfVnkY4u3IjkDYYL0MxO4mqsyYjlBalTVYxFP2sJBK5zlKOB\nuzCBuDAfBgNVHSMEGDAWgBQiZQzWWp00ifODtJVSv1AbOScGrDBSBgNVHR8ESzBJ\nMEegRaBDhkFodHRwczovL2NlcnRpZmljYXRlcy50cnVzdGVkc2VydmljZXMuaW50\nZWwuY29tL0ludGVsU0dYUm9vdENBLmRlcjAdBgNVHQ4EFgQUImUM1lqdNInzg7SV\nUr9QGzknBqwwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwCgYI\nKoZIzj0EAwIDSQAwRgIhAOW/5QkR+S9CiSDcNoowLuPRLsWGf/Yi7GSX94BgwTwg\nAiEA4J0lrHoMs+Xo5o/sX6O9QWxHRAvZUGOdRQ7cvqRXaqI=\n-----END CERTIFICATE-----\n"]} \ No newline at end of file diff --git a/intel-sgx/dcap-artifact-retrieval/tests/data/90806f000000.tcb b/intel-sgx/dcap-artifact-retrieval/tests/data/90806f000000.tcb new file mode 100644 index 00000000..dee9305a --- /dev/null +++ b/intel-sgx/dcap-artifact-retrieval/tests/data/90806f000000.tcb @@ -0,0 +1 @@ +{"raw_tcb_info":"{\"id\":\"SGX\",\"version\":3,\"issueDate\":\"2024-06-28T17:01:13Z\",\"nextUpdate\":\"2024-07-28T17:01:13Z\",\"fmspc\":\"90806f000000\",\"pceId\":\"0000\",\"tcbType\":0,\"tcbEvaluationDataNumber\":16,\"tcbLevels\":[{\"tcb\":{\"sgxtcbcomponents\":[{\"svn\":6,\"category\":\"BIOS\",\"type\":\"Early Microcode Update\"},{\"svn\":6,\"category\":\"OS/VMM\",\"type\":\"SGX Late Microcode Update\"},{\"svn\":2,\"category\":\"OS/VMM\",\"type\":\"TXT SINIT\"},{\"svn\":2,\"category\":\"BIOS\"},{\"svn\":3,\"category\":\"BIOS\"},{\"svn\":1,\"category\":\"BIOS\"},{\"svn\":0},{\"svn\":255,\"category\":\"OS/VMM\",\"type\":\"SEAMLDR ACM\"},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0}],\"pcesvn\":11},\"tcbDate\":\"2023-08-09T00:00:00Z\",\"tcbStatus\":\"UpToDate\"},{\"tcb\":{\"sgxtcbcomponents\":[{\"svn\":5,\"category\":\"BIOS\",\"type\":\"Early Microcode Update\"},{\"svn\":5,\"category\":\"OS/VMM\",\"type\":\"SGX Late Microcode Update\"},{\"svn\":2,\"category\":\"OS/VMM\",\"type\":\"TXT SINIT\"},{\"svn\":2,\"category\":\"BIOS\"},{\"svn\":3,\"category\":\"BIOS\"},{\"svn\":1,\"category\":\"BIOS\"},{\"svn\":0},{\"svn\":255,\"category\":\"OS/VMM\",\"type\":\"SEAMLDR ACM\"},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0}],\"pcesvn\":11},\"tcbDate\":\"2023-02-15T00:00:00Z\",\"tcbStatus\":\"OutOfDate\",\"advisoryIDs\":[\"INTEL-SA-00837\"]},{\"tcb\":{\"sgxtcbcomponents\":[{\"svn\":5,\"category\":\"BIOS\",\"type\":\"Early Microcode Update\"},{\"svn\":5,\"category\":\"OS/VMM\",\"type\":\"SGX Late Microcode Update\"},{\"svn\":2,\"category\":\"OS/VMM\",\"type\":\"TXT SINIT\"},{\"svn\":2,\"category\":\"BIOS\"},{\"svn\":3,\"category\":\"BIOS\"},{\"svn\":1,\"category\":\"BIOS\"},{\"svn\":0},{\"svn\":255,\"category\":\"OS/VMM\",\"type\":\"SEAMLDR ACM\"},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0},{\"svn\":0}],\"pcesvn\":5},\"tcbDate\":\"2018-01-04T00:00:00Z\",\"tcbStatus\":\"OutOfDate\",\"advisoryIDs\":[\"INTEL-SA-00106\",\"INTEL-SA-00115\",\"INTEL-SA-00135\",\"INTEL-SA-00203\",\"INTEL-SA-00220\",\"INTEL-SA-00233\",\"INTEL-SA-00270\",\"INTEL-SA-00293\",\"INTEL-SA-00320\",\"INTEL-SA-00329\",\"INTEL-SA-00381\",\"INTEL-SA-00389\",\"INTEL-SA-00477\",\"INTEL-SA-00837\"]}]}","signature":[48,70,2,33,0,236,142,32,29,158,74,140,54,20,223,130,111,105,181,49,138,252,14,128,21,200,214,124,25,107,175,240,165,218,12,113,20,2,33,0,137,232,120,23,106,95,12,243,1,159,143,235,7,55,208,230,154,5,161,194,47,41,197,167,138,33,100,177,106,204,115,161],"ca_chain":["-----BEGIN CERTIFICATE-----\nMIICizCCAjKgAwIBAgIUfjiC1ftVKUpASY5FhAPpFJG99FUwCgYIKoZIzj0EAwIw\naDEaMBgGA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENv\ncnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJ\nBgNVBAYTAlVTMB4XDTE4MDUyMTEwNTAxMFoXDTI1MDUyMTEwNTAxMFowbDEeMBwG\nA1UEAwwVSW50ZWwgU0dYIFRDQiBTaWduaW5nMRowGAYDVQQKDBFJbnRlbCBDb3Jw\nb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNVBAgMAkNBMQswCQYD\nVQQGEwJVUzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABENFG8xzydWRfK92bmGv\nP+mAh91PEyV7Jh6FGJd5ndE9aBH7R3E4A7ubrlh/zN3C4xvpoouGlirMba+W2lju\nypajgbUwgbIwHwYDVR0jBBgwFoAUImUM1lqdNInzg7SVUr9QGzknBqwwUgYDVR0f\nBEswSTBHoEWgQ4ZBaHR0cHM6Ly9jZXJ0aWZpY2F0ZXMudHJ1c3RlZHNlcnZpY2Vz\nLmludGVsLmNvbS9JbnRlbFNHWFJvb3RDQS5kZXIwHQYDVR0OBBYEFH44gtX7VSlK\nQEmORYQD6RSRvfRVMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMAoGCCqG\nSM49BAMCA0cAMEQCIB9C8wOAN/ImxDtGACV246KcqjagZOR0kyctyBrsGGJVAiAj\nftbrNGsGU8YH211dRiYNoPPu19Zp/ze8JmhujB0oBw==\n-----END CERTIFICATE-----\n","-----BEGIN CERTIFICATE-----\nMIICjzCCAjSgAwIBAgIUImUM1lqdNInzg7SVUr9QGzknBqwwCgYIKoZIzj0EAwIw\naDEaMBgGA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENv\ncnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJ\nBgNVBAYTAlVTMB4XDTE4MDUyMTEwNDUxMFoXDTQ5MTIzMTIzNTk1OVowaDEaMBgG\nA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENvcnBvcmF0\naW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJBgNVBAYT\nAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEC6nEwMDIYZOj/iPWsCzaEKi7\n1OiOSLRFhWGjbnBVJfVnkY4u3IjkDYYL0MxO4mqsyYjlBalTVYxFP2sJBK5zlKOB\nuzCBuDAfBgNVHSMEGDAWgBQiZQzWWp00ifODtJVSv1AbOScGrDBSBgNVHR8ESzBJ\nMEegRaBDhkFodHRwczovL2NlcnRpZmljYXRlcy50cnVzdGVkc2VydmljZXMuaW50\nZWwuY29tL0ludGVsU0dYUm9vdENBLmRlcjAdBgNVHQ4EFgQUImUM1lqdNInzg7SV\nUr9QGzknBqwwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwCgYI\nKoZIzj0EAwIDSQAwRgIhAOW/5QkR+S9CiSDcNoowLuPRLsWGf/Yi7GSX94BgwTwg\nAiEA4J0lrHoMs+Xo5o/sX6O9QWxHRAvZUGOdRQ7cvqRXaqI=\n-----END CERTIFICATE-----\n"]} \ No newline at end of file diff --git a/intel-sgx/dcap-artifact-retrieval/tests/data/908da94d8f8a3c31db56855dec5892aa.certs b/intel-sgx/dcap-artifact-retrieval/tests/data/908da94d8f8a3c31db56855dec5892aa.certs new file mode 100644 index 00000000..4892e4c2 --- /dev/null +++ b/intel-sgx/dcap-artifact-retrieval/tests/data/908da94d8f8a3c31db56855dec5892aa.certs @@ -0,0 +1 @@ +{"pck_data":[{"tcb":{"sgxtcbcomponents":[{"svn":7,"category":"","type":""},{"svn":7,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":3,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":255,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":11},"tcbm":"07070202030100FF00000000000000000B00","cert":"-----BEGIN CERTIFICATE-----\nMIIE8jCCBJigAwIBAgIVAOuMuZzR2Rug1tM5k4krbw4yTKjwMAoGCCqGSM49BAMC\nMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgUGxhdGZvcm0gQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1OVoXDTMxMDYyODE3Mzg1\nOVowcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQ0\ny6louL3vKIRRmaE0ZsIvavuOlIz8NRatlM2uFXuKqqLcSnLl4XVvQ9FSOJk4NcOT\n57eXDPjW6YU4tzBbc8oWo4IDDTCCAwkwHwYDVR0jBBgwFoAUlW9dzb0b4elAScnU\n9DPOAVcL3lQwawYDVR0fBGQwYjBgoF6gXIZaaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncGxhdGZvcm0mZW5jb2Rpbmc9ZGVyMB0GA1UdDgQWBBR4QNnP4qC1xF/xtz37C3tF\ndla8YjAOBgNVHQ8BAf8EBAMCBsAwDAYDVR0TAQH/BAIwADCCAjoGCSqGSIb4TQEN\nAQSCAiswggInMB4GCiqGSIb4TQENAQEEEMBjc45XN2haPlVLH8KRHEQwggFkBgoq\nhkiG+E0BDQECMIIBVDAQBgsqhkiG+E0BDQECAQIBBzAQBgsqhkiG+E0BDQECAgIB\nBzAQBgsqhkiG+E0BDQECAwIBAjAQBgsqhkiG+E0BDQECBAIBAjAQBgsqhkiG+E0B\nDQECBQIBAzAQBgsqhkiG+E0BDQECBgIBATAQBgsqhkiG+E0BDQECBwIBADARBgsq\nhkiG+E0BDQECCAICAP8wEAYLKoZIhvhNAQ0BAgkCAQAwEAYLKoZIhvhNAQ0BAgoC\nAQAwEAYLKoZIhvhNAQ0BAgsCAQAwEAYLKoZIhvhNAQ0BAgwCAQAwEAYLKoZIhvhN\nAQ0BAg0CAQAwEAYLKoZIhvhNAQ0BAg4CAQAwEAYLKoZIhvhNAQ0BAg8CAQAwEAYL\nKoZIhvhNAQ0BAhACAQAwEAYLKoZIhvhNAQ0BAhECAQswHwYLKoZIhvhNAQ0BAhIE\nEAcHAgIDAQD/AAAAAAAAAAAwEAYKKoZIhvhNAQ0BAwQCAAAwFAYKKoZIhvhNAQ0B\nBAQGkIBvAAAAMA8GCiqGSIb4TQENAQUKAQIwHgYKKoZIhvhNAQ0BBgQQLcJAnvqq\n+GaMEubGp1mG9DBEBgoqhkiG+E0BDQEHMDYwEAYLKoZIhvhNAQ0BBwEBAf8wEAYL\nKoZIhvhNAQ0BBwIBAf8wEAYLKoZIhvhNAQ0BBwMBAf8wCgYIKoZIzj0EAwIDSAAw\nRQIga3K3Rrxu4D2pbdp12UcZbpo/ZJ5K5Y0xV+8tqRgZbowCIQD19R2/sGgqVK/C\n4wDsut02OiBSsYNYQruY9K05pUas9g==\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":6,"category":"","type":""},{"svn":6,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":3,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":255,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":11},"tcbm":"06060202030100FF00000000000000000B00","cert":"-----BEGIN CERTIFICATE-----\nMIIE8jCCBJigAwIBAgIVALriCPFTsBf4p1z8cijRvjz5g/yIMAoGCCqGSM49BAMC\nMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgUGxhdGZvcm0gQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1OVoXDTMxMDYyODE3Mzg1\nOVowcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQ8\nnnkc19qjoPFDb11M3mXQ2Ey8fi0QdLxlTwh9VgkGJ/vQLOR6qJcu+rdMKfzlAizf\nF+6B5d27+QmEYsPljnhxo4IDDTCCAwkwHwYDVR0jBBgwFoAUlW9dzb0b4elAScnU\n9DPOAVcL3lQwawYDVR0fBGQwYjBgoF6gXIZaaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncGxhdGZvcm0mZW5jb2Rpbmc9ZGVyMB0GA1UdDgQWBBS6SJFAfAGjIRGXa/U484HC\nsIs4UzAOBgNVHQ8BAf8EBAMCBsAwDAYDVR0TAQH/BAIwADCCAjoGCSqGSIb4TQEN\nAQSCAiswggInMB4GCiqGSIb4TQENAQEEEMBjc45XN2haPlVLH8KRHEQwggFkBgoq\nhkiG+E0BDQECMIIBVDAQBgsqhkiG+E0BDQECAQIBBjAQBgsqhkiG+E0BDQECAgIB\nBjAQBgsqhkiG+E0BDQECAwIBAjAQBgsqhkiG+E0BDQECBAIBAjAQBgsqhkiG+E0B\nDQECBQIBAzAQBgsqhkiG+E0BDQECBgIBATAQBgsqhkiG+E0BDQECBwIBADARBgsq\nhkiG+E0BDQECCAICAP8wEAYLKoZIhvhNAQ0BAgkCAQAwEAYLKoZIhvhNAQ0BAgoC\nAQAwEAYLKoZIhvhNAQ0BAgsCAQAwEAYLKoZIhvhNAQ0BAgwCAQAwEAYLKoZIhvhN\nAQ0BAg0CAQAwEAYLKoZIhvhNAQ0BAg4CAQAwEAYLKoZIhvhNAQ0BAg8CAQAwEAYL\nKoZIhvhNAQ0BAhACAQAwEAYLKoZIhvhNAQ0BAhECAQswHwYLKoZIhvhNAQ0BAhIE\nEAYGAgIDAQD/AAAAAAAAAAAwEAYKKoZIhvhNAQ0BAwQCAAAwFAYKKoZIhvhNAQ0B\nBAQGkIBvAAAAMA8GCiqGSIb4TQENAQUKAQIwHgYKKoZIhvhNAQ0BBgQQLcJAnvqq\n+GaMEubGp1mG9DBEBgoqhkiG+E0BDQEHMDYwEAYLKoZIhvhNAQ0BBwEBAf8wEAYL\nKoZIhvhNAQ0BBwIBAf8wEAYLKoZIhvhNAQ0BBwMBAf8wCgYIKoZIzj0EAwIDSAAw\nRQIgez8EF15QjNKDpETW9MCX9x8TWXhsuLkOvSZ2u4eU3s8CIQDSky8+2NIRXMiP\njK2pbo1BcbipEG9uc7+hWFxZJ1S+Dg==\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":5,"category":"","type":""},{"svn":5,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":3,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":255,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":11},"tcbm":"05050202030100FF00000000000000000B00","cert":"-----BEGIN CERTIFICATE-----\nMIIE8jCCBJigAwIBAgIVAKx7CP8B7VzZdK+55iTDFRmDo5QBMAoGCCqGSM49BAMC\nMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgUGxhdGZvcm0gQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1OVoXDTMxMDYyODE3Mzg1\nOVowcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR3\nTHCvl/DoR3ypiybTZk3lkB+RyIugxK+sNByKZs8fYWbkzfX1sfxYSmcr5Ma22r0W\nUo8t9hyOIVx52zTKul4Ro4IDDTCCAwkwHwYDVR0jBBgwFoAUlW9dzb0b4elAScnU\n9DPOAVcL3lQwawYDVR0fBGQwYjBgoF6gXIZaaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncGxhdGZvcm0mZW5jb2Rpbmc9ZGVyMB0GA1UdDgQWBBRVuIjCTRjvh0J+eRXcdRil\nm1HHRDAOBgNVHQ8BAf8EBAMCBsAwDAYDVR0TAQH/BAIwADCCAjoGCSqGSIb4TQEN\nAQSCAiswggInMB4GCiqGSIb4TQENAQEEEMBjc45XN2haPlVLH8KRHEQwggFkBgoq\nhkiG+E0BDQECMIIBVDAQBgsqhkiG+E0BDQECAQIBBTAQBgsqhkiG+E0BDQECAgIB\nBTAQBgsqhkiG+E0BDQECAwIBAjAQBgsqhkiG+E0BDQECBAIBAjAQBgsqhkiG+E0B\nDQECBQIBAzAQBgsqhkiG+E0BDQECBgIBATAQBgsqhkiG+E0BDQECBwIBADARBgsq\nhkiG+E0BDQECCAICAP8wEAYLKoZIhvhNAQ0BAgkCAQAwEAYLKoZIhvhNAQ0BAgoC\nAQAwEAYLKoZIhvhNAQ0BAgsCAQAwEAYLKoZIhvhNAQ0BAgwCAQAwEAYLKoZIhvhN\nAQ0BAg0CAQAwEAYLKoZIhvhNAQ0BAg4CAQAwEAYLKoZIhvhNAQ0BAg8CAQAwEAYL\nKoZIhvhNAQ0BAhACAQAwEAYLKoZIhvhNAQ0BAhECAQswHwYLKoZIhvhNAQ0BAhIE\nEAUFAgIDAQD/AAAAAAAAAAAwEAYKKoZIhvhNAQ0BAwQCAAAwFAYKKoZIhvhNAQ0B\nBAQGkIBvAAAAMA8GCiqGSIb4TQENAQUKAQIwHgYKKoZIhvhNAQ0BBgQQLcJAnvqq\n+GaMEubGp1mG9DBEBgoqhkiG+E0BDQEHMDYwEAYLKoZIhvhNAQ0BBwEBAf8wEAYL\nKoZIhvhNAQ0BBwIBAf8wEAYLKoZIhvhNAQ0BBwMBAf8wCgYIKoZIzj0EAwIDSAAw\nRQIgM+4h/meOJCgTluZCGs7oFWd7fV1ErWy3QsuJxkxgju8CIQCdM/YsQ/xqAuya\nFDkJ6ZZLpiDKy9HbQh1gxjNI5JcsSQ==\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":5,"category":"","type":""},{"svn":5,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":3,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":255,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":5},"tcbm":"05050202030100FF00000000000000000500","cert":"-----BEGIN CERTIFICATE-----\nMIIE8TCCBJigAwIBAgIVAJ9X9HHweedAM8qpgoYmdQ80v05KMAoGCCqGSM49BAMC\nMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgUGxhdGZvcm0gQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1OVoXDTMxMDYyODE3Mzg1\nOVowcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS7\nt4vlUzDJ5RDK5XlkHW6No0ng38rexsyyyZN9UUePgKULPSGgvQXbLHPAgVqlbDmT\nqFj8cwtEFMUGU7q2bcxxo4IDDTCCAwkwHwYDVR0jBBgwFoAUlW9dzb0b4elAScnU\n9DPOAVcL3lQwawYDVR0fBGQwYjBgoF6gXIZaaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncGxhdGZvcm0mZW5jb2Rpbmc9ZGVyMB0GA1UdDgQWBBQMWgjq7E0JYimj9oRckogH\nTcfQqjAOBgNVHQ8BAf8EBAMCBsAwDAYDVR0TAQH/BAIwADCCAjoGCSqGSIb4TQEN\nAQSCAiswggInMB4GCiqGSIb4TQENAQEEEMBjc45XN2haPlVLH8KRHEQwggFkBgoq\nhkiG+E0BDQECMIIBVDAQBgsqhkiG+E0BDQECAQIBBTAQBgsqhkiG+E0BDQECAgIB\nBTAQBgsqhkiG+E0BDQECAwIBAjAQBgsqhkiG+E0BDQECBAIBAjAQBgsqhkiG+E0B\nDQECBQIBAzAQBgsqhkiG+E0BDQECBgIBATAQBgsqhkiG+E0BDQECBwIBADARBgsq\nhkiG+E0BDQECCAICAP8wEAYLKoZIhvhNAQ0BAgkCAQAwEAYLKoZIhvhNAQ0BAgoC\nAQAwEAYLKoZIhvhNAQ0BAgsCAQAwEAYLKoZIhvhNAQ0BAgwCAQAwEAYLKoZIhvhN\nAQ0BAg0CAQAwEAYLKoZIhvhNAQ0BAg4CAQAwEAYLKoZIhvhNAQ0BAg8CAQAwEAYL\nKoZIhvhNAQ0BAhACAQAwEAYLKoZIhvhNAQ0BAhECAQUwHwYLKoZIhvhNAQ0BAhIE\nEAUFAgIDAQD/AAAAAAAAAAAwEAYKKoZIhvhNAQ0BAwQCAAAwFAYKKoZIhvhNAQ0B\nBAQGkIBvAAAAMA8GCiqGSIb4TQENAQUKAQIwHgYKKoZIhvhNAQ0BBgQQLcJAnvqq\n+GaMEubGp1mG9DBEBgoqhkiG+E0BDQEHMDYwEAYLKoZIhvhNAQ0BBwEBAf8wEAYL\nKoZIhvhNAQ0BBwIBAf8wEAYLKoZIhvhNAQ0BBwMBAf8wCgYIKoZIzj0EAwIDRwAw\nRAIgHFjElM0+h1G2viNAVN8G5ZN8MBoBu6j85qB2xs7jgFsCIC19IEebmcvSpc52\nq51k+Npne7VaDTy721htjvpHWErR\n-----END CERTIFICATE-----\n"}],"ca_chain":["-----BEGIN CERTIFICATE-----\nMIICljCCAj2gAwIBAgIVAJVvXc29G+HpQEnJ1PQzzgFXC95UMAoGCCqGSM49BAMC\nMGgxGjAYBgNVBAMMEUludGVsIFNHWCBSb290IENBMRowGAYDVQQKDBFJbnRlbCBD\nb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNVBAgMAkNBMQsw\nCQYDVQQGEwJVUzAeFw0xODA1MjExMDUwMTBaFw0zMzA1MjExMDUwMTBaMHAxIjAg\nBgNVBAMMGUludGVsIFNHWCBQQ0sgUGxhdGZvcm0gQ0ExGjAYBgNVBAoMEUludGVs\nIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0Ex\nCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAENSB/7t21lXSO\n2Cuzpxw74eJB72EyDGgW5rXCtx2tVTLq6hKk6z+UiRZCnqR7psOvgqFeSxlmTlJl\neTmi2WYz3qOBuzCBuDAfBgNVHSMEGDAWgBQiZQzWWp00ifODtJVSv1AbOScGrDBS\nBgNVHR8ESzBJMEegRaBDhkFodHRwczovL2NlcnRpZmljYXRlcy50cnVzdGVkc2Vy\ndmljZXMuaW50ZWwuY29tL0ludGVsU0dYUm9vdENBLmRlcjAdBgNVHQ4EFgQUlW9d\nzb0b4elAScnU9DPOAVcL3lQwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB\nAf8CAQAwCgYIKoZIzj0EAwIDRwAwRAIgXsVki0w+i6VYGW3UF/22uaXe0YJDj1Ue\nnA+TjD1ai5cCICYb1SAmD5xkfTVpvo4UoyiSYxrDWLmUR4CI9NKyfPN+\n-----END CERTIFICATE-----\n","-----BEGIN CERTIFICATE-----\nMIICjzCCAjSgAwIBAgIUImUM1lqdNInzg7SVUr9QGzknBqwwCgYIKoZIzj0EAwIw\naDEaMBgGA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENv\ncnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJ\nBgNVBAYTAlVTMB4XDTE4MDUyMTEwNDUxMFoXDTQ5MTIzMTIzNTk1OVowaDEaMBgG\nA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENvcnBvcmF0\naW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJBgNVBAYT\nAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEC6nEwMDIYZOj/iPWsCzaEKi7\n1OiOSLRFhWGjbnBVJfVnkY4u3IjkDYYL0MxO4mqsyYjlBalTVYxFP2sJBK5zlKOB\nuzCBuDAfBgNVHSMEGDAWgBQiZQzWWp00ifODtJVSv1AbOScGrDBSBgNVHR8ESzBJ\nMEegRaBDhkFodHRwczovL2NlcnRpZmljYXRlcy50cnVzdGVkc2VydmljZXMuaW50\nZWwuY29tL0ludGVsU0dYUm9vdENBLmRlcjAdBgNVHQ4EFgQUImUM1lqdNInzg7SV\nUr9QGzknBqwwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwCgYI\nKoZIzj0EAwIDSQAwRgIhAOW/5QkR+S9CiSDcNoowLuPRLsWGf/Yi7GSX94BgwTwg\nAiEA4J0lrHoMs+Xo5o/sX6O9QWxHRAvZUGOdRQ7cvqRXaqI=\n-----END CERTIFICATE-----\n"]} \ No newline at end of file diff --git a/intel-sgx/dcap-artifact-retrieval/tests/data/azure_icelake_pckid.csv b/intel-sgx/dcap-artifact-retrieval/tests/data/azure_icelake_pckid.csv new file mode 100644 index 00000000..658b7067 --- /dev/null +++ b/intel-sgx/dcap-artifact-retrieval/tests/data/azure_icelake_pckid.csv @@ -0,0 +1 @@ +5133c5451dff82456e83fd5f8b4402304bf7b8edf5ea93e23e33eb8874c8a1ff341c2d74fdc68412ab0e4b000d9c36b6a9f4b07def96fe0859a3f55220691b24ac27722cdef60aaa2338db10a431ec25e05514ff77fb513d8a8e5eb56ef199c6440d8a8b99ec0cafe2c85b096ea57ba2e18004cb4ec88a75ac6328aee95f89b0e632ee5d17559b233e37e6e1cb1fa1a7581ebce564879372e561a2c830e5bf1ffd4f2d741c1dad519e752706f98d73fc572192a495ae129fb72daa48919382bdafd368f5a70534000a6c9dff5d889702af005f658edc3878b3f556d73be902f5defb6dbb2e78837403589587adbccd47de140434afb8660b93a3415a47cb23711156d93c795d0678d0f8a27512364481416e91831e66513a6ca404d50b1f9b288fbfc353c656343ddd95f4210a043f233827daa2b9e6152df81bea2c8b90595ec630f4e0c872f75b0000f0ebc38fcbfba9cf9d4f3817d88283be6ff21051fd19d52ffef8fd066ceacee381962a8d1460429da6ef1ae8c79eba3707250f2989c4,0000,08080e0dffff01000000000000000000,0d00,4041a3c4d3af9f15e68513108e773a7f diff --git a/intel-sgx/dcap-artifact-retrieval/tests/data/d68bdbd719d925b5d122a7c4522628f7.certs b/intel-sgx/dcap-artifact-retrieval/tests/data/d68bdbd719d925b5d122a7c4522628f7.certs new file mode 100644 index 00000000..8951f61d --- /dev/null +++ b/intel-sgx/dcap-artifact-retrieval/tests/data/d68bdbd719d925b5d122a7c4522628f7.certs @@ -0,0 +1 @@ +{"pck_data":[{"tcb":{"sgxtcbcomponents":[{"svn":20,"category":"","type":""},{"svn":20,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":7,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":13},"tcbm":"141402040180070000000000000000000D00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjTCCBDOgAwIBAgIUdI7BD4ibuXCVlB5fvVA0XAISA04wCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1OFoXDTMxMDYyODE3Mzg1\nOFowcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARt\nZ8OeVx2nWJvM4Z9Jbv5ykdcN5X/cGg9HRoTGaY9aHg8s4CaeUV/uHnMGmG4TvZED\nF2HxZvcM+EKVBlFZQglXo4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQU2If1BwPyOq3sUVm+EkyN\nZj7ZJK8wDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBDAjAgT2Cn2hCK9mer6183fMIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECARQwEAYLKoZIhvhNAQ0BAgIC\nARQwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEHMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgENMB8GCyqGSIb4TQENAQIS\nBBAUFAIEAYAHAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0gAMEUCICq/\nKE7WjFGp8WjxwzkBcImWx46CigHLLPlQz5xfKP6AAiEA8afB7XDZjBGAKTf3WMJ1\nH+VPlrShgNgVW/ac3CWz/nU=\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":20,"category":"","type":""},{"svn":20,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":13},"tcbm":"141402040180000000000000000000000D00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDSgAwIBAgIVAMcA9ouCtR9tDHObvdhApRiM4GSvMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NThaFw0zMTA2MjgxNzM4\nNThaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nHBSXDkjn3gL/yc/78FMdVd4rN4TsNFwKg0c0Eg/ApzX4ok1UnH1K0oCZTbkS3P/w\n4HNmGkSdbBBDyrGXN7S8daOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFBX2h4eh/DFQRHQMTtaD\nDI9OSC/sMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQwIwIE9gp9oQivZnq+tfN3zCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgEUMBAGCyqGSIb4TQENAQIC\nAgEUMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBADAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBDTAfBgsqhkiG+E0BDQEC\nEgQQFBQCBAGAAAAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNIADBFAiBE\n052lnG5RReJfvQdIZ+7ZxycAepLLCrDDgUxZ8YE0EwIhAPSapDyXD5Ygdh0Mce4C\nVhCWqm9/m4AL+p5zZrqcF+wE\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":19,"category":"","type":""},{"svn":19,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":7,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":13},"tcbm":"131302040180070000000000000000000D00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjzCCBDSgAwIBAgIVAKzPHufEuDsxQ/xuFGk1JXDBPMJqMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NThaFw0zMTA2MjgxNzM4\nNThaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nQVymjMWbvz60jwfpiQ0lSHYj1NkoxyL3c3IbK0cP8KjL2p/swU0tnjezyNtnjG1y\njN85JwNExxd8qUlJZAykvaOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFP7+TemCJLHKJvZm4JEe\nZIBLhLesMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQwIwIE9gp9oQivZnq+tfN3zCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgETMBAGCyqGSIb4TQENAQIC\nAgETMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBBzAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBDTAfBgsqhkiG+E0BDQEC\nEgQQExMCBAGABwAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNJADBGAiEA\n65hX7AFNzw0lZpDtkB0QX/JRmRw3d3Nhc46RTRkvDWkCIQDaCHr8P1mgZbUaRoKA\n8vCamdf+1by65SwbkLopRxGg4A==\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":19,"category":"","type":""},{"svn":19,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":13},"tcbm":"131302040180000000000000000000000D00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjTCCBDSgAwIBAgIVAOQAdm6NQWO8zwKEFKGqV3g6XKjlMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NThaFw0zMTA2MjgxNzM4\nNThaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nebYzu1+oHyj/YHEmRW7K9ZKPfTIUZ46eWTe6NyYgdIBTLPUjCC0LpveQQTEri1dh\nHrbmGkRkBvyKrM1wUb34UaOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFPE1i0LwrvvluH14oR2a\n3rYbScRiMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQwIwIE9gp9oQivZnq+tfN3zCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgETMBAGCyqGSIb4TQENAQIC\nAgETMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBADAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBDTAfBgsqhkiG+E0BDQEC\nEgQQExMCBAGAAAAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNHADBEAiBy\nzZYVEo8er/bagssqCWNxvwrdgfCIFFyRn1BS6AStwgIgLVQzZEYDa+lYLIF24fia\nlXn/Tr3LxfbIyUwZMBUMrQE=\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":17,"category":"","type":""},{"svn":17,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":7,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":11},"tcbm":"111102040180070000000000000000000B00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjDCCBDOgAwIBAgIUWx+e6PQgzNRQfW/osCJkQgXmaGcwCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1OFoXDTMxMDYyODE3Mzg1\nOFowcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASu\nOZDUAXmhVsRogM5sz3fdUm/Ysgz2bTknlofAS9syn8HUM3OfCxAZIzl/1JE4S4Wb\nKf4kNc4CnugD2NGC16aLo4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQU94WLgz29b7puaftXpbio\ngFoiVLIwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBDAjAgT2Cn2hCK9mer6183fMIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAREwEAYLKoZIhvhNAQ0BAgIC\nAREwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEHMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgELMB8GCyqGSIb4TQENAQIS\nBBAREQIEAYAHAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0cAMEQCIG7R\nEREBJNQ3AScST8JSITqgxhB11o/uQuVTrIBlBmdzAiApUI6uo037s2k5R0O/gXkZ\nQxzfoTcFk1chH2oU47p5iw==\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":17,"category":"","type":""},{"svn":17,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":7,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":10},"tcbm":"111102040180070000000000000000000A00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjTCCBDOgAwIBAgIUOW37ORJ3RkGiN5txu0XfJ8zV6jswCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1OFoXDTMxMDYyODE3Mzg1\nOFowcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARw\nzwv/fTCrCLGa403MJnpKWbu9cnI0awOapXVUO4pR0tqgdhRSK0BoLJF82J/EBzXe\niUz580nIxyECO9nKzQgAo4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQUcpZh+ZsCof95BeHfLn5L\nyKY8LH0wDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBDAjAgT2Cn2hCK9mer6183fMIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAREwEAYLKoZIhvhNAQ0BAgIC\nAREwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEHMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgEKMB8GCyqGSIb4TQENAQIS\nBBAREQIEAYAHAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0gAMEUCIAJY\nlwaes/McikV9R1QPqFDcLNh+t0O2zLOXU5uM4X7dAiEAkl3w9S3t13LNjXxIEfcO\n0o+1gTGS0Rk4tW2rMzrHzNY=\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":17,"category":"","type":""},{"svn":17,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":11},"tcbm":"111102040180000000000000000000000B00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjTCCBDOgAwIBAgIUAZ1Mod8Gkf6gWuuc6xsuW6hsAZowCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1OFoXDTMxMDYyODE3Mzg1\nOFowcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQw\n/aWOPTkGWT+CTbQnkKeeGX9tKxdZffCIK77f6kChpsHCNIi3f7czi1fZGtVHQZDz\nVo5gJ9XNlSxCHBjO2hSAo4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQUf6eTZFrLOAqLUZ5Ylts9\nxCaowycwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBDAjAgT2Cn2hCK9mer6183fMIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAREwEAYLKoZIhvhNAQ0BAgIC\nAREwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEAMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgELMB8GCyqGSIb4TQENAQIS\nBBAREQIEAYAAAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0gAMEUCIGvT\niCprwgpTyLptD+MvpXBmMhRWP7AZr1s+Tdxtj5ioAiEAsKw+nBV50R4km7FOG6tH\ndDTXdlofokT3hMW73TGCtuk=\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":17,"category":"","type":""},{"svn":17,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":10},"tcbm":"111102040180000000000000000000000A00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDSgAwIBAgIVALCl9Qp4reU2FKIFCr+rmbDg0HW2MAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NThaFw0zMTA2MjgxNzM4\nNThaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nKUZygQDFuhRfHak7NCAjRc65K14DsouHvEfhP2s71eOI3hlTU8jOJmGO6Bv94fRo\nSqcPGaKkaskqbNz+jZFBYKOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFPxgbihWlxobyRpGeJj7\nUlizEMw8MA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQwIwIE9gp9oQivZnq+tfN3zCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgERMBAGCyqGSIb4TQENAQIC\nAgERMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBADAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBCjAfBgsqhkiG+E0BDQEC\nEgQQERECBAGAAAAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNIADBFAiEA\nzevhd0qZlp1i7RXWqQP6haK93tx5Kox7Iw46ufZcbLICIAXlsEVbIBEteE/7Xt19\ne/iVezs0ryHHnxKo42oPR/+X\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":15,"category":"","type":""},{"svn":15,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":7,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":10},"tcbm":"0F0F02040180070000000000000000000A00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjTCCBDSgAwIBAgIVAJr//VzSpDJ0xg3/8dWgKvpKMXjCMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NThaFw0zMTA2MjgxNzM4\nNThaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nivh0sXqZ0ONroFgwczOG3VwiL5FMtgfpS5tgdlw4WMRL+PDP3GY1wcVxTxhjfBQ8\nuJAHFkTxv53P5s7VQOnsLKOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFPds2eoj+3+wi2YUEHuy\nOMsTqx/XMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQwIwIE9gp9oQivZnq+tfN3zCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgEPMBAGCyqGSIb4TQENAQIC\nAgEPMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBBzAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBCjAfBgsqhkiG+E0BDQEC\nEgQQDw8CBAGABwAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNHADBEAiAM\nQX1SuFwMBIq6lMUQKWyPQ80fseFHpgrdGxoyalGfagIgMc8w2UXWycSPPzQOqVPS\nqNVQJDA5VwBFy1sRy4ZWFWE=\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":15,"category":"","type":""},{"svn":15,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":10},"tcbm":"0F0F02040180000000000000000000000A00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjDCCBDOgAwIBAgIUPyXCHZyKHkatDR+9k59j9cZ6p8MwCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1OFoXDTMxMDYyODE3Mzg1\nOFowcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASD\nVe84hiB3RpVbRL2eGNrK8MM9caextlYchCcAR6RG6QJ1N1Js6Qr7AXrVraL/uYx0\nhdaMrmr7IRlvTQ0EFK9Ao4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQUKnTPcOBcKp6creyxvu5Q\nm+lMvpwwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBDAjAgT2Cn2hCK9mer6183fMIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAQ8wEAYLKoZIhvhNAQ0BAgIC\nAQ8wEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEAMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgEKMB8GCyqGSIb4TQENAQIS\nBBAPDwIEAYAAAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0cAMEQCIGzy\nJPt62pxhiMZd5C8QaLqPvlvF3GyhR1tyxF4Pqp02AiA9L+sI62uTey1Qp6zEF6Z6\ncuB9pIeWUE4PfhNw9rsmOg==\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":14,"category":"","type":""},{"svn":14,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":7,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":10},"tcbm":"0E0E02040180070000000000000000000A00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjDCCBDOgAwIBAgIUGnMJxnDn5OHCAuRd1rqWJCeysP4wCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1OFoXDTMxMDYyODE3Mzg1\nOFowcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATW\nN+wiGWiacMC1d3b3kP6xYb1ElvgHrKzpHOhcmZAKheGQEGzSKh1C9jK2pgfvhZ1g\n5Jl8wEJAxsc2Vo+gobFRo4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQUwPBJaL2GKu4cojSUNyJn\nUnJq53cwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBDAjAgT2Cn2hCK9mer6183fMIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAQ4wEAYLKoZIhvhNAQ0BAgIC\nAQ4wEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEHMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgEKMB8GCyqGSIb4TQENAQIS\nBBAODgIEAYAHAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0cAMEQCIDIg\ne/bMCdosF+wOn6zK2JaEN6NPm3nHxUugOjc8U+hmAiAhfxzQRfxPfFOIUItTe9cG\nhLioO5BQrxI+KpEh/WLxxQ==\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":14,"category":"","type":""},{"svn":14,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":10},"tcbm":"0E0E02040180000000000000000000000A00","cert":"-----BEGIN CERTIFICATE-----\nMIIEjDCCBDOgAwIBAgIUDX4xjVdlFM096XNB8CntriuBQsswCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1OFoXDTMxMDYyODE3Mzg1\nOFowcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARt\nAvjf2RG0wZEk+uJCx2L4ufR+Y/J4mk97ZzmpAsmduXHFdnyY5ERDYaR+49mNOM4Y\nsqHTLsiqoDGjB/V0En9oo4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQUK7zq4h9MfCRDoEl/WkV8\n2TzS5kUwDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBDAjAgT2Cn2hCK9mer6183fMIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAQ4wEAYLKoZIhvhNAQ0BAgIC\nAQ4wEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEAMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgEKMB8GCyqGSIb4TQENAQIS\nBBAODgIEAYAAAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0cAMEQCIDnz\nTIH/ccDPv+1FkrYblEePdbCo+Zm74H5Xy1IyqbnmAiANCbGIj8FqOI1nNpYhxOjp\nRbWv8vj5lq/euvGn2UgWSA==\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":13,"category":"","type":""},{"svn":13,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":3,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":9},"tcbm":"0D0D02040180030000000000000000000900","cert":"-----BEGIN CERTIFICATE-----\nMIIEjzCCBDSgAwIBAgIVAO7nuyrWnOP6ClRhfWmP+W8F0vjhMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NThaFw0zMTA2MjgxNzM4\nNThaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nVd5iRpMGKn/haq5TSBm8kDuvWvJCZvGIOD1myYJPHi8/0A3tLPOLoT5W8vqNSLTO\nUSkC1T5xDNXYhNUlIiDq3KOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFCxsEMMQS3FlSOZDl0AS\nBefDmSC7MA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQwIwIE9gp9oQivZnq+tfN3zCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgENMBAGCyqGSIb4TQENAQIC\nAgENMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBAzAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBCTAfBgsqhkiG+E0BDQEC\nEgQQDQ0CBAGAAwAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNJADBGAiEA\nruz9x0BNek5qQBMdgRtRXu0F8qtN2yPDe0gZYrtigOsCIQD0JaugtkJZydSId1Rn\n69rjVafvLxjJmwMFfIsLAMBf6w==\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":13,"category":"","type":""},{"svn":13,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":9},"tcbm":"0D0D02040180000000000000000000000900","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDSgAwIBAgIVAIXN+RgmGbrfG2Y4I0siPWWA8q2WMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NThaFw0zMTA2MjgxNzM4\nNThaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nzpwKTTVR36QpDTSVGowhOiMrcIeMGvycMaANj9c6GV4F8waV95AYhIj3s8fw0opY\nd6J7qr4yEj/JjBsHg7tq6aOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFAIb5dF5Dp3meE59o03k\nAOtw1wPbMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQwIwIE9gp9oQivZnq+tfN3zCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgENMBAGCyqGSIb4TQENAQIC\nAgENMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBADAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBCTAfBgsqhkiG+E0BDQEC\nEgQQDQ0CBAGAAAAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNIADBFAiEA\nkQYiHbwE1lOR+7EKfFR9idnd/E4/Ti2nQJqEbcpsIg4CIDSOiuKkX7H+EkGtvQ2u\n1bI967xdgPHIjT9/SdfBp++e\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":6,"category":"","type":""},{"svn":6,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":7},"tcbm":"060602040180010000000000000000000700","cert":"-----BEGIN CERTIFICATE-----\nMIIEjTCCBDSgAwIBAgIVAMuY4ugP890yKUf7q5HEar8zluJ6MAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NThaFw0zMTA2MjgxNzM4\nNThaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nuULB3+rQmJokPCCG5IOPKshRv3H31lCrXmR4uFp3geniLK6gUDjHuBpmSJKbzkYj\nWTLxCmJhiVvw/pVx+kbg86OCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFMIHL8C94N2fhOzGn5i+\nX0VsJdPcMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQwIwIE9gp9oQivZnq+tfN3zCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgEGMBAGCyqGSIb4TQENAQIC\nAgEGMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBATAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBBzAfBgsqhkiG+E0BDQEC\nEgQQBgYCBAGAAQAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNHADBEAiB/\nara2F45p2dweDtMtD+GJ+6Z11Uxxue7E9vEC99irRgIgA1YviPqSTJtEsy+XydW6\n9cTHSqx6GdU7W/Dor14yEVs=\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":6,"category":"","type":""},{"svn":6,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":7},"tcbm":"060602040180000000000000000000000700","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDSgAwIBAgIVAO9kDUhSX6x7Hu/MVZt/KrAR8JvkMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NThaFw0zMTA2MjgxNzM4\nNThaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\n49bI2rgLyoliDQuzuyrpsM1C/40ifr3whcLTwJBPWUiKMgUB2NEJymYLscgfC/Ut\nR+G6A/YFnXPiFTt2vdWqM6OCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFAEAJu0AvmFDFZAzuaj6\nPqTtvYcvMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQwIwIE9gp9oQivZnq+tfN3zCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgEGMBAGCyqGSIb4TQENAQIC\nAgEGMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBADAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBBzAfBgsqhkiG+E0BDQEC\nEgQQBgYCBAGAAAAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNIADBFAiEA\njknHY9nm70yWKh8ul+KRDpde5k467pbzAn8ASIZj70kCIAJt1JjXcvZoBIZbpcIS\n4nhbKsfBn4/LxwjbJe/8anCo\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":5,"category":"","type":""},{"svn":5,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":7},"tcbm":"050502040180010000000000000000000700","cert":"-----BEGIN CERTIFICATE-----\nMIIEjzCCBDSgAwIBAgIVANl8dM7wTtn//FbOg2ewRWH5jc/yMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NThaFw0zMTA2MjgxNzM4\nNThaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\n8859rr+Hh4zZ+JQV4jxsT8xWP0A19okz74pP5A9To/VcYsofl9nW1yiSJVN+EQ7A\nvPas2aqEmWOF1nHO81D1MaOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFKNR5fZjD8yoFxoc3L/o\nxPs7zPcgMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQwIwIE9gp9oQivZnq+tfN3zCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgEFMBAGCyqGSIb4TQENAQIC\nAgEFMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBATAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBBzAfBgsqhkiG+E0BDQEC\nEgQQBQUCBAGAAQAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNJADBGAiEA\n5jM9ya/Xw5JXfTGegedUP/xryx1ZRfxK7m9tTmXTZ4kCIQCzZ2N9eJz4G/N00E3e\nyunGa+wH5xj7js0HvKxVwHsmhQ==\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":5,"category":"","type":""},{"svn":5,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":6},"tcbm":"050502040180010000000000000000000600","cert":"-----BEGIN CERTIFICATE-----\nMIIEjTCCBDOgAwIBAgIUDqc1b98vDFEQztHqA4DqoN/jmMYwCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1OFoXDTMxMDYyODE3Mzg1\nOFowcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARt\nbfAU9Ii0ZKUydDfZbiNaaPs197ZrPJ6i7lpAsl1C6HfeZIWgbuA03jaRSuSpWE8H\nQjYEcJ1nc5uZXshmRdAVo4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQUYoO+mxQ4Vwcx3IQLDdcc\nIu6fa0swDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBDAjAgT2Cn2hCK9mer6183fMIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAQUwEAYLKoZIhvhNAQ0BAgIC\nAQUwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEBMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgEGMB8GCyqGSIb4TQENAQIS\nBBAFBQIEAYABAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0gAMEUCICmU\nmmr3jK5BSh+2zRY0mLnVEmSWu+vT1fy/aFTqcfS+AiEA22Kf1vFXTK04QV8L2cmk\nD2HE7pkoYWbe6/yKqrPqIeU=\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":5,"category":"","type":""},{"svn":5,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":7},"tcbm":"050502040180000000000000000000000700","cert":"-----BEGIN CERTIFICATE-----\nMIIEjTCCBDSgAwIBAgIVAK/exPa7HwVuMOJQ38IalbcCDZJtMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NThaFw0zMTA2MjgxNzM4\nNThaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\nIyFfFZrMIFfEbgfaCF8gkC9JpOR2jbZGLRSmOw2KHEG2UeH0hL6pYsagmzqmg9Nv\n0TgRi1erhMRXqAamlHdZDKOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFI15QzIuMObtgABFOmLT\nCTpt/VDaMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQwIwIE9gp9oQivZnq+tfN3zCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgEFMBAGCyqGSIb4TQENAQIC\nAgEFMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBADAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBBzAfBgsqhkiG+E0BDQEC\nEgQQBQUCBAGAAAAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNHADBEAiAv\nHWL+SqMwDU496QV2nJZE5GDwtVsU+vK6nEChgiMjEQIgVRDOqFNVMAGroL20soa8\nZNUAMncgFIBV2WXVRq4o84I=\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":5,"category":"","type":""},{"svn":5,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":6},"tcbm":"050502040180000000000000000000000600","cert":"-----BEGIN CERTIFICATE-----\nMIIEjzCCBDSgAwIBAgIVAIAtxlBQjH4k/E8dD5GzGhGXIRsXMAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NThaFw0zMTA2MjgxNzM4\nNThaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\n3yMUwSyKhkV+4RjtuVg8/sCMa8mQp7J4aBfmnPWwESIN84i63lQMK32K7G/B/Fo1\nHsiWJg7JQ1OV8/XLftA69qOCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFIRkE1ziYrKiSmx9lDRW\nEAuaO3KBMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQwIwIE9gp9oQivZnq+tfN3zCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgEFMBAGCyqGSIb4TQENAQIC\nAgEFMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBADAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBBjAfBgsqhkiG+E0BDQEC\nEgQQBQUCBAGAAAAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNJADBGAiEA\n0jNHbBd/liZLXbIfhX1bUNKuaxzb7runAnokfcWixAgCIQDknHdh5AUdlOiAuI4y\n/lbkUvXbV9uodmh+TZYLx+0yaQ==\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":4,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":5},"tcbm":"040402040180000000000000000000000500","cert":"-----BEGIN CERTIFICATE-----\nMIIEjjCCBDSgAwIBAgIVAIXRXkhw2K7d4/tdiQOp7tBPW8V6MAoGCCqGSM49BAMC\nMHExIzAhBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yNDA2MjgxNzM4NThaFw0zMTA2MjgxNzM4\nNThaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlmaWNhdGUxGjAYBgNV\nBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkG\nA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE\ne7WI3I7omJbTKOwxT0g2CiBW/f2UYWXSStBEzR6B4JIpjwJoN9zFnk7tI0GhpwHt\ndaue6Po7fsE3q61ashONP6OCAqgwggKkMB8GA1UdIwQYMBaAFNDoqtp11/kuSReY\nPHsUZdDV8llNMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHBzOi8vYXBpLnRydXN0ZWRz\nZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRpb24vdjQvcGNrY3JsP2Nh\nPXByb2Nlc3NvciZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFEAg1I9Rwy7jvxORBSla\nID+Gx5TMMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIIB1AYJKoZIhvhN\nAQ0BBIIBxTCCAcEwHgYKKoZIhvhNAQ0BAQQQwIwIE9gp9oQivZnq+tfN3zCCAWQG\nCiqGSIb4TQENAQIwggFUMBAGCyqGSIb4TQENAQIBAgEEMBAGCyqGSIb4TQENAQIC\nAgEEMBAGCyqGSIb4TQENAQIDAgECMBAGCyqGSIb4TQENAQIEAgEEMBAGCyqGSIb4\nTQENAQIFAgEBMBEGCyqGSIb4TQENAQIGAgIAgDAQBgsqhkiG+E0BDQECBwIBADAQ\nBgsqhkiG+E0BDQECCAIBADAQBgsqhkiG+E0BDQECCQIBADAQBgsqhkiG+E0BDQEC\nCgIBADAQBgsqhkiG+E0BDQECCwIBADAQBgsqhkiG+E0BDQECDAIBADAQBgsqhkiG\n+E0BDQECDQIBADAQBgsqhkiG+E0BDQECDgIBADAQBgsqhkiG+E0BDQECDwIBADAQ\nBgsqhkiG+E0BDQECEAIBADAQBgsqhkiG+E0BDQECEQIBBTAfBgsqhkiG+E0BDQEC\nEgQQBAQCBAGAAAAAAAAAAAAAADAQBgoqhkiG+E0BDQEDBAIAADAUBgoqhkiG+E0B\nDQEEBAYAkG6hAAAwDwYKKoZIhvhNAQ0BBQoBADAKBggqhkjOPQQDAgNIADBFAiBP\nbDtjBFisKpWJOu44dL4vwOdya0tQtzBeBA+xHNNA5AIhAO4wDMbUfyjWGVUMBRds\nW9mqEhOY6EhOreMHDFlT8RFH\n-----END CERTIFICATE-----\n"},{"tcb":{"sgxtcbcomponents":[{"svn":2,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":2,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":128,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":4},"tcbm":"020202040180000000000000000000000400","cert":"-----BEGIN CERTIFICATE-----\nMIIEjDCCBDOgAwIBAgIUehpiD0XkA14DjZc7qtXCXbGM2I8wCgYIKoZIzj0EAwIw\ncTEjMCEGA1UEAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTI0MDYyODE3Mzg1OFoXDTMxMDYyODE3Mzg1\nOFowcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR0\nIzsaIEC44vgGEE9m0oMVao6x0GKAIhHKi/IUGyA6/HS7fBetB7LEQ1QcPuvFcCRd\nCFeBY0jgG1aol8FIhfMAo4ICqDCCAqQwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8\nexRl0NXyWU0wbAYDVR0fBGUwYzBhoF+gXYZbaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92NC9wY2tjcmw/Y2E9\ncHJvY2Vzc29yJmVuY29kaW5nPWRlcjAdBgNVHQ4EFgQU5rTODd31YlDa6WJtCyzc\n1pBWmQswDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0B\nDQEEggHFMIIBwTAeBgoqhkiG+E0BDQEBBBDAjAgT2Cn2hCK9mer6183fMIIBZAYK\nKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhNAQ0BAgECAQIwEAYLKoZIhvhNAQ0BAgIC\nAQIwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0BAgQCAQQwEAYLKoZIhvhN\nAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIHAgEAMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgEEMB8GCyqGSIb4TQENAQIS\nBBACAgIEAYAAAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMCA0cAMEQCIDDZ\nHln+97ZhW0x5ZtstmkaR7M8qyweFMj35qIE11cXYAiBQel51SiiDnQvfxwdREGtn\nQoRatPtkHazfJXNydYbR6A==\n-----END CERTIFICATE-----\n"}],"ca_chain":["-----BEGIN CERTIFICATE-----\nMIICmDCCAj6gAwIBAgIVANDoqtp11/kuSReYPHsUZdDV8llNMAoGCCqGSM49BAMC\nMGgxGjAYBgNVBAMMEUludGVsIFNHWCBSb290IENBMRowGAYDVQQKDBFJbnRlbCBD\nb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNVBAgMAkNBMQsw\nCQYDVQQGEwJVUzAeFw0xODA1MjExMDUwMTBaFw0zMzA1MjExMDUwMTBaMHExIzAh\nBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQKDBFJbnRl\nbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNVBAgMAkNB\nMQswCQYDVQQGEwJVUzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABL9q+NMp2IOg\ntdl1bk/uWZ5+TGQm8aCi8z78fs+fKCQ3d+uDzXnVTAT2ZhDCifyIuJwvN3wNBp9i\nHBSSMJMJrBOjgbswgbgwHwYDVR0jBBgwFoAUImUM1lqdNInzg7SVUr9QGzknBqww\nUgYDVR0fBEswSTBHoEWgQ4ZBaHR0cHM6Ly9jZXJ0aWZpY2F0ZXMudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9JbnRlbFNHWFJvb3RDQS5kZXIwHQYDVR0OBBYEFNDo\nqtp11/kuSReYPHsUZdDV8llNMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAG\nAQH/AgEAMAoGCCqGSM49BAMCA0gAMEUCIQCJgTbtVqOyZ1m3jqiAXM6QYa6r5sWS\n4y/G7y8uIJGxdwIgRqPvBSKzzQagBLQq5s5A70pdoiaRJ8z/0uDz4NgV91k=\n-----END CERTIFICATE-----\n","-----BEGIN CERTIFICATE-----\nMIICjzCCAjSgAwIBAgIUImUM1lqdNInzg7SVUr9QGzknBqwwCgYIKoZIzj0EAwIw\naDEaMBgGA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENv\ncnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJ\nBgNVBAYTAlVTMB4XDTE4MDUyMTEwNDUxMFoXDTQ5MTIzMTIzNTk1OVowaDEaMBgG\nA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENvcnBvcmF0\naW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJBgNVBAYT\nAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEC6nEwMDIYZOj/iPWsCzaEKi7\n1OiOSLRFhWGjbnBVJfVnkY4u3IjkDYYL0MxO4mqsyYjlBalTVYxFP2sJBK5zlKOB\nuzCBuDAfBgNVHSMEGDAWgBQiZQzWWp00ifODtJVSv1AbOScGrDBSBgNVHR8ESzBJ\nMEegRaBDhkFodHRwczovL2NlcnRpZmljYXRlcy50cnVzdGVkc2VydmljZXMuaW50\nZWwuY29tL0ludGVsU0dYUm9vdENBLmRlcjAdBgNVHQ4EFgQUImUM1lqdNInzg7SV\nUr9QGzknBqwwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwCgYI\nKoZIzj0EAwIDSQAwRgIhAOW/5QkR+S9CiSDcNoowLuPRLsWGf/Yi7GSX94BgwTwg\nAiEA4J0lrHoMs+Xo5o/sX6O9QWxHRAvZUGOdRQ7cvqRXaqI=\n-----END CERTIFICATE-----\n"]} \ No newline at end of file diff --git a/intel-sgx/dcap-artifact-retrieval/tests/data/pckid_retrieval.csv b/intel-sgx/dcap-artifact-retrieval/tests/data/pckid_retrieval.csv new file mode 100644 index 00000000..850a7d7f --- /dev/null +++ b/intel-sgx/dcap-artifact-retrieval/tests/data/pckid_retrieval.csv @@ -0,0 +1,6 @@ +5d39f104e642e51c91507932f063f6548c7ae77d7fb825fec03a2bc950e1424abbe295cd9309203487f82599e7eed74453ba103332f2345d3f48fe8389e5776a9102b6e2ec857fcac748c31dffeb1c0c0bd3f747ca051c53be94305dde74aad80f355ba0ad0d2456cde6adce974abb1462f0220932918a87073a720ed642d4bb281bd023902dfb0a153383d3d87b40d2a80a914c75d4324d0e75992270b70a2945b6c0991f4778e3e40b38b14bba7edafeb01b60828b587cf5cfb361fe1120c664d7d38eae91b733aaf96fd32ad360f53a9f3e2c06a09a8b436d4a9ad943130fee240f0462ddc6583c53aa5f1721c4c024ab825eb1dd917a2b9d717d0cdb5df4949d9f5448917c3af2c43f4543bf506ac32ed0a8804efc2dd676bafadfd9d694a3e5b6299292ab5db92159439a51b75a49f5cca83c1939446c3454cb627cb8ed97182323d454c9fd726dfe9f5b35b9dbb7bf755444cb3288bbac0284d52794f892118191c52f65c16e068ed5389cd2d58e03c58c1090f4b7fdb00cd12671b719,0000,0f0f0205ff8007000000000000000000,0900,16a5b41ebb076d263a1e39e64e7175e7 +5d39f104e642e51c91507932f063f6548c7ae77d7fb825fec03a2bc950e1424abbe295cd9309203487f82599e7eed74453ba103332f2345d3f48fe8389e5776a9102b6e2ec857fcac748c31dffeb1c0c0bd3f747ca051c53be94305dde74aad80f355ba0ad0d2456cde6adce974abb1462f0220932918a87073a720ed642d4bb281bd023902dfb0a153383d3d87b40d2a80a914c75d4324d0e75992270b70a2945b6c0991f4778e3e40b38b14bba7edafeb01b60828b587cf5cfb361fe1120c664d7d38eae91b733aaf96fd32ad360f53a9f3e2c06a09a8b436d4a9ad943130fee240f0462ddc6583c53aa5f1721c4c024ab825eb1dd917a2b9d717d0cdb5df4949d9f5448917c3af2c43f4543bf506ac32ed0a8804efc2dd676bafadfd9d694a3e5b6299292ab5db92159439a51b75a49f5cca83c1939446c3454cb627cb8ed97182323d454c9fd726dfe9f5b35b9dbb7bf755444cb3288bbac0284d52794f892118191c52f65c16e068ed5389cd2d58e03c58c1090f4b7fdb00cd12671b719,0000,0f0f0205ff8007000000000000000000,0900,16a5b41ebb076d263a1e39e64e7175e7 +326ac81779682eabeef03be520a58c4cc1148790fa4005069b0b248b2320136d4720e9a4ada17435759183911d1c69fd98d23c7001f57a70648b4668370fd87467935054a9118a4f4e11335de4046150a392c1e50730c8099aa4b9e22f3f116b0c077cae0ebd684e0f0cc86890e82776312d532833e98a28bf6d6123c03f73dbb49c31b78599cbc631191e65abed74d61a333fa428edeeeb0d246b99a4040df4bd1bbd94666a7665f1061d388b576d20384e11486b57308e7a6a9b579e235810e49f341a6fb43af08c8f92dc4841a42ed8e2cfe1e9081524df9eebde0dab20e6c482f2b448a57e6009a2decb27e004a9b3fb08dc54af18e8b62df3ac539141f6a5cc5be4b6bf3253a11915409139cbec82b37165e806fabb015ae33ea2c3511c5f3696d52e71142deecd1181a197b88dcda5489d9f67b36e4d6b4d6263ab866607eb326f9f17c15cc56579533c45344153557e9ef9a3febdbe33c33ba6cca240e8599cf8b242206bb17c1b7441370b608ff1e33bf29c464c318992ebe1472222,0000,0e0e0205ff8007000000000000000000,0900,53700d9403f4b311b9c5ec7d04c558bd +31a8993d28096df3fd3385cdaaba4523acc92dd1f6a65cb8e294845d0e2fe34d60560cd8de86b1d5ac75195a508559c7fb86d19685a0b240727f05aa06189fd3921dcca3ee42e788b63a04ee30f0186d886461dab99c36ec557e797b98d40b2f6c585de5560763e869c699d4965fe6e03c733459bac9a3531a92b3cf4231ef7514b29202c758464ddc97d1e00dd7d3a08a371114aa1406ae93338064bd1aaa7a5f1b2dad253753aa77695e14537702d85721f501dd4f63744142603a34057712aa8f77556b318763d76703abfebf666faf9200221c797747a0e5fd5ddd7ab670d6f95f66154851b4dc55e215e5fc04e730b6bdff233b979bd669dd30e53a97d1937d2fec573c20b951b49a2a8c06c855a57fad74d72ecdbb4ecc92831b7e25da1e42823dfdf4f2b3301ad11d32cecd9c4e745e8c42702b695496600b0912a55c574195cd1f8160b350907524fe0ae58724562cb655ca65d36d4e8ddee53a65d9f9c3f3273503c62c37fd4a91e03715b9accba7ee89413812ca5cf77110b3740f,0000,0e0e0205ff8007000000000000000000,0900,7baedb1f28d2222cb3acee6891efb40f +b7399ad989557ec5a3a6eecbee990211490f36c4f6fb4b536038b740de9a2acc3ae7d31e2a5a0c49620d52e1336b0616cb55ceb761dc81d33280db20926974f51b9cfe1f5e0d18242291e8de5a52d1a420c5342e691c66f56ae126772bcdb0579d5d4cd02177c517a6ae2ac5bf6378fd8f8dc5a384a8078745b32b6409010c363b73de1da5d06c8110dd53ce4d4036e06d9b35acbee45cb6822797fbc871e898dad13fad436eb41b010e1d9bbbe67191331205e14850d06a57a94735a57e013eda206defb052b53c6c4d9aaeb11bb92b419594cbe924224c2508e280f15aefc409a4bd2f063e38a0f55bc797575874e8dd6c98333e371629c1f2a184d86f1f5bb914d5d8fc6c7718a39d30c7f347b0c45291f496fd36fd14b52fb00fc3b19f5a31cfeb87faff1c0814f784dd08072267c5e2516ce6c8e9b66b1128ab0c7aa0b9ce61f487303c85fce5d5a8275a14ba1ec5d093cf8247bddf369a115c32f3147bbcb9a93db768e7b9911e7983b35ac17e67b606752b9dccb686c60a6bd10046ca,0000,0f0f0205ff8007000000000000000000,0700,d68bdbd719d925b5d122a7c4522628f7 +988a71dc83670b9a5ae3e8b40dc9ed786e67050913daee487e9a1d1fb7ec980146fd4301bc1f1d06962a87ac187407155bab0c264e54fafdc2e32a7030925dacd581bf99e02914ab8b1326013895c03b0181af5cb8f52ed913859ab931e187232c87ed731bb6d39e5910be0c0a63b10e554196b6a03c67f15f5eb5bbcdfa596bb1406719b55a738913db969e5b435f428a13722ae735dfa2bb34e231fc9b1d7276afd4866ee3e0f0b214e019aa8a13c563cfb078b8954746deece73d97bbdcd5ea6f86227419a8d76405c0ca35063b2c45d4817e2bfba8842d6f516c2e6d3e8578004cb90e2471666f6dbeaae48a945a156f2932aef03cd304f5fd1e71a3716a5e57bdb1681b03ba76c0ea9ca4dc0d4a93ad15d69da246c257db52531828fc3924b8ea2effaed2e30770f78d6b37ea8989be2f66566ac318e6ba672146697c71565a614b5a118d6a0cea3877eba353158509a8c344a4a93e117e03eacebd57e00ebe59db7ed4982d1e115d519b4661cd3644fe5c8e85777b996b3aa2fe1c2f95,0000,0707181a03ff01ff0000000000000000,0f00,908da94d8f8a3c31db56855dec5892aa diff --git a/intel-sgx/dcap-artifact-retrieval/tests/data/processor.crl b/intel-sgx/dcap-artifact-retrieval/tests/data/processor.crl new file mode 100644 index 00000000..475b38f0 --- /dev/null +++ b/intel-sgx/dcap-artifact-retrieval/tests/data/processor.crl @@ -0,0 +1 @@ +{"crl":"-----BEGIN X509 CRL-----\nMIIBKjCB0QIBATAKBggqhkjOPQQDAjBxMSMwIQYDVQQDDBpJbnRlbCBTR1ggUENL\nIFByb2Nlc3NvciBDQTEaMBgGA1UECgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNV\nBAcMC1NhbnRhIENsYXJhMQswCQYDVQQIDAJDQTELMAkGA1UEBhMCVVMXDTI0MDYy\nODE3MTA1OFoXDTI0MDcyODE3MTA1OFqgLzAtMAoGA1UdFAQDAgEBMB8GA1UdIwQY\nMBaAFNDoqtp11/kuSReYPHsUZdDV8llNMAoGCCqGSM49BAMCA0gAMEUCIQC+26AP\n2ohCNpZsVvJv40Gls9valyiYfT4tlHXLdxmqCgIgIFbHbkoJH+OPq5WbSEO3PJ7y\n8zkHsHTgNjst7rhFDA8=\n-----END X509 CRL-----\n","ca_chain":["-----BEGIN CERTIFICATE-----\nMIICmDCCAj6gAwIBAgIVANDoqtp11/kuSReYPHsUZdDV8llNMAoGCCqGSM49BAMC\nMGgxGjAYBgNVBAMMEUludGVsIFNHWCBSb290IENBMRowGAYDVQQKDBFJbnRlbCBD\nb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNVBAgMAkNBMQsw\nCQYDVQQGEwJVUzAeFw0xODA1MjExMDUwMTBaFw0zMzA1MjExMDUwMTBaMHExIzAh\nBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQKDBFJbnRl\nbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNVBAgMAkNB\nMQswCQYDVQQGEwJVUzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABL9q+NMp2IOg\ntdl1bk/uWZ5+TGQm8aCi8z78fs+fKCQ3d+uDzXnVTAT2ZhDCifyIuJwvN3wNBp9i\nHBSSMJMJrBOjgbswgbgwHwYDVR0jBBgwFoAUImUM1lqdNInzg7SVUr9QGzknBqww\nUgYDVR0fBEswSTBHoEWgQ4ZBaHR0cHM6Ly9jZXJ0aWZpY2F0ZXMudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9JbnRlbFNHWFJvb3RDQS5kZXIwHQYDVR0OBBYEFNDo\nqtp11/kuSReYPHsUZdDV8llNMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAG\nAQH/AgEAMAoGCCqGSM49BAMCA0gAMEUCIQCJgTbtVqOyZ1m3jqiAXM6QYa6r5sWS\n4y/G7y8uIJGxdwIgRqPvBSKzzQagBLQq5s5A70pdoiaRJ8z/0uDz4NgV91k=\n-----END CERTIFICATE-----\n","-----BEGIN CERTIFICATE-----\nMIICjzCCAjSgAwIBAgIUImUM1lqdNInzg7SVUr9QGzknBqwwCgYIKoZIzj0EAwIw\naDEaMBgGA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENv\ncnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJ\nBgNVBAYTAlVTMB4XDTE4MDUyMTEwNDUxMFoXDTQ5MTIzMTIzNTk1OVowaDEaMBgG\nA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENvcnBvcmF0\naW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJBgNVBAYT\nAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEC6nEwMDIYZOj/iPWsCzaEKi7\n1OiOSLRFhWGjbnBVJfVnkY4u3IjkDYYL0MxO4mqsyYjlBalTVYxFP2sJBK5zlKOB\nuzCBuDAfBgNVHSMEGDAWgBQiZQzWWp00ifODtJVSv1AbOScGrDBSBgNVHR8ESzBJ\nMEegRaBDhkFodHRwczovL2NlcnRpZmljYXRlcy50cnVzdGVkc2VydmljZXMuaW50\nZWwuY29tL0ludGVsU0dYUm9vdENBLmRlcjAdBgNVHQ4EFgQUImUM1lqdNInzg7SV\nUr9QGzknBqwwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwCgYI\nKoZIzj0EAwIDSQAwRgIhAOW/5QkR+S9CiSDcNoowLuPRLsWGf/Yi7GSX94BgwTwg\nAiEA4J0lrHoMs+Xo5o/sX6O9QWxHRAvZUGOdRQ7cvqRXaqI=\n-----END CERTIFICATE-----\n"]} \ No newline at end of file diff --git a/intel-sgx/dcap-artifact-retrieval/tests/data/qe3_identity.id b/intel-sgx/dcap-artifact-retrieval/tests/data/qe3_identity.id new file mode 100644 index 00000000..80553263 --- /dev/null +++ b/intel-sgx/dcap-artifact-retrieval/tests/data/qe3_identity.id @@ -0,0 +1 @@ +{"raw_enclave_identity":"{\"id\":\"QE\",\"version\":2,\"issueDate\":\"2024-06-28T16:42:00Z\",\"nextUpdate\":\"2024-07-28T16:42:00Z\",\"tcbEvaluationDataNumber\":16,\"miscselect\":\"00000000\",\"miscselectMask\":\"FFFFFFFF\",\"attributes\":\"11000000000000000000000000000000\",\"attributesMask\":\"FBFFFFFFFFFFFFFF0000000000000000\",\"mrsigner\":\"8C4F5775D796503E96137F77C68A829A0056AC8DED70140B081B094490C57BFF\",\"isvprodid\":1,\"tcbLevels\":[{\"tcb\":{\"isvsvn\":8},\"tcbDate\":\"2023-08-09T00:00:00Z\",\"tcbStatus\":\"UpToDate\"},{\"tcb\":{\"isvsvn\":6},\"tcbDate\":\"2021-11-10T00:00:00Z\",\"tcbStatus\":\"OutOfDate\",\"advisoryIDs\":[\"INTEL-SA-00615\"]},{\"tcb\":{\"isvsvn\":5},\"tcbDate\":\"2020-11-11T00:00:00Z\",\"tcbStatus\":\"OutOfDate\",\"advisoryIDs\":[\"INTEL-SA-00477\",\"INTEL-SA-00615\"]},{\"tcb\":{\"isvsvn\":4},\"tcbDate\":\"2019-11-13T00:00:00Z\",\"tcbStatus\":\"OutOfDate\",\"advisoryIDs\":[\"INTEL-SA-00334\",\"INTEL-SA-00477\",\"INTEL-SA-00615\"]},{\"tcb\":{\"isvsvn\":2},\"tcbDate\":\"2019-05-15T00:00:00Z\",\"tcbStatus\":\"OutOfDate\",\"advisoryIDs\":[\"INTEL-SA-00219\",\"INTEL-SA-00293\",\"INTEL-SA-00334\",\"INTEL-SA-00477\",\"INTEL-SA-00615\"]},{\"tcb\":{\"isvsvn\":1},\"tcbDate\":\"2018-08-15T00:00:00Z\",\"tcbStatus\":\"OutOfDate\",\"advisoryIDs\":[\"INTEL-SA-00202\",\"INTEL-SA-00219\",\"INTEL-SA-00293\",\"INTEL-SA-00334\",\"INTEL-SA-00477\",\"INTEL-SA-00615\"]}]}","signature":[48,70,2,33,0,238,58,64,30,91,160,89,159,182,12,62,209,148,86,58,4,183,212,240,134,219,49,199,0,88,106,21,214,13,96,219,144,2,33,0,216,185,81,175,200,48,142,32,210,47,171,168,129,21,127,99,75,157,16,107,78,218,178,245,0,4,50,83,75,17,33,204],"ca_chain":["-----BEGIN CERTIFICATE-----\nMIICizCCAjKgAwIBAgIUfjiC1ftVKUpASY5FhAPpFJG99FUwCgYIKoZIzj0EAwIw\naDEaMBgGA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENv\ncnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJ\nBgNVBAYTAlVTMB4XDTE4MDUyMTEwNTAxMFoXDTI1MDUyMTEwNTAxMFowbDEeMBwG\nA1UEAwwVSW50ZWwgU0dYIFRDQiBTaWduaW5nMRowGAYDVQQKDBFJbnRlbCBDb3Jw\nb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNVBAgMAkNBMQswCQYD\nVQQGEwJVUzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABENFG8xzydWRfK92bmGv\nP+mAh91PEyV7Jh6FGJd5ndE9aBH7R3E4A7ubrlh/zN3C4xvpoouGlirMba+W2lju\nypajgbUwgbIwHwYDVR0jBBgwFoAUImUM1lqdNInzg7SVUr9QGzknBqwwUgYDVR0f\nBEswSTBHoEWgQ4ZBaHR0cHM6Ly9jZXJ0aWZpY2F0ZXMudHJ1c3RlZHNlcnZpY2Vz\nLmludGVsLmNvbS9JbnRlbFNHWFJvb3RDQS5kZXIwHQYDVR0OBBYEFH44gtX7VSlK\nQEmORYQD6RSRvfRVMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMAoGCCqG\nSM49BAMCA0cAMEQCIB9C8wOAN/ImxDtGACV246KcqjagZOR0kyctyBrsGGJVAiAj\nftbrNGsGU8YH211dRiYNoPPu19Zp/ze8JmhujB0oBw==\n-----END CERTIFICATE-----\n","-----BEGIN CERTIFICATE-----\nMIICjzCCAjSgAwIBAgIUImUM1lqdNInzg7SVUr9QGzknBqwwCgYIKoZIzj0EAwIw\naDEaMBgGA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENv\ncnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJ\nBgNVBAYTAlVTMB4XDTE4MDUyMTEwNDUxMFoXDTQ5MTIzMTIzNTk1OVowaDEaMBgG\nA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENvcnBvcmF0\naW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJBgNVBAYT\nAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEC6nEwMDIYZOj/iPWsCzaEKi7\n1OiOSLRFhWGjbnBVJfVnkY4u3IjkDYYL0MxO4mqsyYjlBalTVYxFP2sJBK5zlKOB\nuzCBuDAfBgNVHSMEGDAWgBQiZQzWWp00ifODtJVSv1AbOScGrDBSBgNVHR8ESzBJ\nMEegRaBDhkFodHRwczovL2NlcnRpZmljYXRlcy50cnVzdGVkc2VydmljZXMuaW50\nZWwuY29tL0ludGVsU0dYUm9vdENBLmRlcjAdBgNVHQ4EFgQUImUM1lqdNInzg7SV\nUr9QGzknBqwwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwCgYI\nKoZIzj0EAwIDSQAwRgIhAOW/5QkR+S9CiSDcNoowLuPRLsWGf/Yi7GSX94BgwTwg\nAiEA4J0lrHoMs+Xo5o/sX6O9QWxHRAvZUGOdRQ7cvqRXaqI=\n-----END CERTIFICATE-----\n"]} \ No newline at end of file diff --git a/intel-sgx/dcap-artifact-retrieval/tests/data/root_SGX_CA_der.cert b/intel-sgx/dcap-artifact-retrieval/tests/data/root_SGX_CA_der.cert new file mode 100644 index 00000000..75a1171f Binary files /dev/null and b/intel-sgx/dcap-artifact-retrieval/tests/data/root_SGX_CA_der.cert differ diff --git a/intel-sgx/pcs/Cargo.toml b/intel-sgx/pcs/Cargo.toml new file mode 100644 index 00000000..9f66d5ab --- /dev/null +++ b/intel-sgx/pcs/Cargo.toml @@ -0,0 +1,33 @@ +[package] +name = "pcs" +version = "0.1.0" +authors = ["Raoul Strackx ", "Nikita Shyrei "] +edition = "2018" +description = "Datastructures related to the Intel Provisioning Certification Service. DCAP attestation requires handling of DCAP artifacts (e.g., PCK certs, TCB info, ...). This crate provides an easy interface for these artifacts" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +dcap-ql = { path = "../dcap-ql", default-features = false } +sgx-isa = { path = "../sgx-isa", default-features = true } +pkix = "0.2.0" +yasna = { version = "0.3", features = ["num-bigint", "bit-vec"] } +rustc-serialize = "0.3" +serde = { version = "1.0.7", features = ["derive"] } +sgx_pkix = "0.2" +serde_json = { version = "1.0", features = ["raw_value"] } +percent-encoding = "2.1.0" +base16 = "0.2" +b64-ct = "0.1.0" +failure = "0.1.1" +anyhow = { version = "1", optional = true } +quick-error = "1.2.3" +num = "0.2" +mbedtls = { version = "0.12.3", features = ["std", "time"], default-features = false, optional = true } + +[dev-dependencies] +hex = "0.4.2" + +[features] +verify = ["anyhow", "mbedtls", "mbedtls/x509"] +sgx = [] diff --git a/intel-sgx/pcs/src/io.rs b/intel-sgx/pcs/src/io.rs new file mode 100644 index 00000000..9ca869aa --- /dev/null +++ b/intel-sgx/pcs/src/io.rs @@ -0,0 +1,55 @@ +/* Copyright (c) Fortanix, Inc. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +use std::fs::File; +use std::io::{BufReader, Write}; +use std::path::{Path, PathBuf}; + +use serde::de::DeserializeOwned; + +use crate::Error; + +/// Write given object in json to given filename under given dir (override existing file). +pub fn write_to_file(obj: &T, dir: &str, filename: &str) -> Result<(), Error> { + let path = Path::new(dir); + let path = path.join(filename); + write_to_path(&path, obj) +} + +/// Write given object in json to given filename under given dir if file is not exist. +/// +/// - Returns `Ok(None)` if file already exist. +/// - Returns `Ok(Some(filename))` if succeed to write to new file. +pub fn write_to_file_if_not_exist( + obj: &T, + dir: &str, + filename: &str, +) -> Result, Error> { + let path = Path::new(dir); + let path = path.join(filename); + if path.exists() { + return Ok(None); + } + write_to_path(&path, obj)?; + Ok(Some(path)) +} + +fn write_to_path(path: &PathBuf, obj: &T) -> Result<(), Error> { + let mut fp = File::create(&path)?; + + fp.write_all(&serde_json::ser::to_vec(obj).unwrap()) + .map_err(|e| Error::IoError(e)) +} + +pub fn read_from_file(dir: &str, filename: &str) -> Result { + let path = Path::new(dir); + let path = path.join(filename); + let file = File::open(path)?; + let reader = BufReader::new(file); + let obj = serde_json::from_reader(reader)?; + Ok(obj) +} diff --git a/intel-sgx/pcs/src/lib.rs b/intel-sgx/pcs/src/lib.rs new file mode 100644 index 00000000..d472ee71 --- /dev/null +++ b/intel-sgx/pcs/src/lib.rs @@ -0,0 +1,245 @@ +/* Copyright (c) Fortanix, Inc. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#![deny(warnings)] +extern crate failure; +extern crate percent_encoding; +extern crate yasna; +#[macro_use] +extern crate quick_error; + +use std::fmt; + +use serde::de::{self}; +use serde::{Deserialize, Deserializer, Serialize}; +pub use yasna::ASN1Error; +#[cfg(feature = "verify")] +use { + mbedtls::Error as MbedError, + mbedtls::alloc::{Box as MbedtlsBox, List as MbedtlsList}, + mbedtls::x509::certificate::Certificate, + std::ffi::CString, + std::ops::Deref, +}; + +pub use crate::pckcrl::PckCrl; +pub use crate::pckcrt::{PckCert, PckCerts, SGXPCKCertificateExtension, SGXType}; +pub use crate::qe_identity::{QeIdentity, QeIdentitySigned}; +pub use crate::tcb_info::{TcbInfo, TcbData}; + +mod io; +mod pckcrl; +mod pckcrt; +mod pckid; +mod qe_identity; +mod tcb_info; + +pub type CpuSvn = [u8; 16]; +pub type EncPpid = Vec; +pub type PceId = u16; +pub type PceIsvsvn = u16; +pub type QeId = [u8; 16]; +pub use crate::pckid::PckID; + +quick_error! { + #[derive(Debug)] + pub enum Error { + MissingCaChain{ + display("CA chain was unexpectedly empty") + } + IncorrectCA { + display("Invalid CA") + } + InvalidCaFormat { + display("CA certificate could not be parsed") + } + InvalidPckFormat(err: ASN1Error){ + display("Invalid formatted PckCert: {}", err) + } + InvalidPck(err: String){ + display("Invalid PCK: {}", err) + } + InvalidPcks(err: String){ + display("Invalid PCKs: {}", err) + } + InvalidFormatQe3Quote{ + display("Qe3 Quote could not be parsed") + } + NoPckForTcbFound{ + display("No PCK matching the TCB was found") + } + #[cfg(feature = "verify")] + InvalidCrl(err: MbedError){ + display("Invalid CRL: {}", err) + } + InvalidCrlFormat{ + display("Invalid CRL format") + } + InvalidTcbInfo(err: String){ + display("Invalid TCB info: {}", err) + } + UnknownTcbType(tcb_type: u16){ + display("Unknown TCB type: {}", tcb_type) + } + #[cfg(feature = "verify")] + InvalidQe3Id(err: MbedError){ + display("Invalid QE3 ID: {}", err) + } + InvalidFormatQe3Identity{ + display("Invalid QE3 Identity format") + } + IoError(err: std::io::Error){ + display("I/O error: {}", err) + from() + } + ParseError(err: serde_json::error::Error){ + from() + display("json error: {}", err) + } + NoPckCertData{ + display("Empty PckCerts") + } + EncodingError(err: serde_json::error::Error){ + display("json error: {}", err) + } + UnknownTcbInfoVersion(version: u16){ + display("The TCB Info structure has unexpected version: {}", version) + } + EnclaveTcbLevelNotFound { + display("TCB level not found for enclave") + } + UnknownQeIdentityVersion(version: u16){ + display("The QEIdentity structure has unexpected version: {}", version) + } + InvalidDcapAttestationFormat{ + display("The DCAP Attestation certificate has an unexpected format") + } + } +} + +pub trait VerificationType {} + +#[derive(Clone, Debug)] +pub struct Verified; + +impl VerificationType for Verified {} + +#[derive(Clone, Debug)] +pub struct Unverified; + +impl VerificationType for Unverified {} + +/// Intel specifies raw ECDSA signatures in a different format than mbedtls. Convert ECDSA +/// signature to RFC5480 ASN.1 representation. +fn get_ecdsa_sig_der(sig: &[u8]) -> Result, ()> { + if sig.len() % 2 != 0 { + return Err(()); + } + + let (r_bytes, s_bytes) = sig.split_at(sig.len() / 2); + let r = num::BigUint::from_bytes_be(r_bytes); + let s = num::BigUint::from_bytes_be(s_bytes); + + let der = yasna::construct_der(|writer| { + writer.write_sequence(|writer| { + writer.next().write_biguint(&r); + writer.next().write_biguint(&s); + }) + }); + + Ok(der) +} + +fn intel_signature_deserializer<'de, D: Deserializer<'de>>(deserializer: D) -> Result, D::Error> { + let signature = String::deserialize(deserializer)?; + let signature = &base16::decode(signature.as_bytes()).map_err(de::Error::custom)?; + crate::get_ecdsa_sig_der(signature).map_err(|_| de::Error::custom("Failed ECDSA signature conversion")) +} + +#[cfg(feature = "verify")] +fn create_cert_chain(certs: &Vec) -> Result<(Vec>, MbedtlsBox), Error> { + fn str_to_cert_box(ca: &String) -> Result, Error> { + let ca = CString::new(ca.as_bytes()).map_err(|_| Error::InvalidCaFormat)?; + Certificate::from_pem(ca.as_bytes_with_nul()).map_err(|_| Error::InvalidCaFormat) + } + if let Some((last_cert, certs)) = certs.split_last() { + let chain = certs.iter().map(str_to_cert_box).collect::, _>>()?; + let last_cert = str_to_cert_box(last_cert)?; + Ok((chain, last_cert)) + } else { + Err(Error::MissingCaChain) + } +} + +// Typically, certificates are verified directly against a pool of trusted root +// certificates. The DCAP attestation verification logic works differently. +// It first verifies against a root certificate included in the attestation, +// and then checks that the root certificate included in the attestation is +// a trusted root certificate. +// +// There are two different versions of the SGX root CA in circulation (both +// available in tests/data/ of this crate). They share the same key, but +// have a different expiration date and a different CRL reference (PEM vs. DER +// format). Because we have existing DCAP verifiers configured with only one +// of the certificates, we perform a certificate verification of the root +// in the attestation against the trusted root, rather than look for a +// byte-for-byte match between the attestation root and the trusted root. +#[cfg(feature = "verify")] +fn check_root_ca>(trusted_root_certs: &[B], candidate: &MbedtlsList) -> Result<(), Error> { + if trusted_root_certs + .iter() + .filter_map(|trusted_der| Certificate::from_der(&**trusted_der).ok()) + .any(|trusted| Certificate::verify(candidate, &std::iter::once(trusted).collect(), None, None).is_ok()) + { + return Ok(()); + } else { + return Err(Error::IncorrectCA); + } +} + +#[cfg(test)] +#[cfg(not(target_env = "sgx"))] +fn get_cert_subject(cert: &str) -> String { + let der = &pkix::pem::pem_to_der(cert.trim(), Some(pkix::pem::PEM_CERTIFICATE)) + .ok_or(ASN1Error::new(yasna::ASN1ErrorKind::Invalid)) + .unwrap(); + get_cert_subject_from_der(der) +} + +#[cfg(test)] +#[cfg(not(target_env = "sgx"))] +fn get_cert_subject_from_der(cert: &Vec) -> String { + use pkix::FromBer; + let cert = pkix::x509::GenericCertificate::from_ber(&cert).unwrap(); + let name = cert.tbscert.subject.get(&*pkix::oid::commonName).unwrap(); + String::from_utf8_lossy(&name.value()).to_string() +} + +#[derive(Serialize, Deserialize, PartialEq, Eq, Clone, Debug, Copy)] +pub enum TcbStatus { + UpToDate, + SWHardeningNeeded, + ConfigurationNeeded, + ConfigurationAndSWHardeningNeeded, + OutOfDate, + OutOfDateConfigurationNeeded, + Revoked, +} + +impl fmt::Display for TcbStatus { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + TcbStatus::UpToDate => write!(f, "Up to Date"), + TcbStatus::SWHardeningNeeded => write!(f, "Software Hardening Needed"), + TcbStatus::ConfigurationNeeded => write!(f, "Configuration Needed"), + TcbStatus::ConfigurationAndSWHardeningNeeded => write!(f, "Configuration And Software Hardening Needed"), + TcbStatus::OutOfDate => write!(f, "Out of Date"), + TcbStatus::OutOfDateConfigurationNeeded => write!(f, "Out of Date, Configuration Needed"), + TcbStatus::Revoked => write!(f, "Revoked"), + } + } +} diff --git a/intel-sgx/pcs/src/pckcrl.rs b/intel-sgx/pcs/src/pckcrl.rs new file mode 100644 index 00000000..bef455ac --- /dev/null +++ b/intel-sgx/pcs/src/pckcrl.rs @@ -0,0 +1,69 @@ +/* Copyright (c) Fortanix, Inc. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +use std::path::PathBuf; + +use pkix::pem::PEM_CRL; +use serde::{Deserialize, Serialize}; + +use crate::io::{self}; +use crate::Error; + +#[derive(Clone, Serialize, Deserialize, Debug, Eq, PartialEq)] +pub struct PckCrl { + crl: String, + ca_chain: Vec, +} + +impl PckCrl { + const DEFAULT_FILENAME: &'static str = "processor.crl"; + + pub fn new(crl: String, ca_chain: Vec) -> Result { + let crl = PckCrl { crl, ca_chain }; + //TODO: verify ca_chain + // https://fortanix.atlassian.net/browse/PROD-2046 + Ok(crl) + } + + pub fn write_to_file(&self, output_dir: &str) -> Result { + io::write_to_file(&self, output_dir, Self::DEFAULT_FILENAME)?; + Ok(Self::DEFAULT_FILENAME.to_string()) + } + + pub fn write_to_file_if_not_exist(&self, output_dir: &str) -> Result, Error> { + io::write_to_file_if_not_exist(&self, output_dir, &Self::DEFAULT_FILENAME) + } + + pub fn read_from_file(input_dir: &str) -> Result { + let crl: Self = io::read_from_file(input_dir, Self::DEFAULT_FILENAME)?; + Ok(crl) + } + + pub fn crl_as_pem(&self) -> &String { + &self.crl + } + + pub fn crl_as_der(&self) -> Result, Error> { + pkix::pem::pem_to_der(&self.crl, Some(PEM_CRL)).ok_or(Error::InvalidCrlFormat) + } + + pub fn certificate_chain(&self) -> &Vec { + &self.ca_chain + } +} + +#[cfg(test)] +mod tests { + #[cfg(not(target_env = "sgx"))] + use crate::pckcrl::PckCrl; + + #[cfg(not(target_env = "sgx"))] + #[test] + fn read_pck_crl() { + assert!(PckCrl::read_from_file("./tests/data/").is_ok()); + } +} diff --git a/intel-sgx/pcs/src/pckcrt.rs b/intel-sgx/pcs/src/pckcrt.rs new file mode 100644 index 00000000..6b53296d --- /dev/null +++ b/intel-sgx/pcs/src/pckcrt.rs @@ -0,0 +1,1174 @@ +/* Copyright (c) Fortanix, Inc. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +use std::borrow::Cow; +use std::cmp::Ordering; +use std::convert::{TryFrom, TryInto}; +use std::marker::PhantomData; +use std::path::PathBuf; + +use percent_encoding::percent_decode; +use pkix::pem::{self, PEM_CERTIFICATE}; +use pkix::types::ObjectIdentifier; +use pkix::x509::GenericCertificate; +use pkix::FromBer; +use serde::{Deserialize, Deserializer, Serialize, Serializer}; +use sgx_pkix::oid::{self, SGX_EXTENSION}; +use yasna::{ASN1Error, ASN1ErrorKind, ASN1Result, BERDecodable, BERReader, BERReaderSeq}; +#[cfg(feature = "verify")] +use { + mbedtls::alloc::{Box as MbedtlsBox, List as MbedtlsList}, + mbedtls::ecp::EcPoint, + mbedtls::x509::certificate::Certificate, + mbedtls::Error as MbedError, + std::ffi::CString, + std::ops::Deref, +}; + +use crate::io::{self}; +use crate::tcb_info::{TcbData, TcbLevel}; +use crate::{CpuSvn, Error, Unverified, VerificationType, Verified}; + +/// [`SGXType`] is a rust enum representing the Intel® SGX Type. +/// +/// Ref: +#[derive(Debug, Serialize, Deserialize, Copy, Clone, Eq, PartialEq, Hash, PartialOrd, Ord)] +#[serde(rename_all = "kebab-case")] +pub enum SGXType { + Standard, + /// Type for machines only provide confidentiality protection for EPC memory, such as Azure DC v3 instance. + Scalable, + /// Type for machines provide integrity and confidentiality protection for EPC memory, such as our FX2200 series 3 instance. + ScalableWithIntegrity, +} + +impl Default for SGXType { + fn default() -> SGXType { + SGXType::Standard + } +} + +impl TryFrom for SGXType { + type Error = (); + + fn try_from(v: i64) -> Result { + match v { + 0 => Ok(SGXType::Standard), + 1 => Ok(SGXType::Scalable), + 2 => Ok(SGXType::ScalableWithIntegrity), + _ => Err(()), + } + } +} + +/// TCB component as specified in the Intel PCKCrt API v3 and v4 +#[derive(Serialize, Deserialize, Debug, Default)] +struct IntelSgxTcbComponentsV3 { + sgxtcbcomp01svn: u8, + sgxtcbcomp02svn: u8, + sgxtcbcomp03svn: u8, + sgxtcbcomp04svn: u8, + sgxtcbcomp05svn: u8, + sgxtcbcomp06svn: u8, + sgxtcbcomp07svn: u8, + sgxtcbcomp08svn: u8, + sgxtcbcomp09svn: u8, + sgxtcbcomp10svn: u8, + sgxtcbcomp11svn: u8, + sgxtcbcomp12svn: u8, + sgxtcbcomp13svn: u8, + sgxtcbcomp14svn: u8, + sgxtcbcomp15svn: u8, + sgxtcbcomp16svn: u8, + pcesvn: u16, +} + +/// TCB component as specified in TcbInfo (version 3) of the PCS version 4 API +/// https://api.trustedservices.intel.com/documents/PCS_V3-V4_migration_guide.pdf +#[derive(Serialize, Deserialize, Clone, Debug, Default, Eq, PartialEq)] +struct IntelSgxTcbComponentV4 { + svn: u8, + #[serde(default)] + category: String, + #[serde(default, rename = "type")] + comp_type: String, +} + +impl From for IntelSgxTcbComponentV4 { + fn from(svn: u8) -> IntelSgxTcbComponentV4 { + IntelSgxTcbComponentV4 { + svn, + category: String::new(), + comp_type: String::new(), + } + } +} + +#[derive(Serialize, Deserialize, Clone, Debug, Default, Eq, PartialEq)] +struct IntelSgxTcbComponentsV4 { + pub sgxtcbcomponents: [IntelSgxTcbComponentV4; 16], + pub pcesvn: u16, +} + +#[derive(Serialize, Deserialize, Debug)] +#[serde(untagged)] +enum IntelSgxTcbComponents { + V3(IntelSgxTcbComponentsV3), + V4(IntelSgxTcbComponentsV4), +} + +#[derive(Serialize, Deserialize, Clone, Debug, Default, Eq, PartialEq)] +#[serde(from = "IntelSgxTcbComponents")] +pub struct TcbComponents(IntelSgxTcbComponentsV4); + +impl TcbComponents { + pub fn from_raw(raw_cpusvn: [u8; 16], pcesvn: u16) -> Self { + TcbComponents(IntelSgxTcbComponentsV4 { + sgxtcbcomponents: raw_cpusvn.map(|svn| svn.into()), + pcesvn, + }) + } + + fn iter_components<'a>(&'a self) -> impl Iterator + 'a { + self.0 + .sgxtcbcomponents + .iter() + .map(|comp| comp.svn as u16) + .chain(std::iter::once(self.0.pcesvn)) + } + + pub fn pce_svn(&self) -> u16 { + self.0.pcesvn + } +} + +impl PartialOrd for TcbComponents { + /// Compare all 17 components. If all are equal, order as equal. If some + /// are less and others are greater, ordering is not defined. If some are + /// less, order as less. If some are greater, order as greater. + fn partial_cmp(&self, other: &TcbComponents) -> Option { + let mut prev: Option = None; + + for (a, b) in self.iter_components().zip(other.iter_components()) { + match (a.cmp(&b), prev) { + (x, None) | (x, Some(Ordering::Equal)) => prev = Some(x), + (Ordering::Greater, Some(Ordering::Less)) | (Ordering::Less, Some(Ordering::Greater)) => return None, + (Ordering::Equal, Some(Ordering::Less)) + | (Ordering::Equal, Some(Ordering::Greater)) + | (Ordering::Less, Some(Ordering::Less)) + | (Ordering::Greater, Some(Ordering::Greater)) => (), + } + } + + prev + } +} + +impl std::convert::From for IntelSgxTcbComponentsV4 { + fn from(c: IntelSgxTcbComponentsV3) -> Self { + IntelSgxTcbComponentsV4 { + sgxtcbcomponents: [ + c.sgxtcbcomp01svn.into(), + c.sgxtcbcomp02svn.into(), + c.sgxtcbcomp03svn.into(), + c.sgxtcbcomp04svn.into(), + c.sgxtcbcomp05svn.into(), + c.sgxtcbcomp06svn.into(), + c.sgxtcbcomp07svn.into(), + c.sgxtcbcomp08svn.into(), + c.sgxtcbcomp09svn.into(), + c.sgxtcbcomp10svn.into(), + c.sgxtcbcomp11svn.into(), + c.sgxtcbcomp12svn.into(), + c.sgxtcbcomp13svn.into(), + c.sgxtcbcomp14svn.into(), + c.sgxtcbcomp15svn.into(), + c.sgxtcbcomp16svn.into(), + ], + pcesvn: c.pcesvn, + } + } +} + +impl std::convert::From for TcbComponents { + fn from(c: IntelSgxTcbComponents) -> Self { + match c { + IntelSgxTcbComponents::V3(c) => TcbComponents(c.into()), + IntelSgxTcbComponents::V4(c) => TcbComponents(c.into()), + } + } +} + +impl std::convert::From for TcbComponents { + fn from(c: IntelSgxTcbComponentsV4) -> Self { + TcbComponents(c) + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +enum PckCertValue { + Cert(Vec), + Missing(String), +} + +impl<'de> Deserialize<'de> for PckCertValue { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let s = String::deserialize(deserializer)?; + let der = percent_decode(s.as_bytes()) + .decode_utf8() + .map_err(|_| Error::InvalidPcks("utf8 decode error".into())) + .map(|c| pem::pem_to_der(c.trim(), Some(PEM_CERTIFICATE))); + + if let Ok(Some(der)) = der { + Ok(PckCertValue::Cert(der)) + } else { + Ok(PckCertValue::Missing(s.to_string())) + } + } +} + +impl Serialize for PckCertValue { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + match self { + PckCertValue::Cert(der) => serializer.serialize_str(&pem::der_to_pem(der, PEM_CERTIFICATE)), + PckCertValue::Missing(s) => serializer.serialize_str(s), + } + } +} + +#[derive(Serialize, Deserialize, Debug, Clone, Eq, PartialEq)] +pub struct PckCertBodyItem { + tcb: TcbComponents, + tcbm: String, + cert: PckCertValue, +} + +#[derive(Serialize, Deserialize, Debug, Clone, Eq, PartialEq)] +pub struct PckCerts { + pck_data: Vec, + ca_chain: Vec, +} + +impl PckCerts { + pub fn new(pck_data: Vec, ca_chain: Vec) -> Self { + Self { pck_data, ca_chain } + } + + pub fn parse(body: &str, ca_chain: Vec) -> Result { + let data: Vec = serde_json::from_str(body)?; + + let pcks = PckCerts { + pck_data: data, + ca_chain, + }; + Ok(pcks) + } + + fn filename(qe_id: &[u8]) -> String { + format!("{}.certs", base16::encode_lower(qe_id)) + } + + pub fn store(&self, output_dir: &str, qe_id: &[u8]) -> Result { + let filename = PckCerts::filename(qe_id); + io::write_to_file(&self, output_dir, &filename)?; + Ok(filename) + } + + pub fn store_if_not_exist(&self, output_dir: &str, qe_id: &[u8]) -> Result, Error> { + let filename = PckCerts::filename(qe_id); + io::write_to_file_if_not_exist(&self, output_dir, &filename) + } + + pub fn restore(input_dir: &str, qe_id: &[u8]) -> Result { + let filename = PckCerts::filename(qe_id); + let pcks: PckCerts = io::read_from_file(input_dir, &filename)?; + Ok(pcks) + } + + pub fn fmspc(&self) -> Result, Error> { + let pck = self.iter().nth(0).ok_or(Error::NoPckCertData)?; + let sgx_extension = SGXPCKCertificateExtension::try_from(pck).map_err(|e| Error::InvalidPckFormat(e))?; + Ok(sgx_extension.fmspc) + } + + pub fn ca_chain(&self) -> &[String] { + &self.ca_chain + } + + /// Returns an iterator over the pck certificates (in der format) in this structure. + /// WARNING: Missing, or malformed certificates are hidden from the iterator + pub fn iter(&self) -> impl Iterator> { + self.pck_data.iter().filter_map(|pck_body_item| { + if let PckCertValue::Cert(der) = &pck_body_item.cert { + Some(der) + } else { + None + } + }) + } + + /// Returns a `Vec` of `PckCert` in this structure. + /// WARNING: Missing, or malformed certificates are hidden from the iterator + pub fn as_pck_certs(&self) -> Vec> { + self.iter() + .map(|pckcert| PckCert::new(pem::der_to_pem(pckcert, PEM_CERTIFICATE), self.ca_chain.clone())) + .collect() + } + + /// Order all PCKs according to the tcb info + /// TCB Info is carefully ordered by Intel + fn order_pcks(&self, tcb_info: &TcbData) -> Vec> { + let mut pck_certs = self.as_pck_certs(); + + // Sort PCK certs by applicable TCB level. If two certs are in the same TCB + // level, maintain existing ordering (stable sort). PCK certs without a TCB + // level are sorted last. + pck_certs.sort_by_cached_key(|cert| cert.find_tcb_level_idx(tcb_info).unwrap_or(usize::max_value())); + pck_certs + } + + /// Given the cpusvn, pcesvn and qe_id, searches for the best PCK certificate + /// Code re-implements + pub fn select_pck( + &self, + tcb_info: &TcbData, + cpusvn: &[u8; 16], + pcesvn: u16, + pceid: u16, + ) -> Result, Error> { + // 1. Order PCK certs according to TCB levels + let pcks = self.order_pcks(&tcb_info); + + // 2. Find first PCK cert in ordered list that matches current platform + let tcb_components = tcb_info.decompose_raw_cpusvn(cpusvn, pcesvn)?; + let pck = pcks + .iter() + .find(|pck| pck.valid_for_tcb(&tcb_components, pceid).is_ok()) + .ok_or(Error::NoPckForTcbFound)?; + Ok(pck.to_owned()) + } +} + +#[derive(Clone, Serialize, Debug, PartialEq, Eq)] +pub struct PckCert { + cert: String, + ca_chain: Vec, + #[serde(skip)] + type_: PhantomData, +} + +impl<'de> Deserialize<'de> for PckCert { + fn deserialize(deserializer: D) -> Result, D::Error> + where + D: Deserializer<'de>, + { + #[derive(Deserialize)] + struct Dummy { + cert: String, + ca_chain: Vec, + } + + let Dummy { cert, ca_chain } = Dummy::deserialize(deserializer)?; + Ok(PckCert:: { + cert, + ca_chain, + type_: PhantomData, + }) + } +} + +impl PckCert { + pub fn from_pck_chain(certs: Vec>) -> Result, Error> { + if certs.is_empty() { + return Err(Error::InvalidPck("Missing CA chain".into())); + } + if let Some((first, rest)) = certs.split_first() { + Ok(PckCert::new(first.to_string(), rest.iter().map(|c| c.to_string()).collect())) + } else { + Err(Error::InvalidPck("Expected two certificates in CA chain".into())) + } + } + + /// Creates a new PckCert from the PCK certificate and CA chain. The root certificate must be + /// the last certificate in the chain + pub fn new(cert: String, ca_chain: Vec) -> PckCert { + let ca_chain = ca_chain.iter().map(|cert| cert.trim().to_string()).collect(); + PckCert { + cert, + ca_chain, + type_: PhantomData, + } + } + + #[cfg(feature = "verify")] + pub fn verify>(self, trusted_root_certs: &[B]) -> Result { + let pck = CString::new(self.cert.as_bytes()).map_err(|_| Error::InvalidPck("Conversion into CString failed".into()))?; + let pck = Certificate::from_pem(pck.as_bytes_with_nul()) + .map_err(|_| Error::InvalidPck("Cannot decode PCKCert as pem".into()))?; + + let (mut chain, root) = crate::create_cert_chain(&self.ca_chain)?; + chain.insert(0, pck); + let trust_ca: MbedtlsList = chain.into_iter().collect(); + let root_list = std::iter::once(root).collect(); + let mut err = String::default(); + Certificate::verify(&trust_ca, &root_list, None, Some(&mut err)) + .map_err(|_| Error::InvalidPck(format!("Failed to verify PckCert: {}", err)))?; + + crate::check_root_ca(trusted_root_certs, &root_list)?; + + Ok(PckCert { + cert: self.cert, + ca_chain: self.ca_chain, + type_: PhantomData, + }) + } + + pub fn read_from_file(input_dir: &str, filename: &str) -> Result { + io::read_from_file(input_dir, filename) + } +} + +impl PckCert { + /// Selects the highest matching TCB level + /// see + pub fn find_tcb_state(&self, tcb_data: &TcbData) -> Option { + let idx = self.find_tcb_level_idx(tcb_data)?; + Some(tcb_data.tcb_levels()[idx].clone()) + } + + #[cfg(feature = "verify")] + pub fn pck(&self) -> Result, MbedError> { + let cert = CString::new(self.cert.as_bytes()).map_err(|_| MbedError::X509InvalidFormat)?; + Certificate::from_pem(cert.as_bytes_with_nul()).map_err(|_| MbedError::X509InvalidFormat) + } + + #[cfg(feature = "verify")] + pub fn public_key(&self) -> Result { + let cert = self.pck()?; + let pk = cert.public_key(); + pk.ec_public() + } +} + +impl PckCert { + /// Returns the the CA chain in the order [leaf .. root] + pub fn ca_chain(&self) -> &[String] { + return &self.ca_chain; + } + + pub fn pck_pem<'a>(&'a self) -> &'a String { + &self.cert + } + + pub fn write_to_file(&self, output_dir: &str, filename: &str) -> Result<(), Error> { + Ok(io::write_to_file(&self, output_dir, &filename)?) + } + + pub fn sgx_extension(&self) -> Result { + let der = &pem::pem_to_der(&self.cert, Some(PEM_CERTIFICATE)).ok_or(ASN1Error::new(ASN1ErrorKind::Invalid))?; + let cert = GenericCertificate::from_ber(&der)?; + let extension = cert + .tbscert + .get_extension(&SGX_EXTENSION) + .ok_or(ASN1Error::new(ASN1ErrorKind::Eof))?; + SGXPCKCertificateExtension::parse_extension(&extension.value) + } + + pub fn platform_tcb(&self) -> Result { + let extension = self.sgx_extension()?; + Ok(extension.tcb) + } + + fn as_pck_cert_body_item(&self) -> Result { + let ext = self.sgx_extension()?; + let cpusvn = ext.tcb.cpusvn; + let pce_svn = ext.tcb.tcb_components.0.pcesvn; + let mut tcbm = Vec::from(cpusvn); + tcbm.extend_from_slice(&pce_svn.to_le_bytes()); + let cert = pem::pem_to_der(&self.cert, Some(PEM_CERTIFICATE)).ok_or(ASN1Error::new(ASN1ErrorKind::Invalid))?; + Ok(PckCertBodyItem { + tcb: ext.tcb.tcb_components, + tcbm: base16::encode_upper(&tcbm), + cert: PckCertValue::Cert(cert), + }) + } + + pub fn sgx_type(&self) -> Result { + let extension = self.sgx_extension()?; + Ok(extension.sgx_type) + } + + /// Find the index of the highest matching TCB level + fn find_tcb_level_idx(&self, tcb_info: &TcbData) -> Option { + // Go over the sorted collection of TCB Levels retrieved from TCB Info starting from the first item on the list: + // 1. Compare all of the SGX TCB Comp SVNs retrieved from the SGX PCK Certificate (from 01 to 16) with the corresponding + // values in the TCB Level. If all SGX TCB Comp SVNs in the certificate are greater or equal to the corresponding values + // in TCB Level, go to 3.b, otherwise move to the next item on TCB Levels list. + // 2. Compare PCESVN value retrieved from the SGX PCK certificate with the corresponding value in the TCB Level. If it is + // greater or equal to the value in TCB Level, read status assigned to this TCB level. Otherwise, move to the next item + // on TCB Levels list. + // If no TCB level matches your SGX PCK Certificate, your TCB Level is not supported. + let pck_tcb_level = self.platform_tcb().ok()?; + tcb_info + .tcb_levels() + .iter() + .position(|tcb| tcb.tcb <= pck_tcb_level.tcb_components) + } + + fn valid_for_tcb(&self, comps: &TcbComponents, pceid: u16) -> Result<(), Error> { + let sgx_extension = self + .sgx_extension() + .map_err(|_| Error::InvalidPck("Failed to parse SGX extension".into()))?; + let tcb = sgx_extension.tcb; + if sgx_extension.pceid == pceid && tcb.tcb_components < *comps { + Ok(()) + } else { + Err(Error::InvalidPck("PckCert isn't valid for provided TCB".into())) + } + } + + pub fn fmspc(&self) -> Result, Error> { + let sgx_extension = self.sgx_extension().map_err(|e| Error::InvalidPckFormat(e))?; + Ok(sgx_extension.fmspc) + } +} + +#[derive(Default, Debug)] +pub struct PlatformTCB { + pub tcb_components: TcbComponents, + pub cpusvn: CpuSvn, +} + +fn decode_tcb_sequence<'a, 'b>(reader: &mut BERReaderSeq<'a, 'b>) -> ASN1Result { + let mut platform_tcb = PlatformTCB::default(); + for i in 1..=18 { + platform_tcb = reader.next().read_sequence(|reader| { + let oid = reader.next().read_oid()?; + if let Some((last, rest)) = oid.components().split_last() { + if rest != oid::SGX_EXTENSION_TCB.components().as_slice() || i != *last { + return Err(ASN1Error::new(ASN1ErrorKind::Invalid)); + } + match last { + i @ 1..=16 => { + platform_tcb.tcb_components.0.sgxtcbcomponents[(i - 1) as usize].svn = reader.next().read_u8()? + } + 17 => platform_tcb.tcb_components.0.pcesvn = reader.next().read_u16()?, + 18 => { + platform_tcb.cpusvn = reader + .next() + .read_bytes()? + .as_slice() + .try_into() + .map_err(|_| ASN1Error::new(ASN1ErrorKind::Invalid))? + } + _ => return Err(ASN1Error::new(ASN1ErrorKind::Invalid)), + } + Ok(platform_tcb) + } else { + return Err(ASN1Error::new(ASN1ErrorKind::Invalid)); + } + })?; + } + Ok(platform_tcb) +} + +fn decode_ber_sgx_type(reader: BERReader) -> ASN1Result { + reader + .read_enum()? + .try_into() + .map_err(|_| ASN1Error::new(ASN1ErrorKind::Invalid)) +} + +#[derive(Default, Debug)] +pub struct SGXPlatformConfiguration { + pub dynamic: bool, + pub cached_keys: bool, + pub smt_enabled: bool, +} + +fn read_tagged<'a, 'b, F, T>(reader: BERReader<'a, 'b>, oid: &ObjectIdentifier, callback: F) -> ASN1Result +where + F: for<'c> FnOnce(BERReader<'a, 'c>) -> ASN1Result, +{ + reader.read_sequence(|reader| { + if reader.next().read_oid()? != *oid { + return Err(ASN1Error::new(ASN1ErrorKind::Invalid)); + } + callback(reader.next()) + }) +} + +impl BERDecodable for SGXPlatformConfiguration { + fn decode_ber(reader: BERReader) -> ASN1Result { + reader.read_sequence(|reader| { + let dynamic = read_tagged(reader.next(), &*oid::SGX_EXTENSION_CONF_DYNAMIC_PLATFORM, |r| r.read_bool())?; + let cached_keys = read_tagged(reader.next(), &*oid::SGX_EXTENSION_CONF_CACHED_KEYS, |r| r.read_bool())?; + let smt_enabled = read_tagged(reader.next(), &*oid::SGX_EXTENSION_CONF_SMT_ENABLED, |r| r.read_bool())?; + + Ok(SGXPlatformConfiguration { + dynamic, + cached_keys, + smt_enabled, + }) + }) + } +} + +#[derive(Default, Debug)] +pub struct SGXPCKCertificateExtension { + pub ppid: Vec, + pub tcb: PlatformTCB, + pub pceid: u16, + pub fmspc: Vec, + pub sgx_type: SGXType, + pub platform_instance_id: Option>, + pub configuration: Option, +} + +impl SGXPCKCertificateExtension { + /// Parses an SGX PCK Certificate extension as define in Section 3.5 + /// + pub fn parse_extension(extension: &[u8]) -> ASN1Result { + yasna::parse_der(extension, |reader| { + reader.read_sequence(|reader| { + struct SGXPCKCertificateExtensionReader<'r, 'a, 'c> { + reader: &'r mut yasna::BERReaderSeq<'a, 'c>, + current: u64, + } + + impl<'r, 'a, 'c> SGXPCKCertificateExtensionReader<'r, 'a, 'c> { + fn next(&mut self, with_next: F) -> ASN1Result + where + F: FnOnce(yasna::BERReader) -> ASN1Result, + { + let current = &mut self.current; + self.reader.next().read_sequence(|reader| { + if let Some((last, comp)) = reader.next().read_oid()?.components().split_last() { + if *comp == *oid::SGX_EXTENSION.components().as_slice() && *current == *last { + *current += 1; + return with_next(reader.next()); + } + } + return Err(ASN1Error::new(ASN1ErrorKind::Invalid)); + }) + } + } + + let mut reader = SGXPCKCertificateExtensionReader { reader, current: 1 }; + + let ppid = reader.next(|reader| reader.read_bytes())?; + let tcb = reader.next(|reader| reader.read_sequence(|reader| decode_tcb_sequence(reader)))?; + let pceid = reader.next(|reader| reader.read_bytes())?; + let fmspc = reader.next(|reader| reader.read_bytes())?; + let sgx_type = reader.next(|reader| decode_ber_sgx_type(reader))?; + + let mut platform_instance_id = None; + let mut configuration = None; + if sgx_type == SGXType::Scalable || sgx_type == SGXType::ScalableWithIntegrity { + platform_instance_id = Some(reader.next(|reader| reader.read_bytes())?); + configuration = Some(reader.next(|reader| SGXPlatformConfiguration::decode_ber(reader))?); + } + + if ppid.len() != 16 + || pceid.len() != 2 + || fmspc.len() != 6 + || platform_instance_id.as_ref().map_or(false, |id| id.len() != 16) + { + return Err(ASN1Error::new(ASN1ErrorKind::Invalid)); + } + + let extension = SGXPCKCertificateExtension { + ppid, + tcb, + pceid: u16::from_be_bytes(pceid.as_slice().try_into().expect("validated len = 2")), + fmspc, + sgx_type, + configuration, + platform_instance_id, + }; + + Ok(extension) + }) + }) + } +} + +impl TryFrom<&str> for SGXPCKCertificateExtension { + type Error = ASN1Error; + + fn try_from(cert: &str) -> Result { + let cert = &pem::pem_to_der(cert, Some(PEM_CERTIFICATE)).ok_or(ASN1Error::new(ASN1ErrorKind::Invalid))?; + SGXPCKCertificateExtension::try_from(cert) + } +} + +impl TryFrom<&Vec> for SGXPCKCertificateExtension { + type Error = ASN1Error; + + fn try_from(cert: &Vec) -> Result { + let cert = GenericCertificate::from_ber(&cert)?; + let extension = cert + .tbscert + .get_extension(&SGX_EXTENSION) + .ok_or(ASN1Error::new(ASN1ErrorKind::Eof))?; + SGXPCKCertificateExtension::parse_extension(&extension.value) + } +} + +impl TryFrom> for PckCerts +where + V: VerificationType, +{ + type Error = ASN1Error; + + fn try_from(pck: PckCert) -> Result { + let cert_body_item = pck.as_pck_cert_body_item()?; + + Ok(PckCerts { + pck_data: vec![cert_body_item], + ca_chain: pck.ca_chain, + }) + } +} + +#[cfg(test)] +mod tests { + use dcap_ql::quote::{Qe3CertDataPckCertChain, Quote, Quote3SignatureEcdsaP256}; + use hex::FromHex; + use pkix::derives::ObjectIdentifier; + use sgx_pkix::oid::{SGX_EXTENSION_PPID, SGX_EXTENSION_TCB, SGX_EXTENSION_TCB_COMP01_SVN}; + use yasna; + + use super::*; + #[cfg(not(target_env = "sgx"))] + use crate::{get_cert_subject, get_cert_subject_from_der}; + + fn decode_tcb_item<'a, 'b>(reader: &mut BERReaderSeq<'a, 'b>) -> ASN1Result<(ObjectIdentifier, u8)> { + let oid = reader.next().read_oid()?; + let value = reader.next().read_u8()?; + Ok((oid, value)) + } + + #[test] + fn sgx_extension_oid() { + let oid_enc = vec![0x06, 0x0a, 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x01]; + + let oid = yasna::parse_der(&oid_enc, |reader| { + let oid = reader.read_oid()?; + Ok(oid) + }) + .unwrap(); + assert_eq!(oid, *SGX_EXTENSION_PPID); + } + + #[test] + fn sgx_extension_ppid() { + let ppid_enc = vec![ + 0x04, 0x10, 0x88, 0x58, 0x9d, 0xd5, 0x8b, 0xd4, 0xe8, 0x0c, 0x2b, 0x12, 0x49, 0x86, 0x22, 0xa3, 0x48, 0x77, + ]; + + let ppid = yasna::parse_der(&ppid_enc, |reader| { + let ppid = reader.read_bytes()?; + Ok(ppid) + }) + .unwrap(); + assert_eq!( + ppid, + vec![136, 88, 157, 213, 139, 212, 232, 12, 43, 18, 73, 134, 34, 163, 72, 119] + ); + } + + #[test] + fn sgx_extension_ppid_seq() { + let ppid_seq = vec![ + 0x30, 0x1e, 0x06, 0x0a, 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x01, 0x04, 0x10, 0x88, 0x58, 0x9d, + 0xd5, 0x8b, 0xd4, 0xe8, 0x0c, 0x2b, 0x12, 0x49, 0x86, 0x22, 0xa3, 0x48, 0x77, + ]; + let (oid, ppid) = yasna::parse_der(&ppid_seq, |reader| { + reader.read_sequence(|reader| { + let oid = reader.next().read_oid()?; + let ppid = reader.next().read_bytes()?; + Ok((oid, ppid)) + }) + }) + .unwrap(); + assert_eq!(oid, *SGX_EXTENSION_PPID); + assert_eq!( + ppid, + vec![136, 88, 157, 213, 139, 212, 232, 12, 43, 18, 73, 134, 34, 163, 72, 119] + ); + } + + #[test] + fn sgx_extension_tcb_comp() { + let tcb_comp_seq = vec![ + 0x30, 0x10, 0x06, 0x0b, 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x02, 0x01, 0x02, 0x01, 0x0d, + ]; + + let (oid, tcb_comp) = yasna::parse_der(&tcb_comp_seq, |reader| { + reader.read_sequence(|reader| { + let oid = reader.next().read_oid()?; + let tcb_comp = reader.next().read_u8()?; + Ok((oid, tcb_comp)) + }) + }) + .unwrap(); + assert_eq!(oid, *SGX_EXTENSION_TCB_COMP01_SVN); + assert_eq!(tcb_comp, 13); + } + + #[test] + fn sgx_extension_tcb_comp2() { + let tcb_comp_seq = vec![ + 0x30, 0x10, 0x06, 0x0b, 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x02, 0x01, 0x02, 0x01, 0x0d, + ]; + + let (oid, tcb_comp) = yasna::parse_der(&tcb_comp_seq, |reader| reader.read_sequence(decode_tcb_item)).unwrap(); + assert_eq!(oid, *SGX_EXTENSION_TCB_COMP01_SVN); + assert_eq!(tcb_comp, 13); + } + + #[test] + fn sgx_extension_tcb() { + let tcb_enc = vec![ + 0x30, 0x82, 0x01, 0x64, 0x06, 0x0a, 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x02, 0x30, 0x82, 0x01, + 0x54, 0x30, 0x10, 0x06, 0x0b, 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x02, 0x01, 0x02, 0x01, 0x0d, + 0x30, 0x10, 0x06, 0x0b, 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x02, 0x02, 0x02, 0x01, 0x0d, 0x30, + 0x10, 0x06, 0x0b, 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x02, 0x03, 0x02, 0x01, 0x02, 0x30, 0x10, + 0x06, 0x0b, 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x02, 0x04, 0x02, 0x01, 0x04, 0x30, 0x10, 0x06, + 0x0b, 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x02, 0x05, 0x02, 0x01, 0x01, 0x30, 0x11, 0x06, 0x0b, + 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x02, 0x06, 0x02, 0x02, 0x00, 0x80, 0x30, 0x10, 0x06, 0x0b, + 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x02, 0x07, 0x02, 0x01, 0x03, 0x30, 0x10, 0x06, 0x0b, 0x2a, + 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x02, 0x08, 0x02, 0x01, 0x00, 0x30, 0x10, 0x06, 0x0b, 0x2a, 0x86, + 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x02, 0x09, 0x02, 0x01, 0x00, 0x30, 0x10, 0x06, 0x0b, 0x2a, 0x86, 0x48, + 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x02, 0x0a, 0x02, 0x01, 0x00, 0x30, 0x10, 0x06, 0x0b, 0x2a, 0x86, 0x48, 0x86, + 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x02, 0x0b, 0x02, 0x01, 0x00, 0x30, 0x10, 0x06, 0x0b, 0x2a, 0x86, 0x48, 0x86, 0xf8, + 0x4d, 0x01, 0x0d, 0x01, 0x02, 0x0c, 0x02, 0x01, 0x00, 0x30, 0x10, 0x06, 0x0b, 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, + 0x01, 0x0d, 0x01, 0x02, 0x0d, 0x02, 0x01, 0x00, 0x30, 0x10, 0x06, 0x0b, 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, + 0x0d, 0x01, 0x02, 0x0e, 0x02, 0x01, 0x00, 0x30, 0x10, 0x06, 0x0b, 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, + 0x01, 0x02, 0x0f, 0x02, 0x01, 0x00, 0x30, 0x10, 0x06, 0x0b, 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, + 0x02, 0x10, 0x02, 0x01, 0x00, 0x30, 0x10, 0x06, 0x0b, 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x02, + 0x11, 0x02, 0x01, 0x09, 0x30, 0x1f, 0x06, 0x0b, 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x02, 0x12, + 0x04, 0x10, 0x0d, 0x0d, 0x02, 0x04, 0x01, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + ]; + + let (oid, tcb) = yasna::parse_der(&tcb_enc, |reader| { + reader.read_sequence(|reader| { + let oid = reader.next().read_oid()?; + let tcb = reader.next().read_sequence(decode_tcb_sequence)?; + Ok((oid, tcb)) + }) + }) + .unwrap(); + assert_eq!(oid, *SGX_EXTENSION_TCB); + assert_eq!( + tcb.tcb_components.0.sgxtcbcomponents.map(|c| c.svn), + [13, 13, 2, 4, 1, 128, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0] + ); + assert_eq!(tcb.cpusvn, [13, 13, 2, 4, 1, 128, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0]); + assert_eq!(tcb.tcb_components.0.pcesvn, 9); + } + + #[test] + fn sgx_extension() { + let extension = vec![ + 0x30, 0x82, 0x01, 0xc1, 0x30, 0x1e, 0x06, 0x0a, 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x01, 0x04, + 0x10, 0xa9, 0xf2, 0x39, 0xa8, 0x05, 0xb7, 0xd9, 0x38, 0xf5, 0xb0, 0xea, 0x87, 0x3b, 0x69, 0xdb, 0xa7, 0x30, 0x82, + 0x01, 0x64, 0x06, 0x0a, 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x02, 0x30, 0x82, 0x01, 0x54, 0x30, + 0x10, 0x06, 0x0b, 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x02, 0x01, 0x02, 0x01, 0x0d, 0x30, 0x10, + 0x06, 0x0b, 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x02, 0x02, 0x02, 0x01, 0x0d, 0x30, 0x10, 0x06, + 0x0b, 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x02, 0x03, 0x02, 0x01, 0x02, 0x30, 0x10, 0x06, 0x0b, + 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x02, 0x04, 0x02, 0x01, 0x04, 0x30, 0x10, 0x06, 0x0b, 0x2a, + 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x02, 0x05, 0x02, 0x01, 0x01, 0x30, 0x11, 0x06, 0x0b, 0x2a, 0x86, + 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x02, 0x06, 0x02, 0x02, 0x00, 0x80, 0x30, 0x10, 0x06, 0x0b, 0x2a, 0x86, + 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x02, 0x07, 0x02, 0x01, 0x03, 0x30, 0x10, 0x06, 0x0b, 0x2a, 0x86, 0x48, + 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x02, 0x08, 0x02, 0x01, 0x00, 0x30, 0x10, 0x06, 0x0b, 0x2a, 0x86, 0x48, 0x86, + 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x02, 0x09, 0x02, 0x01, 0x00, 0x30, 0x10, 0x06, 0x0b, 0x2a, 0x86, 0x48, 0x86, 0xf8, + 0x4d, 0x01, 0x0d, 0x01, 0x02, 0x0a, 0x02, 0x01, 0x00, 0x30, 0x10, 0x06, 0x0b, 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, + 0x01, 0x0d, 0x01, 0x02, 0x0b, 0x02, 0x01, 0x00, 0x30, 0x10, 0x06, 0x0b, 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, + 0x0d, 0x01, 0x02, 0x0c, 0x02, 0x01, 0x00, 0x30, 0x10, 0x06, 0x0b, 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, + 0x01, 0x02, 0x0d, 0x02, 0x01, 0x00, 0x30, 0x10, 0x06, 0x0b, 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, + 0x02, 0x0e, 0x02, 0x01, 0x00, 0x30, 0x10, 0x06, 0x0b, 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x02, + 0x0f, 0x02, 0x01, 0x00, 0x30, 0x10, 0x06, 0x0b, 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x02, 0x10, + 0x02, 0x01, 0x00, 0x30, 0x10, 0x06, 0x0b, 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x02, 0x11, 0x02, + 0x01, 0x09, 0x30, 0x1f, 0x06, 0x0b, 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x02, 0x12, 0x04, 0x10, + 0x0d, 0x0d, 0x02, 0x04, 0x01, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x10, 0x06, + 0x0a, 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x03, 0x04, 0x02, 0x00, 0x00, 0x30, 0x14, 0x06, 0x0a, + 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x04, 0x04, 0x06, 0x00, 0x90, 0x6e, 0xa1, 0x00, 0x00, 0x30, + 0x0f, 0x06, 0x0a, 0x2a, 0x86, 0x48, 0x86, 0xf8, 0x4d, 0x01, 0x0d, 0x01, 0x05, 0x0a, 0x01, 0x00, + ]; + let sgx_extension = SGXPCKCertificateExtension::parse_extension(&extension); + assert!(sgx_extension.is_ok()); + let sgx_extension = sgx_extension.unwrap(); + assert_eq!( + sgx_extension.ppid, + [169, 242, 57, 168, 5, 183, 217, 56, 245, 176, 234, 135, 59, 105, 219, 167] + ); + assert_eq!( + sgx_extension.tcb.tcb_components.0.sgxtcbcomponents.map(|c| c.svn), + [13, 13, 2, 4, 1, 128, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0] + ); + assert_eq!(sgx_extension.tcb.tcb_components.0.pcesvn, 9); + assert_eq!(sgx_extension.tcb.cpusvn, [13, 13, 2, 4, 1, 128, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0]); + assert_eq!(sgx_extension.pceid, 0); + assert_eq!(sgx_extension.fmspc, [0, 144, 110, 161, 0, 0]); + assert_eq!(sgx_extension.sgx_type, SGXType::Standard); + assert!(sgx_extension.platform_instance_id.is_none()); + assert!(sgx_extension.configuration.is_none()); + } + + #[test] + fn sgx_extension_platform_cert() { + let extension = Vec::::from_hex( + "30820226301e060a2a864886f84d010d010104103f545fc38af1107f31ed41547783bcd730820163060a2a864886f84d010d0102\ + 308201533010060b2a864886f84d010d0102010201033010060b2a864886f84d010d0102020201033010060b2a864886f84d010d\ + 0102030201003010060b2a864886f84d010d0102040201003010060b2a864886f84d010d0102050201003010060b2a864886f84d\ + 010d0102060201003010060b2a864886f84d010d0102070201003010060b2a864886f84d010d0102080201003010060b2a864886\ + f84d010d0102090201003010060b2a864886f84d010d01020a0201003010060b2a864886f84d010d01020b0201003010060b2a86\ + 4886f84d010d01020c0201003010060b2a864886f84d010d01020d0201003010060b2a864886f84d010d01020e0201003010060b\ + 2a864886f84d010d01020f0201003010060b2a864886f84d010d0102100201003010060b2a864886f84d010d01021102010a301f\ + 060b2a864886f84d010d0102120410030300000000000000000000000000003010060a2a864886f84d010d010304020000301406\ + 0a2a864886f84d010d0104040610606a000000300f060a2a864886f84d010d01050a0101301e060a2a864886f84d010d01060410\ + 5e5a84633cb1ddad3d79b9bea40300923044060a2a864886f84d010d010730363010060b2a864886f84d010d0107010101ff3010\ + 060b2a864886f84d010d0107020101ff3010060b2a864886f84d010d0107030101ff", + ) + .unwrap(); + let sgx_extension = SGXPCKCertificateExtension::parse_extension(&extension); + assert!(sgx_extension.is_ok()); + let sgx_extension = sgx_extension.unwrap(); + assert_eq!( + sgx_extension.ppid, + [0x3F, 0x54, 0x5F, 0xC3, 0x8A, 0xF1, 0x10, 0x7F, 0x31, 0xED, 0x41, 0x54, 0x77, 0x83, 0xBC, 0xD7] + ); + assert_eq!( + sgx_extension.tcb.tcb_components.0.sgxtcbcomponents.map(|c| c.svn), + [3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + ); + assert_eq!(sgx_extension.tcb.tcb_components.0.pcesvn, 10); + assert_eq!(sgx_extension.tcb.cpusvn, [3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); + assert_eq!(sgx_extension.pceid, 0); + assert_eq!(sgx_extension.fmspc, [16, 96, 106, 0, 0, 0]); + assert_eq!(sgx_extension.sgx_type, SGXType::Scalable); + assert_eq!( + sgx_extension.platform_instance_id.unwrap(), + [0x5E, 0x5A, 0x84, 0x63, 0x3C, 0xB1, 0xDD, 0xAD, 0x3D, 0x79, 0xB9, 0xBE, 0xA4, 0x03, 0x00, 0x92] + ); + let configuration = sgx_extension.configuration.unwrap(); + assert!(configuration.dynamic); + assert!(configuration.cached_keys); + assert!(configuration.smt_enabled); + } + + #[test] + #[cfg(not(target_env = "sgx"))] + fn read_pckcrt() { + let pck = PckCert::read_from_file( + "./tests/data/", + "5d39f104e642e51c91507932..71b719-0f0f0205ff8007000000000000000000-0900-0000.pckcert", + ) + .expect("validated"); + + assert_eq!(get_cert_subject(&pck.ca_chain.last().unwrap()), "Intel SGX Root CA"); + assert_eq!(get_cert_subject(&pck.cert), "Intel SGX PCK Certificate"); + #[cfg(feature = "verify")] + { + let root_ca = include_bytes!("../tests/data/root_SGX_CA_der.cert"); + let root_cas = [&root_ca[..]]; + let pck = pck.verify(&root_cas).unwrap(); + + let sgx_extension = pck.sgx_extension().expect("validated"); + assert_eq!( + sgx_extension.ppid, + [138, 37, 248, 76, 1, 238, 38, 35, 157, 25, 11, 226, 233, 16, 18, 144] + ); + assert_eq!( + sgx_extension.tcb.tcb_components.0.sgxtcbcomponents.map(|c| c.svn), + [13, 13, 2, 4, 1, 128, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0] + ); + assert_eq!(sgx_extension.tcb.tcb_components.0.pcesvn, 9); + assert_eq!(sgx_extension.tcb.cpusvn, [13, 13, 2, 4, 1, 128, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0]); + assert_eq!(sgx_extension.pceid, 0); + assert_eq!(sgx_extension.fmspc, [0, 144, 110, 161, 0, 0]); + } + } + + #[test] + fn pckcrt_from_quote() { + let quote = include_bytes!("../tests/data/quote.bin"); + let quote = Quote::parse(Cow::from("e[..])).unwrap(); + let sig = quote.signature::().unwrap(); + let pck_chain: Qe3CertDataPckCertChain = sig.certification_data().unwrap(); + let pck = PckCert::from_pck_chain(pck_chain.certs.into()).unwrap(); + let sgx_extension = pck.sgx_extension().unwrap(); + assert_eq!(sgx_extension.fmspc, [0, 144, 110, 161, 0, 0]); + } + + #[test] + #[cfg(not(target_env = "sgx"))] + fn read_pckcrts() { + let pcks = PckCerts::restore( + "./tests/data/", + &base16::decode("16a5b41ebb076d263a1e39e64e7175e7".as_bytes()).unwrap(), + ) + .expect("validated"); + assert_eq!(pcks.iter().count(), 12); + for cert in pcks.iter() { + SGXPCKCertificateExtension::try_from(cert).expect("validated"); + assert_eq!(get_cert_subject_from_der(&cert), "Intel SGX PCK Certificate"); + } + assert_eq!(get_cert_subject(&pcks.ca_chain.last().unwrap()), "Intel SGX Root CA"); + + let cert = pcks.iter().next().expect("validated"); + let sgx_extension = SGXPCKCertificateExtension::try_from(cert).expect("validated"); + assert_eq!( + sgx_extension.ppid, + [138, 37, 248, 76, 1, 238, 38, 35, 157, 25, 11, 226, 233, 16, 18, 144] + ); + assert_eq!( + sgx_extension.tcb.tcb_components.0.sgxtcbcomponents.map(|c| c.svn), + [14, 14, 2, 4, 1, 128, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0] + ); + assert_eq!(sgx_extension.tcb.tcb_components.0.pcesvn, 10); + assert_eq!(sgx_extension.tcb.cpusvn, [14, 14, 2, 4, 1, 128, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0]); + assert_eq!(sgx_extension.pceid, 0); + assert_eq!(sgx_extension.fmspc, [0, 144, 110, 161, 0, 0]); + } + + #[test] + #[cfg(not(target_env = "sgx"))] + fn read_pckcrts_with_missing_certs() { + let pcks = PckCerts::restore( + "./tests/data/", + &base16::decode("00000000000000000000000000000000".as_bytes()).unwrap(), + ) + .expect("validated"); + let cert = pem::pem_to_der( + &concat!( + "-----BEGIN CERTIFICATE-----\n", + "MIIE8jCCBJmgAwIBAgIVAIK77m63vG5A1vcRhx5fHPY75FnQMAoGCCqGSM49BAMC\n", + "MHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgUGxhdGZvcm0gQ0ExGjAYBgNVBAoM\n", + "EUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\n", + "CAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTIyMTIxNjEwMTk0OVoXDTI5MTIxNjEwMTk0\n", + "OVowcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\n", + "CgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\n", + "VQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATq\n", + "R+sFzV6WAsyc8Ka4rul7Hz7l16ToABtGYRzZd5h22Y1eljsI0Vt6GnITfHuiXyS6\n", + "HXsyRZqE4u8nRRTsFKU3o4IDDjCCAwowHwYDVR0jBBgwFoAUlW9dzb0b4elAScnU\n", + "9DPOAVcL3lQwawYDVR0fBGQwYjBgoF6gXIZaaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\n", + "cnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92My9wY2tjcmw/Y2E9\n", + "cGxhdGZvcm0mZW5jb2Rpbmc9ZGVyMB0GA1UdDgQWBBR20OYrtxnHDel8lcKFwmhx\n", + "/UEckzAOBgNVHQ8BAf8EBAMCBsAwDAYDVR0TAQH/BAIwADCCAjsGCSqGSIb4TQEN\n", + "AQSCAiwwggIoMB4GCiqGSIb4TQENAQEEEPBi9+kxf7O+L8OZgujiZOswggFlBgoq\n", + "hkiG+E0BDQECMIIBVTAQBgsqhkiG+E0BDQECAQIBBDAQBgsqhkiG+E0BDQECAgIB\n", + "BDAQBgsqhkiG+E0BDQECAwIBAzAQBgsqhkiG+E0BDQECBAIBAzARBgsqhkiG+E0B\n", + "DQECBQICAP8wEQYLKoZIhvhNAQ0BAgYCAgD/MBAGCyqGSIb4TQENAQIHAgEAMBAG\n", + "CyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\n", + "AgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\n", + "TQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\n", + "CyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgELMB8GCyqGSIb4TQENAQIS\n", + "BBAEBAMD//8AAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\n", + "AQQEBgBgagAAADAPBgoqhkiG+E0BDQEFCgEBMB4GCiqGSIb4TQENAQYEEIEDHYFl\n", + "SvQX3oyiTA8B0/MwRAYKKoZIhvhNAQ0BBzA2MBAGCyqGSIb4TQENAQcBAQH/MBAG\n", + "CyqGSIb4TQENAQcCAQH/MBAGCyqGSIb4TQENAQcDAQH/MAoGCCqGSM49BAMCA0cA\n", + "MEQCIA6R9ZOhoLbanU/mPY1hKn3Mk4Wxo0GXb7sEtLzNYWSMAiBnbSyR4iL3qEQt\n", + "GkDTeneBR0bJi4lCLTwIwxg6tuWjdQ==\n", + "-----END CERTIFICATE-----\n" + ), + Some(PEM_CERTIFICATE), + ) + .unwrap(); + assert_eq!(pcks.pck_data.len(), 5); + assert_eq!(pcks.pck_data[0].cert, PckCertValue::Missing(String::from("Not available"))); + assert_eq!(pcks.pck_data[1].cert, PckCertValue::Missing(String::from("Not available"))); + assert_eq!(pcks.pck_data[2].cert, PckCertValue::Cert(cert)); + assert_eq!(pcks.iter().count(), 3); + } + + #[test] + fn pck_cert_value() { + let originals = vec![ + PckCertValue::Missing(String::from("Not available")), + PckCertValue::Missing(String::from("bla")), + PckCertValue::Cert(vec![0, 0, 0, 0, 0, 0, 0, 0]), + ]; + + for original in originals { + let ser = serde_json::to_string(&original).unwrap(); + let deser = serde_json::from_str(&ser).unwrap(); + assert_eq!(original, deser); + } + } + + #[test] + #[cfg(not(target_env = "sgx"))] + fn pckcrts_conversion() { + let pcks = PckCerts::restore( + "./tests/data/", + &base16::decode("16a5b41ebb076d263a1e39e64e7175e7".as_bytes()).unwrap(), + ) + .unwrap(); + + for i in 0..pcks.pck_data.len() { + let pck: PckCert = pcks.as_pck_certs()[i].clone(); + let cert = pem::pem_to_der(&pck.cert, Some(PEM_CERTIFICATE)).unwrap(); + assert_eq!(pcks.pck_data[i].cert, PckCertValue::Cert(cert)); + assert_eq!(pcks.ca_chain.iter().map(|c| c.trim()).collect::>(), pck.ca_chain); + + let pck: PckCerts = pck.try_into().unwrap(); + assert_eq!( + pcks.pck_data[i].tcb.0.sgxtcbcomponents, + pck.pck_data[0].tcb.0.sgxtcbcomponents + ); + assert_eq!(pcks.pck_data[i].tcb.0.pcesvn, pck.pck_data[0].tcb.0.pcesvn); + assert_eq!(pcks.pck_data[i].tcbm, pck.pck_data[0].tcbm); + assert_eq!(pcks.pck_data[i].cert, pck.pck_data[0].cert); + } + } + + #[test] + fn tcb_level_partial_cmp() { + let base_tcb = [10, 20, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + let base = TcbComponents::from_raw(base_tcb, 40); + let base = &base; + let mut other = base.clone(); + assert_eq!(base.partial_cmp(&other), Some(Ordering::Equal)); + + other = base.clone(); + other.0.sgxtcbcomponents = [10, 20, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0].map(|c| c.into()); + assert_eq!(base.partial_cmp(&other), Some(Ordering::Less)); + + other = base.clone(); + other.0.sgxtcbcomponents = [20, 20, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0].map(|c| c.into()); + assert_eq!(base.partial_cmp(&other), Some(Ordering::Less)); + + other = base.clone(); + other.0.sgxtcbcomponents = [0, 20, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0].map(|c| c.into()); + assert_eq!(base.partial_cmp(&other), Some(Ordering::Greater)); + + other = base.clone(); + other.0.sgxtcbcomponents = [10, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0].map(|c| c.into()); + assert_eq!(base.partial_cmp(&other), Some(Ordering::Greater)); + + other = base.clone(); + other.0.sgxtcbcomponents = [0, 20, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0].map(|c| c.into()); + assert_eq!(base.partial_cmp(&other), None); + + other = base.clone(); + other.0.pcesvn = 50; + assert_eq!(base.partial_cmp(&other), Some(Ordering::Less)); + + other = base.clone(); + other.0.pcesvn = 30; + assert_eq!(base.partial_cmp(&other), Some(Ordering::Greater)); + } +} diff --git a/intel-sgx/pcs/src/pckid.rs b/intel-sgx/pcs/src/pckid.rs new file mode 100644 index 00000000..ecdbb60c --- /dev/null +++ b/intel-sgx/pcs/src/pckid.rs @@ -0,0 +1,102 @@ +/* Copyright (c) Fortanix, Inc. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +use std::convert::TryInto; +use std::fs::File; +use std::io::{self, BufRead, BufReader, Error, ErrorKind}; +use std::path::Path; + +use rustc_serialize::hex::{FromHex, ToHex}; +use serde::{Deserialize, Serialize}; + +use crate::{CpuSvn, EncPpid, PceId, PceIsvsvn, QeId}; + +#[derive(Clone, Serialize, Deserialize, Debug, Default, Hash, PartialEq, Eq)] +pub struct PckID { + pub enc_ppid: EncPpid, + pub pce_id: PceId, + pub cpu_svn: CpuSvn, + pub pce_isvsvn: PceIsvsvn, + pub qe_id: QeId, +} + +impl ToString for PckID { + fn to_string(&self) -> String { + let enc_ppid = self.enc_ppid.as_slice(); + let mut string = String::from("==[ PckId ]==\n"); + string += format!(" Info:\n").as_str(); + string += format!( + " Encr. PPID: {}..{}\n", + enc_ppid[..12].to_hex(), + enc_ppid[enc_ppid.len() - 3..].to_hex() + ) + .as_str(); + string += format!(" pce_id: {}\n", self.pce_id.to_le_bytes().to_hex()).as_str(); + string += format!(" cpu svn: {}\n", self.cpu_svn.as_slice().to_hex()).as_str(); + string += format!(" pce isvsvn: {}\n", self.pce_isvsvn.to_le_bytes().to_hex()).as_str(); + string += format!(" qe_id: {}\n", self.qe_id.as_slice().to_hex()).as_str(); + return string; + } +} + +fn parse_hex_array<'a>(chunk: &'a str, expected_bytes: usize) -> io::Result> { + if chunk.len() != expected_bytes * 2 { + return Err(Error::new(ErrorKind::InvalidData, "Parse error, incorrect field length")); + } + + chunk + .from_hex() + .map_err(|_| Error::new(ErrorKind::InvalidData, "Cannot parse as hexadecimal")) +} + +/// Iterator adapter that returns Results instead of Options. +struct ResultAdapter E>(I, F); + +impl E> ResultAdapter { + fn next(&mut self) -> std::result::Result { + self.0.next().ok_or_else(|| self.1()) + } +} + +impl PckID { + pub fn parse_line(line: &str) -> io::Result { + let mut fields = ResultAdapter(line.split(","), || Error::new(ErrorKind::InvalidData, "Too few fields")); + + let enc_ppid: EncPpid = parse_hex_array(fields.next()?, 384)?; + let pce_id: PceId = u16::from_str_radix(fields.next()?, 16) + .map_err(|_| Error::new(ErrorKind::InvalidData, "Cannot parse as hexadecimal"))?; + let cpu_svn: CpuSvn = parse_hex_array(fields.next()?, 16)? + .try_into() + .map_err(|_e| Error::new(ErrorKind::InvalidData, "Incorrect length cpu_svn"))?; + let pce_isvsvn: PceIsvsvn = u16::from_str_radix(fields.next()?, 16) + .map_err(|_| Error::new(ErrorKind::InvalidData, "Cannot parse as hexadecimal"))?; + let qe_id: QeId = parse_hex_array(fields.next()?, 16)? + .try_into() + .map_err(|_e| Error::new(ErrorKind::InvalidData, "Incorrect length qe_id"))?; + + Ok(PckID { + enc_ppid, + pce_id, + cpu_svn, + pce_isvsvn, + qe_id, + }) + } + + pub fn parse_file(file: &Path) -> io::Result> { + let file = File::open(file)?; + let mut pck_ids = Vec::new(); + + for line in BufReader::new(file).lines() { + let line = line?; + let pck_id = PckID::parse_line(&line)?; + pck_ids.push(pck_id); + } + + Ok(pck_ids) + } +} diff --git a/intel-sgx/pcs/src/qe_identity.rs b/intel-sgx/pcs/src/qe_identity.rs new file mode 100644 index 00000000..2f3549e0 --- /dev/null +++ b/intel-sgx/pcs/src/qe_identity.rs @@ -0,0 +1,384 @@ +/* Copyright (c) Fortanix, Inc. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +use std::convert::TryInto; +use std::marker::PhantomData; +use std::path::PathBuf; + +use serde::{de, Deserialize, Deserializer, Serialize}; +use serde_json::value::RawValue; +use sgx_isa::{Attributes, Miscselect}; +#[cfg(feature = "verify")] +use { + mbedtls::alloc::List as MbedtlsList, mbedtls::x509::certificate::Certificate, mbedtls::Error as MbedError, pkix::oid, + pkix::pem::PEM_CERTIFICATE, pkix::x509::GenericCertificate, pkix::FromBer, std::ops::Deref, +}; + +use crate::io::{self}; +use crate::{Error, TcbStatus, Unverified, VerificationType, Verified}; + +#[derive(Clone, Serialize, Deserialize, Debug)] +struct Tcb { + isvsvn: u16, +} + +#[derive(Clone, Serialize, Deserialize, Debug)] +#[serde(rename_all = "camelCase")] +pub struct TcbLevel { + tcb: Tcb, + tcb_date: String, + tcb_status: TcbStatus, + #[serde(default, rename = "advisoryIDs", skip_serializing_if = "Vec::is_empty")] + advisory_ids: Vec, +} + +impl TcbLevel { + pub fn tcb_status(&self) -> &TcbStatus { + &self.tcb_status + } +} + +#[derive(Clone, Serialize, Debug)] +#[serde(rename_all = "camelCase")] +pub struct QeIdentity { + version: u16, + id: String, + issue_date: String, + next_update: String, + tcb_evaluation_data_number: u32, + #[serde(deserialize_with = "miscselect_deserializer", serialize_with = "miscselect_serializer")] + miscselect: Miscselect, + #[serde( + deserialize_with = "miscselect_mask_deserializer", + serialize_with = "miscselect_mask_serializer" + )] + miscselect_mask: u32, + #[serde(deserialize_with = "attributes_deserializer", serialize_with = "attributes_serializer")] + attributes: Attributes, + #[serde(deserialize_with = "attributes_deserializer", serialize_with = "attributes_serializer")] + attributes_mask: Attributes, + #[serde(deserialize_with = "mrsigner_deserializer", serialize_with = "mrsigner_serializer")] + mrsigner: [u8; 32], + isvprodid: u16, + tcb_levels: Vec, + #[serde(skip)] + type_: PhantomData, +} + +impl<'de> Deserialize<'de> for QeIdentity { + fn deserialize(deserializer: D) -> Result, D::Error> + where + D: Deserializer<'de>, + { + #[derive(Deserialize)] + #[serde(rename_all = "camelCase")] + struct Dummy { + version: u16, + id: String, + issue_date: String, + next_update: String, + tcb_evaluation_data_number: u32, + #[serde(deserialize_with = "miscselect_deserializer", serialize_with = "miscselect_serializer")] + miscselect: Miscselect, + #[serde( + deserialize_with = "miscselect_mask_deserializer", + serialize_with = "miscselect_mask_serializer" + )] + miscselect_mask: u32, + #[serde(deserialize_with = "attributes_deserializer", serialize_with = "attributes_serializer")] + attributes: Attributes, + #[serde(deserialize_with = "attributes_deserializer", serialize_with = "attributes_serializer")] + attributes_mask: Attributes, + #[serde(deserialize_with = "mrsigner_deserializer", serialize_with = "mrsigner_serializer")] + mrsigner: [u8; 32], + isvprodid: u16, + tcb_levels: Vec, + } + + let Dummy { + version, + id, + issue_date, + next_update, + tcb_evaluation_data_number, + miscselect, + miscselect_mask, + attributes, + attributes_mask, + mrsigner, + isvprodid, + tcb_levels, + } = Dummy::deserialize(deserializer)?; + + Ok(QeIdentity:: { + version, + id, + issue_date, + next_update, + tcb_evaluation_data_number, + miscselect, + miscselect_mask, + attributes, + attributes_mask, + mrsigner, + isvprodid, + tcb_levels, + type_: PhantomData, + }) + } +} + +impl QeIdentity { + /// Returns the most recent TCB level matching the isvsvn + pub fn find_tcb_level<'a>(&'a self, isvsvn: u16) -> Option<&'a TcbLevel> { + // Note: tcb levels are ordered in descending order + for tcb in self.tcb_levels.iter() { + if tcb.tcb.isvsvn <= isvsvn { + return Some(tcb); + } + } + None + } + + pub fn mrsigner(&self) -> &[u8; 32] { + &self.mrsigner + } + + pub fn isvprodid(&self) -> u16 { + self.isvprodid + } + + pub fn attributes<'a>(&'a self) -> &'a Attributes { + &self.attributes + } + + pub fn attributes_mask<'a>(&'a self) -> &'a Attributes { + &self.attributes_mask + } + + pub fn miscselect<'a>(&'a self) -> &'a Miscselect { + &self.miscselect + } + + pub fn miscselect_mask(&self) -> Miscselect { + Miscselect::from_bits_truncate(self.miscselect_mask) + } +} + +fn mrsigner_deserializer<'de, D: Deserializer<'de>>(deserializer: D) -> Result<[u8; 32], D::Error> { + let mrsigner = String::deserialize(deserializer)?; + let mrsigner = base16::decode(&mrsigner).map_err(de::Error::custom)?; + mrsigner.as_slice().try_into().map_err(de::Error::custom) +} + +fn mrsigner_serializer(mrsigner: &[u8; 32], serializer: S) -> ::std::result::Result +where + S: ::serde::Serializer, +{ + let mrsigner = base16::encode_upper(mrsigner); + serializer.serialize_str(&mrsigner) +} + +fn attributes_deserializer<'de, D: Deserializer<'de>>(deserializer: D) -> Result { + let attributes = String::deserialize(deserializer)?; + let attributes = base16::decode(&attributes).map_err(de::Error::custom)?; + Attributes::try_copy_from(&attributes).ok_or_else(|| de::Error::custom("Could not parse attribtes")) +} + +fn attributes_serializer(attributes: &Attributes, serializer: S) -> ::std::result::Result +where + S: ::serde::Serializer, +{ + let attributes: &[u8] = attributes.as_ref(); + let attributes = base16::encode_upper(&attributes); + serializer.serialize_str(&attributes) +} + +fn miscselect_deserializer<'de, D: Deserializer<'de>>(deserializer: D) -> Result { + let miscselect = String::deserialize(deserializer)?; + let miscselect = u32::from_str_radix(&miscselect, 16).map_err(de::Error::custom)?; + Miscselect::from_bits(miscselect).ok_or_else(|| de::Error::custom("Could not parse miscselect")) +} + +fn miscselect_serializer(miscselect: &Miscselect, serializer: S) -> ::std::result::Result +where + S: ::serde::Serializer, +{ + let miscselect = miscselect.bits(); + let miscselect = base16::encode_upper(&miscselect.to_be_bytes()); + serializer.serialize_str(&miscselect) +} + +fn miscselect_mask_deserializer<'de, D: Deserializer<'de>>(deserializer: D) -> Result { + let miscselect = String::deserialize(deserializer)?; + u32::from_str_radix(&miscselect, 16).map_err(de::Error::custom) +} + +fn miscselect_mask_serializer(miscselect: &u32, serializer: S) -> ::std::result::Result +where + S: ::serde::Serializer, +{ + let miscselect = base16::encode_upper(&miscselect.to_be_bytes()); + serializer.serialize_str(&miscselect) +} + +#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)] +pub struct QeIdentitySigned { + raw_enclave_identity: String, + signature: Vec, + ca_chain: Vec, +} + +impl QeIdentitySigned { + const DEFAULT_FILENAME: &'static str = "qe3_identity.id"; + + pub fn parse(body: &String, ca_chain: Vec) -> Result { + #[derive(Deserialize)] + #[serde(rename_all = "camelCase")] + struct IntelQeIdentitySigned<'a> { + #[serde(borrow)] + enclave_identity: &'a RawValue, + #[serde(deserialize_with = "crate::intel_signature_deserializer")] + signature: Vec, + } + let IntelQeIdentitySigned { + enclave_identity, + signature, + } = serde_json::from_str(&body)?; + Ok(QeIdentitySigned::new(enclave_identity.to_string(), signature, ca_chain)) + } + + pub fn new(raw_enclave_identity: String, signature: Vec, ca_chain: Vec) -> Self { + QeIdentitySigned { + raw_enclave_identity, + signature, + ca_chain, + } + } + + pub fn write_to_file(&self, output_dir: &str) -> Result { + io::write_to_file(&self, output_dir, Self::DEFAULT_FILENAME)?; + Ok(Self::DEFAULT_FILENAME.to_string()) + } + + pub fn write_to_file_if_not_exist(&self, output_dir: &str) -> Result, Error> { + io::write_to_file_if_not_exist(&self, output_dir, &Self::DEFAULT_FILENAME) + } + + pub fn read_from_file(input_dir: &str) -> Result { + let identity: Self = io::read_from_file(input_dir, Self::DEFAULT_FILENAME)?; + Ok(identity) + } + + pub fn raw_qe_identity(&self) -> &String { + &self.raw_enclave_identity + } + + pub fn signature(&self) -> &Vec { + &self.signature + } + + pub fn certificate_chain(&self) -> &Vec { + &self.ca_chain + } + + #[cfg(feature = "verify")] + pub fn verify>(&self, trusted_root_certs: &[B]) -> Result { + // check cert chain + let (chain, root) = crate::create_cert_chain(&self.ca_chain)?; + let mut leaf = chain.first().unwrap_or(&root).clone(); + let root_list = std::iter::once(root).collect(); + if 0 < chain.len() { + let trust_ca: MbedtlsList = chain.into_iter().collect(); + Certificate::verify(&trust_ca, &root_list, None, None).map_err(|e| Error::InvalidQe3Id(e))?; + } + + // Check signature on data + let mut hash = [0u8; 32]; + mbedtls::hash::Md::hash(mbedtls::hash::Type::Sha256, self.raw_enclave_identity.as_bytes(), &mut hash).unwrap(); + leaf.public_key_mut() + .verify(mbedtls::hash::Type::Sha256, &hash, &self.signature) + .map_err(|e| Error::InvalidQe3Id(e))?; + + // Check common name TCB cert + let leaf = self.ca_chain.first().ok_or(Error::IncorrectCA)?; + let tcb = + &pkix::pem::pem_to_der(&leaf, Some(PEM_CERTIFICATE)).ok_or(Error::InvalidQe3Id(MbedError::X509BadInputData))?; + let tcb = GenericCertificate::from_ber(&tcb).map_err(|_| Error::InvalidQe3Id(MbedError::X509BadInputData))?; + let name = tcb + .tbscert + .subject + .get(&*oid::commonName) + .ok_or(Error::InvalidQe3Id(MbedError::X509BadInputData))?; + if String::from_utf8_lossy(&name.value()) != "Intel SGX TCB Signing" { + return Err(Error::IncorrectCA); + } + + crate::check_root_ca(trusted_root_certs, &root_list)?; + + let QeIdentity:: { + version, + id, + issue_date, + next_update, + tcb_evaluation_data_number, + miscselect, + miscselect_mask, + attributes, + attributes_mask, + mrsigner, + isvprodid, + tcb_levels, + type_: PhantomData, + } = serde_json::from_str(&self.raw_enclave_identity).map_err(|e| Error::ParseError(e))?; + if version != 2 { + return Err(Error::UnknownQeIdentityVersion(version)); + } + Ok(QeIdentity:: { + version, + id, + issue_date, + next_update, + tcb_evaluation_data_number, + miscselect, + miscselect_mask, + attributes, + attributes_mask, + mrsigner, + isvprodid, + tcb_levels, + type_: PhantomData, + }) + } +} + +#[cfg(feature = "verify")] +#[cfg(test)] +mod tests { + #[cfg(not(target_env = "sgx"))] + use crate::qe_identity::QeIdentitySigned; + + #[test] + #[cfg(not(target_env = "sgx"))] + fn read_qe3_identity() { + let qe_id = QeIdentitySigned::read_from_file("./tests/data/").expect("validated"); + + let root_cert = include_bytes!("../tests/data/root_SGX_CA_der.cert"); + let root_certs = [&root_cert[..]]; + assert!(qe_id.verify(&root_certs).is_ok()); + } + + #[test] + #[cfg(not(target_env = "sgx"))] + fn read_corrupted_qe3_identity() { + let qeid = QeIdentitySigned::read_from_file("./tests/data/corrupted/").unwrap(); + + let root_cert = include_bytes!("../tests/data/root_SGX_CA_der.cert"); + let root_certs = [&root_cert[..]]; + assert!(qeid.verify(&root_certs).is_err()); + } +} diff --git a/intel-sgx/pcs/src/tcb_info.rs b/intel-sgx/pcs/src/tcb_info.rs new file mode 100644 index 00000000..de06ba49 --- /dev/null +++ b/intel-sgx/pcs/src/tcb_info.rs @@ -0,0 +1,298 @@ +/* Copyright (c) Fortanix, Inc. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +use std::marker::PhantomData; +use std::path::PathBuf; + +use serde::{Deserialize, Deserializer, Serialize}; +use serde_json::value::RawValue; +#[cfg(feature = "verify")] +use { + mbedtls::alloc::List as MbedtlsList, mbedtls::x509::certificate::Certificate, mbedtls::Error as MbedError, pkix::oid, + pkix::pem::PEM_CERTIFICATE, pkix::x509::GenericCertificate, pkix::FromBer, std::ops::Deref, +}; + +use crate::pckcrt::TcbComponents; +use crate::{io, Error, TcbStatus, Unverified, VerificationType, Verified}; + +#[derive(Serialize, Deserialize, Clone, Debug)] +#[serde(rename_all = "camelCase")] +pub struct TcbLevel { + pub tcb: TcbComponents, + pub tcb_date: String, + pub tcb_status: TcbStatus, + #[serde(default, rename = "advisoryIDs", skip_serializing_if = "Vec::is_empty")] + pub advisory_ids: Vec, +} + +#[derive(Serialize, Deserialize, Clone, Debug)] +pub enum Platform { + SGX, + TDX, +} + +fn sgx_platform() -> Platform { + Platform::SGX +} + +#[derive(Clone, Serialize, Debug)] +#[serde(rename_all = "camelCase")] +pub struct TcbData { + #[serde(default = "sgx_platform")] + id: Platform, + version: u16, + issue_date: String, + next_update: String, + fmspc: String, + pce_id: String, + tcb_type: u16, + tcb_evaluation_data_number: u64, + #[serde(rename = "tcbLevels")] + tcb_levels: Vec, + #[serde(skip)] + type_: PhantomData, +} + +impl<'de> Deserialize<'de> for TcbData { + fn deserialize(deserializer: D) -> Result, D::Error> + where + D: Deserializer<'de>, + { + #[derive(Deserialize)] + #[serde(rename_all = "camelCase")] + struct Dummy { + #[serde(default = "sgx_platform")] + id: Platform, + version: u16, + issue_date: String, + next_update: String, + fmspc: String, + pce_id: String, + tcb_type: u16, + tcb_evaluation_data_number: u64, + #[serde(rename = "tcbLevels")] + tcb_levels: Vec, + } + + let Dummy { + id, + version, + issue_date, + next_update, + fmspc, + pce_id, + tcb_type, + tcb_evaluation_data_number, + tcb_levels, + } = Dummy::deserialize(deserializer)?; + Ok(TcbData { + id, + version, + issue_date, + next_update, + fmspc, + pce_id, + tcb_type, + tcb_evaluation_data_number, + tcb_levels, + type_: PhantomData, + }) + } +} + +impl TcbData { + fn parse(raw_tcb_data: &String) -> Result, Error> { + let data: TcbData = serde_json::from_str(&raw_tcb_data).map_err(|e| Error::ParseError(e))?; + if data.version != 2 && data.version != 3 { + return Err(Error::UnknownTcbInfoVersion(data.version)); + } + + // Only tcb_type 0 is known at the moment, verify that it has that expected value + if data.tcb_type != 0 { + return Err(Error::UnknownTcbType(data.tcb_type)); + } + Ok(data) + } +} + +impl TcbData { + pub(crate) fn tcb_levels(&self) -> &Vec { + &self.tcb_levels + } + + pub(crate) fn decompose_raw_cpusvn(&self, raw_cpusvn: &[u8; 16], pce_svn: u16) -> Result { + if self.tcb_type != 0 { + return Err(Error::UnknownTcbType(self.tcb_type)); + } + + // TCB Type 0 simply copies cpu svn + Ok(TcbComponents::from_raw(*raw_cpusvn, pce_svn)) + } +} + +#[derive(Clone, Serialize, Deserialize, Debug, Eq, PartialEq)] +pub struct TcbInfo { + raw_tcb_info: String, + signature: Vec, + ca_chain: Vec, +} + +impl TcbInfo { + pub fn new(raw_tcb_info: String, signature: Vec, ca_chain: Vec) -> Self { + TcbInfo { + raw_tcb_info, + signature, + ca_chain, + } + } + + pub fn parse(body: &String, ca_chain: Vec) -> Result { + #[derive(Deserialize)] + #[serde(rename_all = "camelCase")] + struct IntelTcbInfoSigned<'a> { + #[serde(borrow, rename = "tcbInfo")] + raw_tcb_info: &'a RawValue, + #[serde(deserialize_with = "crate::intel_signature_deserializer")] + signature: Vec, + } + let IntelTcbInfoSigned { raw_tcb_info, signature } = serde_json::from_str(&body)?; + + Ok(TcbInfo::new(raw_tcb_info.to_string(), signature, ca_chain)) + } + + fn create_filename(fmspc: &str) -> String { + format!("{}.tcb", fmspc) + } + + pub fn store(&self, output_dir: &str) -> Result { + let data = TcbData::::parse(&self.raw_tcb_info)?; + let filename = Self::create_filename(&data.fmspc); + io::write_to_file(&self, output_dir, &filename)?; + Ok(filename) + } + + pub fn store_if_not_exist(&self, output_dir: &str) -> Result, Error> { + let data = TcbData::::parse(&self.raw_tcb_info)?; + let filename = Self::create_filename(&data.fmspc); + io::write_to_file_if_not_exist(&self, output_dir, &filename) + } + + pub fn restore(input_dir: &str, fmspc: &[u8]) -> Result { + let fmspc = &base16::encode_lower(&fmspc); + let filename = TcbInfo::create_filename(fmspc); + let info: TcbInfo = io::read_from_file(input_dir, &filename)?; + Ok(info) + } + + pub fn raw_tcb_info(&self) -> &String { + &self.raw_tcb_info + } + + pub fn signature(&self) -> &Vec { + &self.signature + } + + pub fn certificate_chain(&self) -> &Vec { + &self.ca_chain + } + + #[cfg(feature = "verify")] + pub fn verify>(&self, trusted_root_certs: &[B]) -> Result, Error> { + // Check cert chain + let (chain, root) = crate::create_cert_chain(&self.ca_chain)?; + let mut leaf = chain.first().unwrap_or(&root).clone(); + let root_list = std::iter::once(root).collect(); + if 0 < chain.len() { + let trust_ca: MbedtlsList = chain.into_iter().collect(); + let mut err = String::default(); + Certificate::verify(&trust_ca, &root_list, None, Some(&mut err)) + .map_err(|_| Error::InvalidTcbInfo(format!("Invalid TcbInfo: {}", err)))?; + } + + // Check signature on data + let mut hash = [0u8; 32]; + mbedtls::hash::Md::hash(mbedtls::hash::Type::Sha256, self.raw_tcb_info.as_bytes(), &mut hash).unwrap(); + leaf.public_key_mut() + .verify(mbedtls::hash::Type::Sha256, &hash, self.signature()) + .map_err(|_| Error::InvalidTcbInfo("Signature verification failed".into()))?; + + // Check common name TCB cert + let leaf = self.ca_chain.first().ok_or(Error::IncorrectCA)?; + let tcb = + &pkix::pem::pem_to_der(&leaf, Some(PEM_CERTIFICATE)).ok_or(Error::InvalidQe3Id(MbedError::X509BadInputData))?; + let tcb = GenericCertificate::from_ber(&tcb).map_err(|_| Error::InvalidQe3Id(MbedError::X509BadInputData))?; + let name = tcb + .tbscert + .subject + .get(&*oid::commonName) + .ok_or(Error::InvalidQe3Id(MbedError::X509BadInputData))?; + if String::from_utf8_lossy(&name.value()) != "Intel SGX TCB Signing" { + return Err(Error::IncorrectCA); + } + + crate::check_root_ca(trusted_root_certs, &root_list)?; + + let TcbData { + id, + version, + issue_date, + next_update, + fmspc, + pce_id, + tcb_type, + tcb_evaluation_data_number, + tcb_levels, + .. + } = TcbData::parse(&self.raw_tcb_info)?; + + Ok(TcbData:: { + id, + version, + issue_date, + next_update, + fmspc, + pce_id, + tcb_type, + tcb_evaluation_data_number, + tcb_levels, + type_: PhantomData, + }) + } + + pub fn data(&self) -> Result, Error> { + TcbData::parse(&self.raw_tcb_info) + } +} + +#[cfg(feature = "verify")] +#[cfg(test)] +mod tests { + #[cfg(not(target_env = "sgx"))] + use crate::tcb_info::TcbInfo; + + #[test] + #[cfg(not(target_env = "sgx"))] + fn read_tcb_info() { + let info = TcbInfo::restore( + "./tests/data/", + &base16::decode("00906ea10000".as_bytes()).expect("validated"), + ) + .expect("validated"); + let root_certificate = include_bytes!("../tests/data/root_SGX_CA_der.cert"); + let root_certificates = [&root_certificate[..]]; + assert!(info.verify(&root_certificates).is_ok()); + } + + #[test] + #[cfg(not(target_env = "sgx"))] + fn read_corrupt_tcb_info() { + let tcb_info = TcbInfo::restore("./tests/data/corrupted", &base16::decode("00906ea10000".as_bytes()).unwrap()).unwrap(); + let root_certificate = include_bytes!("../tests/data/root_SGX_CA_der.cert"); + let root_certificates = [&root_certificate[..]]; + assert!(tcb_info.verify(&root_certificates).is_err()); + } +} diff --git a/intel-sgx/pcs/tests/data/00000000000000000000000000000000.certs b/intel-sgx/pcs/tests/data/00000000000000000000000000000000.certs new file mode 100644 index 00000000..36b7535f --- /dev/null +++ b/intel-sgx/pcs/tests/data/00000000000000000000000000000000.certs @@ -0,0 +1 @@ +{"pck_data":[{"tcb":{"sgxtcbcomponents":[{"svn":7,"category":"","type":""},{"svn":9,"category":"","type":""},{"svn":3,"category":"","type":""},{"svn":3,"category":"","type":""},{"svn":255,"category":"","type":""},{"svn":255,"category":"","type":""},{"svn":1,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":13},"tcbm":"07090303FFFF010000000000000000000D00","cert":"Not available"},{"tcb":{"sgxtcbcomponents":[{"svn":7,"category":"","type":""},{"svn":9,"category":"","type":""},{"svn":3,"category":"","type":""},{"svn":3,"category":"","type":""},{"svn":255,"category":"","type":""},{"svn":255,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":13},"tcbm":"07090303FFFF000000000000000000000D00","cert":"Not available"},{"tcb":{"sgxtcbcomponents":[{"svn":4,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":3,"category":"","type":""},{"svn":3,"category":"","type":""},{"svn":255,"category":"","type":""},{"svn":255,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":11},"tcbm":"04040303FFFF000000000000000000000B00","cert":"-----BEGIN CERTIFICATE-----\nMIIE8jCCBJmgAwIBAgIVAIK77m63vG5A1vcRhx5fHPY75FnQMAoGCCqGSM49BAMC\nMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgUGxhdGZvcm0gQ0ExGjAYBgNVBAoM\nEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UE\nCAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTIyMTIxNjEwMTk0OVoXDTI5MTIxNjEwMTk0\nOVowcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZpY2F0ZTEaMBgGA1UE\nCgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYD\nVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATq\nR+sFzV6WAsyc8Ka4rul7Hz7l16ToABtGYRzZd5h22Y1eljsI0Vt6GnITfHuiXyS6\nHXsyRZqE4u8nRRTsFKU3o4IDDjCCAwowHwYDVR0jBBgwFoAUlW9dzb0b4elAScnU\n9DPOAVcL3lQwawYDVR0fBGQwYjBgoF6gXIZaaHR0cHM6Ly9hcGkudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlvbi92My9wY2tjcmw/Y2E9\ncGxhdGZvcm0mZW5jb2Rpbmc9ZGVyMB0GA1UdDgQWBBR20OYrtxnHDel8lcKFwmhx\n/UEckzAOBgNVHQ8BAf8EBAMCBsAwDAYDVR0TAQH/BAIwADCCAjsGCSqGSIb4TQEN\nAQSCAiwwggIoMB4GCiqGSIb4TQENAQEEEPBi9+kxf7O+L8OZgujiZOswggFlBgoq\nhkiG+E0BDQECMIIBVTAQBgsqhkiG+E0BDQECAQIBBDAQBgsqhkiG+E0BDQECAgIB\nBDAQBgsqhkiG+E0BDQECAwIBAzAQBgsqhkiG+E0BDQECBAIBAzARBgsqhkiG+E0B\nDQECBQICAP8wEQYLKoZIhvhNAQ0BAgYCAgD/MBAGCyqGSIb4TQENAQIHAgEAMBAG\nCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIK\nAgEAMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4\nTQENAQINAgEAMBAGCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAG\nCyqGSIb4TQENAQIQAgEAMBAGCyqGSIb4TQENAQIRAgELMB8GCyqGSIb4TQENAQIS\nBBAEBAMD//8AAAAAAAAAAAAAMBAGCiqGSIb4TQENAQMEAgAAMBQGCiqGSIb4TQEN\nAQQEBgBgagAAADAPBgoqhkiG+E0BDQEFCgEBMB4GCiqGSIb4TQENAQYEEIEDHYFl\nSvQX3oyiTA8B0/MwRAYKKoZIhvhNAQ0BBzA2MBAGCyqGSIb4TQENAQcBAQH/MBAG\nCyqGSIb4TQENAQcCAQH/MBAGCyqGSIb4TQENAQcDAQH/MAoGCCqGSM49BAMCA0cA\nMEQCIA6R9ZOhoLbanU/mPY1hKn3Mk4Wxo0GXb7sEtLzNYWSMAiBnbSyR4iL3qEQt\nGkDTeneBR0bJi4lCLTwIwxg6tuWjdQ==\n-----END CERTIFICATE-----"},{"tcb":{"sgxtcbcomponents":[{"svn":4,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":3,"category":"","type":""},{"svn":3,"category":"","type":""},{"svn":255,"category":"","type":""},{"svn":255,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":10},"tcbm":"04040303FFFF000000000000000000000A00","cert":"-----BEGIN CERTIFICATE-----\nMIIE8jCCBJigAwIBAgIUNuriF8a39o/T6gC9+h2Iau4jBggwCgYIKoZIzj0EAwIw\ncDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBQbGF0Zm9ybSBDQTEaMBgGA1UECgwR\nSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYDVQQI\nDAJDQTELMAkGA1UEBhMCVVMwHhcNMjIxMjE2MTAxOTQ5WhcNMjkxMjE2MTAxOTQ5\nWjBwMSIwIAYDVQQDDBlJbnRlbCBTR1ggUENLIENlcnRpZmljYXRlMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABDRJ\nKTbM7R3mgI0dOi7vFT95M0SodNHZoGgZkC2W94ghJ2SrZA5oDL1NC4setA0G7H+Z\ncSdA0pxW9nTE11uuJTejggMOMIIDCjAfBgNVHSMEGDAWgBSVb13NvRvh6UBJydT0\nM84BVwveVDBrBgNVHR8EZDBiMGCgXqBchlpodHRwczovL2FwaS50cnVzdGVkc2Vy\ndmljZXMuaW50ZWwuY29tL3NneC9jZXJ0aWZpY2F0aW9uL3YzL3Bja2NybD9jYT1w\nbGF0Zm9ybSZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFIiizcCQwDCQ7FowLsQL31l5\nllzKMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIICOwYJKoZIhvhNAQ0B\nBIICLDCCAigwHgYKKoZIhvhNAQ0BAQQQ8GL36TF/s74vw5mC6OJk6zCCAWUGCiqG\nSIb4TQENAQIwggFVMBAGCyqGSIb4TQENAQIBAgEEMBAGCyqGSIb4TQENAQICAgEE\nMBAGCyqGSIb4TQENAQIDAgEDMBAGCyqGSIb4TQENAQIEAgEDMBEGCyqGSIb4TQEN\nAQIFAgIA/zARBgsqhkiG+E0BDQECBgICAP8wEAYLKoZIhvhNAQ0BAgcCAQAwEAYL\nKoZIhvhNAQ0BAggCAQAwEAYLKoZIhvhNAQ0BAgkCAQAwEAYLKoZIhvhNAQ0BAgoC\nAQAwEAYLKoZIhvhNAQ0BAgsCAQAwEAYLKoZIhvhNAQ0BAgwCAQAwEAYLKoZIhvhN\nAQ0BAg0CAQAwEAYLKoZIhvhNAQ0BAg4CAQAwEAYLKoZIhvhNAQ0BAg8CAQAwEAYL\nKoZIhvhNAQ0BAhACAQAwEAYLKoZIhvhNAQ0BAhECAQowHwYLKoZIhvhNAQ0BAhIE\nEAQEAwP//wAAAAAAAAAAAAAwEAYKKoZIhvhNAQ0BAwQCAAAwFAYKKoZIhvhNAQ0B\nBAQGAGBqAAAAMA8GCiqGSIb4TQENAQUKAQEwHgYKKoZIhvhNAQ0BBgQQgQMdgWVK\n9BfejKJMDwHT8zBEBgoqhkiG+E0BDQEHMDYwEAYLKoZIhvhNAQ0BBwEBAf8wEAYL\nKoZIhvhNAQ0BBwIBAf8wEAYLKoZIhvhNAQ0BBwMBAf8wCgYIKoZIzj0EAwIDSAAw\nRQIgEMmbO/ObA8Z3HG9/7JOTNclzBnIxpkb3T6uXLsFIUZUCIQCjUEn7C6yyBcJv\nLZ8Qgu9rueJdNnoULEqWOTO8Vueysw==\n-----END CERTIFICATE-----"},{"tcb":{"sgxtcbcomponents":[{"svn":4,"category":"","type":""},{"svn":4,"category":"","type":""},{"svn":3,"category":"","type":""},{"svn":3,"category":"","type":""},{"svn":255,"category":"","type":""},{"svn":255,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""},{"svn":0,"category":"","type":""}],"pcesvn":5},"tcbm":"04040303FFFF000000000000000000000500","cert":"-----BEGIN CERTIFICATE-----\nMIIE8zCCBJigAwIBAgIUVwEaxqrja3cSZtuO+G8zDoq4XvUwCgYIKoZIzj0EAwIw\ncDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBQbGF0Zm9ybSBDQTEaMBgGA1UECgwR\nSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQswCQYDVQQI\nDAJDQTELMAkGA1UEBhMCVVMwHhcNMjIxMjE2MTAxOTQ5WhcNMjkxMjE2MTAxOTQ5\nWjBwMSIwIAYDVQQDDBlJbnRlbCBTR1ggUENLIENlcnRpZmljYXRlMRowGAYDVQQK\nDBFJbnRlbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNV\nBAgMAkNBMQswCQYDVQQGEwJVUzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABIyI\nEgvb3OLieDs+pm4iXkWeltpYHaYVMR9xjS01oCv+YqU2eGDQhQGAgva1xFxhDauX\n9GNgWO9gun4wc/4jcpOjggMOMIIDCjAfBgNVHSMEGDAWgBSVb13NvRvh6UBJydT0\nM84BVwveVDBrBgNVHR8EZDBiMGCgXqBchlpodHRwczovL2FwaS50cnVzdGVkc2Vy\ndmljZXMuaW50ZWwuY29tL3NneC9jZXJ0aWZpY2F0aW9uL3YzL3Bja2NybD9jYT1w\nbGF0Zm9ybSZlbmNvZGluZz1kZXIwHQYDVR0OBBYEFB2oRAYRObTElJYfh0SXGc+6\ne0cSMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMIICOwYJKoZIhvhNAQ0B\nBIICLDCCAigwHgYKKoZIhvhNAQ0BAQQQ8GL36TF/s74vw5mC6OJk6zCCAWUGCiqG\nSIb4TQENAQIwggFVMBAGCyqGSIb4TQENAQIBAgEEMBAGCyqGSIb4TQENAQICAgEE\nMBAGCyqGSIb4TQENAQIDAgEDMBAGCyqGSIb4TQENAQIEAgEDMBEGCyqGSIb4TQEN\nAQIFAgIA/zARBgsqhkiG+E0BDQECBgICAP8wEAYLKoZIhvhNAQ0BAgcCAQAwEAYL\nKoZIhvhNAQ0BAggCAQAwEAYLKoZIhvhNAQ0BAgkCAQAwEAYLKoZIhvhNAQ0BAgoC\nAQAwEAYLKoZIhvhNAQ0BAgsCAQAwEAYLKoZIhvhNAQ0BAgwCAQAwEAYLKoZIhvhN\nAQ0BAg0CAQAwEAYLKoZIhvhNAQ0BAg4CAQAwEAYLKoZIhvhNAQ0BAg8CAQAwEAYL\nKoZIhvhNAQ0BAhACAQAwEAYLKoZIhvhNAQ0BAhECAQUwHwYLKoZIhvhNAQ0BAhIE\nEAQEAwP//wAAAAAAAAAAAAAwEAYKKoZIhvhNAQ0BAwQCAAAwFAYKKoZIhvhNAQ0B\nBAQGAGBqAAAAMA8GCiqGSIb4TQENAQUKAQEwHgYKKoZIhvhNAQ0BBgQQgQMdgWVK\n9BfejKJMDwHT8zBEBgoqhkiG+E0BDQEHMDYwEAYLKoZIhvhNAQ0BBwEBAf8wEAYL\nKoZIhvhNAQ0BBwIBAf8wEAYLKoZIhvhNAQ0BBwMBAf8wCgYIKoZIzj0EAwIDSQAw\nRgIhAP8ZiHsHb56L5gGKzCquGv9m/4vuUnbF7u75/9wCzKaDAiEArXh6i5GSBZPE\n0pdIJU8qz2k+nh5sCorovoJUO83+1HA=\n-----END CERTIFICATE-----"}],"ca_chain":["-----BEGIN CERTIFICATE-----\nMIICljCCAj2gAwIBAgIVAJVvXc29G+HpQEnJ1PQzzgFXC95UMAoGCCqGSM49BAMC\nMGgxGjAYBgNVBAMMEUludGVsIFNHWCBSb290IENBMRowGAYDVQQKDBFJbnRlbCBD\nb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNVBAgMAkNBMQsw\nCQYDVQQGEwJVUzAeFw0xODA1MjExMDUwMTBaFw0zMzA1MjExMDUwMTBaMHAxIjAg\nBgNVBAMMGUludGVsIFNHWCBQQ0sgUGxhdGZvcm0gQ0ExGjAYBgNVBAoMEUludGVs\nIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0Ex\nCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAENSB/7t21lXSO\n2Cuzpxw74eJB72EyDGgW5rXCtx2tVTLq6hKk6z+UiRZCnqR7psOvgqFeSxlmTlJl\neTmi2WYz3qOBuzCBuDAfBgNVHSMEGDAWgBQiZQzWWp00ifODtJVSv1AbOScGrDBS\nBgNVHR8ESzBJMEegRaBDhkFodHRwczovL2NlcnRpZmljYXRlcy50cnVzdGVkc2Vy\ndmljZXMuaW50ZWwuY29tL0ludGVsU0dYUm9vdENBLmRlcjAdBgNVHQ4EFgQUlW9d\nzb0b4elAScnU9DPOAVcL3lQwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYB\nAf8CAQAwCgYIKoZIzj0EAwIDRwAwRAIgXsVki0w+i6VYGW3UF/22uaXe0YJDj1Ue\nnA+TjD1ai5cCICYb1SAmD5xkfTVpvo4UoyiSYxrDWLmUR4CI9NKyfPN+\n-----END CERTIFICATE-----\n","-----BEGIN CERTIFICATE-----\nMIICjzCCAjSgAwIBAgIUImUM1lqdNInzg7SVUr9QGzknBqwwCgYIKoZIzj0EAwIw\naDEaMBgGA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENv\ncnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJ\nBgNVBAYTAlVTMB4XDTE4MDUyMTEwNDUxMFoXDTQ5MTIzMTIzNTk1OVowaDEaMBgG\nA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENvcnBvcmF0\naW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJBgNVBAYT\nAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEC6nEwMDIYZOj/iPWsCzaEKi7\n1OiOSLRFhWGjbnBVJfVnkY4u3IjkDYYL0MxO4mqsyYjlBalTVYxFP2sJBK5zlKOB\nuzCBuDAfBgNVHSMEGDAWgBQiZQzWWp00ifODtJVSv1AbOScGrDBSBgNVHR8ESzBJ\nMEegRaBDhkFodHRwczovL2NlcnRpZmljYXRlcy50cnVzdGVkc2VydmljZXMuaW50\nZWwuY29tL0ludGVsU0dYUm9vdENBLmRlcjAdBgNVHQ4EFgQUImUM1lqdNInzg7SV\nUr9QGzknBqwwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwCgYI\nKoZIzj0EAwIDSQAwRgIhAOW/5QkR+S9CiSDcNoowLuPRLsWGf/Yi7GSX94BgwTwg\nAiEA4J0lrHoMs+Xo5o/sX6O9QWxHRAvZUGOdRQ7cvqRXaqI=\n-----END CERTIFICATE-----\n"]} \ No newline at end of file diff --git a/intel-sgx/pcs/tests/data/00906ea10000.tcb b/intel-sgx/pcs/tests/data/00906ea10000.tcb new file mode 100644 index 00000000..4c88f8a5 --- /dev/null +++ b/intel-sgx/pcs/tests/data/00906ea10000.tcb @@ -0,0 +1 @@ +{"raw_tcb_info":"{\"version\":2,\"issueDate\":\"2020-05-18T17:49:24Z\",\"nextUpdate\":\"2020-06-17T17:49:24Z\",\"fmspc\":\"00906ea10000\",\"pceId\":\"0000\",\"tcbType\":0,\"tcbEvaluationDataNumber\":8,\"tcbLevels\":[{\"tcb\":{\"sgxtcbcomp01svn\":14,\"sgxtcbcomp02svn\":14,\"sgxtcbcomp03svn\":2,\"sgxtcbcomp04svn\":4,\"sgxtcbcomp05svn\":1,\"sgxtcbcomp06svn\":128,\"sgxtcbcomp07svn\":7,\"sgxtcbcomp08svn\":0,\"sgxtcbcomp09svn\":0,\"sgxtcbcomp10svn\":0,\"sgxtcbcomp11svn\":0,\"sgxtcbcomp12svn\":0,\"sgxtcbcomp13svn\":0,\"sgxtcbcomp14svn\":0,\"sgxtcbcomp15svn\":0,\"sgxtcbcomp16svn\":0,\"pcesvn\":10},\"tcbDate\":\"2019-12-11T00:00:00Z\",\"tcbStatus\":\"SWHardeningNeeded\"},{\"tcb\":{\"sgxtcbcomp01svn\":14,\"sgxtcbcomp02svn\":14,\"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\":10},\"tcbDate\":\"2019-12-11T00:00:00Z\",\"tcbStatus\":\"ConfigurationAndSWHardeningNeeded\"},{\"tcb\":{\"sgxtcbcomp01svn\":13,\"sgxtcbcomp02svn\":13,\"sgxtcbcomp03svn\":2,\"sgxtcbcomp04svn\":4,\"sgxtcbcomp05svn\":1,\"sgxtcbcomp06svn\":128,\"sgxtcbcomp07svn\":3,\"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\":\"OutOfDate\"},{\"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\":\"OutOfDateConfigurationNeeded\"},{\"tcb\":{\"sgxtcbcomp01svn\":6,\"sgxtcbcomp02svn\":6,\"sgxtcbcomp03svn\":2,\"sgxtcbcomp04svn\":4,\"sgxtcbcomp05svn\":1,\"sgxtcbcomp06svn\":128,\"sgxtcbcomp07svn\":1,\"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\"},{\"tcb\":{\"sgxtcbcomp01svn\":6,\"sgxtcbcomp02svn\":6,\"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\":\"OutOfDateConfigurationNeeded\"},{\"tcb\":{\"sgxtcbcomp01svn\":5,\"sgxtcbcomp02svn\":5,\"sgxtcbcomp03svn\":2,\"sgxtcbcomp04svn\":4,\"sgxtcbcomp05svn\":1,\"sgxtcbcomp06svn\":128,\"sgxtcbcomp07svn\":1,\"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\"},{\"tcb\":{\"sgxtcbcomp01svn\":5,\"sgxtcbcomp02svn\":5,\"sgxtcbcomp03svn\":2,\"sgxtcbcomp04svn\":4,\"sgxtcbcomp05svn\":1,\"sgxtcbcomp06svn\":128,\"sgxtcbcomp07svn\":1,\"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\"},{\"tcb\":{\"sgxtcbcomp01svn\":5,\"sgxtcbcomp02svn\":5,\"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\":\"OutOfDateConfigurationNeeded\"},{\"tcb\":{\"sgxtcbcomp01svn\":5,\"sgxtcbcomp02svn\":5,\"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\":\"OutOfDateConfigurationNeeded\"},{\"tcb\":{\"sgxtcbcomp01svn\":4,\"sgxtcbcomp02svn\":4,\"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\":5},\"tcbDate\":\"2018-01-04T00:00:00Z\",\"tcbStatus\":\"OutOfDate\"},{\"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\":4},\"tcbDate\":\"2017-07-26T00:00:00Z\",\"tcbStatus\":\"OutOfDate\"}]}","signature":[48,69,2,33,0,172,168,208,215,243,32,86,10,195,254,74,242,169,16,97,70,255,8,70,37,189,4,70,3,211,38,103,235,83,204,231,44,2,32,16,113,214,85,38,246,49,101,14,213,58,226,57,16,129,126,52,75,11,204,184,21,151,52,159,26,82,65,61,252,239,35],"ca_chain":["-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIUfjiC1ftVKUpASY5FhAPpFJG99FUwCgYIKoZIzj0EAwIw\naDEaMBgGA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENv\ncnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJ\nBgNVBAYTAlVTMB4XDTE4MDUyMTEwNDc1MVoXDTMzMDUyMTEwNDc1MVowbDEeMBwG\nA1UEAwwVSW50ZWwgU0dYIFRDQiBTaWduaW5nMRowGAYDVQQKDBFJbnRlbCBDb3Jw\nb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNVBAgMAkNBMQswCQYD\nVQQGEwJVUzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABENFG8xzydWRfK92bmGv\nP+mAh91PEyV7Jh6FGJd5ndE9aBH7R3E4A7ubrlh/zN3C4xvpoouGlirMba+W2lju\nypajgbUwgbIwHwYDVR0jBBgwFoAUImUM1lqdNInzg7SVUr9QGzknBqwwUgYDVR0f\nBEswSTBHoEWgQ4ZBaHR0cHM6Ly9jZXJ0aWZpY2F0ZXMudHJ1c3RlZHNlcnZpY2Vz\nLmludGVsLmNvbS9JbnRlbFNHWFJvb3RDQS5jcmwwHQYDVR0OBBYEFH44gtX7VSlK\nQEmORYQD6RSRvfRVMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMAoGCCqG\nSM49BAMCA0gAMEUCIBZZKhCZkaY8Db3MNDbrJdB6l1R9nrgUZicB9k3gQrChAiEA\nkUsVfIqjzK0lVWu8U5+8rL1xG57CJ7aPxTgl0kfFWuw=\n-----END CERTIFICATE-----\n","-----BEGIN CERTIFICATE-----\nMIICjjCCAjSgAwIBAgIUImUM1lqdNInzg7SVUr9QGzknBqwwCgYIKoZIzj0EAwIw\naDEaMBgGA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENv\ncnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJ\nBgNVBAYTAlVTMB4XDTE4MDUyMTEwNDExMVoXDTMzMDUyMTEwNDExMFowaDEaMBgG\nA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENvcnBvcmF0\naW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJBgNVBAYT\nAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEC6nEwMDIYZOj/iPWsCzaEKi7\n1OiOSLRFhWGjbnBVJfVnkY4u3IjkDYYL0MxO4mqsyYjlBalTVYxFP2sJBK5zlKOB\nuzCBuDAfBgNVHSMEGDAWgBQiZQzWWp00ifODtJVSv1AbOScGrDBSBgNVHR8ESzBJ\nMEegRaBDhkFodHRwczovL2NlcnRpZmljYXRlcy50cnVzdGVkc2VydmljZXMuaW50\nZWwuY29tL0ludGVsU0dYUm9vdENBLmNybDAdBgNVHQ4EFgQUImUM1lqdNInzg7SV\nUr9QGzknBqwwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwCgYI\nKoZIzj0EAwIDSAAwRQIgQQs/08rycdPauCFk8UPQXCMAlsloBe7NwaQGTcdpa0EC\nIQCUt8SGvxKmjpcM/z0WP9Dvo8h2k5du1iWDdBkAn+0iiA==\n-----END CERTIFICATE-----\n"]} \ No newline at end of file diff --git a/intel-sgx/pcs/tests/data/16a5b41ebb076d263a1e39e64e7175e7.certs b/intel-sgx/pcs/tests/data/16a5b41ebb076d263a1e39e64e7175e7.certs new file mode 100644 index 00000000..f2c54a0e --- /dev/null +++ b/intel-sgx/pcs/tests/data/16a5b41ebb076d263a1e39e64e7175e7.certs @@ -0,0 +1 @@ +{"pck_data":[{"tcb":{"sgxtcbcomp01svn":14,"sgxtcbcomp02svn":14,"sgxtcbcomp03svn":2,"sgxtcbcomp04svn":4,"sgxtcbcomp05svn":1,"sgxtcbcomp06svn":128,"sgxtcbcomp07svn":7,"sgxtcbcomp08svn":0,"sgxtcbcomp09svn":0,"sgxtcbcomp10svn":0,"sgxtcbcomp11svn":0,"sgxtcbcomp12svn":0,"sgxtcbcomp13svn":0,"sgxtcbcomp14svn":0,"sgxtcbcomp15svn":0,"sgxtcbcomp16svn":0,"pcesvn":10},"tcbm":"0E0E02040180070000000000000000000A00","cert":"-----BEGIN CERTIFICATE-----\nMIIEgTCCBCagAwIBAgIUaA6/OlxWura+UThAcuAuQ99oS2gwCgYIKoZIzj0EAwIwcTEjMCEGA1UE\nAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoMEUludGVsIENvcnBvcmF0aW9u\nMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTIwMDUx\nODE0MDgxMloXDTI3MDUxODE0MDgxMlowcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZp\nY2F0ZTEaMBgGA1UECgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQsw\nCQYDVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR5YgwAQkLk\nCL/umv1RT0MyBc+6a353iz8IeASaLIJrx/DHblhrCckmN6P13Cyan1xEHeEn2EefqTQSmWc4gkwp\no4ICmzCCApcwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8exRl0NXyWU0wXwYDVR0fBFgwVjBUoFKg\nUIZOaHR0cHM6Ly9hcGkudHJ1c3RlZHNlcnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlv\nbi92Mi9wY2tjcmw/Y2E9cHJvY2Vzc29yMB0GA1UdDgQWBBTR9G+ZsH6I3IY7Na3DRzJe6pzsITAO\nBgNVHQ8BAf8EBAMCBsAwDAYDVR0TAQH/BAIwADCCAdQGCSqGSIb4TQENAQSCAcUwggHBMB4GCiqG\nSIb4TQENAQEEEIol+EwB7iYjnRkL4ukQEpAwggFkBgoqhkiG+E0BDQECMIIBVDAQBgsqhkiG+E0B\nDQECAQIBDjAQBgsqhkiG+E0BDQECAgIBDjAQBgsqhkiG+E0BDQECAwIBAjAQBgsqhkiG+E0BDQEC\nBAIBBDAQBgsqhkiG+E0BDQECBQIBATARBgsqhkiG+E0BDQECBgICAIAwEAYLKoZIhvhNAQ0BAgcC\nAQcwEAYLKoZIhvhNAQ0BAggCAQAwEAYLKoZIhvhNAQ0BAgkCAQAwEAYLKoZIhvhNAQ0BAgoCAQAw\nEAYLKoZIhvhNAQ0BAgsCAQAwEAYLKoZIhvhNAQ0BAgwCAQAwEAYLKoZIhvhNAQ0BAg0CAQAwEAYL\nKoZIhvhNAQ0BAg4CAQAwEAYLKoZIhvhNAQ0BAg8CAQAwEAYLKoZIhvhNAQ0BAhACAQAwEAYLKoZI\nhvhNAQ0BAhECAQowHwYLKoZIhvhNAQ0BAhIEEA4OAgQBgAcAAAAAAAAAAAAwEAYKKoZIhvhNAQ0B\nAwQCAAAwFAYKKoZIhvhNAQ0BBAQGAJBuoQAAMA8GCiqGSIb4TQENAQUKAQAwCgYIKoZIzj0EAwID\nSQAwRgIhAM9EGXqO61Bpb9oTZocx9JO4dCOyEL/OexnHVnA2O6KlAiEA4enC0pbre0mWfytUsZxm\nPnmltJpniXuAhVo0llJyw5A=\n-----END CERTIFICATE-----"},{"tcb":{"sgxtcbcomp01svn":14,"sgxtcbcomp02svn":14,"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":10},"tcbm":"0E0E02040180000000000000000000000A00","cert":"-----BEGIN CERTIFICATE-----\nMIIEfzCCBCagAwIBAgIUFEg/XACiFiY7o4Pe/DRhTBzy/FMwCgYIKoZIzj0EAwIwcTEjMCEGA1UE\nAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoMEUludGVsIENvcnBvcmF0aW9u\nMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTIwMDUx\nODE0MDgxMloXDTI3MDUxODE0MDgxMlowcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZp\nY2F0ZTEaMBgGA1UECgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQsw\nCQYDVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQEMWwbalWt\nJf7ttIUuZiQuTBJXm/RMttOBXWdYWJ+S8wdKzRwf9DPkXbWbB4V01uP54B2L0pL4lEyV1+3BBUt7\no4ICmzCCApcwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8exRl0NXyWU0wXwYDVR0fBFgwVjBUoFKg\nUIZOaHR0cHM6Ly9hcGkudHJ1c3RlZHNlcnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlv\nbi92Mi9wY2tjcmw/Y2E9cHJvY2Vzc29yMB0GA1UdDgQWBBQ7cqBkLMIILYuobGRGeHPm7Snt4jAO\nBgNVHQ8BAf8EBAMCBsAwDAYDVR0TAQH/BAIwADCCAdQGCSqGSIb4TQENAQSCAcUwggHBMB4GCiqG\nSIb4TQENAQEEEIol+EwB7iYjnRkL4ukQEpAwggFkBgoqhkiG+E0BDQECMIIBVDAQBgsqhkiG+E0B\nDQECAQIBDjAQBgsqhkiG+E0BDQECAgIBDjAQBgsqhkiG+E0BDQECAwIBAjAQBgsqhkiG+E0BDQEC\nBAIBBDAQBgsqhkiG+E0BDQECBQIBATARBgsqhkiG+E0BDQECBgICAIAwEAYLKoZIhvhNAQ0BAgcC\nAQAwEAYLKoZIhvhNAQ0BAggCAQAwEAYLKoZIhvhNAQ0BAgkCAQAwEAYLKoZIhvhNAQ0BAgoCAQAw\nEAYLKoZIhvhNAQ0BAgsCAQAwEAYLKoZIhvhNAQ0BAgwCAQAwEAYLKoZIhvhNAQ0BAg0CAQAwEAYL\nKoZIhvhNAQ0BAg4CAQAwEAYLKoZIhvhNAQ0BAg8CAQAwEAYLKoZIhvhNAQ0BAhACAQAwEAYLKoZI\nhvhNAQ0BAhECAQowHwYLKoZIhvhNAQ0BAhIEEA4OAgQBgAAAAAAAAAAAAAAwEAYKKoZIhvhNAQ0B\nAwQCAAAwFAYKKoZIhvhNAQ0BBAQGAJBuoQAAMA8GCiqGSIb4TQENAQUKAQAwCgYIKoZIzj0EAwID\nRwAwRAIgEqkqk/QWbpxmqLf7xhqSKz1WIw+EII1QMFfnmfe4NGoCIHA38VMcjfvUEUcynxRe0R5r\nNSZd8bXDLvoAgqN1Mpv3\n-----END CERTIFICATE-----"},{"tcb":{"sgxtcbcomp01svn":13,"sgxtcbcomp02svn":13,"sgxtcbcomp03svn":2,"sgxtcbcomp04svn":4,"sgxtcbcomp05svn":1,"sgxtcbcomp06svn":128,"sgxtcbcomp07svn":3,"sgxtcbcomp08svn":0,"sgxtcbcomp09svn":0,"sgxtcbcomp10svn":0,"sgxtcbcomp11svn":0,"sgxtcbcomp12svn":0,"sgxtcbcomp13svn":0,"sgxtcbcomp14svn":0,"sgxtcbcomp15svn":0,"sgxtcbcomp16svn":0,"pcesvn":9},"tcbm":"0D0D02040180030000000000000000000900","cert":"-----BEGIN CERTIFICATE-----\nMIIEgTCCBCagAwIBAgIUAISq+XrTHIjD8SJmFtsVX7yXZfcwCgYIKoZIzj0EAwIwcTEjMCEGA1UE\nAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoMEUludGVsIENvcnBvcmF0aW9u\nMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTIwMDUx\nODE0MDgxMloXDTI3MDUxODE0MDgxMlowcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZp\nY2F0ZTEaMBgGA1UECgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQsw\nCQYDVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATR/AdaOnn0\nhItQjKtL3yPtzrcvT2BFh3d67ThV34Yy/Hx+DMrryhJd6AuRk1abZPD1mP500fLy2/hEpZEI0zdI\no4ICmzCCApcwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8exRl0NXyWU0wXwYDVR0fBFgwVjBUoFKg\nUIZOaHR0cHM6Ly9hcGkudHJ1c3RlZHNlcnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlv\nbi92Mi9wY2tjcmw/Y2E9cHJvY2Vzc29yMB0GA1UdDgQWBBRa2UZW3pBgOqRVSKMxHd7gdKLWyDAO\nBgNVHQ8BAf8EBAMCBsAwDAYDVR0TAQH/BAIwADCCAdQGCSqGSIb4TQENAQSCAcUwggHBMB4GCiqG\nSIb4TQENAQEEEIol+EwB7iYjnRkL4ukQEpAwggFkBgoqhkiG+E0BDQECMIIBVDAQBgsqhkiG+E0B\nDQECAQIBDTAQBgsqhkiG+E0BDQECAgIBDTAQBgsqhkiG+E0BDQECAwIBAjAQBgsqhkiG+E0BDQEC\nBAIBBDAQBgsqhkiG+E0BDQECBQIBATARBgsqhkiG+E0BDQECBgICAIAwEAYLKoZIhvhNAQ0BAgcC\nAQMwEAYLKoZIhvhNAQ0BAggCAQAwEAYLKoZIhvhNAQ0BAgkCAQAwEAYLKoZIhvhNAQ0BAgoCAQAw\nEAYLKoZIhvhNAQ0BAgsCAQAwEAYLKoZIhvhNAQ0BAgwCAQAwEAYLKoZIhvhNAQ0BAg0CAQAwEAYL\nKoZIhvhNAQ0BAg4CAQAwEAYLKoZIhvhNAQ0BAg8CAQAwEAYLKoZIhvhNAQ0BAhACAQAwEAYLKoZI\nhvhNAQ0BAhECAQkwHwYLKoZIhvhNAQ0BAhIEEA0NAgQBgAMAAAAAAAAAAAAwEAYKKoZIhvhNAQ0B\nAwQCAAAwFAYKKoZIhvhNAQ0BBAQGAJBuoQAAMA8GCiqGSIb4TQENAQUKAQAwCgYIKoZIzj0EAwID\nSQAwRgIhALtRo8qx76fZCaL2S6EfT0riUXEh/Wb9zSJqJR4dgaErAiEA2OuCZws/MQhcN2fjDMtT\nuaabIkI9fE/i2CQXe7aV4Yk=\n-----END CERTIFICATE-----"},{"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},"tcbm":"0D0D02040180000000000000000000000900","cert":"-----BEGIN CERTIFICATE-----\nMIIEfzCCBCagAwIBAgIUbM7SX/lKO+HIt1TUsMBYJadH7CwwCgYIKoZIzj0EAwIwcTEjMCEGA1UE\nAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoMEUludGVsIENvcnBvcmF0aW9u\nMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTIwMDUx\nODE0MDgxMloXDTI3MDUxODE0MDgxMlowcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZp\nY2F0ZTEaMBgGA1UECgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQsw\nCQYDVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARVCE0MNpON\nh06OxeMhIYMZswkFzTbw8IKUP3DBOkRo5EWC3GTgbKlhW9rpUjgzKEYtq9LCQYACY8Np1glF7MIV\no4ICmzCCApcwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8exRl0NXyWU0wXwYDVR0fBFgwVjBUoFKg\nUIZOaHR0cHM6Ly9hcGkudHJ1c3RlZHNlcnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlv\nbi92Mi9wY2tjcmw/Y2E9cHJvY2Vzc29yMB0GA1UdDgQWBBTGy92d4esrkJYfLoRxX5F7g5Z6MzAO\nBgNVHQ8BAf8EBAMCBsAwDAYDVR0TAQH/BAIwADCCAdQGCSqGSIb4TQENAQSCAcUwggHBMB4GCiqG\nSIb4TQENAQEEEIol+EwB7iYjnRkL4ukQEpAwggFkBgoqhkiG+E0BDQECMIIBVDAQBgsqhkiG+E0B\nDQECAQIBDTAQBgsqhkiG+E0BDQECAgIBDTAQBgsqhkiG+E0BDQECAwIBAjAQBgsqhkiG+E0BDQEC\nBAIBBDAQBgsqhkiG+E0BDQECBQIBATARBgsqhkiG+E0BDQECBgICAIAwEAYLKoZIhvhNAQ0BAgcC\nAQAwEAYLKoZIhvhNAQ0BAggCAQAwEAYLKoZIhvhNAQ0BAgkCAQAwEAYLKoZIhvhNAQ0BAgoCAQAw\nEAYLKoZIhvhNAQ0BAgsCAQAwEAYLKoZIhvhNAQ0BAgwCAQAwEAYLKoZIhvhNAQ0BAg0CAQAwEAYL\nKoZIhvhNAQ0BAg4CAQAwEAYLKoZIhvhNAQ0BAg8CAQAwEAYLKoZIhvhNAQ0BAhACAQAwEAYLKoZI\nhvhNAQ0BAhECAQkwHwYLKoZIhvhNAQ0BAhIEEA0NAgQBgAAAAAAAAAAAAAAwEAYKKoZIhvhNAQ0B\nAwQCAAAwFAYKKoZIhvhNAQ0BBAQGAJBuoQAAMA8GCiqGSIb4TQENAQUKAQAwCgYIKoZIzj0EAwID\nRwAwRAIgbBKPNSAvX0B06zdpsWJrck1/gCuyBLcPzus549x2Zy0CIENGmw3dQmYLYskgx74Ejp2J\n5lYj/GphzhzrUP0zECga\n-----END CERTIFICATE-----"},{"tcb":{"sgxtcbcomp01svn":6,"sgxtcbcomp02svn":6,"sgxtcbcomp03svn":2,"sgxtcbcomp04svn":4,"sgxtcbcomp05svn":1,"sgxtcbcomp06svn":128,"sgxtcbcomp07svn":1,"sgxtcbcomp08svn":0,"sgxtcbcomp09svn":0,"sgxtcbcomp10svn":0,"sgxtcbcomp11svn":0,"sgxtcbcomp12svn":0,"sgxtcbcomp13svn":0,"sgxtcbcomp14svn":0,"sgxtcbcomp15svn":0,"sgxtcbcomp16svn":0,"pcesvn":7},"tcbm":"060602040180010000000000000000000700","cert":"-----BEGIN CERTIFICATE-----\nMIIEgTCCBCegAwIBAgIVAOrAVvYS5WpzAQvbdDs6RWPcKeCXMAoGCCqGSM49BAMCMHExIzAhBgNV\nBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQKDBFJbnRlbCBDb3Jwb3JhdGlv\nbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNVBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yMDA1\nMTgxNDA4MTJaFw0yNzA1MTgxNDA4MTJaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlm\naWNhdGUxGjAYBgNVBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTEL\nMAkGA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEOOhPgl2o\nGn++1eMTKO/MwQ9oXDV7z5i2Tk3XTGk3dY97BW4KWS5MmuFw/SNzx5BEWTHkGiebO5k/AEgZxb78\ntKOCApswggKXMB8GA1UdIwQYMBaAFNDoqtp11/kuSReYPHsUZdDV8llNMF8GA1UdHwRYMFYwVKBS\noFCGTmh0dHBzOi8vYXBpLnRydXN0ZWRzZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRp\nb24vdjIvcGNrY3JsP2NhPXByb2Nlc3NvcjAdBgNVHQ4EFgQUhCvqSePHgTOY3smN6wDF4LOF1OAw\nDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0BDQEEggHFMIIBwTAeBgoq\nhkiG+E0BDQEBBBCKJfhMAe4mI50ZC+LpEBKQMIIBZAYKKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhN\nAQ0BAgECAQYwEAYLKoZIhvhNAQ0BAgICAQYwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0B\nAgQCAQQwEAYLKoZIhvhNAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIH\nAgEBMBAGCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIKAgEA\nMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4TQENAQINAgEAMBAG\nCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAGCyqGSIb4TQENAQIQAgEAMBAGCyqG\nSIb4TQENAQIRAgEHMB8GCyqGSIb4TQENAQISBBAGBgIEAYABAAAAAAAAAAAAMBAGCiqGSIb4TQEN\nAQMEAgAAMBQGCiqGSIb4TQENAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMC\nA0gAMEUCIFcOZgfy3dWMUukjghG/CBgFJPF36IqJZH056z2AM4D4AiEAxBMm/KaQRL/FlZJbA2QG\n2D/6xSxWUtXW4N2TCEnZJms=\n-----END CERTIFICATE-----"},{"tcb":{"sgxtcbcomp01svn":6,"sgxtcbcomp02svn":6,"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},"tcbm":"060602040180000000000000000000000700","cert":"-----BEGIN CERTIFICATE-----\nMIIEgDCCBCegAwIBAgIVAKAXnoCsWOuZX2uqV7U2U5jPN+jTMAoGCCqGSM49BAMCMHExIzAhBgNV\nBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQKDBFJbnRlbCBDb3Jwb3JhdGlv\nbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNVBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yMDA1\nMTgxNDA4MTJaFw0yNzA1MTgxNDA4MTJaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlm\naWNhdGUxGjAYBgNVBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTEL\nMAkGA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE1NTfASxQ\nBZuA3X14ChhaLrz/+w+zhi55kUDd7OSqeLQ9K0OcwbQGpYJrPnetUkiEnDakks/8Y6gIhtOLfwrf\nTqOCApswggKXMB8GA1UdIwQYMBaAFNDoqtp11/kuSReYPHsUZdDV8llNMF8GA1UdHwRYMFYwVKBS\noFCGTmh0dHBzOi8vYXBpLnRydXN0ZWRzZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRp\nb24vdjIvcGNrY3JsP2NhPXByb2Nlc3NvcjAdBgNVHQ4EFgQULXyZzz09WkDPAh/+F7jAPWC1rmQw\nDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0BDQEEggHFMIIBwTAeBgoq\nhkiG+E0BDQEBBBCKJfhMAe4mI50ZC+LpEBKQMIIBZAYKKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhN\nAQ0BAgECAQYwEAYLKoZIhvhNAQ0BAgICAQYwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0B\nAgQCAQQwEAYLKoZIhvhNAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIH\nAgEAMBAGCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIKAgEA\nMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4TQENAQINAgEAMBAG\nCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAGCyqGSIb4TQENAQIQAgEAMBAGCyqG\nSIb4TQENAQIRAgEHMB8GCyqGSIb4TQENAQISBBAGBgIEAYAAAAAAAAAAAAAAMBAGCiqGSIb4TQEN\nAQMEAgAAMBQGCiqGSIb4TQENAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMC\nA0cAMEQCIGMMW4jysdX1C/dcdIEkWCkfINySXaYLvgp3ycAdUrslAiA1HP3KjoXfHc3ixf/5QS+b\nVv7CbHSDI63rJashyKi8Vg==\n-----END CERTIFICATE-----"},{"tcb":{"sgxtcbcomp01svn":5,"sgxtcbcomp02svn":5,"sgxtcbcomp03svn":2,"sgxtcbcomp04svn":4,"sgxtcbcomp05svn":1,"sgxtcbcomp06svn":128,"sgxtcbcomp07svn":1,"sgxtcbcomp08svn":0,"sgxtcbcomp09svn":0,"sgxtcbcomp10svn":0,"sgxtcbcomp11svn":0,"sgxtcbcomp12svn":0,"sgxtcbcomp13svn":0,"sgxtcbcomp14svn":0,"sgxtcbcomp15svn":0,"sgxtcbcomp16svn":0,"pcesvn":7},"tcbm":"050502040180010000000000000000000700","cert":"-----BEGIN CERTIFICATE-----\nMIIEgjCCBCegAwIBAgIVAKyf8iOkx9l1pG2msZXSDg+ad75aMAoGCCqGSM49BAMCMHExIzAhBgNV\nBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQKDBFJbnRlbCBDb3Jwb3JhdGlv\nbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNVBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yMDA1\nMTgxNDA4MTJaFw0yNzA1MTgxNDA4MTJaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlm\naWNhdGUxGjAYBgNVBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTEL\nMAkGA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE9YDa+UwV\nuIWzZ9uLtJiKHcO88DmOY6iX6bM8wE6+lB6tbzwpXX3qZgknRxEX8mjTi3OqXbUckuGSotIanXeR\nGqOCApswggKXMB8GA1UdIwQYMBaAFNDoqtp11/kuSReYPHsUZdDV8llNMF8GA1UdHwRYMFYwVKBS\noFCGTmh0dHBzOi8vYXBpLnRydXN0ZWRzZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRp\nb24vdjIvcGNrY3JsP2NhPXByb2Nlc3NvcjAdBgNVHQ4EFgQUdkb//05YZPVdwAUBZlOpCvNlLfAw\nDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0BDQEEggHFMIIBwTAeBgoq\nhkiG+E0BDQEBBBCKJfhMAe4mI50ZC+LpEBKQMIIBZAYKKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhN\nAQ0BAgECAQUwEAYLKoZIhvhNAQ0BAgICAQUwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0B\nAgQCAQQwEAYLKoZIhvhNAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIH\nAgEBMBAGCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIKAgEA\nMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4TQENAQINAgEAMBAG\nCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAGCyqGSIb4TQENAQIQAgEAMBAGCyqG\nSIb4TQENAQIRAgEHMB8GCyqGSIb4TQENAQISBBAFBQIEAYABAAAAAAAAAAAAMBAGCiqGSIb4TQEN\nAQMEAgAAMBQGCiqGSIb4TQENAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMC\nA0kAMEYCIQDv4KuUHXFGgQGm/aCeA1w0SvweYjDm7mOTlDucq2+IigIhALyWMyNTyRYtf2cPsWs5\nP9tvV/UZ84GX8alwu7FMvNjG\n-----END CERTIFICATE-----"},{"tcb":{"sgxtcbcomp01svn":5,"sgxtcbcomp02svn":5,"sgxtcbcomp03svn":2,"sgxtcbcomp04svn":4,"sgxtcbcomp05svn":1,"sgxtcbcomp06svn":128,"sgxtcbcomp07svn":1,"sgxtcbcomp08svn":0,"sgxtcbcomp09svn":0,"sgxtcbcomp10svn":0,"sgxtcbcomp11svn":0,"sgxtcbcomp12svn":0,"sgxtcbcomp13svn":0,"sgxtcbcomp14svn":0,"sgxtcbcomp15svn":0,"sgxtcbcomp16svn":0,"pcesvn":6},"tcbm":"050502040180010000000000000000000600","cert":"-----BEGIN CERTIFICATE-----\nMIIEgTCCBCegAwIBAgIVAOIlvuhq58Mxj5+WQxxBthBgDfGwMAoGCCqGSM49BAMCMHExIzAhBgNV\nBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQKDBFJbnRlbCBDb3Jwb3JhdGlv\nbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNVBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yMDA1\nMTgxNDA4MTJaFw0yNzA1MTgxNDA4MTJaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlm\naWNhdGUxGjAYBgNVBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTEL\nMAkGA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEc39I9pqv\n5jyC0NPoP5KPFLcpPadl7Rg+85jmeIC7GQrJcbIsgs9Y1iOXSlzF2KtCk1H3gbV3fr9AWP/x+J8P\nfKOCApswggKXMB8GA1UdIwQYMBaAFNDoqtp11/kuSReYPHsUZdDV8llNMF8GA1UdHwRYMFYwVKBS\noFCGTmh0dHBzOi8vYXBpLnRydXN0ZWRzZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRp\nb24vdjIvcGNrY3JsP2NhPXByb2Nlc3NvcjAdBgNVHQ4EFgQUaeZksTZuai1wuutvYliJXfyUyNQw\nDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0BDQEEggHFMIIBwTAeBgoq\nhkiG+E0BDQEBBBCKJfhMAe4mI50ZC+LpEBKQMIIBZAYKKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhN\nAQ0BAgECAQUwEAYLKoZIhvhNAQ0BAgICAQUwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0B\nAgQCAQQwEAYLKoZIhvhNAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIH\nAgEBMBAGCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIKAgEA\nMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4TQENAQINAgEAMBAG\nCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAGCyqGSIb4TQENAQIQAgEAMBAGCyqG\nSIb4TQENAQIRAgEGMB8GCyqGSIb4TQENAQISBBAFBQIEAYABAAAAAAAAAAAAMBAGCiqGSIb4TQEN\nAQMEAgAAMBQGCiqGSIb4TQENAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMC\nA0gAMEUCIDqT5TQ2hotiK1jbvA7kdJv3pMTB0UAulTsM420lHWWVAiEApmDXm/8hfwzjzK/H6ah2\n6yyZsMNy3nWLZruweDBSipI=\n-----END CERTIFICATE-----"},{"tcb":{"sgxtcbcomp01svn":5,"sgxtcbcomp02svn":5,"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},"tcbm":"050502040180000000000000000000000700","cert":"-----BEGIN CERTIFICATE-----\nMIIEgTCCBCagAwIBAgIUPOEcgi7nXTd3vXKF1FlEIomj/kEwCgYIKoZIzj0EAwIwcTEjMCEGA1UE\nAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoMEUludGVsIENvcnBvcmF0aW9u\nMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTIwMDUx\nODE0MDgxMloXDTI3MDUxODE0MDgxMlowcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZp\nY2F0ZTEaMBgGA1UECgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQsw\nCQYDVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASTu57n8Ugm\nvMvL4sOv3zPcLFXIaj+v/squEcIoCMK7Gvnjyi+twY0WXJ+3fbpbgOcZvqiumstQHg/1YgoGUxt4\no4ICmzCCApcwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8exRl0NXyWU0wXwYDVR0fBFgwVjBUoFKg\nUIZOaHR0cHM6Ly9hcGkudHJ1c3RlZHNlcnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlv\nbi92Mi9wY2tjcmw/Y2E9cHJvY2Vzc29yMB0GA1UdDgQWBBQ7GHHHMQ+/D3xRuT+rEsaVxrqP3TAO\nBgNVHQ8BAf8EBAMCBsAwDAYDVR0TAQH/BAIwADCCAdQGCSqGSIb4TQENAQSCAcUwggHBMB4GCiqG\nSIb4TQENAQEEEIol+EwB7iYjnRkL4ukQEpAwggFkBgoqhkiG+E0BDQECMIIBVDAQBgsqhkiG+E0B\nDQECAQIBBTAQBgsqhkiG+E0BDQECAgIBBTAQBgsqhkiG+E0BDQECAwIBAjAQBgsqhkiG+E0BDQEC\nBAIBBDAQBgsqhkiG+E0BDQECBQIBATARBgsqhkiG+E0BDQECBgICAIAwEAYLKoZIhvhNAQ0BAgcC\nAQAwEAYLKoZIhvhNAQ0BAggCAQAwEAYLKoZIhvhNAQ0BAgkCAQAwEAYLKoZIhvhNAQ0BAgoCAQAw\nEAYLKoZIhvhNAQ0BAgsCAQAwEAYLKoZIhvhNAQ0BAgwCAQAwEAYLKoZIhvhNAQ0BAg0CAQAwEAYL\nKoZIhvhNAQ0BAg4CAQAwEAYLKoZIhvhNAQ0BAg8CAQAwEAYLKoZIhvhNAQ0BAhACAQAwEAYLKoZI\nhvhNAQ0BAhECAQcwHwYLKoZIhvhNAQ0BAhIEEAUFAgQBgAAAAAAAAAAAAAAwEAYKKoZIhvhNAQ0B\nAwQCAAAwFAYKKoZIhvhNAQ0BBAQGAJBuoQAAMA8GCiqGSIb4TQENAQUKAQAwCgYIKoZIzj0EAwID\nSQAwRgIhALX3V2hxTDcFX8OH6/fI7h+Ak9Jsm+My+a8CCmRymZ5LAiEA5gLeBJhHNBrkBXcyflu0\nRd2BauQzLyuuj1lNfSJNqIk=\n-----END CERTIFICATE-----"},{"tcb":{"sgxtcbcomp01svn":5,"sgxtcbcomp02svn":5,"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},"tcbm":"050502040180000000000000000000000600","cert":"-----BEGIN CERTIFICATE-----\nMIIEgDCCBCegAwIBAgIVAMrc0FNx0ZIQwPgBqiDyTvdYAxMuMAoGCCqGSM49BAMCMHExIzAhBgNV\nBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQKDBFJbnRlbCBDb3Jwb3JhdGlv\nbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNVBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yMDA1\nMTgxNDA4MTJaFw0yNzA1MTgxNDA4MTJaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlm\naWNhdGUxGjAYBgNVBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTEL\nMAkGA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEQcat/j9g\n4Uhbjo9wLdKGQHRIshSdTp/FDTECIgsRCdmrU503vGT5dKpt07Tv8/ZsnedCgcCSi9xNkUX4vKPO\naqOCApswggKXMB8GA1UdIwQYMBaAFNDoqtp11/kuSReYPHsUZdDV8llNMF8GA1UdHwRYMFYwVKBS\noFCGTmh0dHBzOi8vYXBpLnRydXN0ZWRzZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRp\nb24vdjIvcGNrY3JsP2NhPXByb2Nlc3NvcjAdBgNVHQ4EFgQUQfUgvjQF3QY8luyHlRprJ9dByZAw\nDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0BDQEEggHFMIIBwTAeBgoq\nhkiG+E0BDQEBBBCKJfhMAe4mI50ZC+LpEBKQMIIBZAYKKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhN\nAQ0BAgECAQUwEAYLKoZIhvhNAQ0BAgICAQUwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0B\nAgQCAQQwEAYLKoZIhvhNAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIH\nAgEAMBAGCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIKAgEA\nMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4TQENAQINAgEAMBAG\nCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAGCyqGSIb4TQENAQIQAgEAMBAGCyqG\nSIb4TQENAQIRAgEGMB8GCyqGSIb4TQENAQISBBAFBQIEAYAAAAAAAAAAAAAAMBAGCiqGSIb4TQEN\nAQMEAgAAMBQGCiqGSIb4TQENAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMC\nA0cAMEQCIE9s1scKHg4q2/7o35v53htsz46S67h1DAlzAWPKtrAnAiBihO7lyFs0lBBCaHdqL7Hk\nIrIX/hRfgB5Ng89lTVbK0A==\n-----END CERTIFICATE-----"},{"tcb":{"sgxtcbcomp01svn":4,"sgxtcbcomp02svn":4,"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":5},"tcbm":"040402040180000000000000000000000500","cert":"-----BEGIN CERTIFICATE-----\nMIIEgTCCBCegAwIBAgIVAIe4WqHapTuI5OsPxchRPLiUBzFeMAoGCCqGSM49BAMCMHExIzAhBgNV\nBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQKDBFJbnRlbCBDb3Jwb3JhdGlv\nbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNVBAgMAkNBMQswCQYDVQQGEwJVUzAeFw0yMDA1\nMTgxNDA4MTJaFw0yNzA1MTgxNDA4MTJaMHAxIjAgBgNVBAMMGUludGVsIFNHWCBQQ0sgQ2VydGlm\naWNhdGUxGjAYBgNVBAoMEUludGVsIENvcnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTEL\nMAkGA1UECAwCQ0ExCzAJBgNVBAYTAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEBKhhMdxT\nGcSjtvsZuOEr98wjth//p1+EU5Adc/WeFXt2U+rczZ3y1a25kQOaAmN4jj1xzSh/JBMQ5Eb2OWfu\nNqOCApswggKXMB8GA1UdIwQYMBaAFNDoqtp11/kuSReYPHsUZdDV8llNMF8GA1UdHwRYMFYwVKBS\noFCGTmh0dHBzOi8vYXBpLnRydXN0ZWRzZXJ2aWNlcy5pbnRlbC5jb20vc2d4L2NlcnRpZmljYXRp\nb24vdjIvcGNrY3JsP2NhPXByb2Nlc3NvcjAdBgNVHQ4EFgQUQOv8JyzPSu0IFSa0jwBn8lKh91Iw\nDgYDVR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwggHUBgkqhkiG+E0BDQEEggHFMIIBwTAeBgoq\nhkiG+E0BDQEBBBCKJfhMAe4mI50ZC+LpEBKQMIIBZAYKKoZIhvhNAQ0BAjCCAVQwEAYLKoZIhvhN\nAQ0BAgECAQQwEAYLKoZIhvhNAQ0BAgICAQQwEAYLKoZIhvhNAQ0BAgMCAQIwEAYLKoZIhvhNAQ0B\nAgQCAQQwEAYLKoZIhvhNAQ0BAgUCAQEwEQYLKoZIhvhNAQ0BAgYCAgCAMBAGCyqGSIb4TQENAQIH\nAgEAMBAGCyqGSIb4TQENAQIIAgEAMBAGCyqGSIb4TQENAQIJAgEAMBAGCyqGSIb4TQENAQIKAgEA\nMBAGCyqGSIb4TQENAQILAgEAMBAGCyqGSIb4TQENAQIMAgEAMBAGCyqGSIb4TQENAQINAgEAMBAG\nCyqGSIb4TQENAQIOAgEAMBAGCyqGSIb4TQENAQIPAgEAMBAGCyqGSIb4TQENAQIQAgEAMBAGCyqG\nSIb4TQENAQIRAgEFMB8GCyqGSIb4TQENAQISBBAEBAIEAYAAAAAAAAAAAAAAMBAGCiqGSIb4TQEN\nAQMEAgAAMBQGCiqGSIb4TQENAQQEBgCQbqEAADAPBgoqhkiG+E0BDQEFCgEAMAoGCCqGSM49BAMC\nA0gAMEUCIQCcM1FYYV0oumFXHHD4wzKqBaVR1l8Hv0Kmd1BInE95bAIgfgQ3t33MDbKvZkI+iQWB\n4yu/U51EjYZvVoHZuvBHfAo=\n-----END CERTIFICATE-----"},{"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":4},"tcbm":"020202040180000000000000000000000400","cert":"-----BEGIN CERTIFICATE-----\nMIIEgTCCBCagAwIBAgIUSC2YgjY27wNHGe3nZJNZR91Gl08wCgYIKoZIzj0EAwIwcTEjMCEGA1UE\nAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoMEUludGVsIENvcnBvcmF0aW9u\nMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTIwMDUx\nODE0MDgxMloXDTI3MDUxODE0MDgxMlowcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZp\nY2F0ZTEaMBgGA1UECgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQsw\nCQYDVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR4u0VJTljE\nyBhxghJkIGqSGFsq/SL65vVheliqeD8F1rw5I9zphB/DsnFMsdQxOygSg8cIv0rdYHNCT7C3mVdi\no4ICmzCCApcwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8exRl0NXyWU0wXwYDVR0fBFgwVjBUoFKg\nUIZOaHR0cHM6Ly9hcGkudHJ1c3RlZHNlcnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlv\nbi92Mi9wY2tjcmw/Y2E9cHJvY2Vzc29yMB0GA1UdDgQWBBQxmPqFGdlPow9q3nVrF9GXdHmwfzAO\nBgNVHQ8BAf8EBAMCBsAwDAYDVR0TAQH/BAIwADCCAdQGCSqGSIb4TQENAQSCAcUwggHBMB4GCiqG\nSIb4TQENAQEEEIol+EwB7iYjnRkL4ukQEpAwggFkBgoqhkiG+E0BDQECMIIBVDAQBgsqhkiG+E0B\nDQECAQIBAjAQBgsqhkiG+E0BDQECAgIBAjAQBgsqhkiG+E0BDQECAwIBAjAQBgsqhkiG+E0BDQEC\nBAIBBDAQBgsqhkiG+E0BDQECBQIBATARBgsqhkiG+E0BDQECBgICAIAwEAYLKoZIhvhNAQ0BAgcC\nAQAwEAYLKoZIhvhNAQ0BAggCAQAwEAYLKoZIhvhNAQ0BAgkCAQAwEAYLKoZIhvhNAQ0BAgoCAQAw\nEAYLKoZIhvhNAQ0BAgsCAQAwEAYLKoZIhvhNAQ0BAgwCAQAwEAYLKoZIhvhNAQ0BAg0CAQAwEAYL\nKoZIhvhNAQ0BAg4CAQAwEAYLKoZIhvhNAQ0BAg8CAQAwEAYLKoZIhvhNAQ0BAhACAQAwEAYLKoZI\nhvhNAQ0BAhECAQQwHwYLKoZIhvhNAQ0BAhIEEAICAgQBgAAAAAAAAAAAAAAwEAYKKoZIhvhNAQ0B\nAwQCAAAwFAYKKoZIhvhNAQ0BBAQGAJBuoQAAMA8GCiqGSIb4TQENAQUKAQAwCgYIKoZIzj0EAwID\nSQAwRgIhAIwNAklQosfZAJHarzy2R5dedWYKmXKCX4fcJwIOijnTAiEA/nNKs1KV/UnZ5RYfzs7+\nvCQspFhfCf5k5qD50vSaes0=\n-----END CERTIFICATE-----"}],"ca_chain":["-----BEGIN CERTIFICATE-----\nMIIClzCCAj6gAwIBAgIVANDoqtp11/kuSReYPHsUZdDV8llNMAoGCCqGSM49BAMC\nMGgxGjAYBgNVBAMMEUludGVsIFNHWCBSb290IENBMRowGAYDVQQKDBFJbnRlbCBD\nb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNVBAgMAkNBMQsw\nCQYDVQQGEwJVUzAeFw0xODA1MjExMDQ1MDhaFw0zMzA1MjExMDQ1MDhaMHExIzAh\nBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQKDBFJbnRl\nbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNVBAgMAkNB\nMQswCQYDVQQGEwJVUzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABL9q+NMp2IOg\ntdl1bk/uWZ5+TGQm8aCi8z78fs+fKCQ3d+uDzXnVTAT2ZhDCifyIuJwvN3wNBp9i\nHBSSMJMJrBOjgbswgbgwHwYDVR0jBBgwFoAUImUM1lqdNInzg7SVUr9QGzknBqww\nUgYDVR0fBEswSTBHoEWgQ4ZBaHR0cHM6Ly9jZXJ0aWZpY2F0ZXMudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9JbnRlbFNHWFJvb3RDQS5jcmwwHQYDVR0OBBYEFNDo\nqtp11/kuSReYPHsUZdDV8llNMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAG\nAQH/AgEAMAoGCCqGSM49BAMCA0cAMEQCIC/9j+84T+HztVO/sOQBWJbSd+/2uexK\n4+aA0jcFBLcpAiA3dhMrF5cD52t6FqMvAIpj8XdGmy2beeljLJK+pzpcRA==\n-----END CERTIFICATE-----\n","-----BEGIN CERTIFICATE-----\nMIICjjCCAjSgAwIBAgIUImUM1lqdNInzg7SVUr9QGzknBqwwCgYIKoZIzj0EAwIw\naDEaMBgGA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENv\ncnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJ\nBgNVBAYTAlVTMB4XDTE4MDUyMTEwNDExMVoXDTMzMDUyMTEwNDExMFowaDEaMBgG\nA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENvcnBvcmF0\naW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJBgNVBAYT\nAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEC6nEwMDIYZOj/iPWsCzaEKi7\n1OiOSLRFhWGjbnBVJfVnkY4u3IjkDYYL0MxO4mqsyYjlBalTVYxFP2sJBK5zlKOB\nuzCBuDAfBgNVHSMEGDAWgBQiZQzWWp00ifODtJVSv1AbOScGrDBSBgNVHR8ESzBJ\nMEegRaBDhkFodHRwczovL2NlcnRpZmljYXRlcy50cnVzdGVkc2VydmljZXMuaW50\nZWwuY29tL0ludGVsU0dYUm9vdENBLmNybDAdBgNVHQ4EFgQUImUM1lqdNInzg7SV\nUr9QGzknBqwwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwCgYI\nKoZIzj0EAwIDSAAwRQIgQQs/08rycdPauCFk8UPQXCMAlsloBe7NwaQGTcdpa0EC\nIQCUt8SGvxKmjpcM/z0WP9Dvo8h2k5du1iWDdBkAn+0iiA==\n-----END CERTIFICATE-----\n"]} \ No newline at end of file diff --git a/intel-sgx/pcs/tests/data/5d39f104e642e51c91507932..71b719-0f0f0205ff8007000000000000000000-0900-0000.pckcert b/intel-sgx/pcs/tests/data/5d39f104e642e51c91507932..71b719-0f0f0205ff8007000000000000000000-0900-0000.pckcert new file mode 100644 index 00000000..027534a6 --- /dev/null +++ b/intel-sgx/pcs/tests/data/5d39f104e642e51c91507932..71b719-0f0f0205ff8007000000000000000000-0900-0000.pckcert @@ -0,0 +1 @@ +{"cert":"-----BEGIN CERTIFICATE-----\nMIIEfzCCBCagAwIBAgIUAISq+XrTHIjD8SJmFtsVX7yXZfcwCgYIKoZIzj0EAwIwcTEjMCEGA1UE\nAwwaSW50ZWwgU0dYIFBDSyBQcm9jZXNzb3IgQ0ExGjAYBgNVBAoMEUludGVsIENvcnBvcmF0aW9u\nMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJBgNVBAYTAlVTMB4XDTIwMDUw\nMTEzMzcwNFoXDTI3MDUwMTEzMzcwNFowcDEiMCAGA1UEAwwZSW50ZWwgU0dYIFBDSyBDZXJ0aWZp\nY2F0ZTEaMBgGA1UECgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQsw\nCQYDVQQIDAJDQTELMAkGA1UEBhMCVVMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATR/AdaOnn0\nhItQjKtL3yPtzrcvT2BFh3d67ThV34Yy/Hx+DMrryhJd6AuRk1abZPD1mP500fLy2/hEpZEI0zdI\no4ICmzCCApcwHwYDVR0jBBgwFoAU0Oiq2nXX+S5JF5g8exRl0NXyWU0wXwYDVR0fBFgwVjBUoFKg\nUIZOaHR0cHM6Ly9hcGkudHJ1c3RlZHNlcnZpY2VzLmludGVsLmNvbS9zZ3gvY2VydGlmaWNhdGlv\nbi92Mi9wY2tjcmw/Y2E9cHJvY2Vzc29yMB0GA1UdDgQWBBRa2UZW3pBgOqRVSKMxHd7gdKLWyDAO\nBgNVHQ8BAf8EBAMCBsAwDAYDVR0TAQH/BAIwADCCAdQGCSqGSIb4TQENAQSCAcUwggHBMB4GCiqG\nSIb4TQENAQEEEIol+EwB7iYjnRkL4ukQEpAwggFkBgoqhkiG+E0BDQECMIIBVDAQBgsqhkiG+E0B\nDQECAQIBDTAQBgsqhkiG+E0BDQECAgIBDTAQBgsqhkiG+E0BDQECAwIBAjAQBgsqhkiG+E0BDQEC\nBAIBBDAQBgsqhkiG+E0BDQECBQIBATARBgsqhkiG+E0BDQECBgICAIAwEAYLKoZIhvhNAQ0BAgcC\nAQMwEAYLKoZIhvhNAQ0BAggCAQAwEAYLKoZIhvhNAQ0BAgkCAQAwEAYLKoZIhvhNAQ0BAgoCAQAw\nEAYLKoZIhvhNAQ0BAgsCAQAwEAYLKoZIhvhNAQ0BAgwCAQAwEAYLKoZIhvhNAQ0BAg0CAQAwEAYL\nKoZIhvhNAQ0BAg4CAQAwEAYLKoZIhvhNAQ0BAg8CAQAwEAYLKoZIhvhNAQ0BAhACAQAwEAYLKoZI\nhvhNAQ0BAhECAQkwHwYLKoZIhvhNAQ0BAhIEEA0NAgQBgAMAAAAAAAAAAAAwEAYKKoZIhvhNAQ0B\nAwQCAAAwFAYKKoZIhvhNAQ0BBAQGAJBuoQAAMA8GCiqGSIb4TQENAQUKAQAwCgYIKoZIzj0EAwID\nRwAwRAIgBIpUCNshbeljHunNbbmxB6cEqe/fveFB5oh1QseMY0wCIEnFjr1bgQJDvLAK9SZGw/+X\nvL+xo4XM8PIofAcYy4mx\n-----END CERTIFICATE-----","ca_chain":["-----BEGIN CERTIFICATE-----\nMIIClzCCAj6gAwIBAgIVANDoqtp11/kuSReYPHsUZdDV8llNMAoGCCqGSM49BAMC\nMGgxGjAYBgNVBAMMEUludGVsIFNHWCBSb290IENBMRowGAYDVQQKDBFJbnRlbCBD\nb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNVBAgMAkNBMQsw\nCQYDVQQGEwJVUzAeFw0xODA1MjExMDQ1MDhaFw0zMzA1MjExMDQ1MDhaMHExIzAh\nBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQKDBFJbnRl\nbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNVBAgMAkNB\nMQswCQYDVQQGEwJVUzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABL9q+NMp2IOg\ntdl1bk/uWZ5+TGQm8aCi8z78fs+fKCQ3d+uDzXnVTAT2ZhDCifyIuJwvN3wNBp9i\nHBSSMJMJrBOjgbswgbgwHwYDVR0jBBgwFoAUImUM1lqdNInzg7SVUr9QGzknBqww\nUgYDVR0fBEswSTBHoEWgQ4ZBaHR0cHM6Ly9jZXJ0aWZpY2F0ZXMudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9JbnRlbFNHWFJvb3RDQS5jcmwwHQYDVR0OBBYEFNDo\nqtp11/kuSReYPHsUZdDV8llNMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAG\nAQH/AgEAMAoGCCqGSM49BAMCA0cAMEQCIC/9j+84T+HztVO/sOQBWJbSd+/2uexK\n4+aA0jcFBLcpAiA3dhMrF5cD52t6FqMvAIpj8XdGmy2beeljLJK+pzpcRA==\n-----END CERTIFICATE-----\n","-----BEGIN CERTIFICATE-----\nMIICjjCCAjSgAwIBAgIUImUM1lqdNInzg7SVUr9QGzknBqwwCgYIKoZIzj0EAwIw\naDEaMBgGA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENv\ncnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJ\nBgNVBAYTAlVTMB4XDTE4MDUyMTEwNDExMVoXDTMzMDUyMTEwNDExMFowaDEaMBgG\nA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENvcnBvcmF0\naW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJBgNVBAYT\nAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEC6nEwMDIYZOj/iPWsCzaEKi7\n1OiOSLRFhWGjbnBVJfVnkY4u3IjkDYYL0MxO4mqsyYjlBalTVYxFP2sJBK5zlKOB\nuzCBuDAfBgNVHSMEGDAWgBQiZQzWWp00ifODtJVSv1AbOScGrDBSBgNVHR8ESzBJ\nMEegRaBDhkFodHRwczovL2NlcnRpZmljYXRlcy50cnVzdGVkc2VydmljZXMuaW50\nZWwuY29tL0ludGVsU0dYUm9vdENBLmNybDAdBgNVHQ4EFgQUImUM1lqdNInzg7SV\nUr9QGzknBqwwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwCgYI\nKoZIzj0EAwIDSAAwRQIgQQs/08rycdPauCFk8UPQXCMAlsloBe7NwaQGTcdpa0EC\nIQCUt8SGvxKmjpcM/z0WP9Dvo8h2k5du1iWDdBkAn+0iiA==\n-----END CERTIFICATE-----\n"]} \ No newline at end of file diff --git a/intel-sgx/pcs/tests/data/corrupted/00906ea10000.tcb b/intel-sgx/pcs/tests/data/corrupted/00906ea10000.tcb new file mode 100644 index 00000000..dac962d4 --- /dev/null +++ b/intel-sgx/pcs/tests/data/corrupted/00906ea10000.tcb @@ -0,0 +1 @@ +{"raw_tcb_info":"{\"version\":2,\"issueDate\":\"3000-05-18T14:08:14Z\",\"nextUpdate\":\"2020-06-17T14:08:14Z\",\"fmspc\":\"00906ea10000\",\"pceId\":\"0000\",\"tcbType\":0,\"tcbEvaluationDataNumber\":8,\"tcbLevels\":[{\"tcb\":{\"sgxtcbcomp01svn\":14,\"sgxtcbcomp02svn\":14,\"sgxtcbcomp03svn\":2,\"sgxtcbcomp04svn\":4,\"sgxtcbcomp05svn\":1,\"sgxtcbcomp06svn\":128,\"sgxtcbcomp07svn\":7,\"sgxtcbcomp08svn\":0,\"sgxtcbcomp09svn\":0,\"sgxtcbcomp10svn\":0,\"sgxtcbcomp11svn\":0,\"sgxtcbcomp12svn\":0,\"sgxtcbcomp13svn\":0,\"sgxtcbcomp14svn\":0,\"sgxtcbcomp15svn\":0,\"sgxtcbcomp16svn\":0,\"pcesvn\":10},\"tcbDate\":\"2019-12-11T00:00:00Z\",\"tcbStatus\":\"SWHardeningNeeded\"},{\"tcb\":{\"sgxtcbcomp01svn\":14,\"sgxtcbcomp02svn\":14,\"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\":10},\"tcbDate\":\"2019-12-11T00:00:00Z\",\"tcbStatus\":\"ConfigurationAndSWHardeningNeeded\"},{\"tcb\":{\"sgxtcbcomp01svn\":13,\"sgxtcbcomp02svn\":13,\"sgxtcbcomp03svn\":2,\"sgxtcbcomp04svn\":4,\"sgxtcbcomp05svn\":1,\"sgxtcbcomp06svn\":128,\"sgxtcbcomp07svn\":3,\"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\":\"OutOfDate\"},{\"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\":\"OutOfDateConfigurationNeeded\"},{\"tcb\":{\"sgxtcbcomp01svn\":6,\"sgxtcbcomp02svn\":6,\"sgxtcbcomp03svn\":2,\"sgxtcbcomp04svn\":4,\"sgxtcbcomp05svn\":1,\"sgxtcbcomp06svn\":128,\"sgxtcbcomp07svn\":1,\"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\"},{\"tcb\":{\"sgxtcbcomp01svn\":6,\"sgxtcbcomp02svn\":6,\"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\":\"OutOfDateConfigurationNeeded\"},{\"tcb\":{\"sgxtcbcomp01svn\":5,\"sgxtcbcomp02svn\":5,\"sgxtcbcomp03svn\":2,\"sgxtcbcomp04svn\":4,\"sgxtcbcomp05svn\":1,\"sgxtcbcomp06svn\":128,\"sgxtcbcomp07svn\":1,\"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\"},{\"tcb\":{\"sgxtcbcomp01svn\":5,\"sgxtcbcomp02svn\":5,\"sgxtcbcomp03svn\":2,\"sgxtcbcomp04svn\":4,\"sgxtcbcomp05svn\":1,\"sgxtcbcomp06svn\":128,\"sgxtcbcomp07svn\":1,\"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\"},{\"tcb\":{\"sgxtcbcomp01svn\":5,\"sgxtcbcomp02svn\":5,\"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\":\"OutOfDateConfigurationNeeded\"},{\"tcb\":{\"sgxtcbcomp01svn\":5,\"sgxtcbcomp02svn\":5,\"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\":\"OutOfDateConfigurationNeeded\"},{\"tcb\":{\"sgxtcbcomp01svn\":4,\"sgxtcbcomp02svn\":4,\"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\":5},\"tcbDate\":\"2018-01-04T00:00:00Z\",\"tcbStatus\":\"OutOfDate\"},{\"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\":4},\"tcbDate\":\"2017-07-26T00:00:00Z\",\"tcbStatus\":\"OutOfDate\"}]}","signature":[48,69,2,32,96,156,105,172,246,1,70,89,106,245,4,63,179,77,229,233,42,147,86,152,130,251,96,164,95,225,101,21,170,140,13,43,2,33,0,235,148,12,205,6,116,198,176,232,48,5,160,89,62,176,66,147,135,69,123,225,218,220,252,115,167,38,16,65,244,121,24],"ca_chain":["-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIUfjiC1ftVKUpASY5FhAPpFJG99FUwCgYIKoZIzj0EAwIw\naDEaMBgGA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENv\ncnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJ\nBgNVBAYTAlVTMB4XDTE4MDUyMTEwNDc1MVoXDTMzMDUyMTEwNDc1MVowbDEeMBwG\nA1UEAwwVSW50ZWwgU0dYIFRDQiBTaWduaW5nMRowGAYDVQQKDBFJbnRlbCBDb3Jw\nb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNVBAgMAkNBMQswCQYD\nVQQGEwJVUzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABENFG8xzydWRfK92bmGv\nP+mAh91PEyV7Jh6FGJd5ndE9aBH7R3E4A7ubrlh/zN3C4xvpoouGlirMba+W2lju\nypajgbUwgbIwHwYDVR0jBBgwFoAUImUM1lqdNInzg7SVUr9QGzknBqwwUgYDVR0f\nBEswSTBHoEWgQ4ZBaHR0cHM6Ly9jZXJ0aWZpY2F0ZXMudHJ1c3RlZHNlcnZpY2Vz\nLmludGVsLmNvbS9JbnRlbFNHWFJvb3RDQS5jcmwwHQYDVR0OBBYEFH44gtX7VSlK\nQEmORYQD6RSRvfRVMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMAoGCCqG\nSM49BAMCA0gAMEUCIBZZKhCZkaY8Db3MNDbrJdB6l1R9nrgUZicB9k3gQrChAiEA\nkUsVfIqjzK0lVWu8U5+8rL1xG57CJ7aPxTgl0kfFWuw=\n-----END CERTIFICATE-----\n","-----BEGIN CERTIFICATE-----\nMIICjjCCAjSgAwIBAgIUImUM1lqdNInzg7SVUr9QGzknBqwwCgYIKoZIzj0EAwIw\naDEaMBgGA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENv\ncnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJ\nBgNVBAYTAlVTMB4XDTE4MDUyMTEwNDExMVoXDTMzMDUyMTEwNDExMFowaDEaMBgG\nA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENvcnBvcmF0\naW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJBgNVBAYT\nAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEC6nEwMDIYZOj/iPWsCzaEKi7\n1OiOSLRFhWGjbnBVJfVnkY4u3IjkDYYL0MxO4mqsyYjlBalTVYxFP2sJBK5zlKOB\nuzCBuDAfBgNVHSMEGDAWgBQiZQzWWp00ifODtJVSv1AbOScGrDBSBgNVHR8ESzBJ\nMEegRaBDhkFodHRwczovL2NlcnRpZmljYXRlcy50cnVzdGVkc2VydmljZXMuaW50\nZWwuY29tL0ludGVsU0dYUm9vdENBLmNybDAdBgNVHQ4EFgQUImUM1lqdNInzg7SV\nUr9QGzknBqwwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwCgYI\nKoZIzj0EAwIDSAAwRQIgQQs/08rycdPauCFk8UPQXCMAlsloBe7NwaQGTcdpa0EC\nIQCUt8SGvxKmjpcM/z0WP9Dvo8h2k5du1iWDdBkAn+0iiA==\n-----END CERTIFICATE-----\n"]} diff --git a/intel-sgx/pcs/tests/data/corrupted/qe3_identity.id b/intel-sgx/pcs/tests/data/corrupted/qe3_identity.id new file mode 100644 index 00000000..377abbce --- /dev/null +++ b/intel-sgx/pcs/tests/data/corrupted/qe3_identity.id @@ -0,0 +1 @@ +{"raw_enclave_identity":"{\"id\":\"QE\",\"version\":2,\"issueDate\":\"3000-05-18T14:08:11Z\",\"nextUpdate\":\"2020-06-17T14:08:11Z\",\"tcbEvaluationDataNumber\":8,\"miscselect\":\"00000000\",\"miscselectMask\":\"FFFFFFFF\",\"attributes\":\"11000000000000000000000000000000\",\"attributesMask\":\"FBFFFFFFFFFFFFFF0000000000000000\",\"mrsigner\":\"8C4F5775D796503E96137F77C68A829A0056AC8DED70140B081B094490C57BFF\",\"isvprodid\":1,\"tcbLevels\":[{\"tcb\":{\"isvsvn\":5},\"tcbDate\":\"2019-12-11T00:00:00Z\",\"tcbStatus\":\"UpToDate\"},{\"tcb\":{\"isvsvn\":4},\"tcbDate\":\"2019-11-13T00:00:00Z\",\"tcbStatus\":\"OutOfDate\"},{\"tcb\":{\"isvsvn\":2},\"tcbDate\":\"2019-05-15T00:00:00Z\",\"tcbStatus\":\"OutOfDate\"},{\"tcb\":{\"isvsvn\":1},\"tcbDate\":\"2018-08-15T00:00:00Z\",\"tcbStatus\":\"OutOfDate\"}]}","signature":[48,69,2,32,14,188,138,175,118,32,27,0,191,49,54,129,11,213,10,182,114,111,7,167,29,248,25,182,156,135,250,174,121,19,21,58,2,33,0,241,246,167,42,225,95,172,215,225,209,78,147,165,181,10,13,103,225,5,66,255,90,253,53,72,27,50,162,134,166,121,146],"ca_chain":["-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIUfjiC1ftVKUpASY5FhAPpFJG99FUwCgYIKoZIzj0EAwIw\naDEaMBgGA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENv\ncnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJ\nBgNVBAYTAlVTMB4XDTE4MDUyMTEwNDc1MVoXDTMzMDUyMTEwNDc1MVowbDEeMBwG\nA1UEAwwVSW50ZWwgU0dYIFRDQiBTaWduaW5nMRowGAYDVQQKDBFJbnRlbCBDb3Jw\nb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNVBAgMAkNBMQswCQYD\nVQQGEwJVUzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABENFG8xzydWRfK92bmGv\nP+mAh91PEyV7Jh6FGJd5ndE9aBH7R3E4A7ubrlh/zN3C4xvpoouGlirMba+W2lju\nypajgbUwgbIwHwYDVR0jBBgwFoAUImUM1lqdNInzg7SVUr9QGzknBqwwUgYDVR0f\nBEswSTBHoEWgQ4ZBaHR0cHM6Ly9jZXJ0aWZpY2F0ZXMudHJ1c3RlZHNlcnZpY2Vz\nLmludGVsLmNvbS9JbnRlbFNHWFJvb3RDQS5jcmwwHQYDVR0OBBYEFH44gtX7VSlK\nQEmORYQD6RSRvfRVMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMAoGCCqG\nSM49BAMCA0gAMEUCIBZZKhCZkaY8Db3MNDbrJdB6l1R9nrgUZicB9k3gQrChAiEA\nkUsVfIqjzK0lVWu8U5+8rL1xG57CJ7aPxTgl0kfFWuw=\n-----END CERTIFICATE-----\n","-----BEGIN CERTIFICATE-----\nMIICjjCCAjSgAwIBAgIUImUM1lqdNInzg7SVUr9QGzknBqwwCgYIKoZIzj0EAwIw\naDEaMBgGA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENv\ncnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJ\nBgNVBAYTAlVTMB4XDTE4MDUyMTEwNDExMVoXDTMzMDUyMTEwNDExMFowaDEaMBgG\nA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENvcnBvcmF0\naW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJBgNVBAYT\nAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEC6nEwMDIYZOj/iPWsCzaEKi7\n1OiOSLRFhWGjbnBVJfVnkY4u3IjkDYYL0MxO4mqsyYjlBalTVYxFP2sJBK5zlKOB\nuzCBuDAfBgNVHSMEGDAWgBQiZQzWWp00ifODtJVSv1AbOScGrDBSBgNVHR8ESzBJ\nMEegRaBDhkFodHRwczovL2NlcnRpZmljYXRlcy50cnVzdGVkc2VydmljZXMuaW50\nZWwuY29tL0ludGVsU0dYUm9vdENBLmNybDAdBgNVHQ4EFgQUImUM1lqdNInzg7SV\nUr9QGzknBqwwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwCgYI\nKoZIzj0EAwIDSAAwRQIgQQs/08rycdPauCFk8UPQXCMAlsloBe7NwaQGTcdpa0EC\nIQCUt8SGvxKmjpcM/z0WP9Dvo8h2k5du1iWDdBkAn+0iiA==\n-----END CERTIFICATE-----\n"]} diff --git a/intel-sgx/pcs/tests/data/processor.crl b/intel-sgx/pcs/tests/data/processor.crl new file mode 100644 index 00000000..cb9bb689 --- /dev/null +++ b/intel-sgx/pcs/tests/data/processor.crl @@ -0,0 +1 @@ +{"crl":"-----BEGIN X509 CRL-----\nMIIBKjCB0QIBATAKBggqhkjOPQQDAjBxMSMwIQYDVQQDDBpJbnRlbCBTR1ggUENLIFByb2Nlc3Nv\nciBDQTEaMBgGA1UECgwRSW50ZWwgQ29ycG9yYXRpb24xFDASBgNVBAcMC1NhbnRhIENsYXJhMQsw\nCQYDVQQIDAJDQTELMAkGA1UEBhMCVVMXDTIwMDUxODE3NDkyMVoXDTIwMDYxNzE3NDkyMVqgLzAt\nMAoGA1UdFAQDAgEBMB8GA1UdIwQYMBaAFNDoqtp11/kuSReYPHsUZdDV8llNMAoGCCqGSM49BAMC\nA0gAMEUCIQCG6zd3OKMHl+bjq0yVX++vrRi/q2fqxt/+kSeBuN7kYgIgVWTsuSD+pxOcUmskymns\nzedAWqVx4ZfQGj3812GYDis=\n-----END X509 CRL-----","ca_chain":["-----BEGIN CERTIFICATE-----\nMIIClzCCAj6gAwIBAgIVANDoqtp11/kuSReYPHsUZdDV8llNMAoGCCqGSM49BAMC\nMGgxGjAYBgNVBAMMEUludGVsIFNHWCBSb290IENBMRowGAYDVQQKDBFJbnRlbCBD\nb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNVBAgMAkNBMQsw\nCQYDVQQGEwJVUzAeFw0xODA1MjExMDQ1MDhaFw0zMzA1MjExMDQ1MDhaMHExIzAh\nBgNVBAMMGkludGVsIFNHWCBQQ0sgUHJvY2Vzc29yIENBMRowGAYDVQQKDBFJbnRl\nbCBDb3Jwb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNVBAgMAkNB\nMQswCQYDVQQGEwJVUzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABL9q+NMp2IOg\ntdl1bk/uWZ5+TGQm8aCi8z78fs+fKCQ3d+uDzXnVTAT2ZhDCifyIuJwvN3wNBp9i\nHBSSMJMJrBOjgbswgbgwHwYDVR0jBBgwFoAUImUM1lqdNInzg7SVUr9QGzknBqww\nUgYDVR0fBEswSTBHoEWgQ4ZBaHR0cHM6Ly9jZXJ0aWZpY2F0ZXMudHJ1c3RlZHNl\ncnZpY2VzLmludGVsLmNvbS9JbnRlbFNHWFJvb3RDQS5jcmwwHQYDVR0OBBYEFNDo\nqtp11/kuSReYPHsUZdDV8llNMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAG\nAQH/AgEAMAoGCCqGSM49BAMCA0cAMEQCIC/9j+84T+HztVO/sOQBWJbSd+/2uexK\n4+aA0jcFBLcpAiA3dhMrF5cD52t6FqMvAIpj8XdGmy2beeljLJK+pzpcRA==\n-----END CERTIFICATE-----\n","-----BEGIN CERTIFICATE-----\nMIICjjCCAjSgAwIBAgIUImUM1lqdNInzg7SVUr9QGzknBqwwCgYIKoZIzj0EAwIw\naDEaMBgGA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENv\ncnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJ\nBgNVBAYTAlVTMB4XDTE4MDUyMTEwNDExMVoXDTMzMDUyMTEwNDExMFowaDEaMBgG\nA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENvcnBvcmF0\naW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJBgNVBAYT\nAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEC6nEwMDIYZOj/iPWsCzaEKi7\n1OiOSLRFhWGjbnBVJfVnkY4u3IjkDYYL0MxO4mqsyYjlBalTVYxFP2sJBK5zlKOB\nuzCBuDAfBgNVHSMEGDAWgBQiZQzWWp00ifODtJVSv1AbOScGrDBSBgNVHR8ESzBJ\nMEegRaBDhkFodHRwczovL2NlcnRpZmljYXRlcy50cnVzdGVkc2VydmljZXMuaW50\nZWwuY29tL0ludGVsU0dYUm9vdENBLmNybDAdBgNVHQ4EFgQUImUM1lqdNInzg7SV\nUr9QGzknBqwwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwCgYI\nKoZIzj0EAwIDSAAwRQIgQQs/08rycdPauCFk8UPQXCMAlsloBe7NwaQGTcdpa0EC\nIQCUt8SGvxKmjpcM/z0WP9Dvo8h2k5du1iWDdBkAn+0iiA==\n-----END CERTIFICATE-----\n"]} \ No newline at end of file diff --git a/intel-sgx/pcs/tests/data/qe3_identity.id b/intel-sgx/pcs/tests/data/qe3_identity.id new file mode 100644 index 00000000..4ad5cab2 --- /dev/null +++ b/intel-sgx/pcs/tests/data/qe3_identity.id @@ -0,0 +1 @@ +{"raw_enclave_identity":"{\"id\":\"QE\",\"version\":2,\"issueDate\":\"2020-05-18T17:49:21Z\",\"nextUpdate\":\"2020-06-17T17:49:21Z\",\"tcbEvaluationDataNumber\":8,\"miscselect\":\"00000000\",\"miscselectMask\":\"FFFFFFFF\",\"attributes\":\"11000000000000000000000000000000\",\"attributesMask\":\"FBFFFFFFFFFFFFFF0000000000000000\",\"mrsigner\":\"8C4F5775D796503E96137F77C68A829A0056AC8DED70140B081B094490C57BFF\",\"isvprodid\":1,\"tcbLevels\":[{\"tcb\":{\"isvsvn\":5},\"tcbDate\":\"2019-12-11T00:00:00Z\",\"tcbStatus\":\"UpToDate\"},{\"tcb\":{\"isvsvn\":4},\"tcbDate\":\"2019-11-13T00:00:00Z\",\"tcbStatus\":\"OutOfDate\"},{\"tcb\":{\"isvsvn\":2},\"tcbDate\":\"2019-05-15T00:00:00Z\",\"tcbStatus\":\"OutOfDate\"},{\"tcb\":{\"isvsvn\":1},\"tcbDate\":\"2018-08-15T00:00:00Z\",\"tcbStatus\":\"OutOfDate\"}]}","signature":[48,70,2,33,0,144,31,0,157,98,90,228,100,1,226,193,54,165,16,217,114,151,231,67,204,15,85,124,239,62,239,73,35,235,36,218,186,2,33,0,228,153,211,15,212,76,194,95,237,79,186,95,2,142,192,155,252,111,117,107,246,56,73,20,232,92,38,19,71,194,148,173],"ca_chain":["-----BEGIN CERTIFICATE-----\nMIICjDCCAjKgAwIBAgIUfjiC1ftVKUpASY5FhAPpFJG99FUwCgYIKoZIzj0EAwIw\naDEaMBgGA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENv\ncnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJ\nBgNVBAYTAlVTMB4XDTE4MDUyMTEwNDc1MVoXDTMzMDUyMTEwNDc1MVowbDEeMBwG\nA1UEAwwVSW50ZWwgU0dYIFRDQiBTaWduaW5nMRowGAYDVQQKDBFJbnRlbCBDb3Jw\nb3JhdGlvbjEUMBIGA1UEBwwLU2FudGEgQ2xhcmExCzAJBgNVBAgMAkNBMQswCQYD\nVQQGEwJVUzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABENFG8xzydWRfK92bmGv\nP+mAh91PEyV7Jh6FGJd5ndE9aBH7R3E4A7ubrlh/zN3C4xvpoouGlirMba+W2lju\nypajgbUwgbIwHwYDVR0jBBgwFoAUImUM1lqdNInzg7SVUr9QGzknBqwwUgYDVR0f\nBEswSTBHoEWgQ4ZBaHR0cHM6Ly9jZXJ0aWZpY2F0ZXMudHJ1c3RlZHNlcnZpY2Vz\nLmludGVsLmNvbS9JbnRlbFNHWFJvb3RDQS5jcmwwHQYDVR0OBBYEFH44gtX7VSlK\nQEmORYQD6RSRvfRVMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMAoGCCqG\nSM49BAMCA0gAMEUCIBZZKhCZkaY8Db3MNDbrJdB6l1R9nrgUZicB9k3gQrChAiEA\nkUsVfIqjzK0lVWu8U5+8rL1xG57CJ7aPxTgl0kfFWuw=\n-----END CERTIFICATE-----\n","-----BEGIN CERTIFICATE-----\nMIICjjCCAjSgAwIBAgIUImUM1lqdNInzg7SVUr9QGzknBqwwCgYIKoZIzj0EAwIw\naDEaMBgGA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENv\ncnBvcmF0aW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJ\nBgNVBAYTAlVTMB4XDTE4MDUyMTEwNDExMVoXDTMzMDUyMTEwNDExMFowaDEaMBgG\nA1UEAwwRSW50ZWwgU0dYIFJvb3QgQ0ExGjAYBgNVBAoMEUludGVsIENvcnBvcmF0\naW9uMRQwEgYDVQQHDAtTYW50YSBDbGFyYTELMAkGA1UECAwCQ0ExCzAJBgNVBAYT\nAlVTMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEC6nEwMDIYZOj/iPWsCzaEKi7\n1OiOSLRFhWGjbnBVJfVnkY4u3IjkDYYL0MxO4mqsyYjlBalTVYxFP2sJBK5zlKOB\nuzCBuDAfBgNVHSMEGDAWgBQiZQzWWp00ifODtJVSv1AbOScGrDBSBgNVHR8ESzBJ\nMEegRaBDhkFodHRwczovL2NlcnRpZmljYXRlcy50cnVzdGVkc2VydmljZXMuaW50\nZWwuY29tL0ludGVsU0dYUm9vdENBLmNybDAdBgNVHQ4EFgQUImUM1lqdNInzg7SV\nUr9QGzknBqwwDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQEwCgYI\nKoZIzj0EAwIDSAAwRQIgQQs/08rycdPauCFk8UPQXCMAlsloBe7NwaQGTcdpa0EC\nIQCUt8SGvxKmjpcM/z0WP9Dvo8h2k5du1iWDdBkAn+0iiA==\n-----END CERTIFICATE-----\n"]} \ No newline at end of file diff --git a/intel-sgx/pcs/tests/data/quote.bin b/intel-sgx/pcs/tests/data/quote.bin new file mode 100644 index 00000000..feb36e41 Binary files /dev/null and b/intel-sgx/pcs/tests/data/quote.bin differ diff --git a/intel-sgx/pcs/tests/data/root_SGX_CA_der.cert b/intel-sgx/pcs/tests/data/root_SGX_CA_der.cert new file mode 100644 index 00000000..75a1171f Binary files /dev/null and b/intel-sgx/pcs/tests/data/root_SGX_CA_der.cert differ