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.
483 lines
11 KiB
483 lines
11 KiB
/*++
|
|
|
|
Copyright (c) 1992-1996 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
authXXXX.c
|
|
|
|
Abstract:
|
|
|
|
Decode/Encode RFC XXXX SnmpPrivMsg, SnmpAuthMsg, and SnmpMgmtCom.
|
|
|
|
Environment:
|
|
|
|
User Mode - Win32
|
|
|
|
Revision History:
|
|
|
|
10-May-1996 DonRyan
|
|
Removed banner from Technology Dynamics, Inc.
|
|
|
|
--*/
|
|
|
|
//--------------------------- WINDOWS DEPENDENCIES --------------------------
|
|
|
|
//--------------------------- STANDARD DEPENDENCIES -- #include<xxxxx.h> ----
|
|
|
|
#include <stdlib.h>
|
|
|
|
//--------------------------- MODULE DEPENDENCIES -- #include"xxxxx.h" ------
|
|
|
|
#include <snmp.h>
|
|
#include <snmputil.h>
|
|
|
|
#include "berapi.h"
|
|
#include "pduapi.h"
|
|
#include "authapi.h"
|
|
|
|
//--------------------------- SELF-DEPENDENCY -- ONE #include"module.h" -----
|
|
|
|
#include "authxxxx.h"
|
|
|
|
//--------------------------- PUBLIC VARIABLES --(same as in module.h file)--
|
|
|
|
//--------------------------- PRIVATE CONSTANTS -----------------------------
|
|
|
|
//--------------------------- PRIVATE STRUCTS -------------------------------
|
|
|
|
//--------------------------- PRIVATE VARIABLES -----------------------------
|
|
|
|
//--------------------------- PRIVATE PROTOTYPES ----------------------------
|
|
|
|
//--------------------------- PRIVATE PROCEDURES ----------------------------
|
|
|
|
//--------------------------- PUBLIC PROCEDURES -----------------------------
|
|
|
|
//
|
|
// SnmpEncodePrivMsg
|
|
// Create the private message header.
|
|
//
|
|
// Notes:
|
|
// The buffer information must be initialized prior to calling this routine.
|
|
//
|
|
// If an error occurs, the buffer is freed and set to NULL.
|
|
//
|
|
// Return Codes:
|
|
// SNMPAPI_NOERROR
|
|
// SNMPAPI_ERROR
|
|
//
|
|
// Error Codes:
|
|
// SNMP_MEM_ALLOC_ERROR
|
|
//
|
|
SNMPAPI SnmpEncodePrivMsg(
|
|
IN AsnObjectIdentifier *DestParty, // Destination party
|
|
IN OUT BYTE **pBuffer, // Buffer to accept encoding
|
|
IN OUT UINT *nLength // Length of buffer
|
|
)
|
|
|
|
{
|
|
AsnOctetString String;
|
|
int nResult;
|
|
|
|
|
|
// Allocate memory for temp buffer
|
|
if ( NULL == (String.stream = SnmpUtilMemAlloc((sizeof(BYTE) * *nLength))) )
|
|
{
|
|
SetLastError( SNMP_MEM_ALLOC_ERROR );
|
|
|
|
goto Exit;
|
|
}
|
|
|
|
//
|
|
// To avoid this copying, the buffer could be made into a string from
|
|
// within this routine, just for this special case.
|
|
//
|
|
|
|
// Reverse buffer and make copy because string encode will reverse it
|
|
// as it gets copied back into the buffer.
|
|
SnmpSvcBufRevAndCpy( String.stream, *pBuffer, *nLength );
|
|
String.length = *nLength;
|
|
|
|
// Fool encode octet string into thinking buffer is empty
|
|
*nLength = 0;
|
|
|
|
// Encode auth message as implicit octet string
|
|
if ( SNMPAPI_ERROR ==
|
|
(nResult = SnmpBerEncodeAsnOctetStr(ASN_RFCxxxx_PRIVDATA,
|
|
&String, pBuffer, nLength)) )
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// Encode the destination
|
|
if ( SNMPAPI_ERROR ==
|
|
(nResult = SnmpBerEncodeAsnObjectId(ASN_OBJECTIDENTIFIER,
|
|
DestParty, pBuffer, nLength)) )
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// Encode all as implicit sequence - RFCxxxx Priv message
|
|
nResult = SnmpBerEncodeAsnImplicitSeq( ASN_RFCxxxx_SNMPPRIVMSG, *nLength,
|
|
pBuffer, nLength );
|
|
|
|
Exit:
|
|
if ( nResult == SNMPAPI_ERROR )
|
|
{
|
|
SnmpUtilMemFree( *pBuffer );
|
|
|
|
*pBuffer = NULL;
|
|
*nLength = 0;
|
|
}
|
|
|
|
SnmpUtilMemFree( String.stream );
|
|
|
|
return nResult;
|
|
} // SnmpEncodePrivMsg
|
|
|
|
|
|
|
|
//
|
|
// SnmpDecodePrivMsg
|
|
// Removes and processes the private message header.
|
|
//
|
|
// Notes:
|
|
//
|
|
// Return Codes:
|
|
// SNMPAPI_NOERROR
|
|
// SNMPAPI_ERROR
|
|
//
|
|
// Error Codes:
|
|
// None.
|
|
//
|
|
SNMPAPI SnmpDecodePrivMsg(
|
|
IN OUT BYTE **pBuffer,
|
|
IN OUT UINT *nLength,
|
|
OUT SnmpPrivMsg *PrivMsg
|
|
)
|
|
|
|
{
|
|
AsnAny pResult;
|
|
BYTE *BufPtr;
|
|
UINT BufLen;
|
|
int nResult;
|
|
|
|
|
|
// Initialize
|
|
PrivMsg->privDst.ids = NULL;
|
|
|
|
// Process the sequence
|
|
if ( SNMPAPI_ERROR ==
|
|
(nResult = SnmpBerDecodeAsnStream(ASN_RFCxxxx_SNMPPRIVMSG,
|
|
pBuffer, nLength, &pResult)) )
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// Make copy of buffer information
|
|
BufPtr = pResult.asnValue.sequence.stream;
|
|
BufLen = pResult.asnValue.sequence.length;
|
|
|
|
// Decode private destination
|
|
if ( SNMPAPI_ERROR ==
|
|
(nResult = SnmpBerDecodeAsnStream(ASN_OBJECTIDENTIFIER,
|
|
&BufPtr, &BufLen, &pResult)) )
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// This is a non-standard copy
|
|
PrivMsg->privDst = pResult.asnValue.object;
|
|
|
|
// Decode private Data
|
|
if ( SNMPAPI_ERROR ==
|
|
(nResult = SnmpBerDecodeAsnStream(ASN_RFCxxxx_PRIVDATA,
|
|
&BufPtr, &BufLen, &pResult)) )
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// This is a non-standard copy
|
|
PrivMsg->privData = pResult.asnValue.string;
|
|
|
|
Exit:
|
|
if ( nResult == SNMPAPI_ERROR )
|
|
{
|
|
SnmpUtilOidFree( &PrivMsg->privDst );
|
|
}
|
|
|
|
return nResult;
|
|
} // SnmpDecodePrivMsg
|
|
|
|
|
|
|
|
//
|
|
// SnmpEncodeAuthMsg
|
|
// Creates the authentication message header.
|
|
//
|
|
// Notes:
|
|
// The buffer information must be initialized prior to calling this routine.
|
|
//
|
|
// Return Codes:
|
|
// SNMPAPI_NOERROR
|
|
// SNMPAPI_ERROR
|
|
//
|
|
// Error Codes:
|
|
// None.
|
|
//
|
|
SNMPAPI SnmpEncodeAuthMsg(
|
|
IN AsnObjectIdentifier *SrcParty, // To determine how to auth.
|
|
IN OUT BYTE **pBuffer, // Buffer to accept encoding
|
|
IN OUT UINT *nLength // Length of buffer
|
|
)
|
|
|
|
{
|
|
AsnOctetString String;
|
|
int nResult;
|
|
|
|
|
|
|
|
// OPENISSUE - Should be checking SrcParty to determine AUTH method.
|
|
//
|
|
// Normally, this routine would determine the authentication method
|
|
// and then encode the snmp mgmt com packet accordingly, but for now,
|
|
// a NULL string is encoded to indicate that NO authentication is present.
|
|
//
|
|
// OPENISSUE - Following line removes a warning, remove when above is done.
|
|
if ( SrcParty->idLength );
|
|
String.length = 0;
|
|
String.stream = NULL;
|
|
|
|
// Encode authentication
|
|
if ( SNMPAPI_ERROR ==
|
|
(nResult = SnmpBerEncodeAsnOctetStr(ASN_OCTETSTRING,
|
|
&String, pBuffer, nLength)) )
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// Encode all as implicit sequence - RFCxxxx Auth message
|
|
nResult = SnmpBerEncodeAsnImplicitSeq( ASN_RFCxxxx_SNMPAUTHMSG, *nLength,
|
|
pBuffer, nLength );
|
|
|
|
Exit:
|
|
// If an error occurs, the memory is freed by a lower level encoding routine.
|
|
|
|
// May have to free the space allocated for the octet string above.
|
|
|
|
return nResult;
|
|
} // SnmpEncodeAuthMsg
|
|
|
|
|
|
|
|
//
|
|
// SnmpDecodeAuthMsg
|
|
// Removes and processes the authentication message header.
|
|
//
|
|
// Notes:
|
|
//
|
|
// Return Codes:
|
|
// SNMPAPI_NOERROR
|
|
// SNMPAPI_ERROR
|
|
//
|
|
// Error Codes:
|
|
// None.
|
|
//
|
|
SNMPAPI SnmpDecodeAuthMsg(
|
|
IN AsnObjectIdentifier *privDst,
|
|
IN OUT BYTE **pBuffer,
|
|
IN OUT UINT *nLength,
|
|
OUT SnmpAuthMsg *AuthMsg
|
|
)
|
|
|
|
{
|
|
AsnAny pResult;
|
|
BYTE *BufPtr;
|
|
UINT BufLen;
|
|
int nResult;
|
|
|
|
|
|
// Initialize
|
|
AuthMsg->authInfo.asnValue.object.ids = NULL;
|
|
|
|
// Extract auth message from sequence
|
|
if ( SNMPAPI_ERROR ==
|
|
(nResult = SnmpBerDecodeAsnStream(ASN_RFCxxxx_SNMPAUTHMSG,
|
|
pBuffer, nLength, &pResult)) )
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
BufPtr = pResult.asnValue.sequence.stream;
|
|
BufLen = pResult.asnValue.sequence.length;
|
|
|
|
if ( SNMPAPI_ERROR == (nResult = SnmpBerQueryAsnType(BufPtr, BufLen)) )
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// Decode authentication info
|
|
if ( SNMPAPI_ERROR ==
|
|
(nResult = SnmpBerDecodeAsnStream((BYTE)nResult, &BufPtr,
|
|
&BufLen, &pResult)) )
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// This is a non-standard copy
|
|
AuthMsg->authInfo = pResult;
|
|
|
|
// Decode authentication data
|
|
if ( SNMPAPI_ERROR ==
|
|
(nResult = SnmpBerDecodeAsnStream(ASN_RFCxxxx_SNMPMGMTCOM,
|
|
&BufPtr, &BufLen, &pResult)) )
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// This is a non-standard copy
|
|
AuthMsg->authData = pResult.asnValue.sequence;
|
|
|
|
Exit:
|
|
if ( nResult == SNMPAPI_ERROR )
|
|
{
|
|
if ( AuthMsg->authInfo.asnType == ASN_OBJECTIDENTIFIER )
|
|
{
|
|
SnmpUtilOidFree( &AuthMsg->authInfo.asnValue.object );
|
|
}
|
|
|
|
SnmpUtilOidFree( privDst );
|
|
}
|
|
|
|
return nResult;
|
|
} // SnmpDecodeAuthMsg
|
|
|
|
|
|
|
|
//
|
|
// SnmpEncodeMgmtCom
|
|
// Encode the management com message.
|
|
//
|
|
// Notes:
|
|
// The buffer information must be initialized prior to calling this routine.
|
|
//
|
|
// Return Codes:
|
|
// SNMPAPI_NOERROR
|
|
// SNMPAPI_ERROR
|
|
//
|
|
// Error Codes:
|
|
// None.
|
|
//
|
|
SNMPAPI SnmpEncodeMgmtCom(
|
|
IN SnmpMgmtCom *MgmtCom, // Mgmt Com message to encode
|
|
IN OUT BYTE **pBuffer, // Buffer to accept encoding
|
|
IN OUT UINT *nLength // Length of buffer
|
|
)
|
|
|
|
{
|
|
int nResult;
|
|
|
|
|
|
// Encode PDU/TRAP
|
|
if ( SNMPAPI_ERROR ==
|
|
(nResult = SnmpPduEncodeAnyPdu(&MgmtCom->pdu, pBuffer, nLength)) )
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// Encode source party
|
|
if ( SNMPAPI_ERROR ==
|
|
(nResult = SnmpBerEncodeAsnObjectId(ASN_OBJECTIDENTIFIER,
|
|
&MgmtCom->srcParty,
|
|
pBuffer, nLength)) )
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// Encode destination party
|
|
if ( SNMPAPI_ERROR ==
|
|
(nResult = SnmpBerEncodeAsnObjectId(ASN_OBJECTIDENTIFIER,
|
|
&MgmtCom->dstParty,
|
|
pBuffer, nLength)) )
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// Encode all as implicit sequence - RFCxxxx Mgmt Com
|
|
nResult = SnmpBerEncodeAsnImplicitSeq( ASN_RFCxxxx_SNMPMGMTCOM, *nLength,
|
|
pBuffer, nLength );
|
|
|
|
Exit:
|
|
// If an error occurs, the memory is freed by a lower level encoding routine.
|
|
|
|
return nResult;
|
|
} // SnmpEncodeMgmtCom
|
|
|
|
|
|
|
|
//
|
|
// SnmpDecodeMgmtCom
|
|
// Processes the mgmt com message.
|
|
//
|
|
// Notes:
|
|
//
|
|
// Return Codes:
|
|
// SNMPAPI_NOERROR
|
|
// SNMPAPI_ERROR
|
|
//
|
|
// Error Codes:
|
|
// None.
|
|
//
|
|
SNMPAPI SnmpDecodeMgmtCom(
|
|
IN OUT BYTE **pBuffer,
|
|
IN OUT UINT *nLength,
|
|
SnmpMgmtCom *MgmtCom
|
|
)
|
|
|
|
{
|
|
AsnAny pResult;
|
|
int nResult;
|
|
|
|
|
|
// Initialize
|
|
MgmtCom->dstParty.ids = NULL;
|
|
MgmtCom->srcParty.ids = NULL;
|
|
|
|
// Decode destination party
|
|
if ( SNMPAPI_ERROR ==
|
|
(nResult = SnmpBerDecodeAsnStream(ASN_OBJECTIDENTIFIER,
|
|
pBuffer, nLength, &pResult)) )
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// This is a non-standard copy
|
|
MgmtCom->dstParty = pResult.asnValue.object;
|
|
|
|
// Decode source party
|
|
if ( SNMPAPI_ERROR ==
|
|
(nResult = SnmpBerDecodeAsnStream(ASN_OBJECTIDENTIFIER,
|
|
pBuffer, nLength, &pResult)) )
|
|
{
|
|
goto Exit;
|
|
}
|
|
|
|
// This is a non-standard copy
|
|
MgmtCom->srcParty = pResult.asnValue.object;
|
|
|
|
// Decode the PDU type
|
|
nResult = SnmpPduDecodeAnyPdu( &MgmtCom->pdu, pBuffer, nLength );
|
|
|
|
Exit:
|
|
if ( nResult == SNMPAPI_ERROR )
|
|
{
|
|
SnmpUtilOidFree( &MgmtCom->dstParty );
|
|
SnmpUtilOidFree( &MgmtCom->srcParty );
|
|
}
|
|
|
|
return nResult;
|
|
} // SnmpDecodeMgmtCom
|
|
|
|
//-------------------------------- END --------------------------------------
|
|
|