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