#include "ntlm.h"
gss_OID_desc GSSAPI_LIB_VARIABLE __gss_ntlm_get_session_key_x_oid_desc =
{6, rk_UNCONST("\x2a\x85\x70\x2b\x0d\x14")};
gss_OID_desc GSSAPI_LIB_VARIABLE __gss_c_nt_ntlm_oid_desc =
{6, rk_UNCONST("\x2a\x85\x70\x2b\x0d\x15")};
gss_OID_desc GSSAPI_LIB_VARIABLE __gss_c_ntlm_v1 =
{6, rk_UNCONST("\x2a\x85\x70\x2b\x0d\x19")};
gss_OID_desc GSSAPI_LIB_VARIABLE __gss_c_ntlm_v2 =
{6, rk_UNCONST("\x2a\x85\x70\x2b\x0d\x1a")};
gss_OID_desc GSSAPI_LIB_VARIABLE __gss_c_ntlm_session_key =
{6, rk_UNCONST("\x2a\x85\x70\x2b\x0d\x1b")};
gss_OID_desc GSSAPI_LIB_VARIABLE __gss_c_ntlm_force_v1 =
{6, rk_UNCONST("\x2a\x85\x70\x2b\x0d\x1c")};
gss_OID_desc GSSAPI_LIB_VARIABLE __gss_c_ntlm_support_channelbindings =
{6, rk_UNCONST("\x2a\x85\x70\x2b\x0d\x1d")};
gss_OID_desc GSSAPI_LIB_VARIABLE __gss_c_ntlm_support_lm2 =
{6, rk_UNCONST("\x2a\x85\x70\x2b\x0d\x1f")};
#ifdef ENABLE_NTLM
static int
get_signing_supported(gss_OID mech, gss_mo_desc *mo, gss_buffer_t value)
{
OM_uint32 major, minor;
ntlm_ctx ctx;
int def = 0;
major = _gss_ntlm_allocate_ctx(&minor, NULL, &ctx);
if (major == GSS_S_COMPLETE) {
gss_ctx_id_t gctx = (gss_ctx_id_t)ctx;
if ((ctx->probe_flags & NSI_NO_SIGNING) == 0)
def = 1;
_gss_ntlm_delete_sec_context(&minor, &gctx, NULL);
}
if (!def)
return _gss_mo_get_option_0(mech, mo, value);
return _gss_mo_get_option_1(mech, mo, value);
}
static gss_mo_desc _gssntlm_mech_options[] = {
{ GSS_C_NTLM_V1, "NTLMv1", NULL, _gss_mo_get_option_1 },
{ GSS_C_NTLM_FORCE_V1, "Force NTLMv1", NULL, _gss_mo_get_option_0 },
{ GSS_C_NTLM_V2, "NTLMv2", NULL, _gss_mo_get_option_1 },
{ GSS_C_NTLM_SESSION_KEY, "NTLM session key", NULL, get_signing_supported },
{ GSS_C_NTLM_SUPPORT_CHANNELBINDINGS, "NTLM support channel bindings", NULL, _gss_mo_get_option_1 },
{ GSS_C_NTLM_SUPPORT_LM2, "NTLM support LM2", NULL, _gss_mo_get_option_1 },
};
static gssapi_mech_interface_desc ntlm_mech = {
GMI_VERSION,
"ntlm",
{10, rk_UNCONST("\x2b\x06\x01\x04\x01\x82\x37\x02\x02\x0a") },
0,
_gss_ntlm_acquire_cred,
_gss_ntlm_release_cred,
_gss_ntlm_init_sec_context,
_gss_ntlm_accept_sec_context,
_gss_ntlm_process_context_token,
_gss_ntlm_delete_sec_context,
_gss_ntlm_context_time,
_gss_ntlm_get_mic,
_gss_ntlm_verify_mic,
_gss_ntlm_wrap,
_gss_ntlm_unwrap,
_gss_ntlm_display_status,
NULL,
_gss_ntlm_compare_name,
_gss_ntlm_display_name,
_gss_ntlm_import_name,
_gss_ntlm_export_name,
_gss_ntlm_release_name,
_gss_ntlm_inquire_cred,
_gss_ntlm_inquire_context,
_gss_ntlm_wrap_size_limit,
_gss_ntlm_add_cred,
_gss_ntlm_inquire_cred_by_mech,
_gss_ntlm_export_sec_context,
_gss_ntlm_import_sec_context,
_gss_ntlm_inquire_names_for_mech,
_gss_ntlm_inquire_mechs_for_name,
_gss_ntlm_canonicalize_name,
_gss_ntlm_duplicate_name,
_gss_ntlm_inquire_sec_context_by_oid,
NULL,
NULL,
NULL,
NULL,
_gss_ntlm_wrap_iov,
_gss_ntlm_unwrap_iov,
_gss_ntlm_wrap_iov_length,
NULL,
NULL,
NULL,
_gss_ntlm_acquire_cred_ex,
_gss_ntlm_iter_creds_f,
_gss_ntlm_destroy_cred,
_gss_ntlm_cred_hold,
_gss_ntlm_cred_unhold,
_gss_ntlm_cred_label_get,
_gss_ntlm_cred_label_set,
_gssntlm_mech_options,
sizeof(_gssntlm_mech_options) / sizeof(_gssntlm_mech_options[0])
};
#endif
gssapi_mech_interface
__gss_ntlm_initialize(void)
{
#ifdef ENABLE_NTLM
return &ntlm_mech;
#else
return NULL;
#endif
}
gss_OID_desc GSSAPI_LIB_VARIABLE __gss_ntlm_mechanism_oid_desc =
{10, rk_UNCONST("\x2b\x06\x01\x04\x01\x82\x37\x02\x02\x0a") };
gss_OID_desc GSSAPI_LIB_VARIABLE __gss_c_inq_win2k_pac_x_oid_desc =
{8, rk_UNCONST("\x2a\x85\x70\x2b\x0d\x03\x81\x00")};
gss_OID_desc GSSAPI_LIB_VARIABLE __gss_c_ntlm_guest_oid_desc =
{6, rk_UNCONST("\x2a\x85\x70\x2b\x0d\x18")};
#undef GSS_NTLM_GET_SESSION_KEY_X
GSSAPI_LIB_VARIABLE gss_OID GSS_NTLM_GET_SESSION_KEY_X =
&__gss_ntlm_get_session_key_x_oid_desc;
#undef GSS_NTLM_MECHANISM
GSSAPI_LIB_VARIABLE gss_OID GSS_NTLM_MECHANISM =
&__gss_ntlm_mechanism_oid_desc;
#undef GSS_C_NT_NTLM
GSSAPI_LIB_VARIABLE gss_OID GSS_C_NT_NTLM =
&__gss_c_nt_ntlm_oid_desc;
#undef GSS_C_NTLM_GUEST
GSSAPI_LIB_VARIABLE gss_OID GSS_C_NTLM_GUEST =
&__gss_c_ntlm_guest_oid_desc;