📄 kssl.c
字号:
/* ssl/kssl.c -*- mode: C; c-file-style: "eay" -*- *//* Written by Vern Staats <staatsvr@asc.hpc.mil> for the OpenSSL project 2000. *//* ==================================================================== * Copyright (c) 2000 The OpenSSL Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. All advertising materials mentioning features or use of this * software must display the following acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" * * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to * endorse or promote products derived from this software without * prior written permission. For written permission, please contact * licensing@OpenSSL.org. * * 5. Products derived from this software may not be called "OpenSSL" * nor may "OpenSSL" appear in their names without prior written * permission of the OpenSSL Project. * * 6. Redistributions of any form whatsoever must retain the following * acknowledgment: * "This product includes software developed by the OpenSSL Project * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" * * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * ==================================================================== * * This product includes cryptographic software written by Eric Young * (eay@cryptsoft.com). This product includes software written by Tim * Hudson (tjh@cryptsoft.com). * *//* ssl/kssl.c -- Routines to support (& debug) Kerberos5 auth for openssl**** 19990701 VRS Started.** 200011?? Jeffrey Altman, Richard Levitte** Generalized for Heimdal, Newer MIT, & Win32.** Integrated into main OpenSSL 0.9.7 snapshots.** 20010413 Simon Wilkinson, VRS** Real RFC2712 KerberosWrapper replaces AP_REQ.*/#include <openssl/opensslconf.h>#define _XOPEN_SOURCE 500 /* glibc2 needs this to declare strptime() */#include <time.h>#if 0 /* experimental */#undef _XOPEN_SOURCE /* To avoid clashes with anything else... */#endif#include <string.h>#define KRB5_PRIVATE 1#include <openssl/ssl.h>#include <openssl/evp.h>#include <openssl/objects.h>#include <openssl/krb5_asn.h>#ifndef OPENSSL_NO_KRB5#ifndef ENOMEM#define ENOMEM KRB5KRB_ERR_GENERIC#endif/* * When OpenSSL is built on Windows, we do not want to require that * the Kerberos DLLs be available in order for the OpenSSL DLLs to * work. Therefore, all Kerberos routines are loaded at run time * and we do not link to a .LIB file. */#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_WIN32)/* * The purpose of the following pre-processor statements is to provide * compatibility with different releases of MIT Kerberos for Windows. * All versions up to 1.2 used macros. But macros do not allow for * a binary compatible interface for DLLs. Therefore, all macros are * being replaced by function calls. The following code will allow * an OpenSSL DLL built on Windows to work whether or not the macro * or function form of the routines are utilized. */#ifdef krb5_cc_get_principal#define NO_DEF_KRB5_CCACHE#undef krb5_cc_get_principal#endif#define krb5_cc_get_principal kssl_krb5_cc_get_principal#define krb5_free_data_contents kssl_krb5_free_data_contents #define krb5_free_context kssl_krb5_free_context #define krb5_auth_con_free kssl_krb5_auth_con_free #define krb5_free_principal kssl_krb5_free_principal #define krb5_mk_req_extended kssl_krb5_mk_req_extended #define krb5_get_credentials kssl_krb5_get_credentials #define krb5_cc_default kssl_krb5_cc_default #define krb5_sname_to_principal kssl_krb5_sname_to_principal #define krb5_init_context kssl_krb5_init_context #define krb5_free_ticket kssl_krb5_free_ticket #define krb5_rd_req kssl_krb5_rd_req #define krb5_kt_default kssl_krb5_kt_default #define krb5_kt_resolve kssl_krb5_kt_resolve /* macros in mit 1.2.2 and earlier; functions in mit 1.2.3 and greater */#ifndef krb5_kt_close#define krb5_kt_close kssl_krb5_kt_close#endif /* krb5_kt_close */#ifndef krb5_kt_get_entry#define krb5_kt_get_entry kssl_krb5_kt_get_entry#endif /* krb5_kt_get_entry */#define krb5_auth_con_init kssl_krb5_auth_con_init #define krb5_principal_compare kssl_krb5_principal_compare#define krb5_decrypt_tkt_part kssl_krb5_decrypt_tkt_part#define krb5_timeofday kssl_krb5_timeofday#define krb5_rc_default kssl_krb5_rc_default#ifdef krb5_rc_initialize#undef krb5_rc_initialize#endif#define krb5_rc_initialize kssl_krb5_rc_initialize#ifdef krb5_rc_get_lifespan#undef krb5_rc_get_lifespan#endif#define krb5_rc_get_lifespan kssl_krb5_rc_get_lifespan#ifdef krb5_rc_destroy#undef krb5_rc_destroy#endif#define krb5_rc_destroy kssl_krb5_rc_destroy#define valid_cksumtype kssl_valid_cksumtype#define krb5_checksum_size kssl_krb5_checksum_size#define krb5_kt_free_entry kssl_krb5_kt_free_entry#define krb5_auth_con_setrcache kssl_krb5_auth_con_setrcache#define krb5_auth_con_getrcache kssl_krb5_auth_con_getrcache#define krb5_get_server_rcache kssl_krb5_get_server_rcache/* Prototypes for built in stubs */void kssl_krb5_free_data_contents(krb5_context, krb5_data *);void kssl_krb5_free_principal(krb5_context, krb5_principal );krb5_error_code kssl_krb5_kt_resolve(krb5_context, krb5_const char *, krb5_keytab *);krb5_error_code kssl_krb5_kt_default(krb5_context, krb5_keytab *);krb5_error_code kssl_krb5_free_ticket(krb5_context, krb5_ticket *);krb5_error_code kssl_krb5_rd_req(krb5_context, krb5_auth_context *, krb5_const krb5_data *, krb5_const_principal, krb5_keytab, krb5_flags *,krb5_ticket **);krb5_boolean kssl_krb5_principal_compare(krb5_context, krb5_const_principal, krb5_const_principal);krb5_error_code kssl_krb5_mk_req_extended(krb5_context, krb5_auth_context *, krb5_const krb5_flags, krb5_data *, krb5_creds *, krb5_data * );krb5_error_code kssl_krb5_init_context(krb5_context *);void kssl_krb5_free_context(krb5_context);krb5_error_code kssl_krb5_cc_default(krb5_context,krb5_ccache *);krb5_error_code kssl_krb5_sname_to_principal(krb5_context, krb5_const char *, krb5_const char *, krb5_int32, krb5_principal *);krb5_error_code kssl_krb5_get_credentials(krb5_context, krb5_const krb5_flags, krb5_ccache, krb5_creds *, krb5_creds * *);krb5_error_code kssl_krb5_auth_con_init(krb5_context, krb5_auth_context *);krb5_error_code kssl_krb5_cc_get_principal(krb5_context context, krb5_ccache cache, krb5_principal *principal);krb5_error_code kssl_krb5_auth_con_free(krb5_context,krb5_auth_context);size_t kssl_krb5_checksum_size(krb5_context context,krb5_cksumtype ctype);krb5_boolean kssl_valid_cksumtype(krb5_cksumtype ctype);krb5_error_code krb5_kt_free_entry(krb5_context,krb5_keytab_entry FAR * );krb5_error_code kssl_krb5_auth_con_setrcache(krb5_context, krb5_auth_context, krb5_rcache);krb5_error_code kssl_krb5_get_server_rcache(krb5_context, krb5_const krb5_data *, krb5_rcache *);krb5_error_code kssl_krb5_auth_con_getrcache(krb5_context, krb5_auth_context, krb5_rcache *);/* Function pointers (almost all Kerberos functions are _stdcall) */static void (_stdcall *p_krb5_free_data_contents)(krb5_context, krb5_data *) =NULL;static void (_stdcall *p_krb5_free_principal)(krb5_context, krb5_principal ) =NULL;static krb5_error_code(_stdcall *p_krb5_kt_resolve) (krb5_context, krb5_const char *, krb5_keytab *)=NULL;static krb5_error_code (_stdcall *p_krb5_kt_default)(krb5_context, krb5_keytab *)=NULL;static krb5_error_code (_stdcall *p_krb5_free_ticket)(krb5_context, krb5_ticket *)=NULL;static krb5_error_code (_stdcall *p_krb5_rd_req)(krb5_context, krb5_auth_context *, krb5_const krb5_data *, krb5_const_principal, krb5_keytab, krb5_flags *, krb5_ticket **)=NULL;static krb5_error_code (_stdcall *p_krb5_mk_req_extended) (krb5_context, krb5_auth_context *, krb5_const krb5_flags, krb5_data *, krb5_creds *, krb5_data * )=NULL;static krb5_error_code (_stdcall *p_krb5_init_context)(krb5_context *)=NULL;static void (_stdcall *p_krb5_free_context)(krb5_context)=NULL;static krb5_error_code (_stdcall *p_krb5_cc_default)(krb5_context, krb5_ccache *)=NULL;static krb5_error_code (_stdcall *p_krb5_sname_to_principal) (krb5_context, krb5_const char *, krb5_const char *, krb5_int32, krb5_principal *)=NULL;static krb5_error_code (_stdcall *p_krb5_get_credentials) (krb5_context, krb5_const krb5_flags, krb5_ccache, krb5_creds *, krb5_creds **)=NULL;static krb5_error_code (_stdcall *p_krb5_auth_con_init) (krb5_context, krb5_auth_context *)=NULL;static krb5_error_code (_stdcall *p_krb5_cc_get_principal) (krb5_context context, krb5_ccache cache, krb5_principal *principal)=NULL;static krb5_error_code (_stdcall *p_krb5_auth_con_free) (krb5_context, krb5_auth_context)=NULL;static krb5_error_code (_stdcall *p_krb5_decrypt_tkt_part) (krb5_context, krb5_const krb5_keyblock *, krb5_ticket *)=NULL;static krb5_error_code (_stdcall *p_krb5_timeofday) (krb5_context context, krb5_int32 *timeret)=NULL;static krb5_error_code (_stdcall *p_krb5_rc_default) (krb5_context context, krb5_rcache *rc)=NULL;static krb5_error_code (_stdcall *p_krb5_rc_initialize) (krb5_context context, krb5_rcache rc, krb5_deltat lifespan)=NULL;static krb5_error_code (_stdcall *p_krb5_rc_get_lifespan) (krb5_context context, krb5_rcache rc, krb5_deltat *lifespan)=NULL;static krb5_error_code (_stdcall *p_krb5_rc_destroy) (krb5_context context, krb5_rcache rc)=NULL;static krb5_boolean (_stdcall *p_krb5_principal_compare) (krb5_context, krb5_const_principal, krb5_const_principal)=NULL;static size_t (_stdcall *p_krb5_checksum_size)(krb5_context context,krb5_cksumtype ctype)=NULL;static krb5_boolean (_stdcall *p_valid_cksumtype)(krb5_cksumtype ctype)=NULL;static krb5_error_code (_stdcall *p_krb5_kt_free_entry) (krb5_context,krb5_keytab_entry * )=NULL;static krb5_error_code (_stdcall * p_krb5_auth_con_setrcache)(krb5_context, krb5_auth_context, krb5_rcache)=NULL;static krb5_error_code (_stdcall * p_krb5_get_server_rcache)(krb5_context, krb5_const krb5_data *, krb5_rcache *)=NULL;static krb5_error_code (* p_krb5_auth_con_getrcache)(krb5_context, krb5_auth_context, krb5_rcache *)=NULL;static krb5_error_code (_stdcall * p_krb5_kt_close)(krb5_context context, krb5_keytab keytab)=NULL;static krb5_error_code (_stdcall * p_krb5_kt_get_entry)(krb5_context context, krb5_keytab keytab, krb5_const_principal principal, krb5_kvno vno, krb5_enctype enctype, krb5_keytab_entry *entry)=NULL;static int krb5_loaded = 0; /* only attempt to initialize func ptrs once *//* Function to Load the Kerberos 5 DLL and initialize function pointers */voidload_krb5_dll(void) { HANDLE hKRB5_32; krb5_loaded++; hKRB5_32 = LoadLibrary(TEXT("KRB5_32")); if (!hKRB5_32) return; (FARPROC) p_krb5_free_data_contents = GetProcAddress( hKRB5_32, "krb5_free_data_contents" ); (FARPROC) p_krb5_free_context = GetProcAddress( hKRB5_32, "krb5_free_context" ); (FARPROC) p_krb5_auth_con_free = GetProcAddress( hKRB5_32, "krb5_auth_con_free" ); (FARPROC) p_krb5_free_principal = GetProcAddress( hKRB5_32, "krb5_free_principal" ); (FARPROC) p_krb5_mk_req_extended = GetProcAddress( hKRB5_32, "krb5_mk_req_extended" ); (FARPROC) p_krb5_get_credentials = GetProcAddress( hKRB5_32, "krb5_get_credentials" ); (FARPROC) p_krb5_cc_get_principal = GetProcAddress( hKRB5_32, "krb5_cc_get_principal" ); (FARPROC) p_krb5_cc_default = GetProcAddress( hKRB5_32, "krb5_cc_default" ); (FARPROC) p_krb5_sname_to_principal = GetProcAddress( hKRB5_32, "krb5_sname_to_principal" ); (FARPROC) p_krb5_init_context = GetProcAddress( hKRB5_32, "krb5_init_context" ); (FARPROC) p_krb5_free_ticket = GetProcAddress( hKRB5_32, "krb5_free_ticket" ); (FARPROC) p_krb5_rd_req = GetProcAddress( hKRB5_32, "krb5_rd_req" ); (FARPROC) p_krb5_principal_compare = GetProcAddress( hKRB5_32, "krb5_principal_compare" ); (FARPROC) p_krb5_decrypt_tkt_part = GetProcAddress( hKRB5_32, "krb5_decrypt_tkt_part" ); (FARPROC) p_krb5_timeofday = GetProcAddress( hKRB5_32, "krb5_timeofday" ); (FARPROC) p_krb5_rc_default = GetProcAddress( hKRB5_32, "krb5_rc_default" ); (FARPROC) p_krb5_rc_initialize = GetProcAddress( hKRB5_32, "krb5_rc_initialize" ); (FARPROC) p_krb5_rc_get_lifespan = GetProcAddress( hKRB5_32, "krb5_rc_get_lifespan" ); (FARPROC) p_krb5_rc_destroy = GetProcAddress( hKRB5_32, "krb5_rc_destroy" ); (FARPROC) p_krb5_kt_default = GetProcAddress( hKRB5_32, "krb5_kt_default" ); (FARPROC) p_krb5_kt_resolve = GetProcAddress( hKRB5_32, "krb5_kt_resolve" ); (FARPROC) p_krb5_auth_con_init = GetProcAddress( hKRB5_32, "krb5_auth_con_init" ); (FARPROC) p_valid_cksumtype = GetProcAddress( hKRB5_32, "valid_cksumtype" ); (FARPROC) p_krb5_checksum_size = GetProcAddress( hKRB5_32, "krb5_checksum_size" ); (FARPROC) p_krb5_kt_free_entry = GetProcAddress( hKRB5_32, "krb5_kt_free_entry" ); (FARPROC) p_krb5_auth_con_setrcache = GetProcAddress( hKRB5_32, "krb5_auth_con_setrcache" ); (FARPROC) p_krb5_get_server_rcache = GetProcAddress( hKRB5_32, "krb5_get_server_rcache" ); (FARPROC) p_krb5_auth_con_getrcache = GetProcAddress( hKRB5_32, "krb5_auth_con_getrcache" ); (FARPROC) p_krb5_kt_close = GetProcAddress( hKRB5_32, "krb5_kt_close" ); (FARPROC) p_krb5_kt_get_entry = GetProcAddress( hKRB5_32, "krb5_kt_get_entry" ); }/* Stubs for each function to be dynamicly loaded */voidkssl_krb5_free_data_contents(krb5_context CO, krb5_data * data) { if (!krb5_loaded) load_krb5_dll(); if ( p_krb5_free_data_contents ) p_krb5_free_data_contents(CO,data); }krb5_error_codekssl_krb5_mk_req_extended (krb5_context CO, krb5_auth_context * pACO, krb5_const krb5_flags F, krb5_data * pD1, krb5_creds * pC, krb5_data * pD2) { if (!krb5_loaded) load_krb5_dll(); if ( p_krb5_mk_req_extended ) return(p_krb5_mk_req_extended(CO,pACO,F,pD1,pC,pD2)); else return KRB5KRB_ERR_GENERIC; }krb5_error_codekssl_krb5_auth_con_init(krb5_context CO, krb5_auth_context * pACO) { if (!krb5_loaded) load_krb5_dll(); if ( p_krb5_auth_con_init ) return(p_krb5_auth_con_init(CO,pACO)); else return KRB5KRB_ERR_GENERIC; }krb5_error_codekssl_krb5_auth_con_free (krb5_context CO, krb5_auth_context ACO) { if (!krb5_loaded) load_krb5_dll(); if ( p_krb5_auth_con_free ) return(p_krb5_auth_con_free(CO,ACO)); else return KRB5KRB_ERR_GENERIC;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -