@super-protocol/addons-tee 0.8.17-beta.1 → 0.8.17-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/bindings/amd-sev-snp-napi-rs/amd-sev-snp-napi-rs.linux-x64-gnu.node +0 -0
  2. package/bindings/sp-sev/.github/auto_assign-issues.yml +5 -0
  3. package/bindings/sp-sev/.github/auto_assign.yml +21 -0
  4. package/bindings/sp-sev/.github/dependabot.yml +6 -0
  5. package/bindings/sp-sev/.github/workflows/dco.yml +10 -0
  6. package/bindings/sp-sev/.github/workflows/lint.yml +56 -0
  7. package/bindings/sp-sev/.github/workflows/test.yml +54 -0
  8. package/bindings/sp-sev/.rustfmt.toml +2 -0
  9. package/bindings/sp-sev/CODEOWNERS +1 -0
  10. package/bindings/sp-sev/Cargo.lock +2221 -0
  11. package/bindings/sp-sev/Cargo.toml +80 -0
  12. package/bindings/sp-sev/LICENSE +201 -0
  13. package/bindings/sp-sev/README.md +82 -0
  14. package/bindings/sp-sev/build.rs +17 -0
  15. package/bindings/sp-sev/docs/attestation/README.md +239 -0
  16. package/bindings/sp-sev/docs/attestation/certchain.dot +14 -0
  17. package/bindings/sp-sev/docs/attestation/certchain.dot.png +0 -0
  18. package/bindings/sp-sev/docs/attestation/prerequisites.md +6 -0
  19. package/bindings/sp-sev/docs/attestation/process.msc +60 -0
  20. package/bindings/sp-sev/docs/attestation/process.msc.png +0 -0
  21. package/bindings/sp-sev/docs/attestation/protections.md +53 -0
  22. package/bindings/sp-sev/package-version.py +11 -0
  23. package/bindings/sp-sev/tests/api.rs +191 -0
  24. package/bindings/sp-sev/tests/certs.rs +143 -0
  25. package/bindings/sp-sev/tests/certs_data/cert_chain_milan +74 -0
  26. package/bindings/sp-sev/tests/certs_data/cert_chain_turin +74 -0
  27. package/bindings/sp-sev/tests/certs_data/report_milan.hex +1 -0
  28. package/bindings/sp-sev/tests/certs_data/vcek_milan.der +0 -0
  29. package/bindings/sp-sev/tests/certs_data/vcek_turin.der +0 -0
  30. package/bindings/sp-sev/tests/guest.rs +56 -0
  31. package/bindings/sp-sev/tests/id-block.rs +168 -0
  32. package/bindings/sp-sev/tests/measurement/ovmf_AmdSev_suffix.bin +0 -0
  33. package/bindings/sp-sev/tests/measurement/ovmf_OvmfX64_suffix.bin +0 -0
  34. package/bindings/sp-sev/tests/measurement/test_auth_block.bin +0 -0
  35. package/bindings/sp-sev/tests/measurement/test_auth_key.pem +6 -0
  36. package/bindings/sp-sev/tests/measurement/test_auth_sig.bin +0 -0
  37. package/bindings/sp-sev/tests/measurement/test_id_key.pem +6 -0
  38. package/bindings/sp-sev/tests/measurement/test_id_sig.bin +0 -0
  39. package/bindings/sp-sev/tests/measurement.rs +510 -0
  40. package/bindings/sp-sev/tests/naples/ark.cert.bad +0 -0
  41. package/bindings/sp-sev/tests/naples/ark.cert.sig +0 -0
  42. package/bindings/sp-sev/tests/naples/ark.rs +38 -0
  43. package/bindings/sp-sev/tests/naples/ask.rs +29 -0
  44. package/bindings/sp-sev/tests/naples/cek.cert +0 -0
  45. package/bindings/sp-sev/tests/naples/cek.rs +30 -0
  46. package/bindings/sp-sev/tests/naples/mod.rs +20 -0
  47. package/bindings/sp-sev/tests/naples/oca.cert +0 -0
  48. package/bindings/sp-sev/tests/naples/oca.rs +45 -0
  49. package/bindings/sp-sev/tests/naples/pdh.cert +0 -0
  50. package/bindings/sp-sev/tests/naples/pdh.rs +28 -0
  51. package/bindings/sp-sev/tests/naples/pek.cert +0 -0
  52. package/bindings/sp-sev/tests/naples/pek.rs +32 -0
  53. package/bindings/sp-sev/tests/rome/ark.rs +33 -0
  54. package/bindings/sp-sev/tests/rome/ask.rs +29 -0
  55. package/bindings/sp-sev/tests/rome/cek.cert +0 -0
  56. package/bindings/sp-sev/tests/rome/cek.rs +29 -0
  57. package/bindings/sp-sev/tests/rome/mod.rs +16 -0
  58. package/bindings/sp-sev/tests/rome/oca.cert +0 -0
  59. package/bindings/sp-sev/tests/rome/oca.rs +45 -0
  60. package/bindings/sp-sev/tests/rome/pdh.cert +0 -0
  61. package/bindings/sp-sev/tests/rome/pdh.rs +28 -0
  62. package/bindings/sp-sev/tests/rome/pek.cert +0 -0
  63. package/bindings/sp-sev/tests/rome/pek.rs +32 -0
  64. package/bindings/sp-sev/tests/session.rs +39 -0
  65. package/bindings/sp-sev/tests/sev_launch.rs +120 -0
  66. package/bindings/sp-sev/tests/snp_launch.rs +108 -0
  67. package/bindings/utils/virtee/libsev.so +0 -0
  68. package/bindings/utils/virtee/snpguest +0 -0
  69. package/dist/sgx-native-module/sev-snp.d.ts +1 -0
  70. package/dist/sgx-native-module/sev-snp.js +3 -2
  71. package/package.json +1 -1
