X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=set_cred_option.c;h=bfffa1fc241130d2c604df7c1c7aa461aba0ab3c;hb=refs%2Fheads%2Fjson-name;hp=b42dd80be0162fe95335d573ea85b77c1b8da218;hpb=6fd9f5a521f9efa7cb9dd43f90ae8f33c83c66e1;p=mech_eap.orig diff --git a/set_cred_option.c b/set_cred_option.c index b42dd80..bfffa1f 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,13 +30,17 @@ * SUCH DAMAGE. */ +/* + * Set an extended property on a credential handle. + */ + #include "gssapiP_eap.h" static OM_uint32 -setCredRadiusConfig(OM_uint32 *minor, - gss_cred_id_t cred, - const gss_OID oid, - const gss_buffer_t buffer) +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; @@ -48,7 +52,7 @@ setCredRadiusConfig(OM_uint32 *minor, } if (cred->radiusConfigFile != NULL) - free(cred->radiusConfigFile); + GSSEAP_FREE(cred->radiusConfigFile); cred->radiusConfigFile = (char *)configFileBuffer.value; @@ -57,16 +61,45 @@ setCredRadiusConfig(OM_uint32 *minor, } 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, + const gss_OID oid GSSEAP_UNUSED, const gss_buffer_t buffer) { OM_uint32 flags; unsigned char *p; - if (buffer == GSS_C_NO_BUFFER || buffer->length < 4) { + 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; } @@ -88,41 +121,57 @@ static struct { 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.21.3.3.1 */ + /* 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\x15\x03\x03\x01" }, - setCredRadiusConfig, + { 11, "\x2B\x06\x01\x04\x01\xA9\x4A\x16\x03\x03\x02" }, + setCredRadiusConfigStanza, }, - /* 1.3.6.1.4.1.5322.21.3.3.2 */ + /* 1.3.6.1.4.1.5322.22.3.3.3 */ { - { 11, "\x2B\x06\x01\x04\x01\xA9\x4A\x15\x03\x03\x02" }, + { 11, "\x2B\x06\x01\x04\x01\xA9\x4A\x16\x03\x03\x03" }, setCredFlag, }, }; -gss_OID GSS_EAP_CRED_SET_RADIUS_CONFIG = &setCredOps[0].oid; -gss_OID GSS_EAP_CRED_SET_CRED_FLAG = &setCredOps[1].oid; +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) + 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; } @@ -142,7 +191,7 @@ gsseap_set_cred_flag(OM_uint32 *minor, store_uint32_be(flag, buf); buf[4] = (clear != 0); - return gssspi_set_cred_option(minor, cred, + return gssspi_set_cred_option(minor, &cred, GSS_EAP_CRED_SET_CRED_FLAG, &value); } #endif