477 lines
14 KiB
C
477 lines
14 KiB
C
#include <windows.h>
|
|
#include "snego.h"
|
|
|
|
ASN1module_t SNEGO_Module = NULL;
|
|
|
|
static int ASN1CALL ASN1Enc_MechTypeList2(ASN1encoding_t enc, ASN1uint32_t tag, PMechTypeList2 *val);
|
|
static int ASN1CALL ASN1Enc_NegHints2(ASN1encoding_t enc, ASN1uint32_t tag, NegHints2 *val);
|
|
static int ASN1CALL ASN1Enc_NegTokenReq2(ASN1encoding_t enc, ASN1uint32_t tag, NegTokenReq2 *val);
|
|
static int ASN1CALL ASN1Enc_NegResultList2(ASN1encoding_t enc, ASN1uint32_t tag, PNegResultList2 *val);
|
|
static int ASN1CALL ASN1Enc_NegTokenRep2(ASN1encoding_t enc, ASN1uint32_t tag, NegTokenRep2 *val);
|
|
static int ASN1CALL ASN1Enc_NegotiationToken2(ASN1encoding_t enc, ASN1uint32_t tag, NegotiationToken2 *val);
|
|
static int ASN1CALL ASN1Dec_MechTypeList2(ASN1decoding_t dec, ASN1uint32_t tag, PMechTypeList2 *val);
|
|
static int ASN1CALL ASN1Dec_NegHints2(ASN1decoding_t dec, ASN1uint32_t tag, NegHints2 *val);
|
|
static int ASN1CALL ASN1Dec_NegTokenReq2(ASN1decoding_t dec, ASN1uint32_t tag, NegTokenReq2 *val);
|
|
static int ASN1CALL ASN1Dec_NegResultList2(ASN1decoding_t dec, ASN1uint32_t tag, PNegResultList2 *val);
|
|
static int ASN1CALL ASN1Dec_NegTokenRep2(ASN1decoding_t dec, ASN1uint32_t tag, NegTokenRep2 *val);
|
|
static int ASN1CALL ASN1Dec_NegotiationToken2(ASN1decoding_t dec, ASN1uint32_t tag, NegotiationToken2 *val);
|
|
static void ASN1CALL ASN1Free_MechTypeList2(PMechTypeList2 *val);
|
|
static void ASN1CALL ASN1Free_NegHints2(NegHints2 *val);
|
|
static void ASN1CALL ASN1Free_NegTokenReq2(NegTokenReq2 *val);
|
|
static void ASN1CALL ASN1Free_NegResultList2(PNegResultList2 *val);
|
|
static void ASN1CALL ASN1Free_NegTokenRep2(NegTokenRep2 *val);
|
|
static void ASN1CALL ASN1Free_NegotiationToken2(NegotiationToken2 *val);
|
|
|
|
typedef ASN1BerEncFun_t ASN1EncFun_t;
|
|
static const ASN1EncFun_t encfntab[1] = {
|
|
(ASN1EncFun_t) ASN1Enc_NegotiationToken2,
|
|
};
|
|
typedef ASN1BerDecFun_t ASN1DecFun_t;
|
|
static const ASN1DecFun_t decfntab[1] = {
|
|
(ASN1DecFun_t) ASN1Dec_NegotiationToken2,
|
|
};
|
|
static const ASN1FreeFun_t freefntab[1] = {
|
|
(ASN1FreeFun_t) ASN1Free_NegotiationToken2,
|
|
};
|
|
static const ULONG sizetab[1] = {
|
|
SIZE_SNEGO_Module_PDU_0,
|
|
};
|
|
|
|
/* forward declarations of values: */
|
|
/* definitions of value components: */
|
|
/* definitions of values: */
|
|
|
|
void ASN1CALL SNEGO_Module_Startup(void)
|
|
{
|
|
SNEGO_Module = ASN1_CreateModule(0x10000, ASN1_BER_RULE_DER, ASN1FLAGS_NONE, 1, (const ASN1GenericFun_t *) encfntab, (const ASN1GenericFun_t *) decfntab, freefntab, sizetab, 0x67656e73);
|
|
}
|
|
|
|
void ASN1CALL SNEGO_Module_Cleanup(void)
|
|
{
|
|
ASN1_CloseModule(SNEGO_Module);
|
|
SNEGO_Module = NULL;
|
|
}
|
|
|
|
static int ASN1CALL ASN1Enc_MechTypeList2(ASN1encoding_t enc, ASN1uint32_t tag, PMechTypeList2 *val)
|
|
{
|
|
PMechTypeList2 f;
|
|
ASN1uint32_t nLenOff;
|
|
if (!ASN1BEREncExplicitTag(enc, tag ? tag : 0x10, &nLenOff))
|
|
return 0;
|
|
for (f = *val; f; f = f->next) {
|
|
if (!ASN1BEREncObjectIdentifier(enc, 0x6, &f->value))
|
|
return 0;
|
|
}
|
|
if (!ASN1BEREncEndOfContents(enc, nLenOff))
|
|
return 0;
|
|
return 1;
|
|
}
|
|
|
|
static int ASN1CALL ASN1Dec_MechTypeList2(ASN1decoding_t dec, ASN1uint32_t tag, PMechTypeList2 *val)
|
|
{
|
|
PMechTypeList2 *f;
|
|
ASN1decoding_t dd;
|
|
ASN1octet_t *di;
|
|
ASN1uint32_t t;
|
|
if (!ASN1BERDecExplicitTag(dec, tag ? tag : 0x10, &dd, &di))
|
|
return 0;
|
|
f = val;
|
|
while (ASN1BERDecNotEndOfContents(dd, di)) {
|
|
if (!ASN1BERDecPeekTag(dd, &t))
|
|
return 0;
|
|
if (!(*f = (PMechTypeList2)ASN1DecAlloc(dd, sizeof(**f))))
|
|
return 0;
|
|
if (!ASN1BERDecObjectIdentifier(dd, 0x6, &(*f)->value))
|
|
return 0;
|
|
f = &(*f)->next;
|
|
}
|
|
*f = NULL;
|
|
if (!ASN1BERDecEndOfContents(dec, dd, di))
|
|
return 0;
|
|
return 1;
|
|
}
|
|
|
|
static void ASN1CALL ASN1Free_MechTypeList2(PMechTypeList2 *val)
|
|
{
|
|
PMechTypeList2 f, ff;
|
|
if (val) {
|
|
for (f = *val; f; f = ff) {
|
|
ASN1objectidentifier_free(&f->value);
|
|
ff = f->next;
|
|
ASN1Free(f);
|
|
}
|
|
}
|
|
}
|
|
|
|
static int ASN1CALL ASN1Enc_NegHints2(ASN1encoding_t enc, ASN1uint32_t tag, NegHints2 *val)
|
|
{
|
|
ASN1uint32_t nLenOff;
|
|
ASN1uint32_t t;
|
|
ASN1uint32_t nLenOff0;
|
|
if (!ASN1BEREncExplicitTag(enc, tag ? tag : 0x10, &nLenOff))
|
|
return 0;
|
|
if ((val)->o[0] & 0x80) {
|
|
t = lstrlenA((val)->hintName);
|
|
if (!ASN1BEREncExplicitTag(enc, 0x80000000, &nLenOff0))
|
|
return 0;
|
|
if (!ASN1DEREncCharString(enc, 0x1b, t, (val)->hintName))
|
|
return 0;
|
|
if (!ASN1BEREncEndOfContents(enc, nLenOff0))
|
|
return 0;
|
|
}
|
|
if ((val)->o[0] & 0x40) {
|
|
if (!ASN1BEREncExplicitTag(enc, 0x80000001, &nLenOff0))
|
|
return 0;
|
|
if (!ASN1DEREncOctetString(enc, 0x4, ((val)->hintAddress).length, ((val)->hintAddress).value))
|
|
return 0;
|
|
if (!ASN1BEREncEndOfContents(enc, nLenOff0))
|
|
return 0;
|
|
}
|
|
if (!ASN1BEREncEndOfContents(enc, nLenOff))
|
|
return 0;
|
|
return 1;
|
|
}
|
|
|
|
static int ASN1CALL ASN1Dec_NegHints2(ASN1decoding_t dec, ASN1uint32_t tag, NegHints2 *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 (!ASN1BERDecZeroCharString(dd0, 0x1b, &(val)->hintName))
|
|
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 (!ASN1BERDecOctetString(dd0, 0x4, &(val)->hintAddress))
|
|
return 0;
|
|
if (!ASN1BERDecEndOfContents(dd, dd0, di0))
|
|
return 0;
|
|
}
|
|
if (!ASN1BERDecEndOfContents(dec, dd, di))
|
|
return 0;
|
|
return 1;
|
|
}
|
|
|
|
static void ASN1CALL ASN1Free_NegHints2(NegHints2 *val)
|
|
{
|
|
if (val) {
|
|
if ((val)->o[0] & 0x80) {
|
|
ASN1ztcharstring_free((val)->hintName);
|
|
}
|
|
if ((val)->o[0] & 0x40) {
|
|
ASN1octetstring_free(&(val)->hintAddress);
|
|
}
|
|
}
|
|
}
|
|
|
|
static int ASN1CALL ASN1Enc_NegTokenReq2(ASN1encoding_t enc, ASN1uint32_t tag, NegTokenReq2 *val)
|
|
{
|
|
ASN1uint32_t nLenOff;
|
|
ASN1uint32_t nLenOff0;
|
|
if (!ASN1BEREncExplicitTag(enc, tag ? tag : 0x10, &nLenOff))
|
|
return 0;
|
|
if (!ASN1BEREncExplicitTag(enc, 0x80000000, &nLenOff0))
|
|
return 0;
|
|
if (!ASN1Enc_MechTypeList2(enc, 0, &(val)->mechTypes))
|
|
return 0;
|
|
if (!ASN1BEREncEndOfContents(enc, nLenOff0))
|
|
return 0;
|
|
if ((val)->o[0] & 0x80) {
|
|
if (!ASN1BEREncExplicitTag(enc, 0x80000001, &nLenOff0))
|
|
return 0;
|
|
if (!ASN1DEREncOctetString(enc, 0x4, ((val)->desiredToken).length, ((val)->desiredToken).value))
|
|
return 0;
|
|
if (!ASN1BEREncEndOfContents(enc, nLenOff0))
|
|
return 0;
|
|
}
|
|
if ((val)->o[0] & 0x40) {
|
|
if (!ASN1BEREncExplicitTag(enc, 0x80000002, &nLenOff0))
|
|
return 0;
|
|
if (!ASN1Enc_NegHints2(enc, 0, &(val)->negHints2))
|
|
return 0;
|
|
if (!ASN1BEREncEndOfContents(enc, nLenOff0))
|
|
return 0;
|
|
}
|
|
if (!ASN1BEREncEndOfContents(enc, nLenOff))
|
|
return 0;
|
|
return 1;
|
|
}
|
|
|
|
static int ASN1CALL ASN1Dec_NegTokenReq2(ASN1decoding_t dec, ASN1uint32_t tag, NegTokenReq2 *val)
|
|
{
|
|
ASN1decoding_t dd;
|
|
ASN1octet_t *di;
|
|
ASN1decoding_t dd0;
|
|
ASN1octet_t *di0;
|
|
ASN1uint32_t t;
|
|
if (!ASN1BERDecExplicitTag(dec, tag ? tag : 0x10, &dd, &di))
|
|
return 0;
|
|
ZeroMemory((val)->o, 1);
|
|
if (!ASN1BERDecExplicitTag(dd, 0x80000000, &dd0, &di0))
|
|
return 0;
|
|
if (!ASN1Dec_MechTypeList2(dd0, 0, &(val)->mechTypes))
|
|
return 0;
|
|
if (!ASN1BERDecEndOfContents(dd, dd0, di0))
|
|
return 0;
|
|
ASN1BERDecPeekTag(dd, &t);
|
|
if (t == 0x80000001) {
|
|
(val)->o[0] |= 0x80;
|
|
if (!ASN1BERDecExplicitTag(dd, 0x80000001, &dd0, &di0))
|
|
return 0;
|
|
if (!ASN1BERDecOctetString(dd0, 0x4, &(val)->desiredToken))
|
|
return 0;
|
|
if (!ASN1BERDecEndOfContents(dd, dd0, di0))
|
|
return 0;
|
|
}
|
|
ASN1BERDecPeekTag(dd, &t);
|
|
if (t == 0x80000002) {
|
|
(val)->o[0] |= 0x40;
|
|
if (!ASN1BERDecExplicitTag(dd, 0x80000002, &dd0, &di0))
|
|
return 0;
|
|
if (!ASN1Dec_NegHints2(dd0, 0, &(val)->negHints2))
|
|
return 0;
|
|
if (!ASN1BERDecEndOfContents(dd, dd0, di0))
|
|
return 0;
|
|
}
|
|
if (!ASN1BERDecEndOfContents(dec, dd, di))
|
|
return 0;
|
|
return 1;
|
|
}
|
|
|
|
static void ASN1CALL ASN1Free_NegTokenReq2(NegTokenReq2 *val)
|
|
{
|
|
if (val) {
|
|
ASN1Free_MechTypeList2(&(val)->mechTypes);
|
|
if ((val)->o[0] & 0x80) {
|
|
ASN1octetstring_free(&(val)->desiredToken);
|
|
}
|
|
if ((val)->o[0] & 0x40) {
|
|
ASN1Free_NegHints2(&(val)->negHints2);
|
|
}
|
|
}
|
|
}
|
|
|
|
static int ASN1CALL ASN1Enc_NegResultList2(ASN1encoding_t enc, ASN1uint32_t tag, PNegResultList2 *val)
|
|
{
|
|
PNegResultList2 f;
|
|
ASN1uint32_t nLenOff;
|
|
if (!ASN1BEREncExplicitTag(enc, tag ? tag : 0x10, &nLenOff))
|
|
return 0;
|
|
for (f = *val; f; f = f->next) {
|
|
if (!ASN1BEREncU32(enc, 0xa, f->value))
|
|
return 0;
|
|
}
|
|
if (!ASN1BEREncEndOfContents(enc, nLenOff))
|
|
return 0;
|
|
return 1;
|
|
}
|
|
|
|
static int ASN1CALL ASN1Dec_NegResultList2(ASN1decoding_t dec, ASN1uint32_t tag, PNegResultList2 *val)
|
|
{
|
|
PNegResultList2 *f;
|
|
ASN1decoding_t dd;
|
|
ASN1octet_t *di;
|
|
ASN1uint32_t t;
|
|
if (!ASN1BERDecExplicitTag(dec, tag ? tag : 0x10, &dd, &di))
|
|
return 0;
|
|
f = val;
|
|
while (ASN1BERDecNotEndOfContents(dd, di)) {
|
|
if (!ASN1BERDecPeekTag(dd, &t))
|
|
return 0;
|
|
if (!(*f = (PNegResultList2)ASN1DecAlloc(dd, sizeof(**f))))
|
|
return 0;
|
|
if (!ASN1BERDecU32Val(dd, 0xa, (ASN1uint32_t *)&(*f)->value))
|
|
return 0;
|
|
f = &(*f)->next;
|
|
}
|
|
*f = NULL;
|
|
if (!ASN1BERDecEndOfContents(dec, dd, di))
|
|
return 0;
|
|
return 1;
|
|
}
|
|
|
|
static void ASN1CALL ASN1Free_NegResultList2(PNegResultList2 *val)
|
|
{
|
|
PNegResultList2 f, ff;
|
|
if (val) {
|
|
for (f = *val; f; f = ff) {
|
|
ff = f->next;
|
|
ASN1Free(f);
|
|
}
|
|
}
|
|
}
|
|
|
|
static int ASN1CALL ASN1Enc_NegTokenRep2(ASN1encoding_t enc, ASN1uint32_t tag, NegTokenRep2 *val)
|
|
{
|
|
ASN1uint32_t nLenOff;
|
|
ASN1uint32_t nLenOff0;
|
|
if (!ASN1BEREncExplicitTag(enc, tag ? tag : 0x10, &nLenOff))
|
|
return 0;
|
|
if (!ASN1BEREncExplicitTag(enc, 0x80000000, &nLenOff0))
|
|
return 0;
|
|
if (!ASN1Enc_NegResultList2(enc, 0, &(val)->negResultList))
|
|
return 0;
|
|
if (!ASN1BEREncEndOfContents(enc, nLenOff0))
|
|
return 0;
|
|
if ((val)->o[0] & 0x80) {
|
|
if (!ASN1BEREncExplicitTag(enc, 0x80000001, &nLenOff0))
|
|
return 0;
|
|
if (!ASN1BEREncObjectIdentifier(enc, 0x6, &(val)->supportedMech2))
|
|
return 0;
|
|
if (!ASN1BEREncEndOfContents(enc, nLenOff0))
|
|
return 0;
|
|
}
|
|
if ((val)->o[0] & 0x40) {
|
|
if (!ASN1BEREncExplicitTag(enc, 0x80000002, &nLenOff0))
|
|
return 0;
|
|
if (!ASN1DEREncOctetString(enc, 0x4, ((val)->mechSpecInfo2).length, ((val)->mechSpecInfo2).value))
|
|
return 0;
|
|
if (!ASN1BEREncEndOfContents(enc, nLenOff0))
|
|
return 0;
|
|
}
|
|
if (!ASN1BEREncEndOfContents(enc, nLenOff))
|
|
return 0;
|
|
return 1;
|
|
}
|
|
|
|
static int ASN1CALL ASN1Dec_NegTokenRep2(ASN1decoding_t dec, ASN1uint32_t tag, NegTokenRep2 *val)
|
|
{
|
|
ASN1decoding_t dd;
|
|
ASN1octet_t *di;
|
|
ASN1decoding_t dd0;
|
|
ASN1octet_t *di0;
|
|
ASN1uint32_t t;
|
|
if (!ASN1BERDecExplicitTag(dec, tag ? tag : 0x10, &dd, &di))
|
|
return 0;
|
|
ZeroMemory((val)->o, 1);
|
|
if (!ASN1BERDecExplicitTag(dd, 0x80000000, &dd0, &di0))
|
|
return 0;
|
|
if (!ASN1Dec_NegResultList2(dd0, 0, &(val)->negResultList))
|
|
return 0;
|
|
if (!ASN1BERDecEndOfContents(dd, dd0, di0))
|
|
return 0;
|
|
ASN1BERDecPeekTag(dd, &t);
|
|
if (t == 0x80000001) {
|
|
(val)->o[0] |= 0x80;
|
|
if (!ASN1BERDecExplicitTag(dd, 0x80000001, &dd0, &di0))
|
|
return 0;
|
|
if (!ASN1BERDecObjectIdentifier(dd0, 0x6, &(val)->supportedMech2))
|
|
return 0;
|
|
if (!ASN1BERDecEndOfContents(dd, dd0, di0))
|
|
return 0;
|
|
}
|
|
ASN1BERDecPeekTag(dd, &t);
|
|
if (t == 0x80000002) {
|
|
(val)->o[0] |= 0x40;
|
|
if (!ASN1BERDecExplicitTag(dd, 0x80000002, &dd0, &di0))
|
|
return 0;
|
|
if (!ASN1BERDecOctetString(dd0, 0x4, &(val)->mechSpecInfo2))
|
|
return 0;
|
|
if (!ASN1BERDecEndOfContents(dd, dd0, di0))
|
|
return 0;
|
|
}
|
|
if (!ASN1BERDecEndOfContents(dec, dd, di))
|
|
return 0;
|
|
return 1;
|
|
}
|
|
|
|
static void ASN1CALL ASN1Free_NegTokenRep2(NegTokenRep2 *val)
|
|
{
|
|
if (val) {
|
|
ASN1Free_NegResultList2(&(val)->negResultList);
|
|
if ((val)->o[0] & 0x80) {
|
|
ASN1objectidentifier_free(&(val)->supportedMech2);
|
|
}
|
|
if ((val)->o[0] & 0x40) {
|
|
ASN1octetstring_free(&(val)->mechSpecInfo2);
|
|
}
|
|
}
|
|
}
|
|
|
|
static int ASN1CALL ASN1Enc_NegotiationToken2(ASN1encoding_t enc, ASN1uint32_t tag, NegotiationToken2 *val)
|
|
{
|
|
ASN1uint32_t nLenOff0;
|
|
switch ((val)->choice) {
|
|
case 1:
|
|
if (!ASN1BEREncExplicitTag(enc, 0x80000000, &nLenOff0))
|
|
return 0;
|
|
if (!ASN1Enc_NegTokenReq2(enc, 0, &(val)->u.negTokenReq))
|
|
return 0;
|
|
if (!ASN1BEREncEndOfContents(enc, nLenOff0))
|
|
return 0;
|
|
break;
|
|
case 2:
|
|
if (!ASN1BEREncExplicitTag(enc, 0x80000001, &nLenOff0))
|
|
return 0;
|
|
if (!ASN1Enc_NegTokenRep2(enc, 0, &(val)->u.negTokenRep))
|
|
return 0;
|
|
if (!ASN1BEREncEndOfContents(enc, nLenOff0))
|
|
return 0;
|
|
break;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
static int ASN1CALL ASN1Dec_NegotiationToken2(ASN1decoding_t dec, ASN1uint32_t tag, NegotiationToken2 *val)
|
|
{
|
|
ASN1uint32_t t;
|
|
ASN1decoding_t dd0;
|
|
ASN1octet_t *di0;
|
|
if (!ASN1BERDecPeekTag(dec, &t))
|
|
return 0;
|
|
switch (t) {
|
|
case 0x80000000:
|
|
(val)->choice = 1;
|
|
if (!ASN1BERDecExplicitTag(dec, 0x80000000, &dd0, &di0))
|
|
return 0;
|
|
if (!ASN1Dec_NegTokenReq2(dd0, 0, &(val)->u.negTokenReq))
|
|
return 0;
|
|
if (!ASN1BERDecEndOfContents(dec, dd0, di0))
|
|
return 0;
|
|
break;
|
|
case 0x80000001:
|
|
(val)->choice = 2;
|
|
if (!ASN1BERDecExplicitTag(dec, 0x80000001, &dd0, &di0))
|
|
return 0;
|
|
if (!ASN1Dec_NegTokenRep2(dd0, 0, &(val)->u.negTokenRep))
|
|
return 0;
|
|
if (!ASN1BERDecEndOfContents(dec, dd0, di0))
|
|
return 0;
|
|
break;
|
|
default:
|
|
ASN1DecSetError(dec, ASN1_ERR_CORRUPT);
|
|
return 0;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
static void ASN1CALL ASN1Free_NegotiationToken2(NegotiationToken2 *val)
|
|
{
|
|
if (val) {
|
|
switch ((val)->choice) {
|
|
case 1:
|
|
ASN1Free_NegTokenReq2(&(val)->u.negTokenReq);
|
|
break;
|
|
case 2:
|
|
ASN1Free_NegTokenRep2(&(val)->u.negTokenRep);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|