1 /* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2 /* lib/krb5/krb/kfree.c */
4 * Copyright 1990-1998, 2009 by the Massachusetts Institute of Technology.
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.
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.
26 * Copyright (c) 2006-2008, Novell, Inc.
27 * All rights reserved.
29 * Redistribution and use in source and binary forms, with or without
30 * modification, are permitted provided that the following conditions are met:
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.
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.
57 krb5_free_address(krb5_context context, krb5_address *val)
66 krb5_free_addresses(krb5_context context, krb5_address **val)
68 register krb5_address **temp;
72 for (temp = val; *temp; temp++) {
73 free((*temp)->contents);
80 krb5_free_ap_rep(krb5_context context, register krb5_ap_rep *val)
84 free(val->enc_part.ciphertext.data);
89 krb5_free_ap_req(krb5_context context, register krb5_ap_req *val)
93 krb5_free_ticket(context, val->ticket);
94 free(val->authenticator.ciphertext.data);
99 krb5_free_ap_rep_enc_part(krb5_context context, krb5_ap_rep_enc_part *val)
103 krb5_free_keyblock(context, val->subkey);
108 krb5_free_authenticator_contents(krb5_context context, krb5_authenticator *val)
112 krb5_free_checksum(context, val->checksum);
114 krb5_free_principal(context, val->client);
116 krb5_free_keyblock(context, val->subkey);
118 krb5_free_authdata(context, val->authorization_data);
119 val->authorization_data = 0;
123 krb5_free_authenticator(krb5_context context, krb5_authenticator *val)
127 krb5_free_authenticator_contents(context, val);
132 krb5_free_checksum(krb5_context context, register krb5_checksum *val)
136 krb5_free_checksum_contents(context, val);
141 krb5_free_checksum_contents(krb5_context context, register krb5_checksum *val)
146 val->contents = NULL;
150 krb5_free_cred(krb5_context context, register krb5_cred *val)
154 krb5_free_tickets(context, val->tickets);
155 free(val->enc_part.ciphertext.data);
160 * krb5_free_cred_contents zeros out the session key, and then frees
161 * the credentials structures
165 krb5_free_cred_contents(krb5_context context, krb5_creds *val)
169 krb5_free_principal(context, val->client);
171 krb5_free_principal(context, val->server);
173 krb5_free_keyblock_contents(context, &val->keyblock);
174 free(val->ticket.data);
175 val->ticket.data = 0;
176 free(val->second_ticket.data);
177 val->second_ticket.data = 0;
178 krb5_free_addresses(context, val->addresses);
180 krb5_free_authdata(context, val->authdata);
185 krb5_free_cred_enc_part(krb5_context context, register krb5_cred_enc_part *val)
187 register krb5_cred_info **temp;
191 krb5_free_address(context, val->r_address);
193 krb5_free_address(context, val->s_address);
196 if (val->ticket_info) {
197 for (temp = val->ticket_info; *temp; temp++) {
198 krb5_free_keyblock(context, (*temp)->session);
199 krb5_free_principal(context, (*temp)->client);
200 krb5_free_principal(context, (*temp)->server);
201 krb5_free_addresses(context, (*temp)->caddrs);
204 free(val->ticket_info);
205 val->ticket_info = 0;
211 krb5_free_creds(krb5_context context, krb5_creds *val)
215 krb5_free_cred_contents(context, val);
221 krb5_free_data(krb5_context context, krb5_data *val)
231 krb5_free_octet_data(krb5_context context, krb5_octet_data *val)
240 krb5_free_data_contents(krb5_context context, krb5_data *val)
251 krb5_free_enc_data(krb5_context context, krb5_enc_data *val)
255 krb5_free_data_contents(context, &val->ciphertext);
259 void krb5_free_etype_info(krb5_context context, krb5_etype_info info)
265 for (i=0; info[i] != NULL; i++) {
267 krb5_free_data_contents(context, &info[i]->s2kparams);
275 krb5_free_enc_kdc_rep_part(krb5_context context, register krb5_enc_kdc_rep_part *val)
279 krb5_free_keyblock(context, val->session);
280 krb5_free_last_req(context, val->last_req);
281 krb5_free_principal(context, val->server);
282 krb5_free_addresses(context, val->caddrs);
283 krb5_free_pa_data(context, val->enc_padata);
288 krb5_free_enc_tkt_part(krb5_context context, krb5_enc_tkt_part *val)
292 krb5_free_keyblock(context, val->session);
293 krb5_free_principal(context, val->client);
294 free(val->transited.tr_contents.data);
295 krb5_free_addresses(context, val->caddrs);
296 krb5_free_authdata(context, val->authorization_data);
302 krb5_free_error(krb5_context context, register krb5_error *val)
306 krb5_free_principal(context, val->client);
307 krb5_free_principal(context, val->server);
308 free(val->text.data);
309 free(val->e_data.data);
314 krb5_free_kdc_rep(krb5_context context, krb5_kdc_rep *val)
318 krb5_free_pa_data(context, val->padata);
319 krb5_free_principal(context, val->client);
320 krb5_free_ticket(context, val->ticket);
321 free(val->enc_part.ciphertext.data);
322 krb5_free_enc_kdc_rep_part(context, val->enc_part2);
328 krb5_free_kdc_req(krb5_context context, krb5_kdc_req *val)
332 krb5_free_pa_data(context, val->padata);
333 krb5_free_principal(context, val->client);
334 krb5_free_principal(context, val->server);
336 krb5_free_addresses(context, val->addresses);
337 free(val->authorization_data.ciphertext.data);
338 krb5_free_authdata(context, val->unenc_authdata);
339 krb5_free_tickets(context, val->second_ticket);
344 krb5_free_keyblock_contents(krb5_context context, register krb5_keyblock *key)
346 krb5int_c_free_keyblock_contents (context, key);
350 krb5_free_keyblock(krb5_context context, register krb5_keyblock *val)
352 krb5int_c_free_keyblock (context, val);
358 krb5_free_last_req(krb5_context context, krb5_last_req_entry **val)
360 register krb5_last_req_entry **temp;
364 for (temp = val; *temp; temp++)
370 k5_zapfree_pa_data(krb5_pa_data **val)
376 for (pa = val; *pa != NULL; pa++) {
377 zapfree((*pa)->contents, (*pa)->length);
378 zapfree(*pa, sizeof(**pa));
384 krb5_free_pa_data(krb5_context context, krb5_pa_data **val)
386 register krb5_pa_data **temp;
390 for (temp = val; *temp; temp++) {
391 free((*temp)->contents);
398 krb5_free_principal(krb5_context context, krb5_principal val)
400 register krb5_int32 i;
408 free(val->data[i].data);
411 free(val->realm.data);
416 krb5_free_priv(krb5_context context, register krb5_priv *val)
420 free(val->enc_part.ciphertext.data);
425 krb5_free_priv_enc_part(krb5_context context, register krb5_priv_enc_part *val)
429 free(val->user_data.data);
430 krb5_free_address(context, val->r_address);
431 krb5_free_address(context, val->s_address);
436 krb5_free_safe(krb5_context context, register krb5_safe *val)
440 free(val->user_data.data);
441 krb5_free_address(context, val->r_address);
442 krb5_free_address(context, val->s_address);
443 krb5_free_checksum(context, val->checksum);
449 krb5_free_ticket(krb5_context context, krb5_ticket *val)
453 krb5_free_principal(context, val->server);
454 free(val->enc_part.ciphertext.data);
455 krb5_free_enc_tkt_part(context, val->enc_part2);
460 krb5_free_tickets(krb5_context context, krb5_ticket **val)
462 register krb5_ticket **temp;
466 for (temp = val; *temp; temp++)
467 krb5_free_ticket(context, *temp);
473 krb5_free_tgt_creds(krb5_context context, krb5_creds **tgts)
475 register krb5_creds **tgtpp;
478 for (tgtpp = tgts; *tgtpp; tgtpp++)
479 krb5_free_creds(context, *tgtpp);
484 krb5_free_tkt_authent(krb5_context context, krb5_tkt_authent *val)
488 krb5_free_ticket(context, val->ticket);
489 krb5_free_authenticator(context, val->authenticator);
494 krb5_free_unparsed_name(krb5_context context, char *val)
501 krb5_free_string(krb5_context context, char *val)
507 krb5_free_sam_challenge_2(krb5_context ctx, krb5_sam_challenge_2 *sc2)
511 krb5_free_sam_challenge_2_contents(ctx, sc2);
516 krb5_free_sam_challenge_2_contents(krb5_context ctx,
517 krb5_sam_challenge_2 *sc2)
519 krb5_checksum **cksump;
523 if (sc2->sam_challenge_2_body.data)
524 krb5_free_data_contents(ctx, &sc2->sam_challenge_2_body);
525 if (sc2->sam_cksum) {
526 cksump = sc2->sam_cksum;
528 krb5_free_checksum(ctx, *cksump);
531 free(sc2->sam_cksum);
537 krb5_free_sam_challenge_2_body(krb5_context ctx,
538 krb5_sam_challenge_2_body *sc2)
542 krb5_free_sam_challenge_2_body_contents(ctx, sc2);
547 krb5_free_sam_challenge_2_body_contents(krb5_context ctx,
548 krb5_sam_challenge_2_body *sc2)
552 if (sc2->sam_type_name.data)
553 krb5_free_data_contents(ctx, &sc2->sam_type_name);
554 if (sc2->sam_track_id.data)
555 krb5_free_data_contents(ctx, &sc2->sam_track_id);
556 if (sc2->sam_challenge_label.data)
557 krb5_free_data_contents(ctx, &sc2->sam_challenge_label);
558 if (sc2->sam_challenge.data)
559 krb5_free_data_contents(ctx, &sc2->sam_challenge);
560 if (sc2->sam_response_prompt.data)
561 krb5_free_data_contents(ctx, &sc2->sam_response_prompt);
562 if (sc2->sam_pk_for_sad.data)
563 krb5_free_data_contents(ctx, &sc2->sam_pk_for_sad);
567 krb5_free_sam_response_2(krb5_context ctx, krb5_sam_response_2 *sr2)
571 krb5_free_sam_response_2_contents(ctx, sr2);
576 krb5_free_sam_response_2_contents(krb5_context ctx, krb5_sam_response_2 *sr2)
580 if (sr2->sam_track_id.data)
581 krb5_free_data_contents(ctx, &sr2->sam_track_id);
582 if (sr2->sam_enc_nonce_or_sad.ciphertext.data)
583 krb5_free_data_contents(ctx, &sr2->sam_enc_nonce_or_sad.ciphertext);
587 krb5_free_enc_sam_response_enc_2(krb5_context ctx,
588 krb5_enc_sam_response_enc_2 *esre2)
592 krb5_free_enc_sam_response_enc_2_contents(ctx, esre2);
597 krb5_free_enc_sam_response_enc_2_contents(krb5_context ctx,
598 krb5_enc_sam_response_enc_2 *esre2)
602 if (esre2->sam_sad.data)
603 krb5_free_data_contents(ctx, &esre2->sam_sad);
607 krb5_free_pa_enc_ts(krb5_context ctx, krb5_pa_enc_ts *pa_enc_ts)
615 krb5_free_pa_for_user(krb5_context context, krb5_pa_for_user *req)
619 krb5_free_principal(context, req->user);
621 krb5_free_checksum_contents(context, &req->cksum);
622 krb5_free_data_contents(context, &req->auth_package);
627 krb5_free_s4u_userid_contents(krb5_context context, krb5_s4u_userid *user_id)
632 krb5_free_principal(context, user_id->user);
633 user_id->user = NULL;
634 krb5_free_data_contents(context, &user_id->subject_cert);
635 user_id->subject_cert.length = 0;
636 user_id->subject_cert.data = NULL;
637 user_id->options = 0;
641 krb5_free_pa_s4u_x509_user(krb5_context context, krb5_pa_s4u_x509_user *req)
645 krb5_free_s4u_userid_contents(context, &req->user_id);
646 krb5_free_checksum_contents(context, &req->cksum);
651 krb5_free_pa_pac_req(krb5_context context,
652 krb5_pa_pac_req *req)
658 krb5_free_fast_req(krb5_context context, krb5_fast_req *val)
662 krb5_free_kdc_req(context, val->req_body);
667 krb5_free_fast_armor(krb5_context context, krb5_fast_armor *val)
671 krb5_free_data_contents(context, &val->armor_value);
676 krb5_free_fast_response(krb5_context context, krb5_fast_response *val)
680 krb5_free_pa_data(context, val->padata);
681 krb5_free_fast_finished(context, val->finished);
682 krb5_free_keyblock(context, val->strengthen_key);
687 krb5_free_fast_finished(krb5_context context, krb5_fast_finished *val)
691 krb5_free_principal(context, val->client);
692 krb5_free_checksum_contents(context, &val->ticket_checksum);
697 krb5_free_fast_armored_req(krb5_context context, krb5_fast_armored_req *val)
702 krb5_free_fast_armor(context, val->armor);
703 krb5_free_data_contents(context, &val->enc_part.ciphertext);
704 if (val->req_checksum.contents)
705 krb5_free_checksum_contents(context, &val->req_checksum);
710 k5_free_data_ptr_list(krb5_data **list)
714 for (i = 0; list != NULL && list[i] != NULL; i++)
715 krb5_free_data(NULL, list[i]);
720 krb5int_free_data_list(krb5_context context, krb5_data *data)
727 for (i = 0; data[i].data != NULL; i++)
734 krb5_free_ad_kdcissued(krb5_context context, krb5_ad_kdcissued *val)
739 krb5_free_checksum_contents(context, &val->ad_checksum);
740 krb5_free_principal(context, val->i_principal);
741 krb5_free_authdata(context, val->elements);
746 krb5_free_ad_signedpath(krb5_context context, krb5_ad_signedpath *val)
753 krb5_free_checksum_contents(context, &val->checksum);
754 if (val->delegated != NULL) {
755 for (i = 0; val->delegated[i] != NULL; i++)
756 krb5_free_principal(context, val->delegated[i]);
757 free(val->delegated);
759 krb5_free_pa_data(context, val->method_data);
764 krb5_free_iakerb_header(krb5_context context, krb5_iakerb_header *val)
769 krb5_free_data_contents(context, &val->target_realm);
770 krb5_free_data(context, val->cookie);
775 krb5_free_iakerb_finished(krb5_context context, krb5_iakerb_finished *val)
780 krb5_free_checksum_contents(context, &val->checksum);
785 k5_free_algorithm_identifier(krb5_context context,
786 krb5_algorithm_identifier *val)
790 free(val->algorithm.data);
791 free(val->parameters.data);
796 k5_free_otp_tokeninfo(krb5_context context, krb5_otp_tokeninfo *val)
798 krb5_algorithm_identifier **alg;
802 free(val->vendor.data);
803 free(val->challenge.data);
804 free(val->token_id.data);
805 free(val->alg_id.data);
806 for (alg = val->supported_hash_alg; alg != NULL && *alg != NULL; alg++)
807 k5_free_algorithm_identifier(context, *alg);
808 free(val->supported_hash_alg);
813 k5_free_pa_otp_challenge(krb5_context context, krb5_pa_otp_challenge *val)
815 krb5_otp_tokeninfo **ti;
819 free(val->nonce.data);
820 free(val->service.data);
821 for (ti = val->tokeninfo; *ti != NULL; ti++)
822 k5_free_otp_tokeninfo(context, *ti);
823 free(val->tokeninfo);
824 free(val->salt.data);
825 free(val->s2kparams.data);
830 k5_free_pa_otp_req(krb5_context context, krb5_pa_otp_req *val)
835 free(val->nonce.data);
836 free(val->enc_data.ciphertext.data);
837 if (val->hash_alg != NULL)
838 k5_free_algorithm_identifier(context, val->hash_alg);
839 free(val->otp_value.data);
841 free(val->challenge.data);
842 free(val->counter.data);
843 free(val->token_id.data);
844 free(val->alg_id.data);
845 free(val->vendor.data);
850 k5_free_kkdcp_message(krb5_context context, krb5_kkdcp_message *val)
854 free(val->target_domain.data);
855 free(val->kerb_message.data);
860 free_vmac(krb5_context context, krb5_verifier_mac *val)
864 krb5_free_principal(context, val->princ);
865 krb5_free_checksum_contents(context, &val->checksum);
870 k5_free_cammac(krb5_context context, krb5_cammac *val)
872 krb5_verifier_mac **vp;
876 krb5_free_authdata(context, val->elements);
877 free_vmac(context, val->kdc_verifier);
878 free_vmac(context, val->svc_verifier);
879 for (vp = val->other_verifiers; vp != NULL && *vp != NULL; vp++)
880 free_vmac(context, *vp);
881 free(val->other_verifiers);
886 k5_free_secure_cookie(krb5_context context, krb5_secure_cookie *val)
890 k5_zapfree_pa_data(val->data);