114 lines
3.7 KiB
C
114 lines
3.7 KiB
C
|
|
/************************************************************************/
|
||
|
|
/* SISCO SOFTWARE MODULE HEADER *****************************************/
|
||
|
|
/************************************************************************/
|
||
|
|
/* (c) Copyright Systems Integration Specialists Company, Inc., */
|
||
|
|
/* 1986 - 2001, All Rights Reserved. */
|
||
|
|
/* */
|
||
|
|
/* PROPRIETARY AND CONFIDENTIAL */
|
||
|
|
/* */
|
||
|
|
/* MODULE NAME : ard_objid.c */
|
||
|
|
/* PRODUCT(S) : ASN1DE */
|
||
|
|
/* */
|
||
|
|
/* MODULE DESCRIPTION : */
|
||
|
|
/* */
|
||
|
|
/* GLOBAL FUNCTIONS DEFINED IN THIS MODULE : */
|
||
|
|
/* */
|
||
|
|
/* MODIFICATION LOG : */
|
||
|
|
/* Date Who Rev Comments */
|
||
|
|
/* -------- --- ------ ------------------------------------------- */
|
||
|
|
/* 12/20/01 JRB 03 Chg ASN1_CTXT to ASN1_DEC_CTXT. */
|
||
|
|
/* 09/13/99 MDE 02 Added SD_CONST modifiers */
|
||
|
|
/* 07/26/99 MDE 01 New module, derived from ard_objid.c */
|
||
|
|
/************************************************************************/
|
||
|
|
|
||
|
|
#include "glbtypes.h"
|
||
|
|
#include "sysincs.h"
|
||
|
|
#include "asn1r.h"
|
||
|
|
#include "asn1log.h"
|
||
|
|
|
||
|
|
/************************************************************************/
|
||
|
|
/* For debug version, use a static pointer to avoid duplication of */
|
||
|
|
/* __FILE__ strings. */
|
||
|
|
|
||
|
|
#ifdef DEBUG_SISCO
|
||
|
|
SD_CONST static ST_CHAR *SD_CONST thisFileName = __FILE__;
|
||
|
|
#endif
|
||
|
|
|
||
|
|
/************************************************************************/
|
||
|
|
/************************************************************************/
|
||
|
|
/* get_objid */
|
||
|
|
/* Function to read an object identifier data element from an ASN.1 msg */
|
||
|
|
/* and put sub-identifiers into integer array. */
|
||
|
|
/************************************************************************/
|
||
|
|
|
||
|
|
#define MAX_OBJ_ID_COMPONENTS 16
|
||
|
|
|
||
|
|
ST_RET asn1r_get_objid (ASN1_DEC_CTXT *ac, ST_INT16 component_list[], ST_INT *num_components)
|
||
|
|
{
|
||
|
|
ST_UCHAR c; /* Temporary storage for octets. */
|
||
|
|
ST_UCHAR *last_pos; /* One past last position of this data element. */
|
||
|
|
ST_UINT16 j; /* Temporarily holds value encoded in 2 octets. */
|
||
|
|
ST_INT i; /* Counter for looping through sub-identifiers. */
|
||
|
|
|
||
|
|
#ifdef DEBUG_ASN1_DECODE
|
||
|
|
if (!num_components || !component_list)
|
||
|
|
{
|
||
|
|
slogCallStack (sLogCtrl,
|
||
|
|
"get_objid: attempt to reference through a NULL pointer");
|
||
|
|
return(SD_FAILURE);
|
||
|
|
}
|
||
|
|
#endif
|
||
|
|
|
||
|
|
last_pos = ac->asn1r_field_ptr + ac->asn1r_elmnt_len;
|
||
|
|
c = *(ac->asn1r_field_ptr++); /* First 2 subIDs reside in 1st octet. */
|
||
|
|
|
||
|
|
if (c & 0x80)
|
||
|
|
{
|
||
|
|
ALOG_NERR0 ("ASN.1 decode: Object ID first octet error");
|
||
|
|
return (SD_FAILURE);
|
||
|
|
}
|
||
|
|
|
||
|
|
if ((component_list[0] = c/40) > 2)
|
||
|
|
{
|
||
|
|
ALOG_NERR0 ("ASN.1 decode: Object ID component 0 too big");
|
||
|
|
return (SD_FAILURE);
|
||
|
|
}
|
||
|
|
|
||
|
|
if ((component_list[1] = c%40) > 39)
|
||
|
|
{
|
||
|
|
ALOG_NERR0 ("ASN.1 decode: Object ID component 1 too big");
|
||
|
|
return (SD_FAILURE);
|
||
|
|
}
|
||
|
|
|
||
|
|
*num_components = 2;
|
||
|
|
|
||
|
|
/* Decode remaining subIDs in contents of object identifier data el't. */
|
||
|
|
|
||
|
|
for (i=2; ac->asn1r_field_ptr < last_pos; i++,(*num_components)++)
|
||
|
|
{
|
||
|
|
if (i >= MAX_OBJ_ID_COMPONENTS) /* avoid overwrite */
|
||
|
|
{
|
||
|
|
ALOG_NERR0 ("ASN.1 decode: Object ID too many components");
|
||
|
|
return (SD_FAILURE);
|
||
|
|
}
|
||
|
|
|
||
|
|
if ((c = *(ac->asn1r_field_ptr++)) & 0x80) /* if next octet is not last - */
|
||
|
|
{
|
||
|
|
if (*ac->asn1r_field_ptr & 0x80) /* reject if more than 2 octets */
|
||
|
|
{
|
||
|
|
ALOG_NERR0 ("ASN.1 decode: Object ID more than 2 octets for value");
|
||
|
|
return (SD_FAILURE);
|
||
|
|
}
|
||
|
|
|
||
|
|
j = (ST_UINT16) (c & 0x7F) << 7; /* support two octets per subID */
|
||
|
|
j |= (*(ac->asn1r_field_ptr++) & 0x7F); /* merge the 14 ID bits */
|
||
|
|
component_list[i] = j;
|
||
|
|
}
|
||
|
|
else /* only one octet */
|
||
|
|
component_list[i] = (ST_UINT16) c; /* write masked ID code */
|
||
|
|
}
|
||
|
|
|
||
|
|
return(SD_SUCCESS);
|
||
|
|
}
|
||
|
|
|