Line data Source code
1 : /*-
2 : * Copyright (c) 2005 Doug Rabson
3 : * All rights reserved.
4 : *
5 : * Portions Copyright (c) 2009 Apple Inc. All rights reserved.
6 : *
7 : * Redistribution and use in source and binary forms, with or without
8 : * modification, are permitted provided that the following conditions
9 : * are met:
10 : * 1. Redistributions of source code must retain the above copyright
11 : * notice, this list of conditions and the following disclaimer.
12 : * 2. Redistributions in binary form must reproduce the above copyright
13 : * notice, this list of conditions and the following disclaimer in the
14 : * documentation and/or other materials provided with the distribution.
15 : *
16 : * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 : * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 : * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 : * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 : * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 : * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 : * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 : * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 : * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 : * SUCH DAMAGE.
27 : *
28 : * $FreeBSD: src/lib/libgssapi/gss_compare_name.c,v 1.1 2005/12/29 14:40:20 dfr Exp $
29 : */
30 :
31 : #include "mech_locl.h"
32 :
33 : GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL
34 0 : gss_compare_name(OM_uint32 *minor_status,
35 : gss_const_name_t name1_arg,
36 : gss_const_name_t name2_arg,
37 : int *name_equal)
38 : {
39 0 : struct _gss_name *name1 = (struct _gss_name *) name1_arg;
40 0 : struct _gss_name *name2 = (struct _gss_name *) name2_arg;
41 :
42 : /*
43 : * First check the implementation-independant name if both
44 : * names have one. Otherwise, try to find common mechanism
45 : * names and compare them.
46 : */
47 0 : if (name1->gn_value.value && name2->gn_value.value &&
48 0 : name1->gn_type == GSS_C_NO_OID && name2->gn_type == GSS_C_NO_OID) {
49 0 : *name_equal =
50 0 : name1->gn_value.length == name2->gn_value.length &&
51 0 : memcmp(name1->gn_value.value, name2->gn_value.value,
52 : name1->gn_value.length) == 0;
53 0 : } else if (name1->gn_value.value && name2->gn_value.value &&
54 0 : name1->gn_type != GSS_C_NO_OID &&
55 0 : name2->gn_type != GSS_C_NO_OID) {
56 0 : *name_equal = 1;
57 : /* RFC 2743: anonymous names always compare false */
58 0 : if (gss_oid_equal(name1->gn_type, GSS_C_NT_ANONYMOUS) ||
59 0 : gss_oid_equal(name2->gn_type, GSS_C_NT_ANONYMOUS) ||
60 0 : !gss_oid_equal(name1->gn_type, name2->gn_type)) {
61 0 : *name_equal = 0;
62 0 : } else if (name1->gn_value.length != name2->gn_value.length ||
63 0 : memcmp(name1->gn_value.value, name2->gn_value.value,
64 : name1->gn_value.length) != 0) {
65 0 : *name_equal = 0;
66 : }
67 : } else {
68 0 : struct _gss_mechanism_name *mn1;
69 0 : struct _gss_mechanism_name *mn2;
70 :
71 0 : HEIM_TAILQ_FOREACH(mn1, &name1->gn_mn, gmn_link) {
72 0 : OM_uint32 major_status;
73 :
74 0 : major_status = _gss_find_mn(minor_status, name2,
75 0 : mn1->gmn_mech_oid, &mn2);
76 0 : if (major_status == GSS_S_COMPLETE && mn2) {
77 0 : return (mn1->gmn_mech->gm_compare_name(
78 : minor_status,
79 0 : mn1->gmn_name,
80 0 : mn2->gmn_name,
81 : name_equal));
82 : }
83 : }
84 0 : HEIM_TAILQ_FOREACH(mn2, &name2->gn_mn, gmn_link) {
85 0 : OM_uint32 major_status;
86 :
87 0 : major_status = _gss_find_mn(minor_status, name1,
88 0 : mn2->gmn_mech_oid, &mn1);
89 0 : if (major_status == GSS_S_COMPLETE && mn1) {
90 0 : return (mn2->gmn_mech->gm_compare_name(
91 : minor_status,
92 0 : mn2->gmn_name,
93 0 : mn1->gmn_name,
94 : name_equal));
95 : }
96 : }
97 0 : *name_equal = 0;
98 : }
99 :
100 0 : *minor_status = 0;
101 0 : return (GSS_S_COMPLETE);
102 : }
|