1ae771770SStanislav Sedov /*-
2ae771770SStanislav Sedov * Copyright (c) 2005 Doug Rabson
3ae771770SStanislav Sedov * All rights reserved.
4ae771770SStanislav Sedov *
5ae771770SStanislav Sedov * Redistribution and use in source and binary forms, with or without
6ae771770SStanislav Sedov * modification, are permitted provided that the following conditions
7ae771770SStanislav Sedov * are met:
8ae771770SStanislav Sedov * 1. Redistributions of source code must retain the above copyright
9ae771770SStanislav Sedov * notice, this list of conditions and the following disclaimer.
10ae771770SStanislav Sedov * 2. Redistributions in binary form must reproduce the above copyright
11ae771770SStanislav Sedov * notice, this list of conditions and the following disclaimer in the
12ae771770SStanislav Sedov * documentation and/or other materials provided with the distribution.
13ae771770SStanislav Sedov *
14ae771770SStanislav Sedov * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15ae771770SStanislav Sedov * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16ae771770SStanislav Sedov * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17ae771770SStanislav Sedov * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18ae771770SStanislav Sedov * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19ae771770SStanislav Sedov * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20ae771770SStanislav Sedov * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21ae771770SStanislav Sedov * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22ae771770SStanislav Sedov * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23ae771770SStanislav Sedov * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24ae771770SStanislav Sedov * SUCH DAMAGE.
25ae771770SStanislav Sedov *
26ae771770SStanislav Sedov * $FreeBSD: src/lib/libgssapi/gss_display_status.c,v 1.1 2005/12/29 14:40:20 dfr Exp $
27ae771770SStanislav Sedov */
28ae771770SStanislav Sedov /*
29ae771770SStanislav Sedov * Copyright (c) 1998 - 2005 Kungliga Tekniska Högskolan
30ae771770SStanislav Sedov * (Royal Institute of Technology, Stockholm, Sweden).
31ae771770SStanislav Sedov * All rights reserved.
32ae771770SStanislav Sedov *
33ae771770SStanislav Sedov * Redistribution and use in source and binary forms, with or without
34ae771770SStanislav Sedov * modification, are permitted provided that the following conditions
35ae771770SStanislav Sedov * are met:
36ae771770SStanislav Sedov *
37ae771770SStanislav Sedov * 1. Redistributions of source code must retain the above copyright
38ae771770SStanislav Sedov * notice, this list of conditions and the following disclaimer.
39ae771770SStanislav Sedov *
40ae771770SStanislav Sedov * 2. Redistributions in binary form must reproduce the above copyright
41ae771770SStanislav Sedov * notice, this list of conditions and the following disclaimer in the
42ae771770SStanislav Sedov * documentation and/or other materials provided with the distribution.
43ae771770SStanislav Sedov *
44ae771770SStanislav Sedov * 3. Neither the name of the Institute nor the names of its contributors
45ae771770SStanislav Sedov * may be used to endorse or promote products derived from this software
46ae771770SStanislav Sedov * without specific prior written permission.
47ae771770SStanislav Sedov *
48ae771770SStanislav Sedov * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
49ae771770SStanislav Sedov * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
50ae771770SStanislav Sedov * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
51ae771770SStanislav Sedov * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
52ae771770SStanislav Sedov * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
53ae771770SStanislav Sedov * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
54ae771770SStanislav Sedov * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
55ae771770SStanislav Sedov * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
56ae771770SStanislav Sedov * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
57ae771770SStanislav Sedov * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
58ae771770SStanislav Sedov * SUCH DAMAGE.
59ae771770SStanislav Sedov */
60ae771770SStanislav Sedov
61ae771770SStanislav Sedov #include "mech_locl.h"
62ae771770SStanislav Sedov
63ae771770SStanislav Sedov static const char *
calling_error(OM_uint32 v)64ae771770SStanislav Sedov calling_error(OM_uint32 v)
65ae771770SStanislav Sedov {
66ae771770SStanislav Sedov static const char *msgs[] = {
67ae771770SStanislav Sedov NULL, /* 0 */
68ae771770SStanislav Sedov "A required input parameter could not be read.", /* */
69ae771770SStanislav Sedov "A required output parameter could not be written.", /* */
70ae771770SStanislav Sedov "A parameter was malformed"
71ae771770SStanislav Sedov };
72ae771770SStanislav Sedov
73ae771770SStanislav Sedov v >>= GSS_C_CALLING_ERROR_OFFSET;
74ae771770SStanislav Sedov
75ae771770SStanislav Sedov if (v == 0)
76ae771770SStanislav Sedov return "";
77ae771770SStanislav Sedov else if (v >= sizeof(msgs)/sizeof(*msgs))
78ae771770SStanislav Sedov return "unknown calling error";
79ae771770SStanislav Sedov else
80ae771770SStanislav Sedov return msgs[v];
81ae771770SStanislav Sedov }
82ae771770SStanislav Sedov
83ae771770SStanislav Sedov static const char *
routine_error(OM_uint32 v)84ae771770SStanislav Sedov routine_error(OM_uint32 v)
85ae771770SStanislav Sedov {
86ae771770SStanislav Sedov static const char *msgs[] = {
87ae771770SStanislav Sedov "Function completed successfully", /* 0 */
88ae771770SStanislav Sedov "An unsupported mechanism was requested",
89ae771770SStanislav Sedov "An invalid name was supplied",
90ae771770SStanislav Sedov "A supplied name was of an unsupported type",
91ae771770SStanislav Sedov "Incorrect channel bindings were supplied",
92ae771770SStanislav Sedov "An invalid status code was supplied",
93ae771770SStanislav Sedov "A token had an invalid MIC",
94*ed549cb0SCy Schubert "No credentials were supplied, or the credentials were unavailable or inaccessible.",
95ae771770SStanislav Sedov "No context has been established",
96ae771770SStanislav Sedov "A token was invalid",
97ae771770SStanislav Sedov "A credential was invalid",
98ae771770SStanislav Sedov "The referenced credentials have expired",
99ae771770SStanislav Sedov "The context has expired",
100ae771770SStanislav Sedov "Miscellaneous failure (see text)",
101ae771770SStanislav Sedov "The quality-of-protection requested could not be provide",
102ae771770SStanislav Sedov "The operation is forbidden by local security policy",
103ae771770SStanislav Sedov "The operation or option is not available",
104ae771770SStanislav Sedov "The requested credential element already exists",
105ae771770SStanislav Sedov "The provided name was not a mechanism name.",
106ae771770SStanislav Sedov };
107ae771770SStanislav Sedov
108ae771770SStanislav Sedov v >>= GSS_C_ROUTINE_ERROR_OFFSET;
109ae771770SStanislav Sedov
110ae771770SStanislav Sedov if (v >= sizeof(msgs)/sizeof(*msgs))
111ae771770SStanislav Sedov return "unknown routine error";
112ae771770SStanislav Sedov else
113ae771770SStanislav Sedov return msgs[v];
114ae771770SStanislav Sedov }
115ae771770SStanislav Sedov
116ae771770SStanislav Sedov static const char *
supplementary_error(OM_uint32 v)117ae771770SStanislav Sedov supplementary_error(OM_uint32 v)
118ae771770SStanislav Sedov {
119ae771770SStanislav Sedov static const char *msgs[] = {
120ae771770SStanislav Sedov "normal completion",
121ae771770SStanislav Sedov "continuation call to routine required",
122ae771770SStanislav Sedov "duplicate per-message token detected",
123ae771770SStanislav Sedov "timed-out per-message token detected",
124ae771770SStanislav Sedov "reordered (early) per-message token detected",
125ae771770SStanislav Sedov "skipped predecessor token(s) detected"
126ae771770SStanislav Sedov };
127ae771770SStanislav Sedov
128ae771770SStanislav Sedov v >>= GSS_C_SUPPLEMENTARY_OFFSET;
129ae771770SStanislav Sedov
130ae771770SStanislav Sedov if (v >= sizeof(msgs)/sizeof(*msgs))
131ae771770SStanislav Sedov return "unknown routine error";
132ae771770SStanislav Sedov else
133ae771770SStanislav Sedov return msgs[v];
134ae771770SStanislav Sedov }
135ae771770SStanislav Sedov
136ae771770SStanislav Sedov
137ae771770SStanislav Sedov GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL
gss_display_status(OM_uint32 * minor_status,OM_uint32 status_value,int status_type,const gss_OID mech_type,OM_uint32 * message_content,gss_buffer_t status_string)138ae771770SStanislav Sedov gss_display_status(OM_uint32 *minor_status,
139ae771770SStanislav Sedov OM_uint32 status_value,
140ae771770SStanislav Sedov int status_type,
141ae771770SStanislav Sedov const gss_OID mech_type,
142ae771770SStanislav Sedov OM_uint32 *message_content,
143ae771770SStanislav Sedov gss_buffer_t status_string)
144ae771770SStanislav Sedov {
145ae771770SStanislav Sedov OM_uint32 major_status;
146ae771770SStanislav Sedov
147ae771770SStanislav Sedov _mg_buffer_zero(status_string);
148ae771770SStanislav Sedov *message_content = 0;
149ae771770SStanislav Sedov
150ae771770SStanislav Sedov major_status = _gss_mg_get_error(mech_type, status_type,
151ae771770SStanislav Sedov status_value, status_string);
152ae771770SStanislav Sedov if (major_status == GSS_S_COMPLETE) {
153ae771770SStanislav Sedov
154ae771770SStanislav Sedov *message_content = 0;
155ae771770SStanislav Sedov *minor_status = 0;
156ae771770SStanislav Sedov return GSS_S_COMPLETE;
157ae771770SStanislav Sedov }
158ae771770SStanislav Sedov
159ae771770SStanislav Sedov *minor_status = 0;
160ae771770SStanislav Sedov switch (status_type) {
161ae771770SStanislav Sedov case GSS_C_GSS_CODE: {
162ae771770SStanislav Sedov char *buf = NULL;
163ae771770SStanislav Sedov int e;
164ae771770SStanislav Sedov
165ae771770SStanislav Sedov if (GSS_SUPPLEMENTARY_INFO(status_value))
166ae771770SStanislav Sedov e = asprintf(&buf, "%s", supplementary_error(
167ae771770SStanislav Sedov GSS_SUPPLEMENTARY_INFO(status_value)));
168ae771770SStanislav Sedov else
169ae771770SStanislav Sedov e = asprintf (&buf, "%s %s",
170ae771770SStanislav Sedov calling_error(GSS_CALLING_ERROR(status_value)),
171ae771770SStanislav Sedov routine_error(GSS_ROUTINE_ERROR(status_value)));
172ae771770SStanislav Sedov
173ae771770SStanislav Sedov if (e < 0 || buf == NULL)
174ae771770SStanislav Sedov break;
175ae771770SStanislav Sedov
176ae771770SStanislav Sedov status_string->length = strlen(buf);
177ae771770SStanislav Sedov status_string->value = buf;
178ae771770SStanislav Sedov
179ae771770SStanislav Sedov return GSS_S_COMPLETE;
180ae771770SStanislav Sedov }
181ae771770SStanislav Sedov case GSS_C_MECH_CODE: {
182ae771770SStanislav Sedov OM_uint32 maj_junk, min_junk;
183ae771770SStanislav Sedov gss_buffer_desc oid;
184ae771770SStanislav Sedov char *buf = NULL;
185ae771770SStanislav Sedov int e;
186ae771770SStanislav Sedov
187ae771770SStanislav Sedov maj_junk = gss_oid_to_str(&min_junk, mech_type, &oid);
188ae771770SStanislav Sedov if (maj_junk != GSS_S_COMPLETE) {
189ae771770SStanislav Sedov oid.value = rk_UNCONST("unknown");
190ae771770SStanislav Sedov oid.length = 7;
191ae771770SStanislav Sedov }
192ae771770SStanislav Sedov
193ae771770SStanislav Sedov e = asprintf (&buf, "unknown mech-code %lu for mech %.*s",
194ae771770SStanislav Sedov (unsigned long)status_value,
195ae771770SStanislav Sedov (int)oid.length, (char *)oid.value);
196ae771770SStanislav Sedov if (maj_junk == GSS_S_COMPLETE)
197ae771770SStanislav Sedov gss_release_buffer(&min_junk, &oid);
198ae771770SStanislav Sedov
199ae771770SStanislav Sedov if (e < 0 || buf == NULL)
200ae771770SStanislav Sedov break;
201ae771770SStanislav Sedov
202ae771770SStanislav Sedov status_string->length = strlen(buf);
203ae771770SStanislav Sedov status_string->value = buf;
204ae771770SStanislav Sedov
205ae771770SStanislav Sedov return GSS_S_COMPLETE;
206ae771770SStanislav Sedov }
207ae771770SStanislav Sedov }
208ae771770SStanislav Sedov _mg_buffer_zero(status_string);
209ae771770SStanislav Sedov return (GSS_S_BAD_STATUS);
210ae771770SStanislav Sedov }
211