Skip to content

Commit f893305

Browse files
committed
Formally propose a transport-agnostic Cerberus
1 parent e64588f commit f893305

File tree

1 file changed

+150
-0
lines changed

1 file changed

+150
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
* Name: Transport_Agnosticism
2+
* Date: 2021-04-02
3+
* Pull Request: [#16](https://github.com/opencomputeproject/Security/pull/16)
4+
5+
# Objective
6+
7+
Cerberus currently mandates that its messages be exchanged over an MCTP bus,
8+
using a Microsoft-specific PCI vendor ID. This is a limitation for deployments
9+
that might want to speak Cerberus over a completely different bus, such as
10+
SPI, I3C, exotic buses like NVME, or over plain old TCP or UDP for the
11+
purposes of conformance testing.
12+
13+
This RFC describes a "transport agnostic" model for Cerberus with the following
14+
goals:
15+
- The existing MCTP binding of the protocol works with minimal (or no) changes.
16+
- Cerberus can be used over an arbitrary transport layer without directly
17+
implementing special support for it in a generic Cerberus library.
18+
- References to MCTP in the Cerberus Challenge Protocol specification will be
19+
moved to an appendix, describing it as a possible option for transporting
20+
Cerberus.
21+
22+
# Proposal
23+
24+
"Transport agnostic" Cerberus specifies an *admissible transport* as any protocol
25+
or bus that satisfies a set of properties. These properties reflect the
26+
properties of MCTP already used by Cerberus.
27+
28+
1. An admissible transport is a mechanism for sending a *message* (a dynamically-\
29+
sized buffer of bytes) from one (not necessarily addressable) endpoint to
30+
another. In other words, the admissible transport is responsible for removing
31+
frames from packets and assembling them in sequence.
32+
33+
2. Each endpoint has a known *maximum message length*, measured in bytes. The
34+
transport is responsible for negotiating this parameter for each device a
35+
Cerberus device intends to speak to. This parameter must be made available
36+
to the Cerberus protocol but Cerberus itself does not negotiate it. This
37+
parameter must be at least 64 bytes.
38+
39+
3. Each message is either the request or response half of a Cerberus command, as
40+
defined in the Challenge Protocol. To uniquely identify the type of an
41+
incoming message, the binding of Cerberus to the admissible transport must
42+
specify a *transport-specific header* that contains at a minimum the following
43+
parameters. How they are encoded is irrelevant to Cerberus, beyond that they
44+
be computable without receiving the entire incoming message:
45+
- The command type byte (as specified in the Challenge Protocol).
46+
- Whether this message is the request or response half of the command.
47+
- Whether the payload is authenticated, i.e. whether the payload carried
48+
wether the payload carried a MAC or was encrypted using a shared secret.
49+
- The length of the incoming message, in bytes.
50+
- Addressing information that determines which device sent the message
51+
(the actual contents of this information is irrelevant to Cerberus).
52+
53+
4. Messages are "addressed", in two respects:
54+
a. A server can take a request and reply to the original sender with a
55+
response, and a client can match up requests and their responses.
56+
b. Cerberus can use addressing information of unspecified format to
57+
construct requests to a specific device (this opaque addressing
58+
information could be present in a PCD, for example).
59+
60+
By construction, MCTP almost fulfills the above requirements: it provides framing
61+
of a message of arbitrary size, and the PCIe Vendor command provides a location
62+
for the transport-specific header. Note that Cerberus itself performs the
63+
size negotiation at the moment, so that would be moved out of the Challenge
64+
Protocol and into the transport layer.
65+
66+
The above list is everything Cerberus needs: Cerberus can be spoken over any
67+
admissible transport with no change to the actual bytes present in the
68+
encoded messages.
69+
70+
# Specification Changelist
71+
72+
This RFC seeks the following changes to the Challenge Protocol spec:
73+
74+
- Chapter 3 (Protocol and Hierarchy) should be replaced with the list of
75+
requirements given above. We do not recommend using the above text
76+
exactly; instead, the new Chapter 3 should carefully elaborate each point,
77+
to make it possible for third parties to evaluate whether their chosen
78+
transport layer is admissible.
79+
80+
- The current contents of Chapter 3, which describes Cerberus-over-MCTP, should
81+
be moved into an appendix, provided as an example admissible transport layer
82+
for I2C connections. The same should be done for Section 8.1, which describes
83+
a legacy protocol built on top of SMBus.
84+
85+
- The first few sections of Chapter 6 should be modified to not reference MTCP,
86+
and instead refer to the abstract Cerberus header (request bit, type, length)
87+
derived from the transport-specific header.
88+
89+
- The MCTP-specific errors in Section 6.5 should be removed. Failures such
90+
during message assembly should be handled at the transport layer; the
91+
transport should define an error-reporting mechanism for surfacing such errors
92+
to a client. The nature of this mechanism is not relevant to Cerberus.
93+
94+
- Mentions of MCTP in Section 6.7 should be removed. The maximum message/packet
95+
size fields should be removed, since the transport layer should negotiate
96+
these while establishing a session, and pass the maximum message size field
97+
along to Cerberus.
98+
99+
- The same should be done for Section 6.13.
100+
101+
- The same should also be done for Section 6.18. Since the response makes
102+
reference to payload sizes, we recommend that, instead of replying with
103+
multiple messages of maximum size, we add a "continue" bit to the Get Log
104+
response. When this bit is set, the client must send another request, with
105+
the offset field increased by the length of the Get Log log contents field.
106+
107+
- The same applies to Sections 6.20, 6.23, and 6.31.
108+
109+
# Implementation Guidance
110+
111+
Manticore currently implements the above proposal via the following procedure:
112+
1. Receive a vtable from the library user that provides a function for blocking
113+
until a request arrives from somewhere.
114+
115+
2. When that function returns, Manticore's machinery calls a different function
116+
in the vtable for parsing the parts of the transport-specific header it needs
117+
to select a message parser and handler (request bit and type byte).
118+
119+
3. Manticore calls into the appropriate parser, which calls a third function in
120+
the vtable that provides a `read(2)` interface over the message payload to
121+
parse the message.
122+
123+
4. Pass the parsed message into the appropriate request handler, which constructs
124+
a response.
125+
126+
5. Manticore then calls a fourth function in the vtable, passing along the type
127+
of the response, that instructs the transport to prepare for a response. Note
128+
that the original request contained addressing information that the vtable
129+
tracks and re-uses for addressing the reply.
130+
131+
6. The transport encodes a response header; Manticore's serializer calls into a
132+
`write(2)` interface to encode the response. The transport may packetize
133+
the response as its internal buffer fills up.
134+
135+
7. Manticore calls the final, sixth function to flush the response, sending the
136+
final packet.
137+
138+
As the author understands it, this is somewhat close to how the Microsoft
139+
implementation handles messages, although it calls the MCTP library directly
140+
rather than virtually.
141+
142+
Manticore's vtable interface can he found at
143+
https://github.com/lowRISC/manticore/blob/e7a532/src/net.rs#L126.
144+
145+
# Future Work
146+
147+
Transport security. This proposal does not cover removing the USB-C-based
148+
transport security from the Cerberus protocol, but we hope to give those
149+
details a similar treatment so that Cerberus can be spoken over transports
150+
which provide their own security such as TLS, QUIC, etc.

0 commit comments

Comments
 (0)