/* Populate mech_oid with OID for the current SASL mechanism name. A bit silly given that we only support Kerberos V5 today, but will be useful when that changes. */ int gs2_get_oid (Gsasl_session * sctx, gss_OID * mech_oid) { gss_buffer_desc sasl_mech_name; OM_uint32 maj_stat, min_stat; sasl_mech_name.value = (void *) gsasl_mechanism_name (sctx); if (!sasl_mech_name.value) return GSASL_AUTHENTICATION_ERROR; sasl_mech_name.length = strlen (sasl_mech_name.value); maj_stat = gss_inquire_mech_for_saslname (&min_stat, &sasl_mech_name, mech_oid); if (GSS_ERROR (maj_stat)) return GSASL_GSSAPI_INQUIRE_MECH_FOR_SASLNAME_ERROR; return GSASL_OK; }
int main(int argc, char *argv[]) { gss_OID_set mechs; OM_uint32 major, minor; size_t i; major = gss_indicate_mechs(&minor, &mechs); if (GSS_ERROR(major)) { displayStatus("gss_indicate_mechs", major, minor); return major; } for (i = 0; i < mechs->count; i++) { gss_buffer_desc oidstr = GSS_C_EMPTY_BUFFER; gss_buffer_desc sasl_mech_name = GSS_C_EMPTY_BUFFER; gss_buffer_desc mech_name = GSS_C_EMPTY_BUFFER; gss_buffer_desc mech_description = GSS_C_EMPTY_BUFFER; gss_OID oid = GSS_C_NO_OID; major = gss_oid_to_str(&minor, &mechs->elements[i], &oidstr); if (GSS_ERROR(major)) continue; major = gss_inquire_saslname_for_mech(&minor, &mechs->elements[i], &sasl_mech_name, &mech_name, &mech_description); if (GSS_ERROR(major)) { gss_release_buffer(&minor, &oidstr); continue; } printf("-------------------------------------------------------------" "-----------------\n"); printf("OID : %.*s\n", (int)oidstr.length, (char *)oidstr.value); printf("SASL mech : %.*s\n", (int)sasl_mech_name.length, (char *)sasl_mech_name.value); printf("Mech name : %.*s\n", (int)mech_name.length, (char *)mech_name.value); printf("Mech desc : %.*s\n", (int)mech_description.length, (char *)mech_description.value); dumpMechAttrs(&minor, &mechs->elements[i]); printf("-------------------------------------------------------------" "-----------------\n"); if (GSS_ERROR(gss_inquire_mech_for_saslname(&minor, &sasl_mech_name, &oid))) { displayStatus("gss_inquire_mech_for_saslname", major, minor); } else if (oid == GSS_C_NO_OID || (oid->length != mechs->elements[i].length && memcmp(oid->elements, mechs->elements[i].elements, oid->length) != 0)) { gss_release_buffer(&minor, &oidstr); (void) gss_oid_to_str(&minor, oid, &oidstr); fprintf(stderr, "Got different OID %.*s for mechanism %.*s\n", (int)oidstr.length, (char *)oidstr.value, (int)sasl_mech_name.length, (char *)sasl_mech_name.value); } gss_release_buffer(&minor, &oidstr); gss_release_buffer(&minor, &sasl_mech_name); gss_release_buffer(&minor, &mech_name); gss_release_buffer(&minor, &mech_description); } gss_release_oid_set(&minor, &mechs); return GSS_ERROR(major) ? 1 : 0; }