2016-09-25 2 views
0

Я новичок в ASN1 и хочу реализовать эту структуру, используя pyasn1Реализовать структуру ASN1 правильно используя pyasn1

ECPrivateKey ::= SEQUENCE { 
    version  INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1), 
    privateKey  OCTET STRING, 
    parameters [0] ECParameters {{ NamedCurve }} OPTIONAL, 
    publicKey [1] BIT STRING OPTIONAL 
    } 

здесь есть код, я использую

from pyasn1.type import univ, namedtype, tag 
class ZKey(univ.Sequence): 
    componentType = namedtype.NamedTypes(
    namedtype.NamedType('id', univ.Integer()), 
    namedtype.NamedType('priv', univ.OctetString()), 
    namedtype.OptionalNamedType(
    'ECParam', 
    univ.ObjectIdentifier().subtype(
    implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0) 
    ) 
    ), 
    namedtype.OptionalNamedType(
    'pub', 
    univ.BitString().subtype(
    implicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 1) 
    ))) 

при кодировании с помощью этой последовательности я получаю результат like, когда я хочу, чтобы структура была чем-то вроде this. Что мне не хватает? Заранее благодарю

+0

Ваша вторая ссылка сломана так, что невозможно узнать, какую кодировку вы хотите достичь. –

+0

@IlyaEtingof Я отредактировал мой вопрос – abhi

ответ

0

Я полагаю, что в модуле ASN.1, с которым вы работаете, режим тегов EXPLICIT является значением по умолчанию. Поэтому в вашем коде pyasn1 вы также должны использовать явные теги.

Вот несколько фиксированный код, который должен работать, как вы хотите:

from pyasn1.type import univ, namedtype, tag 
from pyasn1.codec.der.encoder import encode 
import base64 

class ZKey(univ.Sequence): 
    componentType = namedtype.NamedTypes(
     namedtype.NamedType('id', univ.Integer()), 
     namedtype.NamedType('priv', univ.OctetString()), 
     namedtype.OptionalNamedType(
      'ECParam', 
      univ.ObjectIdentifier().subtype(
       explicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 0) 
      ) 
     ), 
     namedtype.OptionalNamedType(
      'pub', 
      univ.BitString().subtype(
       explicitTag=tag.Tag(tag.tagClassContext, tag.tagFormatSimple, 1) 
      ) 
     ) 
    ) 

zKey = ZKey() 
zKey['id'] = 123 
zKey['priv'] = 'foo bar' 
zKey['ECParam'] = '1.3.6.1' 
zKey['pub'] = [1,0,1,1] 

substrate = encode(zKey) 

print(base64.encodebytes(substrate))