2015-08-04 5 views
0

Я пытаюсь расшифровать запрос ASN.1 OCSP с Perl Convert :: ASN1 шестнадцатеричного дампа я получаю следующим образом:Perl Преобразовать :: ASN1 декодирование не работает

30773075304E304C304A300906052B0E03021A050004146283D6C38BF724E2EE10A7D2829A4F906E48F3F2041423490CF9B7D39B1BD93A60A2A67877894782E96F021100B1C544D7AFA4039D4F482BDDEE975E38A2233021301F06092B060105050730010204120410ABE72957E85AE50E8B9628DB495BD5D5 

Я использовал онлайн-инструмент для verifiy, что он является действительным ASN.1 закодированы, и имеет следующую структуру

SEQUENCE { 
    SEQUENCE { 
     SEQUENCE { 
     SEQUENCE { 
      SEQUENCE { 
       SEQUENCE { 
        OBJECTIDENTIFIER 1.3.14.3.2.26 (id_sha1) 
        NULL 
       } 
       OCTETSTRING 6283D6C38BF724E2EE10A7D2829A4F906E48F3F2 
       OCTETSTRING 23490CF9B7D39B1BD93A60A2A67877894782E96F 
       INTEGER 0x00B1C544D7AFA4039D4F482BDDEE975E38 
      } 
     } 
     } 
     [2] { 
     SEQUENCE { 
      SEQUENCE { 
       OBJECTIDENTIFIER 1.3.6.1.5.5.7.48.1.2 
       OCTETSTRING 0410ABE72957E85AE50E8B9628DB495BD5D5 
      } 
     } 
     } 
    } 
} 

я пакет гекс до декодирования

my $data = "30773075304E304C304A300906052B0E03021A050004146283D6C38BF724E2EE10A7D2829A4F906E48F3F2041423490CF9B7D39B1BD93A60A2A67877894782E96F021100B1C544D7AFA4039D4F482BDDEE975E38A2233021301F06092B060105050730010204120410ABE72957E85AE50E8B9628DB495BD5D5"; 
my $asn1Val=pack("H*",$data); 

Я создал asn1.1 схему из этого

my $asn = Convert::ASN1->new; 
$asn->prepare(q< 
    OCSPRequest  ::=  SEQUENCE { 
     tbsRequest     TBSRequest, 
     optionalSignature [0]  EXPLICIT Signature OPTIONAL 
    } 

    TBSRequest  ::=  SEQUENCE { 
     version    [0]  EXPLICIT Version OPTIONAL, -- DEFAULT v1 
--  requestorName  [1]  EXPLICIT GeneralName OPTIONAL, 
     requestList     SEQUENCE OF Request, 
     requestExtensions [2]  EXPLICIT Extensions OPTIONAL 
    } 

    Request   ::=  SEQUENCE { 
     reqCert      CertID, 
     singleRequestExtensions  [0] EXPLICIT Extensions OPTIONAL 
    } 

    AlgorithmIdentifier ::= SEQUENCE { 
     algorithm   OBJECT IDENTIFIER, 
     parameters   ANY DEFINED BY algorithm OPTIONAL 
    } 

    CertID   ::=  SEQUENCE { 
     hashAlgorithm  AlgorithmIdentifier, 
     issuerNameHash  OCTET STRING, -- Hash of issuer's DN 
     issuerKeyHash  OCTET STRING, -- Hash of issuer's public key 
     serialNumber   CertificateSerialNumber 
    } 

    CertificateSerialNumber ::= INTEGER 

    Extension ::= SEQUENCE { 
     extnID  OBJECT IDENTIFIER, 
     critical BOOLEAN OPTIONAL, -- DEFAULT FALSE, 
     extnValue OCTET STRING 
        -- contains the DER encoding of an ASN.1 value 
        -- corresponding to the extension type identified 
        -- by extnID 
     } 

    Extensions ::= SEQUENCE OF Extension 

    Signature  ::=  SEQUENCE { 
     signatureAlgorithm AlgorithmIdentifier, 
     signature   BIT STRING 
--,  certs    [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL 
    } 

    Version  ::= INTEGER -- { v1(0) } 

>) 

Когда я пытаюсь deocode выше него работает несколько раз и не Somes времени.

asn_dump($data); # This works fine 
my $decoded=$asn->decode($data) or print $asn->error(); 
print Dumper ($decoded); 

Я думаю, что схема является правильным, но декодирование не удается я не смог найти много примеров в Интернете.

ответ

1

Значительный момент, который вы здесь делаете, заключается в том, что вы говорите: «он работает несколько раз и несколько раз терпит неудачу». Для меня это подсказка, что вы не использовали find(), чтобы сообщить Convert :: ASN1, где начать в вашем определении.

Вы должны использовать find(), если в подготовленном ASN.1 есть несколько макросов (один typedef). Затем используйте полученный объект из find() для выполнения вашего декодирования(). Помните также, чтобы всегда проверять статус возврата из find() и decode(); если undef, то ошибка будет в -> error() для объекта, который вы использовали.

my $asn = new Convert::ASN1; 
my $ok = $asn->prepare(q< ...your asn.1 definition here... >); 
die "*** Could not prepare definition: ".$asn->error() 
    if !$ok; 
my $top = $asn->find("OCSPRequest"); 
die "*** Could not find top of structure: ".$asn->error() 
    if !$top; 
my $result = $top->decode($your_pdu); # Use $top, NOT $asn ! 
die "*** Could not decode PDU: ".$top->error() 
    if !$result; 

Это немного догадка, поскольку ваш вопрос не дает мне достаточного контекста, но я надеюсь, что это поможет.

+0

Это было решение проблемы, которую я имел. – cloonacool

 Смежные вопросы

  • Нет связанных вопросов^_^