/src/spdm-rs/fuzz-target/requester/finish_req/src/main.rs
Line | Count | Source |
1 | | // Copyright (c) 2020 Intel Corporation |
2 | | // |
3 | | // SPDX-License-Identifier: Apache-2.0 or MIT |
4 | | |
5 | | use fuzzlib::{ |
6 | | spdmlib::{ |
7 | | common::session::{SpdmSession, SpdmSessionState}, |
8 | | message::SpdmKeyExchangeMutAuthAttributes, |
9 | | }, |
10 | | *, |
11 | | }; |
12 | | use spdmlib::protocol::*; |
13 | | use spin::Mutex; |
14 | | extern crate alloc; |
15 | | use alloc::sync::Arc; |
16 | | |
17 | 36 | async fn fuzz_send_receive_spdm_finish(fuzzdata: Arc<Vec<u8>>) { |
18 | 0 | spdmlib::secret::asym_sign::register(SECRET_ASYM_IMPL_INSTANCE.clone()); |
19 | 0 | spdmlib::secret::pqc_asym_sign::register(SECRET_PQC_ASYM_IMPL_INSTANCE.clone()); |
20 | 0 | spdmlib::crypto::aead::register(FAKE_AEAD.clone()); |
21 | 0 | spdmlib::crypto::hmac::register(FAKE_HMAC.clone()); |
22 | 0 | spdmlib::crypto::hkdf::register(FAKE_HKDF.clone()); |
23 | | |
24 | | // TCD: |
25 | | // - id: 0 |
26 | | // - title: 'Fuzz SPDM handle finish response' |
27 | | // - description: '<p>Request finish to complete the handshake, and the handshake is performed in the clear.</p>' |
28 | | // - |
29 | | { |
30 | 0 | let (req_config_info, req_provision_info) = req_create_info(); |
31 | | |
32 | 0 | let shared_buffer = SharedBuffer::new(); |
33 | 0 | let pcidoe_transport_encap = Arc::new(Mutex::new(PciDoeTransportEncap {})); |
34 | 0 | let mut device_io_requester = |
35 | 0 | fake_device_io::FakeSpdmDeviceIo::new(Arc::new(shared_buffer)); |
36 | 0 | device_io_requester.set_rx(&fuzzdata); |
37 | 0 | let device_io_requester = Arc::new(Mutex::new(device_io_requester)); |
38 | | |
39 | 0 | let mut requester = requester::RequesterContext::new( |
40 | 0 | device_io_requester, |
41 | 0 | pcidoe_transport_encap, |
42 | 0 | req_config_info, |
43 | 0 | req_provision_info, |
44 | | ); |
45 | 0 | requester.common.negotiate_info.spdm_version_sel = SpdmVersion::SpdmVersion12; |
46 | 0 | requester.common.negotiate_info.req_ct_exponent_sel = 0; |
47 | 0 | requester.common.negotiate_info.req_capabilities_sel = SpdmRequestCapabilityFlags::CERT_CAP |
48 | 0 | | SpdmRequestCapabilityFlags::HANDSHAKE_IN_THE_CLEAR_CAP; |
49 | 0 | requester.common.negotiate_info.rsp_ct_exponent_sel = 0; |
50 | 0 | requester.common.negotiate_info.rsp_capabilities_sel = SpdmResponseCapabilityFlags::CERT_CAP |
51 | 0 | | SpdmResponseCapabilityFlags::HANDSHAKE_IN_THE_CLEAR_CAP; |
52 | | |
53 | 0 | requester.common.negotiate_info.base_hash_sel = SpdmBaseHashAlgo::TPM_ALG_SHA_384; |
54 | 0 | requester.common.negotiate_info.base_asym_sel = |
55 | 0 | SpdmBaseAsymAlgo::TPM_ALG_ECDSA_ECC_NIST_P384; |
56 | 0 | requester.common.negotiate_info.dhe_sel = SpdmDheAlgo::SECP_384_R1; |
57 | 0 | requester.common.negotiate_info.aead_sel = SpdmAeadAlgo::AES_256_GCM; |
58 | 0 | requester.common.negotiate_info.req_asym_sel = SpdmReqAsymAlgo::TPM_ALG_RSAPSS_2048; |
59 | 0 | requester.common.negotiate_info.key_schedule_sel = SpdmKeyScheduleAlgo::SPDM_KEY_SCHEDULE; |
60 | | |
61 | 0 | requester.common.reset_runtime_info(); |
62 | | |
63 | 0 | requester.common.session[0] = SpdmSession::new(); |
64 | 0 | requester.common.session[0].setup(4294836221).unwrap(); |
65 | 0 | requester.common.session[0].set_crypto_param( |
66 | | SpdmBaseHashAlgo::TPM_ALG_SHA_384, |
67 | | SpdmDheAlgo::SECP_384_R1, |
68 | 0 | SpdmKemAlgo::empty(), |
69 | | SpdmAeadAlgo::AES_256_GCM, |
70 | | SpdmKeyScheduleAlgo::SPDM_KEY_SCHEDULE, |
71 | | ); |
72 | | |
73 | | #[cfg(feature = "hashed-transcript-data")] |
74 | 0 | { |
75 | 0 | let mut shared_secret = SpdmSharedSecretFinalKeyStruct::default(); |
76 | 0 | shared_secret.data_size = SpdmDheAlgo::SECP_384_R1.get_key_size(); |
77 | 0 | requester.common.session[0] |
78 | 0 | .set_shared_secret(SpdmVersion::SpdmVersion12, shared_secret) |
79 | 0 | .unwrap(); |
80 | 0 | requester.common.session[0].runtime_info.digest_context_th = |
81 | 0 | spdmlib::crypto::hash::hash_ctx_init(SpdmBaseHashAlgo::TPM_ALG_SHA_384); |
82 | 0 | } |
83 | | |
84 | 0 | requester.common.session[0].set_session_state(SpdmSessionState::SpdmSessionHandshaking); |
85 | | |
86 | 0 | let _ = requester.send_receive_spdm_finish(None, 4294836221).await; |
87 | | } |
88 | | // TCD: |
89 | | // - id: 0 |
90 | | // - title: 'Fuzz SPDM handle finish response' |
91 | | // - description: '<p>Request finish to complete the handshake, and the handshake messages are secured.</p>' |
92 | | // - |
93 | | { |
94 | 0 | let (req_config_info, req_provision_info) = req_create_info(); |
95 | | |
96 | 0 | let shared_buffer = SharedBuffer::new(); |
97 | 0 | let pcidoe_transport_encap = Arc::new(Mutex::new(PciDoeTransportEncap {})); |
98 | 0 | let mut device_io_requester = |
99 | 0 | fake_device_io::FakeSpdmDeviceIo::new(Arc::new(shared_buffer)); |
100 | 0 | device_io_requester.set_rx(&fuzzdata); |
101 | 0 | let device_io_requester = Arc::new(Mutex::new(device_io_requester)); |
102 | | |
103 | 0 | let mut requester = requester::RequesterContext::new( |
104 | 0 | device_io_requester, |
105 | 0 | pcidoe_transport_encap, |
106 | 0 | req_config_info, |
107 | 0 | req_provision_info, |
108 | | ); |
109 | 0 | requester.common.negotiate_info.spdm_version_sel = SpdmVersion::SpdmVersion12; |
110 | 0 | requester.common.negotiate_info.req_ct_exponent_sel = 0; |
111 | 0 | requester.common.negotiate_info.req_capabilities_sel = |
112 | 0 | SpdmRequestCapabilityFlags::CERT_CAP | SpdmRequestCapabilityFlags::KEY_UPD_CAP; |
113 | 0 | requester.common.negotiate_info.rsp_ct_exponent_sel = 0; |
114 | 0 | requester.common.negotiate_info.rsp_capabilities_sel = |
115 | 0 | SpdmResponseCapabilityFlags::CERT_CAP | SpdmResponseCapabilityFlags::KEY_UPD_CAP; |
116 | | |
117 | 0 | requester.common.negotiate_info.base_hash_sel = SpdmBaseHashAlgo::TPM_ALG_SHA_384; |
118 | 0 | requester.common.negotiate_info.base_asym_sel = |
119 | 0 | SpdmBaseAsymAlgo::TPM_ALG_ECDSA_ECC_NIST_P384; |
120 | 0 | requester.common.negotiate_info.dhe_sel = SpdmDheAlgo::SECP_384_R1; |
121 | 0 | requester.common.negotiate_info.aead_sel = SpdmAeadAlgo::AES_256_GCM; |
122 | 0 | requester.common.negotiate_info.req_asym_sel = SpdmReqAsymAlgo::TPM_ALG_RSAPSS_2048; |
123 | 0 | requester.common.negotiate_info.key_schedule_sel = SpdmKeyScheduleAlgo::SPDM_KEY_SCHEDULE; |
124 | | |
125 | 0 | requester.common.reset_runtime_info(); |
126 | | |
127 | 0 | requester.common.session[0] = SpdmSession::new(); |
128 | 0 | requester.common.session[0].setup(4294836221).unwrap(); |
129 | 0 | requester.common.session[0].set_crypto_param( |
130 | | SpdmBaseHashAlgo::TPM_ALG_SHA_384, |
131 | | SpdmDheAlgo::SECP_384_R1, |
132 | 0 | SpdmKemAlgo::empty(), |
133 | | SpdmAeadAlgo::AES_256_GCM, |
134 | | SpdmKeyScheduleAlgo::SPDM_KEY_SCHEDULE, |
135 | | ); |
136 | | |
137 | | #[cfg(feature = "hashed-transcript-data")] |
138 | 0 | { |
139 | 0 | let mut shared_secret = SpdmSharedSecretFinalKeyStruct::default(); |
140 | 0 | shared_secret.data_size = SpdmDheAlgo::SECP_384_R1.get_key_size(); |
141 | 0 | requester.common.session[0] |
142 | 0 | .set_shared_secret(SpdmVersion::SpdmVersion12, shared_secret) |
143 | 0 | .unwrap(); |
144 | 0 | requester.common.session[0].runtime_info.digest_context_th = |
145 | 0 | spdmlib::crypto::hash::hash_ctx_init(SpdmBaseHashAlgo::TPM_ALG_SHA_384); |
146 | 0 | } |
147 | | |
148 | 0 | requester.common.session[0].set_session_state(SpdmSessionState::SpdmSessionHandshaking); |
149 | | |
150 | 0 | let _ = requester.send_receive_spdm_finish(None, 4294836221).await; |
151 | | } |
152 | | // TCD: |
153 | | // - id: 0 |
154 | | // - title: 'Fuzz SPDM handle finish response' |
155 | | // - description: '<p>Request finish to complete the handshake with mut auth requested.</p>' |
156 | | // - |
157 | | { |
158 | 0 | let (req_config_info, req_provision_info) = req_create_info(); |
159 | | |
160 | 0 | let shared_buffer = SharedBuffer::new(); |
161 | 0 | let pcidoe_transport_encap = Arc::new(Mutex::new(PciDoeTransportEncap {})); |
162 | 0 | let mut device_io_requester = |
163 | 0 | fake_device_io::FakeSpdmDeviceIo::new(Arc::new(shared_buffer)); |
164 | 0 | device_io_requester.set_rx(&fuzzdata); |
165 | 0 | let device_io_requester = Arc::new(Mutex::new(device_io_requester)); |
166 | | |
167 | 0 | let mut requester = requester::RequesterContext::new( |
168 | 0 | device_io_requester, |
169 | 0 | pcidoe_transport_encap, |
170 | 0 | req_config_info, |
171 | 0 | req_provision_info, |
172 | | ); |
173 | 0 | requester.common.negotiate_info.spdm_version_sel = SpdmVersion::SpdmVersion12; |
174 | 0 | requester.common.negotiate_info.req_ct_exponent_sel = 0; |
175 | 0 | requester.common.negotiate_info.req_capabilities_sel = |
176 | 0 | SpdmRequestCapabilityFlags::CERT_CAP | SpdmRequestCapabilityFlags::KEY_UPD_CAP; |
177 | 0 | requester.common.negotiate_info.rsp_ct_exponent_sel = 0; |
178 | 0 | requester.common.negotiate_info.rsp_capabilities_sel = |
179 | 0 | SpdmResponseCapabilityFlags::CERT_CAP | SpdmResponseCapabilityFlags::KEY_UPD_CAP; |
180 | | |
181 | 0 | requester.common.negotiate_info.base_hash_sel = SpdmBaseHashAlgo::TPM_ALG_SHA_384; |
182 | 0 | requester.common.negotiate_info.base_asym_sel = |
183 | 0 | SpdmBaseAsymAlgo::TPM_ALG_ECDSA_ECC_NIST_P384; |
184 | 0 | requester.common.negotiate_info.dhe_sel = SpdmDheAlgo::SECP_384_R1; |
185 | 0 | requester.common.negotiate_info.aead_sel = SpdmAeadAlgo::AES_256_GCM; |
186 | 0 | requester.common.negotiate_info.req_asym_sel = SpdmReqAsymAlgo::TPM_ALG_ECDSA_ECC_NIST_P384; |
187 | 0 | requester.common.negotiate_info.key_schedule_sel = SpdmKeyScheduleAlgo::SPDM_KEY_SCHEDULE; |
188 | 0 | requester.common.peer_info.peer_cert_chain[0] = Some(get_rsp_cert_chain_buff()); |
189 | 0 | requester.common.provision_info.my_cert_chain = [ |
190 | 0 | Some(get_rsp_cert_chain_buff()), |
191 | 0 | None, |
192 | 0 | None, |
193 | 0 | None, |
194 | 0 | None, |
195 | 0 | None, |
196 | 0 | None, |
197 | 0 | None, |
198 | 0 | ]; |
199 | | |
200 | 0 | requester.common.reset_runtime_info(); |
201 | | |
202 | 0 | requester.common.session[0] = SpdmSession::new(); |
203 | 0 | requester.common.session[0].setup(4294836221).unwrap(); |
204 | 0 | requester.common.session[0].set_crypto_param( |
205 | | SpdmBaseHashAlgo::TPM_ALG_SHA_384, |
206 | | SpdmDheAlgo::SECP_384_R1, |
207 | 0 | SpdmKemAlgo::empty(), |
208 | | SpdmAeadAlgo::AES_256_GCM, |
209 | | SpdmKeyScheduleAlgo::SPDM_KEY_SCHEDULE, |
210 | | ); |
211 | | |
212 | | #[cfg(feature = "hashed-transcript-data")] |
213 | 0 | { |
214 | 0 | let mut shared_secret = SpdmSharedSecretFinalKeyStruct::default(); |
215 | 0 | shared_secret.data_size = SpdmDheAlgo::SECP_384_R1.get_key_size(); |
216 | 0 | requester.common.session[0] |
217 | 0 | .set_shared_secret(SpdmVersion::SpdmVersion12, shared_secret) |
218 | 0 | .unwrap(); |
219 | 0 | requester.common.session[0].runtime_info.digest_context_th = |
220 | 0 | spdmlib::crypto::hash::hash_ctx_init(SpdmBaseHashAlgo::TPM_ALG_SHA_384); |
221 | 0 | } |
222 | | |
223 | 0 | requester.common.session[0].set_session_state(SpdmSessionState::SpdmSessionHandshaking); |
224 | 0 | requester.common.session[0].set_mut_auth_requested( |
225 | | SpdmKeyExchangeMutAuthAttributes::MUT_AUTH_REQ_WITH_GET_DIGESTS, |
226 | | ); |
227 | | |
228 | 0 | let _ = requester |
229 | 0 | .send_receive_spdm_finish(Some(0), 4294836221) |
230 | 0 | .await; |
231 | | } |
232 | 0 | } |
233 | | |
234 | | #[cfg(not(feature = "use_libfuzzer"))] |
235 | | fn main() { |
236 | | #[cfg(all(feature = "fuzzlogfile", feature = "fuzz"))] |
237 | | flexi_logger::Logger::try_with_str("info") |
238 | | .unwrap() |
239 | | .log_to_file( |
240 | | FileSpec::default() |
241 | | .directory("traces") |
242 | | .basename("foo") |
243 | | .discriminant("Sample4711A") |
244 | | .suffix("trc"), |
245 | | ) |
246 | | .print_message() |
247 | | .create_symlink("current_run") |
248 | | .start() |
249 | | .unwrap(); |
250 | | |
251 | | #[cfg(not(feature = "fuzz"))] |
252 | | { |
253 | | let args: Vec<String> = std::env::args().collect(); |
254 | | if args.len() < 2 { |
255 | | // Here you can replace the single-step debugging value in the fuzzdata array. |
256 | | let fuzzdata = vec![ |
257 | | 0x1, 0x0, 0x2, 0x0, 0x9, 0x0, 0x0, 0x0, 0xfe, 0xff, 0xfe, 0xff, 0x16, 0x0, 0xca, |
258 | | 0xa7, 0x51, 0x58, 0x4d, 0x60, 0xe6, 0xc5, 0x74, 0x1c, 0xb3, 0xae, 0xaf, 0x62, 0x4b, |
259 | | 0x2e, 0x49, 0x54, 0x7a, 0x75, 0x86, 0x37, |
260 | | ]; |
261 | | executor::block_on(fuzz_send_receive_spdm_finish(Arc::new(fuzzdata))); |
262 | | } else { |
263 | | let path = &args[1]; |
264 | | let data = std::fs::read(path).expect("read crash file fail"); |
265 | | executor::block_on(fuzz_send_receive_spdm_finish(Arc::new(data))); |
266 | | } |
267 | | } |
268 | | #[cfg(feature = "fuzz")] |
269 | | afl::fuzz!(|data: &[u8]| { |
270 | | executor::block_on(fuzz_send_receive_spdm_finish(Arc::new(data.to_vec()))); |
271 | | }); |
272 | | } |