Skip to main content

ASN.1 library for Python

PyPI Python Versions CI GitHub license

This is a free and open source implementation of ASN.1 types and codecs as a Python package. It has been first written to support particular protocol (SNMP) but then generalized to be suitable for a wide range of protocols based on ASN.1 specification.

This project is a maintained fork of the original pyasn1, published to PyPI as pysnmp-pyasn1. The importable package name remains pyasn1, so existing code needs no changes.

It is maintained in the pysnmp organization because SNMP depends on it, and pysnmp installs it for you — but nothing here is SNMP-specific.

Documentation: https://pysnmp.github.io/pyasn1/

Features

  • Generic implementation of ASN.1 types (X.208)
  • Standards compliant BER/CER/DER codecs
  • Can operate on streams of serialized data
  • Dumps/loads ASN.1 structures from Python types
  • 100% Python, works with Python 3.10+
  • MT-safe
  • Contributed ASN.1 compiler Asn1ate

Why using pyasn1

ASN.1 solves the data serialisation problem. This solution was designed long ago by the wise Ancients. Back then, they did not have the luxury of wasting bits. That is why ASN.1 is designed to serialise data structures of unbounded complexity into something compact and efficient when it comes to processing the data.

That probably explains why many network protocols and file formats still rely on the 30+ years old technology. Including a number of high-profile Internet protocols and file formats.

Quite a number of books cover the topic of ASN.1. Communication between heterogeneous systems by Olivier Dubuisson is one of those high quality books freely available on the Internet.

The pyasn1 package is designed to help Python programmers tackling network protocols and file formats at the comfort of their Python prompt. The tool struggles to capture all aspects of a rather complicated ASN.1 system and to represent it on the Python terms.

How to use pyasn1

With pyasn1 you can build Python objects from ASN.1 data structures. For example, the following ASN.1 data structure:

Record ::= SEQUENCE {
  id        INTEGER,
  room  [0] INTEGER OPTIONAL,
  house [1] INTEGER DEFAULT 0
}

Could be expressed in pyasn1 like this:

class Record(Sequence):
    componentType = NamedTypes(
        NamedType("id", Integer()),
        OptionalNamedType(
            "room",
            Integer().subtype(implicitTag=Tag(tagClassContext, tagFormatSimple, 0)),
        ),
        DefaultedNamedType(
            "house",
            Integer(0).subtype(implicitTag=Tag(tagClassContext, tagFormatSimple, 1)),
        ),
    )

It is in the spirit of ASN.1 to take abstract data description and turn it into a programming language specific form. Once you have your ASN.1 data structure expressed in Python, you can use it along the lines of similar Python type (e.g. ASN.1 SET is similar to Python dict, SET OF to list):

>>> record = Record()
>>> record['id'] = 123
>>> record['room'] = 321
>>> str(record)
Record:
 id=123
 room=321
>>>

Part of the power of ASN.1 comes from its serialisation features. You can serialise your data structure and send it over the network.

>>> from pyasn1.codec.der.encoder import encode
>>> substrate = encode(record)
>>> hexdump(substrate)
00000: 30 07 02 01 7B 80 02 01 41

Conversely, you can turn serialised ASN.1 content, as received from network or read from a file, into a Python object which you can introspect, modify, encode and send back.

>>> from pyasn1.codec.der.decoder import decode
>>> received_record, rest_of_substrate = decode(substrate, asn1Spec=Record())
>>>
>>> for field in received_record:
>>>    print('{} is {}'.format(field, received_record[field]))
id is 123
room is 321
house is 0
>>>
>>> record == received_record
True
>>> received_record.update(room=123)
>>> substrate = encode(received_record)
>>> hexdump(substrate)
00000: 30 06 02 01 7B 80 01 7B

The pyasn1 classes struggle to emulate their Python prototypes (e.g. int, list, dict etc.). But ASN.1 types exhibit more complicated behaviour. To make life easier for a Pythonista, they can turn their pyasn1 classes into Python built-ins:

>>> from pyasn1.codec.native.encoder import encode
>>> encode(record)
{'id': 123, 'room': 321, 'house': 0}

Or vice-versa -- you can initialize an ASN.1 structure from a tree of Python objects:

>>> from pyasn1.codec.native.decoder import decode
>>> record = decode({'id': 123, 'room': 321, 'house': 0}, asn1Spec=Record())
>>> str(record)
Record:
 id=123
 room=321
>>>

With ASN.1 design, serialisation codecs are decoupled from data objects, so you could turn every single ASN.1 object into many different serialised forms. As of this moment, pyasn1 supports BER, DER, CER and Python built-ins codecs.

More information on pyasn1 APIs can be found in the documentation; compiled ASN.1 modules for different protocols and file formats are in pyasn1-modules, published here as pysnmp-pyasn1-modules. Note that this fork of it is archived — unlike pyasn1 itself, it is not maintained here.

How to get pyasn1

This project is forked from pyasn1. The pyasn1 package is distributed under terms and conditions of 2-clause BSD license. Source code is freely available as a GitHub repo.

You could pip install pysnmp-pyasn1 or download it from PyPI.

If something does not work as expected, open an issue at GitHub or post your question on Stack Overflow.

Copyright (c) 2005-2020, Ilya Etingof. All rights reserved. Copyright (c) 2021- Ryan Faircloth. Copyright (c) 2023, Splunk Inc.

Metadata

Release files for pysnmp-pyasn1 2.0.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pysnmp-pyasn1 2.0.4
File Size Uploaded
pysnmp_pyasn1-2.0.4.tar.gz 237.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pysnmp-pyasn1 2.0.4
File Interpreter ABI Platform
pysnmp_pyasn1-2.0.4-py3-none-any.whl Python 3 none any Details

Total release size: 348.3 kB

Release files / pysnmp_pyasn1-2.0.4.tar.gz

Download URL pysnmp_pyasn1-2.0.4.tar.gz
Size 237.3 kB
Tags Source
SHA-256 checksum
How to use checksums
73443d4e76dd0050d52f361597f46c7cdc61c23a26fb6d48ce4103dedfe7ffa7
BLAKE2b-256 checksum
How to use checksums
18cae5074d5ea66134b5b3c5853630a7c38669fc6137215de8cf965f99e5d658
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.

Transparency log

Release files / pysnmp_pyasn1-2.0.4-py3-none-any.whl

Download URL pysnmp_pyasn1-2.0.4-py3-none-any.whl
Size 110.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
b14864b25fbc81c5b050541023162e33db3e3528b3a01bef60d86dec563b57ea
BLAKE2b-256 checksum
How to use checksums
4bb639fc2002e097a7f118b72f91ccd17283b3216741509047b0b54c2abd0485
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 20, 2026.

Transparency log
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page