BER-TLV

HU·2021년 10월 22일
0

Smart Card

목록 보기
1/2

T L V

  • Tag Length Value: 구조화된 3개의 필드 요소(Tag, Length, Value)로 구성된 이기종 시스템 상호간 통신을 위한 데이터 표현한 방식이다.

  • 인코딩 방법에는 아래와 같이 있으며, 셋 차이는 큰 차이가 없다고들 한다.
    BER(Basic Encoding Rules)
    DER(Distinguished Encoding Rules)
    CER(Canonical Encoding Rules) 등


필자는 BER-TLV를 기준으로 parsing하는 소스를 만들며 학습했다.

Parsing(구문 분석)을 해보자.

입력 값으로 16진수 문자열이 주어지면 이를 파싱해서 Tag, Length, Value로 나누는 방법을 알아보자.

※ 문자열에서 두 글자씩 하나의 문자(1 byte)로 본다.

ex) 3F0A0B0123456789101112131415 라는 16진수 문자열이 주어진다면,
3F 0A 0B 01 23 45 67 89 10 11 12 13 14 15 -> 총 14 byte라고 보면 된다.


1. TAG 구하는 방법

3F0A0 0123456789101112131415 라는 16진수 문자열이 주어진다면 가장 첫 1 byte가 TLV의 Tag가 된다.
그러나 여기서 Tag가 끝나는 것이 아니라 다음 요건에 따라 Tag가 더 늘어날 수 있다.
해당 요건은 다음 이미지를 보면서 설명하겠다.

이미지 출처

Tag를 구하면서 우리가 판별해야할 것은 두 가지이다.

  • Primitive data, Constructed data Object 중 무엇인지 판별
  • subsequent byte가 추가적으로 존재하는지 여부 확인

위 이미지와 대조하기 쉽도록 16진수의 문자 '3F'를 2진수로 변환하면 00111111 이다. 이것을 위 이미지에 적혀있는 b8~b1에 있는 숫자를 참고해보자.

첫 번째로 Primitive 또는 Constructed 중 무엇인지 판별하기 위해 b6에 있는 값만 확인하면 된다.
3F의 2진수 00[1]11111의 대괄호 안에 있는 값이 1이므로 이미지의 이는 Constructed data object에 해당한다.

  • Primitive: Tag Length Value 한 줄 그대로 출력된다.
  • Constructed: Tag Length는 그대로이지만 Value가 또 하나의 TLV 구조가 되는 형태이다.
    Primitive & Constructed data object를 출력하는 부분은 더 아래에서 출력부를 보며 부연 설명하겠습니다.

마찬가지로 3F의 2진수에서 001[11111] 이 겹치므로 이는 subsequent bytes에 해당한다.
기본적으로 tag는 1 byte지만 subsequent일 경우 1 byte가 더 늘어난다. 그래서 '3F' 다음 '0A'도 기존의 태그에 덧붙여서 '3F0A'가 된다. 그러나 여기서 끝이 아니다.
Another byte가 있는지 여부를 확인해서 tag가 더 늘어날 수 있는지 마지막으로 확인한다.

이미지 출처

3F에 덧붙였던 0A의 2진수 [0]0001010 에서 가장 앞자리를 이미지의 b8 열과 비교해보니 Last tag byte에 해당하므로 태그는 '0A'를 마지막으로, 더 붙일 필요가 없어졌다. 이로써 Tag는 '3F0A'가 된다.


2. Length 구하는 방법

Length는 앞선 Tag 구하는 것보다 훨씬 간단하다. 그저 Tag 다음 1 byte가 Length가 된다.
고로 Length는 '0B'이다.


3. Value 구하는 방법

value는 Length의 길이 만큼 잘라낸 값이 된다.
Length의 값이 '0B'이면 이를 10진수로 변환한 값은 11이 된다. 이를 11 byte라고 보고,
Tag와 Length를 뺀 나머지 16진수 문자열('0123456789101112131415')을 11 byte 만큼 잘라낸다.
01 23 45 67 89 10 11 12 13 14 15 까지 잘라지며, 이 값이 value가 된다.


분석한 Tag, Length, Value 값들을 나열하여 출력

Tag: '3F0A', Length: '0B', Value: '01234567891012131415' 이고 이를 띄워써주면 되는데,

태그의 data Object가 primitive였으면

3F0A    0B    01234567891012131415

와 같이 출력되어야 하지만

Constructed이므로 아래처럼 출력된다.

3F0A    0B
        01    23    4567891012131415...(총 35 byte의 value)

value가 딱 잘라 끊기지 않고 나머지가 있으면 해당 값들을 기본적으로 primitive로 보고 가장 첫 1 byte를 태그로, 마찬가지로 Primitive / Constructed 인지 판별 후 subsequent, another byte 유무 확인하며 나머지 value가 없어질 때까지 구문 분석을 진행하면 된다.

profile
지식 쌓기

0개의 댓글