ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb/*
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * lib/gssapi/generic/oid_ops.c
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb *
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * Copyright 1995 by the Massachusetts Institute of Technology.
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * All Rights Reserved.
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb *
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * Export of this software from the United States of America may
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * require a specific license from the United States Government.
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * It is the responsibility of any person or organization contemplating
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * export to obtain such a license before exporting.
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb *
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * distribute this software and its documentation for any purpose and
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * without fee is hereby granted, provided that the above copyright
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * notice appear in all copies and that both that copyright notice and
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * this permission notice appear in supporting documentation, and that
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * the name of M.I.T. not be used in advertising or publicity pertaining
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * to distribution of the software without specific, written prior
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * permission. Furthermore if you modify this software you must label
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * your software as modified software and not distribute it in such a
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * fashion that it might be confused with the original M.I.T. software.
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * M.I.T. makes no representations about the suitability of
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * this software for any purpose. It is provided "as is" without express
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * or implied warranty.
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb *
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb */
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb/*
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * oid_ops.c - GSS-API V2 interfaces to manipulate OIDs
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb */
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb#include "mglueP.h"
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb#ifdef HAVE_UNISTD_H
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb#include <unistd.h>
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb#endif
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb#include <stdlib.h>
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb#include <string.h>
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb#include <stdio.h>
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb#include <gssapi_generic.h>
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb#include <errno.h>
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb#include <ctype.h>
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtbOM_uint32
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtbgeneric_gss_release_oid(minor_status, oid)
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb OM_uint32 *minor_status;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb gss_OID *oid;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb{
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb if (minor_status)
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb *minor_status = 0;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
950bc8fe7190a52f04258a3225f7f6effe543c2amp if (oid == NULL || *oid == GSS_C_NO_OID)
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb return(GSS_S_COMPLETE);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb /*
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * The V2 API says the following!
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb *
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * gss_release_oid[()] will recognize any of the GSSAPI's own OID values,
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * and will silently ignore attempts to free these OIDs; for other OIDs
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * it will call the C free() routine for both the OID data and the
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * descriptor. This allows applications to freely mix their own heap-
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * allocated OID values with OIDs returned by GSS-API.
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb */
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb /*
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * We use the official OID definitions instead of the unofficial OID
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * defintions. But we continue to support the unofficial OID
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * gss_nt_service_name just in case if some gss applications use
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * the old OID.
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb */
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb if ((*oid != GSS_C_NT_USER_NAME) &&
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb (*oid != GSS_C_NT_MACHINE_UID_NAME) &&
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb (*oid != GSS_C_NT_STRING_UID_NAME) &&
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb (*oid != GSS_C_NT_HOSTBASED_SERVICE) &&
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb (*oid != GSS_C_NT_ANONYMOUS) &&
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb (*oid != GSS_C_NT_EXPORT_NAME) &&
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb (*oid != gss_nt_service_name)) {
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb free((*oid)->elements);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb free(*oid);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb *oid = GSS_C_NO_OID;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb return(GSS_S_COMPLETE);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb}
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtbOM_uint32
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtbgeneric_gss_copy_oid(minor_status, oid, new_oid)
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb OM_uint32 *minor_status;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb gss_OID_desc * const oid;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb gss_OID *new_oid;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb{
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb gss_OID p;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb *minor_status = 0;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb p = (gss_OID) malloc(sizeof(gss_OID_desc));
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb if (!p) {
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb *minor_status = ENOMEM;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb return GSS_S_FAILURE;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb p->length = oid->length;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb p->elements = malloc(p->length);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb if (!p->elements) {
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb free(p);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb return GSS_S_FAILURE;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb memcpy(p->elements, oid->elements, p->length);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb *new_oid = p;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb return(GSS_S_COMPLETE);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb}
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtbOM_uint32
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtbgeneric_gss_create_empty_oid_set(minor_status, oid_set)
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb OM_uint32 *minor_status;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb gss_OID_set *oid_set;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb{
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb *minor_status = 0;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb if ((*oid_set = (gss_OID_set) malloc(sizeof(gss_OID_set_desc)))) {
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb memset(*oid_set, 0, sizeof(gss_OID_set_desc));
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb return(GSS_S_COMPLETE);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb else {
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb *minor_status = ENOMEM;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb return(GSS_S_FAILURE);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb}
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtbOM_uint32
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtbgeneric_gss_add_oid_set_member(minor_status, member_oid, oid_set)
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb OM_uint32 *minor_status;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb gss_OID_desc * const member_oid;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb gss_OID_set *oid_set;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb{
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb gss_OID elist;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb gss_OID lastel;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb *minor_status = 0;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb if (member_oid == NULL || member_oid->length == 0 ||
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb member_oid->elements == NULL)
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb return (GSS_S_CALL_INACCESSIBLE_READ);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb elist = (*oid_set)->elements;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb /* Get an enlarged copy of the array */
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb if (((*oid_set)->elements = (gss_OID) malloc(((*oid_set)->count+1) *
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb sizeof(gss_OID_desc)))) {
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb /* Copy in the old junk */
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb if (elist)
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb memcpy((*oid_set)->elements,
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb elist,
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb ((*oid_set)->count * sizeof(gss_OID_desc)));
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb /* Duplicate the input element */
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb lastel = &(*oid_set)->elements[(*oid_set)->count];
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb if ((lastel->elements =
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb (void *) malloc((size_t) member_oid->length))) {
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb /* Success - copy elements */
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb memcpy(lastel->elements, member_oid->elements,
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb (size_t) member_oid->length);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb /* Set length */
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb lastel->length = member_oid->length;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb /* Update count */
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb (*oid_set)->count++;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb if (elist)
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb free(elist);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb *minor_status = 0;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb return(GSS_S_COMPLETE);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb else
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb free((*oid_set)->elements);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb /* Failure - restore old contents of list */
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb (*oid_set)->elements = elist;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb *minor_status = ENOMEM;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb return(GSS_S_FAILURE);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb}
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtbOM_uint32
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtbgeneric_gss_test_oid_set_member(minor_status, member, set, present)
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb OM_uint32 *minor_status;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb gss_OID_desc * const member;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb gss_OID_set set;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb int *present;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb{
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb OM_uint32 i;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb int result;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb *minor_status = 0;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb if (member == NULL || set == NULL)
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb return (GSS_S_CALL_INACCESSIBLE_READ);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb if (present == NULL)
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb return (GSS_S_CALL_INACCESSIBLE_WRITE);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb result = 0;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb for (i=0; i<set->count; i++) {
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb if ((set->elements[i].length == member->length) &&
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb !memcmp(set->elements[i].elements,
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb member->elements,
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb (size_t) member->length)) {
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb result = 1;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb break;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb *present = result;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb return(GSS_S_COMPLETE);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb}
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb/*
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * OID<->string routines. These are uuuuugly.
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb */
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtbOM_uint32
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtbgeneric_gss_oid_to_str(minor_status, oid, oid_str)
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb OM_uint32 *minor_status;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb gss_OID_desc * const oid;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb gss_buffer_t oid_str;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb{
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb char numstr[128];
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb OM_uint32 number;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb int numshift;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb OM_uint32 string_length;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb OM_uint32 i;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb unsigned char *cp;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb char *bp;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
950bc8fe7190a52f04258a3225f7f6effe543c2amp if (minor_status != NULL)
950bc8fe7190a52f04258a3225f7f6effe543c2amp *minor_status = 0;
950bc8fe7190a52f04258a3225f7f6effe543c2amp
950bc8fe7190a52f04258a3225f7f6effe543c2amp if (oid_str != GSS_C_NO_BUFFER) {
950bc8fe7190a52f04258a3225f7f6effe543c2amp oid_str->length = 0;
950bc8fe7190a52f04258a3225f7f6effe543c2amp oid_str->value = NULL;
950bc8fe7190a52f04258a3225f7f6effe543c2amp }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb if (oid == NULL || oid->length == 0 || oid->elements == NULL)
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb return (GSS_S_CALL_INACCESSIBLE_READ);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
950bc8fe7190a52f04258a3225f7f6effe543c2amp if (oid_str == GSS_C_NO_BUFFER)
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb return (GSS_S_CALL_INACCESSIBLE_WRITE);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb /* Decoded according to krb5/gssapi_krb5.c */
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb /* First determine the size of the string */
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb string_length = 0;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb number = 0;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb numshift = 0;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb cp = (unsigned char *) oid->elements;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb number = (unsigned long) cp[0];
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb snprintf(numstr, sizeof(numstr), "%lu ", (unsigned long)number/40);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb string_length += strlen(numstr);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb snprintf(numstr, sizeof(numstr), "%lu ", (unsigned long)number%40);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb string_length += strlen(numstr);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb for (i=1; i<oid->length; i++) {
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb if ((OM_uint32) (numshift+7) < (sizeof (OM_uint32)*8)) {/* XXX */
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb number = (number << 7) | (cp[i] & 0x7f);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb numshift += 7;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb else {
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb return(GSS_S_FAILURE);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb if ((cp[i] & 0x80) == 0) {
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb snprintf(numstr, sizeof(numstr), "%lu ", (unsigned long)number);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb string_length += strlen(numstr);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb number = 0;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb numshift = 0;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb /*
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * If we get here, we've calculated the length of "n n n ... n ". Add 4
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * here for "{ " and "}\0".
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb */
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb string_length += 4;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb if ((bp = (char *) malloc(string_length))) {
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb strcpy(bp, "{ ");
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb number = (OM_uint32) cp[0];
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb snprintf(numstr, sizeof(numstr), "%lu ", (unsigned long)number/40);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb strcat(bp, numstr);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb snprintf(numstr, sizeof(numstr), "%lu ", (unsigned long)number%40);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb strcat(bp, numstr);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb number = 0;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb cp = (unsigned char *) oid->elements;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb for (i=1; i<oid->length; i++) {
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb number = (number << 7) | (cp[i] & 0x7f);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb if ((cp[i] & 0x80) == 0) {
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb snprintf(numstr, sizeof(numstr), "%lu ", (unsigned long)number);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb strcat(bp, numstr);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb number = 0;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb strcat(bp, "}");
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb oid_str->length = strlen(bp)+1;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb oid_str->value = (void *) bp;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb return(GSS_S_COMPLETE);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb *minor_status = ENOMEM;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb return(GSS_S_FAILURE);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb}
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtbOM_uint32
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtbgeneric_gss_str_to_oid(minor_status, oid_str, oid)
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb OM_uint32 *minor_status;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb gss_buffer_t oid_str;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb gss_OID *oid;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb{
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb unsigned char *cp, *bp, *startp;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb int brace;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb long numbuf;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb long onumbuf;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb OM_uint32 nbytes;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb int index;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb unsigned char *op;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
950bc8fe7190a52f04258a3225f7f6effe543c2amp if (minor_status != NULL)
950bc8fe7190a52f04258a3225f7f6effe543c2amp *minor_status = 0;
950bc8fe7190a52f04258a3225f7f6effe543c2amp
950bc8fe7190a52f04258a3225f7f6effe543c2amp if (oid != NULL)
950bc8fe7190a52f04258a3225f7f6effe543c2amp *oid = GSS_C_NO_OID;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb if (GSS_EMPTY_BUFFER(oid_str))
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb return (GSS_S_CALL_INACCESSIBLE_READ);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb if (oid == NULL)
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb return (GSS_S_CALL_INACCESSIBLE_WRITE);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb brace = 0;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb bp = oid_str->value;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb cp = bp;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb /* Skip over leading space */
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb while ((bp < &cp[oid_str->length]) && isspace(*bp))
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb bp++;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb if (*bp == '{') {
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb brace = 1;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb bp++;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb while ((bp < &cp[oid_str->length]) && isspace(*bp))
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb bp++;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb startp = bp;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb nbytes = 0;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb /*
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * The first two numbers are chewed up by the first octet.
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb */
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb if (sscanf((char *)bp, "%ld", &numbuf) != 1) {
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb *minor_status = EINVAL;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb return(GSS_S_FAILURE);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb while ((bp < &cp[oid_str->length]) && isdigit(*bp))
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb bp++;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb while ((bp < &cp[oid_str->length]) && isspace(*bp))
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb bp++;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb if (sscanf((char *)bp, "%ld", &numbuf) != 1) {
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb *minor_status = EINVAL;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb return(GSS_S_FAILURE);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb while ((bp < &cp[oid_str->length]) && isdigit(*bp))
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb bp++;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb while ((bp < &cp[oid_str->length]) &&
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb (isspace(*bp) || *bp == '.'))
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb bp++;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb nbytes++;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb while (isdigit(*bp)) {
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb if (sscanf((char *)bp, "%ld", &numbuf) != 1) {
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb return(GSS_S_FAILURE);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb while (numbuf) {
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb nbytes++;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb numbuf >>= 7;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb while ((bp < &cp[oid_str->length]) && isdigit(*bp))
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb bp++;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb while ((bp < &cp[oid_str->length]) &&
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb (isspace(*bp) || *bp == '.'))
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb bp++;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb if (brace && (*bp != '}')) {
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb return(GSS_S_FAILURE);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb /*
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * Phew! We've come this far, so the syntax is good.
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb */
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb if ((*oid = (gss_OID) malloc(sizeof(gss_OID_desc)))) {
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb if (((*oid)->elements = (void *) malloc(nbytes))) {
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb (*oid)->length = nbytes;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb op = (unsigned char *) (*oid)->elements;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb bp = startp;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb (void) sscanf((char *)bp, "%ld", &numbuf);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb while (isdigit(*bp))
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb bp++;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb while (isspace(*bp) || *bp == '.')
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb bp++;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb onumbuf = 40*numbuf;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb (void) sscanf((char *)bp, "%ld", &numbuf);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb onumbuf += numbuf;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb *op = (unsigned char) onumbuf;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb op++;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb while (isdigit(*bp))
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb bp++;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb while (isspace(*bp) || *bp == '.')
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb bp++;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb while (isdigit(*bp)) {
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb (void) sscanf((char *)bp, "%ld", &numbuf);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb nbytes = 0;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb /* Have to fill in the bytes msb-first */
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb onumbuf = numbuf;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb while (numbuf) {
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb nbytes++;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb numbuf >>= 7;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb numbuf = onumbuf;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb op += nbytes;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb index = -1;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb while (numbuf) {
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb op[index] = (unsigned char) numbuf & 0x7f;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb if (index != -1)
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb op[index] |= 0x80;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb index--;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb numbuf >>= 7;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb while (isdigit(*bp))
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb bp++;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb while (isspace(*bp) || *bp == '.')
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb bp++;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb return(GSS_S_COMPLETE);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb else {
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb free(*oid);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb *oid = GSS_C_NO_OID;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb return(GSS_S_FAILURE);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb}
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry/* Compose an OID of a prefix and an integer suffix */
ba7b222e36bac28710a7f43739283302b617e7f5Glenn BarryOM_uint32
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barrygeneric_gss_oid_compose(
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry OM_uint32 *minor_status,
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry const char *prefix,
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry size_t prefix_len,
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry int suffix,
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry gss_OID_desc *oid)
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry{
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry int osuffix, i;
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry size_t nbytes;
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry unsigned char *op;
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry if (oid == GSS_C_NO_OID) {
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry *minor_status = EINVAL;
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry return GSS_S_FAILURE;
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry }
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry if (oid->length < prefix_len) {
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry *minor_status = ERANGE;
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry return GSS_S_FAILURE;
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry }
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry memcpy(oid->elements, prefix, prefix_len);
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry nbytes = 0;
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry osuffix = suffix;
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry while (suffix) {
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry nbytes++;
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry suffix >>= 7;
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry }
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry suffix = osuffix;
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry if (oid->length < prefix_len + nbytes) {
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry *minor_status = ERANGE;
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry return GSS_S_FAILURE;
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry }
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry op = (unsigned char *) oid->elements + prefix_len + nbytes;
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry i = -1;
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry while (suffix) {
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry op[i] = (unsigned char)suffix & 0x7f;
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry if (i != -1)
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry op[i] |= 0x80;
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry i--;
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry suffix >>= 7;
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry }
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry oid->length = prefix_len + nbytes;
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry *minor_status = 0;
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry return GSS_S_COMPLETE;
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry}
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry
ba7b222e36bac28710a7f43739283302b617e7f5Glenn BarryOM_uint32
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barrygeneric_gss_oid_decompose(
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry OM_uint32 *minor_status,
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry const char *prefix,
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry size_t prefix_len,
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry gss_OID_desc *oid,
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry int *suffix)
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry{
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry size_t i, slen;
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry unsigned char *op;
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry if (oid->length < prefix_len ||
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry memcmp(oid->elements, prefix, prefix_len) != 0) {
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry return GSS_S_BAD_MECH;
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry }
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry op = (unsigned char *) oid->elements + prefix_len;
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry *suffix = 0;
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry slen = oid->length - prefix_len;
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry for (i = 0; i < slen; i++) {
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry *suffix = (*suffix << 7) | (op[i] & 0x7f);
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry if (i + 1 != slen && (op[i] & 0x80) == 0) {
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry *minor_status = EINVAL;
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry return GSS_S_FAILURE;
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry }
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry }
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry return GSS_S_COMPLETE;
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry}
ba7b222e36bac28710a7f43739283302b617e7f5Glenn Barry
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb/*
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * Copyright 1993 by OpenVision Technologies, Inc.
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb *
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * Permission to use, copy, modify, distribute, and sell this software
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * and its documentation for any purpose is hereby granted without fee,
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * provided that the above copyright notice appears in all copies and
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * that both that copyright notice and this permission notice appear in
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * supporting documentation, and that the name of OpenVision not be used
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * in advertising or publicity pertaining to distribution of the software
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * without specific, written prior permission. OpenVision makes no
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * representations about the suitability of this software for any
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * purpose. It is provided "as is" without express or implied warranty.
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb *
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb * PERFORMANCE OF THIS SOFTWARE.
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb */
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtbOM_uint32
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtbgssint_copy_oid_set(
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb OM_uint32 *minor_status,
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb const gss_OID_set_desc * const oidset,
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb gss_OID_set *new_oidset
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb )
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb{
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb gss_OID_set_desc *copy;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb OM_uint32 minor = 0;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb OM_uint32 major = GSS_S_COMPLETE;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb OM_uint32 index;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
950bc8fe7190a52f04258a3225f7f6effe543c2amp if (minor_status != NULL)
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb *minor_status = 0;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
950bc8fe7190a52f04258a3225f7f6effe543c2amp if (new_oidset != NULL)
950bc8fe7190a52f04258a3225f7f6effe543c2amp *new_oidset = GSS_C_NO_OID_SET;
950bc8fe7190a52f04258a3225f7f6effe543c2amp
950bc8fe7190a52f04258a3225f7f6effe543c2amp if (oidset == GSS_C_NO_OID_SET)
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb return (GSS_S_CALL_INACCESSIBLE_READ);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb if (new_oidset == NULL)
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb return (GSS_S_CALL_INACCESSIBLE_WRITE);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb if ((copy = (gss_OID_set_desc *) calloc(1, sizeof (*copy))) == NULL) {
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb major = GSS_S_FAILURE;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb goto done;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb if ((copy->elements = (gss_OID_desc *)
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb calloc(oidset->count, sizeof (*copy->elements))) == NULL) {
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb major = GSS_S_FAILURE;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb goto done;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb copy->count = oidset->count;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb for (index = 0; index < copy->count; index++) {
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb gss_OID_desc *out = &copy->elements[index];
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb gss_OID_desc *in = &oidset->elements[index];
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb if ((out->elements = (void *) malloc(in->length)) == NULL) {
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb major = GSS_S_FAILURE;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb goto done;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb (void) memcpy(out->elements, in->elements, in->length);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb out->length = in->length;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb *new_oidset = copy;
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtbdone:
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb if (major != GSS_S_COMPLETE) {
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb (void) gss_release_oid_set(&minor, &copy);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb }
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb return (major);
ab9b2e153c3a9a2b1141fefa87925b1a9beb1236gtb}