Path: blob/main/crypto/krb5/src/tests/asn.1/ktest_equal.c
34890 views
/* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */1/* tests/asn.1/ktest_equal.c */2/*3* Copyright (C) 1994 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#include <stdlib.h>27#include <stdio.h>28#include "ktest_equal.h"2930#define FALSE 031#define TRUE 13233#define struct_equal(field,comparator) \34comparator(&(ref->field),&(var->field))3536#define ptr_equal(field,comparator) \37comparator(ref->field,var->field)3839#define scalar_equal(field) \40((ref->field) == (var->field))4142#define len_equal(length,field,comparator) \43((ref->length == var->length) && \44comparator(ref->length,ref->field,var->field))4546int47ktest_equal_authenticator(krb5_authenticator *ref, krb5_authenticator *var)48{49int p = TRUE;5051if (ref == var) return TRUE;52else if (ref == NULL || var == NULL) return FALSE;53p = p && ptr_equal(client,ktest_equal_principal_data);54p = p && ptr_equal(checksum,ktest_equal_checksum);55p = p && scalar_equal(cusec);56p = p && scalar_equal(ctime);57p = p && ptr_equal(subkey,ktest_equal_keyblock);58p = p && scalar_equal(seq_number);59p = p && ptr_equal(authorization_data,ktest_equal_authorization_data);60return p;61}6263int64ktest_equal_principal_data(krb5_principal_data *ref, krb5_principal_data *var)65{66if (ref == var) return TRUE;67else if (ref == NULL || var == NULL) return FALSE;68return(struct_equal(realm,ktest_equal_data) &&69len_equal(length,data,ktest_equal_array_of_data) &&70scalar_equal(type));71}7273int74ktest_equal_authdata(krb5_authdata *ref, krb5_authdata *var)75{76if (ref == var) return TRUE;77else if (ref == NULL || var == NULL) return FALSE;78return(scalar_equal(ad_type) &&79len_equal(length,contents,ktest_equal_array_of_octet));80}8182int83ktest_equal_checksum(krb5_checksum *ref, krb5_checksum *var)84{85if (ref == var) return TRUE;86else if (ref == NULL || var == NULL) return FALSE;87return(scalar_equal(checksum_type) && len_equal(length,contents,ktest_equal_array_of_octet));88}8990int91ktest_equal_keyblock(krb5_keyblock *ref, krb5_keyblock *var)92{93if (ref == var) return TRUE;94else if (ref == NULL || var == NULL) return FALSE;95return(scalar_equal(enctype) && len_equal(length,contents,ktest_equal_array_of_octet));96}9798int99ktest_equal_data(krb5_data *ref, krb5_data *var)100{101if (ref == var) return TRUE;102else if (ref == NULL || var == NULL) return FALSE;103return(len_equal(length,data,ktest_equal_array_of_char));104}105106int107ktest_equal_ticket(krb5_ticket *ref, krb5_ticket *var)108{109int p = TRUE;110if (ref == var) return TRUE;111else if (ref == NULL || var == NULL) return FALSE;112p = p && ptr_equal(server,ktest_equal_principal_data);113p = p && struct_equal(enc_part,ktest_equal_enc_data);114/* enc_part2 is irrelevant, as far as the ASN.1 code is concerned */115return p;116}117118int119ktest_equal_enc_data(krb5_enc_data *ref, krb5_enc_data *var)120{121int p = TRUE;122if (ref == var) return TRUE;123else if (ref == NULL || var == NULL) return FALSE;124p = p && scalar_equal(enctype);125p = p && scalar_equal(kvno);126p = p && struct_equal(ciphertext,ktest_equal_data);127return p;128}129130int131ktest_equal_encryption_key(krb5_keyblock *ref, krb5_keyblock *var)132{133int p = TRUE;134if (ref == var) return TRUE;135else if (ref == NULL || var == NULL) return FALSE;136p = p && scalar_equal(enctype);137p = p && len_equal(length,contents,ktest_equal_array_of_octet);138return p;139}140141int142ktest_equal_enc_tkt_part(krb5_enc_tkt_part *ref, krb5_enc_tkt_part *var)143{144int p = TRUE;145if (ref == var) return TRUE;146else if (ref == NULL || var == NULL) return FALSE;147p = p && scalar_equal(flags);148p = p && ptr_equal(session,ktest_equal_encryption_key);149p = p && ptr_equal(client,ktest_equal_principal_data);150p = p && struct_equal(transited,ktest_equal_transited);151p = p && struct_equal(times,ktest_equal_ticket_times);152p = p && ptr_equal(caddrs,ktest_equal_addresses);153p = p && ptr_equal(authorization_data,ktest_equal_authorization_data);154return p;155}156157int158ktest_equal_transited(krb5_transited *ref, krb5_transited *var)159{160int p = TRUE;161if (ref == var) return TRUE;162else if (ref == NULL || var == NULL) return FALSE;163p = p && scalar_equal(tr_type);164p = p && struct_equal(tr_contents,ktest_equal_data);165return p;166}167168int169ktest_equal_ticket_times(krb5_ticket_times *ref, krb5_ticket_times *var)170{171int p = TRUE;172if (ref == var) return TRUE;173else if (ref == NULL || var == NULL) return FALSE;174p = p && scalar_equal(authtime);175p = p && scalar_equal(starttime);176p = p && scalar_equal(endtime);177p = p && scalar_equal(renew_till);178return p;179}180181int182ktest_equal_address(krb5_address *ref, krb5_address *var)183{184int p = TRUE;185if (ref == var) return TRUE;186else if (ref == NULL || var == NULL) return FALSE;187p = p && scalar_equal(addrtype);188p = p && len_equal(length,contents,ktest_equal_array_of_octet);189return p;190}191192int193ktest_equal_enc_kdc_rep_part(krb5_enc_kdc_rep_part *ref,194krb5_enc_kdc_rep_part *var)195{196int p = TRUE;197if (ref == var) return TRUE;198else if (ref == NULL || var == NULL) return FALSE;199p = p && ptr_equal(session,ktest_equal_keyblock);200p = p && ptr_equal(last_req,ktest_equal_last_req);201p = p && scalar_equal(nonce);202p = p && scalar_equal(key_exp);203p = p && scalar_equal(flags);204p = p && struct_equal(times,ktest_equal_ticket_times);205p = p && ptr_equal(server,ktest_equal_principal_data);206p = p && ptr_equal(caddrs,ktest_equal_addresses);207return p;208}209210int211ktest_equal_priv(krb5_priv *ref, krb5_priv *var)212{213int p = TRUE;214if (ref == var) return TRUE;215else if (ref == NULL || var == NULL) return FALSE;216p = p && struct_equal(enc_part,ktest_equal_enc_data);217return p;218}219220int221ktest_equal_cred(krb5_cred *ref, krb5_cred *var)222{223int p = TRUE;224if (ref == var) return TRUE;225else if (ref == NULL || var == NULL) return FALSE;226p = p && ptr_equal(tickets,ktest_equal_sequence_of_ticket);227p = p && struct_equal(enc_part,ktest_equal_enc_data);228return p;229}230231int232ktest_equal_error(krb5_error *ref, krb5_error *var)233{234int p = TRUE;235if (ref == var) return TRUE;236else if (ref == NULL || var == NULL) return FALSE;237p = p && scalar_equal(ctime);238p = p && scalar_equal(cusec);239p = p && scalar_equal(susec);240p = p && scalar_equal(stime);241p = p && scalar_equal(error);242p = p && ptr_equal(client,ktest_equal_principal_data);243p = p && ptr_equal(server,ktest_equal_principal_data);244p = p && struct_equal(text,ktest_equal_data);245p = p && struct_equal(e_data,ktest_equal_data);246return p;247}248249int250ktest_equal_ap_req(krb5_ap_req *ref, krb5_ap_req *var)251{252int p = TRUE;253if (ref == var) return TRUE;254else if (ref == NULL || var == NULL) return FALSE;255p = p && scalar_equal(ap_options);256p = p && ptr_equal(ticket,ktest_equal_ticket);257p = p && struct_equal(authenticator,ktest_equal_enc_data);258return p;259}260261int262ktest_equal_ap_rep(krb5_ap_rep *ref, krb5_ap_rep *var)263{264int p = TRUE;265if (ref == var) return TRUE;266else if (ref == NULL || var == NULL) return FALSE;267p = p && struct_equal(enc_part,ktest_equal_enc_data);268return p;269}270271int272ktest_equal_ap_rep_enc_part(krb5_ap_rep_enc_part *ref,273krb5_ap_rep_enc_part *var)274{275int p = TRUE;276if (ref == var) return TRUE;277else if (ref == NULL || var == NULL) return FALSE;278p = p && scalar_equal(ctime);279p = p && scalar_equal(cusec);280p = p && ptr_equal(subkey,ktest_equal_encryption_key);281p = p && scalar_equal(seq_number);282return p;283}284285int286ktest_equal_safe(krb5_safe *ref, krb5_safe *var)287{288int p = TRUE;289if (ref == var) return TRUE;290else if (ref == NULL || var == NULL) return FALSE;291p = p && struct_equal(user_data,ktest_equal_data);292p = p && scalar_equal(timestamp);293p = p && scalar_equal(usec);294p = p && scalar_equal(seq_number);295p = p && ptr_equal(s_address,ktest_equal_address);296p = p && ptr_equal(r_address,ktest_equal_address);297p = p && ptr_equal(checksum,ktest_equal_checksum);298return p;299}300301302int303ktest_equal_enc_cred_part(krb5_cred_enc_part *ref, krb5_cred_enc_part *var)304{305int p = TRUE;306if (ref == var) return TRUE;307else if (ref == NULL || var == NULL) return FALSE;308p = p && scalar_equal(nonce);309p = p && scalar_equal(timestamp);310p = p && scalar_equal(usec);311p = p && ptr_equal(s_address,ktest_equal_address);312p = p && ptr_equal(r_address,ktest_equal_address);313p = p && ptr_equal(ticket_info,ktest_equal_sequence_of_cred_info);314return p;315}316317int318ktest_equal_enc_priv_part(krb5_priv_enc_part *ref, krb5_priv_enc_part *var)319{320int p = TRUE;321if (ref == var) return TRUE;322else if (ref == NULL || var == NULL) return FALSE;323p = p && struct_equal(user_data,ktest_equal_data);324p = p && scalar_equal(timestamp);325p = p && scalar_equal(usec);326p = p && scalar_equal(seq_number);327p = p && ptr_equal(s_address,ktest_equal_address);328p = p && ptr_equal(r_address,ktest_equal_address);329return p;330}331332int333ktest_equal_as_rep(krb5_kdc_rep *ref, krb5_kdc_rep *var)334{335int p = TRUE;336if (ref == var) return TRUE;337else if (ref == NULL || var == NULL) return FALSE;338p = p && scalar_equal(msg_type);339p = p && ptr_equal(padata,ktest_equal_sequence_of_pa_data);340p = p && ptr_equal(client,ktest_equal_principal_data);341p = p && ptr_equal(ticket,ktest_equal_ticket);342p = p && struct_equal(enc_part,ktest_equal_enc_data);343p = p && ptr_equal(enc_part2,ktest_equal_enc_kdc_rep_part);344return p;345}346347int348ktest_equal_tgs_rep(krb5_kdc_rep *ref, krb5_kdc_rep *var)349{350return ktest_equal_as_rep(ref,var);351}352353int354ktest_equal_as_req(krb5_kdc_req *ref, krb5_kdc_req *var)355{356int p = TRUE;357if (ref == var) return TRUE;358else if (ref == NULL || var == NULL) return FALSE;359p = p && scalar_equal(msg_type);360p = p && ptr_equal(padata,ktest_equal_sequence_of_pa_data);361p = p && scalar_equal(kdc_options);362p = p && ptr_equal(client,ktest_equal_principal_data);363p = p && ptr_equal(server,ktest_equal_principal_data);364p = p && scalar_equal(from);365p = p && scalar_equal(till);366p = p && scalar_equal(rtime);367p = p && scalar_equal(nonce);368p = p && len_equal(nktypes,ktype,ktest_equal_array_of_enctype);369p = p && ptr_equal(addresses,ktest_equal_addresses);370p = p && struct_equal(authorization_data,ktest_equal_enc_data);371/* This field isn't actually in the ASN.1 encoding. */372/* p = p && ptr_equal(unenc_authdata,ktest_equal_authorization_data); */373return p;374}375376int377ktest_equal_tgs_req(krb5_kdc_req *ref, krb5_kdc_req *var)378{379return ktest_equal_as_req(ref,var);380}381382int383ktest_equal_kdc_req_body(krb5_kdc_req *ref, krb5_kdc_req *var)384{385int p = TRUE;386if (ref == var) return TRUE;387else if (ref == NULL || var == NULL) return FALSE;388p = p && scalar_equal(kdc_options);389p = p && ptr_equal(client,ktest_equal_principal_data);390p = p && ptr_equal(server,ktest_equal_principal_data);391p = p && scalar_equal(from);392p = p && scalar_equal(till);393p = p && scalar_equal(rtime);394p = p && scalar_equal(nonce);395p = p && len_equal(nktypes,ktype,ktest_equal_array_of_enctype);396p = p && ptr_equal(addresses,ktest_equal_addresses);397p = p && struct_equal(authorization_data,ktest_equal_enc_data);398/* This isn't part of the ASN.1 encoding. */399/* p = p && ptr_equal(unenc_authdata,ktest_equal_authorization_data); */400return p;401}402403int404ktest_equal_last_req_entry(krb5_last_req_entry *ref, krb5_last_req_entry *var)405{406int p = TRUE;407if (ref == var) return TRUE;408else if (ref == NULL || var == NULL) return FALSE;409p = p && scalar_equal(lr_type);410p = p && scalar_equal(value);411return p;412}413414int415ktest_equal_pa_data(krb5_pa_data *ref, krb5_pa_data *var)416{417int p = TRUE;418if (ref == var) return TRUE;419else if (ref == NULL || var == NULL) return FALSE;420p = p && scalar_equal(pa_type);421p = p && len_equal(length,contents,ktest_equal_array_of_octet);422return p;423}424425int426ktest_equal_cred_info(krb5_cred_info *ref, krb5_cred_info *var)427{428int p = TRUE;429if (ref == var) return TRUE;430else if (ref == NULL || var == NULL) return FALSE;431p = p && ptr_equal(session,ktest_equal_keyblock);432p = p && ptr_equal(client,ktest_equal_principal_data);433p = p && ptr_equal(server,ktest_equal_principal_data);434p = p && scalar_equal(flags);435p = p && struct_equal(times,ktest_equal_ticket_times);436p = p && ptr_equal(caddrs,ktest_equal_addresses);437438return p;439}440441int442ktest_equal_krb5_etype_info_entry(krb5_etype_info_entry *ref,443krb5_etype_info_entry *var)444{445if (ref->etype != var->etype)446return FALSE;447if (ref->length != var->length)448return FALSE;449if (ref->length > 0 && ref->length != KRB5_ETYPE_NO_SALT)450if (memcmp(ref->salt, var->salt, ref->length) != 0)451return FALSE;452return TRUE;453}454455int456ktest_equal_krb5_pa_enc_ts(krb5_pa_enc_ts *ref, krb5_pa_enc_ts *var)457{458int p = TRUE;459if (ref == var) return TRUE;460else if (ref == NULL || var == NULL) return FALSE;461p = p && scalar_equal(patimestamp);462p = p && scalar_equal(pausec);463return p;464}465466#define equal_str(f) struct_equal(f,ktest_equal_data)467468int469ktest_equal_sam_challenge_2_body(krb5_sam_challenge_2_body *ref,470krb5_sam_challenge_2_body *var)471{472int p = TRUE;473if (ref == var) return TRUE;474else if (ref == NULL || var == NULL) return FALSE;475p = p && scalar_equal(sam_type);476p = p && scalar_equal(sam_flags);477p = p && equal_str(sam_type_name);478p = p && equal_str(sam_track_id);479p = p && equal_str(sam_challenge_label);480p = p && equal_str(sam_challenge);481p = p && equal_str(sam_response_prompt);482p = p && equal_str(sam_pk_for_sad);483p = p && scalar_equal(sam_nonce);484p = p && scalar_equal(sam_etype);485return p;486}487488int489ktest_equal_sam_challenge_2(krb5_sam_challenge_2 *ref,490krb5_sam_challenge_2 *var)491{492int p = TRUE;493if (ref == var) return TRUE;494else if (ref == NULL || var == NULL) return FALSE;495p = p && equal_str(sam_challenge_2_body);496p = p && ptr_equal(sam_cksum,ktest_equal_sequence_of_checksum);497return p;498}499500int501ktest_equal_pa_for_user(krb5_pa_for_user *ref, krb5_pa_for_user *var)502{503int p = TRUE;504if (ref == var) return TRUE;505else if (ref == NULL || var == NULL) return FALSE;506p = p && ptr_equal(user, ktest_equal_principal_data);507p = p && struct_equal(cksum, ktest_equal_checksum);508p = p && equal_str(auth_package);509return p;510}511512int513ktest_equal_pa_s4u_x509_user(krb5_pa_s4u_x509_user *ref,514krb5_pa_s4u_x509_user *var)515{516int p = TRUE;517if (ref == var) return TRUE;518else if (ref == NULL || var == NULL) return FALSE;519p = p && scalar_equal(user_id.nonce);520p = p && ptr_equal(user_id.user,ktest_equal_principal_data);521p = p && struct_equal(user_id.subject_cert,ktest_equal_data);522p = p && scalar_equal(user_id.options);523p = p && struct_equal(cksum,ktest_equal_checksum);524return p;525}526527int528ktest_equal_ad_kdcissued(krb5_ad_kdcissued *ref, krb5_ad_kdcissued *var)529{530int p = TRUE;531if (ref == var) return TRUE;532else if (ref == NULL || var == NULL) return FALSE;533p = p && struct_equal(ad_checksum,ktest_equal_checksum);534p = p && ptr_equal(i_principal,ktest_equal_principal_data);535p = p && ptr_equal(elements,ktest_equal_authorization_data);536return p;537}538539int540ktest_equal_iakerb_header(krb5_iakerb_header *ref, krb5_iakerb_header *var)541{542int p = TRUE;543if (ref == var) return TRUE;544else if (ref == NULL || var == NULL) return FALSE;545p = p && struct_equal(target_realm,ktest_equal_data);546p = p && ptr_equal(cookie,ktest_equal_data);547return p;548}549550int551ktest_equal_iakerb_finished(krb5_iakerb_finished *ref,552krb5_iakerb_finished *var)553{554int p = TRUE;555if (ref == var) return TRUE;556else if (ref == NULL || var == NULL) return FALSE;557p = p && struct_equal(checksum,ktest_equal_checksum);558return p;559}560561static int562ktest_equal_fast_finished(krb5_fast_finished *ref, krb5_fast_finished *var)563{564int p = TRUE;565if (ref == var) return TRUE;566else if (ref == NULL || var == NULL) return FALSE;567p = p && scalar_equal(timestamp);568p = p && scalar_equal(usec);569p = p && ptr_equal(client, ktest_equal_principal_data);570p = p && struct_equal(ticket_checksum, ktest_equal_checksum);571return p;572}573574int575ktest_equal_fast_response(krb5_fast_response *ref, krb5_fast_response *var)576{577int p = TRUE;578if (ref == var) return TRUE;579else if (ref == NULL || var == NULL) return FALSE;580p = p && ptr_equal(padata, ktest_equal_sequence_of_pa_data);581p = p && ptr_equal(strengthen_key, ktest_equal_keyblock);582p = p && ptr_equal(finished, ktest_equal_fast_finished);583p = p && scalar_equal(nonce);584return p;585}586587static int588ktest_equal_algorithm_identifier(krb5_algorithm_identifier *ref,589krb5_algorithm_identifier *var)590{591int p = TRUE;592if (ref == var) return TRUE;593else if (ref == NULL || var == NULL) return FALSE;594p = p && equal_str(algorithm);595p = p && equal_str(parameters);596return p;597}598599int600ktest_equal_otp_tokeninfo(krb5_otp_tokeninfo *ref, krb5_otp_tokeninfo *var)601{602int p = TRUE;603if (ref == var) return TRUE;604else if (ref == NULL || var == NULL) return FALSE;605p = p && scalar_equal(flags);606p = p && equal_str(vendor);607p = p && equal_str(challenge);608p = p && scalar_equal(length);609p = p && scalar_equal(format);610p = p && equal_str(token_id);611p = p && equal_str(alg_id);612p = p && ptr_equal(supported_hash_alg,613ktest_equal_sequence_of_algorithm_identifier);614p = p && scalar_equal(iteration_count);615return p;616}617618int619ktest_equal_pa_otp_challenge(krb5_pa_otp_challenge *ref,620krb5_pa_otp_challenge *var)621{622int p = TRUE;623if (ref == var) return TRUE;624else if (ref == NULL || var == NULL) return FALSE;625p = p && equal_str(nonce);626p = p && equal_str(service);627p = p && ptr_equal(tokeninfo, ktest_equal_sequence_of_otp_tokeninfo);628p = p && equal_str(salt);629p = p && equal_str(s2kparams);630return p;631}632633int634ktest_equal_pa_otp_req(krb5_pa_otp_req *ref, krb5_pa_otp_req *var)635{636int p = TRUE;637if (ref == var) return TRUE;638else if (ref == NULL || var == NULL) return FALSE;639p = p && scalar_equal(flags);640p = p && equal_str(nonce);641p = p && struct_equal(enc_data, ktest_equal_enc_data);642p = p && ptr_equal(hash_alg, ktest_equal_algorithm_identifier);643p = p && scalar_equal(iteration_count);644p = p && equal_str(otp_value);645p = p && equal_str(pin);646p = p && equal_str(challenge);647p = p && scalar_equal(time);648p = p && equal_str(counter);649p = p && scalar_equal(format);650p = p && equal_str(token_id);651p = p && equal_str(alg_id);652p = p && equal_str(vendor);653return p;654}655656#ifdef ENABLE_LDAP657static int658equal_key_data(krb5_key_data *ref, krb5_key_data *var)659{660int p = TRUE;661if (ref == var) return TRUE;662else if (ref == NULL || var == NULL) return FALSE;663p = p && scalar_equal(key_data_type[0]);664p = p && scalar_equal(key_data_type[1]);665p = p && len_equal(key_data_length[0],key_data_contents[0],666ktest_equal_array_of_octet);667p = p && len_equal(key_data_length[1],key_data_contents[1],668ktest_equal_array_of_octet);669return p;670}671672static int673equal_key_data_array(int n, krb5_key_data *ref, krb5_key_data *val)674{675int i, p = TRUE;676for (i = 0; i < n; i++) {677p = p && equal_key_data(ref+i, val+i);678}679return p;680}681682int683ktest_equal_ldap_sequence_of_keys(ldap_seqof_key_data *ref,684ldap_seqof_key_data *var)685{686int p = TRUE;687if (ref == var) return TRUE;688else if (ref == NULL || var == NULL) return FALSE;689p = p && scalar_equal(mkvno);690p = p && scalar_equal(kvno);691p = p && len_equal(n_key_data,key_data,equal_key_data_array);692return p;693}694#endif695696/**** arrays ****************************************************************/697698int699ktest_equal_array_of_data(int length, krb5_data *ref, krb5_data *var)700{701int i,p = TRUE;702703if (length == 0 || ref == var) return TRUE;704else if (ref == NULL || var == NULL) return FALSE;705for (i=0; i<(length); i++) {706p = p && ktest_equal_data(&(ref[i]),&(var[i]));707}708return p;709}710711int712ktest_equal_array_of_octet(unsigned int length, krb5_octet *ref,713krb5_octet *var)714{715unsigned int i, p = TRUE;716717if (length == 0 || ref == var) return TRUE;718else if (ref == NULL || var == NULL) return FALSE;719for (i=0; i<length; i++)720p = p && (ref[i] == var[i]);721return p;722}723724int725ktest_equal_array_of_char(unsigned int length, char *ref, char *var)726{727unsigned int i, p = TRUE;728729if (length == 0 || ref == var) return TRUE;730else if (ref == NULL || var == NULL) return FALSE;731for (i=0; i<length; i++)732p = p && (ref[i] == var[i]);733return p;734}735736int737ktest_equal_array_of_enctype(int length, krb5_enctype *ref, krb5_enctype *var)738{739int i, p = TRUE;740741if (length == 0 || ref == var) return TRUE;742else if (ref == NULL || var == NULL) return FALSE;743for (i=0; i<length; i++)744p = p && (ref[i] == var[i]);745return p;746}747748#define array_compare(comparator) \749int i,p = TRUE; \750if (ref == var) return TRUE; \751if (!ref || !ref[0]) \752return (!var || !var[0]); \753if (!var || !var[0]) return FALSE; \754for (i=0; ref[i] != NULL && var[i] != NULL; i++) \755p = p && comparator(ref[i],var[i]); \756if (ref[i] == NULL && var[i] == NULL) return p; \757else return FALSE758759int760ktest_equal_authorization_data(krb5_authdata **ref, krb5_authdata **var)761{762array_compare(ktest_equal_authdata);763}764765int766ktest_equal_addresses(krb5_address **ref, krb5_address **var)767{768array_compare(ktest_equal_address);769}770771int772ktest_equal_last_req(krb5_last_req_entry **ref, krb5_last_req_entry **var)773{774array_compare(ktest_equal_last_req_entry);775}776777int778ktest_equal_sequence_of_ticket(krb5_ticket **ref, krb5_ticket **var)779{780array_compare(ktest_equal_ticket);781}782783int784ktest_equal_sequence_of_pa_data(krb5_pa_data **ref, krb5_pa_data **var)785{786array_compare(ktest_equal_pa_data);787}788789int790ktest_equal_sequence_of_cred_info(krb5_cred_info **ref, krb5_cred_info **var)791{792array_compare(ktest_equal_cred_info);793}794795int796ktest_equal_sequence_of_principal(krb5_principal *ref, krb5_principal *var)797{798array_compare(ktest_equal_principal_data);799}800801int802ktest_equal_etype_info(krb5_etype_info_entry **ref, krb5_etype_info_entry **var)803{804array_compare(ktest_equal_krb5_etype_info_entry);805}806807int808ktest_equal_sequence_of_checksum(krb5_checksum **ref, krb5_checksum **var)809{810array_compare(ktest_equal_checksum);811}812813int814ktest_equal_sequence_of_algorithm_identifier(krb5_algorithm_identifier **ref,815krb5_algorithm_identifier **var)816{817array_compare(ktest_equal_algorithm_identifier);818}819820int821ktest_equal_sequence_of_otp_tokeninfo(krb5_otp_tokeninfo **ref,822krb5_otp_tokeninfo **var)823{824array_compare(ktest_equal_otp_tokeninfo);825}826827int828ktest_equal_sequence_of_spake_factor(krb5_spake_factor **ref,829krb5_spake_factor **var)830{831array_compare(ktest_equal_spake_factor);832}833834#ifndef DISABLE_PKINIT835836static int837ktest_equal_pk_authenticator(krb5_pk_authenticator *ref,838krb5_pk_authenticator *var)839{840int p = TRUE;841if (ref == var) return TRUE;842else if (ref == NULL || var == NULL) return FALSE;843p = p && scalar_equal(cusec);844p = p && scalar_equal(ctime);845p = p && scalar_equal(nonce);846p = p && data_eq(ref->paChecksum, var->paChecksum);847return p;848}849850static int851ktest_equal_external_principal_identifier(852krb5_external_principal_identifier *ref,853krb5_external_principal_identifier *var)854{855int p = TRUE;856if (ref == var) return TRUE;857else if (ref == NULL || var == NULL) return FALSE;858p = p && equal_str(subjectName);859p = p && equal_str(issuerAndSerialNumber);860p = p && equal_str(subjectKeyIdentifier);861return p;862}863864static int865ktest_equal_sequence_of_external_principal_identifier(866krb5_external_principal_identifier **ref,867krb5_external_principal_identifier **var)868{869array_compare(ktest_equal_external_principal_identifier);870}871872int873ktest_equal_pa_pk_as_req(krb5_pa_pk_as_req *ref, krb5_pa_pk_as_req *var)874{875int p = TRUE;876if (ref == var) return TRUE;877else if (ref == NULL || var == NULL) return FALSE;878p = p && equal_str(signedAuthPack);879p = p && ptr_equal(trustedCertifiers,880ktest_equal_sequence_of_external_principal_identifier);881p = p && equal_str(kdcPkId);882return p;883}884885static int886ktest_equal_dh_rep_info(krb5_dh_rep_info *ref, krb5_dh_rep_info *var)887{888int p = TRUE;889if (ref == var) return TRUE;890else if (ref == NULL || var == NULL) return FALSE;891p = p && equal_str(dhSignedData);892p = p && equal_str(serverDHNonce);893p = p && ptr_equal(kdfID, ktest_equal_data);894return p;895}896897int898ktest_equal_pa_pk_as_rep(krb5_pa_pk_as_rep *ref, krb5_pa_pk_as_rep *var)899{900int p = TRUE;901if (ref == var) return TRUE;902else if (ref == NULL || var == NULL) return FALSE;903if (ref->choice != var->choice) return FALSE;904if (ref->choice == choice_pa_pk_as_rep_dhInfo)905p = p && struct_equal(u.dh_Info, ktest_equal_dh_rep_info);906else if (ref->choice == choice_pa_pk_as_rep_encKeyPack)907p = p && equal_str(u.encKeyPack);908return p;909}910911static int912ktest_equal_sequence_of_data(krb5_data **ref, krb5_data **var)913{914array_compare(ktest_equal_data);915}916917int918ktest_equal_auth_pack(krb5_auth_pack *ref, krb5_auth_pack *var)919{920int p = TRUE;921if (ref == var) return TRUE;922else if (ref == NULL || var == NULL) return FALSE;923p = p && struct_equal(pkAuthenticator, ktest_equal_pk_authenticator);924p = p && equal_str(clientPublicValue);925p = p && ptr_equal(supportedCMSTypes,926ktest_equal_sequence_of_algorithm_identifier);927p = p && equal_str(clientDHNonce);928p = p && ptr_equal(supportedKDFs, ktest_equal_sequence_of_data);929return p;930}931932int933ktest_equal_kdc_dh_key_info(krb5_kdc_dh_key_info *ref,934krb5_kdc_dh_key_info *var)935{936int p = TRUE;937if (ref == var) return TRUE;938else if (ref == NULL || var == NULL) return FALSE;939p = p && equal_str(subjectPublicKey);940p = p && scalar_equal(nonce);941p = p && scalar_equal(dhKeyExpiration);942return p;943}944945int946ktest_equal_reply_key_pack(krb5_reply_key_pack *ref, krb5_reply_key_pack *var)947{948int p = TRUE;949if (ref == var) return TRUE;950else if (ref == NULL || var == NULL) return FALSE;951p = p && struct_equal(replyKey, ktest_equal_keyblock);952p = p && struct_equal(asChecksum, ktest_equal_checksum);953return p;954}955956#endif /* not DISABLE_PKINIT */957958int959ktest_equal_kkdcp_message(krb5_kkdcp_message *ref, krb5_kkdcp_message *var)960{961int p = TRUE;962if (ref == var) return TRUE;963else if (ref == NULL || var == NULL) return FALSE;964p = p && data_eq(ref->kerb_message, var->kerb_message);965p = p && data_eq(ref->target_domain, var->target_domain);966p = p && scalar_equal(dclocator_hint);967return p;968}969970static int971vmac_eq(krb5_verifier_mac *ref, krb5_verifier_mac *var)972{973int p = TRUE;974if (ref == var) return TRUE;975else if (ref == NULL || var == NULL) return FALSE;976p = p && ptr_equal(princ, ktest_equal_principal_data);977p = p && scalar_equal(kvno);978p = p && scalar_equal(enctype);979p = p && struct_equal(checksum, ktest_equal_checksum);980return p;981}982983static int984vmac_list_eq(krb5_verifier_mac **ref, krb5_verifier_mac **var)985{986array_compare(vmac_eq);987}988989int990ktest_equal_cammac(krb5_cammac *ref, krb5_cammac *var)991{992int p = TRUE;993if (ref == var) return TRUE;994else if (ref == NULL || var == NULL) return FALSE;995p = p && ptr_equal(elements, ktest_equal_authorization_data);996p = p && ptr_equal(kdc_verifier, vmac_eq);997p = p && ptr_equal(svc_verifier, vmac_eq);998p = p && ptr_equal(other_verifiers, vmac_list_eq);999return p;1000}10011002int1003ktest_equal_secure_cookie(krb5_secure_cookie *ref, krb5_secure_cookie *var)1004{1005int p = TRUE;1006if (ref == var) return TRUE;1007else if (ref == NULL || var == NULL) return FALSE;1008p = p && ktest_equal_sequence_of_pa_data(ref->data, var->data);1009p = p && scalar_equal(time);1010return p;1011}10121013int1014ktest_equal_spake_factor(krb5_spake_factor *ref, krb5_spake_factor *var)1015{1016int p = TRUE;1017if (ref == var) return TRUE;1018else if (ref == NULL || var == NULL) return FALSE;1019p = p && scalar_equal(type);1020p = p && ptr_equal(data,ktest_equal_data);1021return p;1022}10231024int1025ktest_equal_pa_spake(krb5_pa_spake *ref, krb5_pa_spake *var)1026{1027int p = TRUE;1028if (ref == var) return TRUE;1029else if (ref == NULL || var == NULL) return FALSE;1030else if (ref->choice != var->choice) return FALSE;1031switch (ref->choice) {1032case SPAKE_MSGTYPE_SUPPORT:1033p = p && scalar_equal(u.support.ngroups);1034p = p && (memcmp(ref->u.support.groups,var->u.support.groups,1035ref->u.support.ngroups * sizeof(int32_t)) == 0);1036break;1037case SPAKE_MSGTYPE_CHALLENGE:1038p = p && struct_equal(u.challenge.pubkey,ktest_equal_data);1039p = p && ptr_equal(u.challenge.factors,1040ktest_equal_sequence_of_spake_factor);1041break;1042case SPAKE_MSGTYPE_RESPONSE:1043p = p && struct_equal(u.response.pubkey,ktest_equal_data);1044p = p && struct_equal(u.response.factor,ktest_equal_enc_data);1045break;1046case SPAKE_MSGTYPE_ENCDATA:1047p = p && struct_equal(u.encdata,ktest_equal_enc_data);1048break;1049default:1050break;1051}1052return p;1053}105410551056