import cyrus-sasl-2.1.23
[cyrus-sasl.git] / mac / CommonKClient / mac_kclient / kcglue_krb.c
1 /* $Id: kcglue_krb.c,v 1.3 2003/02/13 19:55:56 rjs3 Exp $
2  * Copyright (c) 1998-2003 Carnegie Mellon University.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer. 
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in
13  *    the documentation and/or other materials provided with the
14  *    distribution.
15  *
16  * 3. The name "Carnegie Mellon University" must not be used to
17  *    endorse or promote products derived from this software without
18  *    prior written permission. For permission or any other legal
19  *    details, please contact  
20  *      Office of Technology Transfer
21  *      Carnegie Mellon University
22  *      5000 Forbes Avenue
23  *      Pittsburgh, PA  15213-3890
24  *      (412) 268-4387, fax: (412) 268-7395
25  *      tech-transfer@andrew.cmu.edu
26  *
27  * 4. Redistributions of any form whatsoever must retain the following
28  *    acknowledgment:
29  *    "This product includes software developed by Computing Services
30  *     at Carnegie Mellon University (http://www.cmu.edu/computing/)."
31  *
32  * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
33  * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
34  * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
35  * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
36  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
37  * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
38  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
39  */
40 #include <stdlib.h>
41 #include <string.h>
42 #include <kcglue_krb.h>
43 #include "macKClientPublic.h"
44
45 #ifndef FALSE
46 #define FALSE 0
47 #endif
48 #ifndef TRUE
49 #define TRUE 1
50 #endif
51
52 #define SOME_KRB_ERR_NUMBER (70)
53 #define         MAX_KRB_ERRORS  256
54
55 const char *krb_err_txt[MAX_KRB_ERRORS]={
56  "krb err","krb err","krb err","krb err","krb err","krb err","krb err","krb err",
57  "krb err","krb err","krb err","krb err","krb err","krb err","krb err","krb err",
58  "krb err","krb err","krb err","krb err","krb err","krb err","krb err","krb err",
59  "krb err","krb err","krb err","krb err","krb err","krb err","krb err","krb err",
60  "krb err","krb err","krb err","krb err","krb err","krb err","krb err","krb err",
61  "krb err","krb err","krb err","krb err","krb err","krb err","krb err","krb err",
62  "krb err","krb err","krb err","krb err","krb err","krb err","krb err","krb err",
63  "krb err","krb err","krb err","krb err","krb err","krb err","krb err","krb err",
64  "krb err","krb err","krb err","krb err","krb err","krb err","krb err","krb err",
65  "krb err","krb err","krb err","krb err","krb err","krb err","krb err","krb err",
66  "krb err","krb err","krb err","krb err","krb err","krb err","krb err","krb err",
67  "krb err","krb err","krb err","krb err","krb err","krb err","krb err","krb err",
68  "krb err","krb err","krb err","krb err","krb err","krb err","krb err","krb err",
69  "krb err","krb err","krb err","krb err","krb err","krb err","krb err","krb err",
70  "krb err","krb err","krb err","krb err","krb err","krb err","krb err","krb err",
71  "krb err","krb err","krb err","krb err","krb err","krb err","krb err","krb err",
72  "krb err","krb err","krb err","krb err","krb err","krb err","krb err","krb err",
73  "krb err","krb err","krb err","krb err","krb err","krb err","krb err","krb err",
74  "krb err","krb err","krb err","krb err","krb err","krb err","krb err","krb err",
75  "krb err","krb err","krb err","krb err","krb err","krb err","krb err","krb err",
76  "krb err","krb err","krb err","krb err","krb err","krb err","krb err","krb err",
77  "krb err","krb err","krb err","krb err","krb err","krb err","krb err","krb err",
78  "krb err","krb err","krb err","krb err","krb err","krb err","krb err","krb err",
79  "krb err","krb err","krb err","krb err","krb err","krb err","krb err","krb err",
80  "krb err","krb err","krb err","krb err","krb err","krb err","krb err","krb err",
81  "krb err","krb err","krb err","krb err","krb err","krb err","krb err","krb err",
82  "krb err","krb err","krb err","krb err","krb err","krb err","krb err","krb err",
83  "krb err","krb err","krb err","krb err","krb err","krb err","krb err","krb err",
84  "krb err","krb err","krb err","krb err","krb err","krb err","krb err","krb err",
85  "krb err","krb err","krb err","krb err","krb err","krb err","krb err","krb err",
86  "krb err","krb err","krb err","krb err","krb err","krb err","krb err","krb err",
87  "krb err","krb err","krb err","krb err","krb err","krb err","krb err","krb err"
88 };
89
90
91 /*
92  * given a service instance and realm, combine them to foo.bar@REALM
93  * return true upon success
94  */
95 static int implode_krb_user_info(char *dst,const char *service,const char *instance,const char *realm)
96 {
97         if(strlen(service)>=KCGLUE_ITEM_SIZE)
98                 return FALSE;
99         if(strlen(instance)>=KCGLUE_ITEM_SIZE)
100                 return FALSE;
101         if(strlen(realm)>=KCGLUE_ITEM_SIZE)
102                 return FALSE;
103         strcpy(dst,service);
104         dst+=strlen(dst);
105         if(instance[0]!=0) {
106                 *dst++='.';
107                 strcpy(dst,instance);
108                 dst+=strlen(dst);
109         }
110         *dst++='@';
111         strcpy(dst,realm);
112         return TRUE;
113 }
114
115 int kcglue_krb_mk_req(void *dat,int *len, const char *service, char *instance, char *realm, 
116            long checksum,
117            void *des_key,
118            char *pname,
119            char *pinst)
120 {
121         char tkt_buf[KCGLUE_MAX_KTXT_LEN+20];
122         char user_id[KCGLUE_MAX_K_STR_LEN+1];
123         KClientSessionInfo ses;
124         int have_session=FALSE;
125         int rc;
126
127         if(!implode_krb_user_info(user_id,service,instance,realm))
128                 return SOME_KRB_ERR_NUMBER;
129
130         rc=KClientNewSession(&ses,0,0,0,0);
131         if(rc!=0)
132         return SOME_KRB_ERR_NUMBER;
133         have_session=TRUE;
134         
135     *len=sizeof(tkt_buf)-10;
136         rc=KClientGetTicketForServiceFull(&ses,user_id,tkt_buf,len,checksum);
137         if(rc==0) {
138                 memcpy(dat,tkt_buf+4,*len);     /*kclient puts out a 4 byte length that mit doesnt*/
139                 rc=KClientGetSessionKey(&ses,des_key);
140         }
141         if(rc==0)
142                 rc=KClientGetUserName(pname);
143         *pinst=0;
144         if(have_session)
145         KClientDisposeSession(&ses);
146   
147         if(rc!=0)
148                 return SOME_KRB_ERR_NUMBER;
149         return 0;
150 }