X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=set_cred_option.c;h=5f37c8414cfd048b2e3ac5d5849b2d77420e2e35;hb=ae79fdae047f980d01b2b4e84ccea52e24d8c7a0;hp=d5c57094a5f9a1d680eb69f86bfd734349a0e5aa;hpb=d4fe7ce93304facaf069792c347b01b25ab765ae;p=mech_eap.orig diff --git a/set_cred_option.c b/set_cred_option.c index d5c5709..5f37c84 100644 --- a/set_cred_option.c +++ b/set_cred_option.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, JANET(UK) + * Copyright (c) 2011, JANET(UK) * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -30,31 +30,168 @@ * SUCH DAMAGE. */ +/* + * Set an extended property on a credential handle. + */ + #include "gssapiP_eap.h" +static OM_uint32 +setCredRadiusConfigFile(OM_uint32 *minor, + gss_cred_id_t cred, + const gss_OID oid GSSEAP_UNUSED, + const gss_buffer_t buffer) +{ + OM_uint32 major; + gss_buffer_desc configFileBuffer = GSS_C_EMPTY_BUFFER; + + if (buffer != GSS_C_NO_BUFFER && buffer->length != 0) { + major = duplicateBuffer(minor, buffer, &configFileBuffer); + if (GSS_ERROR(major)) + return major; + } + + if (cred->radiusConfigFile != NULL) + GSSEAP_FREE(cred->radiusConfigFile); + + cred->radiusConfigFile = (char *)configFileBuffer.value; + + *minor = 0; + return GSS_S_COMPLETE; +} + +static OM_uint32 +setCredRadiusConfigStanza(OM_uint32 *minor, + gss_cred_id_t cred, + const gss_OID oid GSSEAP_UNUSED, + const gss_buffer_t buffer) +{ + OM_uint32 major; + gss_buffer_desc configStanzaBuffer = GSS_C_EMPTY_BUFFER; + + if (buffer != GSS_C_NO_BUFFER && buffer->length != 0) { + major = duplicateBuffer(minor, buffer, &configStanzaBuffer); + if (GSS_ERROR(major)) + return major; + } + + if (cred->radiusConfigStanza != NULL) + GSSEAP_FREE(cred->radiusConfigStanza); + + cred->radiusConfigStanza = (char *)configStanzaBuffer.value; + + *minor = 0; + return GSS_S_COMPLETE; +} + +static OM_uint32 +setCredFlag(OM_uint32 *minor, + gss_cred_id_t cred, + const gss_OID oid GSSEAP_UNUSED, + const gss_buffer_t buffer) +{ + OM_uint32 flags; + unsigned char *p; + + if (buffer == GSS_C_NO_BUFFER) { + *minor = EINVAL; + return GSS_S_CALL_INACCESSIBLE_READ | GSS_S_FAILURE; + } + + if (buffer->length < 4) { + *minor = GSSEAP_WRONG_SIZE; + return GSS_S_FAILURE; + } + + p = (unsigned char *)buffer->value; + + flags = load_uint32_be(buffer->value) & CRED_FLAG_PUBLIC_MASK; + + if (buffer->length > 4 && p[4]) + cred->flags &= ~(flags); + else + cred->flags |= flags; + + *minor = 0; + return GSS_S_COMPLETE; +} + static struct { gss_OID_desc oid; - OM_uint32 (*setOption)(OM_uint32 *, gss_cred_id_t *pCred, + OM_uint32 (*setOption)(OM_uint32 *, gss_cred_id_t cred, const gss_OID, const gss_buffer_t); } setCredOps[] = { + /* 1.3.6.1.4.1.5322.22.3.3.1 */ + { + { 11, "\x2B\x06\x01\x04\x01\xA9\x4A\x16\x03\x03\x01" }, + setCredRadiusConfigFile, + }, + /* 1.3.6.1.4.1.5322.22.3.3.2 */ + { + { 11, "\x2B\x06\x01\x04\x01\xA9\x4A\x16\x03\x03\x02" }, + setCredRadiusConfigStanza, + }, + /* 1.3.6.1.4.1.5322.22.3.3.3 */ + { + { 11, "\x2B\x06\x01\x04\x01\xA9\x4A\x16\x03\x03\x03" }, + setCredFlag, + }, }; +gss_OID GSS_EAP_CRED_SET_RADIUS_CONFIG_FILE = &setCredOps[0].oid; +gss_OID GSS_EAP_CRED_SET_RADIUS_CONFIG_STANZA = &setCredOps[1].oid; +gss_OID GSS_EAP_CRED_SET_CRED_FLAG = &setCredOps[2].oid; + OM_uint32 gssspi_set_cred_option(OM_uint32 *minor, - gss_cred_id_t cred, + gss_cred_id_t *pCred, const gss_OID desired_object, const gss_buffer_t value) { - OM_uint32 major = GSS_S_UNAVAILABLE; + OM_uint32 major; + gss_cred_id_t cred = *pCred; int i; + if (cred == GSS_C_NO_CREDENTIAL) { + *minor = EINVAL; + return GSS_S_UNAVAILABLE; + } + + GSSEAP_MUTEX_LOCK(&cred->mutex); + + major = GSS_S_UNAVAILABLE; + *minor = GSSEAP_BAD_CRED_OPTION; + for (i = 0; i < sizeof(setCredOps) / sizeof(setCredOps[0]); i++) { if (oidEqual(&setCredOps[i].oid, desired_object)) { - major = (*setCredOps[i].setOption)(minor, &cred, - desired_object, value); + major = (*setCredOps[i].setOption)(minor, cred, + desired_object, value); break; } } + GSSEAP_MUTEX_UNLOCK(&cred->mutex); + return major; } + +#if 0 +OM_uint32 +gsseap_set_cred_flag(OM_uint32 *minor, + gss_cred_id_t cred, + OM_uint32 flag, + int clear) +{ + unsigned char buf[5]; + gss_buffer_desc value; + + value.length = sizeof(buf); + value.value = buf; + + store_uint32_be(flag, buf); + buf[4] = (clear != 0); + + return gssspi_set_cred_option(minor, cred, + GSS_EAP_CRED_SET_CRED_FLAG, &value); +} +#endif