1*159d09a2SMark Phalan /*
2*159d09a2SMark Phalan  * COPYRIGHT (C) 2006,2007
3*159d09a2SMark Phalan  * THE REGENTS OF THE UNIVERSITY OF MICHIGAN
4*159d09a2SMark Phalan  * ALL RIGHTS RESERVED
5*159d09a2SMark Phalan  *
6*159d09a2SMark Phalan  * Permission is granted to use, copy, create derivative works
7*159d09a2SMark Phalan  * and redistribute this software and such derivative works
8*159d09a2SMark Phalan  * for any purpose, so long as the name of The University of
9*159d09a2SMark Phalan  * Michigan is not used in any advertising or publicity
10*159d09a2SMark Phalan  * pertaining to the use of distribution of this software
11*159d09a2SMark Phalan  * without specific, written prior authorization.  If the
12*159d09a2SMark Phalan  * above copyright notice or any other identification of the
13*159d09a2SMark Phalan  * University of Michigan is included in any copy of any
14*159d09a2SMark Phalan  * portion of this software, then the disclaimer below must
15*159d09a2SMark Phalan  * also be included.
16*159d09a2SMark Phalan  *
17*159d09a2SMark Phalan  * THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION
18*159d09a2SMark Phalan  * FROM THE UNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY
19*159d09a2SMark Phalan  * PURPOSE, AND WITHOUT WARRANTY BY THE UNIVERSITY OF
20*159d09a2SMark Phalan  * MICHIGAN OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING
21*159d09a2SMark Phalan  * WITHOUT LIMITATION THE IMPLIED WARRANTIES OF
22*159d09a2SMark Phalan  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
23*159d09a2SMark Phalan  * REGENTS OF THE UNIVERSITY OF MICHIGAN SHALL NOT BE LIABLE
24*159d09a2SMark Phalan  * FOR ANY DAMAGES, INCLUDING SPECIAL, INDIRECT, INCIDENTAL, OR
25*159d09a2SMark Phalan  * CONSEQUENTIAL DAMAGES, WITH RESPECT TO ANY CLAIM ARISING
26*159d09a2SMark Phalan  * OUT OF OR IN CONNECTION WITH THE USE OF THE SOFTWARE, EVEN
27*159d09a2SMark Phalan  * IF IT HAS BEEN OR IS HEREAFTER ADVISED OF THE POSSIBILITY OF
28*159d09a2SMark Phalan  * SUCH DAMAGES.
29*159d09a2SMark Phalan  */
30*159d09a2SMark Phalan 
31*159d09a2SMark Phalan #include <stdio.h>
32*159d09a2SMark Phalan #include <stdlib.h>
33*159d09a2SMark Phalan #include <errno.h>
34*159d09a2SMark Phalan #include <unistd.h>
35*159d09a2SMark Phalan #include <string.h>
36*159d09a2SMark Phalan #include <ctype.h>
37*159d09a2SMark Phalan #include <assert.h>
38*159d09a2SMark Phalan 
39*159d09a2SMark Phalan #include "pkinit.h"
40*159d09a2SMark Phalan 
41*159d09a2SMark Phalan #define FAKECERT
42*159d09a2SMark Phalan 
43*159d09a2SMark Phalan const krb5_octet_data
44*159d09a2SMark Phalan 	dh_oid = { 0, 7, (unsigned char *)"\x2A\x86\x48\xce\x3e\x02\x01" };
45*159d09a2SMark Phalan 
46*159d09a2SMark Phalan 
47*159d09a2SMark Phalan krb5_error_code
pkinit_init_req_opts(pkinit_req_opts ** reqopts)48*159d09a2SMark Phalan pkinit_init_req_opts(pkinit_req_opts **reqopts)
49*159d09a2SMark Phalan {
50*159d09a2SMark Phalan     krb5_error_code retval = ENOMEM;
51*159d09a2SMark Phalan     pkinit_req_opts *opts = NULL;
52*159d09a2SMark Phalan 
53*159d09a2SMark Phalan     *reqopts = NULL;
54*159d09a2SMark Phalan     opts = (pkinit_req_opts *) calloc(1, sizeof(pkinit_req_opts));
55*159d09a2SMark Phalan     if (opts == NULL)
56*159d09a2SMark Phalan 	return retval;
57*159d09a2SMark Phalan 
58*159d09a2SMark Phalan     opts->require_eku = 1;
59*159d09a2SMark Phalan     opts->accept_secondary_eku = 0;
60*159d09a2SMark Phalan     opts->allow_upn = 0;
61*159d09a2SMark Phalan     opts->dh_or_rsa = DH_PROTOCOL;
62*159d09a2SMark Phalan     opts->require_crl_checking = 0;
63*159d09a2SMark Phalan     opts->dh_size = PKINIT_DEFAULT_DH_MIN_BITS;
64*159d09a2SMark Phalan     opts->win2k_target = 0;
65*159d09a2SMark Phalan     opts->win2k_require_cksum = 0;
66*159d09a2SMark Phalan 
67*159d09a2SMark Phalan     *reqopts = opts;
68*159d09a2SMark Phalan 
69*159d09a2SMark Phalan     return 0;
70*159d09a2SMark Phalan }
71*159d09a2SMark Phalan 
72*159d09a2SMark Phalan void
pkinit_fini_req_opts(pkinit_req_opts * opts)73*159d09a2SMark Phalan pkinit_fini_req_opts(pkinit_req_opts *opts)
74*159d09a2SMark Phalan {
75*159d09a2SMark Phalan     if (opts != NULL)
76*159d09a2SMark Phalan 	free(opts);
77*159d09a2SMark Phalan     return;
78*159d09a2SMark Phalan }
79*159d09a2SMark Phalan 
80*159d09a2SMark Phalan krb5_error_code
pkinit_init_plg_opts(pkinit_plg_opts ** plgopts)81*159d09a2SMark Phalan pkinit_init_plg_opts(pkinit_plg_opts **plgopts)
82*159d09a2SMark Phalan {
83*159d09a2SMark Phalan     krb5_error_code retval = ENOMEM;
84*159d09a2SMark Phalan     pkinit_plg_opts *opts = NULL;
85*159d09a2SMark Phalan 
86*159d09a2SMark Phalan     *plgopts = NULL;
87*159d09a2SMark Phalan     opts = (pkinit_plg_opts *) calloc(1, sizeof(pkinit_plg_opts));
88*159d09a2SMark Phalan     if (opts == NULL)
89*159d09a2SMark Phalan 	return retval;
90*159d09a2SMark Phalan 
91*159d09a2SMark Phalan     opts->require_eku = 1;
92*159d09a2SMark Phalan     opts->accept_secondary_eku = 0;
93*159d09a2SMark Phalan     opts->dh_or_rsa = DH_PROTOCOL;
94*159d09a2SMark Phalan     opts->allow_upn = 0;
95*159d09a2SMark Phalan     opts->require_crl_checking = 0;
96*159d09a2SMark Phalan 
97*159d09a2SMark Phalan     opts->dh_min_bits = PKINIT_DEFAULT_DH_MIN_BITS;
98*159d09a2SMark Phalan 
99*159d09a2SMark Phalan     *plgopts = opts;
100*159d09a2SMark Phalan 
101*159d09a2SMark Phalan     return 0;
102*159d09a2SMark Phalan }
103*159d09a2SMark Phalan 
104*159d09a2SMark Phalan void
pkinit_fini_plg_opts(pkinit_plg_opts * opts)105*159d09a2SMark Phalan pkinit_fini_plg_opts(pkinit_plg_opts *opts)
106*159d09a2SMark Phalan {
107*159d09a2SMark Phalan     if (opts != NULL)
108*159d09a2SMark Phalan 	free(opts);
109*159d09a2SMark Phalan     return;
110*159d09a2SMark Phalan }
111*159d09a2SMark Phalan 
112*159d09a2SMark Phalan void
free_krb5_pa_pk_as_req(krb5_pa_pk_as_req ** in)113*159d09a2SMark Phalan free_krb5_pa_pk_as_req(krb5_pa_pk_as_req **in)
114*159d09a2SMark Phalan {
115*159d09a2SMark Phalan     if (*in == NULL) return;
116*159d09a2SMark Phalan     if ((*in)->signedAuthPack.data != NULL)
117*159d09a2SMark Phalan 	free((*in)->signedAuthPack.data);
118*159d09a2SMark Phalan     if ((*in)->trustedCertifiers != NULL)
119*159d09a2SMark Phalan 	free_krb5_external_principal_identifier(&(*in)->trustedCertifiers);
120*159d09a2SMark Phalan     if ((*in)->kdcPkId.data != NULL)
121*159d09a2SMark Phalan 	free((*in)->kdcPkId.data);
122*159d09a2SMark Phalan     free(*in);
123*159d09a2SMark Phalan }
124*159d09a2SMark Phalan 
125*159d09a2SMark Phalan void
free_krb5_pa_pk_as_req_draft9(krb5_pa_pk_as_req_draft9 ** in)126*159d09a2SMark Phalan free_krb5_pa_pk_as_req_draft9(krb5_pa_pk_as_req_draft9 **in)
127*159d09a2SMark Phalan {
128*159d09a2SMark Phalan     if (*in == NULL) return;
129*159d09a2SMark Phalan     if ((*in)->signedAuthPack.data != NULL)
130*159d09a2SMark Phalan 	free((*in)->signedAuthPack.data);
131*159d09a2SMark Phalan     if ((*in)->kdcCert.data != NULL)
132*159d09a2SMark Phalan 	free((*in)->kdcCert.data);
133*159d09a2SMark Phalan     if ((*in)->encryptionCert.data != NULL)
134*159d09a2SMark Phalan 	free((*in)->encryptionCert.data);
135*159d09a2SMark Phalan     if ((*in)->trustedCertifiers != NULL)
136*159d09a2SMark Phalan 	free_krb5_trusted_ca(&(*in)->trustedCertifiers);
137*159d09a2SMark Phalan     free(*in);
138*159d09a2SMark Phalan }
139*159d09a2SMark Phalan 
140*159d09a2SMark Phalan void
free_krb5_reply_key_pack(krb5_reply_key_pack ** in)141*159d09a2SMark Phalan free_krb5_reply_key_pack(krb5_reply_key_pack **in)
142*159d09a2SMark Phalan {
143*159d09a2SMark Phalan     if (*in == NULL) return;
144*159d09a2SMark Phalan     if ((*in)->replyKey.contents != NULL)
145*159d09a2SMark Phalan 	free((*in)->replyKey.contents);
146*159d09a2SMark Phalan     if ((*in)->asChecksum.contents != NULL)
147*159d09a2SMark Phalan 	free((*in)->asChecksum.contents);
148*159d09a2SMark Phalan     free(*in);
149*159d09a2SMark Phalan }
150*159d09a2SMark Phalan 
151*159d09a2SMark Phalan void
free_krb5_reply_key_pack_draft9(krb5_reply_key_pack_draft9 ** in)152*159d09a2SMark Phalan free_krb5_reply_key_pack_draft9(krb5_reply_key_pack_draft9 **in)
153*159d09a2SMark Phalan {
154*159d09a2SMark Phalan     if (*in == NULL) return;
155*159d09a2SMark Phalan     if ((*in)->replyKey.contents != NULL)
156*159d09a2SMark Phalan 	free((*in)->replyKey.contents);
157*159d09a2SMark Phalan     free(*in);
158*159d09a2SMark Phalan }
159*159d09a2SMark Phalan 
160*159d09a2SMark Phalan void
free_krb5_auth_pack(krb5_auth_pack ** in)161*159d09a2SMark Phalan free_krb5_auth_pack(krb5_auth_pack **in)
162*159d09a2SMark Phalan {
163*159d09a2SMark Phalan     if ((*in) == NULL) return;
164*159d09a2SMark Phalan     if ((*in)->clientPublicValue != NULL) {
165*159d09a2SMark Phalan 	if ((*in)->clientPublicValue->algorithm.algorithm.data != NULL)
166*159d09a2SMark Phalan 	    free((*in)->clientPublicValue->algorithm.algorithm.data);
167*159d09a2SMark Phalan 	if ((*in)->clientPublicValue->algorithm.parameters.data != NULL)
168*159d09a2SMark Phalan 	    free((*in)->clientPublicValue->algorithm.parameters.data);
169*159d09a2SMark Phalan 	if ((*in)->clientPublicValue->subjectPublicKey.data != NULL)
170*159d09a2SMark Phalan 	    free((*in)->clientPublicValue->subjectPublicKey.data);
171*159d09a2SMark Phalan 	free((*in)->clientPublicValue);
172*159d09a2SMark Phalan     }
173*159d09a2SMark Phalan     if ((*in)->pkAuthenticator.paChecksum.contents != NULL)
174*159d09a2SMark Phalan 	free((*in)->pkAuthenticator.paChecksum.contents);
175*159d09a2SMark Phalan     if ((*in)->supportedCMSTypes != NULL)
176*159d09a2SMark Phalan 	free_krb5_algorithm_identifiers(&((*in)->supportedCMSTypes));
177*159d09a2SMark Phalan     free(*in);
178*159d09a2SMark Phalan }
179*159d09a2SMark Phalan 
180*159d09a2SMark Phalan void
free_krb5_auth_pack_draft9(krb5_context context,krb5_auth_pack_draft9 ** in)181*159d09a2SMark Phalan free_krb5_auth_pack_draft9(krb5_context context,
182*159d09a2SMark Phalan 				krb5_auth_pack_draft9 **in)
183*159d09a2SMark Phalan {
184*159d09a2SMark Phalan     if ((*in) == NULL) return;
185*159d09a2SMark Phalan     krb5_free_principal(context, (*in)->pkAuthenticator.kdcName);
186*159d09a2SMark Phalan     free(*in);
187*159d09a2SMark Phalan }
188*159d09a2SMark Phalan 
189*159d09a2SMark Phalan void
free_krb5_pa_pk_as_rep(krb5_pa_pk_as_rep ** in)190*159d09a2SMark Phalan free_krb5_pa_pk_as_rep(krb5_pa_pk_as_rep **in)
191*159d09a2SMark Phalan {
192*159d09a2SMark Phalan     if (*in == NULL) return;
193*159d09a2SMark Phalan     switch ((*in)->choice) {
194*159d09a2SMark Phalan 	case choice_pa_pk_as_rep_dhInfo:
195*159d09a2SMark Phalan 	    if ((*in)->u.dh_Info.dhSignedData.data != NULL)
196*159d09a2SMark Phalan 		free((*in)->u.dh_Info.dhSignedData.data);
197*159d09a2SMark Phalan 	    break;
198*159d09a2SMark Phalan 	case choice_pa_pk_as_rep_encKeyPack:
199*159d09a2SMark Phalan 	    if ((*in)->u.encKeyPack.data != NULL)
200*159d09a2SMark Phalan 		free((*in)->u.encKeyPack.data);
201*159d09a2SMark Phalan 	    break;
202*159d09a2SMark Phalan 	default:
203*159d09a2SMark Phalan 	    break;
204*159d09a2SMark Phalan     }
205*159d09a2SMark Phalan     free(*in);
206*159d09a2SMark Phalan }
207*159d09a2SMark Phalan 
208*159d09a2SMark Phalan void
free_krb5_pa_pk_as_rep_draft9(krb5_pa_pk_as_rep_draft9 ** in)209*159d09a2SMark Phalan free_krb5_pa_pk_as_rep_draft9(krb5_pa_pk_as_rep_draft9 **in)
210*159d09a2SMark Phalan {
211*159d09a2SMark Phalan     if (*in == NULL) return;
212*159d09a2SMark Phalan     if ((*in)->u.encKeyPack.data != NULL)
213*159d09a2SMark Phalan 	free((*in)->u.encKeyPack.data);
214*159d09a2SMark Phalan     free(*in);
215*159d09a2SMark Phalan }
216*159d09a2SMark Phalan 
217*159d09a2SMark Phalan void
free_krb5_external_principal_identifier(krb5_external_principal_identifier *** in)218*159d09a2SMark Phalan free_krb5_external_principal_identifier(krb5_external_principal_identifier ***in)
219*159d09a2SMark Phalan {
220*159d09a2SMark Phalan     int i = 0;
221*159d09a2SMark Phalan     if (*in == NULL) return;
222*159d09a2SMark Phalan     while ((*in)[i] != NULL) {
223*159d09a2SMark Phalan 	if ((*in)[i]->subjectName.data != NULL)
224*159d09a2SMark Phalan 	    free((*in)[i]->subjectName.data);
225*159d09a2SMark Phalan 	if ((*in)[i]->issuerAndSerialNumber.data != NULL)
226*159d09a2SMark Phalan 	    free((*in)[i]->issuerAndSerialNumber.data);
227*159d09a2SMark Phalan 	if ((*in)[i]->subjectKeyIdentifier.data != NULL)
228*159d09a2SMark Phalan 	    free((*in)[i]->subjectKeyIdentifier.data);
229*159d09a2SMark Phalan 	free((*in)[i]);
230*159d09a2SMark Phalan 	i++;
231*159d09a2SMark Phalan     }
232*159d09a2SMark Phalan     free(*in);
233*159d09a2SMark Phalan }
234*159d09a2SMark Phalan 
235*159d09a2SMark Phalan void
free_krb5_trusted_ca(krb5_trusted_ca *** in)236*159d09a2SMark Phalan free_krb5_trusted_ca(krb5_trusted_ca ***in)
237*159d09a2SMark Phalan {
238*159d09a2SMark Phalan     int i = 0;
239*159d09a2SMark Phalan     if (*in == NULL) return;
240*159d09a2SMark Phalan     while ((*in)[i] != NULL) {
241*159d09a2SMark Phalan 	switch((*in)[i]->choice) {
242*159d09a2SMark Phalan 	    case choice_trusted_cas_principalName:
243*159d09a2SMark Phalan 		break;
244*159d09a2SMark Phalan 	    case choice_trusted_cas_caName:
245*159d09a2SMark Phalan 		if ((*in)[i]->u.caName.data != NULL)
246*159d09a2SMark Phalan 		    free((*in)[i]->u.caName.data);
247*159d09a2SMark Phalan 		break;
248*159d09a2SMark Phalan 	    case choice_trusted_cas_issuerAndSerial:
249*159d09a2SMark Phalan 		if ((*in)[i]->u.issuerAndSerial.data != NULL)
250*159d09a2SMark Phalan 		    free((*in)[i]->u.issuerAndSerial.data);
251*159d09a2SMark Phalan 		break;
252*159d09a2SMark Phalan 	    case choice_trusted_cas_UNKNOWN:
253*159d09a2SMark Phalan 		break;
254*159d09a2SMark Phalan 	}
255*159d09a2SMark Phalan 	free((*in)[i]);
256*159d09a2SMark Phalan 	i++;
257*159d09a2SMark Phalan     }
258*159d09a2SMark Phalan     free(*in);
259*159d09a2SMark Phalan }
260*159d09a2SMark Phalan 
261*159d09a2SMark Phalan void
free_krb5_typed_data(krb5_typed_data *** in)262*159d09a2SMark Phalan free_krb5_typed_data(krb5_typed_data ***in)
263*159d09a2SMark Phalan {
264*159d09a2SMark Phalan     int i = 0;
265*159d09a2SMark Phalan     if (*in == NULL) return;
266*159d09a2SMark Phalan     while ((*in)[i] != NULL) {
267*159d09a2SMark Phalan 	if ((*in)[i]->data != NULL)
268*159d09a2SMark Phalan 	    free((*in)[i]->data);
269*159d09a2SMark Phalan 	free((*in)[i]);
270*159d09a2SMark Phalan 	i++;
271*159d09a2SMark Phalan     }
272*159d09a2SMark Phalan     free(*in);
273*159d09a2SMark Phalan }
274*159d09a2SMark Phalan 
275*159d09a2SMark Phalan void
free_krb5_algorithm_identifier(krb5_algorithm_identifier * in)276*159d09a2SMark Phalan free_krb5_algorithm_identifier(krb5_algorithm_identifier *in)
277*159d09a2SMark Phalan {
278*159d09a2SMark Phalan     if (in == NULL)
279*159d09a2SMark Phalan 	return;
280*159d09a2SMark Phalan     if (in->algorithm.data != NULL)
281*159d09a2SMark Phalan 	free(in->algorithm.data);
282*159d09a2SMark Phalan     if (in->parameters.data != NULL)
283*159d09a2SMark Phalan 	free(in->parameters.data);
284*159d09a2SMark Phalan     free(in);
285*159d09a2SMark Phalan }
286*159d09a2SMark Phalan 
287*159d09a2SMark Phalan void
free_krb5_algorithm_identifiers(krb5_algorithm_identifier *** in)288*159d09a2SMark Phalan free_krb5_algorithm_identifiers(krb5_algorithm_identifier ***in)
289*159d09a2SMark Phalan {
290*159d09a2SMark Phalan     int i;
291*159d09a2SMark Phalan     if (in == NULL || *in == NULL)
292*159d09a2SMark Phalan 	return;
293*159d09a2SMark Phalan     for (i = 0; (*in)[i] != NULL; i++) {
294*159d09a2SMark Phalan 	free_krb5_algorithm_identifier((*in)[i]);
295*159d09a2SMark Phalan     }
296*159d09a2SMark Phalan     free(*in);
297*159d09a2SMark Phalan }
298*159d09a2SMark Phalan 
299*159d09a2SMark Phalan void
free_krb5_subject_pk_info(krb5_subject_pk_info ** in)300*159d09a2SMark Phalan free_krb5_subject_pk_info(krb5_subject_pk_info **in)
301*159d09a2SMark Phalan {
302*159d09a2SMark Phalan     if ((*in) == NULL) return;
303*159d09a2SMark Phalan     if ((*in)->algorithm.parameters.data != NULL)
304*159d09a2SMark Phalan 	free((*in)->algorithm.parameters.data);
305*159d09a2SMark Phalan     if ((*in)->subjectPublicKey.data != NULL)
306*159d09a2SMark Phalan 	free((*in)->subjectPublicKey.data);
307*159d09a2SMark Phalan     free(*in);
308*159d09a2SMark Phalan }
309*159d09a2SMark Phalan 
310*159d09a2SMark Phalan void
free_krb5_kdc_dh_key_info(krb5_kdc_dh_key_info ** in)311*159d09a2SMark Phalan free_krb5_kdc_dh_key_info(krb5_kdc_dh_key_info **in)
312*159d09a2SMark Phalan {
313*159d09a2SMark Phalan     if (*in == NULL) return;
314*159d09a2SMark Phalan     if ((*in)->subjectPublicKey.data != NULL)
315*159d09a2SMark Phalan 	free((*in)->subjectPublicKey.data);
316*159d09a2SMark Phalan     free(*in);
317*159d09a2SMark Phalan }
318*159d09a2SMark Phalan 
319*159d09a2SMark Phalan void
init_krb5_pa_pk_as_req(krb5_pa_pk_as_req ** in)320*159d09a2SMark Phalan init_krb5_pa_pk_as_req(krb5_pa_pk_as_req **in)
321*159d09a2SMark Phalan {
322*159d09a2SMark Phalan     (*in) = malloc(sizeof(krb5_pa_pk_as_req));
323*159d09a2SMark Phalan     if ((*in) == NULL) return;
324*159d09a2SMark Phalan     (*in)->signedAuthPack.data = NULL;
325*159d09a2SMark Phalan     (*in)->signedAuthPack.length = 0;
326*159d09a2SMark Phalan     (*in)->trustedCertifiers = NULL;
327*159d09a2SMark Phalan     (*in)->kdcPkId.data = NULL;
328*159d09a2SMark Phalan     (*in)->kdcPkId.length = 0;
329*159d09a2SMark Phalan }
330*159d09a2SMark Phalan 
331*159d09a2SMark Phalan void
init_krb5_pa_pk_as_req_draft9(krb5_pa_pk_as_req_draft9 ** in)332*159d09a2SMark Phalan init_krb5_pa_pk_as_req_draft9(krb5_pa_pk_as_req_draft9 **in)
333*159d09a2SMark Phalan {
334*159d09a2SMark Phalan     (*in) = malloc(sizeof(krb5_pa_pk_as_req_draft9));
335*159d09a2SMark Phalan     if ((*in) == NULL) return;
336*159d09a2SMark Phalan     (*in)->signedAuthPack.data = NULL;
337*159d09a2SMark Phalan     (*in)->signedAuthPack.length = 0;
338*159d09a2SMark Phalan     (*in)->trustedCertifiers = NULL;
339*159d09a2SMark Phalan     (*in)->kdcCert.data = NULL;
340*159d09a2SMark Phalan     (*in)->kdcCert.length = 0;
341*159d09a2SMark Phalan     (*in)->encryptionCert.data = NULL;
342*159d09a2SMark Phalan     (*in)->encryptionCert.length = 0;
343*159d09a2SMark Phalan }
344*159d09a2SMark Phalan 
345*159d09a2SMark Phalan void
init_krb5_reply_key_pack(krb5_reply_key_pack ** in)346*159d09a2SMark Phalan init_krb5_reply_key_pack(krb5_reply_key_pack **in)
347*159d09a2SMark Phalan {
348*159d09a2SMark Phalan     (*in) = malloc(sizeof(krb5_reply_key_pack));
349*159d09a2SMark Phalan     if ((*in) == NULL) return;
350*159d09a2SMark Phalan     (*in)->replyKey.contents = NULL;
351*159d09a2SMark Phalan     (*in)->replyKey.length = 0;
352*159d09a2SMark Phalan     (*in)->asChecksum.contents = NULL;
353*159d09a2SMark Phalan     (*in)->asChecksum.length = 0;
354*159d09a2SMark Phalan }
355*159d09a2SMark Phalan 
356*159d09a2SMark Phalan void
init_krb5_reply_key_pack_draft9(krb5_reply_key_pack_draft9 ** in)357*159d09a2SMark Phalan init_krb5_reply_key_pack_draft9(krb5_reply_key_pack_draft9 **in)
358*159d09a2SMark Phalan {
359*159d09a2SMark Phalan     (*in) = malloc(sizeof(krb5_reply_key_pack_draft9));
360*159d09a2SMark Phalan     if ((*in) == NULL) return;
361*159d09a2SMark Phalan     (*in)->replyKey.contents = NULL;
362*159d09a2SMark Phalan     (*in)->replyKey.length = 0;
363*159d09a2SMark Phalan }
364*159d09a2SMark Phalan 
365*159d09a2SMark Phalan void
init_krb5_auth_pack(krb5_auth_pack ** in)366*159d09a2SMark Phalan init_krb5_auth_pack(krb5_auth_pack **in)
367*159d09a2SMark Phalan {
368*159d09a2SMark Phalan     (*in) = malloc(sizeof(krb5_auth_pack));
369*159d09a2SMark Phalan     if ((*in) == NULL) return;
370*159d09a2SMark Phalan     (*in)->clientPublicValue = NULL;
371*159d09a2SMark Phalan     (*in)->supportedCMSTypes = NULL;
372*159d09a2SMark Phalan     (*in)->clientDHNonce.length = 0;
373*159d09a2SMark Phalan     (*in)->clientDHNonce.data = NULL;
374*159d09a2SMark Phalan     (*in)->pkAuthenticator.paChecksum.contents = NULL;
375*159d09a2SMark Phalan }
376*159d09a2SMark Phalan 
377*159d09a2SMark Phalan void
init_krb5_auth_pack_draft9(krb5_auth_pack_draft9 ** in)378*159d09a2SMark Phalan init_krb5_auth_pack_draft9(krb5_auth_pack_draft9 **in)
379*159d09a2SMark Phalan {
380*159d09a2SMark Phalan     (*in) = malloc(sizeof(krb5_auth_pack_draft9));
381*159d09a2SMark Phalan     if ((*in) == NULL) return;
382*159d09a2SMark Phalan     (*in)->clientPublicValue = NULL;
383*159d09a2SMark Phalan }
384*159d09a2SMark Phalan 
385*159d09a2SMark Phalan void
init_krb5_pa_pk_as_rep(krb5_pa_pk_as_rep ** in)386*159d09a2SMark Phalan init_krb5_pa_pk_as_rep(krb5_pa_pk_as_rep **in)
387*159d09a2SMark Phalan {
388*159d09a2SMark Phalan     (*in) = malloc(sizeof(krb5_pa_pk_as_rep));
389*159d09a2SMark Phalan     if ((*in) == NULL) return;
390*159d09a2SMark Phalan     (*in)->u.dh_Info.serverDHNonce.length = 0;
391*159d09a2SMark Phalan     (*in)->u.dh_Info.serverDHNonce.data = NULL;
392*159d09a2SMark Phalan     (*in)->u.dh_Info.dhSignedData.length = 0;
393*159d09a2SMark Phalan     (*in)->u.dh_Info.dhSignedData.data = NULL;
394*159d09a2SMark Phalan     (*in)->u.encKeyPack.length = 0;
395*159d09a2SMark Phalan     (*in)->u.encKeyPack.data = NULL;
396*159d09a2SMark Phalan }
397*159d09a2SMark Phalan 
398*159d09a2SMark Phalan void
init_krb5_pa_pk_as_rep_draft9(krb5_pa_pk_as_rep_draft9 ** in)399*159d09a2SMark Phalan init_krb5_pa_pk_as_rep_draft9(krb5_pa_pk_as_rep_draft9 **in)
400*159d09a2SMark Phalan {
401*159d09a2SMark Phalan     (*in) = malloc(sizeof(krb5_pa_pk_as_rep_draft9));
402*159d09a2SMark Phalan     if ((*in) == NULL) return;
403*159d09a2SMark Phalan     (*in)->u.dhSignedData.length = 0;
404*159d09a2SMark Phalan     (*in)->u.dhSignedData.data = NULL;
405*159d09a2SMark Phalan     (*in)->u.encKeyPack.length = 0;
406*159d09a2SMark Phalan     (*in)->u.encKeyPack.data = NULL;
407*159d09a2SMark Phalan }
408*159d09a2SMark Phalan 
409*159d09a2SMark Phalan void
init_krb5_typed_data(krb5_typed_data ** in)410*159d09a2SMark Phalan init_krb5_typed_data(krb5_typed_data **in)
411*159d09a2SMark Phalan {
412*159d09a2SMark Phalan     (*in) = malloc(sizeof(krb5_typed_data));
413*159d09a2SMark Phalan     if ((*in) == NULL) return;
414*159d09a2SMark Phalan     (*in)->type = 0;
415*159d09a2SMark Phalan     (*in)->length = 0;
416*159d09a2SMark Phalan     (*in)->data = NULL;
417*159d09a2SMark Phalan }
418*159d09a2SMark Phalan 
419*159d09a2SMark Phalan void
init_krb5_subject_pk_info(krb5_subject_pk_info ** in)420*159d09a2SMark Phalan init_krb5_subject_pk_info(krb5_subject_pk_info **in)
421*159d09a2SMark Phalan {
422*159d09a2SMark Phalan     (*in) = malloc(sizeof(krb5_subject_pk_info));
423*159d09a2SMark Phalan     if ((*in) == NULL) return;
424*159d09a2SMark Phalan     (*in)->algorithm.parameters.data = NULL;
425*159d09a2SMark Phalan     (*in)->algorithm.parameters.length = 0;
426*159d09a2SMark Phalan     (*in)->subjectPublicKey.data = NULL;
427*159d09a2SMark Phalan     (*in)->subjectPublicKey.length = 0;
428*159d09a2SMark Phalan }
429*159d09a2SMark Phalan 
430*159d09a2SMark Phalan krb5_error_code
pkinit_copy_krb5_octet_data(krb5_octet_data * dst,const krb5_octet_data * src)431*159d09a2SMark Phalan pkinit_copy_krb5_octet_data(krb5_octet_data *dst, const krb5_octet_data *src)
432*159d09a2SMark Phalan {
433*159d09a2SMark Phalan     if (dst == NULL || src == NULL)
434*159d09a2SMark Phalan 	return EINVAL;
435*159d09a2SMark Phalan     if (src->data == NULL) {
436*159d09a2SMark Phalan 	dst->data = NULL;
437*159d09a2SMark Phalan 	dst->length = 0;
438*159d09a2SMark Phalan 	return 0;
439*159d09a2SMark Phalan     }
440*159d09a2SMark Phalan     dst->data = malloc(src->length);
441*159d09a2SMark Phalan     if (dst->data == NULL)
442*159d09a2SMark Phalan 	return ENOMEM;
443*159d09a2SMark Phalan     (void) memcpy(dst->data, src->data, src->length);
444*159d09a2SMark Phalan     dst->length = src->length;
445*159d09a2SMark Phalan     return 0;
446*159d09a2SMark Phalan }
447*159d09a2SMark Phalan 
448*159d09a2SMark Phalan /* debugging functions */
449*159d09a2SMark Phalan void
print_buffer(unsigned char * buf,unsigned int len)450*159d09a2SMark Phalan print_buffer(unsigned char *buf, unsigned int len)
451*159d09a2SMark Phalan {
452*159d09a2SMark Phalan     int i = 0;
453*159d09a2SMark Phalan     /* Solaris Kerberos: len is unsigned (lint) */
454*159d09a2SMark Phalan     if (len == 0)
455*159d09a2SMark Phalan 	return;
456*159d09a2SMark Phalan 
457*159d09a2SMark Phalan     for (i = 0; i < len; i++)
458*159d09a2SMark Phalan 	pkiDebug("%02x ", buf[i]);
459*159d09a2SMark Phalan     pkiDebug("\n");
460*159d09a2SMark Phalan }
461*159d09a2SMark Phalan 
462*159d09a2SMark Phalan void
print_buffer_bin(unsigned char * buf,unsigned int len,char * filename)463*159d09a2SMark Phalan print_buffer_bin(unsigned char *buf, unsigned int len, char *filename)
464*159d09a2SMark Phalan {
465*159d09a2SMark Phalan     FILE *f = NULL;
466*159d09a2SMark Phalan     int i = 0;
467*159d09a2SMark Phalan 
468*159d09a2SMark Phalan     /* Solaris Kerberos: len is unsigned (lint) */
469*159d09a2SMark Phalan     if (len == 0 || filename == NULL)
470*159d09a2SMark Phalan 	return;
471*159d09a2SMark Phalan 
472*159d09a2SMark Phalan     if ((f = fopen(filename, "w")) == NULL)
473*159d09a2SMark Phalan 	return;
474*159d09a2SMark Phalan 
475*159d09a2SMark Phalan     for (i = 0; i < len; i++)
476*159d09a2SMark Phalan 	(void) fputc(buf[i], f);
477*159d09a2SMark Phalan 
478*159d09a2SMark Phalan     (void) fclose(f);
479*159d09a2SMark Phalan }
480