www.pudn.com > snmp.rar > bertest.c


/*++ 
 
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 ---- 
 
#include  
#include  
#include  
 
//--------------------------- MODULE DEPENDENCIES -- #include"xxxxx.h" ------ 
 
#include  
#include  
 
#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 --------------------------------------