2017-06-10 8 views
0

我需要从SEQUENCE获得完整的DER编码项目。但我有Segmentation fault: 11。哪里不对?如何使用SEC_ASN1_SAVE?

如果我评论与SEC_ASN1_SAVE它的工作原理确定为version线,但我需要得到derVersion

typedef struct { 
    SecAsn1Item derVersion; 
    SecAsn1Item version; 
} ASN1_TEST; 

const SecAsn1Template kTestTemplate[] = { 
    {SEC_ASN1_SEQUENCE, 0, NULL, sizeof(ASN1_TEST)}, 
    {SEC_ASN1_SAVE, offsetof(ASN1_TEST, derVersion)}, 
    {SEC_ASN1_INTEGER, offsetof(ASN1_TEST, version)}, 
    {0} 
}; 

void ParseASN1(){ 
    const char der[] = "\x30\x05\x02\x03\x01\x00\x01"; 

    SecAsn1CoderRef coder = NULL; 
    OSStatus status = SecAsn1CoderCreate(&coder); 
    if (status) { 
     THROW_EXCEPTION("SecAsn1CoderCreate"); 
    } 

    ASN1_TEST test; 
    status = SecAsn1Decode(
        coder, 
        (CK_BYTE_PTR)der, 7, 
        kTestTemplate, 
        &test 
       ); 
    if (status) { 
     SecAsn1CoderRelease(coder); 

     THROW_EXCEPTION("SecAsn1Decode"); 
    } 

    fprintf(stdout, "Test.version: %lu\n", test.version.Length); 
    fprintf(stdout, "Test.derVersion: %lu\n", test.derVersion.Length); 

    SecAsn1CoderRelease(coder); 
} 

下面是使用代码一些链接,我发现。

NSS_TBSCertificate structure

kSecAsn1TBSCertificateTemplate template

回答

0

我解决了这个问题。

我不得不在test声明后加memset(&test, 0, sizeof(ASN1_TEST));