xref: /freebsd/crypto/heimdal/lib/krb5/test_pac.c (revision 6a068746777241722b2b32c5d0bc443a2a64d80b)
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