dead code removal
[mech_eap.orig] / accept_sec_context.c
index 4efda99..ecd5e1c 100644 (file)
 
 #include "gssapiP_eap.h"
 
+#ifdef BUILTIN_EAP
+#define EAP_KEY_AVAILABLE(ctx)  ((ctx)->acceptorCtx.eapPolInterface->eapKeyAvailable)
+#define EAP_KEY_DATA(ctx)       ((ctx)->acceptorCtx.eapPolInterface->eapKeyData)
+#define EAP_KEY_LENGTH(ctx)     ((ctx)->acceptorCtx.eapPolInterface->eapKeyDataLen)
+#else
+#define EAP_KEY_AVAILABLE(ctx)  0
+#define EAP_KEY_DATA(ctx)       NULL
+#define EAP_KEY_LENGTH(ctx)     0
+#endif /* BUILTIN_EAP */
+
+static OM_uint32
+acceptReady(OM_uint32 *minor, gss_ctx_id_t ctx);
+
+#ifdef BUILTIN_EAP
 #define EAP_MAX_METHODS 8
 
 #define EAP_TTLS_AUTH_PAP 1
@@ -39,7 +53,6 @@
 #define EAP_TTLS_AUTH_MSCHAP 4
 #define EAP_TTLS_AUTH_MSCHAPV2 8
 
