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"
45 /* lazy initialisation */
46 static GSSEAP_THREAD_ONCE gssEapAttrProvidersInitOnce = GSSEAP_ONCE_INITIALIZER;
47 static OM_uint32 gssEapAttrProvidersInitStatus = GSS_S_UNAVAILABLE;
50 gssEapAttrProvidersInitInternal(void)
52 OM_uint32 major, minor;
54 assert(gssEapAttrProvidersInitStatus == GSS_S_UNAVAILABLE);
56 major = gssEapRadiusAttrProviderInit(&minor);
57 if (major == GSS_S_COMPLETE)
58 major = gssEapSamlAttrProvidersInit(&minor);
59 if (major == GSS_S_COMPLETE)
60 major = gssEapLocalAttrProviderInit(&minor);
63 assert(major == GSS_S_COMPLETE);
66 gssEapAttrProvidersInitStatus = major;
70 gssEapAttrProvidersInit(OM_uint32 *minor)
72 GSSEAP_ONCE(&gssEapAttrProvidersInitOnce, gssEapAttrProvidersInitInternal);
74 if (GSS_ERROR(gssEapAttrProvidersInitStatus))
75 *minor = GSSEAP_NO_ATTR_PROVIDERS;
77 return gssEapAttrProvidersInitStatus;
81 gssEapAttrProvidersFinalize(OM_uint32 *minor)
83 OM_uint32 major = GSS_S_COMPLETE;
85 if (gssEapAttrProvidersInitStatus == GSS_S_COMPLETE) {
86 major = gssEapLocalAttrProviderFinalize(minor);
87 if (major == GSS_S_COMPLETE)
88 major = gssEapSamlAttrProvidersFinalize(minor);
89 if (major == GSS_S_COMPLETE)
90 major = gssEapRadiusAttrProviderFinalize(minor);
92 gssEapAttrProvidersInitStatus = GSS_S_UNAVAILABLE;
98 static gss_eap_attr_create_provider gssEapAttrFactories[ATTR_TYPE_MAX + 1];
99 static gss_buffer_desc gssEapAttrPrefixes[ATTR_TYPE_MAX + 1];
102 * Register a provider for a particular type and prefix
105 gss_eap_attr_ctx::registerProvider(unsigned int type,
107 gss_eap_attr_create_provider factory)
109 assert(type <= ATTR_TYPE_MAX);
111 assert(gssEapAttrFactories[type] == NULL);
113 gssEapAttrFactories[type] = factory;
114 if (prefix != NULL) {
115 gssEapAttrPrefixes[type].value = (void *)prefix;
116 gssEapAttrPrefixes[type].length = strlen(prefix);
118 gssEapAttrPrefixes[type].value = NULL;
119 gssEapAttrPrefixes[type].length = 0;
124 * Unregister a provider
127 gss_eap_attr_ctx::unregisterProvider(unsigned int type)
129 assert(type <= ATTR_TYPE_MAX);
131 gssEapAttrFactories[type] = NULL;
132 gssEapAttrPrefixes[type].value = NULL;
133 gssEapAttrPrefixes[type].length = 0;
137 * Create an attribute context, that manages instances of providers
139 gss_eap_attr_ctx::gss_eap_attr_ctx(void)
143 for (unsigned int i = ATTR_TYPE_MIN; i <= ATTR_TYPE_MAX; i++) {
144 gss_eap_attr_provider *provider;
146 if (gssEapAttrFactories[i] != NULL) {
147 provider = (gssEapAttrFactories[i])();
152 m_providers[i] = provider;
157 * Convert an attribute prefix to a type
160 gss_eap_attr_ctx::attributePrefixToType(const gss_buffer_t prefix)
164 for (i = ATTR_TYPE_MIN; i < ATTR_TYPE_MAX; i++) {
165 if (bufferEqual(&gssEapAttrPrefixes[i], prefix))
169 return ATTR_TYPE_LOCAL;
173 * Convert a type to an attribute prefix
176 gss_eap_attr_ctx::attributeTypeToPrefix(unsigned int type)
178 if (type < ATTR_TYPE_MIN || type >= ATTR_TYPE_MAX)
179 return GSS_C_NO_BUFFER;
181 return &gssEapAttrPrefixes[type];
185 gss_eap_attr_ctx::providerEnabled(unsigned int type) const
187 if (type == ATTR_TYPE_LOCAL &&
188 (m_flags & ATTR_FLAG_DISABLE_LOCAL))
191 if (m_providers[type] == NULL)
198 gss_eap_attr_ctx::releaseProvider(unsigned int type)
200 delete m_providers[type];
201 m_providers[type] = NULL;
205 * Initialize a context from an existing context.
208 gss_eap_attr_ctx::initFromExistingContext(const gss_eap_attr_ctx *manager)
212 m_flags = manager->m_flags;
214 for (unsigned int i = ATTR_TYPE_MIN; i <= ATTR_TYPE_MAX; i++) {
215 gss_eap_attr_provider *provider;
217 if (!providerEnabled(i)) {
222 provider = m_providers[i];
224 ret = provider->initFromExistingContext(this,
225 manager->m_providers[i]);
236 * Initialize a context from a GSS credential and context.
239 gss_eap_attr_ctx::initFromGssContext(const gss_cred_id_t cred,
240 const gss_ctx_id_t ctx)
244 if (cred != GSS_C_NO_CREDENTIAL &&
245 (cred->flags & GSS_EAP_DISABLE_LOCAL_ATTRS_FLAG)) {
246 m_flags |= ATTR_FLAG_DISABLE_LOCAL;
249 for (unsigned int i = ATTR_TYPE_MIN; i <= ATTR_TYPE_MAX; i++) {
250 gss_eap_attr_provider *provider;
252 if (!providerEnabled(i)) {
257 provider = m_providers[i];
259 ret = provider->initFromGssContext(this, cred, ctx);
270 findSourceForProvider(DDF &sources, const char *key)
272 DDF source = sources.first();
274 while (!source.isnull()) {
275 DDF obj = source.getmember(key);
277 if (strcmp(key, source.name()) == 0)
280 source = sources.next();
287 gss_eap_attr_ctx::unmarshallAndInit(DDF &obj)
290 bool foundSource[ATTR_TYPE_MAX + 1];
293 for (type = ATTR_TYPE_MIN; type <= ATTR_TYPE_MAX; type++)
294 foundSource[type] = false;
296 if (obj["version"].integer() != 1)
299 m_flags = obj["flags"].integer();
301 DDF sources = obj["sources"];
303 /* Initialize providers from serialized state */
304 for (type = ATTR_TYPE_MIN; type <= ATTR_TYPE_MAX; type++) {
305 if (!providerEnabled(type)) {
306 releaseProvider(type);
310 gss_eap_attr_provider *provider = m_providers[type];
311 const char *key = provider->marshallingKey();
315 DDF source = findSourceForProvider(sources, key);
316 if (source.isnull() ||
317 !provider->unmarshallAndInit(this, source)) {
318 releaseProvider(type);
322 foundSource[type] = true;
325 /* Initialize remaining providers from initialized providers */
326 for (type = ATTR_TYPE_MIN; type <= ATTR_TYPE_MAX; type++) {
327 gss_eap_attr_provider *provider;
329 if (foundSource[type] || !providerEnabled(type))
332 provider = m_providers[type];
334 ret = provider->initFromGssContext(this,
338 releaseProvider(type);
347 gss_eap_attr_ctx::marshall(void) const
352 obj.addmember("version").integer(1);
353 obj.addmember("flags").integer(m_flags);
355 DDF sources = obj.addmember("sources").list();
357 for (i = ATTR_TYPE_MIN; i <= ATTR_TYPE_MAX; i++) {
358 gss_eap_attr_provider *provider = m_providers[i];
360 if (provider == NULL)
361 continue; /* provider not initialised */
363 const char *key = provider->marshallingKey();
365 continue; /* provider does not have state */
367 DDF source = provider->marshall();
368 sources.add(source.name(key));
375 * Initialize a context from an exported context or name token
378 gss_eap_attr_ctx::initFromBuffer(const gss_buffer_t buffer)
382 if (buffer->length == 0)
386 std::string str((const char *)buffer->value, buffer->length);
387 std::istringstream source(str);
391 ret = unmarshallAndInit(obj);
398 gss_eap_attr_ctx::~gss_eap_attr_ctx(void)
400 for (unsigned int i = ATTR_TYPE_MIN; i <= ATTR_TYPE_MAX; i++)
401 delete m_providers[i];
405 * Locate provider for a given type
407 gss_eap_attr_provider *
408 gss_eap_attr_ctx::getProvider(unsigned int type) const
410 assert(type >= ATTR_TYPE_MIN && type <= ATTR_TYPE_MAX);
411 return m_providers[type];
415 * Locate provider for a given prefix
417 gss_eap_attr_provider *
418 gss_eap_attr_ctx::getProvider(const gss_buffer_t prefix) const
422 type = attributePrefixToType(prefix);
424 return m_providers[type];
428 * Get primary provider. Only the primary provider is serialised when
429 * gss_export_sec_context() or gss_export_name_composite() is called.
431 gss_eap_attr_provider *
432 gss_eap_attr_ctx::getPrimaryProvider(void) const
434 return m_providers[ATTR_TYPE_MIN];
441 gss_eap_attr_ctx::setAttribute(int complete,
442 const gss_buffer_t attr,
443 const gss_buffer_t value)
445 gss_buffer_desc suffix = GSS_C_EMPTY_BUFFER;
447 gss_eap_attr_provider *provider;
450 decomposeAttributeName(attr, &type, &suffix);
452 provider = m_providers[type];
453 if (provider != NULL) {
454 ret = provider->setAttribute(complete,
455 (type == ATTR_TYPE_LOCAL) ? attr : &suffix,
463 * Delete an attrbiute
466 gss_eap_attr_ctx::deleteAttribute(const gss_buffer_t attr)
468 gss_buffer_desc suffix = GSS_C_EMPTY_BUFFER;
470 gss_eap_attr_provider *provider;
473 decomposeAttributeName(attr, &type, &suffix);
475 provider = m_providers[type];
476 if (provider != NULL) {
477 ret = provider->deleteAttribute(type == ATTR_TYPE_LOCAL ? attr : &suffix);
484 * Enumerate attribute types with callback
487 gss_eap_attr_ctx::getAttributeTypes(gss_eap_attr_enumeration_cb cb, void *data) const
492 for (i = ATTR_TYPE_MIN; i <= ATTR_TYPE_MAX; i++) {
493 gss_eap_attr_provider *provider = m_providers[i];
495 if (provider == NULL)
498 ret = provider->getAttributeTypes(cb, data);
506 struct eap_gss_get_attr_types_args {
508 gss_buffer_set_t attrs;
512 addAttribute(const gss_eap_attr_provider *provider GSSEAP_UNUSED,
513 const gss_buffer_t attribute,
516 eap_gss_get_attr_types_args *args = (eap_gss_get_attr_types_args *)data;
517 gss_buffer_desc qualified;
518 OM_uint32 major, minor;
520 if (args->type != ATTR_TYPE_LOCAL) {
521 gss_eap_attr_ctx::composeAttributeName(args->type, attribute, &qualified);
522 major = gss_add_buffer_set_member(&minor, &qualified, &args->attrs);
523 gss_release_buffer(&minor, &qualified);
525 major = gss_add_buffer_set_member(&minor, attribute, &args->attrs);
528 return GSS_ERROR(major) == false;
532 * Enumerate attribute types, output is buffer set
535 gss_eap_attr_ctx::getAttributeTypes(gss_buffer_set_t *attrs)
537 eap_gss_get_attr_types_args args;
538 OM_uint32 major, minor;
542 major = gss_create_empty_buffer_set(&minor, attrs);
543 if (GSS_ERROR(major)) {
544 throw new std::bad_alloc;
550 for (i = ATTR_TYPE_MIN; i <= ATTR_TYPE_MAX; i++) {
551 gss_eap_attr_provider *provider = m_providers[i];
555 if (provider == NULL)
558 ret = provider->getAttributeTypes(addAttribute, (void *)&args);
564 gss_release_buffer_set(&minor, attrs);
570 * Get attribute with given name
573 gss_eap_attr_ctx::getAttribute(const gss_buffer_t attr,
577 gss_buffer_t display_value,
580 gss_buffer_desc suffix = GSS_C_EMPTY_BUFFER;
582 gss_eap_attr_provider *provider;
585 decomposeAttributeName(attr, &type, &suffix);
587 provider = m_providers[type];
588 if (provider == NULL)
591 ret = provider->getAttribute(type == ATTR_TYPE_LOCAL ? attr : &suffix,
592 authenticated, complete,
593 value, display_value, more);
599 * Map attribute context to C++ object
602 gss_eap_attr_ctx::mapToAny(int authenticated,
603 gss_buffer_t type_id) const
606 gss_eap_attr_provider *provider;
607 gss_buffer_desc suffix;
609 decomposeAttributeName(type_id, &type, &suffix);
611 provider = m_providers[type];
612 if (provider == NULL)
613 return (gss_any_t)NULL;
615 return provider->mapToAny(authenticated, &suffix);
619 * Release mapped context
622 gss_eap_attr_ctx::releaseAnyNameMapping(gss_buffer_t type_id,
623 gss_any_t input) const
626 gss_eap_attr_provider *provider;
627 gss_buffer_desc suffix;
629 decomposeAttributeName(type_id, &type, &suffix);
631 provider = m_providers[type];
632 if (provider != NULL)
633 provider->releaseAnyNameMapping(&suffix, input);
637 * Export attribute context to buffer
640 gss_eap_attr_ctx::exportToBuffer(gss_buffer_t buffer) const
642 DDF obj = marshall();
643 std::ostringstream sink;
646 std::string str = sink.str();
648 duplicateBuffer(str, buffer);
654 * Return soonest expiry time of providers
657 gss_eap_attr_ctx::getExpiryTime(void) const
660 time_t expiryTime = 0;
662 for (i = ATTR_TYPE_MIN; i <= ATTR_TYPE_MAX; i++) {
663 gss_eap_attr_provider *provider = m_providers[i];
664 time_t providerExpiryTime;
666 if (provider == NULL)
669 providerExpiryTime = provider->getExpiryTime();
670 if (providerExpiryTime == 0)
673 if (expiryTime == 0 || providerExpiryTime < expiryTime)
674 expiryTime = providerExpiryTime;
681 gss_eap_attr_ctx::mapException(OM_uint32 *minor, std::exception &e) const
686 /* Errors we handle ourselves */
687 major = GSS_S_FAILURE;
689 if (typeid(e) == typeid(std::bad_alloc)) {
694 /* Errors we delegate to providers */
695 major = GSS_S_CONTINUE_NEEDED;
697 for (i = ATTR_TYPE_MIN; i <= ATTR_TYPE_MAX; i++) {
698 gss_eap_attr_provider *provider = m_providers[i];
700 if (provider == NULL)
703 major = provider->mapException(minor, e);
704 if (major != GSS_S_CONTINUE_NEEDED)
708 if (major == GSS_S_CONTINUE_NEEDED) {
709 *minor = GSSEAP_ATTR_CONTEXT_FAILURE;
710 major = GSS_S_FAILURE;
715 /* rethrow for now for debugging */
719 assert(GSS_ERROR(major));
725 * Decompose attribute name into prefix and suffix
728 gss_eap_attr_ctx::decomposeAttributeName(const gss_buffer_t attribute,
735 for (i = 0; i < attribute->length; i++) {
736 if (((char *)attribute->value)[i] == ' ') {
737 p = (char *)attribute->value + i + 1;
742 prefix->value = attribute->value;
745 if (p != NULL && *p != '\0') {
746 suffix->length = attribute->length - 1 - prefix->length;
750 suffix->value = NULL;
755 * Decompose attribute name into type and suffix
758 gss_eap_attr_ctx::decomposeAttributeName(const gss_buffer_t attribute,
762 gss_buffer_desc prefix = GSS_C_EMPTY_BUFFER;
764 decomposeAttributeName(attribute, &prefix, suffix);
765 *type = attributePrefixToType(&prefix);
769 * Compose attribute name from prefix, suffix; returns C++ string
772 gss_eap_attr_ctx::composeAttributeName(const gss_buffer_t prefix,
773 const gss_buffer_t suffix)
777 if (prefix == GSS_C_NO_BUFFER || prefix->length == 0)
780 str.append((const char *)prefix->value, prefix->length);
782 if (suffix != GSS_C_NO_BUFFER) {
784 str.append((const char *)suffix->value, suffix->length);
791 * Compose attribute name from type, suffix; returns C++ string
794 gss_eap_attr_ctx::composeAttributeName(unsigned int type,
795 const gss_buffer_t suffix)
797 const gss_buffer_t prefix = attributeTypeToPrefix(type);
799 return composeAttributeName(prefix, suffix);
803 * Compose attribute name from prefix, suffix; returns GSS buffer
806 gss_eap_attr_ctx::composeAttributeName(const gss_buffer_t prefix,
807 const gss_buffer_t suffix,
808 gss_buffer_t attribute)
810 std::string str = composeAttributeName(prefix, suffix);
812 if (str.length() != 0) {
813 return duplicateBuffer(str, attribute);
815 attribute->length = 0;
816 attribute->value = NULL;
821 * Compose attribute name from type, suffix; returns GSS buffer
824 gss_eap_attr_ctx::composeAttributeName(unsigned int type,
825 const gss_buffer_t suffix,
826 gss_buffer_t attribute)
828 gss_buffer_t prefix = attributeTypeToPrefix(type);
830 return composeAttributeName(prefix, suffix, attribute);
837 gssEapInquireName(OM_uint32 *minor,
841 gss_buffer_set_t *attrs)
845 if (name_is_MN != NULL)
846 *name_is_MN = (name->mechanismUsed != GSS_C_NULL_OID);
848 if (MN_mech != NULL) {
849 major = gssEapCanonicalizeOid(minor, name->mechanismUsed,
850 OID_FLAG_NULL_VALID, MN_mech);
851 if (GSS_ERROR(major))
855 if (name->attrCtx == NULL) {
856 *minor = GSSEAP_NO_ATTR_CONTEXT;
857 return GSS_S_UNAVAILABLE;
860 if (GSS_ERROR(gssEapAttrProvidersInit(minor))) {
861 return GSS_S_UNAVAILABLE;
865 if (!name->attrCtx->getAttributeTypes(attrs)) {
866 *minor = GSSEAP_NO_ATTR_CONTEXT;
867 return GSS_S_UNAVAILABLE;
869 } catch (std::exception &e) {
870 return name->attrCtx->mapException(minor, e);
873 return GSS_S_COMPLETE;
877 gssEapGetNameAttribute(OM_uint32 *minor,
883 gss_buffer_t display_value,
894 if (display_value != NULL) {
895 display_value->length = 0;
896 display_value->value = NULL;
899 if (name->attrCtx == NULL) {
900 *minor = GSSEAP_NO_ATTR_CONTEXT;
901 return GSS_S_UNAVAILABLE;
904 if (GSS_ERROR(gssEapAttrProvidersInit(minor))) {
905 return GSS_S_UNAVAILABLE;
909 if (!name->attrCtx->getAttribute(attr, authenticated, complete,
910 value, display_value, more)) {
911 *minor = GSSEAP_NO_SUCH_ATTR;
912 gssEapSaveStatusInfo(*minor, "Unknown naming attribute %.*s",
913 (int)attr->length, (char *)attr->value);
914 return GSS_S_UNAVAILABLE;
916 } catch (std::exception &e) {
917 return name->attrCtx->mapException(minor, e);
920 return GSS_S_COMPLETE;
924 gssEapDeleteNameAttribute(OM_uint32 *minor,
928 if (name->attrCtx == NULL) {
929 *minor = GSSEAP_NO_ATTR_CONTEXT;
930 return GSS_S_UNAVAILABLE;
933 if (GSS_ERROR(gssEapAttrProvidersInit(minor)))
934 return GSS_S_UNAVAILABLE;
937 if (!name->attrCtx->deleteAttribute(attr)) {
938 *minor = GSSEAP_NO_SUCH_ATTR;
939 gssEapSaveStatusInfo(*minor, "Unknown naming attribute %.*s",
940 (int)attr->length, (char *)attr->value);
941 return GSS_S_UNAVAILABLE;
943 } catch (std::exception &e) {
944 return name->attrCtx->mapException(minor, e);
947 return GSS_S_COMPLETE;
951 gssEapSetNameAttribute(OM_uint32 *minor,
957 if (name->attrCtx == NULL) {
958 *minor = GSSEAP_NO_ATTR_CONTEXT;
959 return GSS_S_UNAVAILABLE;
962 if (GSS_ERROR(gssEapAttrProvidersInit(minor)))
963 return GSS_S_UNAVAILABLE;
966 if (!name->attrCtx->setAttribute(complete, attr, value)) {
967 *minor = GSSEAP_NO_SUCH_ATTR;
968 gssEapSaveStatusInfo(*minor, "Unknown naming attribute %.*s",
969 (int)attr->length, (char *)attr->value);
970 return GSS_S_UNAVAILABLE;
972 } catch (std::exception &e) {
973 return name->attrCtx->mapException(minor, e);
976 return GSS_S_COMPLETE;
980 gssEapExportAttrContext(OM_uint32 *minor,
984 if (name->attrCtx == NULL) {
986 buffer->value = NULL;
988 return GSS_S_COMPLETE;
991 if (GSS_ERROR(gssEapAttrProvidersInit(minor)))
992 return GSS_S_UNAVAILABLE;
995 name->attrCtx->exportToBuffer(buffer);
996 } catch (std::exception &e) {
997 return name->attrCtx->mapException(minor, e);
1000 return GSS_S_COMPLETE;
1004 gssEapImportAttrContext(OM_uint32 *minor,
1005 gss_buffer_t buffer,
1008 gss_eap_attr_ctx *ctx = NULL;
1010 assert(name->attrCtx == NULL);
1012 if (GSS_ERROR(gssEapAttrProvidersInit(minor)))
1013 return GSS_S_UNAVAILABLE;
1015 if (buffer->length != 0) {
1017 ctx = new gss_eap_attr_ctx();
1019 if (!ctx->initFromBuffer(buffer)) {
1021 *minor = GSSEAP_BAD_ATTR_TOKEN;
1022 return GSS_S_DEFECTIVE_TOKEN;
1024 name->attrCtx = ctx;
1025 } catch (std::exception &e) {
1027 return name->attrCtx->mapException(minor, e);
1031 return GSS_S_COMPLETE;
1035 gssEapDuplicateAttrContext(OM_uint32 *minor,
1039 gss_eap_attr_ctx *ctx = NULL;
1041 assert(out->attrCtx == NULL);
1043 if (GSS_ERROR(gssEapAttrProvidersInit(minor)))
1044 return GSS_S_UNAVAILABLE;
1047 if (in->attrCtx != NULL) {
1048 ctx = new gss_eap_attr_ctx();
1049 if (!ctx->initFromExistingContext(in->attrCtx)) {
1051 *minor = GSSEAP_ATTR_CONTEXT_FAILURE;
1052 return GSS_S_FAILURE;
1056 } catch (std::exception &e) {
1058 return in->attrCtx->mapException(minor, e);
1061 return GSS_S_COMPLETE;
1065 gssEapMapNameToAny(OM_uint32 *minor,
1068 gss_buffer_t type_id,
1071 if (name->attrCtx == NULL) {
1072 *minor = GSSEAP_NO_ATTR_CONTEXT;
1073 return GSS_S_UNAVAILABLE;
1076 if (GSS_ERROR(gssEapAttrProvidersInit(minor)))
1077 return GSS_S_UNAVAILABLE;
1080 *output = name->attrCtx->mapToAny(authenticated, type_id);
1081 } catch (std::exception &e) {
1082 return name->attrCtx->mapException(minor, e);
1085 return GSS_S_COMPLETE;
1089 gssEapReleaseAnyNameMapping(OM_uint32 *minor,
1091 gss_buffer_t type_id,
1094 if (name->attrCtx == NULL) {
1095 *minor = GSSEAP_NO_ATTR_CONTEXT;
1096 return GSS_S_UNAVAILABLE;
1099 if (GSS_ERROR(gssEapAttrProvidersInit(minor)))
1100 return GSS_S_UNAVAILABLE;
1104 name->attrCtx->releaseAnyNameMapping(type_id, *input);
1106 } catch (std::exception &e) {
1107 return name->attrCtx->mapException(minor, e);
1110 return GSS_S_COMPLETE;
1114 gssEapReleaseAttrContext(OM_uint32 *minor,
1117 if (name->attrCtx != NULL)
1118 delete name->attrCtx;
1121 return GSS_S_COMPLETE;
1125 * Public accessor for initialisng a context from a GSS context. Also
1126 * sets expiry time on GSS context as a side-effect.
1129 gssEapCreateAttrContext(OM_uint32 *minor,
1130 gss_cred_id_t gssCred,
1131 gss_ctx_id_t gssCtx,
1132 struct gss_eap_attr_ctx **pAttrContext,
1133 time_t *pExpiryTime)
1135 gss_eap_attr_ctx *ctx = NULL;
1138 assert(gssCtx != GSS_C_NO_CONTEXT);
1140 major = gssEapAttrProvidersInit(minor);
1141 if (GSS_ERROR(major))
1144 *minor = GSSEAP_ATTR_CONTEXT_FAILURE;
1145 major = GSS_S_FAILURE;
1148 ctx = new gss_eap_attr_ctx();
1149 if (ctx->initFromGssContext(gssCred, gssCtx)) {
1151 major = GSS_S_COMPLETE;
1155 } catch (std::exception &e) {
1157 major = ctx->mapException(minor, e);
1160 if (major == GSS_S_COMPLETE) {
1161 *pAttrContext = ctx;
1162 *pExpiryTime = ctx->getExpiryTime();