2018년 12월 21일 금요일

BouncyCastle - ASN.1 살펴보기

 개요

BouncyCastle에서 전체 프로그램 구조를 살펴보다 보면, 가장 먼저 눈에 띄며 가장 전체적으로 참조가 많은 부분이 (소스코드 내부에서 ) ASN.1Crypto 라는 두개의 Namespace 입니다. 이 두 Namespace를 분석하기 전에 첫번째 항목인 ASN.1에 대해서 가볍게 살펴 보도록 하겠습니다.


ASN.1 이란?

Abstract Syntax Notation One의 줄임말로, 추상적 구문 구조를 기술하는 언어입니다.
좀 더 자세히 이야기 하면, 다양한 환경(하드웨어, OS, Platform)에 의존성이 없는 데이터 구성 / 정의에 대한 추상적 언어라는 의미입니다.


ASN.1의 특징



- 추상적인 기본 데이터 양식을 통해 다양한 데이터를 정의하는 것이 가능
- 비트 단위의 Encoding 방식에 대한 정의로 인해 개발자가 확장하기 용의하지 않음
- 추상적인 개념이기 때문에 실제 전송을 위해서는 별도의 실제 Encoding / Decoding 작업이 필요함.
관련 표준안 : ISO 8824 (ASN.1 문법 자체에 대한 내용)
ISO 8825 (추가 Encoding /Decoding)


참고 URL : https://www.itu.int/en/ITU-T/asn1/Pages/introduction.aspx


ASN.1 사용 예



* 공인인증서의 저장
* SNMP의 정보기술 및 Syntax 정의
* H.323의 인코딩 규칙 정의


ASN.1의 간략한 문법 소개

Module 선언 방식




모듈 명칭 {OBJECT IDENITIFIER} DEFINITIONS ::=
BEGIN
{
Type 선언
}
END

Type 선언 방식



Simple Type(ENUMERATED 제외) 일때,
변수명 ::= Type


구조 Type 일때(ENUMERATED 포함) 일때,
변수명 ::= Type {
Sub변수명1 SubType1,
}
공통 규칙은 한줄에 하나씩 선언한다는 것입니다.
값의 할당에 대한 예시는 각 Simple Type에서 설명하고 있습니다. 아래는 예는 모듈을 선언하고 그 안에 필요한 데이터 구조를 선언한 예시입니다.


모듈 선언 예시)
InventoryList {1 2 0 0 6 1} DEFINITIONS ::=
BEGIN
{
ItemId ::= SEQUENCE
{
partnumber IA5String,
quantity INTEGER,
wholesaleprice REAL,
saleprice REAL
}
StoreLocation ::= ENUMERATED
{
Baltimore (0),
Philadelphia (1),
Washington (2)
}
}
END



Simple Type

* BOOLEAN
일반적인 언어에서의 Boolean 값과 같습니다.
사용 예 ) isOpen BOOLEAN ::= TRUE
* INTEGER
일반적인 언어에서의 Integer와 같습니다.
사용 예 ) qty INTEGER (0..60) ::= 40
* BIT STRING
→ 일반적인 프로그램에서의 bitmask와 같습니다. 각 비트의 위치에 이름을 붙인다고 생각하시면 쉽습니다.
사용 예) Sensors ::= BIT STRING {
doorOpen(0),
windowOpen(1),
engineOn(2)
}
status Sensors ::= {windowOpen,engineOn}


* OCTET STRING
8의 배수가 되는 bit수를 가진 binary 데이터를 표현하는 데이터입니다.
사용 예) MybinaryFile ::= OCTET STRING
* DATE
날짜에 대한 표현하는 형식으로 “YYYY-MM-DD” 양식으로 정의된 문자열 입니다.
사용 예) duDate DATE ::= “2018-11-11”
* TIME-OF-DAY
→ 시간을 표현하는 형식으로 “HH:MM:SS” 양식으로 정의된 문자열 입니다. 시간은 24시간 표시를 따릅니다.
사용 예) calledTime TIME-OF-DAY ::= “18:30:24”
* DATE-TIME
년월일시를 표현하는 형식이며, “YYYY-MM-DDTHH:MM:SS” 양식을 따릅니다.
사용 예) calledTime DATE-TIME ::= “2018-11-11T15:30:10”
* REAL
→ 10
진수 표시가 필요할 때 사용.
사용 예) Total ::= REAL
* ENUMERATED
→ 프로그램 언어에서의 Enum과 비슷한 개념이며, 반드시 시작 문자는 소문자여야 합니다.
사용 예) CarColors ::= ENUMERATED {black, red, white}
myCar CarColors ::= white
* OBJECT IDENTIFIER
세계적으로 고유한 식별자가 필요할 때 사용됩니다.( 미리 정의된 값들입니다. 대부분의 경우) 아래의 예는 미국의 최상위 인증기관을 의미합니다.
사용 예) {joint-iso-itu-t(2) country(16) us(840) organization(1)}
* IA5String
→ ASCII
와 제어문자가 포함된 문자열을 표현합니다.
* VisibleString
→ 제어문자를 제외한 ASCII 문자열을 표현합니다.
* NumericString
숫자와 Space만을 포함한 문자열을 표현합니다.
* UTF8String
UTF8Unicode 문자열을 표현합니다.
* NULL
→ 일반 언어에서의 NULL과 비슷한 개념입니다. 이후에 나오는 CHOICE에서 대체용으로 사용되거나, SEQUENCE 형식에서 선택적 컴포넌트를 지시합니다.


