2013-03-21 2 views
1

CHOICE -within-a-CHOICE 구조를 포함하는 구조 유형을 인코딩/디코딩하는 데 문제가 있습니다. 가장 간단한 예가 아래와 같습니다.ASN.1 libtasn1의 디코드 오류

ASN1 파일 :

TEST {} 
DEFINITIONS IMPLICIT TAGS ::= 
BEGIN 

Test_ch1 ::= CHOICE { 
t1 INTEGER 
} 

Test_ch2 ::= CHOICE { 
t2 Test_ch1 
} 

END 

소스 코드 :

#include <stdio.h> 
#include <libtasn1.h> 

int main() 
{ 
int result = 0; 
asn1_node definitions = NULL, node = NULL; 
char errorDescription[ASN1_MAX_ERROR_DESCRIPTION_SIZE]; 
const char * treefile = ASN1_FILE; 

char data[1024]; 
int data_size = sizeof(data); 

asn1_parser2tree (treefile, &definitions, errorDescription); 
asn1_create_element (definitions, "TEST.Test_ch2", &node); 
asn1_write_value (node, "", "t2", 1); 
asn1_write_value (node, "t2", "t1", 1); 
asn1_write_value (node, "t2.t1", "1234", 0); 
asn1_der_coding (node, "", data, &data_size, errorDescription); 

asn1_create_element (definitions, "TEST.Test_ch2", &node); 
result = asn1_der_decoding (&node, data, data_size, errorDescription); 
if(result != ASN1_SUCCESS) { asn1_perror (result); printf("Decoding error = \"%s\"", errorDescription); return -1; } 

return 0; 
} 

인코딩은 인코딩 된 데이터가 미세하다 : t1 = 1234위한 02 02 04 d2. 그러나 디코딩은 실패합니다.

asn1_der_decoding (...)의 결과는 ASN1_DER_ERROR이고 errorDescription은 비어 있습니다.

Test_ch2와 같은 구성이 다른 구조 (SET, SEQUENCE 또는 기타) 내부에있는 경우 정확히 같은 오류가 표시됩니다 (예 : GeneralNameRFC 5280 (Name의 경우)).

왜 자체 인코딩 된 데이터를 거부합니까? 여기서 뭐가 잘못 됐니?

답변

0

좋은 소식, 모두들! 이 문제는 마침내 버그 git repository에 수정 된 것으로 판명되었습니다. 그리고 메모 : 1 년 미만. :)

Nikos Mavrogiannopoulos에게 감사드립니다.

0

+0

ASN.1 컴파일러는 좋은 일이지만 ASN.1 파일이 변경되면 다시 컴파일해야합니다. 소스가 변경되므로 큰 프로젝트를 유지하기가 어려워집니다. 그래서 우리는 대신 libtasn1을 사용하기로 결정했습니다. – zorgit