@@ -227,21 +227,54 @@ static int spdm_negotiate_algs(struct spdm_state *spdm_state)
227227 struct spdm_negotiate_algs_req * req = spdm_state -> transcript_end ;
228228 struct spdm_negotiate_algs_rsp * rsp ;
229229 struct spdm_req_alg_struct * req_alg_struct ;
230- size_t req_sz = sizeof (* req );
231- size_t rsp_sz = sizeof (* rsp );
232- int rc , length ;
230+ size_t req_sz , rsp_sz ;
231+ int rc , length , i = 0 ;
232+
233+ req_sz = sizeof (* req ) +
234+ sizeof (* req_alg_struct ) * SPDM_MAX_REQ_ALG_STRUCT ;
233235
234236 /* Request length shall be <= 128 bytes (SPDM 1.1.0 margin no 185) */
235237 BUILD_BUG_ON (req_sz > 128 );
236238
237239 * req = (struct spdm_negotiate_algs_req ) {
238240 .code = SPDM_NEGOTIATE_ALGS ,
239- .length = cpu_to_le16 (req_sz ),
240241 .measurement_specification = SPDM_MEAS_SPEC_DMTF ,
241242 .base_asym_algo = cpu_to_le32 (SPDM_ASYM_ALGOS ),
242243 .base_hash_algo = cpu_to_le32 (SPDM_HASH_ALGOS ),
243244 };
244245
246+ /*
247+ * Only OpaqueDataFmt1 is supported with SPDM 1.2 or later
248+ * (Secured Messages using SPDM Spec 1.1.0 margin no 118)
249+ */
250+ if (spdm_state -> version >= 0x12 &&
251+ spdm_state -> rsp_caps & SPDM_KEY_EX_CAP )
252+ req -> other_params_support = SPDM_OPAQUE_DATA_FMT_GENERAL ;
253+
254+ req_alg_struct = (struct spdm_req_alg_struct * )(req + 1 );
255+ if (spdm_state -> rsp_caps & SPDM_KEY_EX_CAP ) {
256+ req_alg_struct [i ++ ] = (struct spdm_req_alg_struct ) {
257+ .alg_type = SPDM_REQ_ALG_STRUCT_DHE ,
258+ .alg_count = 0x20 ,
259+ .alg_supported = cpu_to_le16 (SPDM_DHE_ALGOS ),
260+ };
261+ req_alg_struct [i ++ ] = (struct spdm_req_alg_struct ) {
262+ .alg_type = SPDM_REQ_ALG_STRUCT_AEAD ,
263+ .alg_count = 0x20 ,
264+ .alg_supported = cpu_to_le16 (SPDM_AEAD_ALGOS ),
265+ };
266+ req_alg_struct [i ++ ] = (struct spdm_req_alg_struct ) {
267+ .alg_type = SPDM_REQ_ALG_STRUCT_KEY_SCHEDULE ,
268+ .alg_count = 0x20 ,
269+ .alg_supported = cpu_to_le16 (SPDM_KEY_SCHEDULE_SPDM ),
270+ };
271+ }
272+ WARN_ON (i > SPDM_MAX_REQ_ALG_STRUCT );
273+ req_sz = sizeof (* req ) + i * sizeof (* req_alg_struct );
274+ rsp_sz = sizeof (* rsp ) + i * sizeof (* req_alg_struct );
275+ req -> length = cpu_to_le16 (req_sz );
276+ req -> param1 = i ;
277+
245278 rsp = spdm_state -> transcript_end += req_sz ;
246279
247280 rc = spdm_exchange (spdm_state , req , req_sz , rsp , rsp_sz );
@@ -279,6 +312,7 @@ static int spdm_negotiate_algs(struct spdm_state *spdm_state)
279312 rsp -> ext_asym_sel_count != 0 ||
280313 rsp -> ext_hash_sel_count != 0 ||
281314 rsp -> param1 > req -> param1 ||
315+ rsp -> other_params_sel != req -> other_params_support ||
282316 (spdm_state -> rsp_caps & SPDM_MEAS_CAP_MASK &&
283317 (hweight32 (spdm_state -> meas_hash_alg ) != 1 ||
284318 rsp -> measurement_specification_sel != SPDM_MEAS_SPEC_DMTF ))) {
0 commit comments