구조Type



* SEQUENCE
→ item
을 그룹으로 묶은 형태입니다. 보통의 다른 언어에서는 구조체와 같은 개념입니다. 내부적으로 Item들을 정렬합니다.(Spec 참고)
사용 예)
Contact ::= SEQUENCE {
name VisibleString,
phone NumericString
}
driver Contact ::= {name "J.Smith", phone "7325555555"}
* SEQUENCE OF
item이 반복되는 형식입니다. 프로그램 언어의 배열과 비슷한 개념입니다. 내부적으로 Item을 정렬합니다.
사용 예)
breakTimes SEQUENCE OF TIME-OF-DAY ::= {"10:00:00", "12:00:00", "14:45:00"}
* CHOICE
→ 기본적으로 다양한 아이템을 가지지만 한번에 하나의 아이템 만을 표현 할 수 있는 형식입니다.
사용 예)
Location ::= CHOICE {
streetAddress Address,
intersection Intersection,
landmark LandMarkName,
gpsCoordinates GpsInfo
}
meetAt Location ::= landmark: "Statue of Liberty"


사용이 중지된 타입



여러가지 이유로 아래의 타입들은 사용이 중지되었습니다.
* UTCTime
→ 2
자리 연도의 사용으로 세기의 구별이 모호해져 사용이 중지되었습니다.
* GeneralizedTime
→ TIME
형식의 등장으로 사용이 중단되었습니다.
* GraphicString, TeletexString
특정한 Charset을 지원하기 위한 Type이었으나, UTF8String이나 UniversalString과 같은 Type의 등장으로 사용 중지되었습니다.
* SET, SET OF
→ 객체가 발송될때의 순서가 그대로 유지되는 여부를 제외하고는 SEQUENCE,SEQUENCE OF와 동일하며, 순서가 보장되지 않기때문에 Encoding/Decoding에 드는 비용이 올라가고, 검증을 위해서 너무 복잡해지며, 일부 Encoding/Decoding에서는 반드시 순서를 다시 정리해야 하는 여러가지 이슈가 있어서 사용이 중지되었습니다.


ASN.1 Encoding 규칙 (Encoding Rules)

앞에서 소개한 바와 같이 ASN.1은 추상적인 데이터 정의언어이기 때문에, 물리적 전송계층에 그대로 반영할 수는 없습니다. 이렇게 정의된 언어를 물리적 데이터로 변환하는 방법이 Encoding 규칙 입니다. 다음과 같은 Encoding 규칙이 존재합니다. 개별적인 상세 내용들은 앞에 언급된 참조 문헌을 살펴보시기 바랍니다. 간단하게 특징을 정리하였습니다.


* BER(Basic Encoding Rules)
가장 오래된 구성 방식으로, Tag-Length-Value의 순으로 데이터를 Encoding 합니다.
이 전송방식은 기본적인 형태이며 실제로는 DER,CER로 구현됩니다.
* DER(Distinguished Encoding Rules)
→ BER
Subset입니다. Element마다 TLV 형태의 값이 반복됩니다. DERX.509 인증서에 사용됩니다.
데이터가 많아지면 메타 데이터가 커집니다.
* CER(Canonical Encoding Rules)
→ BER
Subset 입니다. 길이를 알려주는 대신 데이터의 끝을 알려줍니다.
* OER(Octet Encoding Rules)
→ 가장 빠른 Encoding 규칙입니다. 8Bit 단위로 각 데이터의 엘리먼트를 처리하기 때문에 계산의 복잡도가 높지 않아 속도가 빠름니다.
* PER(Packed Encoding Rules)
가장 간단한 Encoding 규칙입니다. 고정된 값인 경우 TLV를 제거하여 전송량이 적습니다.
실제로 LTE등에 사용됩니다.
* XER(XML Encoding Rules), E-XER(Extended-XER)
→ XML
형식의 Encoding 규칙 입니다. E-XERXSD를 적용하기 쉽다는 차이점이 있습니다.
* JER(JSON Encoding Rules)
JSON 형식의 Encoding 방식입니다. XER이나 E-XER에 비해 더 사용하기 쉽습니다.
Debug
를 하거나 문제점을 파악하기에 용이합니다.


다음에는 개별 단위테스트를 통해 실제 소스를 살펴보도록 하겠습니다.



댓글 1개:

참고: 블로그의 회원만 댓글을 작성할 수 있습니다.

쿠버네티스 네트워크 정리

본 문서는 쿠버네티스의 공식문서( https://kubernetes.io/docs/concepts/cluster-administration/networking/ )의 일부를 번역하고 링크를 정리하여 붙이는 것에서 시작한 문서입니다. 일부 링크는 ...