📄 snmpv3message.java
字号:
/* * @(#)file SnmpV3Message.java * @(#)author Sun Microsystems, Inc. * @(#)version 4.12 * @(#)date 01/01/17 * * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * */package com.sun.jmx.snmp;// java imports//import java.util.Vector;import java.net.InetAddress;// import debug stuff//import com.sun.jmx.trace.Trace;import com.sun.jmx.snmp.internal.SnmpMsgProcessingSubSystem;import com.sun.jmx.snmp.internal.SnmpSecurityModel;import com.sun.jmx.snmp.internal.SnmpDecryptedPdu;import com.sun.jmx.snmp.internal.SnmpSecurityCache;import com.sun.jmx.snmp.SnmpMsg;import com.sun.jmx.snmp.SnmpPdu;import com.sun.jmx.snmp.SnmpStatusException;import com.sun.jmx.snmp.SnmpTooBigException;import com.sun.jmx.snmp.SnmpScopedPduBulk;import com.sun.jmx.snmp.BerException;import com.sun.jmx.snmp.SnmpScopedPduRequest;import com.sun.jmx.snmp.BerDecoder;import com.sun.jmx.snmp.SnmpDefinitions;import com.sun.jmx.snmp.SnmpEngineId;import com.sun.jmx.snmp.SnmpScopedPduPacket;import com.sun.jmx.snmp.BerEncoder;import com.sun.jmx.snmp.SnmpPduRequestType;import com.sun.jmx.snmp.SnmpPduBulkType;/** * Is a partially decoded representation of an SNMP V3 packet. * <P> * This class can be used when developing customized manager or agent. * <P> * The <CODE>SnmpV3Message</CODE> class is directly mapped onto the * message syntax defined in RFC 2572. * <BLOCKQUOTE> * <PRE> * SNMPv3Message ::= SEQUENCE { * msgVersion INTEGER ( 0 .. 2147483647 ), * -- administrative parameters * msgGlobalData HeaderData, * -- security model-specific parameters * -- format defined by Security Model * msgSecurityParameters OCTET STRING, * msgData ScopedPduData * } * HeaderData ::= SEQUENCE { * msgID INTEGER (0..2147483647), * msgMaxSize INTEGER (484..2147483647), * * msgFlags OCTET STRING (SIZE(1)), * -- .... ...1 authFlag * -- .... ..1. privFlag * -- .... .1.. reportableFlag * -- Please observe: * -- .... ..00 is OK, means noAuthNoPriv * -- .... ..01 is OK, means authNoPriv * -- .... ..10 reserved, must NOT be used. * -- .... ..11 is OK, means authPriv * * msgSecurityModel INTEGER (1..2147483647) * } * </BLOCKQUOTE> * </PRE> * <p><b>This API is a Sun Microsystems internal API and is subject * to change without notice.</b></p> * @since 1.5 */public class SnmpV3Message extends SnmpMsg { /** * Message identifier. */ public int msgId = 0; /** * Message max size the pdu sender can deal with. */ public int msgMaxSize = 0; /** * Message flags. Reportable flag and security level.</P> *<PRE> * -- .... ...1 authFlag * -- .... ..1. privFlag * -- .... .1.. reportableFlag * -- Please observe: * -- .... ..00 is OK, means noAuthNoPriv * -- .... ..01 is OK, means authNoPriv * -- .... ..10 reserved, must NOT be used. * -- .... ..11 is OK, means authPriv *</PRE> */ public byte msgFlags = 0; /** * The security model the security sub system MUST use in order to deal with this pdu (eg: User based Security Model Id = 3). */ public int msgSecurityModel = 0; /** * The unmarshalled security parameters. */ public byte[] msgSecurityParameters = null; /** * The context engine Id in which the pdu must be handled (Generaly the local engine Id). */ public byte[] contextEngineId = null; /** * The context name in which the OID has to be interpreted. */ public byte[] contextName = null; /** The encrypted form of the scoped pdu (Only relevant when dealing with privacy). */ public byte[] encryptedPdu = null; /** * Constructor. * */ public SnmpV3Message() { } /** * Encodes this message and puts the result in the specified byte array. * For internal use only. * * @param outputBytes An array to receive the resulting encoding. * * @exception ArrayIndexOutOfBoundsException If the result does not fit * into the specified array. */ public int encodeMessage(byte[] outputBytes) throws SnmpTooBigException { int encodingLength = 0; if(isTraceOn()) { trace("encodeMessage", "Can't encode directly V3Message!!!!! Need a SecuritySubSystem"); } throw new IllegalArgumentException("Can't encode"); } /** * Decodes the specified bytes and initializes this message. * For internal use only. * * @param inputBytes The bytes to be decoded. * * @exception SnmpStatusException If the specified bytes are not a valid encoding. */ public void decodeMessage(byte[] inputBytes, int byteCount) throws SnmpStatusException { try { BerDecoder bdec = new BerDecoder(inputBytes); bdec.openSequence(); version = bdec.fetchInteger(); bdec.openSequence(); msgId = bdec.fetchInteger(); msgMaxSize = bdec.fetchInteger(); msgFlags = bdec.fetchOctetString()[0]; msgSecurityModel =bdec.fetchInteger(); bdec.closeSequence(); msgSecurityParameters = bdec.fetchOctetString(); if( (msgFlags & SnmpDefinitions.privMask) == 0 ) { bdec.openSequence(); contextEngineId = bdec.fetchOctetString(); contextName = bdec.fetchOctetString(); data = bdec.fetchAny(); dataLength = data.length; bdec.closeSequence(); } else { encryptedPdu = bdec.fetchOctetString(); } bdec.closeSequence() ; } catch(BerException x) { x.printStackTrace(); throw new SnmpStatusException("Invalid encoding") ; } if(isTraceOn()) { trace("decodeMessage", "Unmarshalled message : \n" + "version :" + version + "\n" + "msgId :" + msgId + "\n" + "msgMaxSize :" + msgMaxSize + "\n" + "msgFlags :" + msgFlags + "\n" + "msgSecurityModel :" + msgSecurityModel + "\n" + "contextEngineId :" + (contextEngineId == null ? null : SnmpEngineId.createEngineId(contextEngineId)) + "\n" + "contextName :" + (contextName == null ? null : new String(contextName)) + "\n" + "data :" + data + "\n" + "dat len :" + ((data == null) ? 0 : data.length) + "\n" + "encryptedPdu :" + encryptedPdu + "\n"); } } /** * Returns the associated request Id. * @param data The flat message. * @return The request Id. */ public int getRequestId(byte[] data) throws SnmpStatusException { BerDecoder bdec = null; int msgId = 0; try { bdec = new BerDecoder(data); bdec.openSequence(); bdec.fetchInteger(); bdec.openSequence(); msgId = bdec.fetchInteger(); }catch(BerException x) { throw new SnmpStatusException("Invalid encoding") ; } try { bdec.closeSequence(); } catch(BerException x) { } return msgId; } /** * Initializes this message with the specified <CODE>pdu</CODE>. * <P> * This method initializes the data field with an array of * <CODE>maxDataLength</CODE> bytes. It encodes the <CODE>pdu</CODE>. * The resulting encoding is stored in the data field * and the length of the encoding is stored in <CODE>dataLength</CODE>. * <p> * If the encoding length exceeds <CODE>maxDataLength</CODE>, * the method throws an exception. * * @param p The PDU to be encoded. * @param maxDataLength The maximum length permitted for the data field. * * @exception SnmpStatusException If the specified <CODE>pdu</CODE> * is not valid.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -