@@ -1264,6 +1264,29 @@ static uint32_t gssntlm_sasl_ssf(uint32_t *minor_status,
12641264 return GSSERRS (retmin , retmaj );
12651265}
12661266
1267+ static uint32_t gssntlm_sspi_session_key (uint32_t * minor_status ,
1268+ struct gssntlm_ctx * ctx ,
1269+ gss_buffer_set_t * data_set )
1270+ {
1271+ uint32_t retmin ;
1272+ uint32_t retmaj ;
1273+ uint32_t tmpmin ;
1274+ gss_buffer_desc session_key_buf ;
1275+
1276+ if (ctx -> exported_session_key .length == 0 ) {
1277+ return GSSERRS (ERR_NOTAVAIL , GSS_S_UNAVAILABLE );
1278+ }
1279+
1280+ session_key_buf .length = ctx -> exported_session_key .length ;
1281+ session_key_buf .value = ctx -> exported_session_key .data ;
1282+
1283+ retmaj = gss_add_buffer_set_member (& retmin , & session_key_buf , data_set );
1284+ if (retmaj != GSS_S_COMPLETE ) {
1285+ (void )gss_release_buffer_set (& tmpmin , data_set );
1286+ }
1287+ return GSSERRS (retmin , retmaj );
1288+ }
1289+
12671290uint32_t gssntlm_inquire_sec_context_by_oid (uint32_t * minor_status ,
12681291 const gss_ctx_id_t context_handle ,
12691292 const gss_OID desired_object ,
@@ -1290,6 +1313,8 @@ uint32_t gssntlm_inquire_sec_context_by_oid(uint32_t *minor_status,
12901313 return gssntlm_spnego_req_mic (minor_status , ctx , data_set );
12911314 } else if (gss_oid_equal (desired_object , & sasl_ssf_oid )){
12921315 return gssntlm_sasl_ssf (minor_status , ctx , data_set );
1316+ } else if (gss_oid_equal (desired_object , GSS_C_INQ_SSPI_SESSION_KEY )) {
1317+ return gssntlm_sspi_session_key (minor_status , ctx , data_set );
12931318 }
12941319
12951320 return GSSERRS (ERR_NOTSUPPORTED , GSS_S_UNAVAILABLE );
0 commit comments