windows-nt/Source/XPSP1/NT/ds/security/asn1/asn1c/optcase.c
2020-09-26 16:20:57 +08:00

127 lines
4.5 KiB
C

/* Copyright (C) Boris Nikolaus, Germany, 1996-1997. All rights reserved. */
/* Copyright (C) Microsoft Corporation, 1997-1998. All rights reserved. */
#include "precomp.h"
static int _IsNotBounded(PERSimpleTypeInfo_t *sinfo);
static int _IsUnsignedShortRange(PERSimpleTypeInfo_t *sinfo);
static int _IsExtendedShortRange(PERSimpleTypeInfo_t *sinfo);
int PerOptCase_IsSignedInteger(PERSimpleTypeInfo_t *sinfo)
{
return (sinfo->Data == ePERSTIData_Integer &&
sinfo->Constraint == ePERSTIConstraint_Unconstrained &&
sinfo->Length == ePERSTILength_InfiniteLength &&
sinfo->NBits == 8 && // default
sinfo->Alignment &&
_IsNotBounded(sinfo) &&
sinfo->LConstraint== ePERSTIConstraint_Semiconstrained &&
sinfo->LLowerVal == 0 &&
sinfo->LUpperVal == 0);
}
int PerOptCase_IsUnsignedInteger(PERSimpleTypeInfo_t *sinfo)
{
return (sinfo->Data == ePERSTIData_Unsigned &&
sinfo->Constraint == ePERSTIConstraint_Semiconstrained &&
sinfo->Length == ePERSTILength_InfiniteLength &&
sinfo->NBits == 8 && // default
sinfo->Alignment &&
_IsNotBounded(sinfo) &&
sinfo->LConstraint== ePERSTIConstraint_Semiconstrained &&
sinfo->LLowerVal == 0 &&
sinfo->LUpperVal == 0);
}
int PerOptCase_IsUnsignedShort(PERSimpleTypeInfo_t *sinfo)
{
return (sinfo->Data == ePERSTIData_Unsigned &&
sinfo->Constraint == ePERSTIConstraint_Constrained &&
sinfo->Length == ePERSTILength_NoLength &&
sinfo->NBits == 16 &&
sinfo->Alignment &&
_IsUnsignedShortRange(sinfo) &&
sinfo->LConstraint== ePERSTIConstraint_Semiconstrained &&
sinfo->LLowerVal == 0 &&
sinfo->LUpperVal == 0);
}
int PerOptCase_IsBoolean(PERSimpleTypeInfo_t *sinfo)
{
return (sinfo->Data == ePERSTIData_Boolean &&
sinfo->Constraint == ePERSTIConstraint_Unconstrained &&
sinfo->Length == ePERSTILength_NoLength &&
sinfo->NBits == 1 &&
! sinfo->Alignment &&
_IsNotBounded(sinfo) &&
sinfo->LConstraint== ePERSTIConstraint_Semiconstrained &&
sinfo->LLowerVal == 0 &&
sinfo->LUpperVal == 0);
}
int PerOptCase_IsTargetSeqOf(PERTypeInfo_t *info)
{
return (
// we only deal with singly linked-list case
(info->Rules & eTypeRules_SinglyLinkedList)
&&
// check for size of sequence of/set of
((info->Root.LLowerVal == 0 && info->Root.LUpperVal == 0) ||
(info->Root.LLowerVal < info->Root.LUpperVal)
)
&&
// we do not deal with null body case
(! (info->Root.SubType->Flags & eTypeFlags_Null))
&&
// we do not deal with recursive sequence of/set of
(info->Root.SubType->PERTypeInfo.Root.Data != ePERSTIData_SequenceOf)
&&
(info->Root.SubType->PERTypeInfo.Root.Data != ePERSTIData_SetOf)
&&
// we only deal with sequence of or non-canonical set of.
((info->Root.Data == ePERSTIData_SequenceOf) ||
(info->Root.Data == ePERSTIData_SetOf && g_eSubEncodingRule != eSubEncoding_Canonical))
);
}
// UTILITIES
static int _IsNotBounded(PERSimpleTypeInfo_t *sinfo)
{
return (sinfo->LowerVal.length == 1 &&
sinfo->LowerVal.value[0] == 0 &&
sinfo->UpperVal.length == 1 &&
sinfo->UpperVal.value[0] == 0);
}
static int _IsUnsignedShortRange(PERSimpleTypeInfo_t *sinfo)
{
return ((sinfo->UpperVal.length < 3 ) ||
(sinfo->UpperVal.length == 3 && sinfo->UpperVal.value[0] == 0 &&
! _IsExtendedShortRange(sinfo)));
}
static int _IsExtendedShortRange(PERSimpleTypeInfo_t *sinfo)
{
// if the lower bound is negative and the upper bound greater than 0x7FFF
// then it is an extended short.
return ((sinfo->LowerVal.length >= 1) &&
(sinfo->LowerVal.value[0] & 0x80) && // lower bound is negative
(sinfo->UpperVal.length == 3) &&
(sinfo->UpperVal.value[0] == 0) && // upper bound is positive
(*((ASN1uint16_t *) &(sinfo->UpperVal.value[1])) > 0x7FFF)); // upper bound greater than 0x7FFF
}
int BerOptCase_IsBoolean(BERTypeInfo_t *info)
{
return (eBERSTIData_Boolean == info->Data && 1 == info->NOctets);
}