windows-nt/Source/XPSP1/NT/ds/security/cryptoapi/pkitrust/wintrust/wtasn.c
2020-09-26 16:20:57 +08:00

1183 lines
36 KiB
C

/* Copyright (C) Microsoft Corporation, 1996 - 1999 All rights reserved. */
/* ASN.1 definitions for Indirect data contents */
#include <windows.h>
#include "wtasn.h"
ASN1module_t WTASN_Module = NULL;
static int ASN1CALL ASN1Enc_ObjectID(ASN1encoding_t enc, ASN1uint32_t tag, ObjectID *val);
static int ASN1CALL ASN1Enc_SpcMinimalCriteria(ASN1encoding_t enc, ASN1uint32_t tag, SpcMinimalCriteria *val);
static int ASN1CALL ASN1Enc_UtcTime(ASN1encoding_t enc, ASN1uint32_t tag, UtcTime *val);
static int ASN1CALL ASN1Enc_AlgorithmIdentifier(ASN1encoding_t enc, ASN1uint32_t tag, AlgorithmIdentifier *val);
static int ASN1CALL ASN1Enc_DigestInfo(ASN1encoding_t enc, ASN1uint32_t tag, DigestInfo *val);
static int ASN1CALL ASN1Enc_SpcAttributeTypeAndOptionalValue(ASN1encoding_t enc, ASN1uint32_t tag, SpcAttributeTypeAndOptionalValue *val);
static int ASN1CALL ASN1Enc_SpcString(ASN1encoding_t enc, ASN1uint32_t tag, SpcString *val);
static int ASN1CALL ASN1Enc_SpcSerializedObject(ASN1encoding_t enc, ASN1uint32_t tag, SpcSerializedObject *val);
static int ASN1CALL ASN1Enc_SpcLink(ASN1encoding_t enc, ASN1uint32_t tag, SpcLink *val);
static int ASN1CALL ASN1Enc_SpcPeImageData(ASN1encoding_t enc, ASN1uint32_t tag, SpcPeImageData *val);
static int ASN1CALL ASN1Enc_SpcSigInfo(ASN1encoding_t enc, ASN1uint32_t tag, SpcSigInfo *val);
static int ASN1CALL ASN1Enc_SpcImage(ASN1encoding_t enc, ASN1uint32_t tag, SpcImage *val);
static int ASN1CALL ASN1Enc_SpcFinancialCriteria(ASN1encoding_t enc, ASN1uint32_t tag, SpcFinancialCriteria *val);
static int ASN1CALL ASN1Enc_SpcStatementType(ASN1encoding_t enc, ASN1uint32_t tag, SpcStatementType *val);
static int ASN1CALL ASN1Enc_SpcSpOpusInfo(ASN1encoding_t enc, ASN1uint32_t tag, SpcSpOpusInfo *val);
static int ASN1CALL ASN1Enc_NameValue(ASN1encoding_t enc, ASN1uint32_t tag, NameValue *val);
static int ASN1CALL ASN1Enc_NameValues(ASN1encoding_t enc, ASN1uint32_t tag, NameValues *val);
static int ASN1CALL ASN1Enc_MemberInfo(ASN1encoding_t enc, ASN1uint32_t tag, MemberInfo *val);
static int ASN1CALL ASN1Enc_SpcIndirectDataContent(ASN1encoding_t enc, ASN1uint32_t tag, SpcIndirectDataContent *val);
static int ASN1CALL ASN1Enc_SpcSpAgencyInformation(ASN1encoding_t enc, ASN1uint32_t tag, SpcSpAgencyInformation *val);
static int ASN1CALL ASN1Dec_ObjectID(ASN1decoding_t dec, ASN1uint32_t tag, ObjectID *val);
static int ASN1CALL ASN1Dec_SpcMinimalCriteria(ASN1decoding_t dec, ASN1uint32_t tag, SpcMinimalCriteria *val);
static int ASN1CALL ASN1Dec_UtcTime(ASN1decoding_t dec, ASN1uint32_t tag, UtcTime *val);
static int ASN1CALL ASN1Dec_AlgorithmIdentifier(ASN1decoding_t dec, ASN1uint32_t tag, AlgorithmIdentifier *val);
static int ASN1CALL ASN1Dec_DigestInfo(ASN1decoding_t dec, ASN1uint32_t tag, DigestInfo *val);
static int ASN1CALL ASN1Dec_SpcAttributeTypeAndOptionalValue(ASN1decoding_t dec, ASN1uint32_t tag, SpcAttributeTypeAndOptionalValue *val);
static int ASN1CALL ASN1Dec_SpcString(ASN1decoding_t dec, ASN1uint32_t tag, SpcString *val);
static int ASN1CALL ASN1Dec_SpcSerializedObject(ASN1decoding_t dec, ASN1uint32_t tag, SpcSerializedObject *val);
static int ASN1CALL ASN1Dec_SpcLink(ASN1decoding_t dec, ASN1uint32_t tag, SpcLink *val);
static int ASN1CALL ASN1Dec_SpcPeImageData(ASN1decoding_t dec, ASN1uint32_t tag, SpcPeImageData *val);
static int ASN1CALL ASN1Dec_SpcSigInfo(ASN1decoding_t dec, ASN1uint32_t tag, SpcSigInfo *val);
static int ASN1CALL ASN1Dec_SpcImage(ASN1decoding_t dec, ASN1uint32_t tag, SpcImage *val);
static int ASN1CALL ASN1Dec_SpcFinancialCriteria(ASN1decoding_t dec, ASN1uint32_t tag, SpcFinancialCriteria *val);
static int ASN1CALL ASN1Dec_SpcStatementType(ASN1decoding_t dec, ASN1uint32_t tag, SpcStatementType *val);
static int ASN1CALL ASN1Dec_SpcSpOpusInfo(ASN1decoding_t dec, ASN1uint32_t tag, SpcSpOpusInfo *val);
static int ASN1CALL ASN1Dec_NameValue(ASN1decoding_t dec, ASN1uint32_t tag, NameValue *val);
static int ASN1CALL ASN1Dec_NameValues(ASN1decoding_t dec, ASN1uint32_t tag, NameValues *val);
static int ASN1CALL ASN1Dec_MemberInfo(ASN1decoding_t dec, ASN1uint32_t tag, MemberInfo *val);
static int ASN1CALL ASN1Dec_SpcIndirectDataContent(ASN1decoding_t dec, ASN1uint32_t tag, SpcIndirectDataContent *val);
static int ASN1CALL ASN1Dec_SpcSpAgencyInformation(ASN1decoding_t dec, ASN1uint32_t tag, SpcSpAgencyInformation *val);
static void ASN1CALL ASN1Free_ObjectID(ObjectID *val);
static void ASN1CALL ASN1Free_UtcTime(UtcTime *val);
static void ASN1CALL ASN1Free_AlgorithmIdentifier(AlgorithmIdentifier *val);
static void ASN1CALL ASN1Free_DigestInfo(DigestInfo *val);
static void ASN1CALL ASN1Free_SpcAttributeTypeAndOptionalValue(SpcAttributeTypeAndOptionalValue *val);
static void ASN1CALL ASN1Free_SpcString(SpcString *val);
static void ASN1CALL ASN1Free_SpcSerializedObject(SpcSerializedObject *val);
static void ASN1CALL ASN1Free_SpcLink(SpcLink *val);
static void ASN1CALL ASN1Free_SpcPeImageData(SpcPeImageData *val);
static void ASN1CALL ASN1Free_SpcSigInfo(SpcSigInfo *val);
static void ASN1CALL ASN1Free_SpcImage(SpcImage *val);
static void ASN1CALL ASN1Free_SpcStatementType(SpcStatementType *val);
static void ASN1CALL ASN1Free_SpcSpOpusInfo(SpcSpOpusInfo *val);
static void ASN1CALL ASN1Free_NameValue(NameValue *val);
static void ASN1CALL ASN1Free_NameValues(NameValues *val);
static void ASN1CALL ASN1Free_MemberInfo(MemberInfo *val);
static void ASN1CALL ASN1Free_SpcIndirectDataContent(SpcIndirectDataContent *val);
static void ASN1CALL ASN1Free_SpcSpAgencyInformation(SpcSpAgencyInformation *val);
typedef ASN1BerEncFun_t ASN1EncFun_t;
static const ASN1EncFun_t encfntab[14] = {
(ASN1EncFun_t) ASN1Enc_ObjectID,
(ASN1EncFun_t) ASN1Enc_SpcMinimalCriteria,
(ASN1EncFun_t) ASN1Enc_UtcTime,
(ASN1EncFun_t) ASN1Enc_SpcLink,
(ASN1EncFun_t) ASN1Enc_SpcPeImageData,
(ASN1EncFun_t) ASN1Enc_SpcSigInfo,
(ASN1EncFun_t) ASN1Enc_SpcFinancialCriteria,
(ASN1EncFun_t) ASN1Enc_SpcStatementType,
(ASN1EncFun_t) ASN1Enc_SpcSpOpusInfo,
(ASN1EncFun_t) ASN1Enc_NameValue,
(ASN1EncFun_t) ASN1Enc_NameValues,
(ASN1EncFun_t) ASN1Enc_MemberInfo,
(ASN1EncFun_t) ASN1Enc_SpcIndirectDataContent,
(ASN1EncFun_t) ASN1Enc_SpcSpAgencyInformation,
};
typedef ASN1BerDecFun_t ASN1DecFun_t;
static const ASN1DecFun_t decfntab[14] = {
(ASN1DecFun_t) ASN1Dec_ObjectID,
(ASN1DecFun_t) ASN1Dec_SpcMinimalCriteria,
(ASN1DecFun_t) ASN1Dec_UtcTime,
(ASN1DecFun_t) ASN1Dec_SpcLink,
(ASN1DecFun_t) ASN1Dec_SpcPeImageData,
(ASN1DecFun_t) ASN1Dec_SpcSigInfo,
(ASN1DecFun_t) ASN1Dec_SpcFinancialCriteria,
(ASN1DecFun_t) ASN1Dec_SpcStatementType,
(ASN1DecFun_t) ASN1Dec_SpcSpOpusInfo,
(ASN1DecFun_t) ASN1Dec_NameValue,
(ASN1DecFun_t) ASN1Dec_NameValues,
(ASN1DecFun_t) ASN1Dec_MemberInfo,
(ASN1DecFun_t) ASN1Dec_SpcIndirectDataContent,
(ASN1DecFun_t) ASN1Dec_SpcSpAgencyInformation,
};
static const ASN1FreeFun_t freefntab[14] = {
(ASN1FreeFun_t) ASN1Free_ObjectID,
(ASN1FreeFun_t) NULL,
(ASN1FreeFun_t) ASN1Free_UtcTime,
(ASN1FreeFun_t) ASN1Free_SpcLink,
(ASN1FreeFun_t) ASN1Free_SpcPeImageData,
(ASN1FreeFun_t) ASN1Free_SpcSigInfo,
(ASN1FreeFun_t) NULL,
(ASN1FreeFun_t) ASN1Free_SpcStatementType,
(ASN1FreeFun_t) ASN1Free_SpcSpOpusInfo,
(ASN1FreeFun_t) ASN1Free_NameValue,
(ASN1FreeFun_t) ASN1Free_NameValues,
(ASN1FreeFun_t) ASN1Free_MemberInfo,
(ASN1FreeFun_t) ASN1Free_SpcIndirectDataContent,
(ASN1FreeFun_t) ASN1Free_SpcSpAgencyInformation,
};
static const ULONG sizetab[14] = {
SIZE_WTASN_Module_PDU_0,
SIZE_WTASN_Module_PDU_1,
SIZE_WTASN_Module_PDU_2,
SIZE_WTASN_Module_PDU_3,
SIZE_WTASN_Module_PDU_4,
SIZE_WTASN_Module_PDU_5,
SIZE_WTASN_Module_PDU_6,
SIZE_WTASN_Module_PDU_7,
SIZE_WTASN_Module_PDU_8,
SIZE_WTASN_Module_PDU_9,
SIZE_WTASN_Module_PDU_10,
SIZE_WTASN_Module_PDU_11,
SIZE_WTASN_Module_PDU_12,
SIZE_WTASN_Module_PDU_13,
};
/* forward declarations of values: */
extern ASN1octet_t SpcPeImageData_flags_default_octets[1];
/* definitions of value components: */
static ASN1octet_t SpcPeImageData_flags_default_octets[1] = { 0x80 };
/* definitions of values: */
SpcPeImageFlags SpcPeImageData_flags_default = { 1, SpcPeImageData_flags_default_octets };
void ASN1CALL WTASN_Module_Startup(void)
{
WTASN_Module = ASN1_CreateModule(0x10000, ASN1_BER_RULE_DER, ASN1FLAGS_NOASSERT, 14, (const ASN1GenericFun_t *) encfntab, (const ASN1GenericFun_t *) decfntab, freefntab, sizetab, 0x7477);
}
void ASN1CALL WTASN_Module_Cleanup(void)
{
ASN1_CloseModule(WTASN_Module);
WTASN_Module = NULL;
}
static int ASN1CALL ASN1Enc_ObjectID(ASN1encoding_t enc, ASN1uint32_t tag, ObjectID *val)
{
if (!ASN1BEREncObjectIdentifier2(enc, tag ? tag : 0x6, val))
return 0;
return 1;
}
static int ASN1CALL ASN1Dec_ObjectID(ASN1decoding_t dec, ASN1uint32_t tag, ObjectID *val)
{
if (!ASN1BERDecObjectIdentifier2(dec, tag ? tag : 0x6, val))
return 0;
return 1;
}
static void ASN1CALL ASN1Free_ObjectID(ObjectID *val)
{
if (val) {
}
}
static int ASN1CALL ASN1Enc_SpcMinimalCriteria(ASN1encoding_t enc, ASN1uint32_t tag, SpcMinimalCriteria *val)
{
if (!ASN1BEREncBool(enc, tag ? tag : 0x1, *val))
return 0;
return 1;
}
static int ASN1CALL ASN1Dec_SpcMinimalCriteria(ASN1decoding_t dec, ASN1uint32_t tag, SpcMinimalCriteria *val)
{
if (!ASN1BERDecBool(dec, tag ? tag : 0x1, val))
return 0;
return 1;
}
static int ASN1CALL ASN1Enc_UtcTime(ASN1encoding_t enc, ASN1uint32_t tag, UtcTime *val)
{
if (!ASN1DEREncUTCTime(enc, tag ? tag : 0x17, val))
return 0;
return 1;
}
static int ASN1CALL ASN1Dec_UtcTime(ASN1decoding_t dec, ASN1uint32_t tag, UtcTime *val)
{
if (!ASN1BERDecUTCTime(dec, tag ? tag : 0x17, val))
return 0;
return 1;
}
static void ASN1CALL ASN1Free_UtcTime(UtcTime *val)
{
if (val) {
}
}
static int ASN1CALL ASN1Enc_AlgorithmIdentifier(ASN1encoding_t enc, ASN1uint32_t tag, AlgorithmIdentifier *val)
{
ASN1uint32_t nLenOff;
if (!ASN1BEREncExplicitTag(enc, tag ? tag : 0x10, &nLenOff))
return 0;
if (!ASN1BEREncObjectIdentifier2(enc, 0x6, &(val)->algorithm))
return 0;
if ((val)->o[0] & 0x80) {
if (!ASN1BEREncOpenType(enc, &(val)->parameters))
return 0;
}
if (!ASN1BEREncEndOfContents(enc, nLenOff))
return 0;
return 1;
}
static int ASN1CALL ASN1Dec_AlgorithmIdentifier(ASN1decoding_t dec, ASN1uint32_t tag, AlgorithmIdentifier *val)
{
ASN1decoding_t dd;
ASN1octet_t *di;
ASN1uint32_t t;
if (!ASN1BERDecExplicitTag(dec, tag ? tag : 0x10, &dd, &di))
return 0;
ZeroMemory((val)->o, 1);
if (!ASN1BERDecObjectIdentifier2(dd, 0x6, &(val)->algorithm))
return 0;
if (ASN1BERDecPeekTag(dd, &t)) {
(val)->o[0] |= 0x80;
if (!ASN1BERDecOpenType2(dd, &(val)->parameters))
return 0;
}
if (!ASN1BERDecEndOfContents(dec, dd, di))
return 0;
return 1;
}
static void ASN1CALL ASN1Free_AlgorithmIdentifier(AlgorithmIdentifier *val)
{
if (val) {
if ((val)->o[0] & 0x80) {
}
}
}
static int ASN1CALL ASN1Enc_DigestInfo(ASN1encoding_t enc, ASN1uint32_t tag, DigestInfo *val)
{
ASN1uint32_t nLenOff;
if (!ASN1BEREncExplicitTag(enc, tag ? tag : 0x10, &nLenOff))
return 0;
if (!ASN1Enc_AlgorithmIdentifier(enc, 0, &(val)->digestAlgorithm))
return 0;
if (!ASN1DEREncOctetString(enc, 0x4, ((val)->digest).length, ((val)->digest).value))
return 0;
if (!ASN1BEREncEndOfContents(enc, nLenOff))
return 0;
return 1;
}
static int ASN1CALL ASN1Dec_DigestInfo(ASN1decoding_t dec, ASN1uint32_t tag, DigestInfo *val)
{
ASN1decoding_t dd;
ASN1octet_t *di;
if (!ASN1BERDecExplicitTag(dec, tag ? tag : 0x10, &dd, &di))
return 0;
if (!ASN1Dec_AlgorithmIdentifier(dd, 0, &(val)->digestAlgorithm))
return 0;
if (!ASN1BERDecOctetString2(dd, 0x4, &(val)->digest))
return 0;
if (!ASN1BERDecEndOfContents(dec, dd, di))
return 0;
return 1;
}
static void ASN1CALL ASN1Free_DigestInfo(DigestInfo *val)
{
if (val) {
ASN1Free_AlgorithmIdentifier(&(val)->digestAlgorithm);
}
}
static int ASN1CALL ASN1Enc_SpcAttributeTypeAndOptionalValue(ASN1encoding_t enc, ASN1uint32_t tag, SpcAttributeTypeAndOptionalValue *val)
{
ASN1uint32_t nLenOff;
if (!ASN1BEREncExplicitTag(enc, tag ? tag : 0x10, &nLenOff))
return 0;
if (!ASN1BEREncObjectIdentifier2(enc, 0x6, &(val)->type))
return 0;
if ((val)->o[0] & 0x80) {
if (!ASN1BEREncOpenType(enc, &(val)->value))
return 0;
}
if (!ASN1BEREncEndOfContents(enc, nLenOff))
return 0;
return 1;
}
static int ASN1CALL ASN1Dec_SpcAttributeTypeAndOptionalValue(ASN1decoding_t dec, ASN1uint32_t tag, SpcAttributeTypeAndOptionalValue *val)
{
ASN1decoding_t dd;
ASN1octet_t *di;
ASN1uint32_t t;
if (!ASN1BERDecExplicitTag(dec, tag ? tag : 0x10, &dd, &di))
return 0;
ZeroMemory((val)->o, 1);
if (!ASN1BERDecObjectIdentifier2(dd, 0x6, &(val)->type))
return 0;
if (ASN1BERDecPeekTag(dd, &t)) {
(val)->o[0] |= 0x80;
if (!ASN1BERDecOpenType2(dd, &(val)->value))
return 0;
}
if (!ASN1BERDecEndOfContents(dec, dd, di))
return 0;
return 1;
}
static void ASN1CALL ASN1Free_SpcAttributeTypeAndOptionalValue(SpcAttributeTypeAndOptionalValue *val)
{
if (val) {
if ((val)->o[0] & 0x80) {
}
}
}
static int ASN1CALL ASN1Enc_SpcString(ASN1encoding_t enc, ASN1uint32_t tag, SpcString *val)
{
switch ((val)->choice) {
case 1:
if (!ASN1DEREncChar16String(enc, 0x80000000, ((val)->u.unicode).length, ((val)->u.unicode).value))
return 0;
break;
case 2:
if (!ASN1DEREncCharString(enc, 0x80000001, ((val)->u.ascii).length, ((val)->u.ascii).value))
return 0;
break;
}
return 1;
}
static int ASN1CALL ASN1Dec_SpcString(ASN1decoding_t dec, ASN1uint32_t tag, SpcString *val)
{
ASN1uint32_t t;
if (!ASN1BERDecPeekTag(dec, &t))
return 0;
switch (t) {
case 0x80000000:
(val)->choice = 1;
if (!ASN1BERDecChar16String(dec, 0x80000000, &(val)->u.unicode))
return 0;
break;
case 0x80000001:
(val)->choice = 2;
if (!ASN1BERDecCharString(dec, 0x80000001, &(val)->u.ascii))
return 0;
break;
default:
ASN1DecSetError(dec, ASN1_ERR_CORRUPT);
return 0;
}
return 1;
}
static void ASN1CALL ASN1Free_SpcString(SpcString *val)
{
if (val) {
switch ((val)->choice) {
case 1:
ASN1char16string_free(&(val)->u.unicode);
break;
case 2:
ASN1charstring_free(&(val)->u.ascii);
break;
}
}
}
static int ASN1CALL ASN1Enc_SpcSerializedObject(ASN1encoding_t enc, ASN1uint32_t tag, SpcSerializedObject *val)
{
ASN1uint32_t nLenOff;
if (!ASN1BEREncExplicitTag(enc, tag ? tag : 0x10, &nLenOff))
return 0;
if (!ASN1DEREncOctetString(enc, 0x4, ((val)->classId).length, ((val)->classId).value))
return 0;
if (!ASN1DEREncOctetString(enc, 0x4, ((val)->serializedData).length, ((val)->serializedData).value))
return 0;
if (!ASN1BEREncEndOfContents(enc, nLenOff))
return 0;
return 1;
}
static int ASN1CALL ASN1Dec_SpcSerializedObject(ASN1decoding_t dec, ASN1uint32_t tag, SpcSerializedObject *val)
{
ASN1decoding_t dd;
ASN1octet_t *di;
if (!ASN1BERDecExplicitTag(dec, tag ? tag : 0x10, &dd, &di))
return 0;
if (!ASN1BERDecOctetString2(dd, 0x4, &(val)->classId))
return 0;
if (!ASN1BERDecOctetString2(dd, 0x4, &(val)->serializedData))
return 0;
if (!ASN1BERDecEndOfContents(dec, dd, di))
return 0;
return 1;
}
static void ASN1CALL ASN1Free_SpcSerializedObject(SpcSerializedObject *val)
{
if (val) {
}
}
static int ASN1CALL ASN1Enc_SpcLink(ASN1encoding_t enc, ASN1uint32_t tag, SpcLink *val)
{
ASN1uint32_t nLenOff0;
switch ((val)->choice) {
case 1:
if (!ASN1DEREncCharString(enc, 0x80000000, ((val)->u.url).length, ((val)->u.url).value))
return 0;
break;
case 2:
if (!ASN1Enc_SpcSerializedObject(enc, 0x80000001, &(val)->u.moniker))
return 0;
break;
case 3:
if (!ASN1BEREncExplicitTag(enc, 0x80000002, &nLenOff0))
return 0;
if (!ASN1Enc_SpcString(enc, 0, &(val)->u.file))
return 0;
if (!ASN1BEREncEndOfContents(enc, nLenOff0))
return 0;
break;
}
return 1;
}
static int ASN1CALL ASN1Dec_SpcLink(ASN1decoding_t dec, ASN1uint32_t tag, SpcLink *val)
{
ASN1uint32_t t;
ASN1decoding_t dd0;
ASN1octet_t *di0;
if (!ASN1BERDecPeekTag(dec, &t))
return 0;
switch (t) {
case 0x80000000:
(val)->choice = 1;
if (!ASN1BERDecCharString(dec, 0x80000000, &(val)->u.url))
return 0;
break;
case 0x80000001:
(val)->choice = 2;
if (!ASN1Dec_SpcSerializedObject(dec, 0x80000001, &(val)->u.moniker))
return 0;
break;
case 0x80000002:
(val)->choice = 3;
if (!ASN1BERDecExplicitTag(dec, 0x80000002, &dd0, &di0))
return 0;
if (!ASN1Dec_SpcString(dd0, 0, &(val)->u.file))
return 0;
if (!ASN1BERDecEndOfContents(dec, dd0, di0))
return 0;
break;
default:
ASN1DecSetError(dec, ASN1_ERR_CORRUPT);
return 0;
}
return 1;
}
static void ASN1CALL ASN1Free_SpcLink(SpcLink *val)
{
if (val) {
switch ((val)->choice) {
case 1:
ASN1charstring_free(&(val)->u.url);
break;
case 2:
ASN1Free_SpcSerializedObject(&(val)->u.moniker);
break;
case 3:
ASN1Free_SpcString(&(val)->u.file);
break;
}
}
}
static int ASN1CALL ASN1Enc_SpcPeImageData(ASN1encoding_t enc, ASN1uint32_t tag, SpcPeImageData *val)
{
ASN1uint32_t nLenOff;
ASN1octet_t o[1];
ASN1uint32_t r;
ASN1uint32_t nLenOff0;
if (!ASN1BEREncExplicitTag(enc, tag ? tag : 0x10, &nLenOff))
return 0;
CopyMemory(o, (val)->o, 1);
if (!ASN1bitstring_cmp(&val->flags, &SpcPeImageData_flags_default, 1))
o[0] &= ~0x80;
if (o[0] & 0x80) {
r = ((val)->flags).length;
ASN1BEREncRemoveZeroBits(&r, ((val)->flags).value);
if (!ASN1DEREncBitString(enc, 0x3, r, ((val)->flags).value))
return 0;
}
if (o[0] & 0x40) {
if (!ASN1BEREncExplicitTag(enc, 0x80000000, &nLenOff0))
return 0;
if (!ASN1Enc_SpcLink(enc, 0, &(val)->file))
return 0;
if (!ASN1BEREncEndOfContents(enc, nLenOff0))
return 0;
}
if (!ASN1BEREncEndOfContents(enc, nLenOff))
return 0;
return 1;
}
static int ASN1CALL ASN1Dec_SpcPeImageData(ASN1decoding_t dec, ASN1uint32_t tag, SpcPeImageData *val)
{
ASN1decoding_t dd;
ASN1octet_t *di;
ASN1uint32_t t;
ASN1decoding_t dd0;
ASN1octet_t *di0;
if (!ASN1BERDecExplicitTag(dec, tag ? tag : 0x10, &dd, &di))
return 0;
ZeroMemory((val)->o, 1);
ASN1BERDecPeekTag(dd, &t);
if (t == 0x3) {
(val)->o[0] |= 0x80;
if (!ASN1BERDecBitString(dd, 0x3, &(val)->flags))
return 0;
}
ASN1BERDecPeekTag(dd, &t);
if (t == 0x80000000) {
(val)->o[0] |= 0x40;
if (!ASN1BERDecExplicitTag(dd, 0x80000000, &dd0, &di0))
return 0;
if (!ASN1Dec_SpcLink(dd0, 0, &(val)->file))
return 0;
if (!ASN1BERDecEndOfContents(dd, dd0, di0))
return 0;
}
if (!ASN1BERDecEndOfContents(dec, dd, di))
return 0;
return 1;
}
static void ASN1CALL ASN1Free_SpcPeImageData(SpcPeImageData *val)
{
if (val) {
if ((val)->o[0] & 0x80) {
ASN1bitstring_free(&(val)->flags);
}
if ((val)->o[0] & 0x40) {
ASN1Free_SpcLink(&(val)->file);
}
}
}
static int ASN1CALL ASN1Enc_SpcSigInfo(ASN1encoding_t enc, ASN1uint32_t tag, SpcSigInfo *val)
{
ASN1uint32_t nLenOff;
if (!ASN1BEREncExplicitTag(enc, tag ? tag : 0x10, &nLenOff))
return 0;
if (!ASN1BEREncS32(enc, 0x2, (val)->dwSIPversion))
return 0;
if (!ASN1DEREncOctetString(enc, 0x4, ((val)->gSIPguid).length, ((val)->gSIPguid).value))
return 0;
if (!ASN1BEREncS32(enc, 0x2, (val)->dwReserved1))
return 0;
if (!ASN1BEREncS32(enc, 0x2, (val)->dwReserved2))
return 0;
if (!ASN1BEREncS32(enc, 0x2, (val)->dwReserved3))
return 0;
if (!ASN1BEREncS32(enc, 0x2, (val)->dwReserved4))
return 0;
if (!ASN1BEREncS32(enc, 0x2, (val)->dwReserved5))
return 0;
if (!ASN1BEREncEndOfContents(enc, nLenOff))
return 0;
return 1;
}
static int ASN1CALL ASN1Dec_SpcSigInfo(ASN1decoding_t dec, ASN1uint32_t tag, SpcSigInfo *val)
{
ASN1decoding_t dd;
ASN1octet_t *di;
if (!ASN1BERDecExplicitTag(dec, tag ? tag : 0x10, &dd, &di))
return 0;
if (!ASN1BERDecS32Val(dd, 0x2, &(val)->dwSIPversion))
return 0;
if (!ASN1BERDecOctetString2(dd, 0x4, &(val)->gSIPguid))
return 0;
if (!ASN1BERDecS32Val(dd, 0x2, &(val)->dwReserved1))
return 0;
if (!ASN1BERDecS32Val(dd, 0x2, &(val)->dwReserved2))
return 0;
if (!ASN1BERDecS32Val(dd, 0x2, &(val)->dwReserved3))
return 0;
if (!ASN1BERDecS32Val(dd, 0x2, &(val)->dwReserved4))
return 0;
if (!ASN1BERDecS32Val(dd, 0x2, &(val)->dwReserved5))
return 0;
if (!ASN1BERDecEndOfContents(dec, dd, di))
return 0;
return 1;
}
static void ASN1CALL ASN1Free_SpcSigInfo(SpcSigInfo *val)
{
if (val) {
}
}
static int ASN1CALL ASN1Enc_SpcImage(ASN1encoding_t enc, ASN1uint32_t tag, SpcImage *val)
{
ASN1uint32_t nLenOff;
ASN1uint32_t nLenOff0;
if (!ASN1BEREncExplicitTag(enc, tag ? tag : 0x10, &nLenOff))
return 0;
if ((val)->o[0] & 0x80) {
if (!ASN1BEREncExplicitTag(enc, 0x80000000, &nLenOff0))
return 0;
if (!ASN1Enc_SpcLink(enc, 0, &(val)->imageLink))
return 0;
if (!ASN1BEREncEndOfContents(enc, nLenOff0))
return 0;
}
if ((val)->o[0] & 0x40) {
if (!ASN1DEREncOctetString(enc, 0x80000001, ((val)->bitmap).length, ((val)->bitmap).value))
return 0;
}
if ((val)->o[0] & 0x20) {
if (!ASN1DEREncOctetString(enc, 0x80000002, ((val)->metafile).length, ((val)->metafile).value))
return 0;
}
if ((val)->o[0] & 0x10) {
if (!ASN1DEREncOctetString(enc, 0x80000003, ((val)->enhancedMetafile).length, ((val)->enhancedMetafile).value))
return 0;
}
if ((val)->o[0] & 0x8) {
if (!ASN1DEREncOctetString(enc, 0x80000004, ((val)->gifFile).length, ((val)->gifFile).value))
return 0;
}
if (!ASN1BEREncEndOfContents(enc, nLenOff))
return 0;
return 1;
}
static int ASN1CALL ASN1Dec_SpcImage(ASN1decoding_t dec, ASN1uint32_t tag, SpcImage *val)
{
ASN1decoding_t dd;
ASN1octet_t *di;
ASN1uint32_t t;
ASN1decoding_t dd0;
ASN1octet_t *di0;
if (!ASN1BERDecExplicitTag(dec, tag ? tag : 0x10, &dd, &di))
return 0;
ZeroMemory((val)->o, 1);
ASN1BERDecPeekTag(dd, &t);
if (t == 0x80000000) {
(val)->o[0] |= 0x80;
if (!ASN1BERDecExplicitTag(dd, 0x80000000, &dd0, &di0))
return 0;
if (!ASN1Dec_SpcLink(dd0, 0, &(val)->imageLink))
return 0;
if (!ASN1BERDecEndOfContents(dd, dd0, di0))
return 0;
}
ASN1BERDecPeekTag(dd, &t);
if (t == 0x80000001) {
(val)->o[0] |= 0x40;
if (!ASN1BERDecOctetString2(dd, 0x80000001, &(val)->bitmap))
return 0;
}
ASN1BERDecPeekTag(dd, &t);
if (t == 0x80000002) {
(val)->o[0] |= 0x20;
if (!ASN1BERDecOctetString2(dd, 0x80000002, &(val)->metafile))
return 0;
}
ASN1BERDecPeekTag(dd, &t);
if (t == 0x80000003) {
(val)->o[0] |= 0x10;
if (!ASN1BERDecOctetString2(dd, 0x80000003, &(val)->enhancedMetafile))
return 0;
}
ASN1BERDecPeekTag(dd, &t);
if (t == 0x80000004) {
(val)->o[0] |= 0x8;
if (!ASN1BERDecOctetString2(dd, 0x80000004, &(val)->gifFile))
return 0;
}
if (!ASN1BERDecEndOfContents(dec, dd, di))
return 0;
return 1;
}
static void ASN1CALL ASN1Free_SpcImage(SpcImage *val)
{
if (val) {
if ((val)->o[0] & 0x80) {
ASN1Free_SpcLink(&(val)->imageLink);
}
if ((val)->o[0] & 0x40) {
}
if ((val)->o[0] & 0x20) {
}
if ((val)->o[0] & 0x10) {
}
if ((val)->o[0] & 0x8) {
}
}
}
static int ASN1CALL ASN1Enc_SpcFinancialCriteria(ASN1encoding_t enc, ASN1uint32_t tag, SpcFinancialCriteria *val)
{
ASN1uint32_t nLenOff;
if (!ASN1BEREncExplicitTag(enc, tag ? tag : 0x10, &nLenOff))
return 0;
if (!ASN1BEREncBool(enc, 0x1, (val)->financialInfoAvailable))
return 0;
if (!ASN1BEREncBool(enc, 0x1, (val)->meetsCriteria))
return 0;
if (!ASN1BEREncEndOfContents(enc, nLenOff))
return 0;
return 1;
}
static int ASN1CALL ASN1Dec_SpcFinancialCriteria(ASN1decoding_t dec, ASN1uint32_t tag, SpcFinancialCriteria *val)
{
ASN1decoding_t dd;
ASN1octet_t *di;
if (!ASN1BERDecExplicitTag(dec, tag ? tag : 0x10, &dd, &di))
return 0;
if (!ASN1BERDecBool(dd, 0x1, &(val)->financialInfoAvailable))
return 0;
if (!ASN1BERDecBool(dd, 0x1, &(val)->meetsCriteria))
return 0;
if (!ASN1BERDecEndOfContents(dec, dd, di))
return 0;
return 1;
}
static int ASN1CALL ASN1Enc_SpcStatementType(ASN1encoding_t enc, ASN1uint32_t tag, SpcStatementType *val)
{
ASN1uint32_t nLenOff;
ASN1uint32_t i;
if (!ASN1BEREncExplicitTag(enc, tag ? tag : 0x10, &nLenOff))
return 0;
for (i = 0; i < (val)->count; i++) {
if (!ASN1BEREncObjectIdentifier2(enc, 0x6, &((val)->value)[i]))
return 0;
}
if (!ASN1BEREncEndOfContents(enc, nLenOff))
return 0;
return 1;
}
static int ASN1CALL ASN1Dec_SpcStatementType(ASN1decoding_t dec, ASN1uint32_t tag, SpcStatementType *val)
{
ASN1decoding_t dd;
ASN1octet_t *di;
ASN1uint32_t t;
ASN1uint32_t n;
if (!ASN1BERDecExplicitTag(dec, tag ? tag : 0x10, &dd, &di))
return 0;
(val)->count = n = 0;
(val)->value = NULL;
while (ASN1BERDecNotEndOfContents(dd, di)) {
if (!ASN1BERDecPeekTag(dd, &t))
return 0;
if ((val)->count >= n) {
n = n ? (n << 1) : 16;
if (!((val)->value = (ObjectID *)ASN1DecRealloc(dd, (val)->value, n * sizeof(*(val)->value))))
return 0;
}
if (!ASN1BERDecObjectIdentifier2(dd, 0x6, &((val)->value)[(val)->count]))
return 0;
((val)->count)++;
}
if (!ASN1BERDecEndOfContents(dec, dd, di))
return 0;
return 1;
}
static void ASN1CALL ASN1Free_SpcStatementType(SpcStatementType *val)
{
ASN1uint32_t i;
if (val) {
for (i = 1; i < (val)->count; i++) {
}
ASN1Free((val)->value);
}
}
static int ASN1CALL ASN1Enc_SpcSpOpusInfo(ASN1encoding_t enc, ASN1uint32_t tag, SpcSpOpusInfo *val)
{
ASN1uint32_t nLenOff;
ASN1uint32_t nLenOff0;
if (!ASN1BEREncExplicitTag(enc, tag ? tag : 0x10, &nLenOff))
return 0;
if ((val)->o[0] & 0x80) {
if (!ASN1BEREncExplicitTag(enc, 0x80000000, &nLenOff0))
return 0;
if (!ASN1Enc_SpcString(enc, 0, &(val)->programName))
return 0;
if (!ASN1BEREncEndOfContents(enc, nLenOff0))
return 0;
}
if ((val)->o[0] & 0x40) {
if (!ASN1BEREncExplicitTag(enc, 0x80000001, &nLenOff0))
return 0;
if (!ASN1Enc_SpcLink(enc, 0, &(val)->moreInfo))
return 0;
if (!ASN1BEREncEndOfContents(enc, nLenOff0))
return 0;
}
if ((val)->o[0] & 0x20) {
if (!ASN1BEREncExplicitTag(enc, 0x80000002, &nLenOff0))
return 0;
if (!ASN1Enc_SpcLink(enc, 0, &(val)->publisherInfo))
return 0;
if (!ASN1BEREncEndOfContents(enc, nLenOff0))
return 0;
}
if (!ASN1BEREncEndOfContents(enc, nLenOff))
return 0;
return 1;
}
static int ASN1CALL ASN1Dec_SpcSpOpusInfo(ASN1decoding_t dec, ASN1uint32_t tag, SpcSpOpusInfo *val)
{
ASN1decoding_t dd;
ASN1octet_t *di;
ASN1uint32_t t;
ASN1decoding_t dd0;
ASN1octet_t *di0;
if (!ASN1BERDecExplicitTag(dec, tag ? tag : 0x10, &dd, &di))
return 0;
ZeroMemory((val)->o, 1);
ASN1BERDecPeekTag(dd, &t);
if (t == 0x80000000) {
(val)->o[0] |= 0x80;
if (!ASN1BERDecExplicitTag(dd, 0x80000000, &dd0, &di0))
return 0;
if (!ASN1Dec_SpcString(dd0, 0, &(val)->programName))
return 0;
if (!ASN1BERDecEndOfContents(dd, dd0, di0))
return 0;
}
ASN1BERDecPeekTag(dd, &t);
if (t == 0x80000001) {
(val)->o[0] |= 0x40;
if (!ASN1BERDecExplicitTag(dd, 0x80000001, &dd0, &di0))
return 0;
if (!ASN1Dec_SpcLink(dd0, 0, &(val)->moreInfo))
return 0;
if (!ASN1BERDecEndOfContents(dd, dd0, di0))
return 0;
}
ASN1BERDecPeekTag(dd, &t);
if (t == 0x80000002) {
(val)->o[0] |= 0x20;
if (!ASN1BERDecExplicitTag(dd, 0x80000002, &dd0, &di0))
return 0;
if (!ASN1Dec_SpcLink(dd0, 0, &(val)->publisherInfo))
return 0;
if (!ASN1BERDecEndOfContents(dd, dd0, di0))
return 0;
}
if (!ASN1BERDecEndOfContents(dec, dd, di))
return 0;
return 1;
}
static void ASN1CALL ASN1Free_SpcSpOpusInfo(SpcSpOpusInfo *val)
{
if (val) {
if ((val)->o[0] & 0x80) {
ASN1Free_SpcString(&(val)->programName);
}
if ((val)->o[0] & 0x40) {
ASN1Free_SpcLink(&(val)->moreInfo);
}
if ((val)->o[0] & 0x20) {
ASN1Free_SpcLink(&(val)->publisherInfo);
}
}
}
static int ASN1CALL ASN1Enc_NameValue(ASN1encoding_t enc, ASN1uint32_t tag, NameValue *val)
{
ASN1uint32_t nLenOff;
if (!ASN1BEREncExplicitTag(enc, tag ? tag : 0x10, &nLenOff))
return 0;
if (!ASN1DEREncChar16String(enc, 0x1e, ((val)->refname).length, ((val)->refname).value))
return 0;
if (!ASN1BEREncS32(enc, 0x2, (val)->typeaction))
return 0;
if (!ASN1DEREncOctetString(enc, 0x4, ((val)->value).length, ((val)->value).value))
return 0;
if (!ASN1BEREncEndOfContents(enc, nLenOff))
return 0;
return 1;
}
static int ASN1CALL ASN1Dec_NameValue(ASN1decoding_t dec, ASN1uint32_t tag, NameValue *val)
{
ASN1decoding_t dd;
ASN1octet_t *di;
if (!ASN1BERDecExplicitTag(dec, tag ? tag : 0x10, &dd, &di))
return 0;
if (!ASN1BERDecChar16String(dd, 0x1e, &(val)->refname))
return 0;
if (!ASN1BERDecS32Val(dd, 0x2, &(val)->typeaction))
return 0;
if (!ASN1BERDecOctetString2(dd, 0x4, &(val)->value))
return 0;
if (!ASN1BERDecEndOfContents(dec, dd, di))
return 0;
return 1;
}
static void ASN1CALL ASN1Free_NameValue(NameValue *val)
{
if (val) {
ASN1char16string_free(&(val)->refname);
}
}
static int ASN1CALL ASN1Enc_NameValues(ASN1encoding_t enc, ASN1uint32_t tag, NameValues *val)
{
ASN1uint32_t nLenOff;
void *pBlk;
ASN1uint32_t i;
ASN1encoding_t enc2;
if (!ASN1BEREncExplicitTag(enc, tag ? tag : 0x11, &nLenOff))
return 0;
if (!ASN1DEREncBeginBlk(enc, ASN1_DER_SET_OF_BLOCK, &pBlk))
return 0;
for (i = 0; i < (val)->count; i++) {
if (!ASN1DEREncNewBlkElement(pBlk, &enc2))
return 0;
if (!ASN1Enc_NameValue(enc2, 0, &((val)->value)[i]))
return 0;
if (!ASN1DEREncFlushBlkElement(pBlk))
return 0;
}
if (!ASN1DEREncEndBlk(pBlk))
return 0;
if (!ASN1BEREncEndOfContents(enc, nLenOff))
return 0;
return 1;
}
static int ASN1CALL ASN1Dec_NameValues(ASN1decoding_t dec, ASN1uint32_t tag, NameValues *val)
{
ASN1decoding_t dd;
ASN1octet_t *di;
ASN1uint32_t t;
ASN1uint32_t n;
if (!ASN1BERDecExplicitTag(dec, tag ? tag : 0x11, &dd, &di))
return 0;
(val)->count = n = 0;
(val)->value = NULL;
while (ASN1BERDecNotEndOfContents(dd, di)) {
if (!ASN1BERDecPeekTag(dd, &t))
return 0;
if ((val)->count >= n) {
n = n ? (n << 1) : 16;
if (!((val)->value = (NameValue *)ASN1DecRealloc(dd, (val)->value, n * sizeof(*(val)->value))))
return 0;
}
if (!ASN1Dec_NameValue(dd, 0, &((val)->value)[(val)->count]))
return 0;
((val)->count)++;
}
if (!ASN1BERDecEndOfContents(dec, dd, di))
return 0;
return 1;
}
static void ASN1CALL ASN1Free_NameValues(NameValues *val)
{
ASN1uint32_t i;
if (val) {
ASN1Free_NameValue(&(val)->value[0]);
for (i = 1; i < (val)->count; i++) {
ASN1Free_NameValue(&(val)->value[i]);
}
ASN1Free((val)->value);
}
}
static int ASN1CALL ASN1Enc_MemberInfo(ASN1encoding_t enc, ASN1uint32_t tag, MemberInfo *val)
{
ASN1uint32_t nLenOff;
if (!ASN1BEREncExplicitTag(enc, tag ? tag : 0x10, &nLenOff))
return 0;
if (!ASN1DEREncChar16String(enc, 0x1e, ((val)->subguid).length, ((val)->subguid).value))
return 0;
if (!ASN1BEREncS32(enc, 0x2, (val)->certversion))
return 0;
if (!ASN1BEREncEndOfContents(enc, nLenOff))
return 0;
return 1;
}
static int ASN1CALL ASN1Dec_MemberInfo(ASN1decoding_t dec, ASN1uint32_t tag, MemberInfo *val)
{
ASN1decoding_t dd;
ASN1octet_t *di;
if (!ASN1BERDecExplicitTag(dec, tag ? tag : 0x10, &dd, &di))
return 0;
if (!ASN1BERDecChar16String(dd, 0x1e, &(val)->subguid))
return 0;
if (!ASN1BERDecS32Val(dd, 0x2, &(val)->certversion))
return 0;
if (!ASN1BERDecEndOfContents(dec, dd, di))
return 0;
return 1;
}
static void ASN1CALL ASN1Free_MemberInfo(MemberInfo *val)
{
if (val) {
ASN1char16string_free(&(val)->subguid);
}
}
static int ASN1CALL ASN1Enc_SpcIndirectDataContent(ASN1encoding_t enc, ASN1uint32_t tag, SpcIndirectDataContent *val)
{
ASN1uint32_t nLenOff;
if (!ASN1BEREncExplicitTag(enc, tag ? tag : 0x10, &nLenOff))
return 0;
if (!ASN1Enc_SpcAttributeTypeAndOptionalValue(enc, 0, &(val)->data))
return 0;
if (!ASN1Enc_DigestInfo(enc, 0, &(val)->messageDigest))
return 0;
if (!ASN1BEREncEndOfContents(enc, nLenOff))
return 0;
return 1;
}
static int ASN1CALL ASN1Dec_SpcIndirectDataContent(ASN1decoding_t dec, ASN1uint32_t tag, SpcIndirectDataContent *val)
{
ASN1decoding_t dd;
ASN1octet_t *di;
if (!ASN1BERDecExplicitTag(dec, tag ? tag : 0x10, &dd, &di))
return 0;
if (!ASN1Dec_SpcAttributeTypeAndOptionalValue(dd, 0, &(val)->data))
return 0;
if (!ASN1Dec_DigestInfo(dd, 0, &(val)->messageDigest))
return 0;
if (!ASN1BERDecEndOfContents(dec, dd, di))
return 0;
return 1;
}
static void ASN1CALL ASN1Free_SpcIndirectDataContent(SpcIndirectDataContent *val)
{
if (val) {
ASN1Free_SpcAttributeTypeAndOptionalValue(&(val)->data);
ASN1Free_DigestInfo(&(val)->messageDigest);
}
}
static int ASN1CALL ASN1Enc_SpcSpAgencyInformation(ASN1encoding_t enc, ASN1uint32_t tag, SpcSpAgencyInformation *val)
{
ASN1uint32_t nLenOff;
ASN1uint32_t nLenOff0;
if (!ASN1BEREncExplicitTag(enc, tag ? tag : 0x10, &nLenOff))
return 0;
if ((val)->o[0] & 0x80) {
if (!ASN1BEREncExplicitTag(enc, 0x80000000, &nLenOff0))
return 0;
if (!ASN1Enc_SpcLink(enc, 0, &(val)->policyInformation))
return 0;
if (!ASN1BEREncEndOfContents(enc, nLenOff0))
return 0;
}
if ((val)->o[0] & 0x40) {
if (!ASN1BEREncExplicitTag(enc, 0x80000001, &nLenOff0))
return 0;
if (!ASN1Enc_SpcString(enc, 0, &(val)->policyDisplayText))
return 0;
if (!ASN1BEREncEndOfContents(enc, nLenOff0))
return 0;
}
if ((val)->o[0] & 0x20) {
if (!ASN1Enc_SpcImage(enc, 0x80000002, &(val)->logoImage))
return 0;
}
if ((val)->o[0] & 0x10) {
if (!ASN1BEREncExplicitTag(enc, 0x80000003, &nLenOff0))
return 0;
if (!ASN1Enc_SpcLink(enc, 0, &(val)->logoLink))
return 0;
if (!ASN1BEREncEndOfContents(enc, nLenOff0))
return 0;
}
if (!ASN1BEREncEndOfContents(enc, nLenOff))
return 0;
return 1;
}
static int ASN1CALL ASN1Dec_SpcSpAgencyInformation(ASN1decoding_t dec, ASN1uint32_t tag, SpcSpAgencyInformation *val)
{
ASN1decoding_t dd;
ASN1octet_t *di;
ASN1uint32_t t;
ASN1decoding_t dd0;
ASN1octet_t *di0;
if (!ASN1BERDecExplicitTag(dec, tag ? tag : 0x10, &dd, &di))
return 0;
ZeroMemory((val)->o, 1);
ASN1BERDecPeekTag(dd, &t);
if (t == 0x80000000) {
(val)->o[0] |= 0x80;
if (!ASN1BERDecExplicitTag(dd, 0x80000000, &dd0, &di0))
return 0;
if (!ASN1Dec_SpcLink(dd0, 0, &(val)->policyInformation))
return 0;
if (!ASN1BERDecEndOfContents(dd, dd0, di0))
return 0;
}
ASN1BERDecPeekTag(dd, &t);
if (t == 0x80000001) {
(val)->o[0] |= 0x40;
if (!ASN1BERDecExplicitTag(dd, 0x80000001, &dd0, &di0))
return 0;
if (!ASN1Dec_SpcString(dd0, 0, &(val)->policyDisplayText))
return 0;
if (!ASN1BERDecEndOfContents(dd, dd0, di0))
return 0;
}
ASN1BERDecPeekTag(dd, &t);
if (t == 0x80000002) {
(val)->o[0] |= 0x20;
if (!ASN1Dec_SpcImage(dd, 0x80000002, &(val)->logoImage))
return 0;
}
ASN1BERDecPeekTag(dd, &t);
if (t == 0x80000003) {
(val)->o[0] |= 0x10;
if (!ASN1BERDecExplicitTag(dd, 0x80000003, &dd0, &di0))
return 0;
if (!ASN1Dec_SpcLink(dd0, 0, &(val)->logoLink))
return 0;
if (!ASN1BERDecEndOfContents(dd, dd0, di0))
return 0;
}
if (!ASN1BERDecEndOfContents(dec, dd, di))
return 0;
return 1;
}
static void ASN1CALL ASN1Free_SpcSpAgencyInformation(SpcSpAgencyInformation *val)
{
if (val) {
if ((val)->o[0] & 0x80) {
ASN1Free_SpcLink(&(val)->policyInformation);
}
if ((val)->o[0] & 0x40) {
ASN1Free_SpcString(&(val)->policyDisplayText);
}
if ((val)->o[0] & 0x20) {
ASN1Free_SpcImage(&(val)->logoImage);
}
if ((val)->o[0] & 0x10) {
ASN1Free_SpcLink(&(val)->logoLink);
}
}
}