Path: blob/main/crypto/krb5/src/tests/asn.1/krb5_decode_leak.c
34889 views
/* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */1/* tests/asn.1/krb5_decode_leak.c */2/*3* Copyright (C) 2009 by the Massachusetts Institute of Technology.4* All rights reserved.5*6* Export of this software from the United States of America may7* require a specific license from the United States Government.8* It is the responsibility of any person or organization contemplating9* export to obtain such a license before exporting.10*11* WITHIN THAT CONSTRAINT, permission to use, copy, modify, and12* distribute this software and its documentation for any purpose and13* without fee is hereby granted, provided that the above copyright14* notice appear in all copies and that both that copyright notice and15* this permission notice appear in supporting documentation, and that16* the name of M.I.T. not be used in advertising or publicity pertaining17* to distribution of the software without specific, written prior18* permission. Furthermore if you modify this software you must label19* your software as modified software and not distribute it in such a20* fashion that it might be confused with the original M.I.T. software.21* M.I.T. makes no representations about the suitability of22* this software for any purpose. It is provided "as is" without express23* or implied warranty.24*/2526/*27* This program is intended to help detect memory leaks in the ASN.128* decoder functions by exercising their failure paths. The setup29* code for the test cases is copied from krb5_encode_test.c.30*31* This code does not actually detect leaks by itself; it must be run32* through a leak-detection tool such as valgrind to do so. Simply33* running the program will exercise a bunch of ASN.1 encoder and34* decoder code paths but won't validate the results.35*/3637#include "k5-int.h"38#include "com_err.h"39#include "utility.h"40#include "ktest.h"41#include "debug.h"4243krb5_context test_context;4445/*46* Contrary to our usual convention, krb5_free_cred_enc_part is a47* contents-only free function (and is assumed to be by mk_cred and48* rd_cred) and we have no whole-structure free function for that data49* type. So create one here.50*/51static void52free_cred_enc_part_whole(krb5_context ctx,53krb5_cred_enc_part *val)54{55krb5_free_cred_enc_part(ctx, val);56free(val);57}5859int60main(int argc, char **argv)61{62krb5_data *code;63krb5_error_code retval;64unsigned int i;6566retval = krb5_init_context(&test_context);67if (retval) {68com_err(argv[0], retval, "while initializing krb5");69exit(1);70}71init_access(argv[0]);7273#define encode_run(value,type,typestring,description,encoder)7475/*76* Encode a value. Then attempt to trigger most failure paths of77* the decoder function by passing in corrupt encodings, which we78* generate by perturbing each byte of the encoding in turn. Some79* of the perturbed encodings are expected to decode successfully,80* so we need a free function to discard successful results. Make81* sure to define a pointer named "tmp" of the correct type in the82* enclosing block.83*/84#define leak_test(value, encoder, decoder, freefn) \85retval = encoder(&(value),&(code)); \86if (retval) { \87com_err("krb5_decode_leak", retval, "while encoding"); \88exit(1); \89} \90for (i = 0; i < code->length; i++) { \91code->data[i] = (char)~((unsigned char)code->data[i]); \92retval = decoder(code, &tmp); \93code->data[i] = (char)~((unsigned char)code->data[i]); \94if (retval == 0) \95freefn(test_context, tmp); \96} \97krb5_free_data(test_context, code);9899/****************************************************************/100/* encode_krb5_authenticator */101{102krb5_authenticator authent, *tmp;103104ktest_make_sample_authenticator(&authent);105leak_test(authent, encode_krb5_authenticator,106decode_krb5_authenticator, krb5_free_authenticator);107108ktest_destroy_checksum(&(authent.checksum));109ktest_destroy_keyblock(&(authent.subkey));110authent.seq_number = 0;111ktest_empty_authorization_data(authent.authorization_data);112leak_test(authent, encode_krb5_authenticator,113decode_krb5_authenticator, krb5_free_authenticator);114115ktest_destroy_authorization_data(&(authent.authorization_data));116leak_test(authent, encode_krb5_authenticator,117decode_krb5_authenticator, krb5_free_authenticator);118ktest_empty_authenticator(&authent);119}120121/****************************************************************/122/* encode_krb5_ticket */123{124krb5_ticket tkt, *tmp;125126ktest_make_sample_ticket(&tkt);127leak_test(tkt, encode_krb5_ticket, decode_krb5_ticket,128krb5_free_ticket);129ktest_empty_ticket(&tkt);130}131132/****************************************************************/133/* encode_krb5_encryption_key */134{135krb5_keyblock keyblk, *tmp;136137ktest_make_sample_keyblock(&keyblk);138leak_test(keyblk, encode_krb5_encryption_key,139decode_krb5_encryption_key, krb5_free_keyblock);140ktest_empty_keyblock(&keyblk);141}142143/****************************************************************/144/* encode_krb5_enc_tkt_part */145{146krb5_ticket tkt;147krb5_enc_tkt_part *tmp;148149memset(&tkt, 0, sizeof(krb5_ticket));150tkt.enc_part2 = ealloc(sizeof(krb5_enc_tkt_part));151ktest_make_sample_enc_tkt_part(tkt.enc_part2);152153leak_test(*(tkt.enc_part2), encode_krb5_enc_tkt_part,154decode_krb5_enc_tkt_part, krb5_free_enc_tkt_part);155156tkt.enc_part2->times.starttime = 0;157tkt.enc_part2->times.renew_till = 0;158ktest_destroy_address(&(tkt.enc_part2->caddrs[1]));159ktest_destroy_address(&(tkt.enc_part2->caddrs[0]));160ktest_destroy_authdata(&(tkt.enc_part2->authorization_data[1]));161ktest_destroy_authdata(&(tkt.enc_part2->authorization_data[0]));162163/* ISODE version fails on the empty caddrs field */164ktest_destroy_addresses(&(tkt.enc_part2->caddrs));165ktest_destroy_authorization_data(&(tkt.enc_part2->authorization_data));166167leak_test(*(tkt.enc_part2), encode_krb5_enc_tkt_part,168decode_krb5_enc_tkt_part, krb5_free_enc_tkt_part);169ktest_empty_ticket(&tkt);170}171172/****************************************************************/173/* encode_krb5_enc_kdc_rep_part */174{175krb5_kdc_rep kdcr;176krb5_enc_kdc_rep_part *tmp;177178memset(&kdcr, 0, sizeof(kdcr));179180kdcr.enc_part2 = ealloc(sizeof(krb5_enc_kdc_rep_part));181ktest_make_sample_enc_kdc_rep_part(kdcr.enc_part2);182183leak_test(*(kdcr.enc_part2), encode_krb5_enc_kdc_rep_part,184decode_krb5_enc_kdc_rep_part, krb5_free_enc_kdc_rep_part);185186kdcr.enc_part2->key_exp = 0;187kdcr.enc_part2->times.starttime = 0;188kdcr.enc_part2->flags &= ~TKT_FLG_RENEWABLE;189ktest_destroy_addresses(&(kdcr.enc_part2->caddrs));190191leak_test(*(kdcr.enc_part2), encode_krb5_enc_kdc_rep_part,192decode_krb5_enc_kdc_rep_part, krb5_free_enc_kdc_rep_part);193194ktest_empty_kdc_rep(&kdcr);195}196197/****************************************************************/198/* encode_krb5_as_rep */199{200krb5_kdc_rep kdcr, *tmp;201202ktest_make_sample_kdc_rep(&kdcr);203kdcr.msg_type = KRB5_AS_REP;204leak_test(kdcr, encode_krb5_as_rep, decode_krb5_as_rep,205krb5_free_kdc_rep);206207ktest_destroy_pa_data_array(&(kdcr.padata));208leak_test(kdcr, encode_krb5_as_rep, decode_krb5_as_rep,209krb5_free_kdc_rep);210211ktest_empty_kdc_rep(&kdcr);212213}214215/****************************************************************/216/* encode_krb5_tgs_rep */217{218krb5_kdc_rep kdcr, *tmp;219220ktest_make_sample_kdc_rep(&kdcr);221kdcr.msg_type = KRB5_TGS_REP;222leak_test(kdcr, encode_krb5_tgs_rep, decode_krb5_tgs_rep,223krb5_free_kdc_rep);224225ktest_destroy_pa_data_array(&(kdcr.padata));226leak_test(kdcr, encode_krb5_tgs_rep, decode_krb5_tgs_rep,227krb5_free_kdc_rep);228229ktest_empty_kdc_rep(&kdcr);230231}232233/****************************************************************/234/* encode_krb5_ap_req */235{236krb5_ap_req apreq, *tmp;237238ktest_make_sample_ap_req(&apreq);239leak_test(apreq, encode_krb5_ap_req, decode_krb5_ap_req,240krb5_free_ap_req);241ktest_empty_ap_req(&apreq);242}243244/****************************************************************/245/* encode_krb5_ap_rep */246{247krb5_ap_rep aprep, *tmp;248249ktest_make_sample_ap_rep(&aprep);250leak_test(aprep, encode_krb5_ap_rep, decode_krb5_ap_rep,251krb5_free_ap_rep);252ktest_empty_ap_rep(&aprep);253}254255/****************************************************************/256/* encode_krb5_ap_rep_enc_part */257{258krb5_ap_rep_enc_part apenc, *tmp;259260ktest_make_sample_ap_rep_enc_part(&apenc);261leak_test(apenc, encode_krb5_ap_rep_enc_part,262decode_krb5_ap_rep_enc_part, krb5_free_ap_rep_enc_part);263264ktest_destroy_keyblock(&(apenc.subkey));265apenc.seq_number = 0;266leak_test(apenc, encode_krb5_ap_rep_enc_part,267decode_krb5_ap_rep_enc_part, krb5_free_ap_rep_enc_part);268ktest_empty_ap_rep_enc_part(&apenc);269}270271/****************************************************************/272/* encode_krb5_as_req */273{274krb5_kdc_req asreq, *tmp;275276ktest_make_sample_kdc_req(&asreq);277asreq.msg_type = KRB5_AS_REQ;278asreq.kdc_options &= ~KDC_OPT_ENC_TKT_IN_SKEY;279leak_test(asreq, encode_krb5_as_req, decode_krb5_as_req,280krb5_free_kdc_req);281282ktest_destroy_pa_data_array(&(asreq.padata));283ktest_destroy_principal(&(asreq.client));284#ifndef ISODE_SUCKS285ktest_destroy_principal(&(asreq.server));286#endif287asreq.kdc_options |= KDC_OPT_ENC_TKT_IN_SKEY;288asreq.from = 0;289asreq.rtime = 0;290ktest_destroy_addresses(&(asreq.addresses));291ktest_destroy_enc_data(&(asreq.authorization_data));292leak_test(asreq, encode_krb5_as_req, decode_krb5_as_req,293krb5_free_kdc_req);294295ktest_destroy_sequence_of_ticket(&(asreq.second_ticket));296#ifndef ISODE_SUCKS297ktest_make_sample_principal(&(asreq.server));298#endif299asreq.kdc_options &= ~KDC_OPT_ENC_TKT_IN_SKEY;300leak_test(asreq, encode_krb5_as_req, decode_krb5_as_req,301krb5_free_kdc_req);302ktest_empty_kdc_req(&asreq);303}304305/****************************************************************/306/* encode_krb5_tgs_req */307{308krb5_kdc_req tgsreq, *tmp;309310ktest_make_sample_kdc_req(&tgsreq);311tgsreq.msg_type = KRB5_TGS_REQ;312tgsreq.kdc_options &= ~KDC_OPT_ENC_TKT_IN_SKEY;313leak_test(tgsreq, encode_krb5_tgs_req, decode_krb5_tgs_req,314krb5_free_kdc_req);315316ktest_destroy_pa_data_array(&(tgsreq.padata));317ktest_destroy_principal(&(tgsreq.client));318#ifndef ISODE_SUCKS319ktest_destroy_principal(&(tgsreq.server));320#endif321tgsreq.kdc_options |= KDC_OPT_ENC_TKT_IN_SKEY;322tgsreq.from = 0;323tgsreq.rtime = 0;324ktest_destroy_addresses(&(tgsreq.addresses));325ktest_destroy_enc_data(&(tgsreq.authorization_data));326leak_test(tgsreq, encode_krb5_tgs_req, decode_krb5_tgs_req,327krb5_free_kdc_req);328329ktest_destroy_sequence_of_ticket(&(tgsreq.second_ticket));330#ifndef ISODE_SUCKS331ktest_make_sample_principal(&(tgsreq.server));332#endif333tgsreq.kdc_options &= ~KDC_OPT_ENC_TKT_IN_SKEY;334leak_test(tgsreq, encode_krb5_tgs_req, decode_krb5_tgs_req,335krb5_free_kdc_req);336ktest_empty_kdc_req(&tgsreq);337}338339/****************************************************************/340/* encode_krb5_kdc_req_body */341{342krb5_kdc_req kdcrb, *tmp;343344memset(&kdcrb, 0, sizeof(kdcrb));345ktest_make_sample_kdc_req_body(&kdcrb);346kdcrb.kdc_options &= ~KDC_OPT_ENC_TKT_IN_SKEY;347leak_test(kdcrb, encode_krb5_kdc_req_body, decode_krb5_kdc_req_body,348krb5_free_kdc_req);349350ktest_destroy_principal(&(kdcrb.client));351#ifndef ISODE_SUCKS352ktest_destroy_principal(&(kdcrb.server));353#endif354kdcrb.kdc_options |= KDC_OPT_ENC_TKT_IN_SKEY;355kdcrb.from = 0;356kdcrb.rtime = 0;357ktest_destroy_addresses(&(kdcrb.addresses));358ktest_destroy_enc_data(&(kdcrb.authorization_data));359leak_test(kdcrb, encode_krb5_kdc_req_body, decode_krb5_kdc_req_body,360krb5_free_kdc_req);361362ktest_destroy_sequence_of_ticket(&(kdcrb.second_ticket));363#ifndef ISODE_SUCKS364ktest_make_sample_principal(&(kdcrb.server));365#endif366kdcrb.kdc_options &= ~KDC_OPT_ENC_TKT_IN_SKEY;367leak_test(kdcrb, encode_krb5_kdc_req_body, decode_krb5_kdc_req_body,368krb5_free_kdc_req);369ktest_empty_kdc_req(&kdcrb);370}371372/****************************************************************/373/* encode_krb5_safe */374{375krb5_safe s, *tmp;376377ktest_make_sample_safe(&s);378leak_test(s, encode_krb5_safe, decode_krb5_safe, krb5_free_safe);379380s.timestamp = 0;381/* s.usec should be opted out by the timestamp */382s.seq_number = 0;383ktest_destroy_address(&(s.r_address));384leak_test(s, encode_krb5_safe, decode_krb5_safe, krb5_free_safe);385ktest_empty_safe(&s);386}387388/****************************************************************/389/* encode_krb5_priv */390{391krb5_priv p, *tmp;392393ktest_make_sample_priv(&p);394leak_test(p, encode_krb5_priv, decode_krb5_priv, krb5_free_priv);395ktest_empty_priv(&p);396}397398/****************************************************************/399/* encode_krb5_enc_priv_part */400{401krb5_priv_enc_part ep, *tmp;402403ktest_make_sample_priv_enc_part(&ep);404leak_test(ep, encode_krb5_enc_priv_part, decode_krb5_enc_priv_part,405krb5_free_priv_enc_part);406407ep.timestamp = 0;408/* ep.usec should be opted out along with timestamp */409ep.seq_number = 0;410ktest_destroy_address(&(ep.r_address));411leak_test(ep, encode_krb5_enc_priv_part, decode_krb5_enc_priv_part,412krb5_free_priv_enc_part);413ktest_empty_priv_enc_part(&ep);414}415416/****************************************************************/417/* encode_krb5_cred */418{419krb5_cred c, *tmp;420421ktest_make_sample_cred(&c);422leak_test(c, encode_krb5_cred, decode_krb5_cred, krb5_free_cred);423ktest_empty_cred(&c);424}425426/****************************************************************/427/* encode_krb5_enc_cred_part */428{429krb5_cred_enc_part cep, *tmp;430431ktest_make_sample_cred_enc_part(&cep);432leak_test(cep, encode_krb5_enc_cred_part, decode_krb5_enc_cred_part,433free_cred_enc_part_whole);434435ktest_destroy_principal(&(cep.ticket_info[0]->client));436ktest_destroy_principal(&(cep.ticket_info[0]->server));437cep.ticket_info[0]->flags = 0;438cep.ticket_info[0]->times.authtime = 0;439cep.ticket_info[0]->times.starttime = 0;440cep.ticket_info[0]->times.endtime = 0;441cep.ticket_info[0]->times.renew_till = 0;442ktest_destroy_addresses(&(cep.ticket_info[0]->caddrs));443cep.nonce = 0;444cep.timestamp = 0;445ktest_destroy_address(&(cep.s_address));446ktest_destroy_address(&(cep.r_address));447leak_test(cep, encode_krb5_enc_cred_part, decode_krb5_enc_cred_part,448free_cred_enc_part_whole);449ktest_empty_cred_enc_part(&cep);450}451452/****************************************************************/453/* encode_krb5_error */454{455krb5_error kerr, *tmp;456457ktest_make_sample_error(&kerr);458leak_test(kerr, encode_krb5_error, decode_krb5_error, krb5_free_error);459460kerr.ctime = 0;461ktest_destroy_principal(&(kerr.client));462ktest_empty_data(&(kerr.text));463ktest_empty_data(&(kerr.e_data));464leak_test(kerr, encode_krb5_error, decode_krb5_error, krb5_free_error);465466ktest_empty_error(&kerr);467}468469/****************************************************************/470/* encode_krb5_authdata */471{472krb5_authdata **ad, **tmp;473474ktest_make_sample_authorization_data(&ad);475leak_test(*ad, encode_krb5_authdata, decode_krb5_authdata,476krb5_free_authdata);477ktest_destroy_authorization_data(&ad);478}479480/****************************************************************/481/* encode_padata_sequence and encode_typed_data */482{483krb5_pa_data **pa, **tmp;484485ktest_make_sample_pa_data_array(&pa);486leak_test(*pa, encode_krb5_padata_sequence,487decode_krb5_padata_sequence, krb5_free_pa_data);488leak_test(*pa, encode_krb5_typed_data,489decode_krb5_typed_data, krb5_free_pa_data);490ktest_destroy_pa_data_array(&pa);491}492493/****************************************************************/494/* encode_padata_sequence (empty) */495{496krb5_pa_data **pa, **tmp;497498ktest_make_sample_empty_pa_data_array(&pa);499leak_test(*pa, encode_krb5_padata_sequence,500decode_krb5_padata_sequence, krb5_free_pa_data);501ktest_destroy_pa_data_array(&pa);502}503504/****************************************************************/505/* encode_etype_info */506{507krb5_etype_info_entry **info, **tmp;508509ktest_make_sample_etype_info(&info);510leak_test(*info, encode_krb5_etype_info, decode_krb5_etype_info,511krb5_free_etype_info);512513ktest_destroy_etype_info_entry(info[2]); info[2] = 0;514ktest_destroy_etype_info_entry(info[1]); info[1] = 0;515leak_test(*info, encode_krb5_etype_info, decode_krb5_etype_info,516krb5_free_etype_info);517518ktest_destroy_etype_info_entry(info[0]); info[0] = 0;519leak_test(*info, encode_krb5_etype_info, decode_krb5_etype_info,520krb5_free_etype_info);521522ktest_destroy_etype_info(info);523}524525/* encode_etype_info 2*/526{527krb5_etype_info_entry **info, **tmp;528529ktest_make_sample_etype_info2(&info);530leak_test(*info, encode_krb5_etype_info2, decode_krb5_etype_info2,531krb5_free_etype_info);532533ktest_destroy_etype_info_entry(info[2]); info[2] = 0;534ktest_destroy_etype_info_entry(info[1]); info[1] = 0;535leak_test(*info, encode_krb5_etype_info2, decode_krb5_etype_info2,536krb5_free_etype_info);537538ktest_destroy_etype_info(info);539}540541/****************************************************************/542/* encode_pa_enc_ts */543{544krb5_pa_enc_ts pa_enc, *tmp;545546ktest_make_sample_pa_enc_ts(&pa_enc);547leak_test(pa_enc, encode_krb5_pa_enc_ts, decode_krb5_pa_enc_ts,548krb5_free_pa_enc_ts);549pa_enc.pausec = 0;550leak_test(pa_enc, encode_krb5_pa_enc_ts, decode_krb5_pa_enc_ts,551krb5_free_pa_enc_ts);552}553554/****************************************************************/555/* encode_enc_data */556{557krb5_enc_data enc_data, *tmp;558559ktest_make_sample_enc_data(&enc_data);560leak_test(enc_data, encode_krb5_enc_data, decode_krb5_enc_data,561krb5_free_enc_data);562ktest_destroy_enc_data(&enc_data);563}564/****************************************************************/565/* encode_krb5_sam_challenge_2 */566{567krb5_sam_challenge_2 sam_ch2, *tmp;568569ktest_make_sample_sam_challenge_2(&sam_ch2);570leak_test(sam_ch2, encode_krb5_sam_challenge_2,571decode_krb5_sam_challenge_2, krb5_free_sam_challenge_2);572ktest_empty_sam_challenge_2(&sam_ch2);573}574/****************************************************************/575/* encode_krb5_sam_challenge_2 */576{577krb5_sam_challenge_2_body body, *tmp;578579ktest_make_sample_sam_challenge_2_body(&body);580leak_test(body, encode_krb5_sam_challenge_2_body,581decode_krb5_sam_challenge_2_body,582krb5_free_sam_challenge_2_body);583ktest_empty_sam_challenge_2_body(&body);584}585/****************************************************************/586/* encode_krb5_sam_response_2 */587{588krb5_sam_response_2 sam_ch2, *tmp;589590ktest_make_sample_sam_response_2(&sam_ch2);591leak_test(sam_ch2, encode_krb5_sam_response_2,592decode_krb5_sam_response_2, krb5_free_sam_response_2);593ktest_empty_sam_response_2(&sam_ch2);594}595/****************************************************************/596/* encode_krb5_sam_response_enc_2 */597{598krb5_enc_sam_response_enc_2 sam_ch2, *tmp;599600ktest_make_sample_enc_sam_response_enc_2(&sam_ch2);601leak_test(sam_ch2, encode_krb5_enc_sam_response_enc_2,602decode_krb5_enc_sam_response_enc_2,603krb5_free_enc_sam_response_enc_2);604ktest_empty_enc_sam_response_enc_2(&sam_ch2);605}606/****************************************************************/607/* encode_krb5_pa_for_user */608{609krb5_pa_for_user foru, *tmp;610ktest_make_sample_pa_for_user(&foru);611leak_test(foru, encode_krb5_pa_for_user, decode_krb5_pa_for_user,612krb5_free_pa_for_user);613ktest_empty_pa_for_user(&foru);614}615/****************************************************************/616/* encode_krb5_pa_s4u_x509_user */617{618krb5_pa_s4u_x509_user s4u, *tmp;619ktest_make_sample_pa_s4u_x509_user(&s4u);620leak_test(s4u, encode_krb5_pa_s4u_x509_user,621decode_krb5_pa_s4u_x509_user,622krb5_free_pa_s4u_x509_user);623ktest_empty_pa_s4u_x509_user(&s4u);624}625/****************************************************************/626/* encode_krb5_ad_kdcissued */627{628krb5_ad_kdcissued kdci, *tmp;629ktest_make_sample_ad_kdcissued(&kdci);630leak_test(kdci, encode_krb5_ad_kdcissued,631decode_krb5_ad_kdcissued,632krb5_free_ad_kdcissued);633ktest_empty_ad_kdcissued(&kdci);634}635/****************************************************************/636/* encode_krb5_iakerb_header */637{638krb5_iakerb_header ih, *tmp;639ktest_make_sample_iakerb_header(&ih);640leak_test(ih, encode_krb5_iakerb_header,641decode_krb5_iakerb_header,642krb5_free_iakerb_header);643ktest_empty_iakerb_header(&ih);644}645/****************************************************************/646/* encode_krb5_iakerb_finished */647{648krb5_iakerb_finished ih, *tmp;649ktest_make_sample_iakerb_finished(&ih);650leak_test(ih, encode_krb5_iakerb_finished,651decode_krb5_iakerb_finished,652krb5_free_iakerb_finished);653ktest_empty_iakerb_finished(&ih);654}655/****************************************************************/656/* encode_krb5_fast_response */657{658krb5_fast_response fr, *tmp;659ktest_make_sample_fast_response(&fr);660leak_test(fr, encode_krb5_fast_response, decode_krb5_fast_response,661krb5_free_fast_response);662ktest_empty_fast_response(&fr);663}664/****************************************************************/665/* encode_krb5_pa_fx_fast_reply */666{667krb5_enc_data enc, *tmp;668ktest_make_sample_enc_data(&enc);669leak_test(enc, encode_krb5_pa_fx_fast_reply,670decode_krb5_pa_fx_fast_reply, krb5_free_enc_data);671ktest_destroy_enc_data(&enc);672}673krb5_free_context(test_context);674return 0;675}676677678