예제 #1
0
        private static IPrivacyProvider GetPrivacyProvider(string password, PasswordType passwordType,
                                                           string encryption, EncryptionType encryptionType)
        {
            IPrivacyProvider        provider;
            IAuthenticationProvider auth;

            if (passwordType == PasswordType.SHA)
            {
                auth = new SHA1AuthenticationProvider(new OctetString(password));
            }
            else
            {
                auth = new MD5AuthenticationProvider(new OctetString(password));
            }

            if (encryptionType == EncryptionType.DES)
            {
                provider = new Security.DESPrivacyProvider(new OctetString(encryption), auth);
            }
            else
            {
                provider = new Security.AESPrivacyProvider(new OctetString(encryption), auth);
            }

            return(provider);
        }
예제 #2
0
        public async Task <OID> Handle(GetV3Query query)
        {
            var discovery = Messenger.GetNextDiscovery(SnmpType.GetRequestPdu);
            var report    = discovery.GetResponse(10000, new IPEndPoint(query.IpAddress, query.Port));

            IPrivacyProvider provider;

            if (query.EncryptionType == EncryptionType.DES)
            {
                provider = new Security.DESPrivacyProvider(
                    new OctetString(query.Encryption),
                    new MD5AuthenticationProvider(new OctetString(query.Password)));
            }
            else
            {
                provider = new Security.AESPrivacyProvider(
                    new OctetString(query.Encryption),
                    new MD5AuthenticationProvider(new OctetString(query.Password)));
            }

            var request = new GetRequestMessage(
                Lextm.SharpSnmpLib.VersionCode.V3,
                Messenger.NextMessageId,
                Messenger.NextRequestId,
                new OctetString(query.UserName),
                new List <Variable> {
                new Variable(new ObjectIdentifier(query.OID_Id))
            },
                provider,
                Messenger.MaxMessageSize,
                report);

            var reply = await request.GetResponseAsync(new IPEndPoint(query.IpAddress, query.Port));

            var oid = reply
                      .Pdu().Variables
                      .FirstOrDefault(variable => variable.Id.ToString() == query.OID_Id);

            if (oid == null)
            {
                throw new KeyNotFoundException($"Cannot find variable with ID {query.OID_Id}");
            }

            if (reply.Pdu().ErrorStatus.ToInt32() != 0) // != ErrorCode.NoError
            {
                throw ErrorException.Create("error in response", query.IpAddress, reply);
            }

            return(new OID {
                Id = oid.Id.ToString(), Value = oid.Data.ToString()
            });
        }
예제 #3
0
        public async Task Handle(SetV3Command command)
        {
            Discovery     discovery = Messenger.GetNextDiscovery(SnmpType.GetRequestPdu);
            ReportMessage report    = discovery.GetResponse(10000, new IPEndPoint(command.IpAddress, command.Port));

            IPrivacyProvider provider;

            if (command.EncryptionType == EncryptionType.DES)
            {
                provider = new Security.DESPrivacyProvider(
                    new OctetString(command.Encryption),
                    new MD5AuthenticationProvider(new OctetString(command.Password)));
            }
            else
            {
                provider = new Security.AESPrivacyProvider(
                    new OctetString(command.Encryption),
                    new MD5AuthenticationProvider(new OctetString(command.Password)));
            }

            SetRequestMessage request = new SetRequestMessage(
                Lextm.SharpSnmpLib.VersionCode.V3,
                Messenger.NextMessageId,
                Messenger.NextRequestId,
                new OctetString(command.UserName),
                new List <Variable> {
                new Variable(new ObjectIdentifier(command.OID.Id), new OctetString(command.OID.Value))
            },
                provider,
                report);

            ISnmpMessage reply = await request.GetResponseAsync(new IPEndPoint(command.IpAddress, command.Port));

            if (reply.Pdu().ErrorStatus.ToInt32() != 0) // != ErrorCode.NoError
            {
                throw ErrorException.Create("error in response", command.IpAddress, reply);
            }
        }