-#if 1
 struct eap_user {
         struct {
                 int vendor;
@@ -213,46 +226,6 @@ serverGetEapReqIdText(void *ctx,
     *len = 0;
     return NULL;
 }
-#endif
-
-static OM_uint32
-acceptReady(OM_uint32 *minor, gss_ctx_id_t ctx)
-{
-    OM_uint32 major;
-    krb5_context krbContext;
-
-    GSSEAP_KRB_INIT(&krbContext);
-
-    /* Cache encryption type derived from selected mechanism OID */
-    major = gssEapOidToEnctype(minor, ctx->mechanismUsed, &ctx->encryptionType);
-    if (GSS_ERROR(major))
-        return major;
-
-    if (ctx->encryptionType != ENCTYPE_NULL &&
-        ctx->acceptorCtx.eapPolInterface->eapKeyAvailable) {
-        major = gssEapDeriveRFC3961Key(minor,
-                                       ctx->acceptorCtx.eapPolInterface->eapKeyData,
-                                       ctx->acceptorCtx.eapPolInterface->eapKeyDataLen,
-                                       ctx->encryptionType,
-                                       &ctx->rfc3961Key);
-        if (GSS_ERROR(major))
-            return major;
-    } else {
-        /*
-         * draft-howlett-eap-gss says that integrity/confidentialty should
-         * always be advertised as available, but if we have no keying
-         * material it seems confusing to the caller to advertise this.
-         */
-        ctx->gssFlags &= ~(GSS_C_INTEG_FLAG | GSS_C_CONF_FLAG);
-    }
-
-    sequenceInit(&ctx->seqState, ctx->recvSeq,
-                 ((ctx->gssFlags & GSS_C_REPLAY_FLAG) != 0),
-                 ((ctx->gssFlags & GSS_C_SEQUENCE_FLAG) != 0),
-                 TRUE);
-
-    return GSS_S_COMPLETE;
-}
 
 static OM_uint32
 eapGssSmAcceptAuthenticate(OM_uint32 *minor,
@@ -342,6 +315,21 @@ cleanup:
 
     return major;
 }
+#else
+static OM_uint32
+eapGssSmAcceptAuthenticate(OM_uint32 *minor,
+                           gss_ctx_id_t ctx,
+                           gss_cred_id_t cred,
+                           gss_buffer_t inputToken,
+                           gss_channel_bindings_t chanBindings,
+                           gss_buffer_t outputToken)
+{
+    OM_uint32 major, tmpMinor;
+
+cleanup:
+    return major;
+}
+#endif /* BUILTIN_EAP */
 
 static OM_uint32
 eapGssSmAcceptGssChannelBindings(OM_uint32 *minor,
@@ -370,10 +358,8 @@ eapGssSmAcceptGssChannelBindings(OM_uint32 *minor,
     iov[0].buffer.length = 0;
     iov[0].buffer.value = NULL;
 
-    major = gssEapEncodeGssChannelBindings(minor, chanBindings,
-                                            &iov[0].buffer);
-    if (GSS_ERROR(major))
-        return major;
+    if (chanBindings != GSS_C_NO_CHANNEL_BINDINGS)
+        iov[0].buffer = chanBindings->application_data;
 
     iov[1].type = GSS_IOV_BUFFER_TYPE_HEADER;
     iov[1].buffer.length = 16;
@@ -391,7 +377,9 @@ eapGssSmAcceptGssChannelBindings(OM_uint32 *minor,
         ctx->state = EAP_STATE_ESTABLISHED;
     }
 
+#if 0
     gss_release_buffer(&tmpMinor, &iov[0].buffer);
+#endif
 
     return major;
 }
@@ -409,7 +397,7 @@ eapGssSmAcceptEstablished(OM_uint32 *minor,
     return GSS_S_BAD_STATUS;
 }
 
-static struct eap_gss_acceptor_sm {
+static struct gss_eap_acceptor_sm {
     enum gss_eap_token_type inputTokenType;
     enum gss_eap_token_type outputTokenType;
     OM_uint32 (*processToken)(OM_uint32 *,
@@ -444,14 +432,12 @@ gss_accept_sec_context(OM_uint32 *minor,
     OM_uint32 major;
     OM_uint32 tmpMajor, tmpMinor;
     gss_ctx_id_t ctx = *context_handle;
-    struct eap_gss_acceptor_sm *sm = NULL;
-    gss_buffer_desc innerInputToken, innerOutputToken;
+    struct gss_eap_acceptor_sm *sm = NULL;
+    gss_buffer_desc innerInputToken = GSS_C_EMPTY_BUFFER;
+    gss_buffer_desc innerOutputToken = GSS_C_EMPTY_BUFFER;
 
     *minor = 0;
 
-    innerOutputToken.length = 0;
-    innerOutputToken.value = NULL;
-
     output_token->length = 0;
     output_token->value = NULL;
 
@@ -539,3 +525,50 @@ cleanup:
 
     return major;
 }
+
+/*
+ * Mark a context as ready for cryptographic operations
+ */
+static OM_uint32
+acceptReady(OM_uint32 *minor, gss_ctx_id_t ctx)
+{
+    OM_uint32 major;
+
+    /* Cache encryption type derived from selected mechanism OID */
+    major = gssEapOidToEnctype(minor, ctx->mechanismUsed, &ctx->encryptionType);
+    if (GSS_ERROR(major))
+        return major;
+
+    if (ctx->encryptionType != ENCTYPE_NULL &&
+        EAP_KEY_AVAILABLE(ctx)) {
+        major = gssEapDeriveRfc3961Key(minor,
+                                       EAP_KEY_DATA(ctx),
+                                       EAP_KEY_LENGTH(ctx),
+                                       ctx->encryptionType,
+                                       &ctx->rfc3961Key);
+        if (GSS_ERROR(major))
+            return major;
+
+        major = rfc3961ChecksumTypeForKey(minor, &ctx->rfc3961Key,
+                                           &ctx->checksumType);
+        if (GSS_ERROR(major))
+            return major;
+    } else {
+        /*
+         * draft-howlett-eap-gss says that integrity/confidentialty should
+         * always be advertised as available, but if we have no keying
+         * material it seems confusing to the caller to advertise this.
+         */
+        ctx->gssFlags &= ~(GSS_C_INTEG_FLAG | GSS_C_CONF_FLAG);
+    }
+
+    major = sequenceInit(minor,
+                         &ctx->seqState, ctx->recvSeq,
+                         ((ctx->gssFlags & GSS_C_REPLAY_FLAG) != 0),
+                         ((ctx->gssFlags & GSS_C_SEQUENCE_FLAG) != 0),
+                         TRUE);
+    if (GSS_ERROR(major))
+        return major;
+
+    return GSS_S_COMPLETE;
+}