프로그래밍/ASN.1

ASN.1 기초

보니아빠 2018. 11. 22. 11:14

ASN.1은 추상적인 구문 표기법 1(Abstract Syntax Notation One)을 의미.

ASN.1은 특정 프로그래밍 언어와 독립적으로 복잡한 데이터 구조를 설명 할 수 있음. ASN.1 컴파일러는 이러한 추상적으로 지정된 구조에 대한 규격을 만족하는 각각의 대상 언어 (C, C ++, Java) 로 된 Native한 파일 세트를 생성하고 변환을 수행 할 코드를 생성해 줌 (구조체가 네트워크를 통해 전송되거나 외부 매체에 쓰여지는 경우 사용할 수 있음).

ASN.1 용으로 개발 된 여러 데이터 인코딩이 존재.

가장 널리 사용되는 것은 BER (Basic Encoding Rules), CER (Canonical Encoding Rules), DER (Distinguished Encoding Rules), PER (Packed Encoding Rules) 및 XER (XML Encoding Rules).

컴퓨터간에 특정 구조를 전송하려고 한다고 가정. 이 구조에는 문자열 태그, 두 개의 정수 값 (두번째는 선택 사항임) 및 부동소수점 값 집합이 포함되어 있음. 이 구조는 다음과 같이 ASN.1 표기법을 사용하여 표현 가능.

CertainStructure ::= SEQUENCE {
                tag     VisibleString,
                val1    INTEGER,
                val2    INTEGER   OPTIONAL,
                reals   SET OF REAL
}

위 표현은 asn1c 컴파일러로 처리 시, asn 컴파일러는 다음과 같은 헤더를 포함하는 C 언어 파일을 생성.

typedef struct CertainStructure {
                VisibleString_t  tag;
                long             val1;
                long            *val2;        /* OPTIONAL */
                A_SET_OF(double) reals;
} CertainStructure_t;

이러한 유형의 변수 내용은 직접 처리될 수 있음. 그러나 이 복잡한 구조를 일련의 바이트로 변환하는 직렬화 및 비 직렬화 프로세스가 중요.

네트워크에서 이러한 구조를 수신하여 편집 한 다음 다시 컴팩트 이진 인코딩으로 변환하는 방법은 다음과 같음

CertainStructure_t *cs = 0; ber_decode(0, &asn_DEF_CertainStructure, &cs, buffer, buffer_length); cs->val1 = 123; /* Modify the contents */ der_encode(&asn_DEF_CertainStructure, cs, write_handle, 0);

그리고 이 구조체의 내용을 XML 형식으로 출력하는 방법은 다음과 같음

xer_fprint(stdout, &asn_DEF_CertainStructure, cs);

다음은 xer_fprint()를 통해 생성한 예제임.

<CertainStructure>
       <tag>This is a random tag</tag>
       <val1>123</val1>
       <reals>
              <REAL>3.14159265</REAL>
              <REAL><MINUS-INFINITY/></REAL>
              <REAL>2.7182818284</REAL>
       </reals>
</CertainStructure>

ASN.1 표기법은 통신망 산업의 MMS (멀티미디어 서비스) 및 텔레콤 장비 CDR (Call Data Records), TAP3 (Transferred Account Procedure), 보안 프로토콜 및 데이터 형식 (PKIX/X.509) 및 기타 High-profile 애플리케이션을 포함하여 광범위하게 사용됨. SSL (HTTPS)을 사용하여 은행 또는 이메일 계정에 액세스하는 경우 ASN.1도 포함되어 있음.