Coverage Report

Created: 2025-10-12 07:06

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/vtpm-td/deps/spdm-rs/spdmlib/src/message/encapsulated.rs
Line
Count
Source
1
// Copyright (c) 2023 Intel Corporation
2
//
3
// SPDX-License-Identifier: Apache-2.0 or MIT
4
5
use crate::common;
6
use crate::common::spdm_codec::SpdmCodec;
7
use crate::error::{SpdmStatus, SPDM_STATUS_BUFFER_FULL};
8
use crate::protocol::SpdmVersion;
9
use codec::{enum_builder, u24, Codec, Reader, Writer};
10
11
pub const ENCAPSULATED_RESPONSE_ACK_HEADER_SIZE: usize = 8;
12
13
#[derive(Debug, Clone, Default)]
14
pub struct SpdmGetEncapsulatedRequestPayload {}
15
16
impl SpdmCodec for SpdmGetEncapsulatedRequestPayload {
17
0
    fn spdm_encode(
18
0
        &self,
19
0
        _context: &mut common::SpdmContext,
20
0
        bytes: &mut Writer,
21
0
    ) -> Result<usize, SpdmStatus> {
22
0
        let mut cnt = 0usize;
23
0
        cnt += 0u8.encode(bytes).map_err(|_| SPDM_STATUS_BUFFER_FULL)?; // param1
24
0
        cnt += 0u8.encode(bytes).map_err(|_| SPDM_STATUS_BUFFER_FULL)?; // param2
25
0
        Ok(cnt)
26
0
    }
27
28
0
    fn spdm_read(
29
0
        _context: &mut common::SpdmContext,
30
0
        r: &mut Reader,
31
0
    ) -> Option<SpdmGetEncapsulatedRequestPayload> {
32
0
        u8::read(r)?; // param1
33
0
        u8::read(r)?; // param2
34
35
0
        Some(SpdmGetEncapsulatedRequestPayload {})
36
0
    }
37
}
38
39
#[derive(Debug, Clone, Default)]
40
pub struct SpdmEncapsulatedRequestPayload {
41
    pub request_id: u8,
42
}
43
44
impl SpdmCodec for SpdmEncapsulatedRequestPayload {
45
0
    fn spdm_encode(
46
0
        &self,
47
0
        _context: &mut common::SpdmContext,
48
0
        bytes: &mut Writer,
49
0
    ) -> Result<usize, SpdmStatus> {
50
0
        let mut cnt = 0usize;
51
0
        cnt += self
52
0
            .request_id
53
0
            .encode(bytes)
54
0
            .map_err(|_| SPDM_STATUS_BUFFER_FULL)?; // param1
55
0
        cnt += 0u8.encode(bytes).map_err(|_| SPDM_STATUS_BUFFER_FULL)?; // param2
56
0
        Ok(cnt)
57
0
    }
58
59
0
    fn spdm_read(
60
0
        _context: &mut common::SpdmContext,
61
0
        r: &mut Reader,
62
0
    ) -> Option<SpdmEncapsulatedRequestPayload> {
63
0
        let request_id = u8::read(r)?; // param1
64
0
        u8::read(r)?; // param2
65
66
0
        Some(SpdmEncapsulatedRequestPayload { request_id })
67
0
    }
68
}
69
70
#[derive(Debug, Clone, Default)]
71
pub struct SpdmDeliverEncapsulatedResponsePayload {
72
    pub request_id: u8,
73
}
74
75
impl SpdmCodec for SpdmDeliverEncapsulatedResponsePayload {
76
0
    fn spdm_encode(
77
0
        &self,
78
0
        _context: &mut common::SpdmContext,
79
0
        bytes: &mut Writer,
80
0
    ) -> Result<usize, SpdmStatus> {
81
0
        let mut cnt = 0usize;
82
0
        cnt += self
83
0
            .request_id
84
0
            .encode(bytes)
85
0
            .map_err(|_| SPDM_STATUS_BUFFER_FULL)?; // param1
86
0
        cnt += 0u8.encode(bytes).map_err(|_| SPDM_STATUS_BUFFER_FULL)?; // param2
87
0
        Ok(cnt)
88
0
    }
89
90
0
    fn spdm_read(
91
0
        _context: &mut common::SpdmContext,
92
0
        r: &mut Reader,
93
0
    ) -> Option<SpdmDeliverEncapsulatedResponsePayload> {
94
0
        let request_id = u8::read(r)?; // param1
95
0
        u8::read(r)?; // param2
96
97
0
        Some(SpdmDeliverEncapsulatedResponsePayload { request_id })
98
0
    }
99
}
100
101
#[derive(Debug, Clone, Default)]
102
pub struct SpdmEncapsulatedResponseAckPayload {
103
    pub request_id: u8,
104
    pub payload_type: SpdmEncapsulatedResponseAckPayloadType,
105
    pub ack_request_id: u8,
106
}
107
108
impl SpdmCodec for SpdmEncapsulatedResponseAckPayload {
109
0
    fn spdm_encode(
110
0
        &self,
111
0
        context: &mut common::SpdmContext,
112
0
        bytes: &mut Writer,
113
0
    ) -> Result<usize, SpdmStatus> {
114
0
        let mut cnt = 0usize;
115
0
        cnt += self
116
0
            .request_id
117
0
            .encode(bytes)
118
0
            .map_err(|_| SPDM_STATUS_BUFFER_FULL)?; // param1
119
0
        cnt += self
120
0
            .payload_type
121
0
            .encode(bytes)
122
0
            .map_err(|_| SPDM_STATUS_BUFFER_FULL)?; // param2
123
124
0
        if context.negotiate_info.spdm_version_sel >= SpdmVersion::SpdmVersion12 {
125
0
            cnt += self
126
0
                .ack_request_id
127
0
                .encode(bytes)
128
0
                .map_err(|_| SPDM_STATUS_BUFFER_FULL)?;
129
0
            cnt += u24::new(0)
130
0
                .encode(bytes)
131
0
                .map_err(|_| SPDM_STATUS_BUFFER_FULL)?; // reserved
132
0
        }
133
134
0
        Ok(cnt)
135
0
    }
136
137
0
    fn spdm_read(
138
0
        context: &mut common::SpdmContext,
139
0
        r: &mut Reader,
140
0
    ) -> Option<SpdmEncapsulatedResponseAckPayload> {
141
0
        let request_id = u8::read(r)?; // param1
142
0
        let payload_type = SpdmEncapsulatedResponseAckPayloadType::read(r)?; // param2
143
0
        let mut ack_request_id = 0;
144
145
0
        if context.negotiate_info.spdm_version_sel >= SpdmVersion::SpdmVersion12 {
146
0
            ack_request_id = u8::read(r)?;
147
0
            let _ = u24::read(r)?; // reserved
148
0
        }
149
150
0
        Some(SpdmEncapsulatedResponseAckPayload {
151
0
            request_id,
152
0
            payload_type,
153
0
            ack_request_id,
154
0
        })
155
0
    }
156
}
157
158
enum_builder! {
159
    @U8
160
    EnumName: SpdmEncapsulatedResponseAckPayloadType;
161
    EnumVal{
162
        Absent => 0,
163
        Present => 1,
164
        ReqSlotNumber => 2
165
    }
166
}
167
impl Default for SpdmEncapsulatedResponseAckPayloadType {
168
0
    fn default() -> SpdmEncapsulatedResponseAckPayloadType {
169
0
        SpdmEncapsulatedResponseAckPayloadType::Absent
170
0
    }
171
}
172
173
#[cfg(test)]
174
#[path = "mod_test.common.inc.rs"]
175
mod testlib;
176
177
#[cfg(test)]
178
#[path = "encapsulated_test.rs"]
179
mod encapsulated_test;