static krb5_error_code find_etypelist(krb5_context context, krb5_auth_context auth_context, EtypeList *etypes) { krb5_error_code ret; krb5_authdata *ad; krb5_authdata adIfRelevant; unsigned i; adIfRelevant.len = 0; etypes->len = 0; etypes->val = NULL; ad = auth_context->authenticator->authorization_data; if (ad == NULL) return 0; for (i = 0; i < ad->len; i++) { if (ad->val[i].ad_type == KRB5_AUTHDATA_IF_RELEVANT) { ret = decode_AD_IF_RELEVANT(ad->val[i].ad_data.data, ad->val[i].ad_data.length, &adIfRelevant, NULL); if (ret) return ret; if (adIfRelevant.len == 1 && adIfRelevant.val[0].ad_type == KRB5_AUTHDATA_GSS_API_ETYPE_NEGOTIATION) { break; } free_AD_IF_RELEVANT(&adIfRelevant); adIfRelevant.len = 0; } } if (adIfRelevant.len == 0) return 0; ret = decode_EtypeList(adIfRelevant.val[0].ad_data.data, adIfRelevant.val[0].ad_data.length, etypes, NULL); if (ret) krb5_clear_error_string(context); free_AD_IF_RELEVANT(&adIfRelevant); return ret; }
static krb5_error_code find_etypelist(krb5_context context, krb5_auth_context auth_context, EtypeList *etypes) { krb5_error_code ret; krb5_data data; ret = _krb5_get_ad(context, auth_context->authenticator->authorization_data, NULL, KRB5_AUTHDATA_GSS_API_ETYPE_NEGOTIATION, &data); if (ret) return 0; ret = decode_EtypeList(data.data, data.length, etypes, NULL); krb5_data_free(&data); if (ret) krb5_clear_error_message(context); return ret; }