生成的ASN.1处理程序的快速DER抽象基类

arpa2.quickder的Python项目详细描述


在Python中嵌入quickder

^{1}$

This description explains how Quick DER is mapped into Python. The design is made to facilitate similar structural traversals in Python as in C, albeit through a different mechanism. Much like the C headers, the structures are generated and placed into modules that are delivered along with Quick DER for Python.

一般说明

Python中quickder的实现围绕着 封装各种ASN.1对象的逻辑。构造类型,如 作为CHOICESEQUENCESET有命名字段,它们映射到属性 可以通过向实例中添加.fielfname来直接寻址。在

虽然在C中我们需要显式地遍历SEQUENCE OF和{} 由于其可变大小的结构,这已经被封装 这样的结构会以列表或 在Python下可以正常操作的集合。在

ANY类型的ASN.1对象保持原样,并作为 (二进制)Python字符串,包含头和内容。你可以用 它以任何你喜欢的方式,但是如果你知道类,你可以实例化 就好像你是通过协议接收数据的。在

通过设置正确的内部 变量在ASN1Object的子类或实例中,但这不是 胆小的人;在当前的形势下,有很多方法可以使程序崩溃 系统。生成的include文件不会出现相同的风险。所以, 为自定义结构创建处理程序的最佳方法是映射 通过asn2quickder编译器自定义ASN.1规范。在

构建DER是一个逆向过程,它可以遵循相同的过程。在

使用生成的类

快速订购的软件包是quick_der。它提供了一个功能 ^{cda}必须是

给定这样一个实例,可以按预期操作其中的条目。它 应该注意,der_unpack()的每个输出中的数据是共享的, 意思是你可以遍历到解析结构中的对象, 更改它,然后重新打包整个结构,以找到所做的更改 在嵌入的对象中。如果这不是您需要的,您应该clone() 各自的对象。在

任何ASN1Object都可以通过其_der_pack()转换为DER字节 方法(不是ASN.1名称)或包der_pack()函数。这个 使用存储在对象中的信息来查找打包的格式。 一般来说,在Python下使用quickder意味着您使用的是类, 不是像C中那样的包装器描述。它标记了 语言。在

如果您想知道为什么包quick_der显式地提到 在der_pack()der_unpack()函数中再次排序:我们可以看到方法 用BER、XER和JER的编码来扩展这种方法 编码、PER、CER等。这可以通过多重继承来实现 在这些对象中,可能包含一个未来可能的Quick XER模块, 等等。工厂可以为您的平台适当地执行此操作。有一天, 谁知道呢!在

示例代码

Kerberos完全是用ASN.1定义的,因此它可以作为一个好的 例子。而不是难以操纵的二进制传输格式 甚至是阅读部分,我们可以把它变成一个Python对象,工作 并在需要时生成二进制传输格式。在

asn2quickder编译器为许多规范生成Python包, 准备作为模块加载。例如,定义了Kerberos票证 在rfc4120中使用Ticket,因此可以通过 quickder.rfc.rfc4120.Ticket并像自定义类那样使用 实现Kerberos票证:

from quickder.rfc.rfc4120 import Ticket

def show_ticket (der):
        """Access individual parts of the Ticket, and print them.
           Then compose the owner's name from its constituent parts.
        """
        tkt = Ticket (der)
        print 'Ticket for Realm', tkt.realm
        print '       has name-type', tkt.sname.name_type
        for nm in tkt.sname.name_string:
                print '       has name-string component', nm
        owner = '/'.join (tkt.sname.name_string) + '@' + tkt.realm
        print 'In short, it is for', owner

def rebase_ticket (der, newrealm):
        """This violates RFC 4120, but is still a nice demo of modifying
           DER data in Python.  The violation is caused by the mismatch
           of the realm with the encrypted copy in tkt.enc_part
        """
        tkt = Ticket (der)
        tkt.realm = newrealm
        return tkt._der_pack ()

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java引用MediaPlayer中断脚本?NullPointerException(JavaFX)   用于查找字符串的java正则表达式模式包含一些单词,而没有其他单词   使用Jfreechart和Runnable接口在java上显示实时数据的多线程处理   java如何在获取imei信息时获取dialogFragment中的上下文   安卓 Java在一个循环中打印每个i   apache kafka主题上的java流媒体没有输出   java是在Akka中模拟大量HTTP连接的最佳方法   java如何使用ibatis注释进行批插入   硬件如何在Linux、Windows和Mac上使用Java+JNI检索硬盘的唯一ID   java声明实例变量并实现getter方法?   java正则表达式和新行   java有没有办法使用安卓的Play Core安装本地apk?   java将Graphics2D绘制到另一个Graphics2D   使用Spring和Glassfish的JtaTransactionManager的java JNDI初始上下文   java是一个JPanel问题   网络Java UDP数据包丢失。50%   java如何从字符串正则表达式中提取数据   java 安卓不录制或编码声音