Annotation of src/usr.bin/ssh/radix.c, Revision 1.9
1.1 deraadt 1: /*
1.5 deraadt 2: * radix.c
1.8 markus 3: *
1.5 deraadt 4: * Dug Song <dugsong@UMICH.EDU>
5: */
1.4 markus 6:
1.1 deraadt 7: #include "includes.h"
1.9 ! markus 8: #include "uuencode.h"
1.1 deraadt 9:
10: #ifdef AFS
11: #include <krb.h>
12:
13: typedef unsigned char my_u_char;
14: typedef unsigned int my_u_int32_t;
15: typedef unsigned short my_u_short;
16:
17: /* Nasty macros from BIND-4.9.2 */
18:
19: #define GETSHORT(s, cp) { \
20: register my_u_char *t_cp = (my_u_char*)(cp); \
21: (s) = (((my_u_short)t_cp[0]) << 8) \
22: | (((my_u_short)t_cp[1])) \
23: ; \
24: (cp) += 2; \
25: }
26:
27: #define GETLONG(l, cp) { \
28: register my_u_char *t_cp = (my_u_char*)(cp); \
29: (l) = (((my_u_int32_t)t_cp[0]) << 24) \
30: | (((my_u_int32_t)t_cp[1]) << 16) \
31: | (((my_u_int32_t)t_cp[2]) << 8) \
32: | (((my_u_int32_t)t_cp[3])) \
33: ; \
34: (cp) += 4; \
35: }
36:
37: #define PUTSHORT(s, cp) { \
38: register my_u_short t_s = (my_u_short)(s); \
39: register my_u_char *t_cp = (my_u_char*)(cp); \
40: *t_cp++ = t_s >> 8; \
41: *t_cp = t_s; \
42: (cp) += 2; \
43: }
44:
45: #define PUTLONG(l, cp) { \
46: register my_u_int32_t t_l = (my_u_int32_t)(l); \
47: register my_u_char *t_cp = (my_u_char*)(cp); \
48: *t_cp++ = t_l >> 24; \
49: *t_cp++ = t_l >> 16; \
50: *t_cp++ = t_l >> 8; \
51: *t_cp = t_l; \
52: (cp) += 4; \
53: }
54:
55: #define GETSTRING(s, p, p_l) { \
56: register char* p_targ = (p) + p_l; \
57: register char* s_c = (s); \
58: register char* p_c = (p); \
59: while (*p_c && (p_c < p_targ)) { \
60: *s_c++ = *p_c++; \
61: } \
62: if (p_c == p_targ) { \
63: return 1; \
64: } \
65: *s_c = *p_c++; \
66: (p_l) = (p_l) - (p_c - (p)); \
67: (p) = p_c; \
68: }
69:
70:
1.8 markus 71: int
1.4 markus 72: creds_to_radix(CREDENTIALS *creds, unsigned char *buf)
1.1 deraadt 73: {
1.4 markus 74: char *p, *s;
75: int len;
76: char temp[2048];
77:
78: p = temp;
79: *p++ = 1; /* version */
80: s = creds->service;
81: while (*s)
82: *p++ = *s++;
83: *p++ = *s;
84: s = creds->instance;
85: while (*s)
86: *p++ = *s++;
87: *p++ = *s;
88: s = creds->realm;
89: while (*s)
90: *p++ = *s++;
91: *p++ = *s;
92:
93: s = creds->pname;
94: while (*s)
95: *p++ = *s++;
96: *p++ = *s;
97: s = creds->pinst;
98: while (*s)
99: *p++ = *s++;
100: *p++ = *s;
101: /* Null string to repeat the realm. */
102: *p++ = '\0';
103:
104: PUTLONG(creds->issue_date, p);
105: {
106: unsigned int endTime;
107: endTime = (unsigned int) krb_life_to_time(creds->issue_date,
108: creds->lifetime);
109: PUTLONG(endTime, p);
110: }
111:
112: memcpy(p, &creds->session, sizeof(creds->session));
113: p += sizeof(creds->session);
114:
115: PUTSHORT(creds->kvno, p);
116: PUTLONG(creds->ticket_st.length, p);
117:
118: memcpy(p, creds->ticket_st.dat, creds->ticket_st.length);
119: p += creds->ticket_st.length;
120: len = p - temp;
1.1 deraadt 121:
1.7 markus 122: return (uuencode((unsigned char *)temp, len, (char *)buf));
1.1 deraadt 123: }
124:
1.8 markus 125: int
1.4 markus 126: radix_to_creds(const char *buf, CREDENTIALS *creds)
1.1 deraadt 127: {
128:
1.4 markus 129: char *p;
130: int len, tl;
131: char version;
132: char temp[2048];
133:
1.7 markus 134: if (!(len = uudecode(buf, (unsigned char *)temp, sizeof(temp))))
1.4 markus 135: return 0;
136:
137: p = temp;
138:
139: /* check version and length! */
140: if (len < 1)
141: return 0;
142: version = *p;
143: p++;
144: len--;
145:
146: GETSTRING(creds->service, p, len);
147: GETSTRING(creds->instance, p, len);
148: GETSTRING(creds->realm, p, len);
149:
150: GETSTRING(creds->pname, p, len);
151: GETSTRING(creds->pinst, p, len);
152: /* Ignore possibly different realm. */
153: while (*p && len)
154: p++, len--;
155: if (len == 0)
156: return 0;
157: p++, len--;
158:
159: /* Enough space for remaining fixed-length parts? */
160: if (len < (4 + 4 + sizeof(creds->session) + 2 + 4))
161: return 0;
162:
163: GETLONG(creds->issue_date, p);
164: len -= 4;
165: {
166: unsigned int endTime;
167: GETLONG(endTime, p);
168: len -= 4;
169: creds->lifetime = krb_time_to_life(creds->issue_date, endTime);
170: }
171:
172: memcpy(&creds->session, p, sizeof(creds->session));
173: p += sizeof(creds->session);
174: len -= sizeof(creds->session);
175:
176: GETSHORT(creds->kvno, p);
177: len -= 2;
178: GETLONG(creds->ticket_st.length, p);
179: len -= 4;
180:
181: tl = creds->ticket_st.length;
182: if (tl < 0 || tl > len || tl > sizeof(creds->ticket_st.dat))
183: return 0;
184:
185: memcpy(creds->ticket_st.dat, p, tl);
186: p += tl;
187: len -= tl;
188:
189: return 1;
1.1 deraadt 190: }
191: #endif /* AFS */