/*
- * Copyright (c) 2010, JANET(UK)
+ * Copyright (c) 2011, JANET(UK)
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
*
*/
+/*
+ * OID utility routines.
+ */
+
#include "gssapiP_eap.h"
-#if 0
OM_uint32
-copyOid(OM_uint32 *minor_status,
- const gss_OID_desc * const oid,
- gss_OID *new_oid)
+duplicateOid(OM_uint32 *minor,
+ const gss_OID_desc * const oid,
+ gss_OID *newOid)
{
- gss_OID p;
+ gss_OID p;
- *minor_status = 0;
+ *newOid = GSS_C_NO_OID;
- p = (gss_OID) malloc(sizeof(gss_OID_desc));
- if (!p) {
- *minor_status = ENOMEM;
+ p = (gss_OID)GSSEAP_MALLOC(sizeof(*p));
+ if (p == NULL) {
+ *minor = ENOMEM;
return GSS_S_FAILURE;
}
p->length = oid->length;
- p->elements = malloc(p->length);
- if (!p->elements) {
- free(p);
+ p->elements = GSSEAP_MALLOC(p->length);
+ if (p->elements == NULL) {
+ GSSEAP_FREE(p);
+ *minor = ENOMEM;
return GSS_S_FAILURE;
}
+
memcpy(p->elements, oid->elements, p->length);
- *new_oid = p;
- return(GSS_S_COMPLETE);
+ *newOid = p;
+
+ *minor = 0;
+ return GSS_S_COMPLETE;
}
-#endif
/* Compose an OID of a prefix and an integer suffix */
OM_uint32
-composeOid(OM_uint32 *minor_status,
+composeOid(OM_uint32 *minor,
const char *prefix,
size_t prefix_len,
int suffix,
unsigned char *op;
if (oid == GSS_C_NO_OID) {
- *minor_status = EINVAL;
- return GSS_S_FAILURE;
+ *minor = EINVAL;
+ return GSS_S_CALL_INACCESSIBLE_READ | GSS_S_FAILURE;
}
+
if (oid->length < prefix_len) {
- *minor_status = ERANGE;
+ *minor = GSSEAP_WRONG_SIZE;
return GSS_S_FAILURE;
}
suffix = osuffix;
if (oid->length < prefix_len + nbytes) {
- *minor_status = ERANGE;
+ *minor = GSSEAP_WRONG_SIZE;
return GSS_S_FAILURE;
}
oid->length = prefix_len + nbytes;
- *minor_status = 0;
+ *minor = 0;
return GSS_S_COMPLETE;
}
OM_uint32
-decomposeOid(OM_uint32 *minor_status,
+decomposeOid(OM_uint32 *minor,
const char *prefix,
size_t prefix_len,
gss_OID_desc *oid,
for (i = 0; i < slen; i++) {
*suffix = (*suffix << 7) | (op[i] & 0x7f);
if (i + 1 != slen && (op[i] & 0x80) == 0) {
- *minor_status = EINVAL;
+ *minor = GSSEAP_WRONG_SIZE;
return GSS_S_FAILURE;
}
}
return GSS_S_COMPLETE;
}
-#if 0
OM_uint32
-gssEapReleaseOid(OM_uint32 *minor, gss_OID *oid)
+duplicateOidSet(OM_uint32 *minor,
+ const gss_OID_set src,
+ gss_OID_set *dst)
{
- OM_uint32 major;
-
- major = gss_internal_release_oid(minor, oid);
- if (major == GSS_S_CONTINUE_NEEDED) {
- GSSEAP_FREE(oid->elements);
- GSSEAP_FREE(oid);
- *oid = GSS_C_NO_OID;
- major = GSS_S_COMPLETE;
+ OM_uint32 major, tmpMinor;
+ int i;
+
+ if (src == GSS_C_NO_OID_SET) {
+ *dst = GSS_C_NO_OID_SET;
+ return GSS_S_COMPLETE;
}
+ major = gss_create_empty_oid_set(minor, dst);
+ if (GSS_ERROR(major))
+ return major;
+
+ for (i = 0; i < src->count; i++) {
+ gss_OID oid = &src->elements[i];
+
+ major = gss_add_oid_set_member(minor, oid, dst);
+ if (GSS_ERROR(major))
+ break;
+ }
+
+ if (GSS_ERROR(major))
+ gss_release_oid_set(&tmpMinor, dst);
+
return major;
}
-#endif