1c19800e8SDoug Rabson /*
2*ae771770SStanislav Sedov * Copyright (c) 2006 Kungliga Tekniska Högskolan
3c19800e8SDoug Rabson * (Royal Institute of Technology, Stockholm, Sweden).
4c19800e8SDoug Rabson * All rights reserved.
5c19800e8SDoug Rabson *
6c19800e8SDoug Rabson * Redistribution and use in source and binary forms, with or without
7c19800e8SDoug Rabson * modification, are permitted provided that the following conditions
8c19800e8SDoug Rabson * are met:
9c19800e8SDoug Rabson *
10c19800e8SDoug Rabson * 1. Redistributions of source code must retain the above copyright
11c19800e8SDoug Rabson * notice, this list of conditions and the following disclaimer.
12c19800e8SDoug Rabson *
13c19800e8SDoug Rabson * 2. Redistributions in binary form must reproduce the above copyright
14c19800e8SDoug Rabson * notice, this list of conditions and the following disclaimer in the
15c19800e8SDoug Rabson * documentation and/or other materials provided with the distribution.
16c19800e8SDoug Rabson *
17c19800e8SDoug Rabson * 3. Neither the name of the Institute nor the names of its contributors
18c19800e8SDoug Rabson * may be used to endorse or promote products derived from this software
19c19800e8SDoug Rabson * without specific prior written permission.
20c19800e8SDoug Rabson *
21c19800e8SDoug Rabson * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22c19800e8SDoug Rabson * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23c19800e8SDoug Rabson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24c19800e8SDoug Rabson * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25c19800e8SDoug Rabson * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26c19800e8SDoug Rabson * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27c19800e8SDoug Rabson * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28c19800e8SDoug Rabson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29c19800e8SDoug Rabson * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30c19800e8SDoug Rabson * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31c19800e8SDoug Rabson * SUCH DAMAGE.
32c19800e8SDoug Rabson */
33c19800e8SDoug Rabson
34c19800e8SDoug Rabson #include "krb5_locl.h"
35c19800e8SDoug Rabson
36c19800e8SDoug Rabson /*
37c19800e8SDoug Rabson * This PAC and keys are copied (with permission) from Samba torture
38c19800e8SDoug Rabson * regression test suite, they where created by Andrew Bartlet.
39c19800e8SDoug Rabson */
40c19800e8SDoug Rabson
41c19800e8SDoug Rabson static const unsigned char saved_pac[] = {
42c19800e8SDoug Rabson 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xd8, 0x01, 0x00, 0x00,
43c19800e8SDoug Rabson 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
44c19800e8SDoug Rabson 0x20, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
45c19800e8SDoug Rabson 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
46c19800e8SDoug Rabson 0x58, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x08, 0x00, 0xcc, 0xcc, 0xcc, 0xcc,
47c19800e8SDoug Rabson 0xc8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x30, 0xdf, 0xa6, 0xcb,
48c19800e8SDoug Rabson 0x4f, 0x7d, 0xc5, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff,
49c19800e8SDoug Rabson 0xff, 0xff, 0xff, 0x7f, 0xc0, 0x3c, 0x4e, 0x59, 0x62, 0x73, 0xc5, 0x01, 0xc0, 0x3c, 0x4e, 0x59,
50c19800e8SDoug Rabson 0x62, 0x73, 0xc5, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x16, 0x00, 0x16, 0x00,
51c19800e8SDoug Rabson 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
52c19800e8SDoug Rabson 0x0c, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
53c19800e8SDoug Rabson 0x14, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x02, 0x00, 0x65, 0x00, 0x00, 0x00,
54c19800e8SDoug Rabson 0xed, 0x03, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x02, 0x00,
55c19800e8SDoug Rabson 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
56c19800e8SDoug Rabson 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x16, 0x00, 0x20, 0x00, 0x02, 0x00, 0x16, 0x00, 0x18, 0x00,
57c19800e8SDoug Rabson 0x24, 0x00, 0x02, 0x00, 0x28, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
58c19800e8SDoug Rabson 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
59c19800e8SDoug Rabson 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
60c19800e8SDoug Rabson 0x01, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
61c19800e8SDoug Rabson 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00,
62c19800e8SDoug Rabson 0x57, 0x00, 0x32, 0x00, 0x30, 0x00, 0x30, 0x00, 0x33, 0x00, 0x46, 0x00, 0x49, 0x00, 0x4e, 0x00,
63c19800e8SDoug Rabson 0x41, 0x00, 0x4c, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
64c19800e8SDoug Rabson 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
65c19800e8SDoug Rabson 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
66c19800e8SDoug Rabson 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
67c19800e8SDoug Rabson 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
68c19800e8SDoug Rabson 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x57, 0x00, 0x32, 0x00,
69c19800e8SDoug Rabson 0x30, 0x00, 0x30, 0x00, 0x33, 0x00, 0x46, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x41, 0x00, 0x4c, 0x00,
70c19800e8SDoug Rabson 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x57, 0x00, 0x49, 0x00,
71c19800e8SDoug Rabson 0x4e, 0x00, 0x32, 0x00, 0x4b, 0x00, 0x33, 0x00, 0x54, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4e, 0x00,
72c19800e8SDoug Rabson 0x4b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
73c19800e8SDoug Rabson 0x15, 0x00, 0x00, 0x00, 0x11, 0x2f, 0xaf, 0xb5, 0x90, 0x04, 0x1b, 0xec, 0x50, 0x3b, 0xec, 0xdc,
74c19800e8SDoug Rabson 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, 0x02, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
75c19800e8SDoug Rabson 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
76c19800e8SDoug Rabson 0x80, 0x66, 0x28, 0xea, 0x37, 0x80, 0xc5, 0x01, 0x16, 0x00, 0x77, 0x00, 0x32, 0x00, 0x30, 0x00,
77c19800e8SDoug Rabson 0x30, 0x00, 0x33, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x24, 0x00,
78c19800e8SDoug Rabson 0x76, 0xff, 0xff, 0xff, 0x37, 0xd5, 0xb0, 0xf7, 0x24, 0xf0, 0xd6, 0xd4, 0xec, 0x09, 0x86, 0x5a,
79c19800e8SDoug Rabson 0xa0, 0xe8, 0xc3, 0xa9, 0x00, 0x00, 0x00, 0x00, 0x76, 0xff, 0xff, 0xff, 0xb4, 0xd8, 0xb8, 0xfe,
80c19800e8SDoug Rabson 0x83, 0xb3, 0x13, 0x3f, 0xfc, 0x5c, 0x41, 0xad, 0xe2, 0x64, 0x83, 0xe0, 0x00, 0x00, 0x00, 0x00
81c19800e8SDoug Rabson };
82c19800e8SDoug Rabson
83c19800e8SDoug Rabson static int type_1_length = 472;
84c19800e8SDoug Rabson
85c19800e8SDoug Rabson static const krb5_keyblock kdc_keyblock = {
86c19800e8SDoug Rabson ETYPE_ARCFOUR_HMAC_MD5,
87c19800e8SDoug Rabson { 16, "\xB2\x86\x75\x71\x48\xAF\x7F\xD2\x52\xC5\x36\x03\xA1\x50\xB7\xE7" }
88c19800e8SDoug Rabson };
89c19800e8SDoug Rabson
90c19800e8SDoug Rabson static const krb5_keyblock member_keyblock = {
91c19800e8SDoug Rabson ETYPE_ARCFOUR_HMAC_MD5,
92c19800e8SDoug Rabson { 16, "\xD2\x17\xFA\xEA\xE5\xE6\xB5\xF9\x5C\xCC\x94\x07\x7A\xB8\xA5\xFC" }
93c19800e8SDoug Rabson };
94c19800e8SDoug Rabson
95c19800e8SDoug Rabson static time_t authtime = 1120440609;
96*ae771770SStanislav Sedov static const char *user = "w2003final$";
97*ae771770SStanislav Sedov
98*ae771770SStanislav Sedov /*
99*ae771770SStanislav Sedov * This pac from Christan Krause
100*ae771770SStanislav Sedov */
101*ae771770SStanislav Sedov
102*ae771770SStanislav Sedov static const unsigned char saved_pac2[] =
103*ae771770SStanislav Sedov "\x05\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\xc8\x01\x00\x00"
104*ae771770SStanislav Sedov "\x58\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x18\x00\x00\x00"
105*ae771770SStanislav Sedov "\x20\x02\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x70\x00\x00\x00"
106*ae771770SStanislav Sedov "\x38\x02\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00\x14\x00\x00\x00"
107*ae771770SStanislav Sedov "\xa8\x02\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x14\x00\x00\x00"
108*ae771770SStanislav Sedov "\xc0\x02\x00\x00\x00\x00\x00\x00\x01\x10\x08\x00\xcc\xcc\xcc\xcc"
109*ae771770SStanislav Sedov "\xb8\x01\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x7d\xee\x09\x76"
110*ae771770SStanislav Sedov "\xf2\x39\xc9\x01\xff\xff\xff\xff\xff\xff\xff\x7f\xff\xff\xff\xff"
111*ae771770SStanislav Sedov "\xff\xff\xff\x7f\x6d\x49\x38\x62\xf2\x39\xc9\x01\x6d\x09\xa2\x8c"
112*ae771770SStanislav Sedov "\xbb\x3a\xc9\x01\xff\xff\xff\xff\xff\xff\xff\x7f\x0e\x00\x0e\x00"
113*ae771770SStanislav Sedov "\x04\x00\x02\x00\x10\x00\x10\x00\x08\x00\x02\x00\x00\x00\x00\x00"
114*ae771770SStanislav Sedov "\x0c\x00\x02\x00\x00\x00\x00\x00\x10\x00\x02\x00\x00\x00\x00\x00"
115*ae771770SStanislav Sedov "\x14\x00\x02\x00\x00\x00\x00\x00\x18\x00\x02\x00\x02\x01\x00\x00"
116*ae771770SStanislav Sedov "\x52\x04\x00\x00\x01\x02\x00\x00\x03\x00\x00\x00\x1c\x00\x02\x00"
117*ae771770SStanislav Sedov "\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
118*ae771770SStanislav Sedov "\x00\x00\x00\x00\x10\x00\x12\x00\x20\x00\x02\x00\x0e\x00\x10\x00"
119*ae771770SStanislav Sedov "\x24\x00\x02\x00\x28\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00"
120*ae771770SStanislav Sedov "\x10\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
121*ae771770SStanislav Sedov "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
122*ae771770SStanislav Sedov "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
123*ae771770SStanislav Sedov "\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00"
124*ae771770SStanislav Sedov "\x6f\x00\x70\x00\x65\x00\x6e\x00\x6d\x00\x73\x00\x70\x00\x00\x00"
125*ae771770SStanislav Sedov "\x08\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x6f\x00\x70\x00"
126*ae771770SStanislav Sedov "\x65\x00\x6e\x00\x20\x00\x6d\x00\x73\x00\x70\x00\x00\x00\x00\x00"
127*ae771770SStanislav Sedov "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
128*ae771770SStanislav Sedov "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
129*ae771770SStanislav Sedov "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00"
130*ae771770SStanislav Sedov "\x60\x04\x00\x00\x07\x00\x00\x00\x01\x02\x00\x00\x07\x00\x00\x00"
131*ae771770SStanislav Sedov "\x5e\x04\x00\x00\x07\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00"
132*ae771770SStanislav Sedov "\x08\x00\x00\x00\x43\x00\x48\x00\x4b\x00\x52\x00\x2d\x00\x41\x00"
133*ae771770SStanislav Sedov "\x44\x00\x53\x00\x08\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00"
134*ae771770SStanislav Sedov "\x4d\x00\x53\x00\x50\x00\x2d\x00\x41\x00\x44\x00\x53\x00\x00\x00"
135*ae771770SStanislav Sedov "\x04\x00\x00\x00\x01\x04\x00\x00\x00\x00\x00\x05\x15\x00\x00\x00"
136*ae771770SStanislav Sedov "\x91\xad\xdc\x4c\x63\xb8\xb5\x48\xd5\x53\xd2\xd1\x00\x00\x00\x00"
137*ae771770SStanislav Sedov "\x00\x66\xeb\x75\xf2\x39\xc9\x01\x0e\x00\x6f\x00\x70\x00\x65\x00"
138*ae771770SStanislav Sedov "\x6e\x00\x6d\x00\x73\x00\x70\x00\x38\x00\x10\x00\x28\x00\x48\x00"
139*ae771770SStanislav Sedov "\x00\x00\x00\x00\x00\x00\x00\x00\x6f\x00\x70\x00\x65\x00\x6e\x00"
140*ae771770SStanislav Sedov "\x6d\x00\x73\x00\x70\x00\x40\x00\x6d\x00\x73\x00\x70\x00\x2d\x00"
141*ae771770SStanislav Sedov "\x61\x00\x64\x00\x73\x00\x2e\x00\x70\x00\x65\x00\x70\x00\x70\x00"
142*ae771770SStanislav Sedov "\x65\x00\x72\x00\x63\x00\x6f\x00\x6e\x00\x2e\x00\x64\x00\x65\x00"
143*ae771770SStanislav Sedov "\x4d\x00\x53\x00\x50\x00\x2d\x00\x41\x00\x44\x00\x53\x00\x2e\x00"
144*ae771770SStanislav Sedov "\x50\x00\x45\x00\x50\x00\x50\x00\x45\x00\x52\x00\x43\x00\x4f\x00"
145*ae771770SStanislav Sedov "\x4e\x00\x2e\x00\x44\x00\x45\x00\x76\xff\xff\xff\xb3\x56\x15\x29"
146*ae771770SStanislav Sedov "\x37\xc6\x5c\xf7\x97\x35\xfa\xec\x59\xe8\x96\xa0\x00\x00\x00\x00"
147*ae771770SStanislav Sedov "\x76\xff\xff\xff\x50\x71\xa2\xb1\xa3\x64\x82\x5c\xfd\x23\xea\x3b"
148*ae771770SStanislav Sedov "\xb0\x19\x12\xd4\x00\x00\x00\x00";
149*ae771770SStanislav Sedov
150*ae771770SStanislav Sedov
151*ae771770SStanislav Sedov static const krb5_keyblock member_keyblock2 = {
152*ae771770SStanislav Sedov ETYPE_DES_CBC_MD5,
153*ae771770SStanislav Sedov { 8, "\x9e\x37\x83\x25\x4a\x7f\xf2\xf8" }
154*ae771770SStanislav Sedov };
155*ae771770SStanislav Sedov
156*ae771770SStanislav Sedov static time_t authtime2 = 1225304188;
157*ae771770SStanislav Sedov static const char *user2 = "openmsp";
158*ae771770SStanislav Sedov
159*ae771770SStanislav Sedov
160c19800e8SDoug Rabson
161c19800e8SDoug Rabson int
main(int argc,char ** argv)162c19800e8SDoug Rabson main(int argc, char **argv)
163c19800e8SDoug Rabson {
164c19800e8SDoug Rabson krb5_error_code ret;
165c19800e8SDoug Rabson krb5_context context;
166c19800e8SDoug Rabson krb5_pac pac;
167c19800e8SDoug Rabson krb5_data data;
168*ae771770SStanislav Sedov krb5_principal p, p2;
169c19800e8SDoug Rabson
170c19800e8SDoug Rabson ret = krb5_init_context(&context);
171c19800e8SDoug Rabson if (ret)
172c19800e8SDoug Rabson errx(1, "krb5_init_contex");
173c19800e8SDoug Rabson
174*ae771770SStanislav Sedov krb5_enctype_enable(context, ETYPE_DES_CBC_MD5);
175*ae771770SStanislav Sedov
176*ae771770SStanislav Sedov ret = krb5_parse_name_flags(context, user,
177*ae771770SStanislav Sedov KRB5_PRINCIPAL_PARSE_NO_REALM, &p);
178c19800e8SDoug Rabson if (ret)
179c19800e8SDoug Rabson krb5_err(context, 1, ret, "krb5_parse_name");
180c19800e8SDoug Rabson
181c19800e8SDoug Rabson ret = krb5_pac_parse(context, saved_pac, sizeof(saved_pac), &pac);
182c19800e8SDoug Rabson if (ret)
183c19800e8SDoug Rabson krb5_err(context, 1, ret, "krb5_pac_parse");
184c19800e8SDoug Rabson
185c19800e8SDoug Rabson ret = krb5_pac_verify(context, pac, authtime, p,
186c19800e8SDoug Rabson &member_keyblock, &kdc_keyblock);
187c19800e8SDoug Rabson if (ret)
188c19800e8SDoug Rabson krb5_err(context, 1, ret, "krb5_pac_verify");
189c19800e8SDoug Rabson
190c19800e8SDoug Rabson ret = _krb5_pac_sign(context, pac, authtime, p,
191c19800e8SDoug Rabson &member_keyblock, &kdc_keyblock, &data);
192c19800e8SDoug Rabson if (ret)
193c19800e8SDoug Rabson krb5_err(context, 1, ret, "_krb5_pac_sign");
194c19800e8SDoug Rabson
195c19800e8SDoug Rabson krb5_pac_free(context, pac);
196c19800e8SDoug Rabson
197c19800e8SDoug Rabson ret = krb5_pac_parse(context, data.data, data.length, &pac);
198c19800e8SDoug Rabson krb5_data_free(&data);
199c19800e8SDoug Rabson if (ret)
200c19800e8SDoug Rabson krb5_err(context, 1, ret, "krb5_pac_parse 2");
201c19800e8SDoug Rabson
202c19800e8SDoug Rabson ret = krb5_pac_verify(context, pac, authtime, p,
203c19800e8SDoug Rabson &member_keyblock, &kdc_keyblock);
204c19800e8SDoug Rabson if (ret)
205c19800e8SDoug Rabson krb5_err(context, 1, ret, "krb5_pac_verify 2");
206c19800e8SDoug Rabson
207c19800e8SDoug Rabson /* make a copy and try to reproduce it */
208c19800e8SDoug Rabson {
209c19800e8SDoug Rabson uint32_t *list;
210c19800e8SDoug Rabson size_t len, i;
211c19800e8SDoug Rabson krb5_pac pac2;
212c19800e8SDoug Rabson
213c19800e8SDoug Rabson ret = krb5_pac_init(context, &pac2);
214c19800e8SDoug Rabson if (ret)
215c19800e8SDoug Rabson krb5_err(context, 1, ret, "krb5_pac_init");
216c19800e8SDoug Rabson
217c19800e8SDoug Rabson /* our two user buffer plus the three "system" buffers */
218c19800e8SDoug Rabson ret = krb5_pac_get_types(context, pac, &len, &list);
219c19800e8SDoug Rabson if (ret)
220c19800e8SDoug Rabson krb5_err(context, 1, ret, "krb5_pac_get_types");
221c19800e8SDoug Rabson
222c19800e8SDoug Rabson for (i = 0; i < len; i++) {
223c19800e8SDoug Rabson /* skip server_cksum, privsvr_cksum, and logon_name */
224c19800e8SDoug Rabson if (list[i] == 6 || list[i] == 7 || list[i] == 10)
225c19800e8SDoug Rabson continue;
226c19800e8SDoug Rabson
227c19800e8SDoug Rabson ret = krb5_pac_get_buffer(context, pac, list[i], &data);
228c19800e8SDoug Rabson if (ret)
229c19800e8SDoug Rabson krb5_err(context, 1, ret, "krb5_pac_get_buffer");
230c19800e8SDoug Rabson
231c19800e8SDoug Rabson if (list[i] == 1) {
232c19800e8SDoug Rabson if (type_1_length != data.length)
233c19800e8SDoug Rabson krb5_errx(context, 1, "type 1 have wrong length: %lu",
234c19800e8SDoug Rabson (unsigned long)data.length);
235c19800e8SDoug Rabson } else
236c19800e8SDoug Rabson krb5_errx(context, 1, "unknown type %lu",
237c19800e8SDoug Rabson (unsigned long)list[i]);
238c19800e8SDoug Rabson
239c19800e8SDoug Rabson ret = krb5_pac_add_buffer(context, pac2, list[i], &data);
240c19800e8SDoug Rabson if (ret)
241c19800e8SDoug Rabson krb5_err(context, 1, ret, "krb5_pac_add_buffer");
242c19800e8SDoug Rabson krb5_data_free(&data);
243c19800e8SDoug Rabson }
244c19800e8SDoug Rabson free(list);
245c19800e8SDoug Rabson
246c19800e8SDoug Rabson ret = _krb5_pac_sign(context, pac2, authtime, p,
247c19800e8SDoug Rabson &member_keyblock, &kdc_keyblock, &data);
248c19800e8SDoug Rabson if (ret)
249c19800e8SDoug Rabson krb5_err(context, 1, ret, "_krb5_pac_sign 4");
250c19800e8SDoug Rabson
251c19800e8SDoug Rabson krb5_pac_free(context, pac2);
252c19800e8SDoug Rabson
253c19800e8SDoug Rabson ret = krb5_pac_parse(context, data.data, data.length, &pac2);
254*ae771770SStanislav Sedov krb5_data_free(&data);
255c19800e8SDoug Rabson if (ret)
256c19800e8SDoug Rabson krb5_err(context, 1, ret, "krb5_pac_parse 4");
257c19800e8SDoug Rabson
258c19800e8SDoug Rabson ret = krb5_pac_verify(context, pac2, authtime, p,
259c19800e8SDoug Rabson &member_keyblock, &kdc_keyblock);
260c19800e8SDoug Rabson if (ret)
261c19800e8SDoug Rabson krb5_err(context, 1, ret, "krb5_pac_verify 4");
262c19800e8SDoug Rabson
263c19800e8SDoug Rabson krb5_pac_free(context, pac2);
264c19800e8SDoug Rabson }
265c19800e8SDoug Rabson
266c19800e8SDoug Rabson krb5_pac_free(context, pac);
267c19800e8SDoug Rabson
268c19800e8SDoug Rabson /*
269*ae771770SStanislav Sedov * check pac from Christian
270*ae771770SStanislav Sedov */
271*ae771770SStanislav Sedov
272*ae771770SStanislav Sedov ret = krb5_parse_name_flags(context, user2,
273*ae771770SStanislav Sedov KRB5_PRINCIPAL_PARSE_NO_REALM, &p2);
274*ae771770SStanislav Sedov if (ret)
275*ae771770SStanislav Sedov krb5_err(context, 1, ret, "krb5_parse_name");
276*ae771770SStanislav Sedov
277*ae771770SStanislav Sedov ret = krb5_pac_parse(context, saved_pac2, sizeof(saved_pac2) -1, &pac);
278*ae771770SStanislav Sedov if (ret)
279*ae771770SStanislav Sedov krb5_err(context, 1, ret, "krb5_pac_parse");
280*ae771770SStanislav Sedov
281*ae771770SStanislav Sedov ret = krb5_pac_verify(context, pac, authtime2, p2,
282*ae771770SStanislav Sedov &member_keyblock2, NULL);
283*ae771770SStanislav Sedov if (ret)
284*ae771770SStanislav Sedov krb5_err(context, 1, ret, "krb5_pac_verify c1");
285*ae771770SStanislav Sedov
286*ae771770SStanislav Sedov krb5_pac_free(context, pac);
287*ae771770SStanislav Sedov krb5_free_principal(context, p2);
288*ae771770SStanislav Sedov
289*ae771770SStanislav Sedov /*
290c19800e8SDoug Rabson * Test empty free
291c19800e8SDoug Rabson */
292c19800e8SDoug Rabson
293c19800e8SDoug Rabson ret = krb5_pac_init(context, &pac);
294c19800e8SDoug Rabson if (ret)
295c19800e8SDoug Rabson krb5_err(context, 1, ret, "krb5_pac_init");
296c19800e8SDoug Rabson krb5_pac_free(context, pac);
297c19800e8SDoug Rabson
298c19800e8SDoug Rabson /*
299c19800e8SDoug Rabson * Test add remove buffer
300c19800e8SDoug Rabson */
301c19800e8SDoug Rabson
302c19800e8SDoug Rabson ret = krb5_pac_init(context, &pac);
303c19800e8SDoug Rabson if (ret)
304c19800e8SDoug Rabson krb5_err(context, 1, ret, "krb5_pac_init");
305c19800e8SDoug Rabson
306c19800e8SDoug Rabson {
307c19800e8SDoug Rabson const krb5_data cdata = { 2, "\x00\x01" } ;
308c19800e8SDoug Rabson
309c19800e8SDoug Rabson ret = krb5_pac_add_buffer(context, pac, 1, &cdata);
310c19800e8SDoug Rabson if (ret)
311c19800e8SDoug Rabson krb5_err(context, 1, ret, "krb5_pac_add_buffer");
312c19800e8SDoug Rabson }
313c19800e8SDoug Rabson {
314c19800e8SDoug Rabson ret = krb5_pac_get_buffer(context, pac, 1, &data);
315c19800e8SDoug Rabson if (ret)
316c19800e8SDoug Rabson krb5_err(context, 1, ret, "krb5_pac_get_buffer");
317c19800e8SDoug Rabson if (data.length != 2 || memcmp(data.data, "\x00\x01", 2) != 0)
318c19800e8SDoug Rabson krb5_errx(context, 1, "krb5_pac_get_buffer data not the same");
319c19800e8SDoug Rabson krb5_data_free(&data);
320c19800e8SDoug Rabson }
321c19800e8SDoug Rabson
322c19800e8SDoug Rabson {
323c19800e8SDoug Rabson const krb5_data cdata = { 2, "\x02\x00" } ;
324c19800e8SDoug Rabson
325c19800e8SDoug Rabson ret = krb5_pac_add_buffer(context, pac, 2, &cdata);
326c19800e8SDoug Rabson if (ret)
327c19800e8SDoug Rabson krb5_err(context, 1, ret, "krb5_pac_add_buffer");
328c19800e8SDoug Rabson }
329c19800e8SDoug Rabson {
330c19800e8SDoug Rabson ret = krb5_pac_get_buffer(context, pac, 1, &data);
331c19800e8SDoug Rabson if (ret)
332c19800e8SDoug Rabson krb5_err(context, 1, ret, "krb5_pac_get_buffer");
333c19800e8SDoug Rabson if (data.length != 2 || memcmp(data.data, "\x00\x01", 2) != 0)
334c19800e8SDoug Rabson krb5_errx(context, 1, "krb5_pac_get_buffer data not the same");
335c19800e8SDoug Rabson krb5_data_free(&data);
336c19800e8SDoug Rabson /* */
337c19800e8SDoug Rabson ret = krb5_pac_get_buffer(context, pac, 2, &data);
338c19800e8SDoug Rabson if (ret)
339c19800e8SDoug Rabson krb5_err(context, 1, ret, "krb5_pac_get_buffer");
340c19800e8SDoug Rabson if (data.length != 2 || memcmp(data.data, "\x02\x00", 2) != 0)
341c19800e8SDoug Rabson krb5_errx(context, 1, "krb5_pac_get_buffer data not the same");
342c19800e8SDoug Rabson krb5_data_free(&data);
343c19800e8SDoug Rabson }
344c19800e8SDoug Rabson
345c19800e8SDoug Rabson ret = _krb5_pac_sign(context, pac, authtime, p,
346c19800e8SDoug Rabson &member_keyblock, &kdc_keyblock, &data);
347c19800e8SDoug Rabson if (ret)
348c19800e8SDoug Rabson krb5_err(context, 1, ret, "_krb5_pac_sign");
349c19800e8SDoug Rabson
350c19800e8SDoug Rabson krb5_pac_free(context, pac);
351c19800e8SDoug Rabson
352c19800e8SDoug Rabson ret = krb5_pac_parse(context, data.data, data.length, &pac);
353c19800e8SDoug Rabson krb5_data_free(&data);
354c19800e8SDoug Rabson if (ret)
355c19800e8SDoug Rabson krb5_err(context, 1, ret, "krb5_pac_parse 3");
356c19800e8SDoug Rabson
357c19800e8SDoug Rabson ret = krb5_pac_verify(context, pac, authtime, p,
358c19800e8SDoug Rabson &member_keyblock, &kdc_keyblock);
359c19800e8SDoug Rabson if (ret)
360c19800e8SDoug Rabson krb5_err(context, 1, ret, "krb5_pac_verify 3");
361c19800e8SDoug Rabson
362c19800e8SDoug Rabson {
363c19800e8SDoug Rabson uint32_t *list;
364c19800e8SDoug Rabson size_t len;
365c19800e8SDoug Rabson
366c19800e8SDoug Rabson /* our two user buffer plus the three "system" buffers */
367c19800e8SDoug Rabson ret = krb5_pac_get_types(context, pac, &len, &list);
368c19800e8SDoug Rabson if (ret)
369c19800e8SDoug Rabson krb5_err(context, 1, ret, "krb5_pac_get_types");
370c19800e8SDoug Rabson if (len != 5)
371c19800e8SDoug Rabson krb5_errx(context, 1, "list wrong length");
372c19800e8SDoug Rabson free(list);
373c19800e8SDoug Rabson }
374c19800e8SDoug Rabson
375c19800e8SDoug Rabson krb5_pac_free(context, pac);
376c19800e8SDoug Rabson
377c19800e8SDoug Rabson krb5_free_principal(context, p);
378c19800e8SDoug Rabson krb5_free_context(context);
379c19800e8SDoug Rabson
380c19800e8SDoug Rabson return 0;
381c19800e8SDoug Rabson }
382