Line data Source code
1 : /*
2 : * Copyright (c) 1997 - 2006 Kungliga Tekniska Högskolan
3 : * (Royal Institute of Technology, Stockholm, Sweden).
4 : * All rights reserved.
5 : *
6 : * Redistribution and use in source and binary forms, with or without
7 : * modification, are permitted provided that the following conditions
8 : * are met:
9 : *
10 : * 1. Redistributions of source code must retain the above copyright
11 : * notice, this list of conditions and the following disclaimer.
12 : *
13 : * 2. Redistributions in binary form must reproduce the above copyright
14 : * notice, this list of conditions and the following disclaimer in the
15 : * documentation and/or other materials provided with the distribution.
16 : *
17 : * 3. Neither the name of the Institute nor the names of its contributors
18 : * may be used to endorse or promote products derived from this software
19 : * without specific prior written permission.
20 : *
21 : * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22 : * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 : * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 : * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25 : * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 : * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 : * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 : * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 : * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 : * SUCH DAMAGE.
32 : */
33 :
34 : /* This file for code taken from the Heimdal code, to preserve licence */
35 : /* Modified by Andrew Bartlett <abartlet@samba.org> */
36 :
37 : #include "includes.h"
38 : #include "system/kerberos.h"
39 : #include "auth/kerberos/kerberos.h"
40 : #include "gensec_krb5.h"
41 :
42 : /* Taken from accept_sec_context.c,v 1.65 */
43 1185 : krb5_error_code smb_krb5_rd_req_decoded(krb5_context context,
44 : krb5_auth_context *auth_context,
45 : const krb5_data *inbuf,
46 : krb5_keytab keytab,
47 : krb5_principal acceptor_principal,
48 : krb5_data *outbuf,
49 : krb5_ticket **ticket,
50 : krb5_keyblock **keyblock)
51 : {
52 1185 : krb5_rd_req_in_ctx in = NULL;
53 1185 : krb5_rd_req_out_ctx out = NULL;
54 : krb5_error_code kret;
55 :
56 1185 : *keyblock = NULL;
57 1185 : *ticket = NULL;
58 1185 : outbuf->length = 0;
59 1185 : outbuf->data = NULL;
60 :
61 1185 : kret = krb5_rd_req_in_ctx_alloc(context, &in);
62 1185 : if (kret == 0)
63 1185 : kret = krb5_rd_req_in_set_keytab(context, in, keytab);
64 1185 : if (kret) {
65 0 : if (in)
66 0 : krb5_rd_req_in_ctx_free(context, in);
67 0 : return kret;
68 : }
69 :
70 1185 : kret = krb5_rd_req_ctx(context,
71 : auth_context,
72 : inbuf,
73 : acceptor_principal,
74 : in, &out);
75 1185 : krb5_rd_req_in_ctx_free(context, in);
76 1185 : if (kret) {
77 0 : return kret;
78 : }
79 :
80 : /*
81 : * We need to remember some data on the context_handle.
82 : */
83 1185 : kret = krb5_rd_req_out_get_ticket(context, out,
84 : ticket);
85 1185 : if (kret == 0) {
86 1185 : kret = krb5_rd_req_out_get_keyblock(context, out,
87 : keyblock);
88 : }
89 1185 : krb5_rd_req_out_ctx_free(context, out);
90 :
91 1185 : if (kret == 0) {
92 1185 : kret = krb5_mk_rep(context, *auth_context, outbuf);
93 : }
94 :
95 1185 : if (kret) {
96 0 : krb5_free_ticket(context, *ticket);
97 0 : krb5_free_keyblock(context, *keyblock);
98 0 : krb5_data_free(outbuf);
99 : }
100 :
101 1185 : return kret;
102 : }
|