Coverage Report

Created: 2026-01-17 06:47

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/spdm-rs/spdmlib/src/message/capability.rs
Line
Count
Source
1
// Copyright (c) 2020 Intel Corporation
2
//
3
// SPDX-License-Identifier: Apache-2.0 or MIT
4
5
use crate::common;
6
use crate::message::*;
7
8
#[derive(Debug, Clone, Default)]
9
pub struct SpdmGetCapabilitiesRequestPayload {
10
    pub ct_exponent: u8,
11
    pub flags: SpdmRequestCapabilityFlags,
12
    // New fields from SpdmVersion12
13
    pub data_transfer_size: u32,
14
    pub max_spdm_msg_size: u32,
15
    // New fields from SpdmVersion14
16
    pub ex_flags: SpdmRequestCapabilityExFlags,
17
}
18
19
impl SpdmCodec for SpdmGetCapabilitiesRequestPayload {
20
0
    fn spdm_encode(
21
0
        &self,
22
0
        context: &mut common::SpdmContext,
23
0
        bytes: &mut Writer,
24
0
    ) -> Result<usize, SpdmStatus> {
25
0
        let mut cnt = 0usize;
26
0
        cnt += 0u8.encode(bytes).map_err(|_| SPDM_STATUS_BUFFER_FULL)?; // param1
27
0
        cnt += 0u8.encode(bytes).map_err(|_| SPDM_STATUS_BUFFER_FULL)?; // param2
28
29
0
        if context.negotiate_info.spdm_version_sel >= SpdmVersion::SpdmVersion11 {
30
0
            cnt += 0u8.encode(bytes).map_err(|_| SPDM_STATUS_BUFFER_FULL)?; // reserved
31
0
            cnt += self
32
0
                .ct_exponent
33
0
                .encode(bytes)
34
0
                .map_err(|_| SPDM_STATUS_BUFFER_FULL)?;
35
0
            if context.negotiate_info.spdm_version_sel >= SpdmVersion::SpdmVersion14 {
36
0
                cnt += self
37
0
                    .ex_flags
38
0
                    .encode(bytes)
39
0
                    .map_err(|_| SPDM_STATUS_BUFFER_FULL)?;
40
            } else {
41
0
                cnt += 0u16.encode(bytes).map_err(|_| SPDM_STATUS_BUFFER_FULL)?;
42
                // reserved2
43
            }
44
0
            cnt += self
45
0
                .flags
46
0
                .encode(bytes)
47
0
                .map_err(|_| SPDM_STATUS_BUFFER_FULL)?;
48
0
        }
49
50
0
        if context.negotiate_info.spdm_version_sel >= SpdmVersion::SpdmVersion12 {
51
0
            cnt += self
52
0
                .data_transfer_size
53
0
                .encode(bytes)
54
0
                .map_err(|_| SPDM_STATUS_BUFFER_FULL)?;
55
0
            cnt += self
56
0
                .max_spdm_msg_size
57
0
                .encode(bytes)
58
0
                .map_err(|_| SPDM_STATUS_BUFFER_FULL)?;
59
0
        }
60
0
        Ok(cnt)
61
0
    }
62
63
0
    fn spdm_read(
64
0
        context: &mut common::SpdmContext,
65
0
        r: &mut Reader,
66
0
    ) -> Option<SpdmGetCapabilitiesRequestPayload> {
67
0
        if context.negotiate_info.spdm_version_sel >= SpdmVersion::SpdmVersion13 {
68
0
            let param1 = SpdmCapabilityParam1::read(r)?; // param1
69
0
            if param1.contains(SpdmCapabilityParam1::SUPPORTED_ALGOS_EXT_CAP)
70
0
                && !context
71
0
                    .config_info
72
0
                    .rsp_capabilities
73
0
                    .contains(SpdmResponseCapabilityFlags::CHUNK_CAP)
74
            {
75
0
                return None;
76
0
            }
77
        } else {
78
0
            u8::read(r)?; // param1
79
        }
80
0
        u8::read(r)?; // param2
81
82
0
        let mut ct_exponent = 0;
83
0
        let mut flags = SpdmRequestCapabilityFlags::default();
84
0
        let mut ex_flags = SpdmRequestCapabilityExFlags::default();
85
0
        if context.negotiate_info.spdm_version_sel >= SpdmVersion::SpdmVersion11 {
86
0
            u8::read(r)?; // reserved
87
0
            ct_exponent = u8::read(r)?;
88
0
            if context.negotiate_info.spdm_version_sel >= SpdmVersion::SpdmVersion14 {
89
0
                ex_flags = SpdmRequestCapabilityExFlags::read(r)?;
90
            } else {
91
0
                u16::read(r)?; // reserved2
92
            }
93
0
            flags = SpdmRequestCapabilityFlags::read(r)?;
94
95
            // check req_capability
96
0
            if flags.contains(SpdmRequestCapabilityFlags::PSK_RSVD) {
97
0
                return None;
98
0
            }
99
0
            if flags.contains(SpdmRequestCapabilityFlags::KEY_EX_CAP)
100
0
                || flags.contains(SpdmRequestCapabilityFlags::PSK_CAP)
101
            {
102
0
                if !flags.contains(SpdmRequestCapabilityFlags::MAC_CAP) {
103
0
                    return None;
104
0
                }
105
            } else {
106
0
                if flags.contains(SpdmRequestCapabilityFlags::MAC_CAP)
107
0
                    || flags.contains(SpdmRequestCapabilityFlags::ENCRYPT_CAP)
108
0
                    || flags.contains(SpdmRequestCapabilityFlags::HANDSHAKE_IN_THE_CLEAR_CAP)
109
0
                    || flags.contains(SpdmRequestCapabilityFlags::HBEAT_CAP)
110
0
                    || flags.contains(SpdmRequestCapabilityFlags::KEY_UPD_CAP)
111
                {
112
0
                    return None;
113
0
                }
114
0
                if context.negotiate_info.spdm_version_sel >= SpdmVersion::SpdmVersion13
115
0
                    && flags.contains(SpdmRequestCapabilityFlags::EVENT_CAP)
116
                {
117
0
                    return None;
118
0
                }
119
            }
120
0
            if !flags.contains(SpdmRequestCapabilityFlags::KEY_EX_CAP)
121
0
                && flags.contains(SpdmRequestCapabilityFlags::PSK_CAP)
122
0
                && flags.contains(SpdmRequestCapabilityFlags::HANDSHAKE_IN_THE_CLEAR_CAP)
123
            {
124
0
                return None;
125
0
            }
126
0
            if flags.contains(SpdmRequestCapabilityFlags::CERT_CAP)
127
0
                || flags.contains(SpdmRequestCapabilityFlags::PUB_KEY_ID_CAP)
128
            {
129
0
                if flags.contains(SpdmRequestCapabilityFlags::CERT_CAP)
130
0
                    && flags.contains(SpdmRequestCapabilityFlags::PUB_KEY_ID_CAP)
131
                {
132
0
                    return None;
133
0
                }
134
0
                if !flags.contains(SpdmRequestCapabilityFlags::CHAL_CAP)
135
0
                    && !flags.contains(SpdmRequestCapabilityFlags::KEY_EX_CAP)
136
                {
137
0
                    return None;
138
0
                }
139
            } else {
140
0
                if flags.contains(SpdmRequestCapabilityFlags::CHAL_CAP)
141
0
                    || flags.contains(SpdmRequestCapabilityFlags::MUT_AUTH_CAP)
142
                {
143
0
                    return None;
144
0
                }
145
0
                if context.negotiate_info.spdm_version_sel >= SpdmVersion::SpdmVersion13
146
0
                    && flags.contains(SpdmRequestCapabilityFlags::EP_INFO_CAP_SIG)
147
                {
148
0
                    return None;
149
0
                }
150
            }
151
152
0
            if context.negotiate_info.spdm_version_sel == SpdmVersion::SpdmVersion11
153
0
                && flags.contains(SpdmRequestCapabilityFlags::MUT_AUTH_CAP)
154
0
                && !flags.contains(SpdmRequestCapabilityFlags::ENCAP_CAP)
155
            {
156
0
                return None;
157
0
            }
158
159
0
            if context.negotiate_info.spdm_version_sel >= SpdmVersion::SpdmVersion13 {
160
0
                if flags.contains(SpdmRequestCapabilityFlags::EP_INFO_CAP_NO_SIG)
161
0
                    && flags.contains(SpdmRequestCapabilityFlags::EP_INFO_CAP_SIG)
162
                {
163
0
                    return None;
164
0
                }
165
0
                if flags.contains(SpdmRequestCapabilityFlags::MULTI_KEY_CAP_ONLY)
166
0
                    && flags.contains(SpdmRequestCapabilityFlags::MULTI_KEY_CAP_CONN_SEL)
167
                {
168
0
                    return None;
169
0
                }
170
0
                if flags.contains(SpdmRequestCapabilityFlags::PUB_KEY_ID_CAP)
171
0
                    && (flags.contains(SpdmRequestCapabilityFlags::MULTI_KEY_CAP_ONLY)
172
0
                        || flags.contains(SpdmRequestCapabilityFlags::MULTI_KEY_CAP_CONN_SEL))
173
                {
174
0
                    return None;
175
0
                }
176
0
            }
177
0
        }
178
179
0
        let mut data_transfer_size = 0;
180
0
        let mut max_spdm_msg_size = 0;
181
0
        if context.negotiate_info.spdm_version_sel >= SpdmVersion::SpdmVersion12 {
182
0
            data_transfer_size = u32::read(r)?;
183
0
            max_spdm_msg_size = u32::read(r)?;
184
0
            if data_transfer_size < 42 || max_spdm_msg_size < data_transfer_size {
185
0
                log::error!(
186
0
                    "responder: data_transfer_size < 42 or max_spdm_msg_size < data_transfer_size"
187
                );
188
0
                return None;
189
0
            }
190
0
        }
191
192
0
        Some(SpdmGetCapabilitiesRequestPayload {
193
0
            ct_exponent,
194
0
            flags,
195
0
            data_transfer_size,
196
0
            max_spdm_msg_size,
197
0
            ex_flags,
198
0
        })
199
0
    }
200
}
201
202
#[derive(Debug, Clone, Default)]
203
pub struct SpdmCapabilitiesResponsePayload {
204
    pub ct_exponent: u8,
205
    pub flags: SpdmResponseCapabilityFlags,
206
    pub data_transfer_size: u32,
207
    pub max_spdm_msg_size: u32,
208
    // New fields from SpdmVersion14
209
    pub ex_flags: SpdmResponseCapabilityExFlags,
210
}
211
212
impl SpdmCodec for SpdmCapabilitiesResponsePayload {
213
0
    fn spdm_encode(
214
0
        &self,
215
0
        context: &mut common::SpdmContext,
216
0
        bytes: &mut Writer,
217
0
    ) -> Result<usize, SpdmStatus> {
218
0
        let mut cnt = 0usize;
219
0
        cnt += 0u8.encode(bytes).map_err(|_| SPDM_STATUS_BUFFER_FULL)?; // param1
220
0
        cnt += 0u8.encode(bytes).map_err(|_| SPDM_STATUS_BUFFER_FULL)?; // param2
221
222
0
        cnt += 0u8.encode(bytes).map_err(|_| SPDM_STATUS_BUFFER_FULL)?; // reserved
223
0
        cnt += self
224
0
            .ct_exponent
225
0
            .encode(bytes)
226
0
            .map_err(|_| SPDM_STATUS_BUFFER_FULL)?;
227
0
        if context.negotiate_info.spdm_version_sel >= SpdmVersion::SpdmVersion14 {
228
0
            cnt += self
229
0
                .ex_flags
230
0
                .encode(bytes)
231
0
                .map_err(|_| SPDM_STATUS_BUFFER_FULL)?;
232
        } else {
233
0
            cnt += 0u16.encode(bytes).map_err(|_| SPDM_STATUS_BUFFER_FULL)?; // reserved2
234
        }
235
0
        cnt += self
236
0
            .flags
237
0
            .encode(bytes)
238
0
            .map_err(|_| SPDM_STATUS_BUFFER_FULL)?;
239
240
0
        if context.negotiate_info.spdm_version_sel >= SpdmVersion::SpdmVersion12 {
241
0
            cnt += self
242
0
                .data_transfer_size
243
0
                .encode(bytes)
244
0
                .map_err(|_| SPDM_STATUS_BUFFER_FULL)?;
245
0
            cnt += self
246
0
                .max_spdm_msg_size
247
0
                .encode(bytes)
248
0
                .map_err(|_| SPDM_STATUS_BUFFER_FULL)?;
249
0
        }
250
251
0
        Ok(cnt)
252
0
    }
253
254
0
    fn spdm_read(
255
0
        context: &mut common::SpdmContext,
256
0
        r: &mut Reader,
257
0
    ) -> Option<SpdmCapabilitiesResponsePayload> {
258
0
        u8::read(r)?; // param1
259
0
        u8::read(r)?; // param2
260
261
0
        u8::read(r)?; // reserved
262
0
        let ct_exponent = u8::read(r)?;
263
0
        let mut ex_flags = SpdmResponseCapabilityExFlags::default();
264
0
        if context.negotiate_info.spdm_version_sel >= SpdmVersion::SpdmVersion14 {
265
0
            ex_flags = SpdmResponseCapabilityExFlags::read(r)?;
266
        } else {
267
0
            u16::read(r)?; // reserved2
268
        }
269
0
        let flags = SpdmResponseCapabilityFlags::read(r)?;
270
271
        // check rsp_capability
272
0
        if flags.contains(SpdmResponseCapabilityFlags::MEAS_CAP_NO_SIG)
273
0
            && flags.contains(SpdmResponseCapabilityFlags::MEAS_CAP_SIG)
274
        {
275
0
            return None;
276
0
        }
277
0
        if (!flags.contains(SpdmResponseCapabilityFlags::MEAS_CAP_NO_SIG)
278
0
            && !flags.contains(SpdmResponseCapabilityFlags::MEAS_CAP_SIG))
279
0
            && flags.contains(SpdmResponseCapabilityFlags::MEAS_FRESH_CAP)
280
        {
281
0
            return None;
282
0
        }
283
0
        if context.negotiate_info.spdm_version_sel < SpdmVersion::SpdmVersion11 {
284
0
            if !flags.contains(SpdmResponseCapabilityFlags::MEAS_CAP_SIG) {
285
0
                if flags.contains(SpdmResponseCapabilityFlags::CERT_CAP)
286
0
                    != flags.contains(SpdmResponseCapabilityFlags::CHAL_CAP)
287
                {
288
0
                    return None;
289
0
                }
290
0
            } else if !flags.contains(SpdmResponseCapabilityFlags::CERT_CAP) {
291
0
                return None;
292
0
            }
293
        } else {
294
0
            if flags.contains(SpdmResponseCapabilityFlags::PSK_CAP_WITHOUT_CONTEXT)
295
0
                && flags.contains(SpdmResponseCapabilityFlags::PSK_CAP_WITH_CONTEXT)
296
            {
297
0
                return None;
298
0
            }
299
0
            if flags.contains(SpdmResponseCapabilityFlags::KEY_EX_CAP)
300
0
                || flags.contains(SpdmResponseCapabilityFlags::PSK_CAP_WITHOUT_CONTEXT)
301
0
                || flags.contains(SpdmResponseCapabilityFlags::PSK_CAP_WITH_CONTEXT)
302
            {
303
0
                if !flags.contains(SpdmResponseCapabilityFlags::MAC_CAP) {
304
0
                    return None;
305
0
                }
306
            } else {
307
0
                if flags.contains(SpdmResponseCapabilityFlags::MAC_CAP)
308
0
                    || flags.contains(SpdmResponseCapabilityFlags::ENCRYPT_CAP)
309
0
                    || flags.contains(SpdmResponseCapabilityFlags::HANDSHAKE_IN_THE_CLEAR_CAP)
310
0
                    || flags.contains(SpdmResponseCapabilityFlags::HBEAT_CAP)
311
0
                    || flags.contains(SpdmResponseCapabilityFlags::KEY_UPD_CAP)
312
                {
313
0
                    return None;
314
0
                }
315
0
                if context.negotiate_info.spdm_version_sel >= SpdmVersion::SpdmVersion13
316
0
                    && flags.contains(SpdmResponseCapabilityFlags::EVENT_CAP)
317
                {
318
0
                    return None;
319
0
                }
320
            }
321
0
            if !flags.contains(SpdmResponseCapabilityFlags::KEY_EX_CAP)
322
0
                && (flags.contains(SpdmResponseCapabilityFlags::PSK_CAP_WITHOUT_CONTEXT)
323
0
                    || flags.contains(SpdmResponseCapabilityFlags::PSK_CAP_WITH_CONTEXT))
324
0
                && flags.contains(SpdmResponseCapabilityFlags::HANDSHAKE_IN_THE_CLEAR_CAP)
325
            {
326
0
                return None;
327
0
            }
328
0
            if flags.contains(SpdmResponseCapabilityFlags::CERT_CAP)
329
0
                || flags.contains(SpdmResponseCapabilityFlags::PUB_KEY_ID_CAP)
330
            {
331
0
                if flags.contains(SpdmResponseCapabilityFlags::CERT_CAP)
332
0
                    && flags.contains(SpdmResponseCapabilityFlags::PUB_KEY_ID_CAP)
333
                {
334
0
                    return None;
335
0
                }
336
0
                if !flags.contains(SpdmResponseCapabilityFlags::CHAL_CAP)
337
0
                    && !flags.contains(SpdmResponseCapabilityFlags::KEY_EX_CAP)
338
0
                    && !flags.contains(SpdmResponseCapabilityFlags::MEAS_CAP_SIG)
339
                {
340
0
                    return None;
341
0
                }
342
            } else {
343
0
                if flags.contains(SpdmResponseCapabilityFlags::CHAL_CAP)
344
0
                    || flags.contains(SpdmResponseCapabilityFlags::KEY_EX_CAP)
345
0
                    || flags.contains(SpdmResponseCapabilityFlags::MEAS_CAP_SIG)
346
0
                    || flags.contains(SpdmResponseCapabilityFlags::MUT_AUTH_CAP)
347
                {
348
0
                    return None;
349
0
                }
350
0
                if context.negotiate_info.spdm_version_sel >= SpdmVersion::SpdmVersion13
351
0
                    && flags.contains(SpdmResponseCapabilityFlags::EP_INFO_CAP_SIG)
352
                {
353
0
                    return None;
354
0
                }
355
            }
356
        }
357
0
        if context.negotiate_info.spdm_version_sel == SpdmVersion::SpdmVersion11
358
0
            && flags.contains(SpdmResponseCapabilityFlags::MUT_AUTH_CAP)
359
0
            && !flags.contains(SpdmResponseCapabilityFlags::ENCAP_CAP)
360
        {
361
0
            return None;
362
0
        }
363
0
        if context.negotiate_info.spdm_version_sel >= SpdmVersion::SpdmVersion12 {
364
0
            if !flags.contains(SpdmResponseCapabilityFlags::CERT_CAP)
365
0
                && (flags.contains(SpdmResponseCapabilityFlags::ALIAS_CERT_CAP)
366
0
                    || flags.contains(SpdmResponseCapabilityFlags::SET_CERT_CAP))
367
            {
368
0
                return None;
369
0
            }
370
0
            if flags.contains(SpdmResponseCapabilityFlags::CSR_CAP)
371
0
                && !flags.contains(SpdmResponseCapabilityFlags::SET_CERT_CAP)
372
            {
373
0
                return None;
374
0
            }
375
0
            if flags.contains(SpdmResponseCapabilityFlags::CERT_INSTALL_RESET_CAP)
376
0
                && !flags.contains(SpdmResponseCapabilityFlags::CSR_CAP)
377
0
                && !flags.contains(SpdmResponseCapabilityFlags::SET_CERT_CAP)
378
            {
379
0
                return None;
380
0
            }
381
0
        }
382
383
0
        if context.negotiate_info.spdm_version_sel >= SpdmVersion::SpdmVersion13 {
384
0
            if flags.contains(SpdmResponseCapabilityFlags::EP_INFO_CAP_NO_SIG)
385
0
                && flags.contains(SpdmResponseCapabilityFlags::EP_INFO_CAP_SIG)
386
            {
387
0
                return None;
388
0
            }
389
0
            if flags.contains(SpdmResponseCapabilityFlags::MULTI_KEY_CAP_ONLY)
390
0
                && flags.contains(SpdmResponseCapabilityFlags::MULTI_KEY_CAP_CONN_SEL)
391
            {
392
0
                return None;
393
0
            }
394
0
            if flags.contains(SpdmResponseCapabilityFlags::MULTI_KEY_CAP_ONLY)
395
0
                || flags.contains(SpdmResponseCapabilityFlags::MULTI_KEY_CAP_CONN_SEL)
396
            {
397
0
                if flags.contains(SpdmResponseCapabilityFlags::PUB_KEY_ID_CAP) {
398
0
                    return None;
399
0
                }
400
0
                if !flags.contains(SpdmResponseCapabilityFlags::GET_KEY_PAIR_INFO_CAP) {
401
0
                    return None;
402
0
                }
403
0
            }
404
0
        }
405
406
0
        let mut data_transfer_size = 0u32;
407
0
        let mut max_spdm_msg_size = 0u32;
408
0
        if context.negotiate_info.spdm_version_sel >= SpdmVersion::SpdmVersion12 {
409
0
            data_transfer_size = u32::read(r)?;
410
0
            max_spdm_msg_size = u32::read(r)?;
411
0
            if data_transfer_size < 42 || max_spdm_msg_size < data_transfer_size {
412
0
                log::error!(
413
0
                    "requester: data_transfer_size < 42 or max_spdm_msg_size < data_transfer_size"
414
                );
415
0
                return None;
416
0
            }
417
0
        }
418
0
        Some(SpdmCapabilitiesResponsePayload {
419
0
            ct_exponent,
420
0
            flags,
421
0
            data_transfer_size,
422
0
            max_spdm_msg_size,
423
0
            ex_flags,
424
0
        })
425
0
    }
426
}
427
428
#[cfg(test)]
429
#[path = "mod_test.common.inc.rs"]
430
mod testlib;
431
432
#[cfg(test)]
433
mod tests {
434
    use super::*;
435
    use crate::common::{SpdmConfigInfo, SpdmContext, SpdmProvisionInfo};
436
    use testlib::{create_spdm_context, DeviceIO, TransportEncap};
437
    extern crate alloc;
438
439
    #[test]
440
    fn test_case0_spdm_response_capability_flags() {
441
        let u8_slice = &mut [0u8; 4];
442
        let mut writer = Writer::init(u8_slice);
443
        let value = SpdmResponseCapabilityFlags::all();
444
        assert!(value.encode(&mut writer).is_ok());
445
        let mut reader = Reader::init(u8_slice);
446
        assert_eq!(4, reader.left());
447
        assert_eq!(
448
            SpdmResponseCapabilityFlags::read(&mut reader).unwrap(),
449
            SpdmResponseCapabilityFlags::all()
450
        );
451
        assert_eq!(0, reader.left());
452
    }
453
    #[test]
454
    fn test_case1_spdm_response_capability_flags() {
455
        let value = SpdmResponseCapabilityFlags::CACHE_CAP;
456
        new_spdm_response_capability_flags(value);
457
        let value = SpdmResponseCapabilityFlags::PUB_KEY_ID_CAP;
458
        new_spdm_response_capability_flags(value);
459
        let value = SpdmResponseCapabilityFlags::HANDSHAKE_IN_THE_CLEAR_CAP;
460
        new_spdm_response_capability_flags(value);
461
        let value = SpdmResponseCapabilityFlags::KEY_UPD_CAP;
462
        new_spdm_response_capability_flags(value);
463
        let value = SpdmResponseCapabilityFlags::HBEAT_CAP;
464
        new_spdm_response_capability_flags(value);
465
    }
466
    #[test]
467
    fn test_case2_spdm_response_capability_flags() {
468
        let u8_slice = &mut [0u8; 4];
469
        let mut writer = Writer::init(u8_slice);
470
        let value = SpdmResponseCapabilityFlags::empty();
471
        assert!(value.encode(&mut writer).is_ok());
472
        let mut reader = Reader::init(u8_slice);
473
        assert_eq!(4, reader.left());
474
        assert_eq!(
475
            SpdmResponseCapabilityFlags::read(&mut reader).unwrap(),
476
            SpdmResponseCapabilityFlags::empty()
477
        );
478
        assert_eq!(0, reader.left());
479
    }
480
    #[test]
481
    fn test_case0_spdm_request_capability_flags() {
482
        let u8_slice = &mut [0u8; 4];
483
        let mut writer = Writer::init(u8_slice);
484
        let value = SpdmRequestCapabilityFlags::all();
485
        assert!(value.encode(&mut writer).is_ok());
486
487
        let mut reader = Reader::init(u8_slice);
488
        assert_eq!(4, reader.left());
489
        assert_eq!(
490
            SpdmRequestCapabilityFlags::read(&mut reader).unwrap(),
491
            SpdmRequestCapabilityFlags::all()
492
        );
493
        assert_eq!(0, reader.left());
494
    }
495
    #[test]
496
    fn test_case1_spdm_request_capability_flags() {
497
        let value = SpdmRequestCapabilityFlags::HANDSHAKE_IN_THE_CLEAR_CAP;
498
        new_spdm_request_capability_flags(value);
499
        let value = SpdmRequestCapabilityFlags::CERT_CAP;
500
        new_spdm_request_capability_flags(value);
501
        let value = SpdmRequestCapabilityFlags::CHAL_CAP;
502
        new_spdm_request_capability_flags(value);
503
        let value = SpdmRequestCapabilityFlags::ENCRYPT_CAP;
504
        new_spdm_request_capability_flags(value);
505
        let value = SpdmRequestCapabilityFlags::MAC_CAP;
506
        new_spdm_request_capability_flags(value);
507
        let value = SpdmRequestCapabilityFlags::MUT_AUTH_CAP;
508
        new_spdm_request_capability_flags(value);
509
    }
510
    #[test]
511
    fn test_case3_spdm_request_capability_flags() {
512
        let u8_slice = &mut [0u8; 4];
513
        let mut writer = Writer::init(u8_slice);
514
        let value = SpdmRequestCapabilityFlags::empty();
515
        assert!(value.encode(&mut writer).is_ok());
516
517
        let mut reader = Reader::init(u8_slice);
518
        assert_eq!(4, reader.left());
519
        assert_eq!(
520
            SpdmRequestCapabilityFlags::read(&mut reader).unwrap(),
521
            SpdmRequestCapabilityFlags::empty()
522
        );
523
        assert_eq!(0, reader.left());
524
    }
525
    #[test]
526
    fn test_case0_spdm_get_capabilities_request_payload() {
527
        let u8_slice = &mut [0u8; 12];
528
        let mut writer = Writer::init(u8_slice);
529
        let value = SpdmGetCapabilitiesRequestPayload {
530
            ct_exponent: 7,
531
            flags: SpdmRequestCapabilityFlags::CERT_CAP | SpdmRequestCapabilityFlags::CHAL_CAP,
532
            data_transfer_size: 0,
533
            max_spdm_msg_size: 0,
534
            ex_flags: SpdmRequestCapabilityExFlags::default(),
535
        };
536
537
        create_spdm_context!(context);
538
        context.negotiate_info.spdm_version_sel = SpdmVersion::SpdmVersion11;
539
540
        assert!(value.spdm_encode(&mut context, &mut writer).is_ok());
541
        let mut reader = Reader::init(u8_slice);
542
        assert_eq!(12, reader.left());
543
        let spdm_get_capabilities_request_payload =
544
            SpdmGetCapabilitiesRequestPayload::spdm_read(&mut context, &mut reader).unwrap();
545
        assert_eq!(spdm_get_capabilities_request_payload.ct_exponent, 7);
546
        assert_eq!(
547
            spdm_get_capabilities_request_payload.flags,
548
            SpdmRequestCapabilityFlags::CERT_CAP | SpdmRequestCapabilityFlags::CHAL_CAP
549
        );
550
        assert_eq!(2, reader.left());
551
    }
552
    #[test]
553
    fn test_case1_spdm_get_capabilities_request_payload() {
554
        let u8_slice = &mut [0u8; 12];
555
        let mut writer = Writer::init(u8_slice);
556
        let value = SpdmGetCapabilitiesRequestPayload {
557
            ct_exponent: 0,
558
            flags: SpdmRequestCapabilityFlags::CERT_CAP | SpdmRequestCapabilityFlags::CHAL_CAP,
559
            data_transfer_size: 0,
560
            max_spdm_msg_size: 0,
561
            ex_flags: SpdmRequestCapabilityExFlags::default(),
562
        };
563
564
        create_spdm_context!(context);
565
        context.negotiate_info.spdm_version_sel = SpdmVersion::SpdmVersion11;
566
567
        assert!(value.spdm_encode(&mut context, &mut writer).is_ok());
568
        let mut reader = Reader::init(u8_slice);
569
        assert_eq!(12, reader.left());
570
        let spdm_get_capabilities_request_payload =
571
            SpdmGetCapabilitiesRequestPayload::spdm_read(&mut context, &mut reader).unwrap();
572
        assert_eq!(spdm_get_capabilities_request_payload.ct_exponent, 0);
573
        assert_eq!(
574
            spdm_get_capabilities_request_payload.flags,
575
            SpdmRequestCapabilityFlags::CERT_CAP | SpdmRequestCapabilityFlags::CHAL_CAP
576
        );
577
        assert_eq!(2, reader.left());
578
    }
579
    #[test]
580
    fn test_case2_spdm_get_capabilities_request_payload() {
581
        let u8_slice = &mut [0u8; 12];
582
        let mut writer = Writer::init(u8_slice);
583
        let value = SpdmGetCapabilitiesRequestPayload::default();
584
585
        create_spdm_context!(context);
586
        context.negotiate_info.spdm_version_sel = SpdmVersion::SpdmVersion11;
587
588
        assert!(value.spdm_encode(&mut context, &mut writer).is_ok());
589
        let mut reader = Reader::init(u8_slice);
590
        assert_eq!(12, reader.left());
591
        SpdmGetCapabilitiesRequestPayload::spdm_read(&mut context, &mut reader);
592
        assert_eq!(2, reader.left());
593
    }
594
    #[test]
595
    fn test_case0_spdm_capabilities_response_payload() {
596
        let u8_slice = &mut [0u8; 12];
597
        let mut writer = Writer::init(u8_slice);
598
        let value = SpdmCapabilitiesResponsePayload {
599
            ct_exponent: 7,
600
            flags: SpdmResponseCapabilityFlags::CERT_CAP | SpdmResponseCapabilityFlags::CHAL_CAP,
601
            data_transfer_size: 0,
602
            max_spdm_msg_size: 0,
603
            ex_flags: SpdmResponseCapabilityExFlags::default(),
604
        };
605
606
        create_spdm_context!(context);
607
        context.negotiate_info.spdm_version_sel = SpdmVersion::SpdmVersion11;
608
609
        assert!(value.spdm_encode(&mut context, &mut writer).is_ok());
610
        let mut reader = Reader::init(u8_slice);
611
        assert_eq!(12, reader.left());
612
        let spdm_capabilities_response_payload =
613
            SpdmCapabilitiesResponsePayload::spdm_read(&mut context, &mut reader).unwrap();
614
        assert_eq!(spdm_capabilities_response_payload.ct_exponent, 7);
615
        assert_eq!(
616
            spdm_capabilities_response_payload.flags,
617
            SpdmResponseCapabilityFlags::CERT_CAP | SpdmResponseCapabilityFlags::CHAL_CAP
618
        );
619
        assert_eq!(2, reader.left());
620
    }
621
    #[test]
622
    fn test_case1_spdm_capabilities_response_payload() {
623
        let u8_slice = &mut [0u8; 12];
624
        let mut writer = Writer::init(u8_slice);
625
        let value = SpdmCapabilitiesResponsePayload {
626
            ct_exponent: 0,
627
            flags: SpdmResponseCapabilityFlags::CERT_CAP | SpdmResponseCapabilityFlags::CHAL_CAP,
628
            data_transfer_size: 0,
629
            max_spdm_msg_size: 0,
630
            ex_flags: SpdmResponseCapabilityExFlags::default(),
631
        };
632
633
        create_spdm_context!(context);
634
        context.negotiate_info.spdm_version_sel = SpdmVersion::SpdmVersion11;
635
636
        assert!(value.spdm_encode(&mut context, &mut writer).is_ok());
637
        let mut reader = Reader::init(u8_slice);
638
        assert_eq!(12, reader.left());
639
        let spdm_capabilities_response_payload =
640
            SpdmCapabilitiesResponsePayload::spdm_read(&mut context, &mut reader).unwrap();
641
        assert_eq!(spdm_capabilities_response_payload.ct_exponent, 0);
642
        assert_eq!(
643
            spdm_capabilities_response_payload.flags,
644
            SpdmResponseCapabilityFlags::CERT_CAP | SpdmResponseCapabilityFlags::CHAL_CAP
645
        );
646
        assert_eq!(2, reader.left());
647
    }
648
    #[test]
649
    fn test_case2_spdm_capabilities_response_payload() {
650
        let u8_slice = &mut [0u8; 12];
651
        let mut writer = Writer::init(u8_slice);
652
        let value = SpdmCapabilitiesResponsePayload::default();
653
654
        create_spdm_context!(context);
655
        context.negotiate_info.spdm_version_sel = SpdmVersion::SpdmVersion11;
656
657
        assert!(value.spdm_encode(&mut context, &mut writer).is_ok());
658
        let mut reader = Reader::init(u8_slice);
659
        assert_eq!(12, reader.left());
660
        let spdm_capabilities_response_payload =
661
            SpdmCapabilitiesResponsePayload::spdm_read(&mut context, &mut reader).unwrap();
662
        assert_eq!(spdm_capabilities_response_payload.ct_exponent, 0);
663
        assert_eq!(
664
            spdm_capabilities_response_payload.flags,
665
            SpdmResponseCapabilityFlags::empty()
666
        );
667
        assert_eq!(2, reader.left());
668
    }
669
670
    fn new_spdm_response_capability_flags(value: SpdmResponseCapabilityFlags) {
671
        let u8_slice = &mut [0u8; 4];
672
        let mut writer = Writer::init(u8_slice);
673
        assert!(value.encode(&mut writer).is_ok());
674
        let mut reader = Reader::init(u8_slice);
675
        assert_eq!(4, reader.left());
676
        assert_eq!(
677
            SpdmResponseCapabilityFlags::read(&mut reader).unwrap(),
678
            value
679
        );
680
        assert_eq!(0, reader.left())
681
    }
682
683
    fn new_spdm_request_capability_flags(value: SpdmRequestCapabilityFlags) {
684
        let u8_slice = &mut [0u8; 4];
685
        let mut writer = Writer::init(u8_slice);
686
        assert!(value.encode(&mut writer).is_ok());
687
        let mut reader = Reader::init(u8_slice);
688
        assert_eq!(4, reader.left());
689
        assert_eq!(
690
            SpdmRequestCapabilityFlags::read(&mut reader).unwrap(),
691
            value
692
        );
693
        assert_eq!(0, reader.left())
694
    }
695
}
696
697
#[cfg(test)]
698
#[path = "capability_test.rs"]
699
mod capability_test;