@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,28 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+
3
+ use super::*;
4
+
5
+ #[test]
6
+ fn decode() {
7
+ sev::Certificate::decode(&mut &PDH[..], ()).unwrap();
8
+ }
9
+
10
+ #[test]
11
+ fn encode() {
12
+ let pdh = sev::Certificate::decode(&mut &PDH[..], ()).unwrap();
13
+
14
+ let mut output = Vec::new();
15
+ pdh.encode(&mut output, ()).unwrap();
16
+ assert_eq!(PDH.len(), output.len());
17
+ assert_eq!(PDH.to_vec(), output);
18
+ }
19
+
20
+ #[cfg(feature = "openssl")]
21
+ #[test]
22
+ fn verify() {
23
+ let pek = sev::Certificate::decode(PEK, ()).unwrap();
24
+ let pdh = sev::Certificate::decode(PDH, ()).unwrap();
25
+
26
+ (&pek, &pdh).verify().unwrap();
27
+ assert!((&pdh, &pek).verify().is_err());
28
+ }
@@ -0,0 +1,32 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+
3
+ use super::*;
4
+
5
+ #[test]
6
+ fn decode() {
7
+ sev::Certificate::decode(&mut &PEK[..], ()).unwrap();
8
+ }
9
+
10
+ #[test]
11
+ fn encode() {
12
+ let pek = sev::Certificate::decode(&mut &PEK[..], ()).unwrap();
13
+
14
+ let mut output = Vec::new();
15
+ pek.encode(&mut output, ()).unwrap();
16
+ assert_eq!(PEK.len(), output.len());
17
+ assert_eq!(PEK.to_vec(), output);
18
+ }
19
+
20
+ #[cfg(feature = "openssl")]
21
+ #[test]
22
+ fn verify() {
23
+ let cek = sev::Certificate::decode(CEK, ()).unwrap();
24
+ let oca = sev::Certificate::decode(OCA, ()).unwrap();
25
+ let pek = sev::Certificate::decode(PEK, ()).unwrap();
26
+
27
+ (&cek, &pek).verify().unwrap();
28
+ assert!((&pek, &cek).verify().is_err());
29
+
30
+ (&oca, &pek).verify().unwrap();
31
+ assert!((&pek, &oca).verify().is_err());
32
+ }
@@ -0,0 +1,33 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+
3
+ use super::*;
4
+ use ::sev::certs::sev::builtin::rome::*;
5
+
6
+ #[test]
7
+ fn decode() {
8
+ ca::Certificate::decode(&mut &ARK[..], ()).unwrap();
9
+ }
10
+
11
+ #[test]
12
+ fn encode() {
13
+ let ark = ca::Certificate::decode(&mut &ARK[..], ()).unwrap();
14
+
15
+ let mut output = Vec::new();
16
+ ark.encode(&mut output, ()).unwrap();
17
+ assert_eq!(ARK.len(), output.len());
18
+ assert_eq!(ARK.to_vec(), output);
19
+
20
+ let ark = ca::Certificate::decode(&mut &ARK[..], ()).unwrap();
21
+
22
+ let mut output = Vec::new();
23
+ ark.encode(&mut output, ()).unwrap();
24
+ assert_eq!(ARK.len(), output.len());
25
+ assert_eq!(ARK.to_vec(), output);
26
+ }
27
+
28
+ #[cfg(feature = "openssl")]
29
+ #[test]
30
+ fn verify() {
31
+ let ark = ca::Certificate::decode(&mut &ARK[..], ()).unwrap();
32
+ (&ark, &ark).verify().unwrap();
33
+ }
@@ -0,0 +1,29 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+
3
+ use super::*;
4
+ use ::sev::certs::sev::builtin::rome::*;
5
+
6
+ #[test]
7
+ fn decode() {
8
+ ca::Certificate::decode(&mut &ASK[..], ()).unwrap();
9
+ }
10
+
11
+ #[test]
12
+ fn encode() {
13
+ let ask = ca::Certificate::decode(&mut &ASK[..], ()).unwrap();
14
+
15
+ let mut output = Vec::new();
16
+ ask.encode(&mut output, ()).unwrap();
17
+ assert_eq!(ASK.len(), output.len());
18
+ assert_eq!(ASK.to_vec(), output);
19
+ }
20
+
21
+ #[cfg(feature = "openssl")]
22
+ #[test]
23
+ fn verify() {
24
+ let ark = ca::Certificate::decode(ARK, ()).unwrap();
25
+ let ask = ca::Certificate::decode(ASK, ()).unwrap();
26
+
27
+ (&ark, &ask).verify().unwrap();
28
+ assert!((&ask, &ark).verify().is_err());
29
+ }
@@ -0,0 +1,29 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+
3
+ use super::*;
4
+
5
+ #[test]
6
+ fn decode() {
7
+ sev::Certificate::decode(&mut &CEK[..], ()).unwrap();
8
+ }
9
+
10
+ #[test]
11
+ fn encode() {
12
+ let cek = sev::Certificate::decode(&mut &CEK[..], ()).unwrap();
13
+
14
+ let mut output = Vec::new();
15
+ cek.encode(&mut output, ()).unwrap();
16
+ assert_eq!(CEK.len(), output.len());
17
+ assert_eq!(CEK.to_vec(), output);
18
+ }
19
+
20
+ #[cfg(feature = "openssl")]
21
+ #[test]
22
+ fn verify() {
23
+ use ::sev::certs::sev::builtin::rome::ASK;
24
+
25
+ let ask = ca::Certificate::decode(ASK, ()).unwrap();
26
+ let cek = sev::Certificate::decode(CEK, ()).unwrap();
27
+
28
+ (&ask, &cek).verify().unwrap();
29
+ }
@@ -0,0 +1,16 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+
3
+ mod ark;
4
+ mod ask;
5
+ mod cek;
6
+ mod oca;
7
+ mod pdh;
8
+ mod pek;
9
+
10
+ const OCA: &[u8] = include_bytes!("oca.cert");
11
+ const CEK: &[u8] = include_bytes!("cek.cert");
12
+ const PEK: &[u8] = include_bytes!("pek.cert");
13
+ const PDH: &[u8] = include_bytes!("pdh.cert");
14
+
15
+ use ::sev::certs::sev::*;
16
+ use codicon::{Decoder, Encoder};
@@ -0,0 +1,45 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+
3
+ use super::*;
4
+
5
+ #[test]
6
+ fn decode() {
7
+ sev::Certificate::decode(&mut &OCA[..], ()).unwrap();
8
+ }
9
+
10
+ #[test]
11
+ fn encode() {
12
+ let oca = sev::Certificate::decode(&mut &OCA[..], ()).unwrap();
13
+
14
+ let mut output = Vec::new();
15
+ oca.encode(&mut output, ()).unwrap();
16
+ assert_eq!(OCA.len(), output.len());
17
+ assert_eq!(OCA.to_vec(), output);
18
+ }
19
+
20
+ #[cfg(feature = "openssl")]
21
+ #[test]
22
+ fn verify() {
23
+ let oca = sev::Certificate::decode(OCA, ()).unwrap();
24
+ (&oca, &oca).verify().unwrap();
25
+ }
26
+
27
+ #[cfg(feature = "openssl")]
28
+ #[test]
29
+ fn create() {
30
+ let mut pdh = sev::Certificate::decode(&mut &PDH[..], ()).unwrap();
31
+ let (mut oca, key) = sev::Certificate::generate(sev::Usage::OCA).unwrap();
32
+
33
+ assert!((&pdh, &pdh).verify().is_err());
34
+ assert!((&oca, &pdh).verify().is_err());
35
+ assert!((&oca, &oca).verify().is_err());
36
+
37
+ key.sign(&mut oca).unwrap();
38
+
39
+ assert!((&pdh, &pdh).verify().is_err());
40
+ assert!((&oca, &pdh).verify().is_err());
41
+ (&oca, &oca).verify().unwrap();
42
+
43
+ key.sign(&mut pdh).unwrap();
44
+ (&oca, &pdh).verify().unwrap();
45
+ }
@@ -0,0 +1,28 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+
3
+ use super::*;
4
+
5
+ #[test]
6
+ fn decode() {
7
+ sev::Certificate::decode(&mut &PDH[..], ()).unwrap();
8
+ }
9
+
10
+ #[test]
11
+ fn encode() {
12
+ let pdh = sev::Certificate::decode(&mut &PDH[..], ()).unwrap();
13
+
14
+ let mut output = Vec::new();
15
+ pdh.encode(&mut output, ()).unwrap();
16
+ assert_eq!(PDH.len(), output.len());
17
+ assert_eq!(PDH.to_vec(), output);
18
+ }
19
+
20
+ #[cfg(feature = "openssl")]
21
+ #[test]
22
+ fn verify() {
23
+ let pek = sev::Certificate::decode(PEK, ()).unwrap();
24
+ let pdh = sev::Certificate::decode(PDH, ()).unwrap();
25
+
26
+ (&pek, &pdh).verify().unwrap();
27
+ assert!((&pdh, &pek).verify().is_err());
28
+ }
@@ -0,0 +1,32 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+
3
+ use super::*;
4
+
5
+ #[test]
6
+ fn decode() {
7
+ sev::Certificate::decode(&mut &PEK[..], ()).unwrap();
8
+ }
9
+
10
+ #[test]
11
+ fn encode() {
12
+ let pek = sev::Certificate::decode(&mut &PEK[..], ()).unwrap();
13
+
14
+ let mut output = Vec::new();
15
+ pek.encode(&mut output, ()).unwrap();
16
+ assert_eq!(PEK.len(), output.len());
17
+ assert_eq!(PEK.to_vec(), output);
18
+ }
19
+
20
+ #[cfg(feature = "openssl")]
21
+ #[test]
22
+ fn verify() {
23
+ let cek = sev::Certificate::decode(CEK, ()).unwrap();
24
+ let oca = sev::Certificate::decode(OCA, ()).unwrap();
25
+ let pek = sev::Certificate::decode(PEK, ()).unwrap();
26
+
27
+ (&cek, &pek).verify().unwrap();
28
+ assert!((&pek, &cek).verify().is_err());
29
+
30
+ (&oca, &pek).verify().unwrap();
31
+ assert!((&pek, &oca).verify().is_err());
32
+ }
@@ -0,0 +1,39 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+
3
+ #![cfg(feature = "openssl")]
4
+
5
+ #[cfg(all(target_os = "linux", feature = "sev"))]
6
+ mod initialized {
7
+ use ::sev::{certs::sev::builtin::naples::*, certs::sev::*, launch, session::Session};
8
+ use codicon::Decoder;
9
+ use std::convert::*;
10
+
11
+ #[test]
12
+ fn create() {
13
+ Session::try_from(launch::sev::Policy::default()).unwrap();
14
+ }
15
+
16
+ #[test]
17
+ fn start() {
18
+ const CEK: &[u8] = include_bytes!("naples/cek.cert");
19
+ const OCA: &[u8] = include_bytes!("naples/oca.cert");
20
+ const PEK: &[u8] = include_bytes!("naples/pek.cert");
21
+ const PDH: &[u8] = include_bytes!("naples/pdh.cert");
22
+
23
+ let session = Session::try_from(launch::sev::Policy::default()).unwrap();
24
+ session
25
+ .start(Chain {
26
+ ca: ca::Chain {
27
+ ark: ca::Certificate::decode(&mut &ARK[..], ()).unwrap(),
28
+ ask: ca::Certificate::decode(&mut &ASK[..], ()).unwrap(),
29
+ },
30
+ sev: sev::Chain {
31
+ cek: sev::Certificate::decode(&mut &CEK[..], ()).unwrap(),
32
+ oca: sev::Certificate::decode(&mut &OCA[..], ()).unwrap(),
33
+ pek: sev::Certificate::decode(&mut &PEK[..], ()).unwrap(),
34
+ pdh: sev::Certificate::decode(&mut &PDH[..], ()).unwrap(),
35
+ },
36
+ })
37
+ .unwrap();
38
+ }
39
+ }
@@ -0,0 +1,120 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+
3
+ #![cfg(all(
4
+ feature = "openssl",
5
+ target_os = "linux",
6
+ feature = "sev",
7
+ feature = "dangerous_hw_tests"
8
+ ))]
9
+
10
+ use kvm_bindings::kvm_userspace_memory_region;
11
+ use kvm_ioctls::{Kvm, VcpuExit};
12
+ use serial_test::serial;
13
+ use sev::certs::sev::sev::Usage;
14
+ use sev::certs::sev::{sev::Certificate, Signer};
15
+ use sev::{cached_chain, firmware::host::Firmware, launch::sev::*, session::Session};
16
+ use std::slice::from_raw_parts;
17
+ use std::{convert::TryFrom, os::unix::io::AsRawFd};
18
+
19
+ // Has to be a multiple of 16
20
+ const CODE: &[u8; 16] = &[
21
+ 0xf4; 16 // hlt
22
+ ];
23
+
24
+ #[cfg_attr(not(host), ignore)]
25
+ #[test]
26
+ #[serial]
27
+ fn sev_launch_test() {
28
+ // KVM SEV type
29
+ const KVM_X86_SEV_VM: u64 = 2;
30
+
31
+ let mut sev = Firmware::open().unwrap();
32
+ let build = sev.platform_status().unwrap().build;
33
+
34
+ // Generating OCA cert and private key
35
+ let (mut oca, prv) = Certificate::generate(Usage::OCA).expect("Generating OCA key pair");
36
+ prv.sign(&mut oca).expect("OCA key signing");
37
+
38
+ // Provisioning the PEK with the generated OCA key pair
39
+ let mut pek = sev.pek_csr().expect("Cross signing request");
40
+ prv.sign(&mut pek).expect("Sign PEK with OCA private key");
41
+ sev.pek_cert_import(&pek, &oca)
42
+ .expect("Import the newly-signed PEK");
43
+
44
+ // Export the full chain to launch SEV guest
45
+ let chain = cached_chain::get_chain();
46
+
47
+ let policy = Policy::default();
48
+ let session = Session::try_from(policy).unwrap();
49
+ let start = session.start(chain).unwrap();
50
+
51
+ let kvm = Kvm::new().unwrap();
52
+
53
+ // Create VMft with SEV type
54
+ let vm = kvm.create_vm_with_type(KVM_X86_SEV_VM).unwrap();
55
+
56
+ // Allocate a 1kB page of memory for the address space of the VM.
57
+ const MEM_SIZE: usize = 0x1000;
58
+ let address_space = unsafe { libc::mmap(0 as _, MEM_SIZE, 3, 34, -1, 0) };
59
+
60
+ if address_space == libc::MAP_FAILED {
61
+ panic!("mmap() failed");
62
+ }
63
+
64
+ let address_space: &[u8] = unsafe { from_raw_parts(address_space as *mut u8, MEM_SIZE) };
65
+
66
+ let mem_region = kvm_userspace_memory_region {
67
+ slot: 0,
68
+ guest_phys_addr: 0,
69
+ memory_size: MEM_SIZE as _,
70
+ userspace_addr: address_space.as_ptr() as _,
71
+ flags: 0,
72
+ };
73
+
74
+ unsafe {
75
+ vm.set_user_memory_region(mem_region).unwrap();
76
+ }
77
+
78
+ let mut session = session.measure().unwrap();
79
+ session.update_data(address_space.as_ref()).unwrap();
80
+
81
+ let (mut launcher, measurement) = {
82
+ let launcher = Launcher::new(vm.as_raw_fd(), sev.as_raw_fd()).unwrap();
83
+ let mut launcher = launcher.start(start).unwrap();
84
+ launcher.update_data(address_space.as_ref()).unwrap();
85
+ let launcher = launcher.measure().unwrap();
86
+ let measurement = launcher.measurement();
87
+ (launcher, measurement)
88
+ };
89
+
90
+ let session = session.verify(build, measurement).unwrap();
91
+ let secret = session.secret(HeaderFlags::default(), CODE).unwrap();
92
+
93
+ launcher
94
+ .inject(&secret, address_space.as_ptr() as usize)
95
+ .unwrap();
96
+
97
+ let _handle = launcher.finish().unwrap();
98
+
99
+ let mut vcpu = vm.create_vcpu(0).unwrap();
100
+ let mut sregs = vcpu.get_sregs().unwrap();
101
+ sregs.cs.base = 0;
102
+ sregs.cs.selector = 0;
103
+ vcpu.set_sregs(&sregs).unwrap();
104
+
105
+ let mut regs = vcpu.get_regs().unwrap();
106
+ regs.rip = std::ptr::null::<u64>() as u64;
107
+ regs.rflags = 2;
108
+ vcpu.set_regs(&regs).unwrap();
109
+
110
+ match vcpu.run().unwrap() {
111
+ VcpuExit::Hlt => (),
112
+ exit_reason => panic!("unexpected exit reason: {:?}", exit_reason),
113
+ }
114
+
115
+ drop(vcpu);
116
+ drop(vm);
117
+
118
+ sev.platform_reset().unwrap();
119
+ cached_chain::rm_cached_chain();
120
+ }
@@ -0,0 +1,108 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+
3
+ #![cfg(all(feature = "snp", target_os = "linux"))]
4
+
5
+ use kvm_bindings::{kvm_create_guest_memfd, kvm_userspace_memory_region2, KVM_MEM_GUEST_MEMFD};
6
+ use kvm_ioctls::{Kvm, VcpuExit};
7
+ use sev::firmware::{guest::GuestPolicy, host::Firmware};
8
+ use sev::launch::snp::*;
9
+ use std::os::fd::RawFd;
10
+ use std::slice::from_raw_parts_mut;
11
+
12
+ // one page of `hlt
13
+ const CODE: &[u8; 4096] = &[
14
+ 0xf4; 4096 // hlt
15
+ ];
16
+
17
+ const KVM_X86_SNP_VM: u64 = 4;
18
+
19
+ #[cfg_attr(not(host), ignore)]
20
+ #[test]
21
+ fn snp_launch_test() {
22
+ let kvm_fd = Kvm::new().unwrap();
23
+
24
+ // Create VM-fd with SEV-SNP type
25
+ let vm_fd = kvm_fd.create_vm_with_type(KVM_X86_SNP_VM).unwrap();
26
+
27
+ const MEM_ADDR: u64 = 0x1000;
28
+
29
+ // Allocate a 1kB page of memory for the address space of the VM.
30
+ let address_space = unsafe { libc::mmap(0 as _, CODE.len(), 3, 34, -1, 0) };
31
+
32
+ if address_space == libc::MAP_FAILED {
33
+ panic!("mmap() failed");
34
+ }
35
+
36
+ let address_space: &mut [u8] =
37
+ unsafe { from_raw_parts_mut(address_space as *mut u8, CODE.len()) };
38
+
39
+ address_space[..CODE.len()].copy_from_slice(&CODE[..]);
40
+
41
+ let userspace_addr = address_space as *const [u8] as *const u8 as u64;
42
+
43
+ // Create KVM guest_memfd struct
44
+ let gmem = kvm_create_guest_memfd {
45
+ size: 0x1000,
46
+ flags: 0,
47
+ reserved: [0; 6],
48
+ };
49
+
50
+ // Create KVM guest_memfd
51
+ let fd: RawFd = vm_fd.create_guest_memfd(gmem).unwrap();
52
+
53
+ // Create memory region
54
+ let mem_region = kvm_userspace_memory_region2 {
55
+ slot: 0,
56
+ flags: KVM_MEM_GUEST_MEMFD,
57
+ guest_phys_addr: 0x1000_u64,
58
+ memory_size: 0x1000_u64,
59
+ userspace_addr,
60
+ guest_memfd_offset: 0,
61
+ guest_memfd: fd as u32,
62
+ pad1: 0,
63
+ pad2: [0; 14],
64
+ };
65
+
66
+ unsafe {
67
+ vm_fd.set_user_memory_region2(mem_region).unwrap();
68
+ };
69
+
70
+ let sev = Firmware::open().unwrap();
71
+ let launcher = Launcher::new(vm_fd, sev).unwrap();
72
+
73
+ let mut policy = GuestPolicy(0);
74
+ policy.set_smt_allowed(1);
75
+ let start = Start::new(policy, [0; 16]);
76
+
77
+ let mut launcher = launcher.start(start).unwrap();
78
+
79
+ let update = Update::new(
80
+ mem_region.guest_phys_addr >> 12,
81
+ address_space,
82
+ PageType::Normal,
83
+ );
84
+
85
+ launcher
86
+ .update_data(update, mem_region.guest_phys_addr, mem_region.memory_size)
87
+ .unwrap();
88
+
89
+ let finish = Finish::new(None, None, [0u8; 32]);
90
+
91
+ let mut vcpu_fd = launcher.as_mut().create_vcpu(0).unwrap();
92
+
93
+ let mut regs = vcpu_fd.get_regs().unwrap();
94
+ regs.rip = MEM_ADDR;
95
+ regs.rflags = 2;
96
+ vcpu_fd.set_regs(&regs).unwrap();
97
+
98
+ let mut sregs = vcpu_fd.get_sregs().unwrap();
99
+ sregs.cs.base = 0;
100
+ sregs.cs.selector = 0;
101
+ vcpu_fd.set_sregs(&sregs).unwrap();
102
+
103
+ let (_vm_fd, _sev) = launcher.finish(finish).unwrap();
104
+
105
+ let ret = vcpu_fd.run();
106
+
107
+ assert!(matches!(ret, Ok(VcpuExit::Hlt)));
108
+ }
Binary file
Binary file
@@ -97,6 +97,7 @@ export declare class SevSNP {
97
97
  trustedHashes?: ArkHashes;
98
98
  timeoutMs?: number;
99
99
  snpGuestBinaryPath?: string;
100
+ tmpDir?: string;
100
101
  }): Promise<void>;
101
102
  protected static calcMrEnclave(measure: Buffer, vmpl: number, policy: bigint): Buffer;
102
103
  /**