P1sec / pycrate

A Python library to ease the development of encoders and decoders for various protocols and file formats; contains ASN.1 and CSN.1 compilers.
GNU Lesser General Public License v2.1
380 stars 130 forks source link

[asn1dir] AlgorithmIdentifier.from_ber() -- AttributeError: 'SEQ' object has no attribute '_tagc' #250

Open JamesTheAwesomeDude opened 7 months ago

JamesTheAwesomeDude commented 7 months ago

Am I doing something wrong, or does pycrate_asn1dir.X509_2016.AuthenticationFramework.AlgorithmIdentifier not currently work as a stand-alone parser?

from pycrate_asn1dir import X509_2016
# init_modules: different OID objects ... with same OID value ...

AlgId = X509_2016.AuthenticationFramework.AlgorithmIdentifier

AlgId.from_ber(bytes.fromhex('300d06092a864886f70d01010b0500'))
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
#   File "...\.venv\Lib\site-packages\pycrate_asn1rt\asnobj.py", line 1618, in from_ber
#     self._from_ber(char, TLV)
#   File "...\.venv\Lib\site-packages\pycrate_asn1rt\asnobj.py", line 1587, in _from_ber
#     for t in self._tagc:
#              ^^^^^^^^^^
# AttributeError: 'SEQ' object has no attribute '_tagc'. Did you mean: '_tag'?

I'm getting this error on CPython 3.11.6, pycrate 0.7.0

The test input should be valid; I lifted it from offset 583 of this file.

mitshell commented 4 months ago

The object you are using here AlgorithmIdentifier is a parameterized one, which is not usable for encoding / decoding. This is the reason you get an error here.

Please note a new repository has been setup, including new fixes. This repo will keep being maintained : https://github.com/pycrate-org/pycrate. It includes an explicit exception for your case, to indicate parameterized objects are not to be used for encoding / decoding. In addition, a tiny tool pycrate_certdecode.py has been added to help check whole x.509 certificate.