Home | History | Annotate | Line # | Download | only in kdc
windc.c revision 1.1.1.1.12.1
      1  1.1.1.1.12.1    snj /*	$NetBSD: windc.c,v 1.1.1.1.12.1 2017/08/30 06:54:21 snj Exp $	*/
      2           1.1  elric 
      3           1.1  elric /*
      4           1.1  elric  * Copyright (c) 2007 Kungliga Tekniska Hgskolan
      5           1.1  elric  * (Royal Institute of Technology, Stockholm, Sweden).
      6           1.1  elric  * All rights reserved.
      7           1.1  elric  *
      8           1.1  elric  * Redistribution and use in source and binary forms, with or without
      9           1.1  elric  * modification, are permitted provided that the following conditions
     10           1.1  elric  * are met:
     11           1.1  elric  *
     12           1.1  elric  * 1. Redistributions of source code must retain the above copyright
     13           1.1  elric  *    notice, this list of conditions and the following disclaimer.
     14           1.1  elric  *
     15           1.1  elric  * 2. Redistributions in binary form must reproduce the above copyright
     16           1.1  elric  *    notice, this list of conditions and the following disclaimer in the
     17           1.1  elric  *    documentation and/or other materials provided with the distribution.
     18           1.1  elric  *
     19           1.1  elric  * 3. Neither the name of the Institute nor the names of its contributors
     20           1.1  elric  *    may be used to endorse or promote products derived from this software
     21           1.1  elric  *    without specific prior written permission.
     22           1.1  elric  *
     23           1.1  elric  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
     24           1.1  elric  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     25           1.1  elric  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     26           1.1  elric  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
     27           1.1  elric  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     28           1.1  elric  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     29           1.1  elric  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     30           1.1  elric  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     31           1.1  elric  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     32           1.1  elric  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     33           1.1  elric  * SUCH DAMAGE.
     34           1.1  elric  */
     35           1.1  elric 
     36           1.1  elric #include "kdc_locl.h"
     37           1.1  elric 
     38  1.1.1.1.12.1    snj static int have_plugin = 0;
     39           1.1  elric 
     40           1.1  elric /*
     41           1.1  elric  * Pick the first WINDC module that we find.
     42           1.1  elric  */
     43           1.1  elric 
     44  1.1.1.1.12.1    snj static krb5_error_code KRB5_LIB_CALL
     45  1.1.1.1.12.1    snj load(krb5_context context, const void *plug, void *plugctx, void *userctx)
     46  1.1.1.1.12.1    snj {
     47  1.1.1.1.12.1    snj     have_plugin = 1;
     48  1.1.1.1.12.1    snj     return KRB5_PLUGIN_NO_HANDLE;
     49  1.1.1.1.12.1    snj }
     50  1.1.1.1.12.1    snj 
     51           1.1  elric krb5_error_code
     52           1.1  elric krb5_kdc_windc_init(krb5_context context)
     53           1.1  elric {
     54  1.1.1.1.12.1    snj     (void)_krb5_plugin_run_f(context, "krb5", "windc",
     55  1.1.1.1.12.1    snj 			     KRB5_WINDC_PLUGIN_MINOR, 0, NULL, load);
     56  1.1.1.1.12.1    snj     return 0;
     57  1.1.1.1.12.1    snj }
     58           1.1  elric 
     59  1.1.1.1.12.1    snj struct generate_uc {
     60  1.1.1.1.12.1    snj     hdb_entry_ex *client;
     61  1.1.1.1.12.1    snj     krb5_pac *pac;
     62  1.1.1.1.12.1    snj };
     63           1.1  elric 
     64  1.1.1.1.12.1    snj static krb5_error_code KRB5_LIB_CALL
     65  1.1.1.1.12.1    snj generate(krb5_context context, const void *plug, void *plugctx, void *userctx)
     66  1.1.1.1.12.1    snj {
     67  1.1.1.1.12.1    snj     krb5plugin_windc_ftable *ft = (krb5plugin_windc_ftable *)plug;
     68  1.1.1.1.12.1    snj     struct generate_uc *uc = (struct generate_uc *)userctx;
     69           1.1  elric 
     70  1.1.1.1.12.1    snj     if (ft->pac_generate == NULL)
     71  1.1.1.1.12.1    snj 	return KRB5_PLUGIN_NO_HANDLE;
     72  1.1.1.1.12.1    snj     return ft->pac_generate((void *)plug, context, uc->client, uc->pac);
     73           1.1  elric }
     74           1.1  elric 
     75           1.1  elric 
     76           1.1  elric krb5_error_code
     77           1.1  elric _kdc_pac_generate(krb5_context context,
     78           1.1  elric 		  hdb_entry_ex *client,
     79           1.1  elric 		  krb5_pac *pac)
     80           1.1  elric {
     81  1.1.1.1.12.1    snj     struct generate_uc uc;
     82  1.1.1.1.12.1    snj 
     83  1.1.1.1.12.1    snj     if (!have_plugin)
     84           1.1  elric 	return 0;
     85  1.1.1.1.12.1    snj 
     86  1.1.1.1.12.1    snj     uc.client = client;
     87  1.1.1.1.12.1    snj     uc.pac = pac;
     88  1.1.1.1.12.1    snj 
     89  1.1.1.1.12.1    snj     (void)_krb5_plugin_run_f(context, "krb5", "windc",
     90  1.1.1.1.12.1    snj 			     KRB5_WINDC_PLUGIN_MINOR, 0, &uc, generate);
     91  1.1.1.1.12.1    snj     return 0;
     92  1.1.1.1.12.1    snj }
     93  1.1.1.1.12.1    snj 
     94  1.1.1.1.12.1    snj struct verify_uc {
     95  1.1.1.1.12.1    snj     krb5_principal client_principal;
     96  1.1.1.1.12.1    snj     krb5_principal delegated_proxy_principal;
     97  1.1.1.1.12.1    snj     hdb_entry_ex *client;
     98  1.1.1.1.12.1    snj     hdb_entry_ex *server;
     99  1.1.1.1.12.1    snj     hdb_entry_ex *krbtgt;
    100  1.1.1.1.12.1    snj     krb5_pac *pac;
    101  1.1.1.1.12.1    snj     int *verified;
    102  1.1.1.1.12.1    snj };
    103  1.1.1.1.12.1    snj 
    104  1.1.1.1.12.1    snj static krb5_error_code KRB5_LIB_CALL
    105  1.1.1.1.12.1    snj verify(krb5_context context, const void *plug, void *plugctx, void *userctx)
    106  1.1.1.1.12.1    snj {
    107  1.1.1.1.12.1    snj     krb5plugin_windc_ftable *ft = (krb5plugin_windc_ftable *)plug;
    108  1.1.1.1.12.1    snj     struct verify_uc *uc = (struct verify_uc *)userctx;
    109  1.1.1.1.12.1    snj     krb5_error_code ret;
    110  1.1.1.1.12.1    snj 
    111  1.1.1.1.12.1    snj     if (ft->pac_verify == NULL)
    112  1.1.1.1.12.1    snj 	return KRB5_PLUGIN_NO_HANDLE;
    113  1.1.1.1.12.1    snj     ret = ft->pac_verify((void *)plug, context,
    114  1.1.1.1.12.1    snj 			 uc->client_principal,
    115  1.1.1.1.12.1    snj 			 uc->delegated_proxy_principal,
    116  1.1.1.1.12.1    snj 			 uc->client, uc->server, uc->krbtgt, uc->pac);
    117  1.1.1.1.12.1    snj     if (ret == 0)
    118  1.1.1.1.12.1    snj 	(*uc->verified) = 1;
    119  1.1.1.1.12.1    snj 
    120  1.1.1.1.12.1    snj     return 0;
    121           1.1  elric }
    122           1.1  elric 
    123           1.1  elric krb5_error_code
    124           1.1  elric _kdc_pac_verify(krb5_context context,
    125           1.1  elric 		const krb5_principal client_principal,
    126  1.1.1.1.12.1    snj 		const krb5_principal delegated_proxy_principal,
    127           1.1  elric 		hdb_entry_ex *client,
    128           1.1  elric 		hdb_entry_ex *server,
    129           1.1  elric 		hdb_entry_ex *krbtgt,
    130           1.1  elric 		krb5_pac *pac,
    131           1.1  elric 		int *verified)
    132           1.1  elric {
    133  1.1.1.1.12.1    snj     struct verify_uc uc;
    134           1.1  elric 
    135  1.1.1.1.12.1    snj     if (!have_plugin)
    136           1.1  elric 	return 0;
    137           1.1  elric 
    138  1.1.1.1.12.1    snj     uc.client_principal = client_principal;
    139  1.1.1.1.12.1    snj     uc.delegated_proxy_principal = delegated_proxy_principal;
    140  1.1.1.1.12.1    snj     uc.client = client;
    141  1.1.1.1.12.1    snj     uc.server = server;
    142  1.1.1.1.12.1    snj     uc.krbtgt = krbtgt;
    143  1.1.1.1.12.1    snj     uc.pac = pac;
    144  1.1.1.1.12.1    snj     uc.verified = verified;
    145  1.1.1.1.12.1    snj 
    146  1.1.1.1.12.1    snj     (void)_krb5_plugin_run_f(context, "krb5", "windc",
    147  1.1.1.1.12.1    snj 			     KRB5_WINDC_PLUGIN_MINOR, 0, &uc, verify);
    148  1.1.1.1.12.1    snj     return 0;
    149  1.1.1.1.12.1    snj }
    150  1.1.1.1.12.1    snj 
    151  1.1.1.1.12.1    snj struct check_uc {
    152  1.1.1.1.12.1    snj     krb5_kdc_configuration *config;
    153  1.1.1.1.12.1    snj     hdb_entry_ex *client_ex;
    154  1.1.1.1.12.1    snj     const char *client_name;
    155  1.1.1.1.12.1    snj     hdb_entry_ex *server_ex;
    156  1.1.1.1.12.1    snj     const char *server_name;
    157  1.1.1.1.12.1    snj     KDC_REQ *req;
    158  1.1.1.1.12.1    snj     METHOD_DATA *method_data;
    159  1.1.1.1.12.1    snj };
    160  1.1.1.1.12.1    snj 
    161  1.1.1.1.12.1    snj static krb5_error_code KRB5_LIB_CALL
    162  1.1.1.1.12.1    snj check(krb5_context context, const void *plug, void *plugctx, void *userctx)
    163  1.1.1.1.12.1    snj {
    164  1.1.1.1.12.1    snj     krb5plugin_windc_ftable *ft = (krb5plugin_windc_ftable *)plug;
    165  1.1.1.1.12.1    snj     struct check_uc *uc = (struct check_uc *)userctx;
    166  1.1.1.1.12.1    snj 
    167  1.1.1.1.12.1    snj     if (ft->client_access == NULL)
    168  1.1.1.1.12.1    snj 	return KRB5_PLUGIN_NO_HANDLE;
    169  1.1.1.1.12.1    snj     return ft->client_access((void *)plug, context, uc->config,
    170  1.1.1.1.12.1    snj 			     uc->client_ex, uc->client_name,
    171  1.1.1.1.12.1    snj 			     uc->server_ex, uc->server_name,
    172  1.1.1.1.12.1    snj 			     uc->req, uc->method_data);
    173           1.1  elric }
    174           1.1  elric 
    175  1.1.1.1.12.1    snj 
    176           1.1  elric krb5_error_code
    177           1.1  elric _kdc_check_access(krb5_context context,
    178           1.1  elric 		  krb5_kdc_configuration *config,
    179           1.1  elric 		  hdb_entry_ex *client_ex, const char *client_name,
    180           1.1  elric 		  hdb_entry_ex *server_ex, const char *server_name,
    181           1.1  elric 		  KDC_REQ *req,
    182  1.1.1.1.12.1    snj 		  METHOD_DATA *method_data)
    183           1.1  elric {
    184  1.1.1.1.12.1    snj     krb5_error_code ret = KRB5_PLUGIN_NO_HANDLE;
    185  1.1.1.1.12.1    snj     struct check_uc uc;
    186  1.1.1.1.12.1    snj 
    187  1.1.1.1.12.1    snj     if (have_plugin) {
    188  1.1.1.1.12.1    snj         uc.config = config;
    189  1.1.1.1.12.1    snj         uc.client_ex = client_ex;
    190  1.1.1.1.12.1    snj         uc.client_name = client_name;
    191  1.1.1.1.12.1    snj         uc.server_ex = server_ex;
    192  1.1.1.1.12.1    snj         uc.server_name = server_name;
    193  1.1.1.1.12.1    snj         uc.req = req;
    194  1.1.1.1.12.1    snj         uc.method_data = method_data;
    195  1.1.1.1.12.1    snj 
    196  1.1.1.1.12.1    snj         ret = _krb5_plugin_run_f(context, "krb5", "windc",
    197  1.1.1.1.12.1    snj                                  KRB5_WINDC_PLUGIN_MINOR, 0, &uc, check);
    198  1.1.1.1.12.1    snj     }
    199  1.1.1.1.12.1    snj 
    200  1.1.1.1.12.1    snj     if (ret == KRB5_PLUGIN_NO_HANDLE)
    201  1.1.1.1.12.1    snj 	return kdc_check_flags(context, config,
    202  1.1.1.1.12.1    snj 			       client_ex, client_name,
    203  1.1.1.1.12.1    snj 			       server_ex, server_name,
    204  1.1.1.1.12.1    snj 			       req->msg_type == krb_as_req);
    205  1.1.1.1.12.1    snj     return ret;
    206           1.1  elric }
    207