daf65d6ebad32b91cab025968ad10fc3c1043675
[mech_eap.orig] / util_context.c
1 /*
2  * Copyright (c) 2010, JANET(UK)
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  *
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * 3. Neither the name of JANET(UK) nor the names of its contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30  * SUCH DAMAGE.
31  */
32
33 #include "gssapiP_eap.h"
34
35 OM_uint32
36 gssEapAllocContext(OM_uint32 *minor,
37                    gss_ctx_id_t *pCtx)
38 {
39     gss_ctx_id_t ctx;
40
41     assert(*pCtx == GSS_C_NO_CONTEXT);
42
43     ctx = (gss_ctx_id_t)GSSEAP_CALLOC(1, sizeof(*ctx));
44     if (ctx == NULL) {
45         *minor = ENOMEM;
46         return GSS_S_FAILURE;
47     }
48
49     *pCtx = ctx;
50
51     return GSS_S_COMPLETE;
52 }
53
54 static void
55 releaseInitiatorContext(struct eap_gss_initiator_ctx *ctx)
56 {
57     eap_peer_sm_deinit(ctx->eap);
58     wpabuf_free(ctx->eapReqData);
59 }
60
61 static void
62 releaseAcceptorContext(struct eap_gss_acceptor_ctx *ctx)
63 {
64 }
65
66 OM_uint32
67 gssEapReleaseContext(OM_uint32 *minor,
68                      gss_ctx_id_t *pCtx)
69 {
70     OM_uint32 major, tmpMinor;
71     gss_ctx_id_t ctx = *pCtx;
72
73     if (ctx == GSS_C_NO_CONTEXT) {
74         return GSS_S_COMPLETE;
75     }
76
77     if (CTX_IS_INITIATOR(ctx)) {
78         releaseInitiatorContext(&ctx->initiatorCtx);
79     } else {
80         releaseAcceptorContext(&ctx->acceptorCtx);
81     }
82
83     if (ctx->encryptionKey != NULL) {
84         krb5_free_keyblock(ctx->kerberosCtx, ctx->encryptionKey);
85     }
86
87     if (ctx->kerberosCtx != NULL) {
88         krb5_free_context(ctx->kerberosCtx);
89     }
90
91     gssEapReleaseName(&tmpMinor, &ctx->initiatorName);
92     gssEapReleaseName(&tmpMinor, &ctx->acceptorName);
93
94     memset(ctx, 0, sizeof(*ctx));
95     GSSEAP_FREE(ctx);
96     *pCtx = GSS_C_NO_CONTEXT;
97
98     *minor = 0;
99     return GSS_S_COMPLETE;
100 }