etingof / pyasn1

Generic ASN.1 library for Python
http://snmplabs.com/pyasn1
BSD 2-Clause "Simplified" License
244 stars 118 forks source link

Fix. Decode Unsigned Values as Unsigned #215

Open nigredon1991 opened 2 years ago

nigredon1991 commented 2 years ago

Fix some issues in pysnmp

https://github.com/etingof/pysnmp/issues/190 https://github.com/etingof/pysnmp/issues/357 https://github.com/etingof/pysnmp/issues/384

Example for fast test:

from pyasn1.codec.ber import decoder
from pysnmp.hlapi import *

print(decoder.decode(bytes.fromhex('4104985D4B44'), Counter32()))

On the current master, it will fall into a ValueConstraintError:

pyasn1.type.error.ValueConstraintError: <ConstraintsIntersection object, consts <ValueRangeConstraint object, consts 0, 4294967295>> failed at: ValueConstraintError('<ValueRangeConstraint object, consts 0, 4294967295> failed at: ValueConstraintError(-1738716348)') at Counter32

And after correction it is correctly decoded:

(<Counter32 value object, tagSet <TagSet object, tags 64:0:1>, subtypeSpec <ConstraintsIntersection object, consts <ValueRangeConstraint object, consts 0, 4294967295>>, payload [2556250948]>, b'')
Gerhardzz commented 1 year ago

The value that you decode in the example - '4104985D4B44': leaving the type(41) and the len(04) aside the highest bit of the actual value (985D4B44) is 1. Doesn't that require to handle it as a 2s-complement? because Snmp uses ASN.1/BER and ASN.1 knows signed integer only? In that case the exception would be correct because the server actually used an incorrect encoding and sent a negative number (that's at least my current understanding, also https://pysnmp.readthedocs.io/en/latest/faq/ignored-snmp-packets.html).
Based on which RFC or standard do you now change that behavior? BR, Gerhard.

nigredon1991 commented 1 year ago

This behavior is wrong, I'll try to refer to the answer of another person who has already answered quite fully

lextm commented 8 months ago

Since the ecosystem moved away from here, you should send your pull request to https://github.com/pyasn1/pyasn1.