#include <stdio.h>
#include <iostream.h>
#include "asn-incl.h"
int TestAsnBuffers();
int TestAsnTag();
int TestAsnLen();
int TestAsnBool();
int TestAsnInt();
int TestAsnReal();
int TestAsnOcts();
int TestAsnBits();
int TestAsnOid();
int TestAsnList();
const int bufSize = 256;
int main()
{
int isErr = false;
if (!TestAsnBuffers())
{
cout << "Failed buffer tests, no point in proceeding ... bye!" << endl;
return 1;
}
if (!TestAsnTag())
{
cout << "Failed Tag test." << endl;
isErr = true;
}
if (!TestAsnLen())
{
cout << "Failed Length test." << endl;
isErr = true;
}
if (!TestAsnBool())
{
cout << "Failed BOOLEAN test." << endl;
isErr = true;
}
if (!TestAsnInt())
{
cout << "Failed INTEGER test." << endl;
isErr = true;
}
if (!TestAsnOcts())
{
cout << "Failed OCTET STRING test." << endl;
isErr = true;
}
if (!TestAsnBits())
{
cout << "Failed BIT STRING test." << endl;
isErr = true;
}
if (!TestAsnOid())
{
cout << "Failed OBJECT IDENTIFIER test." << endl;
isErr = true;
}
if (!TestAsnReal())
{
cout << "Failed REAL test." << endl;
isErr = true;
}
if (isErr)
{
cout << "There are errors in the primitive type encoding/decoding" << endl;
cout << "library for this architecture. Time for gdb..." << endl;
}
else
{
cout << "The primitive type encoding/decoding library passed simple tests." << endl;
cout << "It should be safe to use..." << endl;
}
return isErr;
}
int
TestAsnBuffers()
{
AsnBuf b;
char bufData[256];
int i,j;
int noErr = true;
b.Init (bufData, 256);
b.ResetInWriteRvsMode();
for (i = 0; i < 256; i++)
b.PutByteRvs (i);
if (b.WriteError())
{
cout << "Error writing to buffer." << endl;
noErr = false;
}
b.ResetInReadMode();
for (i = 255; i >= 0; i--)
if (b.GetByte() != i)
{
cout << "Error verifying data written to buffer." << endl;
noErr = false;
}
if (b.ReadError())
{
cout << "Error reading from buffer." << endl;
noErr = false;
}
b.ResetInWriteRvsMode();
for (i = 0; i < 257; i++) b.PutByteRvs (0);
if (!b.WriteError())
{
cout << "Buffers failed to report buffer write overflow." << endl;
noErr = false;
}
b.ResetInReadMode();
for (i = 256; i >= 0; i--) b.GetByte();
if (!b.ReadError())
{
cout << "Buffers failed to report buffer read overflow." << endl;
noErr = false;
}
return noErr;
}
int
TestAsnTag()
{
AsnTag aTag1;
AsnTag aTag2;
int i, j;
AsnLen len1;
AsnLen len2;
AsnTag tag;
int noErr = true;
ENV_TYPE env;
AsnBuf b;
char bufData[256];
long int val;
BER_CLASS tagClass;
BER_FORM form;
BER_UNIV_CODE code;
b.Init (bufData, 256);
tagClass = UNIV;
form = PRIM;
code = INTEGER_TAG_CODE;
aTag1 = MAKE_TAG_ID (tagClass, form, code);
for (i = 0; i < 2; i++)
{
b.ResetInWriteRvsMode();
len1 = BEncTag1 (b, tagClass, form, code);
if (b.WriteError())
{
noErr = false;
cout << "Error encoding a Tag." << endl;
}
b.ResetInReadMode();
aTag2 = 0;
len2 = 0;
if ((val = setjmp (env)) == 0)
{
aTag2 = BDecTag (b, len2, env);
}
else
{
noErr = false;
cout << "Error decoding a Tag - error number " << val << endl;
}
if (noErr && ((aTag2 != aTag1) || (len1 != len2)))
{
noErr = false;
cout << "Error decoded Tag does not match encoded Tag." << endl;
}
tagClass = CNTX;
form = CONS;
code = (BER_UNIV_CODE) 29;
aTag1 = MAKE_TAG_ID (tagClass, form, code);
}
return noErr;
}
int
TestAsnLen()
{
AsnLen aLen1;
AsnLen aLen2;
int i,j;
AsnLen len1;
AsnLen len2;
AsnTag tag;
int noErr = true;
ENV_TYPE env;
AsnBuf b;
char bufData[256];
long int val;
b.Init (bufData, 256);
aLen1 = 99999;
for (i = 0; i < 2; i++)
{
b.ResetInWriteRvsMode();
len1 = BEncDefLen (b, aLen1);
if (b.WriteError())
{
noErr = false;
cout << "Error encoding Length." << endl;
}
b.ResetInReadMode();
aLen2 = 0;
len2 = 0;
if ((val = setjmp (env)) == 0)
{
aLen2 = BDecLen (b, len2, env);
}
else
{
noErr = false;
cout << "Error decoding Length - error number " << val << endl;
}
if (noErr && ((aLen2 != aLen1) || (len1 != len2)))
{
noErr = false;
cout << "Error - decoded length does not match encoded length" << endl;
}
aLen1 = 2;
}
b.ResetInWriteRvsMode();
len1 = BEncIndefLen (b);
if (b.WriteError())
{
noErr = false;
cout << "Error encoding indefinite Length." << endl;
}
b.ResetInReadMode();
aLen2 = 0;
len2 = 0;
if ((val = setjmp (env)) == 0)
{
aLen2 = BDecLen (b, len2, env);
}
else
{
noErr = false;
cout << "Error decoding Length - error number " << val << endl;
}
if (noErr && ((aLen2 != INDEFINITE_LEN) || (len1 != len2)))
{
noErr = false;
cout << "Error - decoded length does not match encoded length" << endl;
}
b.ResetInWriteRvsMode();
len1 = BEncEoc (b);
if (b.WriteError())
{
noErr = false;
cout << "Error encoding indefinite Length." << endl;
}
b.ResetInReadMode();
aLen2 = 0;
len2 = 0;
if ((val = setjmp (env)) == 0)
{
BDecEoc (b, len2, env);
}
else
{
noErr = false;
cout << "Error decoding Length - error number " << val << endl;
}
if (noErr && (len1 != len2))
{
noErr = false;
cout << "Error - decoded EOC length error" << endl;
}
return noErr;
}
int
TestAsnBool()
{
AsnBuf b;
char bufData[bufSize];
AsnBool aBool1;
AsnBool aBool2;
int j;
AsnLen len1;
AsnLen len2;
int noErr = true;
b.Init (bufData, bufSize);
b.ResetInWriteRvsMode();
aBool1 = true;
if (!aBool1.BEncPdu (b, len1))
{
noErr = false;
cout << "Error encoding TRUE BOOLEAN value." << endl;
}
b.ResetInReadMode();
aBool2 = false;
if (!aBool2.BDecPdu (b, len2) || !aBool2 || (len1 != len2))
{
noErr = false;
cout << "Error decoding TRUE BOOLEAN value." << endl;
}
b.ResetInWriteRvsMode();
aBool1 = false;
if (!aBool1.BEncPdu (b, len1))
{
noErr = false;
cout << "Error encoding FALSE BOOLEAN value." << endl;
}
b.ResetInReadMode();
aBool2 = true;
if (!aBool2.BDecPdu (b, len2) || aBool2 || (len1 != len2))
{
noErr = false;
cout << "Error decoding FALSE BOOLEAN value." << endl;
}
return noErr;
}
int
TestAsnInt()
{
AsnBuf b;
char bufData[bufSize];
AsnInt a1;
AsnInt a2;
int i,j, sign;
AsnLen len1;
AsnLen len2;
int noErr = true;
b.Init (bufData, bufSize);
sign = 1;
for (j = 0; j < 2; j++)
{
for (i = 0; i < sizeof (long int); i++)
{
b.ResetInWriteRvsMode();
a1 = sign * (17 << (i * 8)); if (!a1.BEncPdu (b, len1))
{
noErr = false;
cout << "Error encoding INTEGER value " << a1 << "." << endl;
}
b.ResetInReadMode();
a2 = 0;
if (!a2.BDecPdu (b, len2) || (a2 != a1) || (len1 != len2))
{
noErr = false;
cout << "Error decoding INTEGER value " << a1 << "." << endl;
}
}
sign = -1;
}
return noErr;
}
int
TestAsnOcts()
{
AsnBuf b;
char bufData[bufSize];
AsnOcts a1;
AsnOcts a2;
int i,j;
AsnLen len1;
AsnLen len2;
int noErr = true;
b.Init (bufData, bufSize);
a1 = "Hello Gumby?";
for (j = 0; j < 2; j++)
{
b.ResetInWriteRvsMode();
if (!a1.BEncPdu (b, len1))
{
noErr = false;
cout << "Error encoding OCTET STRING value " << a1 << "." << endl;
}
b.ResetInReadMode();
if (!a2.BDecPdu (b, len2) || (a2 != a1) || (len1 != len2))
{
noErr = false;
cout << "Error decoding OCTET STRING value " << a1 << "." << endl;
}
a1 = ""; }
return noErr;
}
int
TestAsnBits()
{
AsnBuf b;
char bufData[bufSize];
AsnBits a1 (32);
AsnBits a2 (32);
short bitsToSet[32] = { 0, 1, 0, 0, 1, 1, 0, 1,
0, 1, 0, 0, 1, 1, 0, 1,
0, 1, 0, 0, 1, 1, 0, 1,
0, 1, 0, 0, 1, 1, 0, 1 };
int i,j;
AsnLen len1;
AsnLen len2;
int noErr = true;
b.Init (bufData, bufSize);
for (i = 0; i < 32; i++)
{
if (bitsToSet[i])
a1.SetBit (i);
else
a1.ClrBit (i);
}
b.ResetInWriteRvsMode();
if (!a1.BEncPdu (b, len1))
{
noErr = false;
cout << "Error encoding BIT STRING value " << a1 << "." << endl;
}
b.ResetInReadMode();
if (!a2.BDecPdu (b, len2) || (a2 != a1) || (len1 != len2))
{
noErr = false;
cout << "Error decoding BIT STRING value " << a1 << "." << endl;
}
return noErr;
}
int
TestAsnOid()
{
AsnBuf b;
char bufData[bufSize];
AsnOid a1 (0,1,2,3,4,5,6);
AsnOid a2;
AsnOid a3 (2,38,29,40,200,10,4000);
int i,j;
AsnLen len1;
AsnLen len2;
int noErr = true;
b.Init (bufData, bufSize);
for (i = 0; i < 2; i++)
{
b.ResetInWriteRvsMode();
if (!a1.BEncPdu (b, len1))
{
noErr = false;
cout << "Error encoding OBJECT IDENTIFIER value " << a1 << "." << endl;
}
b.ResetInReadMode();
if (!a2.BDecPdu (b, len2) || (a2 != a1) || (len1 != len2))
{
noErr = false;
cout << "Error decoding OBJECT IDENTIFIER value " << a1 << "." << endl;
}
a1 = a3;
}
return noErr;
}
int
TestAsnReal()
{
#ifdef __APPLE__
return true;
#else
AsnBuf b;
char bufData[bufSize];
AsnReal a2;
AsnReal a[] = { 0.0, 0.8, -22.484848, PLUS_INFINITY, MINUS_INFINITY};
int i,j;
AsnLen len1;
AsnLen len2;
int noErr = true;
#if HAVE_ISINF
if (!isinf ((double)PLUS_INFINITY)) || !isinf ((double)MINUS_INFINITY))
#else
#if HAVE_FINITE
if (finite ((double)PLUS_INFINITY) || finite ((double)MINUS_INFINITY))
#else
#error "oops: you've got neither isinf(3) nor finite(3)?!"
#endif
#endif
{
cout << "WARNING: PLUS_INFINITY and MINUS_INFINITY in .../c++-lib/src/asn-real.C are" << endl;
cout << "not correct for this architecture. Modify the AsnPlusInfinity() routine." << endl;
}
b.Init (bufData, bufSize);
for (i = 0; i < 5; i++)
{
b.ResetInWriteRvsMode();
if (!a[i].BEncPdu (b, len1))
{
noErr = false;
cout << "Error encoding REAL value " << a[i] << "." << endl;
}
b.ResetInReadMode();
if (!a2.BDecPdu (b, len2) || (a2 != a[i]) || (len1 != len2))
{
noErr = false;
cout << "Error decoding REAL value " << a[i] << "." << endl;
}
}
return noErr;
#endif
}