1 /* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2 /* lib/krb5/krb/kfree.c */
3 /*
4 * Copyright 1990-1998, 2009 by the Massachusetts Institute of Technology.
5 *
6 * Export of this software from the United States of America may
7 * require a specific license from the United States Government.
8 * It is the responsibility of any person or organization contemplating
9 * export to obtain such a license before exporting.
10 *
11 * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
12 * distribute this software and its documentation for any purpose and
13 * without fee is hereby granted, provided that the above copyright
14 * notice appear in all copies and that both that copyright notice and
15 * this permission notice appear in supporting documentation, and that
16 * the name of M.I.T. not be used in advertising or publicity pertaining
17 * to distribution of the software without specific, written prior
18 * permission. Furthermore if you modify this software you must label
19 * your software as modified software and not distribute it in such a
20 * fashion that it might be confused with the original M.I.T. software.
21 * M.I.T. makes no representations about the suitability of
22 * this software for any purpose. It is provided "as is" without express
23 * or implied warranty.
24 */
25 /*
26 * Copyright (c) 2006-2008, Novell, Inc.
27 * All rights reserved.
28 *
29 * Redistribution and use in source and binary forms, with or without
30 * modification, are permitted provided that the following conditions are met:
31 *
32 * * Redistributions of source code must retain the above copyright notice,
33 * this list of conditions and the following disclaimer.
34 * * Redistributions in binary form must reproduce the above copyright
35 * notice, this list of conditions and the following disclaimer in the
36 * documentation and/or other materials provided with the distribution.
37 * * The copyright holder's name is not used to endorse or promote products
38 * derived from this software without specific prior written permission.
39 *
40 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
41 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
44 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
45 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
46 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
47 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
48 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
50 * POSSIBILITY OF SUCH DAMAGE.
51 */
52
53 #include "k5-int.h"
54 #include "k5-spake.h"
55 #include <assert.h>
56
57 void KRB5_CALLCONV
krb5_free_address(krb5_context context,krb5_address * val)58 krb5_free_address(krb5_context context, krb5_address *val)
59 {
60 if (val == NULL)
61 return;
62 free(val->contents);
63 free(val);
64 }
65
66 void KRB5_CALLCONV
krb5_free_addresses(krb5_context context,krb5_address ** val)67 krb5_free_addresses(krb5_context context, krb5_address **val)
68 {
69 krb5_address **temp;
70
71 if (val == NULL)
72 return;
73 for (temp = val; *temp; temp++) {
74 free((*temp)->contents);
75 free(*temp);
76 }
77 free(val);
78 }
79
80 void KRB5_CALLCONV
krb5_free_ap_rep(krb5_context context,krb5_ap_rep * val)81 krb5_free_ap_rep(krb5_context context, krb5_ap_rep *val)
82 {
83 if (val == NULL)
84 return;
85 free(val->enc_part.ciphertext.data);
86 free(val);
87 }
88
89 void KRB5_CALLCONV
krb5_free_ap_req(krb5_context context,krb5_ap_req * val)90 krb5_free_ap_req(krb5_context context, krb5_ap_req *val)
91 {
92 if (val == NULL)
93 return;
94 krb5_free_ticket(context, val->ticket);
95 free(val->authenticator.ciphertext.data);
96 free(val);
97 }
98
99 void KRB5_CALLCONV
krb5_free_ap_rep_enc_part(krb5_context context,krb5_ap_rep_enc_part * val)100 krb5_free_ap_rep_enc_part(krb5_context context, krb5_ap_rep_enc_part *val)
101 {
102 if (val == NULL)
103 return;
104 krb5_free_keyblock(context, val->subkey);
105 free(val);
106 }
107
108 void KRB5_CALLCONV
krb5_free_authenticator_contents(krb5_context context,krb5_authenticator * val)109 krb5_free_authenticator_contents(krb5_context context, krb5_authenticator *val)
110 {
111 if (val == NULL)
112 return;
113 krb5_free_checksum(context, val->checksum);
114 val->checksum = 0;
115 krb5_free_principal(context, val->client);
116 val->client = 0;
117 krb5_free_keyblock(context, val->subkey);
118 val->subkey = 0;
119 krb5_free_authdata(context, val->authorization_data);
120 val->authorization_data = 0;
121 }
122
123 void KRB5_CALLCONV
krb5_free_authenticator(krb5_context context,krb5_authenticator * val)124 krb5_free_authenticator(krb5_context context, krb5_authenticator *val)
125 {
126 if (val == NULL)
127 return;
128 krb5_free_authenticator_contents(context, val);
129 free(val);
130 }
131
132 void KRB5_CALLCONV
krb5_free_checksum(krb5_context context,krb5_checksum * val)133 krb5_free_checksum(krb5_context context, krb5_checksum *val)
134 {
135 if (val == NULL)
136 return;
137 krb5_free_checksum_contents(context, val);
138 free(val);
139 }
140
141 void KRB5_CALLCONV
krb5_free_checksum_contents(krb5_context context,krb5_checksum * val)142 krb5_free_checksum_contents(krb5_context context, krb5_checksum *val)
143 {
144 if (val == NULL)
145 return;
146 free(val->contents);
147 val->contents = NULL;
148 val->length = 0;
149 }
150
151 void KRB5_CALLCONV
krb5_free_cred(krb5_context context,krb5_cred * val)152 krb5_free_cred(krb5_context context, krb5_cred *val)
153 {
154 if (val == NULL)
155 return;
156 krb5_free_tickets(context, val->tickets);
157 free(val->enc_part.ciphertext.data);
158 free(val);
159 }
160
161 /*
162 * krb5_free_cred_contents zeros out the session key, and then frees
163 * the credentials structures
164 */
165
166 void KRB5_CALLCONV
krb5_free_cred_contents(krb5_context context,krb5_creds * val)167 krb5_free_cred_contents(krb5_context context, krb5_creds *val)
168 {
169 if (val == NULL)
170 return;
171 krb5_free_principal(context, val->client);
172 val->client = 0;
173 krb5_free_principal(context, val->server);
174 val->server = 0;
175 krb5_free_keyblock_contents(context, &val->keyblock);
176 free(val->ticket.data);
177 val->ticket.data = 0;
178 free(val->second_ticket.data);
179 val->second_ticket.data = 0;
180 krb5_free_addresses(context, val->addresses);
181 val->addresses = 0;
182 krb5_free_authdata(context, val->authdata);
183 val->authdata = 0;
184 }
185
186 void KRB5_CALLCONV
krb5_free_cred_enc_part(krb5_context context,krb5_cred_enc_part * val)187 krb5_free_cred_enc_part(krb5_context context, krb5_cred_enc_part *val)
188 {
189 krb5_cred_info **temp;
190
191 if (val == NULL)
192 return;
193 krb5_free_address(context, val->r_address);
194 val->r_address = 0;
195 krb5_free_address(context, val->s_address);
196 val->s_address = 0;
197
198 if (val->ticket_info) {
199 for (temp = val->ticket_info; *temp; temp++) {
200 krb5_free_keyblock(context, (*temp)->session);
201 krb5_free_principal(context, (*temp)->client);
202 krb5_free_principal(context, (*temp)->server);
203 krb5_free_addresses(context, (*temp)->caddrs);
204 free(*temp);
205 }
206 free(val->ticket_info);
207 val->ticket_info = 0;
208 }
209 }
210
211
212 void KRB5_CALLCONV
krb5_free_creds(krb5_context context,krb5_creds * val)213 krb5_free_creds(krb5_context context, krb5_creds *val)
214 {
215 if (val == NULL)
216 return;
217 krb5_free_cred_contents(context, val);
218 free(val);
219 }
220
221
222 void KRB5_CALLCONV
krb5_free_data(krb5_context context,krb5_data * val)223 krb5_free_data(krb5_context context, krb5_data *val)
224 {
225 if (val == NULL)
226 return;
227 free(val->data);
228 free(val);
229 }
230
231
232 void KRB5_CALLCONV
krb5_free_octet_data(krb5_context context,krb5_octet_data * val)233 krb5_free_octet_data(krb5_context context, krb5_octet_data *val)
234 {
235 if (val == NULL)
236 return;
237 free(val->data);
238 free(val);
239 }
240
241 void KRB5_CALLCONV
krb5_free_data_contents(krb5_context context,krb5_data * val)242 krb5_free_data_contents(krb5_context context, krb5_data *val)
243 {
244 if (val == NULL)
245 return;
246 free(val->data);
247 val->data = NULL;
248 val->length = 0;
249 }
250
251 void KRB5_CALLCONV
krb5_free_enc_data(krb5_context context,krb5_enc_data * val)252 krb5_free_enc_data(krb5_context context, krb5_enc_data *val)
253 {
254 if (val == NULL)
255 return;
256 krb5_free_data_contents(context, &val->ciphertext);
257 free(val);
258 }
259
krb5_free_etype_info(krb5_context context,krb5_etype_info info)260 void krb5_free_etype_info(krb5_context context, krb5_etype_info info)
261 {
262 int i;
263
264 if (info == NULL)
265 return;
266 for (i=0; info[i] != NULL; i++) {
267 free(info[i]->salt);
268 krb5_free_data_contents(context, &info[i]->s2kparams);
269 free(info[i]);
270 }
271 free(info);
272 }
273
274
275 void KRB5_CALLCONV
krb5_free_enc_kdc_rep_part(krb5_context context,krb5_enc_kdc_rep_part * val)276 krb5_free_enc_kdc_rep_part(krb5_context context, krb5_enc_kdc_rep_part *val)
277 {
278 if (val == NULL)
279 return;
280 krb5_free_keyblock(context, val->session);
281 krb5_free_last_req(context, val->last_req);
282 krb5_free_principal(context, val->server);
283 krb5_free_addresses(context, val->caddrs);
284 krb5_free_pa_data(context, val->enc_padata);
285 free(val);
286 }
287
288 void KRB5_CALLCONV
krb5_free_enc_tkt_part(krb5_context context,krb5_enc_tkt_part * val)289 krb5_free_enc_tkt_part(krb5_context context, krb5_enc_tkt_part *val)
290 {
291 if (val == NULL)
292 return;
293 krb5_free_keyblock(context, val->session);
294 krb5_free_principal(context, val->client);
295 free(val->transited.tr_contents.data);
296 krb5_free_addresses(context, val->caddrs);
297 krb5_free_authdata(context, val->authorization_data);
298 free(val);
299 }
300
301
302 void KRB5_CALLCONV
krb5_free_error(krb5_context context,krb5_error * val)303 krb5_free_error(krb5_context context, krb5_error *val)
304 {
305 if (val == NULL)
306 return;
307 krb5_free_principal(context, val->client);
308 krb5_free_principal(context, val->server);
309 free(val->text.data);
310 free(val->e_data.data);
311 free(val);
312 }
313
314 void KRB5_CALLCONV
krb5_free_kdc_rep(krb5_context context,krb5_kdc_rep * val)315 krb5_free_kdc_rep(krb5_context context, krb5_kdc_rep *val)
316 {
317 if (val == NULL)
318 return;
319 krb5_free_pa_data(context, val->padata);
320 krb5_free_principal(context, val->client);
321 krb5_free_ticket(context, val->ticket);
322 free(val->enc_part.ciphertext.data);
323 krb5_free_enc_kdc_rep_part(context, val->enc_part2);
324 free(val);
325 }
326
327
328 void KRB5_CALLCONV
krb5_free_kdc_req(krb5_context context,krb5_kdc_req * val)329 krb5_free_kdc_req(krb5_context context, krb5_kdc_req *val)
330 {
331 if (val == NULL)
332 return;
333 krb5_free_pa_data(context, val->padata);
334 krb5_free_principal(context, val->client);
335 krb5_free_principal(context, val->server);
336 free(val->ktype);
337 krb5_free_addresses(context, val->addresses);
338 free(val->authorization_data.ciphertext.data);
339 krb5_free_authdata(context, val->unenc_authdata);
340 krb5_free_tickets(context, val->second_ticket);
341 free(val);
342 }
343
344 void KRB5_CALLCONV
krb5_free_keyblock_contents(krb5_context context,krb5_keyblock * key)345 krb5_free_keyblock_contents(krb5_context context, krb5_keyblock *key)
346 {
347 krb5int_c_free_keyblock_contents (context, key);
348 }
349
350 void KRB5_CALLCONV
krb5_free_keyblock(krb5_context context,krb5_keyblock * val)351 krb5_free_keyblock(krb5_context context, krb5_keyblock *val)
352 {
353 krb5int_c_free_keyblock (context, val);
354 }
355
356
357
358 void KRB5_CALLCONV
krb5_free_last_req(krb5_context context,krb5_last_req_entry ** val)359 krb5_free_last_req(krb5_context context, krb5_last_req_entry **val)
360 {
361 krb5_last_req_entry **temp;
362
363 if (val == NULL)
364 return;
365 for (temp = val; *temp; temp++)
366 free(*temp);
367 free(val);
368 }
369
370 void
k5_zapfree_pa_data(krb5_pa_data ** val)371 k5_zapfree_pa_data(krb5_pa_data **val)
372 {
373 krb5_pa_data **pa;
374
375 if (val == NULL)
376 return;
377 for (pa = val; *pa != NULL; pa++) {
378 zapfree((*pa)->contents, (*pa)->length);
379 zapfree(*pa, sizeof(**pa));
380 }
381 free(val);
382 }
383
384 void KRB5_CALLCONV
krb5_free_pa_data(krb5_context context,krb5_pa_data ** val)385 krb5_free_pa_data(krb5_context context, krb5_pa_data **val)
386 {
387 krb5_pa_data **temp;
388
389 if (val == NULL)
390 return;
391 for (temp = val; *temp; temp++) {
392 free((*temp)->contents);
393 free(*temp);
394 }
395 free(val);
396 }
397
398 void KRB5_CALLCONV
krb5_free_principal(krb5_context context,krb5_principal val)399 krb5_free_principal(krb5_context context, krb5_principal val)
400 {
401 krb5_int32 i;
402
403 if (!val)
404 return;
405
406 if (val->data) {
407 i = val->length;
408 while(--i >= 0)
409 free(val->data[i].data);
410 free(val->data);
411 }
412 free(val->realm.data);
413 free(val);
414 }
415
416 void KRB5_CALLCONV
krb5_free_priv(krb5_context context,krb5_priv * val)417 krb5_free_priv(krb5_context context, krb5_priv *val)
418 {
419 if (val == NULL)
420 return;
421 free(val->enc_part.ciphertext.data);
422 free(val);
423 }
424
425 void KRB5_CALLCONV
krb5_free_priv_enc_part(krb5_context context,krb5_priv_enc_part * val)426 krb5_free_priv_enc_part(krb5_context context, krb5_priv_enc_part *val)
427 {
428 if (val == NULL)
429 return;
430 free(val->user_data.data);
431 krb5_free_address(context, val->r_address);
432 krb5_free_address(context, val->s_address);
433 free(val);
434 }
435
436 void KRB5_CALLCONV
krb5_free_safe(krb5_context context,krb5_safe * val)437 krb5_free_safe(krb5_context context, krb5_safe *val)
438 {
439 if (val == NULL)
440 return;
441 free(val->user_data.data);
442 krb5_free_address(context, val->r_address);
443 krb5_free_address(context, val->s_address);
444 krb5_free_checksum(context, val->checksum);
445 free(val);
446 }
447
448
449 void KRB5_CALLCONV
krb5_free_ticket(krb5_context context,krb5_ticket * val)450 krb5_free_ticket(krb5_context context, krb5_ticket *val)
451 {
452 if (val == NULL)
453 return;
454 krb5_free_principal(context, val->server);
455 free(val->enc_part.ciphertext.data);
456 krb5_free_enc_tkt_part(context, val->enc_part2);
457 free(val);
458 }
459
460 void KRB5_CALLCONV
krb5_free_tickets(krb5_context context,krb5_ticket ** val)461 krb5_free_tickets(krb5_context context, krb5_ticket **val)
462 {
463 krb5_ticket **temp;
464
465 if (val == NULL)
466 return;
467 for (temp = val; *temp; temp++)
468 krb5_free_ticket(context, *temp);
469 free(val);
470 }
471
472
473 void KRB5_CALLCONV
krb5_free_tgt_creds(krb5_context context,krb5_creds ** tgts)474 krb5_free_tgt_creds(krb5_context context, krb5_creds **tgts)
475 {
476 krb5_creds **tgtpp;
477 if (tgts == NULL)
478 return;
479 for (tgtpp = tgts; *tgtpp; tgtpp++)
480 krb5_free_creds(context, *tgtpp);
481 free(tgts);
482 }
483
484 void KRB5_CALLCONV
krb5_free_tkt_authent(krb5_context context,krb5_tkt_authent * val)485 krb5_free_tkt_authent(krb5_context context, krb5_tkt_authent *val)
486 {
487 if (val == NULL)
488 return;
489 krb5_free_ticket(context, val->ticket);
490 krb5_free_authenticator(context, val->authenticator);
491 free(val);
492 }
493
494 void KRB5_CALLCONV
krb5_free_unparsed_name(krb5_context context,char * val)495 krb5_free_unparsed_name(krb5_context context, char *val)
496 {
497 if (val != NULL)
498 free(val);
499 }
500
501 void KRB5_CALLCONV
krb5_free_string(krb5_context context,char * val)502 krb5_free_string(krb5_context context, char *val)
503 {
504 free(val);
505 }
506
507 void KRB5_CALLCONV
krb5_free_sam_challenge_2(krb5_context ctx,krb5_sam_challenge_2 * sc2)508 krb5_free_sam_challenge_2(krb5_context ctx, krb5_sam_challenge_2 *sc2)
509 {
510 if (!sc2)
511 return;
512 krb5_free_sam_challenge_2_contents(ctx, sc2);
513 free(sc2);
514 }
515
516 void KRB5_CALLCONV
krb5_free_sam_challenge_2_contents(krb5_context ctx,krb5_sam_challenge_2 * sc2)517 krb5_free_sam_challenge_2_contents(krb5_context ctx,
518 krb5_sam_challenge_2 *sc2)
519 {
520 krb5_checksum **cksump;
521
522 if (!sc2)
523 return;
524 if (sc2->sam_challenge_2_body.data)
525 krb5_free_data_contents(ctx, &sc2->sam_challenge_2_body);
526 if (sc2->sam_cksum) {
527 cksump = sc2->sam_cksum;
528 while (*cksump) {
529 krb5_free_checksum(ctx, *cksump);
530 cksump++;
531 }
532 free(sc2->sam_cksum);
533 sc2->sam_cksum = 0;
534 }
535 }
536
537 void KRB5_CALLCONV
krb5_free_sam_challenge_2_body(krb5_context ctx,krb5_sam_challenge_2_body * sc2)538 krb5_free_sam_challenge_2_body(krb5_context ctx,
539 krb5_sam_challenge_2_body *sc2)
540 {
541 if (!sc2)
542 return;
543 krb5_free_sam_challenge_2_body_contents(ctx, sc2);
544 free(sc2);
545 }
546
547 void KRB5_CALLCONV
krb5_free_sam_challenge_2_body_contents(krb5_context ctx,krb5_sam_challenge_2_body * sc2)548 krb5_free_sam_challenge_2_body_contents(krb5_context ctx,
549 krb5_sam_challenge_2_body *sc2)
550 {
551 if (!sc2)
552 return;
553 if (sc2->sam_type_name.data)
554 krb5_free_data_contents(ctx, &sc2->sam_type_name);
555 if (sc2->sam_track_id.data)
556 krb5_free_data_contents(ctx, &sc2->sam_track_id);
557 if (sc2->sam_challenge_label.data)
558 krb5_free_data_contents(ctx, &sc2->sam_challenge_label);
559 if (sc2->sam_challenge.data)
560 krb5_free_data_contents(ctx, &sc2->sam_challenge);
561 if (sc2->sam_response_prompt.data)
562 krb5_free_data_contents(ctx, &sc2->sam_response_prompt);
563 if (sc2->sam_pk_for_sad.data)
564 krb5_free_data_contents(ctx, &sc2->sam_pk_for_sad);
565 }
566
567 void KRB5_CALLCONV
krb5_free_sam_response_2(krb5_context ctx,krb5_sam_response_2 * sr2)568 krb5_free_sam_response_2(krb5_context ctx, krb5_sam_response_2 *sr2)
569 {
570 if (!sr2)
571 return;
572 krb5_free_sam_response_2_contents(ctx, sr2);
573 free(sr2);
574 }
575
576 void KRB5_CALLCONV
krb5_free_sam_response_2_contents(krb5_context ctx,krb5_sam_response_2 * sr2)577 krb5_free_sam_response_2_contents(krb5_context ctx, krb5_sam_response_2 *sr2)
578 {
579 if (!sr2)
580 return;
581 if (sr2->sam_track_id.data)
582 krb5_free_data_contents(ctx, &sr2->sam_track_id);
583 if (sr2->sam_enc_nonce_or_sad.ciphertext.data)
584 krb5_free_data_contents(ctx, &sr2->sam_enc_nonce_or_sad.ciphertext);
585 }
586
587 void KRB5_CALLCONV
krb5_free_enc_sam_response_enc_2(krb5_context ctx,krb5_enc_sam_response_enc_2 * esre2)588 krb5_free_enc_sam_response_enc_2(krb5_context ctx,
589 krb5_enc_sam_response_enc_2 *esre2)
590 {
591 if (!esre2)
592 return;
593 krb5_free_enc_sam_response_enc_2_contents(ctx, esre2);
594 free(esre2);
595 }
596
597 void KRB5_CALLCONV
krb5_free_enc_sam_response_enc_2_contents(krb5_context ctx,krb5_enc_sam_response_enc_2 * esre2)598 krb5_free_enc_sam_response_enc_2_contents(krb5_context ctx,
599 krb5_enc_sam_response_enc_2 *esre2)
600 {
601 if (!esre2)
602 return;
603 if (esre2->sam_sad.data)
604 krb5_free_data_contents(ctx, &esre2->sam_sad);
605 }
606
607 void KRB5_CALLCONV
krb5_free_pa_enc_ts(krb5_context ctx,krb5_pa_enc_ts * pa_enc_ts)608 krb5_free_pa_enc_ts(krb5_context ctx, krb5_pa_enc_ts *pa_enc_ts)
609 {
610 if (!pa_enc_ts)
611 return;
612 free(pa_enc_ts);
613 }
614
615 void KRB5_CALLCONV
krb5_free_pa_for_user(krb5_context context,krb5_pa_for_user * req)616 krb5_free_pa_for_user(krb5_context context, krb5_pa_for_user *req)
617 {
618 if (req == NULL)
619 return;
620 krb5_free_principal(context, req->user);
621 req->user = NULL;
622 krb5_free_checksum_contents(context, &req->cksum);
623 krb5_free_data_contents(context, &req->auth_package);
624 free(req);
625 }
626
627 void KRB5_CALLCONV
krb5_free_s4u_userid_contents(krb5_context context,krb5_s4u_userid * user_id)628 krb5_free_s4u_userid_contents(krb5_context context, krb5_s4u_userid *user_id)
629 {
630 if (user_id == NULL)
631 return;
632 user_id->nonce = 0;
633 krb5_free_principal(context, user_id->user);
634 user_id->user = NULL;
635 krb5_free_data_contents(context, &user_id->subject_cert);
636 user_id->subject_cert.length = 0;
637 user_id->subject_cert.data = NULL;
638 user_id->options = 0;
639 }
640
641 void KRB5_CALLCONV
krb5_free_pa_s4u_x509_user(krb5_context context,krb5_pa_s4u_x509_user * req)642 krb5_free_pa_s4u_x509_user(krb5_context context, krb5_pa_s4u_x509_user *req)
643 {
644 if (req == NULL)
645 return;
646 krb5_free_s4u_userid_contents(context, &req->user_id);
647 krb5_free_checksum_contents(context, &req->cksum);
648 free(req);
649 }
650
651 void KRB5_CALLCONV
krb5_free_pa_pac_req(krb5_context context,krb5_pa_pac_req * req)652 krb5_free_pa_pac_req(krb5_context context,
653 krb5_pa_pac_req *req)
654 {
655 free(req);
656 }
657
658 void KRB5_CALLCONV
krb5_free_fast_req(krb5_context context,krb5_fast_req * val)659 krb5_free_fast_req(krb5_context context, krb5_fast_req *val)
660 {
661 if (val == NULL)
662 return;
663 krb5_free_kdc_req(context, val->req_body);
664 free(val);
665 }
666
667 void KRB5_CALLCONV
krb5_free_fast_armor(krb5_context context,krb5_fast_armor * val)668 krb5_free_fast_armor(krb5_context context, krb5_fast_armor *val)
669 {
670 if (val == NULL)
671 return;
672 krb5_free_data_contents(context, &val->armor_value);
673 free(val);
674 }
675
676 void KRB5_CALLCONV
krb5_free_fast_response(krb5_context context,krb5_fast_response * val)677 krb5_free_fast_response(krb5_context context, krb5_fast_response *val)
678 {
679 if (!val)
680 return;
681 krb5_free_pa_data(context, val->padata);
682 krb5_free_fast_finished(context, val->finished);
683 krb5_free_keyblock(context, val->strengthen_key);
684 free(val);
685 }
686
687 void KRB5_CALLCONV
krb5_free_fast_finished(krb5_context context,krb5_fast_finished * val)688 krb5_free_fast_finished(krb5_context context, krb5_fast_finished *val)
689 {
690 if (!val)
691 return;
692 krb5_free_principal(context, val->client);
693 krb5_free_checksum_contents(context, &val->ticket_checksum);
694 free(val);
695 }
696
697 void KRB5_CALLCONV
krb5_free_fast_armored_req(krb5_context context,krb5_fast_armored_req * val)698 krb5_free_fast_armored_req(krb5_context context, krb5_fast_armored_req *val)
699 {
700 if (val == NULL)
701 return;
702 if (val->armor)
703 krb5_free_fast_armor(context, val->armor);
704 krb5_free_data_contents(context, &val->enc_part.ciphertext);
705 if (val->req_checksum.contents)
706 krb5_free_checksum_contents(context, &val->req_checksum);
707 free(val);
708 }
709
710 void
k5_free_data_ptr_list(krb5_data ** list)711 k5_free_data_ptr_list(krb5_data **list)
712 {
713 int i;
714
715 for (i = 0; list != NULL && list[i] != NULL; i++)
716 krb5_free_data(NULL, list[i]);
717 free(list);
718 }
719
720 void KRB5_CALLCONV
krb5int_free_data_list(krb5_context context,krb5_data * data)721 krb5int_free_data_list(krb5_context context, krb5_data *data)
722 {
723 int i;
724
725 if (data == NULL)
726 return;
727
728 for (i = 0; data[i].data != NULL; i++)
729 free(data[i].data);
730
731 free(data);
732 }
733
734 void KRB5_CALLCONV
krb5_free_ad_kdcissued(krb5_context context,krb5_ad_kdcissued * val)735 krb5_free_ad_kdcissued(krb5_context context, krb5_ad_kdcissued *val)
736 {
737 if (val == NULL)
738 return;
739
740 krb5_free_checksum_contents(context, &val->ad_checksum);
741 krb5_free_principal(context, val->i_principal);
742 krb5_free_authdata(context, val->elements);
743 free(val);
744 }
745
746 void KRB5_CALLCONV
krb5_free_iakerb_header(krb5_context context,krb5_iakerb_header * val)747 krb5_free_iakerb_header(krb5_context context, krb5_iakerb_header *val)
748 {
749 if (val == NULL)
750 return ;
751
752 krb5_free_data_contents(context, &val->target_realm);
753 krb5_free_data(context, val->cookie);
754 free(val);
755 }
756
757 void KRB5_CALLCONV
krb5_free_iakerb_finished(krb5_context context,krb5_iakerb_finished * val)758 krb5_free_iakerb_finished(krb5_context context, krb5_iakerb_finished *val)
759 {
760 if (val == NULL)
761 return ;
762
763 krb5_free_checksum_contents(context, &val->checksum);
764 free(val);
765 }
766
767 void
k5_free_algorithm_identifier(krb5_context context,krb5_algorithm_identifier * val)768 k5_free_algorithm_identifier(krb5_context context,
769 krb5_algorithm_identifier *val)
770 {
771 if (val == NULL)
772 return;
773 free(val->algorithm.data);
774 free(val->parameters.data);
775 free(val);
776 }
777
778 void
k5_free_otp_tokeninfo(krb5_context context,krb5_otp_tokeninfo * val)779 k5_free_otp_tokeninfo(krb5_context context, krb5_otp_tokeninfo *val)
780 {
781 krb5_algorithm_identifier **alg;
782
783 if (val == NULL)
784 return;
785 free(val->vendor.data);
786 free(val->challenge.data);
787 free(val->token_id.data);
788 free(val->alg_id.data);
789 for (alg = val->supported_hash_alg; alg != NULL && *alg != NULL; alg++)
790 k5_free_algorithm_identifier(context, *alg);
791 free(val->supported_hash_alg);
792 free(val);
793 }
794
795 void
k5_free_pa_otp_challenge(krb5_context context,krb5_pa_otp_challenge * val)796 k5_free_pa_otp_challenge(krb5_context context, krb5_pa_otp_challenge *val)
797 {
798 krb5_otp_tokeninfo **ti;
799
800 if (val == NULL)
801 return;
802 free(val->nonce.data);
803 free(val->service.data);
804 for (ti = val->tokeninfo; *ti != NULL; ti++)
805 k5_free_otp_tokeninfo(context, *ti);
806 free(val->tokeninfo);
807 free(val->salt.data);
808 free(val->s2kparams.data);
809 free(val);
810 }
811
812 void
k5_free_pa_otp_req(krb5_context context,krb5_pa_otp_req * val)813 k5_free_pa_otp_req(krb5_context context, krb5_pa_otp_req *val)
814 {
815 if (val == NULL)
816 return;
817 val->flags = 0;
818 free(val->nonce.data);
819 free(val->enc_data.ciphertext.data);
820 if (val->hash_alg != NULL)
821 k5_free_algorithm_identifier(context, val->hash_alg);
822 free(val->otp_value.data);
823 free(val->pin.data);
824 free(val->challenge.data);
825 free(val->counter.data);
826 free(val->token_id.data);
827 free(val->alg_id.data);
828 free(val->vendor.data);
829 free(val);
830 }
831
832 void
k5_free_kkdcp_message(krb5_context context,krb5_kkdcp_message * val)833 k5_free_kkdcp_message(krb5_context context, krb5_kkdcp_message *val)
834 {
835 if (val == NULL)
836 return;
837 free(val->target_domain.data);
838 free(val->kerb_message.data);
839 free(val);
840 }
841
842 static void
free_vmac(krb5_context context,krb5_verifier_mac * val)843 free_vmac(krb5_context context, krb5_verifier_mac *val)
844 {
845 if (val == NULL)
846 return;
847 krb5_free_principal(context, val->princ);
848 krb5_free_checksum_contents(context, &val->checksum);
849 free(val);
850 }
851
852 void
k5_free_cammac(krb5_context context,krb5_cammac * val)853 k5_free_cammac(krb5_context context, krb5_cammac *val)
854 {
855 krb5_verifier_mac **vp;
856
857 if (val == NULL)
858 return;
859 krb5_free_authdata(context, val->elements);
860 free_vmac(context, val->kdc_verifier);
861 free_vmac(context, val->svc_verifier);
862 for (vp = val->other_verifiers; vp != NULL && *vp != NULL; vp++)
863 free_vmac(context, *vp);
864 free(val->other_verifiers);
865 free(val);
866 }
867
868 void
k5_free_secure_cookie(krb5_context context,krb5_secure_cookie * val)869 k5_free_secure_cookie(krb5_context context, krb5_secure_cookie *val)
870 {
871 if (val == NULL)
872 return;
873 k5_zapfree_pa_data(val->data);
874 free(val);
875 }
876
877 void
k5_free_spake_factor(krb5_context context,krb5_spake_factor * val)878 k5_free_spake_factor(krb5_context context, krb5_spake_factor *val)
879 {
880 if (val == NULL)
881 return;
882 if (val->data != NULL)
883 zapfree(val->data->data, val->data->length);
884 free(val->data);
885 free(val);
886 }
887
888 void
k5_free_pa_spake(krb5_context context,krb5_pa_spake * val)889 k5_free_pa_spake(krb5_context context, krb5_pa_spake *val)
890 {
891 krb5_spake_factor **f;
892
893 if (val == NULL)
894 return;
895 switch (val->choice) {
896 case SPAKE_MSGTYPE_SUPPORT:
897 free(val->u.support.groups);
898 break;
899 case SPAKE_MSGTYPE_CHALLENGE:
900 krb5_free_data_contents(context, &val->u.challenge.pubkey);
901 for (f = val->u.challenge.factors; f != NULL && *f != NULL; f++)
902 k5_free_spake_factor(context, *f);
903 free(val->u.challenge.factors);
904 break;
905 case SPAKE_MSGTYPE_RESPONSE:
906 krb5_free_data_contents(context, &val->u.response.pubkey);
907 krb5_free_data_contents(context, &val->u.response.factor.ciphertext);
908 break;
909 case SPAKE_MSGTYPE_ENCDATA:
910 krb5_free_data_contents(context, &val->u.encdata.ciphertext);
911 break;
912 default:
913 break;
914 }
915 free(val);
916 }
917