2 * Copyright (c) 2011, JANET(UK)
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * 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.
16 * 3. Neither the name of JANET(UK) nor the names of its contributors
17 * may be used to endorse or promote products derived from this software
18 * without specific prior written permission.
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * Attribute provider mechanism.
37 #include "gssapiP_eap.h"
46 /* lazy initialisation */
47 static GSSEAP_THREAD_ONCE gssEapAttrProvidersInitOnce = GSSEAP_ONCE_INITIALIZER;
48 static OM_uint32 gssEapAttrProvidersInitStatus = GSS_S_UNAVAILABLE;
51 gssEapAttrProvidersInitInternal(void)
53 OM_uint32 major, minor;
55 assert(gssEapAttrProvidersInitStatus == GSS_S_UNAVAILABLE);
57 major = gssEapRadiusAttrProviderInit(&minor);
58 if (major == GSS_S_COMPLETE)
59 major = gssEapSamlAttrProvidersInit(&minor);
60 if (major == GSS_S_COMPLETE)
61 major = gssEapLocalAttrProviderInit(&minor);
64 assert(major == GSS_S_COMPLETE);
67 gssEapAttrProvidersInitStatus = major;
71 gssEapAttrProvidersInit(OM_uint32 *minor)
73 GSSEAP_ONCE(&gssEapAttrProvidersInitOnce, gssEapAttrProvidersInitInternal);
75 if (GSS_ERROR(gssEapAttrProvidersInitStatus))
76 *minor = GSSEAP_NO_ATTR_PROVIDERS;
78 return gssEapAttrProvidersInitStatus;
82 gssEapAttrProvidersFinalize(OM_uint32 *minor)
84 OM_uint32 major = GSS_S_COMPLETE;
86 if (gssEapAttrProvidersInitStatus == GSS_S_COMPLETE) {
87 major = gssEapLocalAttrProviderFinalize(minor);
88 if (major == GSS_S_COMPLETE)
89 major = gssEapSamlAttrProvidersFinalize(minor);
90 if (major == GSS_S_COMPLETE)
91 major = gssEapRadiusAttrProviderFinalize(minor);
93 gssEapAttrProvidersInitStatus = GSS_S_UNAVAILABLE;
99 static gss_eap_attr_create_provider gssEapAttrFactories[ATTR_TYPE_MAX + 1];
102 * Register a provider for a particular type and prefix
105 gss_eap_attr_ctx::registerProvider(unsigned int type,
106 gss_eap_attr_create_provider factory)
108 assert(type <= ATTR_TYPE_MAX);
110 assert(gssEapAttrFactories[type] == NULL);
112 gssEapAttrFactories[type] = factory;
116 * Unregister a provider
119 gss_eap_attr_ctx::unregisterProvider(unsigned int type)
121 assert(type <= ATTR_TYPE_MAX);
123 gssEapAttrFactories[type] = NULL;
127 * Create an attribute context, that manages instances of providers
129 gss_eap_attr_ctx::gss_eap_attr_ctx(void)
133 for (unsigned int i = ATTR_TYPE_MIN; i <= ATTR_TYPE_MAX; i++) {
134 gss_eap_attr_provider *provider;
136 if (gssEapAttrFactories[i] != NULL) {
137 provider = (gssEapAttrFactories[i])();
142 m_providers[i] = provider;
147 * Convert an attribute prefix to a type
150 gss_eap_attr_ctx::attributePrefixToType(const gss_buffer_t prefix) const
154 for (i = ATTR_TYPE_MIN; i < ATTR_TYPE_MAX; i++) {
157 if (!providerEnabled(i))
160 pprefix = m_providers[i]->prefix();
164 if (strlen(pprefix) == prefix->length &&
165 memcmp(pprefix, prefix->value, prefix->length) == 0)
169 return ATTR_TYPE_LOCAL;
173 * Convert a type to an attribute prefix
176 gss_eap_attr_ctx::attributeTypeToPrefix(unsigned int type) const
178 gss_buffer_desc prefix = GSS_C_EMPTY_BUFFER;
180 if (type < ATTR_TYPE_MIN || type >= ATTR_TYPE_MAX)
183 if (!providerEnabled(type))
186 prefix.value = (void *)m_providers[type]->prefix();
187 if (prefix.value != NULL)
188 prefix.length = strlen((char *)prefix.value);
194 gss_eap_attr_ctx::providerEnabled(unsigned int type) const
196 if (type == ATTR_TYPE_LOCAL &&
197 (m_flags & ATTR_FLAG_DISABLE_LOCAL))
200 if (m_providers[type] == NULL)
207 gss_eap_attr_ctx::releaseProvider(unsigned int type)
209 delete m_providers[type];
210 m_providers[type] = NULL;
214 * Initialize a context from an existing context.
217 gss_eap_attr_ctx::initFromExistingContext(const gss_eap_attr_ctx *manager)
221 m_flags = manager->m_flags;
223 for (unsigned int i = ATTR_TYPE_MIN; i <= ATTR_TYPE_MAX; i++) {
224 gss_eap_attr_provider *provider;
226 if (!providerEnabled(i)) {
231 provider = m_providers[i];
233 ret = provider->initFromExistingContext(this,
234 manager->m_providers[i]);
245 * Initialize a context from a GSS credential and context.
248 gss_eap_attr_ctx::initFromGssContext(const gss_cred_id_t cred,
249 const gss_ctx_id_t ctx)
253 if (cred != GSS_C_NO_CREDENTIAL &&
254 (cred->flags & GSS_EAP_DISABLE_LOCAL_ATTRS_FLAG)) {
255 m_flags |= ATTR_FLAG_DISABLE_LOCAL;
258 for (unsigned int i = ATTR_TYPE_MIN; i <= ATTR_TYPE_MAX; i++) {
259 gss_eap_attr_provider *provider;
261 if (!providerEnabled(i)) {
266 provider = m_providers[i];
268 ret = provider->initFromGssContext(this, cred, ctx);
279 gss_eap_attr_ctx::initWithJsonObject(json_t *obj)
282 bool foundSource[ATTR_TYPE_MAX + 1];
286 for (type = ATTR_TYPE_MIN; type <= ATTR_TYPE_MAX; type++)
287 foundSource[type] = false;
289 if (json_integer_value(json_object_get(obj, "version")) != 1)
292 m_flags = json_integer_value(json_object_get(obj, "flags"));
294 sources = json_object_get(obj, "sources");
296 /* Initialize providers from serialized state */
297 for (type = ATTR_TYPE_MIN; type <= ATTR_TYPE_MAX; type++) {
298 gss_eap_attr_provider *provider;
302 if (!providerEnabled(type)) {
303 releaseProvider(type);
307 provider = m_providers[type];
308 key = provider->name();
312 source = json_object_get(sources, key);
313 if (source != NULL &&
314 !provider->initWithJsonObject(this, source)) {
315 releaseProvider(type);
319 foundSource[type] = true;
322 /* Initialize remaining providers from initialized providers */
323 for (type = ATTR_TYPE_MIN; type <= ATTR_TYPE_MAX; type++) {
324 gss_eap_attr_provider *provider;
326 if (foundSource[type] || !providerEnabled(type))
329 provider = m_providers[type];
331 ret = provider->initFromGssContext(this,
335 releaseProvider(type);
344 gss_eap_attr_ctx::jsonRepresentation(void) const
346 json_t *obj, *sources;
351 throw new std::bad_alloc;
354 /* FIXME check json_object_set_new return value */
355 json_object_set_new(obj, "version", json_integer(1));
356 json_object_set_new(obj, "flags", json_integer(m_flags));
358 sources = json_object();
359 if (sources == NULL) {
361 throw new std::bad_alloc;
364 for (i = ATTR_TYPE_MIN; i <= ATTR_TYPE_MAX; i++) {
365 gss_eap_attr_provider *provider;
368 provider = m_providers[i];
369 if (provider == NULL)
370 continue; /* provider not initialised */
372 key = provider->name();
374 continue; /* provider does not have state */
376 json_t *source = provider->jsonRepresentation();
377 json_object_set_new(sources, key, source);
380 json_object_set_new(obj, "sources", sources);
386 * Initialize a context from an exported context or name token
389 gss_eap_attr_ctx::initFromBuffer(const gss_buffer_t buffer)
391 OM_uint32 major, minor;
397 major = bufferToString(&minor, buffer, &s);
398 if (GSS_ERROR(major))
401 obj = json_loads(s, 0, &error);
403 ret = initWithJsonObject(obj);
413 gss_eap_attr_ctx::~gss_eap_attr_ctx(void)
415 for (unsigned int i = ATTR_TYPE_MIN; i <= ATTR_TYPE_MAX; i++)
416 delete m_providers[i];
420 * Locate provider for a given type
422 gss_eap_attr_provider *
423 gss_eap_attr_ctx::getProvider(unsigned int type) const
425 assert(type >= ATTR_TYPE_MIN && type <= ATTR_TYPE_MAX);
426 return m_providers[type];
430 * Get primary provider. Only the primary provider is serialised when
431 * gss_export_sec_context() or gss_export_name_composite() is called.
433 gss_eap_attr_provider *
434 gss_eap_attr_ctx::getPrimaryProvider(void) const
436 return m_providers[ATTR_TYPE_MIN];
443 gss_eap_attr_ctx::setAttribute(int complete,
444 const gss_buffer_t attr,
445 const gss_buffer_t value)
447 gss_buffer_desc suffix = GSS_C_EMPTY_BUFFER;
449 gss_eap_attr_provider *provider;
452 decomposeAttributeName(attr, &type, &suffix);
454 provider = m_providers[type];
455 if (provider != NULL) {
456 ret = provider->setAttribute(complete,
457 (type == ATTR_TYPE_LOCAL) ? attr : &suffix,
465 * Delete an attrbiute
468 gss_eap_attr_ctx::deleteAttribute(const gss_buffer_t attr)
470 gss_buffer_desc suffix = GSS_C_EMPTY_BUFFER;
472 gss_eap_attr_provider *provider;
475 decomposeAttributeName(attr, &type, &suffix);
477 provider = m_providers[type];
478 if (provider != NULL) {
479 ret = provider->deleteAttribute(type == ATTR_TYPE_LOCAL ? attr : &suffix);
486 * Enumerate attribute types with callback
489 gss_eap_attr_ctx::getAttributeTypes(gss_eap_attr_enumeration_cb cb, void *data) const
494 for (i = ATTR_TYPE_MIN; i <= ATTR_TYPE_MAX; i++) {
495 gss_eap_attr_provider *provider = m_providers[i];
497 if (provider == NULL)
500 ret = provider->getAttributeTypes(cb, data);
508 struct eap_gss_get_attr_types_args {
510 gss_buffer_set_t attrs;
514 addAttribute(const gss_eap_attr_ctx *manager,
515 const gss_eap_attr_provider *provider GSSEAP_UNUSED,
516 const gss_buffer_t attribute,
519 eap_gss_get_attr_types_args *args = (eap_gss_get_attr_types_args *)data;
520 gss_buffer_desc qualified;
521 OM_uint32 major, minor;
523 if (args->type != ATTR_TYPE_LOCAL) {
524 manager->composeAttributeName(args->type, attribute, &qualified);
525 major = gss_add_buffer_set_member(&minor, &qualified, &args->attrs);
526 gss_release_buffer(&minor, &qualified);
528 major = gss_add_buffer_set_member(&minor, attribute, &args->attrs);
531 return GSS_ERROR(major) == false;
535 * Enumerate attribute types, output is buffer set
538 gss_eap_attr_ctx::getAttributeTypes(gss_buffer_set_t *attrs)
540 eap_gss_get_attr_types_args args;
541 OM_uint32 major, minor;
545 major = gss_create_empty_buffer_set(&minor, attrs);
546 if (GSS_ERROR(major))
547 throw new std::bad_alloc;
551 for (i = ATTR_TYPE_MIN; i <= ATTR_TYPE_MAX; i++) {
552 gss_eap_attr_provider *provider = m_providers[i];
556 if (provider == NULL)
559 ret = provider->getAttributeTypes(addAttribute, (void *)&args);
565 gss_release_buffer_set(&minor, attrs);
571 * Get attribute with given name
574 gss_eap_attr_ctx::getAttribute(const gss_buffer_t attr,
578 gss_buffer_t display_value,
581 gss_buffer_desc suffix = GSS_C_EMPTY_BUFFER;
583 gss_eap_attr_provider *provider;
586 decomposeAttributeName(attr, &type, &suffix);
588 provider = m_providers[type];
589 if (provider == NULL)
592 ret = provider->getAttribute(type == ATTR_TYPE_LOCAL ? attr : &suffix,
593 authenticated, complete,
594 value, display_value, more);
600 * Map attribute context to C++ object
603 gss_eap_attr_ctx::mapToAny(int authenticated,
604 gss_buffer_t type_id) const
607 gss_eap_attr_provider *provider;
608 gss_buffer_desc suffix;
610 decomposeAttributeName(type_id, &type, &suffix);
612 provider = m_providers[type];
613 if (provider == NULL)
614 return (gss_any_t)NULL;
616 return provider->mapToAny(authenticated, &suffix);
620 * Release mapped context
623 gss_eap_attr_ctx::releaseAnyNameMapping(gss_buffer_t type_id,
624 gss_any_t input) const
627 gss_eap_attr_provider *provider;
628 gss_buffer_desc suffix;
630 decomposeAttributeName(type_id, &type, &suffix);
632 provider = m_providers[type];
633 if (provider != NULL)
634 provider->releaseAnyNameMapping(&suffix, input);
638 * Export attribute context to buffer
641 gss_eap_attr_ctx::exportToBuffer(gss_buffer_t buffer) const
647 obj = jsonRepresentation();
649 std::string error("gss_eap_attr_ctx::exportToBuffer::jsonRepresentation");
650 throw new std::runtime_error(error); /* XXX */
654 json_dumpf(obj, stdout, JSON_INDENT(3));
657 s = json_dumps(obj, JSON_COMPACT);
660 std::string error("gss_eap_attr_ctx::exportToBuffer: json_dumps");
661 throw new std::runtime_error(error); /* XXX */
664 if (GSS_ERROR(makeStringBuffer(&minor, s, buffer))) {
666 throw new std::bad_alloc;
673 * Return soonest expiry time of providers
676 gss_eap_attr_ctx::getExpiryTime(void) const
679 time_t expiryTime = 0;
681 for (i = ATTR_TYPE_MIN; i <= ATTR_TYPE_MAX; i++) {
682 gss_eap_attr_provider *provider = m_providers[i];
683 time_t providerExpiryTime;
685 if (provider == NULL)
688 providerExpiryTime = provider->getExpiryTime();
689 if (providerExpiryTime == 0)
692 if (expiryTime == 0 || providerExpiryTime < expiryTime)
693 expiryTime = providerExpiryTime;
700 gss_eap_attr_ctx::mapException(OM_uint32 *minor, std::exception &e) const
705 /* Errors we handle ourselves */
706 major = GSS_S_FAILURE;
708 if (typeid(e) == typeid(std::bad_alloc)) {
713 /* Errors we delegate to providers */
714 major = GSS_S_CONTINUE_NEEDED;
716 for (i = ATTR_TYPE_MIN; i <= ATTR_TYPE_MAX; i++) {
717 gss_eap_attr_provider *provider = m_providers[i];
719 if (provider == NULL)
722 major = provider->mapException(minor, e);
723 if (major != GSS_S_CONTINUE_NEEDED)
727 if (major == GSS_S_CONTINUE_NEEDED) {
728 *minor = GSSEAP_ATTR_CONTEXT_FAILURE;
729 major = GSS_S_FAILURE;
734 /* rethrow for now for debugging */
738 assert(GSS_ERROR(major));
744 * Decompose attribute name into prefix and suffix
747 gss_eap_attr_ctx::decomposeAttributeName(const gss_buffer_t attribute,
754 for (i = 0; i < attribute->length; i++) {
755 if (((char *)attribute->value)[i] == ' ') {
756 p = (char *)attribute->value + i + 1;
761 prefix->value = attribute->value;
764 if (p != NULL && *p != '\0') {
765 suffix->length = attribute->length - 1 - prefix->length;
769 suffix->value = NULL;
774 * Decompose attribute name into type and suffix
777 gss_eap_attr_ctx::decomposeAttributeName(const gss_buffer_t attribute,
779 gss_buffer_t suffix) const
781 gss_buffer_desc prefix = GSS_C_EMPTY_BUFFER;
783 decomposeAttributeName(attribute, &prefix, suffix);
784 *type = attributePrefixToType(&prefix);
788 * Compose attribute name from prefix, suffix; returns C++ string
791 gss_eap_attr_ctx::composeAttributeName(const gss_buffer_t prefix,
792 const gss_buffer_t suffix)
796 if (prefix == GSS_C_NO_BUFFER || prefix->length == 0)
799 str.append((const char *)prefix->value, prefix->length);
801 if (suffix != GSS_C_NO_BUFFER) {
803 str.append((const char *)suffix->value, suffix->length);
810 * Compose attribute name from type, suffix; returns C++ string
813 gss_eap_attr_ctx::composeAttributeName(unsigned int type,
814 const gss_buffer_t suffix)
816 gss_buffer_desc prefix = attributeTypeToPrefix(type);
818 return composeAttributeName(&prefix, suffix);
822 * Compose attribute name from prefix, suffix; returns GSS buffer
825 gss_eap_attr_ctx::composeAttributeName(const gss_buffer_t prefix,
826 const gss_buffer_t suffix,
827 gss_buffer_t attribute)
829 std::string str = composeAttributeName(prefix, suffix);
831 if (str.length() != 0) {
832 return duplicateBuffer(str, attribute);
834 attribute->length = 0;
835 attribute->value = NULL;
840 * Compose attribute name from type, suffix; returns GSS buffer
843 gss_eap_attr_ctx::composeAttributeName(unsigned int type,
844 const gss_buffer_t suffix,
845 gss_buffer_t attribute) const
847 gss_buffer_desc prefix = attributeTypeToPrefix(type);
849 return composeAttributeName(&prefix, suffix, attribute);
856 gssEapInquireName(OM_uint32 *minor,
860 gss_buffer_set_t *attrs)
864 if (name_is_MN != NULL)
865 *name_is_MN = (name->mechanismUsed != GSS_C_NULL_OID);
867 if (MN_mech != NULL) {
868 major = gssEapCanonicalizeOid(minor, name->mechanismUsed,
869 OID_FLAG_NULL_VALID, MN_mech);
870 if (GSS_ERROR(major))
874 if (name->attrCtx == NULL) {
875 *minor = GSSEAP_NO_ATTR_CONTEXT;
876 return GSS_S_UNAVAILABLE;
879 if (GSS_ERROR(gssEapAttrProvidersInit(minor))) {
880 return GSS_S_UNAVAILABLE;
884 if (!name->attrCtx->getAttributeTypes(attrs)) {
885 *minor = GSSEAP_NO_ATTR_CONTEXT;
886 return GSS_S_UNAVAILABLE;
888 } catch (std::exception &e) {
889 return name->attrCtx->mapException(minor, e);
892 return GSS_S_COMPLETE;
896 gssEapGetNameAttribute(OM_uint32 *minor,
902 gss_buffer_t display_value,
913 if (display_value != NULL) {
914 display_value->length = 0;
915 display_value->value = NULL;
918 if (name->attrCtx == NULL) {
919 *minor = GSSEAP_NO_ATTR_CONTEXT;
920 return GSS_S_UNAVAILABLE;
923 if (GSS_ERROR(gssEapAttrProvidersInit(minor))) {
924 return GSS_S_UNAVAILABLE;
928 if (!name->attrCtx->getAttribute(attr, authenticated, complete,
929 value, display_value, more)) {
930 *minor = GSSEAP_NO_SUCH_ATTR;
931 gssEapSaveStatusInfo(*minor, "Unknown naming attribute %.*s",
932 (int)attr->length, (char *)attr->value);
933 return GSS_S_UNAVAILABLE;
935 } catch (std::exception &e) {
936 return name->attrCtx->mapException(minor, e);
939 return GSS_S_COMPLETE;
943 gssEapDeleteNameAttribute(OM_uint32 *minor,
947 if (name->attrCtx == NULL) {
948 *minor = GSSEAP_NO_ATTR_CONTEXT;
949 return GSS_S_UNAVAILABLE;
952 if (GSS_ERROR(gssEapAttrProvidersInit(minor)))
953 return GSS_S_UNAVAILABLE;
956 if (!name->attrCtx->deleteAttribute(attr)) {
957 *minor = GSSEAP_NO_SUCH_ATTR;
958 gssEapSaveStatusInfo(*minor, "Unknown naming attribute %.*s",
959 (int)attr->length, (char *)attr->value);
960 return GSS_S_UNAVAILABLE;
962 } catch (std::exception &e) {
963 return name->attrCtx->mapException(minor, e);
966 return GSS_S_COMPLETE;
970 gssEapSetNameAttribute(OM_uint32 *minor,
976 if (name->attrCtx == NULL) {
977 *minor = GSSEAP_NO_ATTR_CONTEXT;
978 return GSS_S_UNAVAILABLE;
981 if (GSS_ERROR(gssEapAttrProvidersInit(minor)))
982 return GSS_S_UNAVAILABLE;
985 if (!name->attrCtx->setAttribute(complete, attr, value)) {
986 *minor = GSSEAP_NO_SUCH_ATTR;
987 gssEapSaveStatusInfo(*minor, "Unknown naming attribute %.*s",
988 (int)attr->length, (char *)attr->value);
989 return GSS_S_UNAVAILABLE;
991 } catch (std::exception &e) {
992 return name->attrCtx->mapException(minor, e);
995 return GSS_S_COMPLETE;
999 gssEapExportAttrContext(OM_uint32 *minor,
1001 gss_buffer_t buffer)
1003 if (name->attrCtx == NULL) {
1005 buffer->value = NULL;
1007 return GSS_S_COMPLETE;
1010 if (GSS_ERROR(gssEapAttrProvidersInit(minor)))
1011 return GSS_S_UNAVAILABLE;
1014 name->attrCtx->exportToBuffer(buffer);
1015 } catch (std::exception &e) {
1016 return name->attrCtx->mapException(minor, e);
1019 return GSS_S_COMPLETE;
1023 gssEapImportAttrContext(OM_uint32 *minor,
1024 gss_buffer_t buffer,
1027 gss_eap_attr_ctx *ctx = NULL;
1029 assert(name->attrCtx == NULL);
1031 if (GSS_ERROR(gssEapAttrProvidersInit(minor)))
1032 return GSS_S_UNAVAILABLE;
1034 if (buffer->length != 0) {
1036 ctx = new gss_eap_attr_ctx();
1038 if (!ctx->initFromBuffer(buffer)) {
1040 *minor = GSSEAP_BAD_ATTR_TOKEN;
1041 return GSS_S_DEFECTIVE_TOKEN;
1043 name->attrCtx = ctx;
1044 } catch (std::exception &e) {
1046 return name->attrCtx->mapException(minor, e);
1050 return GSS_S_COMPLETE;
1054 gssEapDuplicateAttrContext(OM_uint32 *minor,
1058 gss_eap_attr_ctx *ctx = NULL;
1060 assert(out->attrCtx == NULL);
1062 if (GSS_ERROR(gssEapAttrProvidersInit(minor)))
1063 return GSS_S_UNAVAILABLE;
1066 if (in->attrCtx != NULL) {
1067 ctx = new gss_eap_attr_ctx();
1068 if (!ctx->initFromExistingContext(in->attrCtx)) {
1070 *minor = GSSEAP_ATTR_CONTEXT_FAILURE;
1071 return GSS_S_FAILURE;
1075 } catch (std::exception &e) {
1077 return in->attrCtx->mapException(minor, e);
1080 return GSS_S_COMPLETE;
1084 gssEapMapNameToAny(OM_uint32 *minor,
1087 gss_buffer_t type_id,
1090 if (name->attrCtx == NULL) {
1091 *minor = GSSEAP_NO_ATTR_CONTEXT;
1092 return GSS_S_UNAVAILABLE;
1095 if (GSS_ERROR(gssEapAttrProvidersInit(minor)))
1096 return GSS_S_UNAVAILABLE;
1099 *output = name->attrCtx->mapToAny(authenticated, type_id);
1100 } catch (std::exception &e) {
1101 return name->attrCtx->mapException(minor, e);
1104 return GSS_S_COMPLETE;
1108 gssEapReleaseAnyNameMapping(OM_uint32 *minor,
1110 gss_buffer_t type_id,
1113 if (name->attrCtx == NULL) {
1114 *minor = GSSEAP_NO_ATTR_CONTEXT;
1115 return GSS_S_UNAVAILABLE;
1118 if (GSS_ERROR(gssEapAttrProvidersInit(minor)))
1119 return GSS_S_UNAVAILABLE;
1123 name->attrCtx->releaseAnyNameMapping(type_id, *input);
1125 } catch (std::exception &e) {
1126 return name->attrCtx->mapException(minor, e);
1129 return GSS_S_COMPLETE;
1133 gssEapReleaseAttrContext(OM_uint32 *minor,
1136 if (name->attrCtx != NULL)
1137 delete name->attrCtx;
1140 return GSS_S_COMPLETE;
1144 * Public accessor for initialisng a context from a GSS context. Also
1145 * sets expiry time on GSS context as a side-effect.
1148 gssEapCreateAttrContext(OM_uint32 *minor,
1149 gss_cred_id_t gssCred,
1150 gss_ctx_id_t gssCtx,
1151 struct gss_eap_attr_ctx **pAttrContext,
1152 time_t *pExpiryTime)
1154 gss_eap_attr_ctx *ctx = NULL;
1157 assert(gssCtx != GSS_C_NO_CONTEXT);
1159 major = gssEapAttrProvidersInit(minor);
1160 if (GSS_ERROR(major))
1163 *minor = GSSEAP_ATTR_CONTEXT_FAILURE;
1164 major = GSS_S_FAILURE;
1167 ctx = new gss_eap_attr_ctx();
1168 if (ctx->initFromGssContext(gssCred, gssCtx)) {
1170 major = GSS_S_COMPLETE;
1174 } catch (std::exception &e) {
1176 major = ctx->mapException(minor, e);
1179 if (major == GSS_S_COMPLETE) {
1180 *pAttrContext = ctx;
1181 *pExpiryTime = ctx->getExpiryTime();