@@ -8,7 +8,7 @@ while a different key can be restricted to only sign the M1/M2 transcript. As su
88endpoint supports multikey, the local endpoint must ensure that it uses the appropriate key and
99certificate slot when signing or verifying messages.
1010
11- ## Endpoint Support for Multikey
11+ ## libspdm Endpoint Support for Multikey
1212
1313SPDM allows an endpoint to support multikey in one of three ways.
14141 . No support at all (` MULTI_KEY_CAP == 0 ` ).
@@ -19,15 +19,59 @@ Use `libspdm_set_data`, `LIBSPDM_DATA_OTHER_PARAMS_SUPPORT`, and the
1919` SPDM_ALGORITHMS_MULTI_KEY_CONN ` boolean to specify how libspdm should handle the case when the peer
2020endpoint's multikey support is conditional (` MULTI_KEY_CAP == 2 ` ).
2121
22- ### Multikey Flow for libspdm Requester
22+ ## Multikey Flow For Requester
2323
24241 . Call ` libspdm_init_connection ` and check that the call is successful.
25- 2 . Call ` libspdm_get_data ` with ` LIBSPDM_DATA_MULTI_KEY_CONN_RSP ` to determine whether the
25+ 2 . Proceed through the "Responder Sign / Requester Verify Flow".
26+ 3 . If Requester's ` MULTI_KEY_CAP ` is non-zero, then proceed through the
27+ "Requester Sign / Responder Verify Flow".
28+
29+ If Requester's ` MULTI_KEY_CAP ` is non-zero then both ` ENCAP_CAP ` and ` CERT_CAP ` must be set.
30+
31+ ### Responder Sign / Requester Verify Flow
32+
33+ 1 . Call ` libspdm_get_data ` with ` LIBSPDM_DATA_MULTI_KEY_CONN_RSP ` to determine whether the
2634 connection utilizes multikey (` true ` ) or not (` false ` ). If the value is ` true ` then continue with
2735 this flow, else the connection behaves in a single key manner.
28- 3 . Call ` libspdm_get_digest ` and check that the call is successful.
29- 4 . For each populated certificate chain slot call ` libspdm_get_certificate ` and check that each call
36+ 2 . Call ` libspdm_get_digest ` and check that the call is successful.
37+ 3 . For each populated certificate chain slot call ` libspdm_get_certificate ` and check that each call
3038 is successful.
31394 . Use ` libspdm_get_data ` with ` LIBSPDM_DATA_PEER_KEY_USAGE_BIT_MASK ` to query the ` KeyUsageMask `
3240 for each populated certificate slot. Use the ` SPDM_KEY_USAGE_BIT_MASK_* ` macros to determine the
3341 legal messages for that certificate slot and key.
42+
43+ ### Requester Sign / Responder Verify Flow
44+
45+ 1 . If Requester's ` MULTI_KEY_CAP == 1 ` then skip to Step 2. If ` MULTI_KEY_CAP == 2 ` then call
46+ ` libspdm_get_data ` with ` LIBSPDM_DATA_MULTI_KEY_CONN_REQ ` to determine whether the connection
47+ utilizes multikey (` true ` ) or not (` false ` ). If it is ` true ` then continue to Step 2.
48+ 2 . Call ` libspdm_set_data ` with ` LIBSPDM_DATA_LOCAL_KEY_PAIR_ID ` and
49+ ` LIBSPDM_DATA_LOCAL_KEY_USAGE_BIT_MASK ` to map ` KeyPairID ` s with certificate slots for the
50+ negotiated asymmetric cryptography algorithm (` ReqBaseAsymAlg ` or ` ReqPqcAsymAlg ` ) and to
51+ specify the messages a key can be associated with.
52+ - If ` MULTI_KEY_CAP == 1 ` and the Requester supports only one asymmetric cryptography
53+ algorithm for signing then this step can be performed before the connection is
54+ established.
55+ 3 . Calls to ` libspdm_requester_data_sign ` then specify the ` KeyPairID ` .
56+
57+ ## Multikey Flow for Responder
58+
59+ ### Responder Sign / Requester Verify Flow
60+
61+ 1 . If Responder's ` MULTI_KEY_CAP == 1 ` then skip to Step 2. If ` MULTI_KEY_CAP == 2 ` then, after
62+ ` VCA ` has completed and the connection status has transitioned to
63+ ` LIBSPDM_CONNECTION_STATE_NEGOTIATED ` , call ` libspdm_get_data ` with
64+ ` LIBSPDM_DATA_MULTI_KEY_CONN_RSP ` to determine whether the connection utilizes multikey (` true ` )
65+ or not (` false ` ). If it is ` true ` then continue to Step 2.
66+ 2 . Call ` libspdm_set_data ` with ` LIBSPDM_DATA_LOCAL_KEY_PAIR_ID ` and
67+ ` LIBSPDM_DATA_LOCAL_KEY_USAGE_BIT_MASK ` to map ` KeyPairID ` s with certificate slots for the
68+ negotiated asymmetric cryptography algorithm (` BaseAsymSel ` or ` PqcAsymSel ` ) and to specify
69+ the messages a key can be associated with.
70+ - If ` MULTI_KEY_CAP == 1 ` and the Responder supports only one asymmetric cryptography
71+ algorithm for signing then this step can be performed before the connection is
72+ established.
73+ 3 . Calls to ` libspdm_responder_data_sign ` then specify the ` KeyPairID ` .
74+
75+ ### Requester Sign / Responder Verify Flow
76+
77+ TBD.
0 commit comments