*/
#include "k5-int.h"
+#include "k5-spake.h"
#include <assert.h>
void KRB5_CALLCONV
void KRB5_CALLCONV
krb5_free_addresses(krb5_context context, krb5_address **val)
{
- register krb5_address **temp;
+ krb5_address **temp;
if (val == NULL)
return;
free(val);
}
-
-void KRB5_CALLCONV
-krb5_free_alt_method(krb5_context context,
- krb5_alt_method *alt)
-{
- if (alt) {
- free(alt->data);
- free(alt);
- }
-}
void KRB5_CALLCONV
-krb5_free_ap_rep(krb5_context context, register krb5_ap_rep *val)
+krb5_free_ap_rep(krb5_context context, krb5_ap_rep *val)
{
if (val == NULL)
return;
}
void KRB5_CALLCONV
-krb5_free_ap_req(krb5_context context, register krb5_ap_req *val)
+krb5_free_ap_req(krb5_context context, krb5_ap_req *val)
{
if (val == NULL)
return;
}
void KRB5_CALLCONV
-krb5_free_checksum(krb5_context context, register krb5_checksum *val)
+krb5_free_checksum(krb5_context context, krb5_checksum *val)
{
if (val == NULL)
return;
}
void KRB5_CALLCONV
-krb5_free_checksum_contents(krb5_context context, register krb5_checksum *val)
+krb5_free_checksum_contents(krb5_context context, krb5_checksum *val)
{
if (val == NULL)
return;
free(val->contents);
val->contents = NULL;
+ val->length = 0;
}
void KRB5_CALLCONV
-krb5_free_cred(krb5_context context, register krb5_cred *val)
+krb5_free_cred(krb5_context context, krb5_cred *val)
{
if (val == NULL)
return;
}
void KRB5_CALLCONV
-krb5_free_cred_enc_part(krb5_context context, register krb5_cred_enc_part *val)
+krb5_free_cred_enc_part(krb5_context context, krb5_cred_enc_part *val)
{
- register krb5_cred_info **temp;
+ krb5_cred_info **temp;
if (val == NULL)
return;
{
if (val == NULL)
return;
- if (val->data) {
- free(val->data);
- val->data = 0;
- }
+ free(val->data);
+ val->data = NULL;
+ val->length = 0;
}
void KRB5_CALLCONV
void KRB5_CALLCONV
-krb5_free_enc_kdc_rep_part(krb5_context context, register krb5_enc_kdc_rep_part *val)
+krb5_free_enc_kdc_rep_part(krb5_context context, krb5_enc_kdc_rep_part *val)
{
if (val == NULL)
return;
void KRB5_CALLCONV
-krb5_free_error(krb5_context context, register krb5_error *val)
+krb5_free_error(krb5_context context, krb5_error *val)
{
if (val == NULL)
return;
}
void KRB5_CALLCONV
-krb5_free_keyblock_contents(krb5_context context, register krb5_keyblock *key)
+krb5_free_keyblock_contents(krb5_context context, krb5_keyblock *key)
{
krb5int_c_free_keyblock_contents (context, key);
}
void KRB5_CALLCONV
-krb5_free_keyblock(krb5_context context, register krb5_keyblock *val)
+krb5_free_keyblock(krb5_context context, krb5_keyblock *val)
{
krb5int_c_free_keyblock (context, val);
}
void KRB5_CALLCONV
krb5_free_last_req(krb5_context context, krb5_last_req_entry **val)
{
- register krb5_last_req_entry **temp;
+ krb5_last_req_entry **temp;
if (val == NULL)
return;
free(val);
}
+void
+k5_zapfree_pa_data(krb5_pa_data **val)
+{
+ krb5_pa_data **pa;
+
+ if (val == NULL)
+ return;
+ for (pa = val; *pa != NULL; pa++) {
+ zapfree((*pa)->contents, (*pa)->length);
+ zapfree(*pa, sizeof(**pa));
+ }
+ free(val);
+}
+
void KRB5_CALLCONV
krb5_free_pa_data(krb5_context context, krb5_pa_data **val)
{
- register krb5_pa_data **temp;
+ krb5_pa_data **temp;
if (val == NULL)
return;
void KRB5_CALLCONV
krb5_free_principal(krb5_context context, krb5_principal val)
{
- register krb5_int32 i;
+ krb5_int32 i;
if (!val)
return;
if (val->data) {
- i = krb5_princ_size(context, val);
+ i = val->length;
while(--i >= 0)
- free(krb5_princ_component(context, val, i)->data);
+ free(val->data[i].data);
free(val->data);
}
free(val->realm.data);
}
void KRB5_CALLCONV
-krb5_free_priv(krb5_context context, register krb5_priv *val)
+krb5_free_priv(krb5_context context, krb5_priv *val)
{
if (val == NULL)
return;
}
void KRB5_CALLCONV
-krb5_free_priv_enc_part(krb5_context context, register krb5_priv_enc_part *val)
+krb5_free_priv_enc_part(krb5_context context, krb5_priv_enc_part *val)
{
if (val == NULL)
return;
}
void KRB5_CALLCONV
-krb5_free_pwd_data(krb5_context context, krb5_pwd_data *val)
-{
- if (val == NULL)
- return;
- krb5_free_pwd_sequences(context, val->element);
- free(val);
-}
-
-
-void KRB5_CALLCONV
-krb5_free_passwd_phrase_element(krb5_context context,
- passwd_phrase_element *val)
-{
- if (val == NULL)
- return;
- krb5_free_data(context, val->passwd);
- val->passwd = NULL;
- krb5_free_data(context, val->phrase);
- val->phrase = NULL;
- free(val);
-}
-
-
-void KRB5_CALLCONV
-krb5_free_pwd_sequences(krb5_context context, passwd_phrase_element **val)
-{
- register passwd_phrase_element **temp;
-
- if (val == NULL)
- return;
- for (temp = val; *temp; temp++)
- krb5_free_passwd_phrase_element(context, *temp);
- free(val);
-}
-
-
-void KRB5_CALLCONV
-krb5_free_safe(krb5_context context, register krb5_safe *val)
+krb5_free_safe(krb5_context context, krb5_safe *val)
{
if (val == NULL)
return;
void KRB5_CALLCONV
krb5_free_tickets(krb5_context context, krb5_ticket **val)
{
- register krb5_ticket **temp;
+ krb5_ticket **temp;
if (val == NULL)
return;
void KRB5_CALLCONV
krb5_free_tgt_creds(krb5_context context, krb5_creds **tgts)
{
- register krb5_creds **tgtpp;
+ krb5_creds **tgtpp;
if (tgts == NULL)
return;
for (tgtpp = tgts; *tgtpp; tgtpp++)
}
void KRB5_CALLCONV
-krb5_free_sam_challenge(krb5_context ctx, krb5_sam_challenge *sc)
-{
- if (!sc)
- return;
- krb5_free_sam_challenge_contents(ctx, sc);
- free(sc);
-}
-
-void KRB5_CALLCONV
krb5_free_sam_challenge_2(krb5_context ctx, krb5_sam_challenge_2 *sc2)
{
if (!sc2)
}
void KRB5_CALLCONV
-krb5_free_sam_challenge_contents(krb5_context ctx, krb5_sam_challenge *sc)
-{
- if (!sc)
- return;
- if (sc->sam_type_name.data)
- krb5_free_data_contents(ctx, &sc->sam_type_name);
- if (sc->sam_track_id.data)
- krb5_free_data_contents(ctx, &sc->sam_track_id);
- if (sc->sam_challenge_label.data)
- krb5_free_data_contents(ctx, &sc->sam_challenge_label);
- if (sc->sam_challenge.data)
- krb5_free_data_contents(ctx, &sc->sam_challenge);
- if (sc->sam_response_prompt.data)
- krb5_free_data_contents(ctx, &sc->sam_response_prompt);
- if (sc->sam_pk_for_sad.data)
- krb5_free_data_contents(ctx, &sc->sam_pk_for_sad);
- free(sc->sam_cksum.contents);
- sc->sam_cksum.contents = 0;
-}
-
-void KRB5_CALLCONV
krb5_free_sam_challenge_2_contents(krb5_context ctx,
krb5_sam_challenge_2 *sc2)
{
}
void KRB5_CALLCONV
-krb5_free_sam_response(krb5_context ctx, krb5_sam_response *sr)
-{
- if (!sr)
- return;
- krb5_free_sam_response_contents(ctx, sr);
- free(sr);
-}
-
-void KRB5_CALLCONV
krb5_free_sam_response_2(krb5_context ctx, krb5_sam_response_2 *sr2)
{
if (!sr2)
}
void KRB5_CALLCONV
-krb5_free_sam_response_contents(krb5_context ctx, krb5_sam_response *sr)
-{
- if (!sr)
- return;
- if (sr->sam_track_id.data)
- krb5_free_data_contents(ctx, &sr->sam_track_id);
- if (sr->sam_enc_key.ciphertext.data)
- krb5_free_data_contents(ctx, &sr->sam_enc_key.ciphertext);
- if (sr->sam_enc_nonce_or_ts.ciphertext.data)
- krb5_free_data_contents(ctx, &sr->sam_enc_nonce_or_ts.ciphertext);
-}
-
-void KRB5_CALLCONV
krb5_free_sam_response_2_contents(krb5_context ctx, krb5_sam_response_2 *sr2)
{
if (!sr2)
}
void KRB5_CALLCONV
-krb5_free_predicted_sam_response(krb5_context ctx,
- krb5_predicted_sam_response *psr)
-{
- if (!psr)
- return;
- krb5_free_predicted_sam_response_contents(ctx, psr);
- free(psr);
-}
-
-void KRB5_CALLCONV
-krb5_free_predicted_sam_response_contents(krb5_context ctx,
- krb5_predicted_sam_response *psr)
-{
- if (!psr)
- return;
- if (psr->sam_key.contents)
- krb5_free_keyblock_contents(ctx, &psr->sam_key);
- krb5_free_principal(ctx, psr->client);
- psr->client = 0;
- if (psr->msd.data)
- krb5_free_data_contents(ctx, &psr->msd);
-}
-
-void KRB5_CALLCONV
-krb5_free_enc_sam_response_enc(krb5_context ctx,
- krb5_enc_sam_response_enc *esre)
-{
- if (!esre)
- return;
- krb5_free_enc_sam_response_enc_contents(ctx, esre);
- free(esre);
-}
-
-void KRB5_CALLCONV
krb5_free_enc_sam_response_enc_2(krb5_context ctx,
krb5_enc_sam_response_enc_2 *esre2)
{
}
void KRB5_CALLCONV
-krb5_free_enc_sam_response_enc_contents(krb5_context ctx,
- krb5_enc_sam_response_enc *esre)
-{
- if (!esre)
- return;
- if (esre->sam_sad.data)
- krb5_free_data_contents(ctx, &esre->sam_sad);
-}
-
-void KRB5_CALLCONV
krb5_free_enc_sam_response_enc_2_contents(krb5_context ctx,
krb5_enc_sam_response_enc_2 *esre2)
{
}
void KRB5_CALLCONV
-krb5_free_pa_server_referral_data(krb5_context context,
- krb5_pa_server_referral_data *ref)
-{
- if (ref == NULL)
- return;
- krb5_free_data(context, ref->referred_realm);
- ref->referred_realm = NULL;
- krb5_free_principal(context, ref->true_principal_name);
- ref->true_principal_name = NULL;
- krb5_free_principal(context, ref->requested_principal_name);
- ref->requested_principal_name = NULL;
- krb5_free_checksum_contents(context, &ref->rep_cksum);
- free(ref);
-}
-
-void KRB5_CALLCONV
-krb5_free_pa_svr_referral_data(krb5_context context,
- krb5_pa_svr_referral_data *ref)
-{
- if (ref == NULL)
- return;
- krb5_free_principal(context, ref->principal);
- ref->principal = NULL;
- free(ref);
-}
-
-void KRB5_CALLCONV
krb5_free_pa_pac_req(krb5_context context,
krb5_pa_pac_req *req)
{
}
void KRB5_CALLCONV
-krb5_free_etype_list(krb5_context context,
- krb5_etype_list *etypes)
-{
- if (etypes != NULL) {
- free(etypes->etypes);
- free(etypes);
- }
-}
-void KRB5_CALLCONV
krb5_free_fast_req(krb5_context context, krb5_fast_req *val)
{
if (val == NULL)
free(val);
}
-void
-krb5_free_typed_data(krb5_context context, krb5_typed_data **in)
-{
- int i = 0;
- if (in == NULL) return;
- while (in[i] != NULL) {
- if (in[i]->data != NULL)
- free(in[i]->data);
- free(in[i]);
- i++;
- }
- free(in);
-}
-
void KRB5_CALLCONV
krb5_free_fast_armored_req(krb5_context context, krb5_fast_armored_req *val)
{
free(val);
}
+void
+k5_free_data_ptr_list(krb5_data **list)
+{
+ int i;
+
+ for (i = 0; list != NULL && list[i] != NULL; i++)
+ krb5_free_data(NULL, list[i]);
+ free(list);
+}
+
void KRB5_CALLCONV
krb5int_free_data_list(krb5_context context, krb5_data *data)
{
}
void KRB5_CALLCONV
-krb5_free_ad_signedpath(krb5_context context, krb5_ad_signedpath *val)
+krb5_free_iakerb_header(krb5_context context, krb5_iakerb_header *val)
{
- int i;
-
if (val == NULL)
- return;
+ return ;
- krb5_free_checksum_contents(context, &val->checksum);
- if (val->delegated != NULL) {
- for (i = 0; val->delegated[i] != NULL; i++)
- krb5_free_principal(context, val->delegated[i]);
- free(val->delegated);
- }
- krb5_free_pa_data(context, val->method_data);
+ krb5_free_data_contents(context, &val->target_realm);
+ krb5_free_data(context, val->cookie);
free(val);
}
void KRB5_CALLCONV
-krb5_free_iakerb_header(krb5_context context, krb5_iakerb_header *val)
+krb5_free_iakerb_finished(krb5_context context, krb5_iakerb_finished *val)
{
if (val == NULL)
return ;
- krb5_free_data_contents(context, &val->target_realm);
- krb5_free_data(context, val->cookie);
+ krb5_free_checksum_contents(context, &val->checksum);
free(val);
}
-void KRB5_CALLCONV
-krb5_free_iakerb_finished(krb5_context context, krb5_iakerb_finished *val)
+void
+k5_free_algorithm_identifier(krb5_context context,
+ krb5_algorithm_identifier *val)
{
if (val == NULL)
- return ;
+ return;
+ free(val->algorithm.data);
+ free(val->parameters.data);
+ free(val);
+}
+
+void
+k5_free_otp_tokeninfo(krb5_context context, krb5_otp_tokeninfo *val)
+{
+ krb5_algorithm_identifier **alg;
+ if (val == NULL)
+ return;
+ free(val->vendor.data);
+ free(val->challenge.data);
+ free(val->token_id.data);
+ free(val->alg_id.data);
+ for (alg = val->supported_hash_alg; alg != NULL && *alg != NULL; alg++)
+ k5_free_algorithm_identifier(context, *alg);
+ free(val->supported_hash_alg);
+ free(val);
+}
+
+void
+k5_free_pa_otp_challenge(krb5_context context, krb5_pa_otp_challenge *val)
+{
+ krb5_otp_tokeninfo **ti;
+
+ if (val == NULL)
+ return;
+ free(val->nonce.data);
+ free(val->service.data);
+ for (ti = val->tokeninfo; *ti != NULL; ti++)
+ k5_free_otp_tokeninfo(context, *ti);
+ free(val->tokeninfo);
+ free(val->salt.data);
+ free(val->s2kparams.data);
+ free(val);
+}
+
+void
+k5_free_pa_otp_req(krb5_context context, krb5_pa_otp_req *val)
+{
+ if (val == NULL)
+ return;
+ val->flags = 0;
+ free(val->nonce.data);
+ free(val->enc_data.ciphertext.data);
+ if (val->hash_alg != NULL)
+ k5_free_algorithm_identifier(context, val->hash_alg);
+ free(val->otp_value.data);
+ free(val->pin.data);
+ free(val->challenge.data);
+ free(val->counter.data);
+ free(val->token_id.data);
+ free(val->alg_id.data);
+ free(val->vendor.data);
+ free(val);
+}
+
+void
+k5_free_kkdcp_message(krb5_context context, krb5_kkdcp_message *val)
+{
+ if (val == NULL)
+ return;
+ free(val->target_domain.data);
+ free(val->kerb_message.data);
+ free(val);
+}
+
+static void
+free_vmac(krb5_context context, krb5_verifier_mac *val)
+{
+ if (val == NULL)
+ return;
+ krb5_free_principal(context, val->princ);
krb5_free_checksum_contents(context, &val->checksum);
free(val);
}
+
+void
+k5_free_cammac(krb5_context context, krb5_cammac *val)
+{
+ krb5_verifier_mac **vp;
+
+ if (val == NULL)
+ return;
+ krb5_free_authdata(context, val->elements);
+ free_vmac(context, val->kdc_verifier);
+ free_vmac(context, val->svc_verifier);
+ for (vp = val->other_verifiers; vp != NULL && *vp != NULL; vp++)
+ free_vmac(context, *vp);
+ free(val->other_verifiers);
+ free(val);
+}
+
+void
+k5_free_secure_cookie(krb5_context context, krb5_secure_cookie *val)
+{
+ if (val == NULL)
+ return;
+ k5_zapfree_pa_data(val->data);
+ free(val);
+}
+
+void
+k5_free_spake_factor(krb5_context context, krb5_spake_factor *val)
+{
+ if (val == NULL)
+ return;
+ if (val->data != NULL)
+ zapfree(val->data->data, val->data->length);
+ free(val->data);
+ free(val);
+}
+
+void
+k5_free_pa_spake(krb5_context context, krb5_pa_spake *val)
+{
+ krb5_spake_factor **f;
+
+ if (val == NULL)
+ return;
+ switch (val->choice) {
+ case SPAKE_MSGTYPE_SUPPORT:
+ free(val->u.support.groups);
+ break;
+ case SPAKE_MSGTYPE_CHALLENGE:
+ krb5_free_data_contents(context, &val->u.challenge.pubkey);
+ for (f = val->u.challenge.factors; f != NULL && *f != NULL; f++)
+ k5_free_spake_factor(context, *f);
+ free(val->u.challenge.factors);
+ break;
+ case SPAKE_MSGTYPE_RESPONSE:
+ krb5_free_data_contents(context, &val->u.response.pubkey);
+ krb5_free_data_contents(context, &val->u.response.factor.ciphertext);
+ break;
+ case SPAKE_MSGTYPE_ENCDATA:
+ krb5_free_data_contents(context, &val->u.encdata.ciphertext);
+ break;
+ default:
+ break;
+ }
+ free(val);
+}