1*05b00f60SXin Li /*
2*05b00f60SXin Li * Copyright (c) 1995, 1996, 1997
3*05b00f60SXin Li * The Regents of the University of California. All rights reserved.
4*05b00f60SXin Li *
5*05b00f60SXin Li * Redistribution and use in source and binary forms, with or without
6*05b00f60SXin Li * modification, are permitted provided that: (1) source code distributions
7*05b00f60SXin Li * retain the above copyright notice and this paragraph in its entirety, (2)
8*05b00f60SXin Li * distributions including binary code include the above copyright notice and
9*05b00f60SXin Li * this paragraph in its entirety in the documentation or other materials
10*05b00f60SXin Li * provided with the distribution, and (3) all advertising materials mentioning
11*05b00f60SXin Li * features or use of this software display the following acknowledgement:
12*05b00f60SXin Li * ``This product includes software developed by the University of California,
13*05b00f60SXin Li * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
14*05b00f60SXin Li * the University nor the names of its contributors may be used to endorse
15*05b00f60SXin Li * or promote products derived from this software without specific prior
16*05b00f60SXin Li * written permission.
17*05b00f60SXin Li * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
18*05b00f60SXin Li * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
19*05b00f60SXin Li * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20*05b00f60SXin Li *
21*05b00f60SXin Li * Initial contribution from John Hawkinson ([email protected]).
22*05b00f60SXin Li */
23*05b00f60SXin Li
24*05b00f60SXin Li /* \summary: Kerberos printer */
25*05b00f60SXin Li
26*05b00f60SXin Li #ifdef HAVE_CONFIG_H
27*05b00f60SXin Li #include <config.h>
28*05b00f60SXin Li #endif
29*05b00f60SXin Li
30*05b00f60SXin Li #include "netdissect-stdinc.h"
31*05b00f60SXin Li
32*05b00f60SXin Li #include "netdissect.h"
33*05b00f60SXin Li #include "extract.h"
34*05b00f60SXin Li
35*05b00f60SXin Li /*
36*05b00f60SXin Li * Kerberos 4:
37*05b00f60SXin Li *
38*05b00f60SXin Li * Athena Technical Plan
39*05b00f60SXin Li * Section E.2.1
40*05b00f60SXin Li * Kerberos Authentication and Authorization System
41*05b00f60SXin Li * by S. P. Miller, B. C. Neuman, J. I. Schiller, and J. H. Saltzer
42*05b00f60SXin Li *
43*05b00f60SXin Li * https://web.mit.edu/Saltzer/www/publications/athenaplan/e.2.1.pdf
44*05b00f60SXin Li *
45*05b00f60SXin Li * 7. Appendix I Design Specifications
46*05b00f60SXin Li *
47*05b00f60SXin Li * Kerberos 5:
48*05b00f60SXin Li *
49*05b00f60SXin Li * RFC 1510, RFC 2630, etc.
50*05b00f60SXin Li */
51*05b00f60SXin Li
52*05b00f60SXin Li
53*05b00f60SXin Li static const u_char *c_print(netdissect_options *, const u_char *, const u_char *);
54*05b00f60SXin Li static const u_char *krb4_print_hdr(netdissect_options *, const u_char *);
55*05b00f60SXin Li static void krb4_print(netdissect_options *, const u_char *);
56*05b00f60SXin Li
57*05b00f60SXin Li #define AUTH_MSG_KDC_REQUEST 1<<1
58*05b00f60SXin Li #define AUTH_MSG_KDC_REPLY 2<<1
59*05b00f60SXin Li #define AUTH_MSG_APPL_REQUEST 3<<1
60*05b00f60SXin Li #define AUTH_MSG_APPL_REQUEST_MUTUAL 4<<1
61*05b00f60SXin Li #define AUTH_MSG_ERR_REPLY 5<<1
62*05b00f60SXin Li #define AUTH_MSG_PRIVATE 6<<1
63*05b00f60SXin Li #define AUTH_MSG_SAFE 7<<1
64*05b00f60SXin Li #define AUTH_MSG_APPL_ERR 8<<1
65*05b00f60SXin Li #define AUTH_MSG_DIE 63<<1
66*05b00f60SXin Li
67*05b00f60SXin Li #define KERB_ERR_OK 0
68*05b00f60SXin Li #define KERB_ERR_NAME_EXP 1
69*05b00f60SXin Li #define KERB_ERR_SERVICE_EXP 2
70*05b00f60SXin Li #define KERB_ERR_AUTH_EXP 3
71*05b00f60SXin Li #define KERB_ERR_PKT_VER 4
72*05b00f60SXin Li #define KERB_ERR_NAME_MAST_KEY_VER 5
73*05b00f60SXin Li #define KERB_ERR_SERV_MAST_KEY_VER 6
74*05b00f60SXin Li #define KERB_ERR_BYTE_ORDER 7
75*05b00f60SXin Li #define KERB_ERR_PRINCIPAL_UNKNOWN 8
76*05b00f60SXin Li #define KERB_ERR_PRINCIPAL_NOT_UNIQUE 9
77*05b00f60SXin Li #define KERB_ERR_NULL_KEY 10
78*05b00f60SXin Li
79*05b00f60SXin Li struct krb {
80*05b00f60SXin Li nd_uint8_t pvno; /* Protocol Version */
81*05b00f60SXin Li nd_uint8_t type; /* Type+B */
82*05b00f60SXin Li };
83*05b00f60SXin Li
84*05b00f60SXin Li static const struct tok type2str[] = {
85*05b00f60SXin Li { AUTH_MSG_KDC_REQUEST, "KDC_REQUEST" },
86*05b00f60SXin Li { AUTH_MSG_KDC_REPLY, "KDC_REPLY" },
87*05b00f60SXin Li { AUTH_MSG_APPL_REQUEST, "APPL_REQUEST" },
88*05b00f60SXin Li { AUTH_MSG_APPL_REQUEST_MUTUAL, "APPL_REQUEST_MUTUAL" },
89*05b00f60SXin Li { AUTH_MSG_ERR_REPLY, "ERR_REPLY" },
90*05b00f60SXin Li { AUTH_MSG_PRIVATE, "PRIVATE" },
91*05b00f60SXin Li { AUTH_MSG_SAFE, "SAFE" },
92*05b00f60SXin Li { AUTH_MSG_APPL_ERR, "APPL_ERR" },
93*05b00f60SXin Li { AUTH_MSG_DIE, "DIE" },
94*05b00f60SXin Li { 0, NULL }
95*05b00f60SXin Li };
96*05b00f60SXin Li
97*05b00f60SXin Li static const struct tok kerr2str[] = {
98*05b00f60SXin Li { KERB_ERR_OK, "OK" },
99*05b00f60SXin Li { KERB_ERR_NAME_EXP, "NAME_EXP" },
100*05b00f60SXin Li { KERB_ERR_SERVICE_EXP, "SERVICE_EXP" },
101*05b00f60SXin Li { KERB_ERR_AUTH_EXP, "AUTH_EXP" },
102*05b00f60SXin Li { KERB_ERR_PKT_VER, "PKT_VER" },
103*05b00f60SXin Li { KERB_ERR_NAME_MAST_KEY_VER, "NAME_MAST_KEY_VER" },
104*05b00f60SXin Li { KERB_ERR_SERV_MAST_KEY_VER, "SERV_MAST_KEY_VER" },
105*05b00f60SXin Li { KERB_ERR_BYTE_ORDER, "BYTE_ORDER" },
106*05b00f60SXin Li { KERB_ERR_PRINCIPAL_UNKNOWN, "PRINCIPAL_UNKNOWN" },
107*05b00f60SXin Li { KERB_ERR_PRINCIPAL_NOT_UNIQUE,"PRINCIPAL_NOT_UNIQUE" },
108*05b00f60SXin Li { KERB_ERR_NULL_KEY, "NULL_KEY"},
109*05b00f60SXin Li { 0, NULL}
110*05b00f60SXin Li };
111*05b00f60SXin Li
112*05b00f60SXin Li static const u_char *
c_print(netdissect_options * ndo,const u_char * s,const u_char * ep)113*05b00f60SXin Li c_print(netdissect_options *ndo,
114*05b00f60SXin Li const u_char *s, const u_char *ep)
115*05b00f60SXin Li {
116*05b00f60SXin Li u_char c;
117*05b00f60SXin Li int flag;
118*05b00f60SXin Li
119*05b00f60SXin Li flag = 1;
120*05b00f60SXin Li while (s < ep) {
121*05b00f60SXin Li c = GET_U_1(s);
122*05b00f60SXin Li s++;
123*05b00f60SXin Li if (c == '\0') {
124*05b00f60SXin Li flag = 0;
125*05b00f60SXin Li break;
126*05b00f60SXin Li }
127*05b00f60SXin Li fn_print_char(ndo, c);
128*05b00f60SXin Li }
129*05b00f60SXin Li if (flag)
130*05b00f60SXin Li return NULL;
131*05b00f60SXin Li return (s);
132*05b00f60SXin Li }
133*05b00f60SXin Li
134*05b00f60SXin Li static const u_char *
krb4_print_hdr(netdissect_options * ndo,const u_char * cp)135*05b00f60SXin Li krb4_print_hdr(netdissect_options *ndo,
136*05b00f60SXin Li const u_char *cp)
137*05b00f60SXin Li {
138*05b00f60SXin Li cp += 2;
139*05b00f60SXin Li
140*05b00f60SXin Li #define PRINT if ((cp = c_print(ndo, cp, ndo->ndo_snapend)) == NULL) goto trunc
141*05b00f60SXin Li
142*05b00f60SXin Li PRINT;
143*05b00f60SXin Li ND_PRINT(".");
144*05b00f60SXin Li PRINT;
145*05b00f60SXin Li ND_PRINT("@");
146*05b00f60SXin Li PRINT;
147*05b00f60SXin Li return (cp);
148*05b00f60SXin Li
149*05b00f60SXin Li trunc:
150*05b00f60SXin Li nd_print_trunc(ndo);
151*05b00f60SXin Li return (NULL);
152*05b00f60SXin Li
153*05b00f60SXin Li #undef PRINT
154*05b00f60SXin Li }
155*05b00f60SXin Li
156*05b00f60SXin Li static void
krb4_print(netdissect_options * ndo,const u_char * cp)157*05b00f60SXin Li krb4_print(netdissect_options *ndo,
158*05b00f60SXin Li const u_char *cp)
159*05b00f60SXin Li {
160*05b00f60SXin Li const struct krb *kp;
161*05b00f60SXin Li u_char type;
162*05b00f60SXin Li u_short len;
163*05b00f60SXin Li
164*05b00f60SXin Li #define PRINT if ((cp = c_print(ndo, cp, ndo->ndo_snapend)) == NULL) goto trunc
165*05b00f60SXin Li /* True if struct krb is little endian */
166*05b00f60SXin Li #define IS_LENDIAN(kp) ((GET_U_1((kp)->type) & 0x01) != 0)
167*05b00f60SXin Li #define KTOHSP(kp, cp) (IS_LENDIAN(kp) ? GET_LE_U_2(cp) : GET_BE_U_2(cp))
168*05b00f60SXin Li
169*05b00f60SXin Li kp = (const struct krb *)cp;
170*05b00f60SXin Li
171*05b00f60SXin Li type = GET_U_1(kp->type) & (0xFF << 1);
172*05b00f60SXin Li
173*05b00f60SXin Li ND_PRINT(" %s %s: ",
174*05b00f60SXin Li IS_LENDIAN(kp) ? "le" : "be", tok2str(type2str, NULL, type));
175*05b00f60SXin Li
176*05b00f60SXin Li switch (type) {
177*05b00f60SXin Li
178*05b00f60SXin Li case AUTH_MSG_KDC_REQUEST:
179*05b00f60SXin Li if ((cp = krb4_print_hdr(ndo, cp)) == NULL)
180*05b00f60SXin Li return;
181*05b00f60SXin Li cp += 4; /* ctime */
182*05b00f60SXin Li ND_PRINT(" %umin ", GET_U_1(cp) * 5);
183*05b00f60SXin Li cp++;
184*05b00f60SXin Li PRINT;
185*05b00f60SXin Li ND_PRINT(".");
186*05b00f60SXin Li PRINT;
187*05b00f60SXin Li break;
188*05b00f60SXin Li
189*05b00f60SXin Li case AUTH_MSG_APPL_REQUEST:
190*05b00f60SXin Li cp += 2;
191*05b00f60SXin Li ND_PRINT("v%u ", GET_U_1(cp));
192*05b00f60SXin Li cp++;
193*05b00f60SXin Li PRINT;
194*05b00f60SXin Li ND_PRINT(" (%u)", GET_U_1(cp));
195*05b00f60SXin Li cp++;
196*05b00f60SXin Li ND_PRINT(" (%u)", GET_U_1(cp));
197*05b00f60SXin Li break;
198*05b00f60SXin Li
199*05b00f60SXin Li case AUTH_MSG_KDC_REPLY:
200*05b00f60SXin Li if ((cp = krb4_print_hdr(ndo, cp)) == NULL)
201*05b00f60SXin Li return;
202*05b00f60SXin Li cp += 10; /* timestamp + n + exp + kvno */
203*05b00f60SXin Li len = KTOHSP(kp, cp);
204*05b00f60SXin Li ND_PRINT(" (%u)", len);
205*05b00f60SXin Li break;
206*05b00f60SXin Li
207*05b00f60SXin Li case AUTH_MSG_ERR_REPLY:
208*05b00f60SXin Li if ((cp = krb4_print_hdr(ndo, cp)) == NULL)
209*05b00f60SXin Li return;
210*05b00f60SXin Li cp += 4; /* timestamp */
211*05b00f60SXin Li ND_PRINT(" %s ", tok2str(kerr2str, NULL, KTOHSP(kp, cp)));
212*05b00f60SXin Li cp += 4;
213*05b00f60SXin Li PRINT;
214*05b00f60SXin Li break;
215*05b00f60SXin Li
216*05b00f60SXin Li default:
217*05b00f60SXin Li ND_PRINT("(unknown)");
218*05b00f60SXin Li break;
219*05b00f60SXin Li }
220*05b00f60SXin Li
221*05b00f60SXin Li return;
222*05b00f60SXin Li trunc:
223*05b00f60SXin Li nd_print_trunc(ndo);
224*05b00f60SXin Li }
225*05b00f60SXin Li
226*05b00f60SXin Li void
krb_print(netdissect_options * ndo,const u_char * dat)227*05b00f60SXin Li krb_print(netdissect_options *ndo,
228*05b00f60SXin Li const u_char *dat)
229*05b00f60SXin Li {
230*05b00f60SXin Li const struct krb *kp;
231*05b00f60SXin Li
232*05b00f60SXin Li ndo->ndo_protocol = "krb";
233*05b00f60SXin Li kp = (const struct krb *)dat;
234*05b00f60SXin Li
235*05b00f60SXin Li if (dat >= ndo->ndo_snapend) {
236*05b00f60SXin Li nd_print_trunc(ndo);
237*05b00f60SXin Li return;
238*05b00f60SXin Li }
239*05b00f60SXin Li
240*05b00f60SXin Li switch (GET_U_1(kp->pvno)) {
241*05b00f60SXin Li
242*05b00f60SXin Li case 1:
243*05b00f60SXin Li case 2:
244*05b00f60SXin Li case 3:
245*05b00f60SXin Li ND_PRINT(" v%u", GET_U_1(kp->pvno));
246*05b00f60SXin Li break;
247*05b00f60SXin Li
248*05b00f60SXin Li case 4:
249*05b00f60SXin Li ND_PRINT(" v%u", GET_U_1(kp->pvno));
250*05b00f60SXin Li krb4_print(ndo, (const u_char *)kp);
251*05b00f60SXin Li break;
252*05b00f60SXin Li
253*05b00f60SXin Li case 106:
254*05b00f60SXin Li case 107:
255*05b00f60SXin Li ND_PRINT(" v5");
256*05b00f60SXin Li /* Decode ASN.1 here "someday" */
257*05b00f60SXin Li break;
258*05b00f60SXin Li }
259*05b00f60SXin Li }
260