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