static OM_uint32 gssEapExportPartialContext(OM_uint32 *minor, gss_ctx_id_t ctx, gss_buffer_t token) { OM_uint32 major, tmpMinor; size_t length, serverLen = 0; unsigned char *p; char serverBuf[MAXHOSTNAMELEN]; if (ctx->acceptorCtx.radConn != NULL) { if (rs_conn_get_current_peer(ctx->acceptorCtx.radConn, serverBuf, sizeof(serverBuf)) != 0) { #if 0 return gssEapRadiusMapError(minor, rs_err_conn_pop(ctx->acceptorCtx.radConn)); #else serverBuf[0] = '\0'; /* not implemented yet */ #endif } serverLen = strlen(serverBuf); } length = 4 + serverLen + 4 + ctx->acceptorCtx.state.length; token->value = GSSEAP_MALLOC(length); if (token->value == NULL) { major = GSS_S_FAILURE; *minor = ENOMEM; goto cleanup; } token->length = length; p = (unsigned char *)token->value; store_uint32_be(serverLen, p); p += 4; if (serverLen != 0) { memcpy(p, serverBuf, serverLen); p += serverLen; } store_uint32_be(ctx->acceptorCtx.state.length, p); p += 4; if (ctx->acceptorCtx.state.length != 0) { memcpy(p, ctx->acceptorCtx.state.value, ctx->acceptorCtx.state.length); p += ctx->acceptorCtx.state.length; } GSSEAP_ASSERT(p == (unsigned char *)token->value + token->length); major = GSS_S_COMPLETE; *minor = 0; cleanup: if (GSS_ERROR(major)) gss_release_buffer(&tmpMinor, token); return major; }
OM_uint32 gssEapCreateRadiusContext(OM_uint32 *minor, gss_cred_id_t cred, struct rs_context **pRadContext) { const char *configFile = RS_CONFIG_FILE; struct rs_context *radContext; struct rs_alloc_scheme ralloc; struct rs_error *err; OM_uint32 major; *pRadContext = NULL; if (rs_context_create(&radContext) != 0) { *minor = GSSEAP_RADSEC_CONTEXT_FAILURE; return GSS_S_FAILURE; } if (cred->radiusConfigFile.value != NULL) configFile = (const char *)cred->radiusConfigFile.value; ralloc.calloc = GSSEAP_CALLOC; ralloc.malloc = GSSEAP_MALLOC; ralloc.free = GSSEAP_FREE; ralloc.realloc = GSSEAP_REALLOC; rs_context_set_alloc_scheme(radContext, &ralloc); if (rs_context_read_config(radContext, configFile) != 0) { err = rs_err_ctx_pop(radContext); goto fail; } *pRadContext = radContext; *minor = 0; return GSS_S_COMPLETE; fail: major = gssEapRadiusMapError(minor, err); rs_context_destroy(radContext); return major; }