Heimdal portability fixes (except for reauth)
[mech_eap.orig] / inquire_mech_for_saslname.c
index f42df28..6de0399 100644 (file)
  * SUCH DAMAGE.
  */
 
+/*
+ * Map mechanism OID to a SASL mechanism name.
+ */
+
 #include "gssapiP_eap.h"
 
 OM_uint32
@@ -39,11 +43,42 @@ gss_inquire_saslname_for_mech(OM_uint32 *minor,
                               gss_buffer_t mech_name,
                               gss_buffer_t mech_description)
 {
+    OM_uint32 major;
     gss_buffer_t name;
+    krb5_enctype etype = ENCTYPE_NULL;
+
+    /* Dynamically construct mechanism name from Kerberos string enctype */
+    major = gssEapOidToEnctype(minor, mech, &etype);
+    if (GSS_ERROR(major))
+        return major;
+
+    if (mech_name != GSS_C_NO_BUFFER) {
+        krb5_context krbContext;
+
+        GSSEAP_KRB_INIT(&krbContext);
+
+        *minor = krbEnctypeToString(krbContext, etype, "eap-", mech_name);
+        if (*minor != 0)
+            return GSS_S_FAILURE;
+    }
+
+    if (mech_description != GSS_C_NO_BUFFER) {
+        major = makeStringBuffer(minor,
+                                 "Extensible Authentication Protocol GSS-API Mechanism",
+                                 mech_description);
+        if (GSS_ERROR(major))
+            return major;
+    }
 
-    name = gssEapOidToSaslName(mech);
-    if (name == GSS_C_NO_BUFFER)
-        return GSS_S_BAD_MECH;
+    if (sasl_mech_name != GSS_C_NO_BUFFER) {
+        name = gssEapOidToSaslName(mech);
+        if (name == GSS_C_NO_BUFFER) {
+            major = GSS_S_BAD_MECH;
+            *minor = GSSEAP_WRONG_MECH;
+        } else {
+            major = duplicateBuffer(minor, name, sasl_mech_name);
+        }
+    }
 
-    return duplicateBuffer(minor, name, sasl_mech_name);
+    return major;
 }