blob: ee5e866e03e3b6e7771bc73140ecb2bdab7ca024 [file] [view] [edit]
# SPDM Req-Resp Test — Crypto Integration Summary
## What was done
### 1. Add crypto server to the virt system image (`1ca5fd6`)
- `target/virt-ast1060-evb/spdm-req-resp-test/system.json5` added `crypto_server` app (64KB flash at `0x28000`, 64KB RAM); reduced `spdm_requester` RAM 96KB32KB to stay within the 640KB limit
- `services/crypto/server/BUILD.bazel` added `exports_files(["src/main.rs"])`
- `target/virt-ast1060-evb/spdm-req-resp-test/BUILD.bazel` added `crypto_server_app` target wiring directly to `services/crypto/server/src/main.rs`
- Test passes: crypto server starts, blocks on `object_wait`, SPDM exchange completes, QEMU exits cleanly
### 2. Wire SPDM requester/responder to the crypto server (`c50a38a`)
- `mock_platform.rs` extracted into a `rust_library` Bazel target (`//target/ast1060-evb/spdm-req-resp-test:mock_platform`) no duplication, shared by all four binaries (ast1060 + virt, requester + responder)
- `target/virt-ast1060-evb/spdm-req-resp-test/spdm_requester.rs` created uses `SpdmCryptoHash` and `SpdmCryptoRng` (IPC-backed) instead of mocks
- `target/virt-ast1060-evb/spdm-req-resp-test/spdm_responder.rs` created same
- `system.json5` updated `CRYPTO` channel_initiator added to both requester and responder processes
- VCA exchange (GET_VERSION, GET_CAPABILITIES, NEGOTIATE_ALGORITHMS) passes
### 3. Add GET_DIGESTS + fix crypto session isolation (`7fe9bc6`)
**Problem discovered:** The M1 transcript hash (`m1_hash`) opens a streaming SHA-384 session during ALGORITHMS and keeps it open across message boundaries. When GET_DIGESTS runs, `hash` tries to open another session on the same crypto server `SessionBusy` responder fails.
**Fix:** Give each `SpdmCryptoHash` instance its own dedicated IPC channel handle:
| Handle | Used by |
|---|---|
| `CRYPTO_REQ` | requester `hash` + `rng` |
| `CRYPTO_REQ_M1` | requester `m1_hash` |
| `CRYPTO_REQ_L1` | requester `l1_hash` |
| `CRYPTO_RESP` | responder `hash` + `rng` |
| `CRYPTO_RESP_M1` | responder `m1_hash` |
| `CRYPTO_RESP_L1` | responder `l1_hash` |
The crypto server now has 6 `channel_handler` objects and a `wait_group`, serving each with its own independent `HashSession` state.
**GET_DIGESTS added to the requester flow** first step that actually exercises the crypto server (SHA-384 hash over the responder's certificate chain via IPC).
## Final test result
```
//target/virt-ast1060-evb/spdm-req-resp-test:spdm_req_resp_test_test PASSED
```
SPDM exchange flow: GET_VERSION → GET_CAPABILITIES → NEGOTIATE_ALGORITHMS → GET_DIGESTS
All hash and RNG operations served by the crypto server over IPC using RustCrypto backend.
## Memory layout (virt-ast1060-evb)
```
0x00000500 - 0x00010000 Kernel flash (~62KB)
0x00010000 - 0x00018000 mctp_loopback_server (32KB)
0x00018000 - 0x00020000 spdm_requester (32KB)
0x00020000 - 0x00028000 spdm_responder (32KB)
0x00028000 - 0x00038000 crypto_server (64KB)
0x00058000 - 0x00070000 Kernel RAM (96KB)
0x00070000 - 0x00078000 mctp_loopback_server (32KB)
0x00078000 - 0x00080000 spdm_requester (32KB)
0x00080000 - 0x00090000 spdm_responder (64KB)
0x00090000 - 0x000A0000 crypto_server (64KB)
Total: 640KB
```