Coverage Report

Created: 2026-05-24 06:13

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
}