GSS_C_INQ_SSPI_SESSION_KEY
authorLuke Howard <lukeh@padl.com>
Wed, 8 Sep 2010 19:22:01 +0000 (21:22 +0200)
committerLuke Howard <lukeh@padl.com>
Wed, 8 Sep 2010 19:22:01 +0000 (21:22 +0200)
mech_eap/inquire_cred_by_oid.c
mech_eap/inquire_sec_context_by_oid.c
mech_eap/map_name_to_any.c
mech_eap/release_any_name_mapping.c
mech_eap/set_cred_option.c

index 651da45..4d42b08 100644 (file)
@@ -48,6 +48,8 @@ gss_inquire_cred_by_oid(OM_uint32 *minor,
     OM_uint32 major = GSS_S_UNAVAILABLE;
     int i;
 
+    *data_set = GSS_C_NO_BUFFER_SET;
+
     for (i = 0; i < sizeof(inquireCredOps) / sizeof(inquireCredOps[0]); i++) {
         if (oidEqual(&inquireCredOps[i].oid, desired_object)) {
             major = (*inquireCredOps[i].inquire)(minor, cred_handle,
index 6718b3d..70e923b 100644 (file)
 
 #include "gssapiP_eap.h"
 
+static OM_uint32
+inquireSessionKey(OM_uint32 *minor,
+                  const gss_ctx_id_t ctx,
+                  const gss_OID desired_object,
+                  gss_buffer_set_t *dataSet)
+{
+    OM_uint32 major, tmpMinor;
+    unsigned char oidBuf[16];
+    gss_buffer_desc buf;
+    gss_OID_desc oid;
+
+    buf.length = ctx->rfc3961Key.length;
+    buf.value = ctx->rfc3961Key.contents;
+
+    major = gss_add_buffer_set_member(minor, &buf, dataSet);
+    if (GSS_ERROR(major))
+        goto cleanup;
+
+    oid.length = sizeof(oidBuf);
+    oid.elements = oidBuf;
+
+    major = composeOid(minor,
+                       "\x2a\x86\x48\x86\xf7\x12\x01\x02\x02\x04",
+                       10,
+                       ctx->encryptionType,
+                       &oid);
+    if (GSS_ERROR(major))
+        goto cleanup;
+
+    buf.length = oid.length;
+    buf.value = oid.elements;
+
+    major = gss_add_buffer_set_member(minor, &buf, dataSet);
+    if (GSS_ERROR(major))
+        goto cleanup;
+
+    major = GSS_S_COMPLETE;
+
+cleanup:
+    if (GSS_ERROR(major) && *dataSet != GSS_C_NO_BUFFER_SET) {
+        gss_buffer_set_t set = *dataSet;
+
+        if (set->count != 0)
+            memset(set->elements[0].value, 0, set->elements[0].length);
+        gss_release_buffer_set(&tmpMinor, dataSet);
+    }
+
+    return major;
+}
+
 static struct {
     gss_OID_desc oid;
     OM_uint32 (*inquire)(OM_uint32 *, const gss_ctx_id_t,
                          const gss_OID, gss_buffer_set_t *);
 } inquireCtxOps[] = {
+    {
+        /* GSS_C_INQ_SSPI_SESSION_KEY */
+        { 11, "\x2a\x86\x48\x86\xf7\x12\x01\x02\x02\x05\x05" },
+        inquireSessionKey
+    },
 };
 
 OM_uint32
@@ -48,6 +103,8 @@ gss_inquire_sec_context_by_oid(OM_uint32 *minor,
     OM_uint32 major = GSS_S_UNAVAILABLE;
     int i;
 
+    *data_set = GSS_C_NO_BUFFER_SET;
+
     for (i = 0; i < sizeof(inquireCtxOps) / sizeof(inquireCtxOps[0]); i++) {
         if (oidEqual(&inquireCtxOps[i].oid, desired_object)) {
             major = (*inquireCtxOps[i].inquire)(minor, context_handle,
index e02fecb..ab5beda 100644 (file)
@@ -39,5 +39,6 @@ gss_map_name_to_any(OM_uint32 *minor,
                     gss_buffer_t type_id,
                     gss_any_t *output)
 {
-    GSSEAP_NOT_IMPLEMENTED;
+    *minor = 0;
+    return GSS_S_UNAVAILABLE;
 }
index 5ccc036..51bed0b 100644 (file)
@@ -38,5 +38,6 @@ gss_release_any_name_mapping(OM_uint32 *minor,
                              gss_buffer_t type_id,
                              gss_any_t *input)
 {
-    GSSEAP_NOT_IMPLEMENTED;
+    *minor = 0;
+    return GSS_S_UNAVAILABLE;
 }
index 09dac65..b75614d 100644 (file)
 
 #include "gssapiP_eap.h"
 
-#if 0
+static struct {
+    gss_OID_desc oid;
+    OM_uint32 (*setOption)(OM_uint32 *, gss_cred_id_t *pCred,
+                           const gss_OID, const gss_buffer_t);
+} setCredOps[] = {
+};
+
 OM_uint32
 gssspi_set_cred_option(OM_uint32 *minor,
-                       gss_cred_id_t cred,
+                       gss_cred_id_t *cred,
                        const gss_OID desired_object,
                        const gss_buffer_t value)
 {
-    GSSEAP_NOT_IMPLEMENTED;
+    OM_uint32 major = GSS_S_UNAVAILABLE;
+    int i;
+
+    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);
+            break;
+        }
+    }
+
+    return major;
 }
-#endif