Initial import from FreeBSD RELENG_4:
[dragonfly.git] / crypto / kerberosIV / lib / krb / krb_ip_realm.c
1 /*
2  * Copyright (c) 1999 Thomas Nyström and Stacken Computer Club
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 #include "krb_locl.h"
35
36 RCSID("$Id: krb_ip_realm.c,v 1.2.2.1 1999/12/06 23:01:12 assar Exp $");
37
38 /*
39  * Obtain a ticket for ourselves (`user.instance') in REALM and decrypt
40  * it using `password' to verify the address that the KDC got our
41  * request from.
42  * Store in the ticket cache.
43  */
44
45 int
46 krb_add_our_ip_for_realm(const char *user, const char *instance,
47                          const char *realm, const char *password)
48 {
49     des_cblock newkey;
50     des_key_schedule schedule;
51     char scrapbuf[1024];
52     struct in_addr myAddr;
53     KTEXT_ST ticket;
54     CREDENTIALS c;
55     int err;
56     u_int32_t addr;
57
58     if ((err = krb_mk_req(&ticket, (char *)user, (char *)instance,
59                           (char *)realm, 0)) != KSUCCESS)
60         return err;
61
62     if ((err = krb_get_cred((char *)user, (char *)instance, (char *)realm,
63                             &c)) != KSUCCESS)
64         return err;
65
66     des_string_to_key((char *)password, &newkey);
67     des_set_key(&newkey, schedule);
68     err = decomp_ticket(&c.ticket_st,
69                         (unsigned char *)scrapbuf, /* Flags */
70                         scrapbuf,       /* Authentication name */
71                         scrapbuf,       /* Principal's instance */
72                         scrapbuf,       /* Principal's authentication domain */
73                         /* The Address Of Me That Servers Sees */
74                         (u_int32_t *)&addr,
75                         (unsigned char *)scrapbuf, /* Session key in ticket */
76                         (int *)scrapbuf, /* Lifetime of ticket */
77                         (u_int32_t *)scrapbuf, /* Issue time and date */
78                         scrapbuf,       /* Service name */
79                         scrapbuf,       /* Service instance */
80                         &newkey,        /* Secret key */
81                         schedule        /* Precomp. key schedule */
82         );
83         
84     if (err != KSUCCESS) {
85         memset(newkey, 0, sizeof(newkey));
86         memset(schedule, 0, sizeof(schedule));
87         return err;
88     }
89
90     myAddr.s_addr = addr;
91
92     err = tf_store_addr(realm, &myAddr);
93
94     memset(newkey, 0, sizeof(newkey));
95     memset(schedule, 0, sizeof(schedule));
96
97     return err;
98 }
99
100 int
101 krb_get_our_ip_for_realm(const char *realm, struct in_addr *ip_addr)
102 {
103     return tf_get_addr(realm, ip_addr);
104 }