Path: blob/main/crypto/krb5/src/lib/gssapi/spnego/gssapiP_negoex.h
39562 views
/* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */1/*2* Copyright (C) 2011-2018 PADL Software Pty Ltd.3* All rights reserved.4*5* Redistribution and use in source and binary forms, with or without6* modification, are permitted provided that the following conditions7* are met:8*9* * Redistributions of source code must retain the above copyright10* notice, this list of conditions and the following disclaimer.11*12* * Redistributions in binary form must reproduce the above copyright13* notice, this list of conditions and the following disclaimer in14* the documentation and/or other materials provided with the15* distribution.16*17* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS18* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT19* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS20* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE21* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,22* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES23* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR24* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)25* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,26* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)27* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED28* OF THE POSSIBILITY OF SUCH DAMAGE.29*/3031#include "k5-int.h"3233/*34* { iso(1) identified-organization(3) dod(6) internet(1) private(4)35* enterprise(1) microsoft (311) security(2) mechanisms(2) negoex(30) }36*/37#define NEGOEX_OID_LENGTH 1038#define NEGOEX_OID "\x2b\x06\x01\x04\x01\x82\x37\x02\x02\x1e"3940#define MESSAGE_SIGNATURE 0x535458454F47454EULL4142#define EXTENSION_LENGTH 124344#define EXTENSION_FLAG_CRITICAL 0x800000004546#define CHECKSUM_SCHEME_RFC3961 14748#define NEGOEX_KEYUSAGE_INITIATOR_CHECKSUM 2349#define NEGOEX_KEYUSAGE_ACCEPTOR_CHECKSUM 255051#define CHECKSUM_HEADER_LENGTH 205253#define GUID_LENGTH 165455typedef uint8_t auth_scheme[GUID_LENGTH];56typedef uint8_t conversation_id[GUID_LENGTH];57#define GUID_EQ(a, b) (memcmp(a, b, GUID_LENGTH) == 0)5859#define NEGO_MESSAGE_HEADER_LENGTH 9660#define EXCHANGE_MESSAGE_HEADER_LENGTH 6461#define VERIFY_MESSAGE_HEADER_LENGTH 8062#define ALERT_MESSAGE_HEADER_LENGTH 7263#define ALERT_LENGTH 1264#define ALERT_PULSE_LENGTH 86566#define ALERT_TYPE_PULSE 167#define ALERT_VERIFY_NO_KEY 16869enum message_type {70INITIATOR_NEGO = 0, /* NEGO_MESSAGE */71ACCEPTOR_NEGO, /* NEGO_MESSAGE */72INITIATOR_META_DATA, /* EXCHANGE_MESSAGE */73ACCEPTOR_META_DATA, /* EXCHANGE_MESSAGE */74CHALLENGE, /* EXCHANGE_MESSAGE */75AP_REQUEST, /* EXCHANGE_MESSAGE */76VERIFY, /* VERIFY_MESSAGE */77ALERT, /* ALERT */78};7980struct nego_message {81uint8_t random[32];82const uint8_t *schemes;83uint16_t nschemes;84};8586struct exchange_message {87auth_scheme scheme;88gss_buffer_desc token;89};9091struct verify_message {92auth_scheme scheme;93uint32_t cksum_type;94const uint8_t *cksum;95size_t cksum_len;96size_t offset_in_token;97};9899struct alert_message {100auth_scheme scheme;101int verify_no_key;102};103104struct negoex_message {105uint32_t type;106union {107struct nego_message n;108struct exchange_message e;109struct verify_message v;110struct alert_message a;111} u;112};113114struct negoex_auth_mech {115K5_TAILQ_ENTRY(negoex_auth_mech) links;116gss_OID oid;117auth_scheme scheme;118gss_ctx_id_t mech_context;119gss_buffer_desc metadata;120krb5_keyblock key;121krb5_keyblock verify_key;122int complete;123int sent_checksum;124int verified_checksum;125};126127/* negoex_util.c */128129OM_uint32130negoex_parse_token(OM_uint32 *minor, spnego_gss_ctx_id_t ctx,131gss_const_buffer_t token,132struct negoex_message **messages_out, size_t *count_out);133134135struct nego_message *136negoex_locate_nego_message(struct negoex_message *messages, size_t nmessages,137enum message_type type);138struct exchange_message *139negoex_locate_exchange_message(struct negoex_message *messages,140size_t nmessages, enum message_type type);141struct verify_message *142negoex_locate_verify_message(struct negoex_message *messages,143size_t nmessages);144struct alert_message *145negoex_locate_alert_message(struct negoex_message *messages, size_t nmessages);146147void148negoex_add_nego_message(spnego_gss_ctx_id_t ctx, enum message_type type,149uint8_t random[32]);150void151negoex_add_exchange_message(spnego_gss_ctx_id_t ctx, enum message_type type,152const auth_scheme scheme, gss_buffer_t token);153void154negoex_add_verify_message(spnego_gss_ctx_id_t ctx, const auth_scheme scheme,155uint32_t cksum_type, const uint8_t *cksum,156uint32_t cksum_len);157158void159negoex_add_verify_no_key_alert(spnego_gss_ctx_id_t ctx,160const auth_scheme scheme);161162OM_uint32163negoex_random(OM_uint32 *minor, spnego_gss_ctx_id_t ctx,164unsigned char *data, size_t length);165166void167negoex_prep_context_for_spnego(spnego_gss_ctx_id_t ctx);168169OM_uint32170negoex_prep_context_for_negoex(OM_uint32 *minor, spnego_gss_ctx_id_t ctx);171172void173negoex_release_context(spnego_gss_ctx_id_t ctx);174175OM_uint32176negoex_add_auth_mech(OM_uint32 *minor, spnego_gss_ctx_id_t ctx,177gss_const_OID oid, auth_scheme scheme);178179void180negoex_delete_auth_mech(spnego_gss_ctx_id_t ctx,181struct negoex_auth_mech *mech);182183void184negoex_select_auth_mech(spnego_gss_ctx_id_t ctx,185struct negoex_auth_mech *mech);186187struct negoex_auth_mech *188negoex_locate_auth_scheme(spnego_gss_ctx_id_t ctx, const auth_scheme scheme);189190void191negoex_common_auth_schemes(spnego_gss_ctx_id_t ctx,192const uint8_t *schemes, uint16_t nschemes);193194void195negoex_restrict_auth_schemes(spnego_gss_ctx_id_t ctx,196const uint8_t *schemes, uint16_t nschemes);197198/* negoex_ctx.c */199200OM_uint32201negoex_init(OM_uint32 *minor, spnego_gss_ctx_id_t ctx, gss_cred_id_t cred,202gss_name_t target_name, OM_uint32 req_flags, OM_uint32 time_req,203gss_buffer_t input_token, gss_channel_bindings_t bindings,204gss_buffer_t output_token, OM_uint32 *time_rec);205206OM_uint32207negoex_accept(OM_uint32 *minor, spnego_gss_ctx_id_t ctx, gss_cred_id_t cred,208gss_buffer_t input_token, gss_channel_bindings_t bindings,209gss_buffer_t output_token, OM_uint32 *time_rec);210211212