Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1228 lines
31 KiB

/*++
Copyright (c) 1992-1996 Microsoft Corporation
Module Name:
bertest.c
Abstract:
Test code for ASN.1 BER Encode/Decode APIs.
Environment:
User Mode - Win32
Revision History:
10-May-1996 DonRyan
Removed banner from Technology Dynamics, Inc.
--*/
//--------------------------- WINDOWS DEPENDENCIES --------------------------
//--------------------------- STANDARD DEPENDENCIES -- #include<xxxxx.h> ----
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
//--------------------------- MODULE DEPENDENCIES -- #include"xxxxx.h" ------
#include <snmp.h>
#include <snmputil.h>
#include "berapi.h"
//--------------------------- SELF-DEPENDENCY -- ONE #include"module.h" -----
//--------------------------- PUBLIC VARIABLES --(same as in module.h file)--
//--------------------------- PRIVATE CONSTANTS -----------------------------
//--------------------------- PRIVATE STRUCTS -------------------------------
//--------------------------- PRIVATE VARIABLES -----------------------------
//--------------------------- PRIVATE PROTOTYPES ----------------------------
//--------------------------- PRIVATE PROCEDURES ----------------------------
//--------------------------- PUBLIC PROCEDURES -----------------------------
// Will stack overflow if this declaration is in MAIN
BYTE pBuffer[0x10000];
int bertest()
{
BYTE *pOutBuf;
BYTE *pTemp;
UINT nLength;
UINT nOutLen;
AsnAny pResult;
int status;
pOutBuf = NULL;
nOutLen = 0;
printf( "\n\nBER api testing\n" );
printf( "---------------\n\n\n" );
//
// Test general buffer info errors
//
printf( "General buffer testing\n\n" );
// Buffer too short - length 0
pBuffer[0] = ASN_INTEGER;
pBuffer[1] = 1;
pBuffer[2] = 0xff;
nLength = 0;
pTemp = pBuffer;
status = SnmpBerDecodeAsnStream( ASN_INTEGER, &pTemp, &nLength,
&pResult );
if ( status == SNMPAPI_ERROR )
{
printf ( " Short buffer test - length 0: Error: %d\n", GetLastError() );
}
else
{
printf( " Short buffer test succeeded, shouldn't have: %lu\n",
pResult.asnValue.number );
}
// Buffer too short - length 1
pBuffer[0] = ASN_INTEGER;
pBuffer[1] = 1;
pBuffer[2] = 0xff;
nLength = 1;
pTemp = pBuffer;
status = SnmpBerDecodeAsnStream( ASN_INTEGER, &pTemp, &nLength,
&pResult );
if ( status == SNMPAPI_ERROR )
{
printf ( " Short buffer test - length 1: Error: %d\n", GetLastError() );
}
else
{
printf( " Short buffer test succeeded, shouldn't have: %lu\n",
pResult.asnValue.number );
}
// Buffer too short - length 2
pBuffer[0] = ASN_INTEGER;
pBuffer[1] = 1;
pBuffer[2] = 0xff;
nLength = 2;
pTemp = pBuffer;
status = SnmpBerDecodeAsnStream( ASN_INTEGER, &pTemp, &nLength,
&pResult );
if ( status == SNMPAPI_ERROR )
{
printf ( " Short buffer test - length 2: Error: %d\n", GetLastError() );
}
else
{
printf( " Short buffer test succeeded, shouldn't have: %lu\n",
pResult.asnValue.number );
}
// Invalid tag - tags don't match
pBuffer[0] = ASN_OCTETSTRING;
pBuffer[1] = 0x01;
pBuffer[2] = 0xff;
nLength = 3;
pTemp = pBuffer;
status = SnmpBerDecodeAsnStream( ASN_INTEGER, &pTemp, &nLength,
&pResult );
if ( status == SNMPAPI_ERROR )
{
printf ( " Invalid tag test - Don't match: Error: %d\n", GetLastError() );
}
else
{
printf( " Invalid tag test succeeded, shouldn't have: %lu\n",
pResult.asnValue.number );
}
// long tag - we don't support tags requiring more than 1 octet
pBuffer[0] = ASN_INTEGER | 0x1f;
pBuffer[2] = 0x01;
pBuffer[1] = 1;
pBuffer[3] = 0xff;
nLength = 4;
pTemp = pBuffer;
status = SnmpBerDecodeAsnStream( ASN_INTEGER|0x1f, &pTemp, &nLength,
&pResult );
if ( status == SNMPAPI_ERROR )
{
printf ( " Invalid tag test - Extended tag: Error: %d\n", GetLastError() );
}
else
{
printf( " Invalid tag test succeeded, shouldn't have: %lu\n",
pResult.asnValue.number );
}
// Max Buffer length test
pBuffer[0] = ASN_OCTETSTRING;
pBuffer[1] = 0x82;
pBuffer[2] = 0xff;
pBuffer[3] = 0xfb;
nLength = 0xffff;
pTemp = pBuffer;
status = SnmpBerDecodeAsnStream( ASN_OCTETSTRING, &pTemp, &nLength,
&pResult );
if ( status == SNMPAPI_ERROR )
{
printf ( " Max length buffer, should not fail: Error: %d\n",
GetLastError() );
}
else
{
printf( " Max length buffer succeeded, correct\n" );
}
//
// ASN Integer testing
//
printf( "\nInteger testing\n\n" );
printf( " Decode Integer -128: " );
pBuffer[0] = ASN_INTEGER;
pBuffer[1] = 1;
pBuffer[2] = 0x80;
nLength = 3;
pTemp = pBuffer;
status = SnmpBerDecodeAsnStream( ASN_INTEGER, &pTemp, &nLength,
&pResult );
if ( status == SNMPAPI_ERROR )
{
printf ( "Error = %d\n", GetLastError() );
}
else
{
printf( "%ld\n", pResult.asnValue.number );
}
printf( " Decode Integer 128: " );
pBuffer[0] = ASN_INTEGER;
pBuffer[1] = 2;
pBuffer[2] = 0x00;
pBuffer[3] = 0x80;
nLength = 4;
pTemp = pBuffer;
status = SnmpBerDecodeAsnStream( ASN_INTEGER, &pTemp, &nLength,
&pResult );
if ( status == SNMPAPI_ERROR )
{
printf ( "Error = %d\n", GetLastError() );
}
else
{
printf( "%ld\n", pResult.asnValue.number );
}
printf( " Decode Integer -32,768: " );
pBuffer[0] = ASN_INTEGER;
pBuffer[1] = 2;
pBuffer[2] = 0x80;
pBuffer[3] = 0x00;
nLength = 4;
pTemp = pBuffer;
status = SnmpBerDecodeAsnStream( ASN_INTEGER, &pTemp, &nLength,
&pResult );
if ( status == SNMPAPI_ERROR )
{
printf ( "Error = %d\n", GetLastError() );
}
else
{
printf( "%ld\n", pResult.asnValue.number );
}
printf( " Decode Integer 32,768: " );
pBuffer[0] = ASN_INTEGER;
pBuffer[1] = 3;
pBuffer[2] = 0x00;
pBuffer[3] = 0x80;
pBuffer[4] = 0x00;
nLength = 5;
pTemp = pBuffer;
status = SnmpBerDecodeAsnStream( ASN_INTEGER, &pTemp, &nLength,
&pResult );
if ( status == SNMPAPI_ERROR )
{
printf ( "Error = %d\n", GetLastError() );
}
else
{
printf( "%ld\n", pResult.asnValue.number );
}
printf( " Decode Integer -8,388,608: " );
pBuffer[0] = ASN_INTEGER;
pBuffer[1] = 3;
pBuffer[2] = 0x80;
pBuffer[3] = 0x00;
pBuffer[4] = 0x00;
nLength = 5;
pTemp = pBuffer;
status = SnmpBerDecodeAsnStream( ASN_INTEGER, &pTemp, &nLength,
&pResult );
if ( status == SNMPAPI_ERROR )
{
printf ( "Error = %d\n", GetLastError() );
}
else
{
printf( "%ld\n", pResult.asnValue.number );
}
printf( " Decode Integer 8,388,608: " );
pBuffer[0] = ASN_INTEGER;
pBuffer[1] = 4;
pBuffer[2] = 0x00;
pBuffer[3] = 0x80;
pBuffer[4] = 0x00;
pBuffer[5] = 0x00;
nLength = 6;
pTemp = pBuffer;
status = SnmpBerDecodeAsnStream( ASN_INTEGER, &pTemp, &nLength,
&pResult );
if ( status == SNMPAPI_ERROR )
{
printf ( "Error = %d\n", GetLastError() );
}
else
{
printf( "%ld\n", pResult.asnValue.number );
}
printf( " Decode (Smallest) Integer -2,147,483,648: " );
pBuffer[0] = ASN_INTEGER;
pBuffer[1] = 4;
pBuffer[2] = 0x80;
pBuffer[3] = 0x00;
pBuffer[4] = 0x00;
pBuffer[5] = 0x00;
nLength = 6;
pTemp = pBuffer;
status = SnmpBerDecodeAsnStream( ASN_INTEGER, &pTemp, &nLength,
&pResult );
if ( status == SNMPAPI_ERROR )
{
printf ( "Error = %d\n", GetLastError() );
}
else
{
printf( "%ld\n", pResult.asnValue.number );
}
printf( " Decode (Largest) Integer 2,147,483,647: " );
pBuffer[0] = ASN_INTEGER;
pBuffer[1] = 4;
pBuffer[2] = 0x7f;
pBuffer[3] = 0xff;
pBuffer[4] = 0xff;
pBuffer[5] = 0xff;
nLength = 6;
pTemp = pBuffer;
status = SnmpBerDecodeAsnStream( ASN_INTEGER, &pTemp, &nLength,
&pResult );
if ( status == SNMPAPI_ERROR )
{
printf ( "Error = %d\n", GetLastError() );
}
else
{
printf( "%ld\n", pResult.asnValue.number );
}
printf( " Decode Integer 0: " );
pBuffer[0] = ASN_INTEGER;
pBuffer[1] = 1;
pBuffer[2] = 0x00;
nLength = 3;
pTemp = pBuffer;
status = SnmpBerDecodeAsnStream( ASN_INTEGER, &pTemp, &nLength,
&pResult );
if ( status == SNMPAPI_ERROR )
{
printf ( "Error = %d\n", GetLastError() );
}
else
{
printf( "%ld\n", pResult.asnValue.number );
}
printf( " Decode Integer -1: " );
pBuffer[0] = ASN_INTEGER;
pBuffer[1] = 4;
pBuffer[2] = 0xff;
pBuffer[3] = 0xff;
pBuffer[4] = 0xff;
pBuffer[5] = 0xff;
nLength = 6;
pTemp = pBuffer;
status = SnmpBerDecodeAsnStream( ASN_INTEGER, &pTemp, &nLength,
&pResult );
if ( status == SNMPAPI_ERROR )
{
printf ( "Error = %d\n", GetLastError() );
}
else
{
printf( "%ld\n", pResult.asnValue.number );
}
printf( " Decode (Counter) Integer 4,294,967,295: " );
pBuffer[0] = ASN_RFC1155_COUNTER;
pBuffer[1] = 5;
pBuffer[2] = 0x00;
pBuffer[3] = 0xff;
pBuffer[4] = 0xff;
pBuffer[5] = 0xff;
pBuffer[6] = 0xff;
nLength = 7;
pTemp = pBuffer;
status = SnmpBerDecodeAsnStream( ASN_RFC1155_COUNTER, &pTemp, &nLength,
&pResult );
if ( status == SNMPAPI_ERROR )
{
printf ( "Error = %d\n", GetLastError() );
}
else
{
printf( "%lu\n", pResult.asnValue.number );
}
printf( " Decode (Too large) 4,294,967,296: " );
pBuffer[0] = ASN_INTEGER;
pBuffer[1] = 5;
pBuffer[2] = 0x01;
pBuffer[3] = 0x00;
pBuffer[4] = 0x00;
pBuffer[5] = 0x00;
pBuffer[6] = 0x00;
nLength = 7;
pTemp = pBuffer;
status = SnmpBerDecodeAsnStream( ASN_INTEGER, &pTemp, &nLength,
&pResult );
if ( status == SNMPAPI_ERROR )
{
printf ( "Error = %d\n", GetLastError() );
}
else
{
printf( "%ld\n", pResult.asnValue.number );
}
printf( " Encode -128: " );
{
BYTE *pOut = NULL;
UINT nLength = 0;
AsnInteger Number = 0xffffff80;
status = SnmpBerEncodeAsnInteger( ASN_INTEGER, Number, &pOut, &nLength );
if ( status == SNMPAPI_ERROR )
{
printf ( "Error = %d\n", GetLastError() );
}
else
{
SnmpSvcBufRevInPlace( pOut, nLength );
pTemp = pOut;
status = SnmpBerDecodeAsnStream( ASN_INTEGER, &pTemp, &nLength,
&pResult );
printf( "%ld\n", pResult.asnValue.number );
}
SnmpUtilMemFree( pOut );
}
printf( " Encode 128: " );
{
BYTE *pOut = NULL;
UINT nLength = 0;
AsnInteger Number = 0x00000080;
status = SnmpBerEncodeAsnInteger( ASN_INTEGER, Number, &pOut, &nLength );
if ( status == SNMPAPI_ERROR )
{
printf ( "Error = %d\n", GetLastError() );
}
else
{
SnmpSvcBufRevInPlace( pOut, nLength );
pTemp = pOut;
status = SnmpBerDecodeAsnStream( ASN_INTEGER, &pTemp, &nLength,
&pResult );
printf( "%ld\n", pResult.asnValue.number );
}
SnmpUtilMemFree( pOut );
}
printf( " Encode -32,768: " );
{
BYTE *pOut = NULL;
UINT nLength = 0;
AsnInteger Number = 0xffff8000;
status = SnmpBerEncodeAsnInteger( ASN_INTEGER, Number, &pOut, &nLength );
if ( status == SNMPAPI_ERROR )
{
printf ( "Error = %d\n", GetLastError() );
}
else
{
SnmpSvcBufRevInPlace( pOut, nLength );
pTemp = pOut;
status = SnmpBerDecodeAsnStream( ASN_INTEGER, &pTemp, &nLength,
&pResult );
printf( "%ld\n", pResult.asnValue.number );
}
SnmpUtilMemFree( pOut );
}
printf( " Encode 32,768: " );
{
BYTE *pOut = NULL;
UINT nLength = 0;
AsnInteger Number = 0x00008000;
status = SnmpBerEncodeAsnInteger( ASN_INTEGER, Number, &pOut, &nLength );
if ( status == SNMPAPI_ERROR )
{
printf ( "Error = %d\n", GetLastError() );
}
else
{
SnmpSvcBufRevInPlace( pOut, nLength );
pTemp = pOut;
status = SnmpBerDecodeAsnStream( ASN_INTEGER, &pTemp, &nLength,
&pResult );
printf( "%ld\n", pResult.asnValue.number );
}
SnmpUtilMemFree( pOut );
}
printf( " Encode -8,388,608: " );
{
BYTE *pOut = NULL;
UINT nLength = 0;
AsnInteger Number = 0xff800000;
status = SnmpBerEncodeAsnInteger( ASN_INTEGER, Number, &pOut, &nLength );
if ( status == SNMPAPI_ERROR )
{
printf ( "Error = %d\n", GetLastError() );
}
else
{
SnmpSvcBufRevInPlace( pOut, nLength );
pTemp = pOut;
status = SnmpBerDecodeAsnStream( ASN_INTEGER, &pTemp, &nLength,
&pResult );
printf( "%ld\n", pResult.asnValue.number );
}
SnmpUtilMemFree( pOut );
}
printf( " Encode 8,388,608: " );
{
BYTE *pOut = NULL;
UINT nLength = 0;
AsnInteger Number = 0x00800000;
status = SnmpBerEncodeAsnInteger( ASN_INTEGER, Number, &pOut, &nLength );
if ( status == SNMPAPI_ERROR )
{
printf ( "Error = %d\n", GetLastError() );
}
else
{
SnmpSvcBufRevInPlace( pOut, nLength );
pTemp = pOut;
status = SnmpBerDecodeAsnStream( ASN_INTEGER, &pTemp, &nLength,
&pResult );
printf( "%ld\n", pResult.asnValue.number );
}
SnmpUtilMemFree( pOut );
}
printf( " Encode (Smallest) -2,147,483,648: " );
{
BYTE *pOut = NULL;
UINT nLength = 0;
AsnInteger Number = 0x80000000;
status = SnmpBerEncodeAsnInteger( ASN_INTEGER, Number, &pOut, &nLength );
if ( status == SNMPAPI_ERROR )
{
printf ( "Error = %d\n", GetLastError() );
}
else
{
SnmpSvcBufRevInPlace( pOut, nLength );
pTemp = pOut;
status = SnmpBerDecodeAsnStream( ASN_INTEGER, &pTemp, &nLength,
&pResult );
printf( "%ld\n", pResult.asnValue.number );
}
SnmpUtilMemFree( pOut );
}
printf( " Encode (Largest) 2,147,483,647: " );
{
BYTE *pOut = NULL;
UINT nLength = 0;
AsnInteger Number = 0x7fffffff;
status = SnmpBerEncodeAsnInteger( ASN_INTEGER, Number, &pOut, &nLength );
if ( status == SNMPAPI_ERROR )
{
printf ( "Error = %d\n", GetLastError() );
}
else
{
SnmpSvcBufRevInPlace( pOut, nLength );
pTemp = pOut;
status = SnmpBerDecodeAsnStream( ASN_INTEGER, &pTemp, &nLength,
&pResult );
printf( "%ld\n", pResult.asnValue.number );
}
SnmpUtilMemFree( pOut );
}
printf( " Encode 0: " );
{
BYTE *pOut = NULL;
UINT nLength = 0;
AsnInteger Number = 0;
status = SnmpBerEncodeAsnInteger( ASN_INTEGER, Number, &pOut, &nLength );
if ( status == SNMPAPI_ERROR )
{
printf ( "Error = %d\n", GetLastError() );
}
else
{
SnmpSvcBufRevInPlace( pOut, nLength );
pTemp = pOut;
status = SnmpBerDecodeAsnStream( ASN_INTEGER, &pTemp, &nLength,
&pResult );
printf( "%ld\n", pResult.asnValue.number );
}
SnmpUtilMemFree( pOut );
}
printf( " Encode -1: " );
{
BYTE *pOut = NULL;
UINT nLength = 0;
AsnInteger Number = -1;
status = SnmpBerEncodeAsnInteger( ASN_INTEGER, Number, &pOut, &nLength );
if ( status == SNMPAPI_ERROR )
{
printf ( "Error = %d\n", GetLastError() );
}
else
{
SnmpSvcBufRevInPlace( pOut, nLength );
pTemp = pOut;
status = SnmpBerDecodeAsnStream( ASN_INTEGER, &pTemp, &nLength,
&pResult );
printf( "%ld\n", pResult.asnValue.number );
}
SnmpUtilMemFree( pOut );
}
printf( " Encode (Counter) 4,294,967,295: " );
{
BYTE *pOut = NULL;
UINT nLength = 0;
ULONG Number = 4294967295;
status = SnmpBerEncodeAsnInteger( ASN_RFC1155_COUNTER, Number,
&pOut, &nLength );
if ( status == SNMPAPI_ERROR )
{
printf ( "Error = %d\n", GetLastError() );
}
else
{
SnmpSvcBufRevInPlace( pOut, nLength );
pTemp = pOut;
status = SnmpBerDecodeAsnStream( ASN_INTEGER, &pTemp, &nLength,
&pResult );
printf( "%lu\n", pResult.asnValue.number );
}
SnmpUtilMemFree( pOut );
}
//
// Octet string testing
//
printf( "\nOctet String Testing\n\n" );
// Test NULL string
pBuffer[0] = ASN_OCTETSTRING;
pBuffer[1] = 0;
nLength = 2;
pTemp = pBuffer;
status = SnmpBerDecodeAsnStream( ASN_OCTETSTRING, &pTemp, &nLength,
&pResult );
if ( status == SNMPAPI_ERROR )
{
printf ( " NULL string Test shouldn't fail: Error: %d\n",
GetLastError() );
}
else
{
printf( " NULL string test successful\n" );
}
//
// NULL testing
//
printf( "\nNULL testing\n\n" );
// Test invalid length
pBuffer[0] = ASN_NULL;
pBuffer[1] = 1;
nLength = 3;
pTemp = pBuffer;
status = SnmpBerDecodeAsnStream( ASN_NULL, &pTemp, &nLength,
&pResult );
if ( status == SNMPAPI_ERROR )
{
printf ( " NULL Test for invalid length: Error: %d\n",
GetLastError() );
}
else
{
printf( " NULL test successful, shouldn't be\n" );
}
//
// Object Identifier testing
//
printf( "\nObject Identifier Testing\n\n" );
printf( " Decoding tests --\n\n" );
// Test invalid length - Obj ID too short
pBuffer[0] = ASN_OBJECTIDENTIFIER;
pBuffer[1] = 0;
nLength = 2;
pTemp = pBuffer;
status = SnmpBerDecodeAsnStream( ASN_OBJECTIDENTIFIER, &pTemp, &nLength,
&pResult );
if ( status == SNMPAPI_ERROR )
{
printf ( " Object ID too short Test: Error: %d\n",
GetLastError() );
}
else
{
printf( " Object ID too short test successful, shouldn't be\n" );
}
// Test invalid length - Obj ID too long
pBuffer[0] = ASN_OBJECTIDENTIFIER;
pBuffer[1] = 0x82;
pBuffer[2] = 0x7f;
pBuffer[3] = 0x00;
pBuffer[4] = 41;
memset( &pBuffer[5], 1, 0x7efe );
nLength = 0x7f04;
pTemp = pBuffer;
status = SnmpBerDecodeAsnStream( ASN_OBJECTIDENTIFIER, &pTemp, &nLength,
&pResult );
if ( status == SNMPAPI_ERROR )
{
printf ( " Object ID length Overflow Test: Error: %d\n",
GetLastError() );
}
else
{
printf( " Object ID length overflow test successful, shouldn't be\n" );
}
// Test invalid first element
pBuffer[0] = ASN_OBJECTIDENTIFIER;
pBuffer[1] = 3;
pBuffer[2] = 123;
pBuffer[3] = 2;
pBuffer[4] = 3;
nLength = 5;
pTemp = pBuffer;
status = SnmpBerDecodeAsnStream( ASN_OBJECTIDENTIFIER, &pTemp, &nLength,
&pResult );
if ( status == SNMPAPI_ERROR )
{
printf ( " Object ID 1st element too large: Error: %d\n",
GetLastError() );
}
else
{
printf( " Object ID 1st element too large, successful, shouldn't be\n" );
}
// Test overflow condition on elements
pBuffer[0] = ASN_OBJECTIDENTIFIER;
pBuffer[1] = 4;
pBuffer[2] = 0x00;
pBuffer[3] = 0x81;
pBuffer[4] = 0x82;
pBuffer[5] = 0x83;
nLength = 6;
pTemp = pBuffer;
status = SnmpBerDecodeAsnStream( ASN_OBJECTIDENTIFIER, &pTemp, &nLength,
&pResult );
if ( status == SNMPAPI_ERROR )
{
printf ( " Object ID element OverFlow: Error: %d\n",
GetLastError() );
}
else
{
printf( " Object ID element OverFlow, successful, shouldn't be\n" );
}
// Test shortest length
pBuffer[0] = ASN_OBJECTIDENTIFIER;
pBuffer[1] = 1;
pBuffer[2] = 40;
nLength = 3;
pTemp = pBuffer;
status = SnmpBerDecodeAsnStream( ASN_OBJECTIDENTIFIER, &pTemp, &nLength,
&pResult );
if ( status == SNMPAPI_ERROR )
{
printf ( " Object ID short Test, shouldn't be here: Error: %d\n",
GetLastError() );
}
else
{
printf( " Object ID shortest length test successful\n" );
}
// Test maximum length
pBuffer[0] = ASN_OBJECTIDENTIFIER;
pBuffer[1] = 0x82;
pBuffer[2] = 0x7e;
pBuffer[3] = 0xff;
pBuffer[4] = 41;
memset( &pBuffer[5], 1, 0x7efd );
nLength = 0x7f03;
pTemp = pBuffer;
status = SnmpBerDecodeAsnStream( ASN_OBJECTIDENTIFIER, &pTemp, &nLength,
&pResult );
if ( status == SNMPAPI_ERROR )
{
printf ( " Object maximum length Test, shouldn't be here: Error: %d\n",
GetLastError() );
}
else
{
printf( " Object ID maximum length test successful\n" );
}
printf( "\n Encoding tests --\n\n" );
// Test encoding of invalid 1st element
pResult.asnValue.object.idLength = 2;
pResult.asnValue.object.ids = SnmpUtilMemAlloc( sizeof(UINT) );
pResult.asnValue.object.ids[0] = 3;
status = SnmpBerEncodeAsnObjectId( ASN_OBJECTIDENTIFIER,
&pResult.asnValue.object, &pOutBuf, &nOutLen );
if ( status == SNMPAPI_ERROR )
{
printf ( " 1st element too large: Error: %d\n",
GetLastError() );
SnmpUtilMemFree( pOutBuf );
pOutBuf = NULL;
nOutLen = 0;
}
else
{
printf( " 1st element too large, successful, shouldn't be\n" );
}
// Test encoding of invalid 2nd element
pResult.asnValue.object.idLength = 2;
pResult.asnValue.object.ids[0] = 0;
pResult.asnValue.object.ids[1] = 40;
status = SnmpBerEncodeAsnObjectId( ASN_OBJECTIDENTIFIER,
&pResult.asnValue.object, &pOutBuf, &nOutLen );
if ( status == SNMPAPI_ERROR )
{
printf ( " 2nd element too large: Error: %d\n",
GetLastError() );
SnmpUtilMemFree( pOutBuf );
pOutBuf = NULL;
nOutLen = 0;
}
else
{
printf( " 2nd element too large, successful, shouldn't be\n" );
}
// Test encoding with idLength of 1
pResult.asnValue.object.idLength = 1;
pResult.asnValue.object.ids[0] = 0;
pResult.asnValue.object.ids[1] = 0;
status = SnmpBerEncodeAsnObjectId( ASN_OBJECTIDENTIFIER,
&pResult.asnValue.object, &pOutBuf,
&nOutLen );
if ( status == SNMPAPI_ERROR )
{
printf( " idLength == 1 failed. Error: %d\n",
GetLastError() );
SnmpUtilMemFree ( pOutBuf );
pOutBuf = NULL;
nOutLen = 0;
}
else
{
printf(" idLength == 1 succeeded.\n");
}
//
// Sequence Testing
//
printf( "\nSequence Testing\n\n" );
// Null sequence test
pBuffer[0] = ASN_SEQUENCE;
pBuffer[1] = 0;
nLength = 65;
pTemp = pBuffer;
status = SnmpBerDecodeAsnStream( ASN_SEQUENCE, &pTemp, &nLength,
&pResult );
if ( status == SNMPAPI_ERROR )
{
printf ( " NULL sequence Test shouldn't fail: Error: %d\n",
GetLastError() );
}
else
{
printf( " NULL sequence test successful\n" );
}
//
// General testing
//
printf( "\nGeneral Testing\n\n" );
// Set first type - Integer
pBuffer[0] = ASN_INTEGER;
pBuffer[1] = 3;
pBuffer[2] = 0x0f;
pBuffer[3] = 0x42;
pBuffer[4] = 0x40;
// Set second type - Octet String
pBuffer[5] = ASN_OCTETSTRING;
pBuffer[6] = 0x82;
pBuffer[7] = 0x01;
pBuffer[8] = 0x40;
strcpy( &pBuffer[9], "adfasdfasdfasdfasdfaasdfasdfasdfasdfasdfadfadfadsfadfadfadsfasdfadsfasdfasdfasdfadfasdfasdfasdfasdfaasdfasdfasdfasdfasdfadfadfadsfadfadfadsfasdfadsfasdfasdfasdfadfasdfasdfasdfasdfaasdfasdfasdfasdfasdfadfadfadsfadfadfadsfasdfadsfasdfasdfasdfadfasdfasdfasdfasdfaasdfasdfasdfasdfasdfadfadfadsfadfadfadsfasdfadsfasdfasdfasdf" );
// Set third type - NULL
pBuffer[329] = ASN_NULL;
pBuffer[330] = 0;
// Set fourth type - Object Identifier
pBuffer[331] = ASN_OBJECTIDENTIFIER;
pBuffer[332] = 5;
pBuffer[333] = 0x28;
pBuffer[334] = 0xc2;
pBuffer[335] = 0x7a;
pBuffer[336] = 0x05;
pBuffer[337] = 0x01;
// Set fifth type - Sequence
pBuffer[338] = ASN_RFC1157_SETREQUEST;
pBuffer[339] = 12;
pBuffer[340] = ASN_OBJECTIDENTIFIER;
pBuffer[341] = 5;
pBuffer[342] = 0x28;
pBuffer[343] = 0xc2;
pBuffer[344] = 0x7a;
pBuffer[345] = 0x05;
pBuffer[346] = 0x01;
pBuffer[347] = ASN_INTEGER;
pBuffer[348] = 3;
pBuffer[349] = 0x0f;
pBuffer[350] = 0x42;
pBuffer[351] = 0x40;
// Set length of buffer
nLength = 352;
// Set temporary variable
pTemp = pBuffer;
// Init output buffer
pOutBuf = NULL;
nOutLen = 0;
// Expected type - Integer
status = SnmpBerDecodeAsnStream(ASN_INTEGER, &pTemp, &nLength,
&pResult);
if ( status == SNMPAPI_ERROR )
{
printf( " Error\n" );
}
status = SnmpBerEncodeAsnInteger( ASN_INTEGER, pResult.asnValue.number, &pOutBuf, &nOutLen );
if ( status == SNMPAPI_ERROR )
{
printf( " Error\n" );
}
status = _msize( pOutBuf );
// Expected type - Octet String
status = SnmpBerDecodeAsnStream(ASN_OCTETSTRING, &pTemp, &nLength,
&pResult);
if ( status == SNMPAPI_ERROR )
{
printf( " Error\n" );
}
status = SnmpBerEncodeAsnOctetStr( ASN_OCTETSTRING,
&pResult.asnValue.string, &pOutBuf, &nOutLen );
if ( status == SNMPAPI_ERROR )
{
printf( " Error\n" );
}
status = _msize( pOutBuf );
// Expected type - NULL
status = SnmpBerDecodeAsnStream(ASN_NULL, &pTemp, &nLength,
&pResult);
if ( status == SNMPAPI_ERROR )
{
printf( " Error\n" );
}
status = SnmpBerEncodeAsnNull( ASN_NULL, &pOutBuf, &nOutLen );
if ( status == SNMPAPI_ERROR )
{
printf( " Error\n" );
}
status = _msize( pOutBuf );
// Expected type - Object Identifier
status = SnmpBerDecodeAsnStream(ASN_OBJECTIDENTIFIER, &pTemp, &nLength,
&pResult);
if ( status == SNMPAPI_ERROR )
{
printf( " Error\n" );
}
status = SnmpBerEncodeAsnObjectId( ASN_OBJECTIDENTIFIER, &pResult.asnValue.object, &pOutBuf, &nOutLen );
if ( status == SNMPAPI_ERROR )
{
printf( " Error\n" );
}
status = _msize( pOutBuf );
// Expected type - Sequence
status = SnmpBerDecodeAsnStream(ASN_RFC1157_SETREQUEST, &pTemp, &nLength,
&pResult);
if ( status == SNMPAPI_ERROR )
{
printf( " Error\n" );
}
{
char *BufPtr;
UINT BufLen;
AsnObjectIdentifier ObjectId;
AsnInteger nInt;
UINT nSeqLen;
BufPtr = pResult.asnValue.sequence.stream;
BufLen = nSeqLen = pResult.asnValue.sequence.length;
// Expected type - ObjectId
status = SnmpBerDecodeAsnStream(ASN_OBJECTIDENTIFIER, &BufPtr, &BufLen,
&pResult);
if ( status == SNMPAPI_ERROR )
{
printf( " Error\n" );
}
// Save object id
ObjectId = pResult.asnValue.object;
// Expected type - Integer
status = SnmpBerDecodeAsnStream(ASN_INTEGER, &BufPtr, &BufLen,
&pResult);
if ( status == SNMPAPI_ERROR )
{
printf( " Error\n" );
}
// Save integer
nInt = pResult.asnValue.number;
status = SnmpBerEncodeAsnInteger( ASN_INTEGER, nInt, &pOutBuf, &nOutLen );
if ( status == SNMPAPI_ERROR )
{
printf( " Error\n" );
}
status = SnmpBerEncodeAsnObjectId( ASN_OBJECTIDENTIFIER, &ObjectId, &pOutBuf, &nOutLen );
if ( status == SNMPAPI_ERROR )
{
printf( " Error\n" );
}
status = SnmpBerEncodeAsnSequence( nSeqLen, &pOutBuf, &nOutLen );
if ( status == SNMPAPI_ERROR )
{
printf( " Error\n" );
}
}
status = _msize( pOutBuf );
SnmpUtilMemFree( pOutBuf );
return 0;
} // main
//-------------------------------- END --------------------------------------