changed `struct fd_set' to `fd_set'
[heimdal.git] / lib / krb5 / rd_cred.c
blob97ffdc5dd29bdbc8db2afc7b0c3a0acaac55c4d9
1 /*
2 * Copyright (c) 1997 Kungliga Tekniska Högskolan
3 * (Royal Institute of Technology, Stockholm, Sweden).
4 * All rights reserved.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
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.
17 * 3. All advertising materials mentioning features or use of this software
18 * must display the following acknowledgement:
19 * This product includes software developed by Kungliga Tekniska
20 * Högskolan and its contributors.
22 * 4. Neither the name of the Institute nor the names of its contributors
23 * may be used to endorse or promote products derived from this software
24 * without specific prior written permission.
26 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 * SUCH DAMAGE.
39 #include <krb5_locl.h>
41 RCSID("$Id$");
43 krb5_error_code
44 krb5_rd_cred (krb5_context context,
45 krb5_auth_context auth_context,
46 krb5_ccache ccache,
47 krb5_data *in_data)
49 krb5_error_code ret;
50 size_t len;
51 KRB_CRED cred;
52 EncKrbCredPart enc_krb_cred_part;
53 krb5_data enc_krb_cred_part_data;
54 int i;
56 ret = decode_KRB_CRED (in_data->data, in_data->length,
57 &cred, &len);
58 if (ret)
59 return ret;
61 if (cred.pvno != 5) {
62 ret = KRB5KRB_AP_ERR_BADVERSION;
63 goto out;
66 if (cred.msg_type != krb_cred) {
67 ret = KRB5KRB_AP_ERR_MSG_TYPE;
68 goto out;
71 ret = krb5_decrypt (context,
72 cred.enc_part.cipher.data,
73 cred.enc_part.cipher.length,
74 cred.enc_part.etype,
75 &auth_context->remote_subkey,
76 &enc_krb_cred_part_data);
77 if (ret)
78 goto out;
81 ret = decode_EncKrbCredPart (enc_krb_cred_part_data.data,
82 enc_krb_cred_part_data.length,
83 &enc_krb_cred_part,
84 &len);
85 if (ret)
86 goto out;
88 /* check sender address */
90 if (enc_krb_cred_part.s_address
91 && auth_context->remote_address
92 && !krb5_address_compare (context,
93 auth_context->remote_address,
94 enc_krb_cred_part.s_address)) {
95 ret = KRB5KRB_AP_ERR_BADADDR;
96 goto out;
99 /* check receiver address */
101 if (enc_krb_cred_part.r_address
102 && !krb5_address_compare (context,
103 auth_context->local_address,
104 enc_krb_cred_part.r_address)) {
105 ret = KRB5KRB_AP_ERR_BADADDR;
106 goto out;
109 /* check timestamp */
110 if (auth_context->flags & KRB5_AUTH_CONTEXT_DO_TIME) {
111 int32_t sec;
113 krb5_timeofday (context, &sec);
115 if (enc_krb_cred_part.timestamp == NULL ||
116 enc_krb_cred_part.usec == NULL ||
117 abs(*enc_krb_cred_part.timestamp - sec)
118 > context->max_skew) {
119 ret = KRB5KRB_AP_ERR_SKEW;
120 goto out;
124 /* XXX - check replay cache */
126 /* Store the creds in the ccache */
128 for (i = 0; i < enc_krb_cred_part.ticket_info.len; ++i) {
129 KrbCredInfo *kci = &enc_krb_cred_part.ticket_info.val[i];
130 krb5_creds creds;
131 u_char buf[1024];
132 size_t len;
134 memset (&creds, 0, sizeof(creds));
136 ret = encode_Ticket (buf + sizeof(buf) - 1, sizeof(buf),
137 &cred.tickets.val[i],
138 &len);
139 if (ret)
140 goto out;
141 krb5_data_copy (&creds.ticket, buf + sizeof(buf) - len, len);
142 copy_EncryptionKey (&kci->key, &creds.session);
143 if (kci->prealm && kci->pname)
144 principalname2krb5_principal (&creds.client,
145 *kci->pname,
146 *kci->prealm);
147 if (kci->flags)
148 creds.flags.b = *kci->flags;
149 if (kci->authtime)
150 creds.times.authtime = *kci->authtime;
151 if (kci->starttime)
152 creds.times.starttime = *kci->starttime;
153 if (kci->endtime)
154 creds.times.endtime = *kci->endtime;
155 if (kci->renew_till)
156 creds.times.renew_till = *kci->renew_till;
157 if (kci->srealm && kci->sname)
158 principalname2krb5_principal (&creds.server,
159 *kci->sname,
160 *kci->srealm);
161 if (kci->caddr)
162 krb5_copy_addresses (context,
163 kci->caddr,
164 &creds.addresses);
165 krb5_cc_store_cred (context, ccache, &creds);
168 out:
169 free_KRB_CRED (&cred);
170 return ret;