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