mirror of https://github.com/lianthony/NT4.0
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.
290 lines
7.2 KiB
290 lines
7.2 KiB
/*++
|
|
|
|
Copyright (c) 1992-1996 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
auth1157.c
|
|
|
|
Abstract:
|
|
|
|
Decode/Encode RFC 1157 Messages.
|
|
|
|
Environment:
|
|
|
|
User Mode - Win32
|
|
|
|
Revision History:
|
|
|
|
10-May-1996 DonRyan
|
|
Removed banner from Technology Dynamics, Inc.
|
|
|
|
--*/
|
|
|
|
//--------------------------- WINDOWS DEPENDENCIES --------------------------
|
|
|
|
//--------------------------- STANDARD DEPENDENCIES -- #include<xxxxx.h> ----
|
|
|
|
//--------------------------- MODULE DEPENDENCIES -- #include"xxxxx.h" ------
|
|
|
|
#include <snmp.h>
|
|
#include <snmputil.h>
|
|
|
|
#include "berapi.h"
|
|
#include "pduapi.h"
|
|
|
|
//--------------------------- SELF-DEPENDENCY -- ONE #include"module.h" -----
|
|
|
|
#include "auth1157.h"
|
|
|
|
//--------------------------- PUBLIC VARIABLES --(same as in module.h file)--
|
|
|
|
//--------------------------- PRIVATE CONSTANTS -----------------------------
|
|
|
|
//--------------------------- PRIVATE STRUCTS -------------------------------
|
|
|
|
//--------------------------- PRIVATE VARIABLES -----------------------------
|
|
|
|
//--------------------------- PRIVATE PROTOTYPES ----------------------------
|
|
|
|
BOOL commauth(RFC1157Message *message);
|
|
|
|
//--------------------------- PRIVATE PROCEDURES ----------------------------
|
|
|
|
//--------------------------- PUBLIC PROCEDURES -----------------------------
|
|
|
|
//
|
|
// SnmpEncodeRFC1157Message:
|
|
// Encodes an RFC 1157 type message or trap.
|
|
//
|
|
// Notes:
|
|
// Buffer information must be initialized prior to calling this routine.
|
|
//
|
|
// Return Codes:
|
|
// SNMPAPI_NOERROR
|
|
// SNMPAPI_ERROR
|
|
//
|
|
// Error Codes:
|
|
// None.
|
|
//
|
|
SNMPAPI SnmpEncodeRFC1157Message(
|
|
IN RFC1157Message *message, // Message to encode into stream
|
|
IN OUT BYTE **pBuffer, // Buffer to accept encoded message
|
|
IN OUT UINT *nLength // Length of buffer
|
|
)
|
|
|
|
{
|
|
SNMPAPI nResult;
|
|
|
|
|
|
// Encode PDU/TRAP
|
|
if ( SNMPAPI_ERROR ==
|
|
(nResult = SnmpPduEncodeAnyPdu(&message->data, pBuffer, nLength)) )
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// Encode Community
|
|
if ( SNMPAPI_ERROR ==
|
|
(nResult = SnmpBerEncodeAsnOctetStr(ASN_OCTETSTRING,
|
|
&message->community,
|
|
pBuffer, nLength)) )
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// Encode version
|
|
if ( SNMPAPI_ERROR ==
|
|
(nResult = SnmpBerEncodeAsnInteger(ASN_INTEGER,
|
|
message->version,
|
|
pBuffer, nLength)) )
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// Encode the entire RFC 1157 Message as a sequence
|
|
if ( SNMPAPI_ERROR ==
|
|
(nResult = SnmpBerEncodeAsnSequence(*nLength, pBuffer, nLength)) )
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// Reverse the buffer
|
|
SnmpSvcBufRevInPlace( *pBuffer, *nLength );
|
|
|
|
Exit:
|
|
// If an error occurs, the memory is freed by a lower level encoding routine.
|
|
|
|
return nResult;
|
|
} // SnmpEncodeRFC1157Message
|
|
|
|
|
|
|
|
//
|
|
// SnmpDecodeRFC1157Message:
|
|
// Decodes an RFC 1157 type message or trap.
|
|
//
|
|
// Notes:
|
|
// Buffer information must be initialized prior to calling this routine.
|
|
//
|
|
// If the version is invalid, no other information is decoded.
|
|
//
|
|
// Return Codes:
|
|
// SNMPAPI_NOERROR
|
|
// SNMPAPI_ERROR
|
|
//
|
|
// Error Codes:
|
|
// SNMP_AUTHAPI_INVALID_VERSION
|
|
//
|
|
SNMPAPI SnmpDecodeRFC1157Message( OUT RFC1157Message *message,
|
|
IN BYTE *pBuffer,
|
|
IN UINT nLength )
|
|
|
|
{
|
|
AsnAny result;
|
|
BYTE *BufPtr;
|
|
UINT BufLen;
|
|
SNMPAPI nResult;
|
|
|
|
|
|
// Decode RFC 1157 Message Sequence
|
|
if ( SNMPAPI_ERROR ==
|
|
(nResult = SnmpBerDecodeAsnStream(ASN_SEQUENCE, &pBuffer,
|
|
&nLength, &result)) )
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// Make copy of buffer information in the sequence
|
|
BufPtr = result.asnValue.sequence.stream;
|
|
BufLen = result.asnValue.sequence.length;
|
|
|
|
// Decode version
|
|
if ( SNMPAPI_ERROR ==
|
|
(nResult = SnmpBerDecodeAsnStream(ASN_INTEGER, &BufPtr,
|
|
&BufLen, &result)) )
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// Version must be 0
|
|
if ( (message->version = result.asnValue.number) != 0 )
|
|
{
|
|
SetLastError( SNMP_AUTHAPI_INVALID_VERSION );
|
|
|
|
nResult = SNMPAPI_ERROR;
|
|
goto Exit;
|
|
}
|
|
|
|
// Decode community
|
|
if ( SNMPAPI_ERROR ==
|
|
(nResult = SnmpBerDecodeAsnStream(ASN_OCTETSTRING, &BufPtr,
|
|
&BufLen, &result)) )
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// Non standard assignment - MS C specific
|
|
// This leaves the pointer to the stream pointing into pBuffer.
|
|
// Take caution not to destroy pBuffer until done with stream.
|
|
message->community = result.asnValue.string;
|
|
|
|
// Decode the PDU type
|
|
nResult = SnmpPduDecodeAnyPdu( &message->data, &BufPtr, &BufLen );
|
|
|
|
Exit:
|
|
// If an error occurs, the memory is freed by a lower level decoding routine.
|
|
|
|
return nResult;
|
|
} // SnmpDecodeRFC1157Message
|
|
|
|
|
|
|
|
//
|
|
// SnmpRFC1157MessageToMgmtCom
|
|
// Converts a RFC 1157 type message to a Management Com type message.
|
|
//
|
|
// Notes:
|
|
//
|
|
// Return Codes:
|
|
// SNMPAPI_NOERROR
|
|
// SNMPAPI_ERROR
|
|
//
|
|
// Error Codes:
|
|
// None.
|
|
//
|
|
SNMPAPI SnmpRFC1157MessageToMgmtCom(
|
|
IN RFC1157Message *message, // RFC 1157 Message to convert
|
|
OUT SnmpMgmtCom *snmpMgmtCom, // Resulting Management Com format
|
|
IN BOOL fAuthMsg // whether to perform optional authentication
|
|
)
|
|
|
|
{
|
|
#if 0 /* future security functionality */
|
|
// interact with snmp party mib to look for community as a private
|
|
// auth key of a party to identify the parties
|
|
#else
|
|
// This is a temporary operation. In the future, the message community
|
|
// will be looked up to determine its assigned parties.
|
|
snmpMgmtCom->dstParty.idLength = 0;
|
|
snmpMgmtCom->dstParty.ids = NULL;
|
|
snmpMgmtCom->srcParty.idLength = 0;
|
|
snmpMgmtCom->srcParty.ids = NULL;
|
|
|
|
// This is a temp. action that will be replaced in the future
|
|
// In addition, this is a non-standard copy.
|
|
snmpMgmtCom->community = message->community;
|
|
|
|
if (fAuthMsg && !commauth(message))
|
|
{
|
|
SetLastError( SNMP_AUTHAPI_TRIV_AUTH_FAILED );
|
|
|
|
return SNMPAPI_ERROR;
|
|
}
|
|
#endif
|
|
|
|
// This is a non-standard copy of a structure
|
|
snmpMgmtCom->pdu = message->data;
|
|
|
|
// Exit:
|
|
return SNMPAPI_NOERROR;
|
|
} // SnmpRFC1157MessageToMgmtCom
|
|
|
|
|
|
|
|
//
|
|
// SnmpMgmtComToRFC1157Message
|
|
// Converts a Management Com type message to a RFC 1157 type message.
|
|
//
|
|
// Notes:
|
|
//
|
|
// Return Codes:
|
|
// SNMPAPI_NOERROR
|
|
// SNMPAPI_ERROR
|
|
//
|
|
// Error Codes:
|
|
// None.
|
|
//
|
|
SNMPAPI SnmpMgmtComToRFC1157Message(
|
|
OUT RFC1157Message *message, // Resulting 1157 format
|
|
IN SnmpMgmtCom *snmpMgmtCom // Management Com message to convert
|
|
)
|
|
|
|
{
|
|
// This is a temporary operation. In the future, the message community
|
|
// will be looked up to determine its assigned parties.
|
|
message->version = 0;
|
|
|
|
// This is a temp. action that will be replaced in the future
|
|
// In addition, this is a non-standard copy.
|
|
message->community = snmpMgmtCom->community;
|
|
|
|
// This is a non-standard copy of a structure
|
|
message->data = snmpMgmtCom->pdu;
|
|
|
|
// Exit:
|
|
return SNMPAPI_NOERROR;
|
|
} // SnmpMgmtComToRFC1157Message
|
|
|
|
//-------------------------------- END --------------------------------------
|
|
|