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