我正在尝试使用pyasn1在python 3.7中构建asn1结构来序列化ECDSA签名。
我定义了以下结构:(从此处找到的示例http://snmplabs.com/pyasn1/)
class ASNBitcoinSignature(Sequence):
componentType = NamedTypes(
NamedType('r', Integer()),
NamedType('s', Integer()),
)
我的用于对签名的r和s值进行编码的代码如下:
asn = ASNBitcoinSignature()
asn['r'] = self.r().x()
asn['s'] = self.s()
serialized = encode(asn)
运行我收到的代码
'No field named "r" defined for ASNBitcoinSignature'
有人知道错在哪里吗?这可能是一个古老的示例,并且现在需要以其他方式设置或定义字段值了吗?
答案 0 :(得分:0)
此错误来自错误的序列导入:
最初我导入了
from asn1crypto.core import Sequence
但是我真正想要的是
from pyasn1.type.univ import Sequence
此代码的另一个问题(仅供将来参考)是pyasn1中定义的Integer类型对于我的用例而言,最大值太低。
我可以通过创建一个新的Integer子类型来解决此问题:
class ASNBigInteger(Integer):
subtypeSpec = ValueRangeConstraint(0x1, 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141)