neglected gss-eap-v1 arc in OID comment table
[mech_eap.git] / mech_eap / init_sec_context.c
index a123626..9da9f4f 100644 (file)
@@ -561,17 +561,42 @@ eapGssSmInitAcceptorName(OM_uint32 *minor,
                                   outputToken, NULL);
         if (GSS_ERROR(major))
             return major;
-    } else if (inputToken != GSS_C_NO_BUFFER &&
-               ctx->acceptorName == GSS_C_NO_NAME) {
-        /* Accept target name hint from acceptor */
+    } else if (inputToken != GSS_C_NO_BUFFER) {
+        OM_uint32 tmpMinor;
+        gss_name_t nameHint;
+        int equal;
+
+        /* Accept target name hint from acceptor or verify acceptor */
         major = gssEapImportName(minor, inputToken,
                                  GSS_C_NT_USER_NAME,
                                  ctx->mechanismUsed,
-                                 &ctx->acceptorName);
+                                 &nameHint);
         if (GSS_ERROR(major))
             return major;
+
+        if (ctx->acceptorName != GSS_C_NO_NAME) {
+            /* verify name hint matched asserted acceptor name  */
+            major = gss_compare_name(minor, nameHint,
+                                     ctx->acceptorName, &equal);
+            if (GSS_ERROR(major)) {
+                gss_release_name(&tmpMinor, &nameHint);
+                return major;
+            }
+
+            gss_release_name(&tmpMinor, &nameHint);
+
+            if (!equal) {
+                *minor = GSSEAP_BAD_CONTEXT_TOKEN;
+                return GSS_S_DEFECTIVE_TOKEN;
+            }
+        } else {
+            /* accept acceptor name hint */
+            ctx->acceptorName = nameHint;
+            nameHint = GSS_C_NO_NAME;
+        }
     }
 
+
     /*
      * Currently, other parts of the code assume that the acceptor name
      * is available, hence this check.
@@ -892,7 +917,8 @@ static struct gss_eap_sm eapGssInitiatorSm[] = {
     {
         ITOK_TYPE_ACCEPTOR_NAME_RESP,
         ITOK_TYPE_ACCEPTOR_NAME_REQ,
-        GSSEAP_STATE_INITIAL | GSSEAP_STATE_AUTHENTICATE,
+        GSSEAP_STATE_INITIAL | GSSEAP_STATE_AUTHENTICATE
+       | GSSEAP_STATE_ACCEPTOR_EXTS ,
         0,
         eapGssSmInitAcceptorName
     },