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;
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;
}
#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;
}
#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;
}
#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;
}
gss_OID_set *elements_stored,
gss_cred_usage_t *cred_usage_stored)
{
- GSSEAP_NOT_IMPLEMENTED;
+ *minor = 0;
+ return GSS_S_UNAVAILABLE;
}