work on cred functions
authorLuke Howard <lukeh@padl.com>
Wed, 8 Sep 2010 17:48:00 +0000 (19:48 +0200)
committerLuke Howard <lukeh@padl.com>
Wed, 8 Sep 2010 17:48:00 +0000 (19:48 +0200)
mech_eap/inquire_context.c
mech_eap/inquire_cred.c
mech_eap/inquire_cred_by_oid.c
mech_eap/inquire_sec_context_by_oid.c
mech_eap/set_sec_context_option.c
mech_eap/store_cred.c

index fec50af..d1143e8 100644 (file)
@@ -66,7 +66,12 @@ gss_inquire_context(OM_uint32 *minor,
 
     if (lifetime_rec != NULL) {
         time_t now = time(NULL);
-        time_t lifetime = now - ctx->expiryTime;
+        time_t lifetime;
+
+        if (ctx->expiryTime == ~0)
+            lifetime = GSS_C_INDEFINITE;
+        else
+            lifetime = now - ctx->expiryTime;
 
         if (lifetime < 0)
             lifetime = 0;
index 8c24866..986bdf6 100644 (file)
 
 OM_uint32
 gss_inquire_cred(OM_uint32 *minor,
-                 gss_cred_id_t cred_handle,
+                 gss_cred_id_t cred,
                  gss_name_t *name,
-                 OM_uint32 *lifetime,
+                 OM_uint32 *pLifetime,
                  gss_cred_usage_t *cred_usage,
                  gss_OID_set *mechanisms)
 {
-    GSSEAP_NOT_IMPLEMENTED;
+    OM_uint32 major = GSS_S_COMPLETE;
+
+    if (name != NULL) {
+        major = gss_duplicate_name(minor, cred->name, name);
+        if (GSS_ERROR(major))
+            goto cleanup;
+    }
+
+    if (pLifetime != NULL) {
+        time_t now = time(NULL);
+        time_t lifetime; 
+        if (cred->expiryTime == ~0) 
+            lifetime = GSS_C_INDEFINITE; 
+        else 
+            lifetime = now - cred->expiryTime;
+
+        if (lifetime < 0)
+            lifetime = 0;
+
+        *pLifetime = lifetime;
+    }
+
+    if (cred_usage != NULL) {
+        OM_uint32 flags = (cred->flags & (CRED_FLAG_INITIATE | CRED_FLAG_ACCEPT));
+
+        switch (flags) {
+        case CRED_FLAG_INITIATE:
+            *cred_usage = GSS_C_INITIATE;
+            break;
+        case CRED_FLAG_ACCEPT:
+            *cred_usage = GSS_C_ACCEPT;
+            break;
+        default:
+            *cred_usage = GSS_C_BOTH;
+            break;
+        }
+    }
+
+    if (mechanisms != NULL) {
+        if (cred->mechanisms != GSS_C_NO_OID_SET)
+            major = duplicateOidSet(minor, cred->mechanisms, mechanisms);
+        else
+            major = gssEapIndicateMechs(minor, mechanisms);
+        if (GSS_ERROR(major))
+            goto cleanup;
+    }
+
+cleanup:
+    return major;
 }
index e6d2972..651da45 100644 (file)
 
 #include "gssapiP_eap.h"
 
+static struct {
+    gss_OID_desc oid;
+    OM_uint32 (*inquire)(OM_uint32 *, const gss_cred_id_t,
+                         const gss_OID, gss_buffer_set_t *);
+} inquireCredOps[] = {
+};
+
 OM_uint32
 gss_inquire_cred_by_oid(OM_uint32 *minor,
                         const gss_cred_id_t cred_handle,
                         const gss_OID desired_object,
                         gss_buffer_set_t *data_set)
 {
-    GSSEAP_NOT_IMPLEMENTED;
+    OM_uint32 major = GSS_S_UNAVAILABLE;
+    int i;
+
+    for (i = 0; i < sizeof(inquireCredOps) / sizeof(inquireCredOps[0]); i++) {
+        if (oidEqual(&inquireCredOps[i].oid, desired_object)) {
+            major = (*inquireCredOps[i].inquire)(minor, cred_handle,
+                                                 desired_object, data_set);
+            break;
+        }
+    }
+
+    return major;
 }
index 578a955..6718b3d 100644 (file)
 
 #include "gssapiP_eap.h"
 
+static struct {
+    gss_OID_desc oid;
+    OM_uint32 (*inquire)(OM_uint32 *, const gss_ctx_id_t,
+                         const gss_OID, gss_buffer_set_t *);
+} inquireCtxOps[] = {
+};
+
 OM_uint32
 gss_inquire_sec_context_by_oid(OM_uint32 *minor,
                                const gss_ctx_id_t context_handle,
                                const gss_OID desired_object,
                                gss_buffer_set_t *data_set)
 {
-    GSSEAP_NOT_IMPLEMENTED;
+    OM_uint32 major = GSS_S_UNAVAILABLE;
+    int i;
+
+    for (i = 0; i < sizeof(inquireCtxOps) / sizeof(inquireCtxOps[0]); i++) {
+        if (oidEqual(&inquireCtxOps[i].oid, desired_object)) {
+            major = (*inquireCtxOps[i].inquire)(minor, context_handle,
+                                                 desired_object, data_set);
+            break;
+        }
+    }
+
+    return major;
 }
index 3b1abf5..07ad740 100644 (file)
 
 #include "gssapiP_eap.h"
 
+static struct {
+    gss_OID_desc oid;
+    OM_uint32 (*setOption)(OM_uint32 *, gss_ctx_id_t *pCtx,
+                           const gss_OID, const gss_buffer_t);
+} setCtxOps[] = {
+};
+
 OM_uint32
 gss_set_sec_context_option(OM_uint32 *minor,
-                           gss_ctx_id_t *pCred,
+                           gss_ctx_id_t *pCtx,
                            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(setCtxOps) / sizeof(setCtxOps[0]); i++) {
+        if (oidEqual(&setCtxOps[i].oid, desired_object)) {
+            major = (*setCtxOps[i].setOption)(minor, pCtx,
+                                              desired_object, value);
+            break;
+        }
+    }
+
+    return major;
 }
index ce45d02..4ddac48 100644 (file)
@@ -42,5 +42,6 @@ gss_store_cred(OM_uint32 *minor,
                gss_OID_set *elements_stored,
                gss_cred_usage_t *cred_usage_stored)
 {
-    GSSEAP_NOT_IMPLEMENTED;
+    *minor = 0;
+    return GSS_S_UNAVAILABLE;
 }