@@ -0,0 +1,60 @@
1
+ # Commits which modify this file MUST generate the new .png!
2
+ msc {
3
+ tenant [textbgcolor="green"],
4
+ host [textbgcolor="red"],
5
+ bios [textbgcolor="orange"],
6
+ bootloader [textbgcolor="orange"],
7
+ kernel [textbgcolor="orange"],
8
+ psp [textbgcolor="yellow"];
9
+
10
+ tenant=>host [label="cert chain request"];
11
+ host=>psp [label="cert chain request"];
12
+ psp=>host [label="cert chain reply\n(w/ firmware version)"];
13
+ host=>tenant [label="cert chain reply\n(w/ firmware version)"];
14
+
15
+ ...;
16
+
17
+ tenant box tenant [label="validate cert chain"];
18
+ tenant box tenant [label="validate fw version"];
19
+ tenant box tenant [label="craft exec policy"];
20
+ tenant box tenant [label="random cdh keypair"];
21
+ tenant box tenant [label="random tek/tik"];
22
+
23
+
24
+ tenant box tenant [label="DH(cdh, pdh) => z"];
25
+ tenant box tenant [label="KDF(z) => master"];
26
+ tenant box tenant [label="KDF(master) => kek"];
27
+ tenant box tenant [label="KDF(master) => kik"];
28
+
29
+ tenant => host [label="CDH, MAC(tik, policy),\nMAC(kik, ENC(kek, tek||tik))"];
30
+ host => psp [label="CDH, MAC(tik, policy),\nMAC(kik, ENC(kek, tek||tik))"];
31
+
32
+ psp box psp [label="DH(cdh, pdh) => z"];
33
+ psp box psp [label="KDF(z) => master"];
34
+ psp box psp [label="KDF(master) => kek"];
35
+ psp box psp [label="KDF(master) => kik"];
36
+
37
+ psp box psp [label="check MAC(kik, ...)"];
38
+ psp box psp [label="DEC(kek, tek||tik)"];
39
+
40
+ host => psp [label="guest pages"];
41
+ psp box psp [label="measure guest pages"];
42
+
43
+ psp => host [label="MAC(tik, measurement)"];
44
+ host => tenant [label="MAC(tik, measurement)"];
45
+
46
+ tenant box tenant [label="validate measure"];
47
+ tenant box tenant [label="prepare metadata"];
48
+ tenant => host [label="enc = ENC(tek, metadata)\nMAC(tik, enc)"];
49
+ host => psp [label="enc = ENC(tek, metadata)\nMAC(tik, enc)"];
50
+
51
+ psp => bios [label="decrypt metadata into guest memory"];
52
+
53
+ --- [label="VM START"];
54
+
55
+ bios => bootloader [label="metadata"];
56
+ bootloader => kernel [label="metadata"];
57
+ kernel box kernel [label="unlock volume"];
58
+
59
+ --- [label="BOOT COMPLETE"];
60
+ }
@@ -0,0 +1,53 @@
1
+ # Protections
2
+
3
+ An SEV-enabled guest will be protected from a number of potential threats.
4
+
5
+ These threats are broadly categorized like so:
6
+
7
+ **Confidentiality**: Anything that could disclose and/or read the contents of the virtual machine without
8
+ its explicit permission is a threat to the virtual machine's confidentiality.
9
+
10
+ **Integrity**: The virtual machine must always see the data that it last wrote. If this invariant is broken,
11
+ then the integrity of the virtual machine is compromised.
12
+
13
+ **Physical Access Attacks**: An attacker with a substantial level of access to the physical hardware may use
14
+ this access to conduct attacks on the system and virtual machines running on it.
15
+
16
+ **Miscellaneous**: An attack which doesn't fit in as nicely to any of the other above categories.
17
+
18
+ Table legend:
19
+
20
+ * :heavy\_check\_mark:: indicates that this attack is thwarted by an SEV feature.
21
+
22
+ * :star2:: indicates that this mitigation may be optionally enabled.
23
+
24
+ * : an empty cell indicates that the attack is *not* mitigated by that technology.
25
+
26
+ | **Confidentiality** | **SEV** | **SEV-ES** | **SEV-SNP** |
27
+ | ------------------: | :-----: | :--------: | :---------: |
28
+ | VM Memory (*ex: Hypervisor reads private VM memory*) | :heavy\_check\_mark: | :heavy\_check\_mark: | :heavy\_check\_mark: |
29
+ | VM Register State (*ex: Hypervisor attempts to read VM register context*) | | :heavy\_check\_mark: | :heavy\_check\_mark: |
30
+ | DMA Protection (*ex: Device attempts to read VM memory*) | :heavy\_check\_mark: | :heavy\_check\_mark: | :heavy\_check\_mark: |
31
+ | **Integrity** | **SEV** | **SEV-ES** | **SEV-SNP** |
32
+ | Replay Protection (*ex: VM memory is replaced with an old copy*) | | | :heavy\_check\_mark: |
33
+ | Data Corruption (*ex: VM memory is replaced with junk data*) | | | :heavy\_check\_mark: |
34
+ | Memory Aliasing (*ex: Hypervisor maps two guest pages to same DRAM page*) | | | :heavy\_check\_mark: |
35
+ | Memory Re-mapping (*ex: Hypervisor switches DRAM page mapped to a guest page*) | | | :heavy\_check\_mark: |
36
+ | **Availability** | **SEV** | **SEV-ES** | **SEV-SNP** |
37
+ | Guest to Host Denial of Service (*ex: Guest refuses to yield/exit*) | :heavy\_check\_mark: | :heavy\_check\_mark: | :heavy\_check\_mark: |
38
+ | Host to Guest Denial of Service (*ex: Host refuses to run guest*) | | | |
39
+ | **Physical Access Attacks** | **SEV** | **SEV-ES** | **SEV-SNP** |
40
+ | Offline DRAM analysis (*ex: Cold boot*) | :heavy\_check\_mark: | :heavy\_check\_mark: | :heavy\_check\_mark: |
41
+ | Active DRAM corruption (*ex: Manipulate DDR bus while VM is running*) | | | |
42
+ | **Miscellaneous Attacks** | **SEV** | **SEV-ES** | **SEV-SNP** |
43
+ | TCB Rollback (*ex: AMD-SP firmware is reverted to older version*) | | | :heavy\_check\_mark: |
44
+ | Malicious Interrupt/Exception Injection (*ex: interrupt injected while RFLAGS.IF=0*) | | | :star2: |
45
+ | Indirect Branch Predictor Poisoning (*ex: Poison BTB from hypervisor*) | | | :star2: |
46
+ | Secure Hardware Debug Registers (*ex: Breakpoints changed during debugging*) | | | :star2: |
47
+ | Trusted CPUID Information (*ex: Hypervisor lies about platform capabilities*) | | | :star2: |
48
+ | Architectural Side Channels (*ex: PRIME+PROBE to track VM accesses*) | | | |
49
+ | Page-level Side Channels (*ex: Track VM access patterns through page tables*) | | | |
50
+ | Performance Counter Tracking (*ex: Fingerprint VM workloads by performance data*) | | | |
51
+
52
+ *The table above was taken directly from the [AMD SEV-SNP Whitepaper (Table 1: Threat Model)](
53
+ https://www.amd.com/system/files/TechDocs/SEV-SNP-strengthening-vm-isolation-with-integrity-protection-and-more.pdf).*
@@ -0,0 +1,11 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+
3
+ #!/usr/bin/env python3
4
+ import json
5
+ import subprocess
6
+
7
+ try:
8
+ out = subprocess.check_output(["cargo", "read-manifest"])
9
+ print(json.loads(out)["version"])
10
+ except FileNotFoundError:
11
+ print("unknown")
@@ -0,0 +1,191 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+
3
+ #[cfg(all(feature = "sev", target_os = "linux"))]
4
+
5
+ mod sev {
6
+ #[cfg(feature = "dangerous_hw_tests")]
7
+ use serial_test::serial;
8
+ #[cfg(feature = "dangerous_hw_tests")]
9
+ use sev::cached_chain;
10
+ use sev::{certs::sev::sev::Usage, firmware::host::Firmware, Build, Version};
11
+
12
+ #[cfg(feature = "dangerous_hw_tests")]
13
+ #[cfg_attr(not(host), ignore)]
14
+ #[test]
15
+ #[serial]
16
+ fn platform_reset() {
17
+ let mut fw = Firmware::open().unwrap();
18
+ fw.platform_reset().unwrap();
19
+ cached_chain::rm_cached_chain();
20
+ }
21
+
22
+ #[cfg_attr(not(host), ignore)]
23
+ #[test]
24
+ fn platform_status() {
25
+ let mut fw = Firmware::open().unwrap();
26
+ let status = fw.platform_status().unwrap();
27
+ assert!(
28
+ status.build
29
+ > Build {
30
+ version: Version {
31
+ major: 0,
32
+ minor: 14
33
+ },
34
+ ..Default::default()
35
+ }
36
+ );
37
+ }
38
+
39
+ #[cfg(feature = "dangerous_hw_tests")]
40
+ #[cfg_attr(not(host), ignore)]
41
+ #[test]
42
+ #[serial]
43
+ fn pek_generate() {
44
+ let mut fw = Firmware::open().unwrap();
45
+ fw.pek_generate().unwrap();
46
+ cached_chain::rm_cached_chain();
47
+ }
48
+
49
+ #[cfg_attr(not(host), ignore)]
50
+ #[test]
51
+ fn pek_csr() {
52
+ let mut fw = Firmware::open().unwrap();
53
+ let pek = fw.pek_csr().unwrap();
54
+ assert_eq!(pek, Usage::PEK);
55
+ }
56
+
57
+ #[cfg(feature = "dangerous_hw_tests")]
58
+ #[cfg_attr(not(host), ignore)]
59
+ #[test]
60
+ #[serial]
61
+ fn pdh_generate() {
62
+ let mut fw = Firmware::open().unwrap();
63
+ fw.pdh_generate().unwrap();
64
+ cached_chain::rm_cached_chain();
65
+ }
66
+
67
+ #[cfg(feature = "openssl")]
68
+ #[cfg_attr(not(host), ignore)]
69
+ #[test]
70
+ fn pdh_cert_export() {
71
+ use sev::certs::sev::Verifiable;
72
+
73
+ let mut fw = Firmware::open().unwrap();
74
+ let chain = fw.pdh_cert_export().unwrap();
75
+
76
+ assert_eq!(chain.pdh, Usage::PDH);
77
+ assert_eq!(chain.pek, Usage::PEK);
78
+ assert_eq!(chain.oca, Usage::OCA);
79
+ assert_eq!(chain.cek, Usage::CEK);
80
+
81
+ chain.verify().unwrap();
82
+ }
83
+
84
+ #[cfg(all(feature = "openssl", feature = "dangerous_hw_tests"))]
85
+ #[cfg_attr(not(host), ignore)]
86
+ #[test]
87
+ #[serial]
88
+ fn pek_cert_import() {
89
+ use sev::certs::sev::{sev::Certificate, Signer, Verifiable};
90
+
91
+ let mut fw = Firmware::open().unwrap();
92
+
93
+ let (mut oca, key) = Certificate::generate(Usage::OCA).unwrap();
94
+ key.sign(&mut oca).unwrap();
95
+
96
+ let mut pek = fw.pek_csr().unwrap();
97
+ key.sign(&mut pek).unwrap();
98
+
99
+ fw.pek_cert_import(&pek, &oca).unwrap();
100
+
101
+ let chain = fw.pdh_cert_export().unwrap();
102
+ assert_eq!(oca, chain.oca);
103
+ chain.verify().unwrap();
104
+
105
+ fw.platform_reset().unwrap();
106
+ }
107
+
108
+ #[cfg_attr(not(host), ignore)]
109
+ #[test]
110
+ fn get_identifier() {
111
+ let mut fw = Firmware::open().unwrap();
112
+ let id = fw.get_identifier().unwrap();
113
+ assert_ne!(Vec::from(id), vec![0u8; 64]);
114
+ }
115
+ }
116
+
117
+ #[cfg(all(feature = "snp", target_os = "linux"))]
118
+ mod snp {
119
+ use serial_test::serial;
120
+ use sev::firmware::host::{Config, Firmware, MaskId, SnpPlatformStatus, TcbVersion};
121
+
122
+ #[cfg_attr(not(host), ignore)]
123
+ #[test]
124
+ fn get_identifier() {
125
+ let mut fw = Firmware::open().unwrap();
126
+ let id = fw.get_identifier().unwrap();
127
+ assert_ne!(Vec::from(id), vec![0u8; 64]);
128
+ }
129
+
130
+ #[cfg_attr(not(host), ignore)]
131
+ #[test]
132
+ fn platform_status() {
133
+ let mut fw: Firmware = Firmware::open().unwrap();
134
+ let status: SnpPlatformStatus = fw.snp_platform_status().unwrap();
135
+
136
+ println!(
137
+ "Platform status ioctl results:
138
+ version (major, minor): {}.{}
139
+ build id: {}
140
+ guests: {}
141
+ platform tcb microcode version: {}
142
+ platform tcb snp version: {}
143
+ platform tcb tee version: {}
144
+ platform tcb bootloader version: {}
145
+ reported tcb microcode version: {}
146
+ reported tcb snp version: {}
147
+ reported tcb tee version: {}
148
+ reported tcb bootloader version: {}
149
+ state: {}",
150
+ status.version.major,
151
+ status.version.minor,
152
+ status.build_id,
153
+ status.guest_count,
154
+ status.platform_tcb_version.microcode,
155
+ status.platform_tcb_version.snp,
156
+ status.platform_tcb_version.tee,
157
+ status.platform_tcb_version.bootloader,
158
+ status.reported_tcb_version.microcode,
159
+ status.reported_tcb_version.snp,
160
+ status.reported_tcb_version.tee,
161
+ status.reported_tcb_version.bootloader,
162
+ status.state
163
+ );
164
+ }
165
+
166
+ #[cfg_attr(not(all(host, feature = "dangerous_hw_tests")), ignore)]
167
+ #[test]
168
+ #[serial]
169
+ fn commit_snp() {
170
+ let mut fw: Firmware = Firmware::open().unwrap();
171
+ fw.snp_commit().unwrap();
172
+ }
173
+
174
+ #[cfg_attr(not(all(host, feature = "dangerous_hw_tests")), ignore)]
175
+ #[test]
176
+ #[serial]
177
+ fn set_config() {
178
+ let mut fw: Firmware = Firmware::open().unwrap();
179
+ fw.snp_set_config(Config::default()).unwrap();
180
+ }
181
+
182
+ #[cfg_attr(not(all(host, feature = "dangerous_hw_tests")), ignore)]
183
+ #[test]
184
+ #[serial]
185
+ fn test_host_fw_error() {
186
+ let mut fw: Firmware = Firmware::open().unwrap();
187
+ let invalid_config = Config::new(TcbVersion::new(100, 100, 100, 100), MaskId(31));
188
+ let fw_error = fw.snp_set_config(invalid_config).unwrap_err().to_string();
189
+ assert_eq!(fw_error, "Firmware Error Encountered: Known SEV FW Error: Status Code: 0x16: Given parameter is invalid.")
190
+ }
191
+ }
@@ -0,0 +1,143 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+
3
+ #[cfg(feature = "sev")]
4
+ mod naples;
5
+
6
+ #[cfg(feature = "sev")]
7
+ mod rome;
8
+
9
+ #[cfg(all(feature = "openssl", feature = "sev"))]
10
+ mod sev {
11
+ use super::*;
12
+
13
+ #[test]
14
+ fn test_for_verify_false_positive() {
15
+ use ::sev::certs::sev::*;
16
+ use codicon::Decoder;
17
+
18
+ // https://github.com/enarx/enarx/issues/520
19
+ let naples_cek = sev::Certificate::decode(&mut &naples::CEK[..], ()).unwrap();
20
+ let rome_ask = ca::Certificate::decode(&mut &builtin::rome::ASK[..], ()).unwrap();
21
+ assert!((&rome_ask, &naples_cek).verify().is_err());
22
+ }
23
+ }
24
+
25
+ #[cfg(all(feature = "snp", any(feature = "openssl", feature = "crypto_nossl")))]
26
+ mod snp {
27
+ use sev::certs::snp::{builtin::milan, ca, Certificate, Chain, Verifiable};
28
+
29
+ const TEST_MILAN_VCEK_DER: &[u8] = include_bytes!("certs_data/vcek_milan.der");
30
+
31
+ #[cfg(feature = "openssl")]
32
+ const TEST_TURIN_VCEK_DER: &[u8] = include_bytes!("certs_data/vcek_turin.der");
33
+
34
+ const TEST_MILAN_ATTESTATION_REPORT: &[u8] = include_bytes!("certs_data/report_milan.hex");
35
+
36
+ #[cfg(feature = "openssl")]
37
+ const TEST_MILAN_CA: &[u8] = include_bytes!("certs_data/cert_chain_milan");
38
+
39
+ #[cfg(feature = "openssl")]
40
+ const TEST_TURIN_CA: &[u8] = include_bytes!("certs_data/cert_chain_turin");
41
+
42
+ #[test]
43
+ fn milan_chain() {
44
+ let ark = milan::ark().unwrap();
45
+ let ask = milan::ask().unwrap();
46
+ let vcek = Certificate::from_der(TEST_MILAN_VCEK_DER).unwrap();
47
+
48
+ let ca = ca::Chain { ark, ask };
49
+
50
+ let chain = Chain {
51
+ ca,
52
+ vek: vcek.clone(),
53
+ };
54
+
55
+ assert_eq!(chain.verify().ok(), Some(&vcek));
56
+ }
57
+
58
+ #[test]
59
+ fn milan_chain_invalid() {
60
+ let ark = milan::ark().unwrap();
61
+ let ask = milan::ask().unwrap();
62
+ let vcek = {
63
+ let mut buf = TEST_MILAN_VCEK_DER.to_vec();
64
+ buf[40] ^= 0xff;
65
+ Certificate::from_der(&buf).unwrap()
66
+ };
67
+
68
+ let ca = ca::Chain { ark, ask };
69
+
70
+ let chain = Chain { ca, vek: vcek };
71
+
72
+ assert_eq!(chain.verify().ok(), None);
73
+ }
74
+
75
+ #[test]
76
+ fn milan_report() {
77
+ use sev::firmware::guest::AttestationReport;
78
+
79
+ let ark = milan::ark().unwrap();
80
+ let ask = milan::ask().unwrap();
81
+ let vcek = Certificate::from_der(TEST_MILAN_VCEK_DER).unwrap();
82
+
83
+ let ca = ca::Chain { ark, ask };
84
+
85
+ let chain = Chain { ca, vek: vcek };
86
+
87
+ let report_bytes = hex::decode(TEST_MILAN_ATTESTATION_REPORT).unwrap();
88
+ let report: AttestationReport =
89
+ unsafe { std::ptr::read(report_bytes.as_ptr() as *const _) };
90
+
91
+ assert_eq!((&chain, &report).verify().ok(), Some(()));
92
+ }
93
+
94
+ #[test]
95
+ fn milan_report_invalid() {
96
+ use sev::firmware::guest::AttestationReport;
97
+
98
+ let ark = milan::ark().unwrap();
99
+ let ask = milan::ask().unwrap();
100
+ let vcek = Certificate::from_der(TEST_MILAN_VCEK_DER).unwrap();
101
+
102
+ let ca = ca::Chain { ark, ask };
103
+
104
+ let chain = Chain { ca, vek: vcek };
105
+
106
+ let mut report_bytes = hex::decode(TEST_MILAN_ATTESTATION_REPORT).unwrap();
107
+ report_bytes[0] ^= 0x80;
108
+ let report: AttestationReport =
109
+ unsafe { std::ptr::read(report_bytes.as_ptr() as *const _) };
110
+
111
+ assert_eq!((&chain, &report).verify().ok(), None);
112
+ }
113
+
114
+ #[cfg(feature = "openssl")]
115
+ #[test]
116
+ fn milan_ca_stack() {
117
+ let vcek = Certificate::from_der(TEST_MILAN_VCEK_DER).unwrap();
118
+
119
+ let ca = ca::Chain::from_pem_bytes(TEST_MILAN_CA).unwrap();
120
+
121
+ let chain = Chain {
122
+ ca,
123
+ vek: vcek.clone(),
124
+ };
125
+
126
+ assert_eq!(chain.verify().ok(), Some(&vcek));
127
+ }
128
+
129
+ #[cfg(feature = "openssl")]
130
+ #[test]
131
+ fn turin_ca_stack() {
132
+ let vcek = Certificate::from_der(TEST_TURIN_VCEK_DER).unwrap();
133
+
134
+ let ca = ca::Chain::from_pem_bytes(TEST_TURIN_CA).unwrap();
135
+
136
+ let chain = Chain {
137
+ ca,
138
+ vek: vcek.clone(),
139
+ };
140
+
141
+ assert_eq!(chain.verify().ok(), Some(&vcek));
142
+ }
143
+ }
@@ -0,0 +1,74 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ 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
37
+ -----END CERTIFICATE-----
38
+ -----BEGIN CERTIFICATE-----
39
+ MIIGYzCCBBKgAwIBAgIDAQAAMEYGCSqGSIb3DQEBCjA5oA8wDQYJYIZIAWUDBAIC
40
+ BQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAICBQCiAwIBMKMDAgEBMHsxFDAS
41
+ BgNVBAsMC0VuZ2luZWVyaW5nMQswCQYDVQQGEwJVUzEUMBIGA1UEBwwLU2FudGEg
42
+ Q2xhcmExCzAJBgNVBAgMAkNBMR8wHQYDVQQKDBZBZHZhbmNlZCBNaWNybyBEZXZp
43
+ Y2VzMRIwEAYDVQQDDAlBUkstTWlsYW4wHhcNMjAxMDIyMTcyMzA1WhcNNDUxMDIy
44
+ MTcyMzA1WjB7MRQwEgYDVQQLDAtFbmdpbmVlcmluZzELMAkGA1UEBhMCVVMxFDAS
45
+ BgNVBAcMC1NhbnRhIENsYXJhMQswCQYDVQQIDAJDQTEfMB0GA1UECgwWQWR2YW5j
46
+ ZWQgTWljcm8gRGV2aWNlczESMBAGA1UEAwwJQVJLLU1pbGFuMIICIjANBgkqhkiG
47
+ 9w0BAQEFAAOCAg8AMIICCgKCAgEA0Ld52RJOdeiJlqK2JdsVmD7FktuotWwX1fNg
48
+ W41XY9Xz1HEhSUmhLz9Cu9DHRlvgJSNxbeYYsnJfvyjx1MfU0V5tkKiU1EesNFta
49
+ 1kTA0szNisdYc9isqk7mXT5+KfGRbfc4V/9zRIcE8jlHN61S1ju8X93+6dxDUrG2
50
+ SzxqJ4BhqyYmUDruPXJSX4vUc01P7j98MpqOS95rORdGHeI52Naz5m2B+O+vjsC0
51
+ 60d37jY9LFeuOP4Meri8qgfi2S5kKqg/aF6aPtuAZQVR7u3KFYXP59XmJgtcog05
52
+ gmI0T/OitLhuzVvpZcLph0odh/1IPXqx3+MnjD97A7fXpqGd/y8KxX7jksTEzAOg
53
+ bKAeam3lm+3yKIcTYMlsRMXPcjNbIvmsBykD//xSniusuHBkgnlENEWx1UcbQQrs
54
+ +gVDkuVPhsnzIRNgYvM48Y+7LGiJYnrmE8xcrexekBxrva2V9TJQqnN3Q53kt5vi
55
+ Qi3+gCfmkwC0F0tirIZbLkXPrPwzZ0M9eNxhIySb2npJfgnqz55I0u33wh4r0ZNQ
56
+ eTGfw03MBUtyuzGesGkcw+loqMaq1qR4tjGbPYxCvpCq7+OgpCCoMNit2uLo9M18
57
+ fHz10lOMT8nWAUvRZFzteXCm+7PHdYPlmQwUw3LvenJ/ILXoQPHfbkH0CyPfhl1j
58
+ WhJFZasCAwEAAaN+MHwwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSFrBrRQ/fI
59
+ rFXUxR1BSKvVeErUUzAPBgNVHRMBAf8EBTADAQH/MDoGA1UdHwQzMDEwL6AtoCuG
60
+ KWh0dHBzOi8va2RzaW50Zi5hbWQuY29tL3ZjZWsvdjEvTWlsYW4vY3JsMEYGCSqG
61
+ SIb3DQEBCjA5oA8wDQYJYIZIAWUDBAICBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZI
62
+ AWUDBAICBQCiAwIBMKMDAgEBA4ICAQC6m0kDp6zv4Ojfgy+zleehsx6ol0ocgVel
63
+ ETobpx+EuCsqVFRPK1jZ1sp/lyd9+0fQ0r66n7kagRk4Ca39g66WGTJMeJdqYriw
64
+ STjjDCKVPSesWXYPVAyDhmP5n2v+BYipZWhpvqpaiO+EGK5IBP+578QeW/sSokrK
65
+ dHaLAxG2LhZxj9aF73fqC7OAJZ5aPonw4RE299FVarh1Tx2eT3wSgkDgutCTB1Yq
66
+ zT5DuwvAe+co2CIVIzMDamYuSFjPN0BCgojl7V+bTou7dMsqIu/TW/rPCX9/EUcp
67
+ KGKqPQ3P+N9r1hjEFY1plBg93t53OOo49GNI+V1zvXPLI6xIFVsh+mto2RtgEX/e
68
+ pmMKTNN6psW88qg7c1hTWtN6MbRuQ0vm+O+/2tKBF2h8THb94OvvHHoFDpbCELlq
69
+ HnIYhxy0YKXGyaW1NjfULxrrmxVW4wcn5E8GddmvNa6yYm8scJagEi13mhGu4Jqh
70
+ 3QU3sf8iUSUr09xQDwHtOQUVIqx4maBZPBtSMf+qUDtjXSSq8lfWcd8bLr9mdsUn
71
+ JZJ0+tuPMKmBnSH860llKk+VpVQsgqbzDIvOLvD6W1Umq25boxCYJ+TuBoa4s+HH
72
+ CViAvgT9kf/rBq1d+ivj6skkHxuzcxbk1xv6ZGxrteJxVH7KlX7YRdZ6eARKwLe4
73
+ AFZEAwoKCQ==
74
+ -----END CERTIFICATE-----
@@ -0,0 +1,74 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ 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
37
+ -----END CERTIFICATE-----
38
+ -----BEGIN CERTIFICATE-----
39
+ MIIGYzCCBBKgAwIBAgIDAwAAMEYGCSqGSIb3DQEBCjA5oA8wDQYJYIZIAWUDBAIC
40
+ BQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAICBQCiAwIBMKMDAgEBMHsxFDAS
41
+ BgNVBAsMC0VuZ2luZWVyaW5nMQswCQYDVQQGEwJVUzEUMBIGA1UEBwwLU2FudGEg
42
+ Q2xhcmExCzAJBgNVBAgMAkNBMR8wHQYDVQQKDBZBZHZhbmNlZCBNaWNybyBEZXZp
43
+ Y2VzMRIwEAYDVQQDDAlBUkstVHVyaW4wHhcNMjMwNTE1MjAwMzEyWhcNNDgwNTE1
44
+ MjAwMzEyWjB7MRQwEgYDVQQLDAtFbmdpbmVlcmluZzELMAkGA1UEBhMCVVMxFDAS
45
+ BgNVBAcMC1NhbnRhIENsYXJhMQswCQYDVQQIDAJDQTEfMB0GA1UECgwWQWR2YW5j
46
+ ZWQgTWljcm8gRGV2aWNlczESMBAGA1UEAwwJQVJLLVR1cmluMIICIjANBgkqhkiG
47
+ 9w0BAQEFAAOCAg8AMIICCgKCAgEAwaAriB7EIuVc4ZB1wD3YfDxL+9eyS7+izm0J
48
+ j3W772NINCWl8Bj3w/JD2ZjmbRxWdIq/4d9iarCKorXloJUB1jRdgxqccTx1aOoi
49
+ g4+2w1XhVVJT7K457wT5ZLNJgQaxqa9Etkwjd6+9sOhlCDE9l43kQ0R2BikVJa/u
50
+ yyVOSwEk5w5tXKOuG9jvq6QtAMJasW38wlqRDaKEGtZ9VUgGon27ZuL4sTJuC/az
51
+ z9/iQBw8kEilzOl95AiTkeY5jSEBDWbAqnZk5qlM7kISKG20kgQm14mhNKDI2p2o
52
+ ua+zuAG7i52epoRF2GfU0TYk/yf+vCNB2tnechFQuP2e8bLk95ZdqPi9/UWw4JXj
53
+ tdEA4u2JYplSSUPQVAXKt6LVqujtJcM59JKr2u0XQ75KwxcMp15gSXhBfInvPAwu
54
+ AY4dEwwGqT8oIg4esPHwEsmChhYeDIxPG9R4fx9O0q6p8Gb+HXlTiS47P9YNeOpi
55
+ dOUKzDl/S1OvyhDtSL8LJc24QATFydo/iD/KUdvFTRlD0crkAMkZLoWQ8hLDGc6B
56
+ ZJXsdd7Zf2e4UW3tI/1oh/2t23Ot3zyhTcv5gDbABu0LjVe98uRnS15SMwK//lJt
57
+ 9e5BqKvgABkSoABf+B4VFtPVEX0ygrYaFaI9i5ABrxnVBmzXpRb21iI1NlNCfOGU
58
+ PIhVpWECAwEAAaN+MHwwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRkoF9x4wwK
59
+ ZNg7deUBWZ4r7gYDRDAPBgNVHRMBAf8EBTADAQH/MDoGA1UdHwQzMDEwL6AtoCuG
60
+ KWh0dHBzOi8va2RzaW50Zi5hbWQuY29tL3ZjZWsvdjEvVHVyaW4vY3JsMEYGCSqG
61
+ SIb3DQEBCjA5oA8wDQYJYIZIAWUDBAICBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZI
62
+ AWUDBAICBQCiAwIBMKMDAgEBA4ICAQA/i6Mz4IETMK8YU/HxP7Bfej5i4aXhenJo
63
+ TuiDX0nqx5CDJm9ELhskxAkJ/oLA1O92UoLybfFk4gEpKFtyfiUYex9LogZj5ix0
64
+ sb2qfSSy9CRnOktGqfpel4e3KAhLgF5n2qZrqyq/8EPPldtSjEXn78sZMlIlUcQK
65
+ SnnNCQZVFpktDfDiEiGNuitux3ghHUrcVuxSbZcrXDbsbMF7NDdfLUUS9TijrL33
66
+ lrCXJs7m8kggGyCusiRQKHli1AEswiA4xU+8xsZrByYTopiGYtbJK8s0UCCXylyO
67
+ uKSubvdAnMDJ5GDD0+DX46LSfv7fgGNSG+LOBWdif7KoQf9cIhKJtxGxZCn/tvHm
68
+ wMzu4Jnx8N2vRnT+8DpBqhxtNvdXmrZUelSeQakx4djMKvmTR8Gd25EnC4RppCkj
69
+ bmPxY3zPd1X7raalTn34EOF9DeLsC9JfzkDuojxpHWMm30wKnDo20mlDQk/zKCDa
70
+ 2Zc+YjtsTZCrTbvdgCukTKNZOUUVlWRu+sO/OwrmS2p16seHTIqHEbE1LntPv3gk
71
+ CcHGDSUAKx9c0Aol+Dj9xpb2nmGqoDeJ59Ja6REkHCdw5TduXyqqMqfD1AX0/QDN
72
+ devCMKlWBRCQ7DFlog3H1a+r/kuMUZ/Ij9yyKlSgYZMJ4VgNKDgTQdcsAL0MCEMr
73
+ zpacMwFusA==
74
+ -----END CERTIFICATE-----
@@ -0,0 +1 @@
1
+ 0200000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000030000000000087301000000000000000000000000000000D447B55D197491BFE15CF298F9DE9986B7A7C4BE2468B4F6E2D53B71D7C645810B0F2CDFCA0040433BE063FC1A8293F0F3F8DAE7B79FECB3D1CD82BD6A93EBFD7A1E5C266C0108DBC9BB94FA926951320940915D0AAFB42464BD88B579EA158D3E1A0DC39B2C60BD95B9C480CD81841F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000092B3B47D59F0A2A10A74C5678868A80238CF593C01A82F3CFFB878E904C28D5BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0300000000000873000000000000000000000000000000000000000000000000D49554EC717F4E5B0FE6B143BCF0405BD7AE304727EDF46603F2A76AEF6A3ABC15D7AF38DB757039029F0EFACFD08E244324884738C72B082E2F87A44D541EB603000000000008730434010004340100030000000000087300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061AB4F11AA661997625F233DF42A4AD54440EEB7A96EA63DE170CBC29C37C005CB54054881EC7D2BEE569B02D07F8272000000000000000000000000000000000000000000000000209D7EB9BE919A1D0BAF1D57FE6EBFEABBC53B778C6E977E40B15CA931BB6D44C5AB9E30CFDC7346CB41AC083B90BF490000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
@@ -0,0 +1,56 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+
3
+ #![cfg(all(feature = "snp", target_os = "linux"))]
4
+
5
+ use sev::firmware::guest::*;
6
+
7
+ #[cfg_attr(not(guest), ignore)]
8
+ #[test]
9
+ fn get_report() {
10
+ let unique_data = [0u8; 64];
11
+
12
+ let mut fw = Firmware::open().unwrap();
13
+
14
+ fw.get_report(None, Some(unique_data), None).unwrap();
15
+ }
16
+
17
+ #[cfg_attr(not(guest), ignore)]
18
+ #[test]
19
+ fn get_ext_report() {
20
+ let unique_data = [0u8; 64];
21
+
22
+ let mut fw = Firmware::open().unwrap();
23
+
24
+ fw.get_ext_report(None, Some(unique_data), None).unwrap();
25
+ }
26
+
27
+ #[cfg_attr(not(guest), ignore)]
28
+ #[test]
29
+ fn get_derived_key() {
30
+ let derived_key = DerivedKey::new(false, GuestFieldSelect(1), 0, 0, 0);
31
+
32
+ let mut fw = Firmware::open().unwrap();
33
+
34
+ fw.get_derived_key(None, derived_key).unwrap();
35
+ }
36
+
37
+ #[cfg_attr(not(guest), ignore)]
38
+ #[test]
39
+ fn guest_fw_error() {
40
+ let derived_key = DerivedKey::new(
41
+ false,
42
+ GuestFieldSelect(48),
43
+ 0xFFFFFFFF,
44
+ 0xFFFFFFFF,
45
+ 0xFFFFFFFFFFFFFFFF,
46
+ );
47
+
48
+ let mut fw = Firmware::open().unwrap();
49
+
50
+ let fw_err = fw
51
+ .get_derived_key(None, derived_key)
52
+ .unwrap_err()
53
+ .to_string();
54
+
55
+ assert_eq!(fw_err, "Firmware Error Encountered: Known SEV FW Error: Status Code: 0x16: Given parameter is invalid.")
56
+ }