1 /* $Id: marsh.c 2293 2005-12-03 19:51:13Z rra $
3 ** Routines to marshall/unmarshall parameters and ticket-granting tickets.
10 #include <sys/types.h>
12 #ifdef HAVE_KERBEROSIV_KRB_H
13 # include <kerberosIV/krb.h>
21 * These macros were lifted from BIND 4.9.2 sources.
26 * Inline versions of get/put short/long. Pointer is advanced.
27 * We also assume that a "u_short" holds 2 "chars"
28 * and that a "u_int32_t" holds 4 "chars".
30 * These macros demonstrate the property of C whereby it can be
31 * portable or it can be elegant but never both.
34 /* these should work on all hosts I have to worry about :-) rjs */
35 typedef unsigned char my_u_char;
36 typedef unsigned int my_u_int32_t;
37 typedef unsigned short my_u_short;
39 #define GETSHORT(s, cp) { \
40 register my_u_char *t_cp = (my_u_char*)(cp); \
41 (s) = (((my_u_short)t_cp[0]) << 8) \
42 | (((my_u_short)t_cp[1])) \
47 #define GETLONG(l, cp) { \
48 register my_u_char *t_cp = (my_u_char*)(cp); \
49 (l) = (((my_u_int32_t)t_cp[0]) << 24) \
50 | (((my_u_int32_t)t_cp[1]) << 16) \
51 | (((my_u_int32_t)t_cp[2]) << 8) \
52 | (((my_u_int32_t)t_cp[3])) \
57 #define PUTSHORT(s, cp) { \
58 register my_u_short t_s = (my_u_short)(s); \
59 register my_u_char *t_cp = (my_u_char*)(cp); \
66 * Warning: PUTLONG --no-longer-- destroys its first argument. if you
67 * were depending on this "feature", you will lose.
69 #define PUTLONG(l, cp) { \
70 register my_u_int32_t t_l = (my_u_int32_t)(l); \
71 register my_u_char *t_cp = (my_u_char*)(cp); \
72 *t_cp++ = t_l >> 24; \
73 *t_cp++ = t_l >> 16; \
79 /*****************************************************
80 nobody to blame but myself for these lovely macros.
82 I could have been more paranoid about the PUT macros
83 but I'm assuming a valid cred stucture was passed to
86 ******************************************************/
89 put a string with length stored first, string is not null terminated
94 #define PUT_COUNTED_STRING(string,dest) { \
96 temp = strlen(string); \
98 strncpy(dest,string,temp); \
102 /* put arbitrary data */
104 #define PUT_BINARY(dest, src, len) { \
105 memcpy(dest, src, len); \
109 /* check len against max length */
111 #define CHECK_LENGTH(len,max_len) { \
112 if (len > max_len) return -1; \
115 /* get a long, checking for space (in source, dest is already a long) */
117 #define GET_LONG(dest,src,cur_len,max_len) {\
118 CHECK_LENGTH(cur_len+4, max_len); \
123 /* get a counted string, checking for space in source and dest */
125 #define GET_COUNTED_STRING(dest,src,dest_max, cur_len,max_len) { \
127 GET_LONG(count, src, cur_len, max_len); \
128 CHECK_LENGTH(count, dest_max); \
129 CHECK_LENGTH(cur_len+count, max_len); \
130 strncpy(dest,(char *) p,count); \
131 dest[count] = '\0'; \
137 /* get arbitrary data, checking for space in source, dest length is given */
139 #define GET_BINARY(dest,src, len, cur_len, max_len) {\
140 CHECK_LENGTH(cur_len + len, max_len); \
141 memcpy(dest, src, len); \
158 if (max_buff < sizeof(CREDENTIALS)) return -1;
160 PUTLONG(1, p); /* version */
161 PUT_COUNTED_STRING(cred->service,p);
162 PUT_COUNTED_STRING(cred->instance,p);
163 PUT_COUNTED_STRING(cred->realm,p);
164 PUT_BINARY(p, cred->session, sizeof(cred->session));
165 temp = cred->lifetime;
169 temp = cred->ticket_st.length;
171 PUT_BINARY(p, cred->ticket_st.dat, temp);
172 temp = cred->issue_date;
174 PUT_COUNTED_STRING(cred->pname,p);
175 PUT_COUNTED_STRING(cred->pinst,p);
186 unsigned char *buffer,
192 KRB_UINT32 temp, version;
197 GET_LONG(version, p, len, max_len);
199 GET_COUNTED_STRING(cred->service, p, sizeof(cred->service)-1, len, max_len);
200 GET_COUNTED_STRING(cred->instance, p, sizeof(cred->instance)-1,len, max_len);
201 GET_COUNTED_STRING(cred->realm, p, sizeof(cred->realm)-1, len, max_len);
203 GET_BINARY(cred->session, p, sizeof(cred->session), len, max_len);
204 GET_LONG(temp, p, len, max_len); cred->lifetime = temp;
205 GET_LONG(temp, p, len, max_len); cred->kvno = temp;
206 GET_LONG(temp, p, len, max_len); cred->ticket_st.length = temp;
207 CHECK_LENGTH(temp, sizeof(cred->ticket_st.dat));
208 GET_BINARY(cred->ticket_st.dat, p, temp, len, max_len);
209 cred->ticket_st.mbz = 0;
210 GET_LONG(temp, p, len, max_len); cred->issue_date = temp;
211 GET_COUNTED_STRING(cred->pname, p, sizeof(cred->pname)-1, len, max_len);
212 GET_COUNTED_STRING(cred->pinst, p, sizeof(cred->pinst)-1, len, max_len);
218 int marshall_params (
228 tlen = strlen(ticketfile);
230 if ( (ulen > KFTGT_MAX_USERNAME)
231 ||(tlen > KFTGT_MAX_PATHNAME)
232 || (ulen+tlen+8) > max_buffer) return -1;
235 PUT_COUNTED_STRING(user,p);
236 PUT_COUNTED_STRING(ticketfile,p);
243 int unmarshall_params(
248 unsigned char *buffer,
256 GET_COUNTED_STRING(user, p, max_user, len, max_len);
257 GET_COUNTED_STRING(ticketfile, p, max_ticket, len, max_len);