|
| 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