xref: /freebsd/crypto/krb5/src/tests/asn.1/ktest_equal.c (revision 7f2fe78b9dd5f51c821d771b63d2e096f6fd49e9)
1 /* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2 /* tests/asn.1/ktest_equal.c */
3 /*
4  * Copyright (C) 1994 by the Massachusetts Institute of Technology.
5  * All rights reserved.
6  *
7  * Export of this software from the United States of America may
8  *   require a specific license from the United States Government.
9  *   It is the responsibility of any person or organization contemplating
10  *   export to obtain such a license before exporting.
11  *
12  * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
13  * distribute this software and its documentation for any purpose and
14  * without fee is hereby granted, provided that the above copyright
15  * notice appear in all copies and that both that copyright notice and
16  * this permission notice appear in supporting documentation, and that
17  * the name of M.I.T. not be used in advertising or publicity pertaining
18  * to distribution of the software without specific, written prior
19  * permission.  Furthermore if you modify this software you must label
20  * your software as modified software and not distribute it in such a
21  * fashion that it might be confused with the original M.I.T. software.
22  * M.I.T. makes no representations about the suitability of
23  * this software for any purpose.  It is provided "as is" without express
24  * or implied warranty.
25  */
26 
27 #include <stdlib.h>
28 #include <stdio.h>
29 #include "ktest_equal.h"
30 
31 #define FALSE 0
32 #define TRUE 1
33 
34 #define struct_equal(field,comparator)          \
35     comparator(&(ref->field),&(var->field))
36 
37 #define ptr_equal(field,comparator)             \
38     comparator(ref->field,var->field)
39 
40 #define scalar_equal(field)                     \
41     ((ref->field) == (var->field))
42 
43 #define len_equal(length,field,comparator)              \
44     ((ref->length == var->length) &&                    \
45      comparator(ref->length,ref->field,var->field))
46 
47 int
ktest_equal_authenticator(krb5_authenticator * ref,krb5_authenticator * var)48 ktest_equal_authenticator(krb5_authenticator *ref, krb5_authenticator *var)
49 {
50     int p = TRUE;
51 
52     if (ref == var) return TRUE;
53     else if (ref == NULL || var == NULL) return FALSE;
54     p = p && ptr_equal(client,ktest_equal_principal_data);
55     p = p && ptr_equal(checksum,ktest_equal_checksum);
56     p = p && scalar_equal(cusec);
57     p = p && scalar_equal(ctime);
58     p = p && ptr_equal(subkey,ktest_equal_keyblock);
59     p = p && scalar_equal(seq_number);
60     p = p && ptr_equal(authorization_data,ktest_equal_authorization_data);
61     return p;
62 }
63 
64 int
ktest_equal_principal_data(krb5_principal_data * ref,krb5_principal_data * var)65 ktest_equal_principal_data(krb5_principal_data *ref, krb5_principal_data *var)
66 {
67     if (ref == var) return TRUE;
68     else if (ref == NULL || var == NULL) return FALSE;
69     return(struct_equal(realm,ktest_equal_data) &&
70            len_equal(length,data,ktest_equal_array_of_data) &&
71            scalar_equal(type));
72 }
73 
74 int
ktest_equal_authdata(krb5_authdata * ref,krb5_authdata * var)75 ktest_equal_authdata(krb5_authdata *ref, krb5_authdata *var)
76 {
77     if (ref == var) return TRUE;
78     else if (ref == NULL || var == NULL) return FALSE;
79     return(scalar_equal(ad_type) &&
80            len_equal(length,contents,ktest_equal_array_of_octet));
81 }
82 
83 int
ktest_equal_checksum(krb5_checksum * ref,krb5_checksum * var)84 ktest_equal_checksum(krb5_checksum *ref, krb5_checksum *var)
85 {
86     if (ref == var) return TRUE;
87     else if (ref == NULL || var == NULL) return FALSE;
88     return(scalar_equal(checksum_type) && len_equal(length,contents,ktest_equal_array_of_octet));
89 }
90 
91 int
ktest_equal_keyblock(krb5_keyblock * ref,krb5_keyblock * var)92 ktest_equal_keyblock(krb5_keyblock *ref, krb5_keyblock *var)
93 {
94     if (ref == var) return TRUE;
95     else if (ref == NULL || var == NULL) return FALSE;
96     return(scalar_equal(enctype) && len_equal(length,contents,ktest_equal_array_of_octet));
97 }
98 
99 int
ktest_equal_data(krb5_data * ref,krb5_data * var)100 ktest_equal_data(krb5_data *ref, krb5_data *var)
101 {
102     if (ref == var) return TRUE;
103     else if (ref == NULL || var == NULL) return FALSE;
104     return(len_equal(length,data,ktest_equal_array_of_char));
105 }
106 
107 int
ktest_equal_ticket(krb5_ticket * ref,krb5_ticket * var)108 ktest_equal_ticket(krb5_ticket *ref, krb5_ticket *var)
109 {
110     int p = TRUE;
111     if (ref == var) return TRUE;
112     else if (ref == NULL || var == NULL) return FALSE;
113     p = p && ptr_equal(server,ktest_equal_principal_data);
114     p = p && struct_equal(enc_part,ktest_equal_enc_data);
115     /* enc_part2 is irrelevant, as far as the ASN.1 code is concerned */
116     return p;
117 }
118 
119 int
ktest_equal_enc_data(krb5_enc_data * ref,krb5_enc_data * var)120 ktest_equal_enc_data(krb5_enc_data *ref, krb5_enc_data *var)
121 {
122     int p = TRUE;
123     if (ref == var) return TRUE;
124     else if (ref == NULL || var == NULL) return FALSE;
125     p = p && scalar_equal(enctype);
126     p = p && scalar_equal(kvno);
127     p = p && struct_equal(ciphertext,ktest_equal_data);
128     return p;
129 }
130 
131 int
ktest_equal_encryption_key(krb5_keyblock * ref,krb5_keyblock * var)132 ktest_equal_encryption_key(krb5_keyblock *ref, krb5_keyblock *var)
133 {
134     int p = TRUE;
135     if (ref == var) return TRUE;
136     else if (ref == NULL || var == NULL) return FALSE;
137     p = p && scalar_equal(enctype);
138     p = p && len_equal(length,contents,ktest_equal_array_of_octet);
139     return p;
140 }
141 
142 int
ktest_equal_enc_tkt_part(krb5_enc_tkt_part * ref,krb5_enc_tkt_part * var)143 ktest_equal_enc_tkt_part(krb5_enc_tkt_part *ref, krb5_enc_tkt_part *var)
144 {
145     int p = TRUE;
146     if (ref == var) return TRUE;
147     else if (ref == NULL || var == NULL) return FALSE;
148     p = p && scalar_equal(flags);
149     p = p && ptr_equal(session,ktest_equal_encryption_key);
150     p = p && ptr_equal(client,ktest_equal_principal_data);
151     p = p && struct_equal(transited,ktest_equal_transited);
152     p = p && struct_equal(times,ktest_equal_ticket_times);
153     p = p && ptr_equal(caddrs,ktest_equal_addresses);
154     p = p && ptr_equal(authorization_data,ktest_equal_authorization_data);
155     return p;
156 }
157 
158 int
ktest_equal_transited(krb5_transited * ref,krb5_transited * var)159 ktest_equal_transited(krb5_transited *ref, krb5_transited *var)
160 {
161     int p = TRUE;
162     if (ref == var) return TRUE;
163     else if (ref == NULL || var == NULL) return FALSE;
164     p = p && scalar_equal(tr_type);
165     p = p && struct_equal(tr_contents,ktest_equal_data);
166     return p;
167 }
168 
169 int
ktest_equal_ticket_times(krb5_ticket_times * ref,krb5_ticket_times * var)170 ktest_equal_ticket_times(krb5_ticket_times *ref, krb5_ticket_times *var)
171 {
172     int p = TRUE;
173     if (ref == var) return TRUE;
174     else if (ref == NULL || var == NULL) return FALSE;
175     p = p && scalar_equal(authtime);
176     p = p && scalar_equal(starttime);
177     p = p && scalar_equal(endtime);
178     p = p && scalar_equal(renew_till);
179     return p;
180 }
181 
182 int
ktest_equal_address(krb5_address * ref,krb5_address * var)183 ktest_equal_address(krb5_address *ref, krb5_address *var)
184 {
185     int p = TRUE;
186     if (ref == var) return TRUE;
187     else if (ref == NULL || var == NULL) return FALSE;
188     p = p && scalar_equal(addrtype);
189     p = p && len_equal(length,contents,ktest_equal_array_of_octet);
190     return p;
191 }
192 
193 int
ktest_equal_enc_kdc_rep_part(krb5_enc_kdc_rep_part * ref,krb5_enc_kdc_rep_part * var)194 ktest_equal_enc_kdc_rep_part(krb5_enc_kdc_rep_part *ref,
195                              krb5_enc_kdc_rep_part *var)
196 {
197     int p = TRUE;
198     if (ref == var) return TRUE;
199     else if (ref == NULL || var == NULL) return FALSE;
200     p = p && ptr_equal(session,ktest_equal_keyblock);
201     p = p && ptr_equal(last_req,ktest_equal_last_req);
202     p = p && scalar_equal(nonce);
203     p = p && scalar_equal(key_exp);
204     p = p && scalar_equal(flags);
205     p = p && struct_equal(times,ktest_equal_ticket_times);
206     p = p && ptr_equal(server,ktest_equal_principal_data);
207     p = p && ptr_equal(caddrs,ktest_equal_addresses);
208     return p;
209 }
210 
211 int
ktest_equal_priv(krb5_priv * ref,krb5_priv * var)212 ktest_equal_priv(krb5_priv *ref, krb5_priv *var)
213 {
214     int p = TRUE;
215     if (ref == var) return TRUE;
216     else if (ref == NULL || var == NULL) return FALSE;
217     p = p && struct_equal(enc_part,ktest_equal_enc_data);
218     return p;
219 }
220 
221 int
ktest_equal_cred(krb5_cred * ref,krb5_cred * var)222 ktest_equal_cred(krb5_cred *ref, krb5_cred *var)
223 {
224     int p = TRUE;
225     if (ref == var) return TRUE;
226     else if (ref == NULL || var == NULL) return FALSE;
227     p = p && ptr_equal(tickets,ktest_equal_sequence_of_ticket);
228     p = p && struct_equal(enc_part,ktest_equal_enc_data);
229     return p;
230 }
231 
232 int
ktest_equal_error(krb5_error * ref,krb5_error * var)233 ktest_equal_error(krb5_error *ref, krb5_error *var)
234 {
235     int p = TRUE;
236     if (ref == var) return TRUE;
237     else if (ref == NULL || var == NULL) return FALSE;
238     p = p && scalar_equal(ctime);
239     p = p && scalar_equal(cusec);
240     p = p && scalar_equal(susec);
241     p = p && scalar_equal(stime);
242     p = p && scalar_equal(error);
243     p = p && ptr_equal(client,ktest_equal_principal_data);
244     p = p && ptr_equal(server,ktest_equal_principal_data);
245     p = p && struct_equal(text,ktest_equal_data);
246     p = p && struct_equal(e_data,ktest_equal_data);
247     return p;
248 }
249 
250 int
ktest_equal_ap_req(krb5_ap_req * ref,krb5_ap_req * var)251 ktest_equal_ap_req(krb5_ap_req *ref, krb5_ap_req *var)
252 {
253     int p = TRUE;
254     if (ref == var) return TRUE;
255     else if (ref == NULL || var == NULL) return FALSE;
256     p = p && scalar_equal(ap_options);
257     p = p && ptr_equal(ticket,ktest_equal_ticket);
258     p = p && struct_equal(authenticator,ktest_equal_enc_data);
259     return p;
260 }
261 
262 int
ktest_equal_ap_rep(krb5_ap_rep * ref,krb5_ap_rep * var)263 ktest_equal_ap_rep(krb5_ap_rep *ref, krb5_ap_rep *var)
264 {
265     int p = TRUE;
266     if (ref == var) return TRUE;
267     else if (ref == NULL || var == NULL) return FALSE;
268     p = p && struct_equal(enc_part,ktest_equal_enc_data);
269     return p;
270 }
271 
272 int
ktest_equal_ap_rep_enc_part(krb5_ap_rep_enc_part * ref,krb5_ap_rep_enc_part * var)273 ktest_equal_ap_rep_enc_part(krb5_ap_rep_enc_part *ref,
274                             krb5_ap_rep_enc_part *var)
275 {
276     int p = TRUE;
277     if (ref == var) return TRUE;
278     else if (ref == NULL || var == NULL) return FALSE;
279     p = p && scalar_equal(ctime);
280     p = p && scalar_equal(cusec);
281     p = p && ptr_equal(subkey,ktest_equal_encryption_key);
282     p = p && scalar_equal(seq_number);
283     return p;
284 }
285 
286 int
ktest_equal_safe(krb5_safe * ref,krb5_safe * var)287 ktest_equal_safe(krb5_safe *ref, krb5_safe *var)
288 {
289     int p = TRUE;
290     if (ref == var) return TRUE;
291     else if (ref == NULL || var == NULL) return FALSE;
292     p = p && struct_equal(user_data,ktest_equal_data);
293     p = p && scalar_equal(timestamp);
294     p = p && scalar_equal(usec);
295     p = p && scalar_equal(seq_number);
296     p = p && ptr_equal(s_address,ktest_equal_address);
297     p = p && ptr_equal(r_address,ktest_equal_address);
298     p = p && ptr_equal(checksum,ktest_equal_checksum);
299     return p;
300 }
301 
302 
303 int
ktest_equal_enc_cred_part(krb5_cred_enc_part * ref,krb5_cred_enc_part * var)304 ktest_equal_enc_cred_part(krb5_cred_enc_part *ref, krb5_cred_enc_part *var)
305 {
306     int p = TRUE;
307     if (ref == var) return TRUE;
308     else if (ref == NULL || var == NULL) return FALSE;
309     p = p && scalar_equal(nonce);
310     p = p && scalar_equal(timestamp);
311     p = p && scalar_equal(usec);
312     p = p && ptr_equal(s_address,ktest_equal_address);
313     p = p && ptr_equal(r_address,ktest_equal_address);
314     p = p && ptr_equal(ticket_info,ktest_equal_sequence_of_cred_info);
315     return p;
316 }
317 
318 int
ktest_equal_enc_priv_part(krb5_priv_enc_part * ref,krb5_priv_enc_part * var)319 ktest_equal_enc_priv_part(krb5_priv_enc_part *ref, krb5_priv_enc_part *var)
320 {
321     int p = TRUE;
322     if (ref == var) return TRUE;
323     else if (ref == NULL || var == NULL) return FALSE;
324     p = p && struct_equal(user_data,ktest_equal_data);
325     p = p && scalar_equal(timestamp);
326     p = p && scalar_equal(usec);
327     p = p && scalar_equal(seq_number);
328     p = p && ptr_equal(s_address,ktest_equal_address);
329     p = p && ptr_equal(r_address,ktest_equal_address);
330     return p;
331 }
332 
333 int
ktest_equal_as_rep(krb5_kdc_rep * ref,krb5_kdc_rep * var)334 ktest_equal_as_rep(krb5_kdc_rep *ref, krb5_kdc_rep *var)
335 {
336     int p = TRUE;
337     if (ref == var) return TRUE;
338     else if (ref == NULL || var == NULL) return FALSE;
339     p = p && scalar_equal(msg_type);
340     p = p && ptr_equal(padata,ktest_equal_sequence_of_pa_data);
341     p = p && ptr_equal(client,ktest_equal_principal_data);
342     p = p && ptr_equal(ticket,ktest_equal_ticket);
343     p = p && struct_equal(enc_part,ktest_equal_enc_data);
344     p = p && ptr_equal(enc_part2,ktest_equal_enc_kdc_rep_part);
345     return p;
346 }
347 
348 int
ktest_equal_tgs_rep(krb5_kdc_rep * ref,krb5_kdc_rep * var)349 ktest_equal_tgs_rep(krb5_kdc_rep *ref, krb5_kdc_rep *var)
350 {
351     return ktest_equal_as_rep(ref,var);
352 }
353 
354 int
ktest_equal_as_req(krb5_kdc_req * ref,krb5_kdc_req * var)355 ktest_equal_as_req(krb5_kdc_req *ref, krb5_kdc_req *var)
356 {
357     int p = TRUE;
358     if (ref == var) return TRUE;
359     else if (ref == NULL || var == NULL) return FALSE;
360     p = p && scalar_equal(msg_type);
361     p = p && ptr_equal(padata,ktest_equal_sequence_of_pa_data);
362     p = p && scalar_equal(kdc_options);
363     p = p && ptr_equal(client,ktest_equal_principal_data);
364     p = p && ptr_equal(server,ktest_equal_principal_data);
365     p = p && scalar_equal(from);
366     p = p && scalar_equal(till);
367     p = p && scalar_equal(rtime);
368     p = p && scalar_equal(nonce);
369     p = p && len_equal(nktypes,ktype,ktest_equal_array_of_enctype);
370     p = p && ptr_equal(addresses,ktest_equal_addresses);
371     p = p && struct_equal(authorization_data,ktest_equal_enc_data);
372 /* This field isn't actually in the ASN.1 encoding. */
373 /* p = p && ptr_equal(unenc_authdata,ktest_equal_authorization_data); */
374     return p;
375 }
376 
377 int
ktest_equal_tgs_req(krb5_kdc_req * ref,krb5_kdc_req * var)378 ktest_equal_tgs_req(krb5_kdc_req *ref, krb5_kdc_req *var)
379 {
380     return ktest_equal_as_req(ref,var);
381 }
382 
383 int
ktest_equal_kdc_req_body(krb5_kdc_req * ref,krb5_kdc_req * var)384 ktest_equal_kdc_req_body(krb5_kdc_req *ref, krb5_kdc_req *var)
385 {
386     int p = TRUE;
387     if (ref == var) return TRUE;
388     else if (ref == NULL || var == NULL) return FALSE;
389     p = p && scalar_equal(kdc_options);
390     p = p && ptr_equal(client,ktest_equal_principal_data);
391     p = p && ptr_equal(server,ktest_equal_principal_data);
392     p = p && scalar_equal(from);
393     p = p && scalar_equal(till);
394     p = p && scalar_equal(rtime);
395     p = p && scalar_equal(nonce);
396     p = p && len_equal(nktypes,ktype,ktest_equal_array_of_enctype);
397     p = p && ptr_equal(addresses,ktest_equal_addresses);
398     p = p && struct_equal(authorization_data,ktest_equal_enc_data);
399     /* This isn't part of the ASN.1 encoding. */
400     /* p = p && ptr_equal(unenc_authdata,ktest_equal_authorization_data); */
401     return p;
402 }
403 
404 int
ktest_equal_last_req_entry(krb5_last_req_entry * ref,krb5_last_req_entry * var)405 ktest_equal_last_req_entry(krb5_last_req_entry *ref, krb5_last_req_entry *var)
406 {
407     int p = TRUE;
408     if (ref == var) return TRUE;
409     else if (ref == NULL || var == NULL) return FALSE;
410     p = p && scalar_equal(lr_type);
411     p = p && scalar_equal(value);
412     return p;
413 }
414 
415 int
ktest_equal_pa_data(krb5_pa_data * ref,krb5_pa_data * var)416 ktest_equal_pa_data(krb5_pa_data *ref, krb5_pa_data *var)
417 {
418     int p = TRUE;
419     if (ref == var) return TRUE;
420     else if (ref == NULL || var == NULL) return FALSE;
421     p = p && scalar_equal(pa_type);
422     p = p && len_equal(length,contents,ktest_equal_array_of_octet);
423     return p;
424 }
425 
426 int
ktest_equal_cred_info(krb5_cred_info * ref,krb5_cred_info * var)427 ktest_equal_cred_info(krb5_cred_info *ref, krb5_cred_info *var)
428 {
429     int p = TRUE;
430     if (ref == var) return TRUE;
431     else if (ref == NULL || var == NULL) return FALSE;
432     p = p && ptr_equal(session,ktest_equal_keyblock);
433     p = p && ptr_equal(client,ktest_equal_principal_data);
434     p = p && ptr_equal(server,ktest_equal_principal_data);
435     p = p && scalar_equal(flags);
436     p = p && struct_equal(times,ktest_equal_ticket_times);
437     p = p && ptr_equal(caddrs,ktest_equal_addresses);
438 
439     return p;
440 }
441 
442 int
ktest_equal_krb5_etype_info_entry(krb5_etype_info_entry * ref,krb5_etype_info_entry * var)443 ktest_equal_krb5_etype_info_entry(krb5_etype_info_entry *ref,
444                                   krb5_etype_info_entry *var)
445 {
446     if (ref->etype != var->etype)
447         return FALSE;
448     if (ref->length != var->length)
449         return FALSE;
450     if (ref->length > 0 && ref->length != KRB5_ETYPE_NO_SALT)
451         if (memcmp(ref->salt, var->salt, ref->length) != 0)
452             return FALSE;
453     return TRUE;
454 }
455 
456 int
ktest_equal_krb5_pa_enc_ts(krb5_pa_enc_ts * ref,krb5_pa_enc_ts * var)457 ktest_equal_krb5_pa_enc_ts(krb5_pa_enc_ts *ref, krb5_pa_enc_ts *var)
458 {
459     int p = TRUE;
460     if (ref == var) return TRUE;
461     else if (ref == NULL || var == NULL) return FALSE;
462     p = p && scalar_equal(patimestamp);
463     p = p && scalar_equal(pausec);
464     return p;
465 }
466 
467 #define equal_str(f) struct_equal(f,ktest_equal_data)
468 
469 int
ktest_equal_sam_challenge_2_body(krb5_sam_challenge_2_body * ref,krb5_sam_challenge_2_body * var)470 ktest_equal_sam_challenge_2_body(krb5_sam_challenge_2_body *ref,
471                                  krb5_sam_challenge_2_body *var)
472 {
473     int p = TRUE;
474     if (ref == var) return TRUE;
475     else if (ref == NULL || var == NULL) return FALSE;
476     p = p && scalar_equal(sam_type);
477     p = p && scalar_equal(sam_flags);
478     p = p && equal_str(sam_type_name);
479     p = p && equal_str(sam_track_id);
480     p = p && equal_str(sam_challenge_label);
481     p = p && equal_str(sam_challenge);
482     p = p && equal_str(sam_response_prompt);
483     p = p && equal_str(sam_pk_for_sad);
484     p = p && scalar_equal(sam_nonce);
485     p = p && scalar_equal(sam_etype);
486     return p;
487 }
488 
489 int
ktest_equal_sam_challenge_2(krb5_sam_challenge_2 * ref,krb5_sam_challenge_2 * var)490 ktest_equal_sam_challenge_2(krb5_sam_challenge_2 *ref,
491                             krb5_sam_challenge_2 *var)
492 {
493     int p = TRUE;
494     if (ref == var) return TRUE;
495     else if (ref == NULL || var == NULL) return FALSE;
496     p = p && equal_str(sam_challenge_2_body);
497     p = p && ptr_equal(sam_cksum,ktest_equal_sequence_of_checksum);
498     return p;
499 }
500 
501 int
ktest_equal_pa_for_user(krb5_pa_for_user * ref,krb5_pa_for_user * var)502 ktest_equal_pa_for_user(krb5_pa_for_user *ref, krb5_pa_for_user *var)
503 {
504     int p = TRUE;
505     if (ref == var) return TRUE;
506     else if (ref == NULL || var == NULL) return FALSE;
507     p = p && ptr_equal(user, ktest_equal_principal_data);
508     p = p && struct_equal(cksum, ktest_equal_checksum);
509     p = p && equal_str(auth_package);
510     return p;
511 }
512 
513 int
ktest_equal_pa_s4u_x509_user(krb5_pa_s4u_x509_user * ref,krb5_pa_s4u_x509_user * var)514 ktest_equal_pa_s4u_x509_user(krb5_pa_s4u_x509_user *ref,
515                              krb5_pa_s4u_x509_user *var)
516 {
517     int p = TRUE;
518     if (ref == var) return TRUE;
519     else if (ref == NULL || var == NULL) return FALSE;
520     p = p && scalar_equal(user_id.nonce);
521     p = p && ptr_equal(user_id.user,ktest_equal_principal_data);
522     p = p && struct_equal(user_id.subject_cert,ktest_equal_data);
523     p = p && scalar_equal(user_id.options);
524     p = p && struct_equal(cksum,ktest_equal_checksum);
525     return p;
526 }
527 
528 int
ktest_equal_ad_kdcissued(krb5_ad_kdcissued * ref,krb5_ad_kdcissued * var)529 ktest_equal_ad_kdcissued(krb5_ad_kdcissued *ref, krb5_ad_kdcissued *var)
530 {
531     int p = TRUE;
532     if (ref == var) return TRUE;
533     else if (ref == NULL || var == NULL) return FALSE;
534     p = p && struct_equal(ad_checksum,ktest_equal_checksum);
535     p = p && ptr_equal(i_principal,ktest_equal_principal_data);
536     p = p && ptr_equal(elements,ktest_equal_authorization_data);
537     return p;
538 }
539 
540 int
ktest_equal_iakerb_header(krb5_iakerb_header * ref,krb5_iakerb_header * var)541 ktest_equal_iakerb_header(krb5_iakerb_header *ref, krb5_iakerb_header *var)
542 {
543     int p = TRUE;
544     if (ref == var) return TRUE;
545     else if (ref == NULL || var == NULL) return FALSE;
546     p = p && struct_equal(target_realm,ktest_equal_data);
547     p = p && ptr_equal(cookie,ktest_equal_data);
548     return p;
549 }
550 
551 int
ktest_equal_iakerb_finished(krb5_iakerb_finished * ref,krb5_iakerb_finished * var)552 ktest_equal_iakerb_finished(krb5_iakerb_finished *ref,
553                             krb5_iakerb_finished *var)
554 {
555     int p = TRUE;
556     if (ref == var) return TRUE;
557     else if (ref == NULL || var == NULL) return FALSE;
558     p = p && struct_equal(checksum,ktest_equal_checksum);
559     return p;
560 }
561 
562 static int
ktest_equal_fast_finished(krb5_fast_finished * ref,krb5_fast_finished * var)563 ktest_equal_fast_finished(krb5_fast_finished *ref, krb5_fast_finished *var)
564 {
565     int p = TRUE;
566     if (ref == var) return TRUE;
567     else if (ref == NULL || var == NULL) return FALSE;
568     p = p && scalar_equal(timestamp);
569     p = p && scalar_equal(usec);
570     p = p && ptr_equal(client, ktest_equal_principal_data);
571     p = p && struct_equal(ticket_checksum, ktest_equal_checksum);
572     return p;
573 }
574 
575 int
ktest_equal_fast_response(krb5_fast_response * ref,krb5_fast_response * var)576 ktest_equal_fast_response(krb5_fast_response *ref, krb5_fast_response *var)
577 {
578     int p = TRUE;
579     if (ref == var) return TRUE;
580     else if (ref == NULL || var == NULL) return FALSE;
581     p = p && ptr_equal(padata, ktest_equal_sequence_of_pa_data);
582     p = p && ptr_equal(strengthen_key, ktest_equal_keyblock);
583     p = p && ptr_equal(finished, ktest_equal_fast_finished);
584     p = p && scalar_equal(nonce);
585     return p;
586 }
587 
588 static int
ktest_equal_algorithm_identifier(krb5_algorithm_identifier * ref,krb5_algorithm_identifier * var)589 ktest_equal_algorithm_identifier(krb5_algorithm_identifier *ref,
590                                  krb5_algorithm_identifier *var)
591 {
592     int p = TRUE;
593     if (ref == var) return TRUE;
594     else if (ref == NULL || var == NULL) return FALSE;
595     p = p && equal_str(algorithm);
596     p = p && equal_str(parameters);
597     return p;
598 }
599 
600 int
ktest_equal_otp_tokeninfo(krb5_otp_tokeninfo * ref,krb5_otp_tokeninfo * var)601 ktest_equal_otp_tokeninfo(krb5_otp_tokeninfo *ref, krb5_otp_tokeninfo *var)
602 {
603     int p = TRUE;
604     if (ref == var) return TRUE;
605     else if (ref == NULL || var == NULL) return FALSE;
606     p = p && scalar_equal(flags);
607     p = p && equal_str(vendor);
608     p = p && equal_str(challenge);
609     p = p && scalar_equal(length);
610     p = p && scalar_equal(format);
611     p = p && equal_str(token_id);
612     p = p && equal_str(alg_id);
613     p = p && ptr_equal(supported_hash_alg,
614                        ktest_equal_sequence_of_algorithm_identifier);
615     p = p && scalar_equal(iteration_count);
616     return p;
617 }
618 
619 int
ktest_equal_pa_otp_challenge(krb5_pa_otp_challenge * ref,krb5_pa_otp_challenge * var)620 ktest_equal_pa_otp_challenge(krb5_pa_otp_challenge *ref,
621                              krb5_pa_otp_challenge *var)
622 {
623     int p = TRUE;
624     if (ref == var) return TRUE;
625     else if (ref == NULL || var == NULL) return FALSE;
626     p = p && equal_str(nonce);
627     p = p && equal_str(service);
628     p = p && ptr_equal(tokeninfo, ktest_equal_sequence_of_otp_tokeninfo);
629     p = p && equal_str(salt);
630     p = p && equal_str(s2kparams);
631     return p;
632 }
633 
634 int
ktest_equal_pa_otp_req(krb5_pa_otp_req * ref,krb5_pa_otp_req * var)635 ktest_equal_pa_otp_req(krb5_pa_otp_req *ref, krb5_pa_otp_req *var)
636 {
637     int p = TRUE;
638     if (ref == var) return TRUE;
639     else if (ref == NULL || var == NULL) return FALSE;
640     p = p && scalar_equal(flags);
641     p = p && equal_str(nonce);
642     p = p && struct_equal(enc_data, ktest_equal_enc_data);
643     p = p && ptr_equal(hash_alg, ktest_equal_algorithm_identifier);
644     p = p && scalar_equal(iteration_count);
645     p = p && equal_str(otp_value);
646     p = p && equal_str(pin);
647     p = p && equal_str(challenge);
648     p = p && scalar_equal(time);
649     p = p && equal_str(counter);
650     p = p && scalar_equal(format);
651     p = p && equal_str(token_id);
652     p = p && equal_str(alg_id);
653     p = p && equal_str(vendor);
654     return p;
655 }
656 
657 #ifdef ENABLE_LDAP
658 static int
equal_key_data(krb5_key_data * ref,krb5_key_data * var)659 equal_key_data(krb5_key_data *ref, krb5_key_data *var)
660 {
661     int p = TRUE;
662     if (ref == var) return TRUE;
663     else if (ref == NULL || var == NULL) return FALSE;
664     p = p && scalar_equal(key_data_type[0]);
665     p = p && scalar_equal(key_data_type[1]);
666     p = p && len_equal(key_data_length[0],key_data_contents[0],
667                    ktest_equal_array_of_octet);
668     p = p && len_equal(key_data_length[1],key_data_contents[1],
669                    ktest_equal_array_of_octet);
670     return p;
671 }
672 
673 static int
equal_key_data_array(int n,krb5_key_data * ref,krb5_key_data * val)674 equal_key_data_array(int n, krb5_key_data *ref, krb5_key_data *val)
675 {
676     int i, p = TRUE;
677     for (i = 0; i < n; i++) {
678         p = p && equal_key_data(ref+i, val+i);
679     }
680     return p;
681 }
682 
683 int
ktest_equal_ldap_sequence_of_keys(ldap_seqof_key_data * ref,ldap_seqof_key_data * var)684 ktest_equal_ldap_sequence_of_keys(ldap_seqof_key_data *ref,
685                                   ldap_seqof_key_data *var)
686 {
687     int p = TRUE;
688     if (ref == var) return TRUE;
689     else if (ref == NULL || var == NULL) return FALSE;
690     p = p && scalar_equal(mkvno);
691     p = p && scalar_equal(kvno);
692     p = p && len_equal(n_key_data,key_data,equal_key_data_array);
693     return p;
694 }
695 #endif
696 
697 /**** arrays ****************************************************************/
698 
699 int
ktest_equal_array_of_data(int length,krb5_data * ref,krb5_data * var)700 ktest_equal_array_of_data(int length, krb5_data *ref, krb5_data *var)
701 {
702     int i,p = TRUE;
703 
704     if (length == 0 || ref == var) return TRUE;
705     else if (ref == NULL || var == NULL) return FALSE;
706     for (i=0; i<(length); i++) {
707         p = p && ktest_equal_data(&(ref[i]),&(var[i]));
708     }
709     return p;
710 }
711 
712 int
ktest_equal_array_of_octet(unsigned int length,krb5_octet * ref,krb5_octet * var)713 ktest_equal_array_of_octet(unsigned int length, krb5_octet *ref,
714                            krb5_octet *var)
715 {
716     unsigned int i, p = TRUE;
717 
718     if (length == 0 || ref == var) return TRUE;
719     else if (ref == NULL || var == NULL) return FALSE;
720     for (i=0; i<length; i++)
721         p = p && (ref[i] == var[i]);
722     return p;
723 }
724 
725 int
ktest_equal_array_of_char(unsigned int length,char * ref,char * var)726 ktest_equal_array_of_char(unsigned int length, char *ref, char *var)
727 {
728     unsigned int i, p = TRUE;
729 
730     if (length == 0 || ref == var) return TRUE;
731     else if (ref == NULL || var == NULL) return FALSE;
732     for (i=0; i<length; i++)
733         p = p && (ref[i] == var[i]);
734     return p;
735 }
736 
737 int
ktest_equal_array_of_enctype(int length,krb5_enctype * ref,krb5_enctype * var)738 ktest_equal_array_of_enctype(int length, krb5_enctype *ref, krb5_enctype *var)
739 {
740     int i, p = TRUE;
741 
742     if (length == 0 || ref == var) return TRUE;
743     else if (ref == NULL || var == NULL) return FALSE;
744     for (i=0; i<length; i++)
745         p = p && (ref[i] == var[i]);
746     return p;
747 }
748 
749 #define array_compare(comparator)                       \
750     int i,p = TRUE;                                       \
751     if (ref == var) return TRUE;                          \
752     if (!ref || !ref[0])                                \
753         return (!var || !var[0]);                       \
754     if (!var || !var[0]) return FALSE;                  \
755     for (i=0; ref[i] != NULL && var[i] != NULL; i++)    \
756         p = p && comparator(ref[i],var[i]);             \
757     if (ref[i] == NULL && var[i] == NULL) return p;     \
758     else return FALSE
759 
760 int
ktest_equal_authorization_data(krb5_authdata ** ref,krb5_authdata ** var)761 ktest_equal_authorization_data(krb5_authdata **ref, krb5_authdata **var)
762 {
763     array_compare(ktest_equal_authdata);
764 }
765 
766 int
ktest_equal_addresses(krb5_address ** ref,krb5_address ** var)767 ktest_equal_addresses(krb5_address **ref, krb5_address **var)
768 {
769     array_compare(ktest_equal_address);
770 }
771 
772 int
ktest_equal_last_req(krb5_last_req_entry ** ref,krb5_last_req_entry ** var)773 ktest_equal_last_req(krb5_last_req_entry **ref, krb5_last_req_entry **var)
774 {
775     array_compare(ktest_equal_last_req_entry);
776 }
777 
778 int
ktest_equal_sequence_of_ticket(krb5_ticket ** ref,krb5_ticket ** var)779 ktest_equal_sequence_of_ticket(krb5_ticket **ref, krb5_ticket **var)
780 {
781     array_compare(ktest_equal_ticket);
782 }
783 
784 int
ktest_equal_sequence_of_pa_data(krb5_pa_data ** ref,krb5_pa_data ** var)785 ktest_equal_sequence_of_pa_data(krb5_pa_data **ref, krb5_pa_data **var)
786 {
787     array_compare(ktest_equal_pa_data);
788 }
789 
790 int
ktest_equal_sequence_of_cred_info(krb5_cred_info ** ref,krb5_cred_info ** var)791 ktest_equal_sequence_of_cred_info(krb5_cred_info **ref, krb5_cred_info **var)
792 {
793     array_compare(ktest_equal_cred_info);
794 }
795 
796 int
ktest_equal_sequence_of_principal(krb5_principal * ref,krb5_principal * var)797 ktest_equal_sequence_of_principal(krb5_principal *ref, krb5_principal *var)
798 {
799     array_compare(ktest_equal_principal_data);
800 }
801 
802 int
ktest_equal_etype_info(krb5_etype_info_entry ** ref,krb5_etype_info_entry ** var)803 ktest_equal_etype_info(krb5_etype_info_entry **ref, krb5_etype_info_entry **var)
804 {
805     array_compare(ktest_equal_krb5_etype_info_entry);
806 }
807 
808 int
ktest_equal_sequence_of_checksum(krb5_checksum ** ref,krb5_checksum ** var)809 ktest_equal_sequence_of_checksum(krb5_checksum **ref, krb5_checksum **var)
810 {
811     array_compare(ktest_equal_checksum);
812 }
813 
814 int
ktest_equal_sequence_of_algorithm_identifier(krb5_algorithm_identifier ** ref,krb5_algorithm_identifier ** var)815 ktest_equal_sequence_of_algorithm_identifier(krb5_algorithm_identifier **ref,
816                                              krb5_algorithm_identifier **var)
817 {
818     array_compare(ktest_equal_algorithm_identifier);
819 }
820 
821 int
ktest_equal_sequence_of_otp_tokeninfo(krb5_otp_tokeninfo ** ref,krb5_otp_tokeninfo ** var)822 ktest_equal_sequence_of_otp_tokeninfo(krb5_otp_tokeninfo **ref,
823                                       krb5_otp_tokeninfo **var)
824 {
825     array_compare(ktest_equal_otp_tokeninfo);
826 }
827 
828 int
ktest_equal_sequence_of_spake_factor(krb5_spake_factor ** ref,krb5_spake_factor ** var)829 ktest_equal_sequence_of_spake_factor(krb5_spake_factor **ref,
830                                      krb5_spake_factor **var)
831 {
832     array_compare(ktest_equal_spake_factor);
833 }
834 
835 #ifndef DISABLE_PKINIT
836 
837 static int
ktest_equal_pk_authenticator(krb5_pk_authenticator * ref,krb5_pk_authenticator * var)838 ktest_equal_pk_authenticator(krb5_pk_authenticator *ref,
839                              krb5_pk_authenticator *var)
840 {
841     int p = TRUE;
842     if (ref == var) return TRUE;
843     else if (ref == NULL || var == NULL) return FALSE;
844     p = p && scalar_equal(cusec);
845     p = p && scalar_equal(ctime);
846     p = p && scalar_equal(nonce);
847     p = p && struct_equal(paChecksum, ktest_equal_checksum);
848     return p;
849 }
850 
851 static int
ktest_equal_external_principal_identifier(krb5_external_principal_identifier * ref,krb5_external_principal_identifier * var)852 ktest_equal_external_principal_identifier(
853     krb5_external_principal_identifier *ref,
854     krb5_external_principal_identifier *var)
855 {
856     int p = TRUE;
857     if (ref == var) return TRUE;
858     else if (ref == NULL || var == NULL) return FALSE;
859     p = p && equal_str(subjectName);
860     p = p && equal_str(issuerAndSerialNumber);
861     p = p && equal_str(subjectKeyIdentifier);
862     return p;
863 }
864 
865 static int
ktest_equal_sequence_of_external_principal_identifier(krb5_external_principal_identifier ** ref,krb5_external_principal_identifier ** var)866 ktest_equal_sequence_of_external_principal_identifier(
867     krb5_external_principal_identifier **ref,
868     krb5_external_principal_identifier **var)
869 {
870     array_compare(ktest_equal_external_principal_identifier);
871 }
872 
873 int
ktest_equal_pa_pk_as_req(krb5_pa_pk_as_req * ref,krb5_pa_pk_as_req * var)874 ktest_equal_pa_pk_as_req(krb5_pa_pk_as_req *ref, krb5_pa_pk_as_req *var)
875 {
876     int p = TRUE;
877     if (ref == var) return TRUE;
878     else if (ref == NULL || var == NULL) return FALSE;
879     p = p && equal_str(signedAuthPack);
880     p = p && ptr_equal(trustedCertifiers,
881                        ktest_equal_sequence_of_external_principal_identifier);
882     p = p && equal_str(kdcPkId);
883     return p;
884 }
885 
886 static int
ktest_equal_dh_rep_info(krb5_dh_rep_info * ref,krb5_dh_rep_info * var)887 ktest_equal_dh_rep_info(krb5_dh_rep_info *ref, krb5_dh_rep_info *var)
888 {
889     int p = TRUE;
890     if (ref == var) return TRUE;
891     else if (ref == NULL || var == NULL) return FALSE;
892     p = p && equal_str(dhSignedData);
893     p = p && equal_str(serverDHNonce);
894     p = p && ptr_equal(kdfID, ktest_equal_data);
895     return p;
896 }
897 
898 int
ktest_equal_pa_pk_as_rep(krb5_pa_pk_as_rep * ref,krb5_pa_pk_as_rep * var)899 ktest_equal_pa_pk_as_rep(krb5_pa_pk_as_rep *ref, krb5_pa_pk_as_rep *var)
900 {
901     int p = TRUE;
902     if (ref == var) return TRUE;
903     else if (ref == NULL || var == NULL) return FALSE;
904     if (ref->choice != var->choice) return FALSE;
905     if (ref->choice == choice_pa_pk_as_rep_dhInfo)
906         p = p && struct_equal(u.dh_Info, ktest_equal_dh_rep_info);
907     else if (ref->choice == choice_pa_pk_as_rep_encKeyPack)
908         p = p && equal_str(u.encKeyPack);
909     return p;
910 }
911 
912 static int
ktest_equal_sequence_of_data(krb5_data ** ref,krb5_data ** var)913 ktest_equal_sequence_of_data(krb5_data **ref, krb5_data **var)
914 {
915     array_compare(ktest_equal_data);
916 }
917 
918 int
ktest_equal_auth_pack(krb5_auth_pack * ref,krb5_auth_pack * var)919 ktest_equal_auth_pack(krb5_auth_pack *ref, krb5_auth_pack *var)
920 {
921     int p = TRUE;
922     if (ref == var) return TRUE;
923     else if (ref == NULL || var == NULL) return FALSE;
924     p = p && struct_equal(pkAuthenticator, ktest_equal_pk_authenticator);
925     p = p && equal_str(clientPublicValue);
926     p = p && ptr_equal(supportedCMSTypes,
927                        ktest_equal_sequence_of_algorithm_identifier);
928     p = p && equal_str(clientDHNonce);
929     p = p && ptr_equal(supportedKDFs, ktest_equal_sequence_of_data);
930     return p;
931 }
932 
933 int
ktest_equal_kdc_dh_key_info(krb5_kdc_dh_key_info * ref,krb5_kdc_dh_key_info * var)934 ktest_equal_kdc_dh_key_info(krb5_kdc_dh_key_info *ref,
935                             krb5_kdc_dh_key_info *var)
936 {
937     int p = TRUE;
938     if (ref == var) return TRUE;
939     else if (ref == NULL || var == NULL) return FALSE;
940     p = p && equal_str(subjectPublicKey);
941     p = p && scalar_equal(nonce);
942     p = p && scalar_equal(dhKeyExpiration);
943     return p;
944 }
945 
946 int
ktest_equal_reply_key_pack(krb5_reply_key_pack * ref,krb5_reply_key_pack * var)947 ktest_equal_reply_key_pack(krb5_reply_key_pack *ref, krb5_reply_key_pack *var)
948 {
949     int p = TRUE;
950     if (ref == var) return TRUE;
951     else if (ref == NULL || var == NULL) return FALSE;
952     p = p && struct_equal(replyKey, ktest_equal_keyblock);
953     p = p && struct_equal(asChecksum, ktest_equal_checksum);
954     return p;
955 }
956 
957 #endif /* not DISABLE_PKINIT */
958 
959 int
ktest_equal_kkdcp_message(krb5_kkdcp_message * ref,krb5_kkdcp_message * var)960 ktest_equal_kkdcp_message(krb5_kkdcp_message *ref, krb5_kkdcp_message *var)
961 {
962     int p = TRUE;
963     if (ref == var) return TRUE;
964     else if (ref == NULL || var == NULL) return FALSE;
965     p = p && data_eq(ref->kerb_message, var->kerb_message);
966     p = p && data_eq(ref->target_domain, var->target_domain);
967     p = p && scalar_equal(dclocator_hint);
968     return p;
969 }
970 
971 static int
vmac_eq(krb5_verifier_mac * ref,krb5_verifier_mac * var)972 vmac_eq(krb5_verifier_mac *ref, krb5_verifier_mac *var)
973 {
974     int p = TRUE;
975     if (ref == var) return TRUE;
976     else if (ref == NULL || var == NULL) return FALSE;
977     p = p && ptr_equal(princ, ktest_equal_principal_data);
978     p = p && scalar_equal(kvno);
979     p = p && scalar_equal(enctype);
980     p = p && struct_equal(checksum, ktest_equal_checksum);
981     return p;
982 }
983 
984 static int
vmac_list_eq(krb5_verifier_mac ** ref,krb5_verifier_mac ** var)985 vmac_list_eq(krb5_verifier_mac **ref, krb5_verifier_mac **var)
986 {
987     array_compare(vmac_eq);
988 }
989 
990 int
ktest_equal_cammac(krb5_cammac * ref,krb5_cammac * var)991 ktest_equal_cammac(krb5_cammac *ref, krb5_cammac *var)
992 {
993     int p = TRUE;
994     if (ref == var) return TRUE;
995     else if (ref == NULL || var == NULL) return FALSE;
996     p = p && ptr_equal(elements, ktest_equal_authorization_data);
997     p = p && ptr_equal(kdc_verifier, vmac_eq);
998     p = p && ptr_equal(svc_verifier, vmac_eq);
999     p = p && ptr_equal(other_verifiers, vmac_list_eq);
1000     return p;
1001 }
1002 
1003 int
ktest_equal_secure_cookie(krb5_secure_cookie * ref,krb5_secure_cookie * var)1004 ktest_equal_secure_cookie(krb5_secure_cookie *ref, krb5_secure_cookie *var)
1005 {
1006     int p = TRUE;
1007     if (ref == var) return TRUE;
1008     else if (ref == NULL || var == NULL) return FALSE;
1009     p = p && ktest_equal_sequence_of_pa_data(ref->data, var->data);
1010     p = p && scalar_equal(time);
1011     return p;
1012 }
1013 
1014 int
ktest_equal_spake_factor(krb5_spake_factor * ref,krb5_spake_factor * var)1015 ktest_equal_spake_factor(krb5_spake_factor *ref, krb5_spake_factor *var)
1016 {
1017     int p = TRUE;
1018     if (ref == var) return TRUE;
1019     else if (ref == NULL || var == NULL) return FALSE;
1020     p = p && scalar_equal(type);
1021     p = p && ptr_equal(data,ktest_equal_data);
1022     return p;
1023 }
1024 
1025 int
ktest_equal_pa_spake(krb5_pa_spake * ref,krb5_pa_spake * var)1026 ktest_equal_pa_spake(krb5_pa_spake *ref, krb5_pa_spake *var)
1027 {
1028     int p = TRUE;
1029     if (ref == var) return TRUE;
1030     else if (ref == NULL || var == NULL) return FALSE;
1031     else if (ref->choice != var->choice) return FALSE;
1032     switch (ref->choice) {
1033     case SPAKE_MSGTYPE_SUPPORT:
1034         p = p && scalar_equal(u.support.ngroups);
1035         p = p && (memcmp(ref->u.support.groups,var->u.support.groups,
1036                          ref->u.support.ngroups * sizeof(int32_t)) == 0);
1037         break;
1038     case SPAKE_MSGTYPE_CHALLENGE:
1039         p = p && struct_equal(u.challenge.pubkey,ktest_equal_data);
1040         p = p && ptr_equal(u.challenge.factors,
1041                            ktest_equal_sequence_of_spake_factor);
1042         break;
1043     case SPAKE_MSGTYPE_RESPONSE:
1044         p = p && struct_equal(u.response.pubkey,ktest_equal_data);
1045         p = p && struct_equal(u.response.factor,ktest_equal_enc_data);
1046         break;
1047     case SPAKE_MSGTYPE_ENCDATA:
1048         p = p && struct_equal(u.encdata,ktest_equal_enc_data);
1049         break;
1050     default:
1051         break;
1052     }
1053     return p;
1054 }
1055