Branch data Line data Source code
1 : : /* meta.c --- Implementation of function selection depending on mechanism.
2 : : * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Simon Josefsson
3 : : *
4 : : * This file is part of the Generic Security Service (GSS).
5 : : *
6 : : * GSS is free software; you can redistribute it and/or modify it
7 : : * under the terms of the GNU General Public License as published by
8 : : * the Free Software Foundation; either version 3 of the License, or
9 : : * (at your option) any later version.
10 : : *
11 : : * GSS is distributed in the hope that it will be useful, but WITHOUT
12 : : * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 : : * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
14 : : * License for more details.
15 : : *
16 : : * You should have received a copy of the GNU General Public License
17 : : * along with GSS; if not, see http://www.gnu.org/licenses or write to
18 : : * the Free Software Foundation, Inc., 51 Franklin Street, Fifth
19 : : * Floor, Boston, MA 02110-1301, USA.
20 : : *
21 : : */
22 : :
23 : : #include "internal.h"
24 : : #include "meta.h"
25 : :
26 : : #ifdef USE_KERBEROS5
27 : : # include <gss/krb5.h>
28 : : # include "krb5/protos.h"
29 : : #endif
30 : :
31 : : static _gss_mech_api_desc _gss_mech_apis[] = {
32 : : #ifdef USE_KERBEROS5
33 : : {
34 : : &GSS_KRB5_static,
35 : : "GS2-KRB5",
36 : : "Kerberos V5",
37 : : N_("Kerberos V5 GSS-API mechanism"),
38 : : {
39 : : /* Mandatory name-types. */
40 : : &GSS_KRB5_NT_PRINCIPAL_NAME_static,
41 : : &GSS_C_NT_HOSTBASED_SERVICE_static,
42 : : &GSS_C_NT_EXPORT_NAME_static},
43 : : gss_krb5_init_sec_context,
44 : : gss_krb5_canonicalize_name,
45 : : gss_krb5_export_name,
46 : : gss_krb5_wrap,
47 : : gss_krb5_unwrap,
48 : : gss_krb5_get_mic,
49 : : gss_krb5_verify_mic,
50 : : gss_krb5_display_status,
51 : : gss_krb5_acquire_cred,
52 : : gss_krb5_release_cred,
53 : : gss_krb5_accept_sec_context,
54 : : gss_krb5_delete_sec_context,
55 : : gss_krb5_context_time,
56 : : gss_krb5_inquire_cred,
57 : : gss_krb5_inquire_cred_by_mech},
58 : : #endif
59 : : {
60 : : NULL,
61 : : NULL,
62 : : NULL,
63 : : NULL,
64 : : {
65 : : NULL,
66 : : NULL,
67 : : NULL},
68 : : NULL,
69 : : NULL,
70 : : NULL,
71 : : NULL,
72 : : NULL,
73 : : NULL,
74 : : NULL,
75 : : NULL,
76 : : NULL,
77 : : NULL,
78 : : NULL,
79 : : NULL,
80 : : NULL,
81 : : NULL,
82 : : NULL}
83 : : };
84 : :
85 : : _gss_mech_api_t
86 : 29 : _gss_find_mech_no_default (const gss_OID oid)
87 : : {
88 : : size_t i;
89 : :
90 [ + + ]: 35 : for (i = 0; _gss_mech_apis[i].mech; i++)
91 [ + + ]: 29 : if (gss_oid_equal (oid, _gss_mech_apis[i].mech))
92 : 23 : return &_gss_mech_apis[i];
93 : :
94 : 29 : return NULL;
95 : : }
96 : :
97 : : _gss_mech_api_t
98 : 24 : _gss_find_mech (const gss_OID oid)
99 : : {
100 : 24 : _gss_mech_api_t p = _gss_find_mech_no_default (oid);
101 : :
102 [ + + + - ]: 24 : if (!p && _gss_mech_apis[0].mech)
103 : : /* FIXME. When we support more than one mechanism, make it possible
104 : : to configure the default mechanism. */
105 : 5 : return &_gss_mech_apis[0];
106 : :
107 : 24 : return p;
108 : : }
109 : :
110 : : _gss_mech_api_t
111 : 3 : _gss_find_mech_by_saslname (const gss_buffer_t sasl_mech_name)
112 : : {
113 : : size_t i;
114 : :
115 [ + - ][ + + ]: 3 : if (sasl_mech_name == NULL
[ - + ]
116 : 5 : || sasl_mech_name->value == NULL || sasl_mech_name->length == 0)
117 : 1 : return NULL;
118 : :
119 [ + - ]: 2 : for (i = 0; _gss_mech_apis[i].mech; i++)
120 [ + - ][ + - ]: 2 : if (strlen (_gss_mech_apis[i].sasl_name) == sasl_mech_name->length &&
121 : 4 : memcmp (_gss_mech_apis[i].sasl_name, sasl_mech_name->value,
122 : 6 : sasl_mech_name->length) == 0)
123 : 2 : return &_gss_mech_apis[i];
124 : :
125 : 3 : return NULL;
126 : : }
127 : :
128 : : OM_uint32
129 : 2 : _gss_indicate_mechs1 (OM_uint32 * minor_status, gss_OID_set * mech_set)
130 : : {
131 : : OM_uint32 maj_stat;
132 : : int i;
133 : :
134 [ + + ]: 4 : for (i = 0; _gss_mech_apis[i].mech; i++)
135 : : {
136 : 2 : maj_stat = gss_add_oid_set_member (minor_status,
137 : : _gss_mech_apis[i].mech, mech_set);
138 [ - + ]: 2 : if (GSS_ERROR (maj_stat))
139 : 0 : return maj_stat;
140 : : }
141 : :
142 [ + - ]: 2 : if (minor_status)
143 : 2 : *minor_status = 0;
144 : 2 : return GSS_S_COMPLETE;
145 : : }
|