이번에는 Session Layer(흔히 세션 계층이라 부름) 에서의 데이터의 흐름을 분석할 때, 반드시 알아야만 하는 것들에 대해 적었다.
세션 계층은 상위 리소스 계층과 아래 전송 계층 사이에서 데이터를 주고 받게 하는 역할을 한다.
또한 하부에서 올라오는 데이터들이 어느 리소스로 보낼 것인가를 결정한다. 모든 리소스는 POD 의 요구에 의해 OPEN 되어 지고, 시스템에서는 요구된 리소스의 OPEN 가능한가에 대한 응답을 보낸다. 이것 역시, 여러개의 Object Tag 가 존재한다.
세션 계층에서 주고 받는 SPDU 의 기본 스펙은 다음과 같다.
| spdu_tag | length_field | sess_obj_value | data_field made of apdu |
위의 표에서 spdu_tag, length_field, sess_obj_value 가 Session 헤더부분이다. 나머지 부분이 Body 이다.
SPDU 는 크게 두 부분으로 나눌 수 있다.
| spdu_tag | tag_value | 방향 |
| Topen_session_request | 91 | POD → HOST |
| Topen_session_response | 92 | HOST → POD |
| Tcreate_session | 93 | HOST → POD |
| Tcreate_session_response | 94 | POD → HOST |
| Tclose_session_request | 95 | POD ↔ HOST |
| Tclose_session_response | 96 | POD ↔ HOST |
| Tsession_number | 90 | POD ↔ HOST |
| syntax | no.of bits | Mnemonic |
| open_session_request_tag | 8 | uimsbf |
| length_field = 4 | ||
| resource_identifler() |
위에 resource_identifler() 을 설명하자면, 총 4 byte 로 이루어져 있다. 이것은 아래와 같이 나뉘어져 있는 데, 가장 처음의 resource_id_type 의 값이 0,1,2 이면 public resource 이고, 3 이면 private resource 이다. resource_type 의 값은 0 이다.
| syntax | no.of bits | Mnemonic |
| resource_id_type | 2 | uimsbf |
| if(resource_id_type !=3){ | ||
| resource_class | 14 | uimsbf |
| resource_type | 10 | uimsbf |
| resource_version | 6 | uimsbf |
| }else{ | ||
| private_resource_definer | 10 | uimsbf |
| private_resource_identity | 20 | uimsbf |
| syntax | no.of bits | Mnemonic |
| open_session_response_tag | 8 | uimsbf |
| length_field()=7 | 8 | uimsbf |
| session_status | 8 | uimsbf |
| resource identifler() | ||
| session_nb | 16 | uimsbf |
위의 스펙에서 session_status 에 대한 설명이다. 현재 세션의 상태를 나타낸다.
| session status | session_status value(hex) |
| session is opened | 00 |
| session not opened,resource non-existent | F0 |
| session not opened,resource exists but unavailable | F1 |
| session not opened, resource exists but version lower than requested | F2 |
| session not opened, resource busy | F3 |
| other | reserved |
resource_identifler : 현재의 버전 넘버와 함께 요청되어지는 리소스의가 실제의 리소스 인지 알려준다. 만일 응답이 '리소스는 존재하지 않음' 이라면, resource_identifler field 는 open 을 요청하게 될 것이다.
session_nb : 숫자는 호스트의 요청된 세션에 의해 정해진다. 값은 0 이 예약되어 있다. session_nb 는 차후에 세션이 닫힐 때까지의 리소스와 모듈 사이의 APDU 의 교환에 사용된다.
세션을 열지 못할 때(session_status 값이 0 이 아닐때), session_nb 는 아무 것도 아니다.
| syntax | no. of bits | Mnemonic |
| create_session_tag | 8 | uimsbf |
| length_field()=6 | ||
| resource_identifler() | ||
| session_nb | 16 | uimsbf |
resource_identifier : 이 것은 현재의 버전 넘버와 함께 성공한 것과 리소스를 요청한 것에 대한 resource_identifier 이다.
session_nb : 이 것은 새로운 세션의 호스트에 의해 정해진 session number 이다.
| syntax | no.of bits | Mnemonic |
| create_session_response_tag | 8 | uimsbf |
| length_field()=7 | ||
| session_status | 8 | uimsbf |
| resource_identifier() | ||
| session_nb | 16 | uimsbf |
session status values : open_session_response 의 내용과 같다.
resource_idenitfier : 모듈에 create_session_response class 와 요청된 리소스의 타입이 들어가 있다. 하지만 현재 제공되는 모듈의 버전 넘버는 들어가 있지 않다.
session_nb : 위의 create_session 의 session_nb 값과 동일 하다.
| syntax | no.of bits | Mnemonic |
| close_session_request_tag | ||
| length_field()=2 | ||
| session_nb | 16 | uimsbf |
| syntax | no.of bits | Mnemonic |
| close_session_response_tag | 8 | uimsbf |
| length_field()=3 | ||
| session_status | 8 | uimsbf |
| session_nb | 16 | uimsbf |
위의 스펙에 있는 session_status 을 설명하려면, 다음의 표를 봐야 한다.
| session status | session_status value |
| session is closed as required | 00 |
| session_nb in the request is not allocated | F0 |
| other | reserved |
이 오브젝트는 항상 APDU 가 포함된 SPDU 의 body 앞에 있다.
| ssyntax | no.of bits | Mnemonic |
| session_number_tag | 8 | uimsbf |
| length_field()=2 | ||
| session_nb | 16 | uimsbf |
이 세션 계층은 가장 먼저 모듈에서 시작이 된다. 처음, 모듈에서 Topen_session_request 신호를 보내면, 호스트의 세션 계층에서 파싱을 한다. 이 계층은 파싱하는 것이 주 업무이다.
각각의 object_tag 를 보고, 어떻게 처리할지 결정한다.
총 4 가지의 루틴이 있는 데, 가장 먼저 open_session_request 에 대한 것이다. 호스트에서의 세션 계층은 모듈로 받은 데이터를 파싱해서 open_session_open 의 신호이면, 이 루틴이 가장 먼저 수행된다.
여기서는, 모듈의 신호에 대한 응답으로 open_session_response 를 내보낸다. 또한 세션이 open 되어 있다면, 바로 application 으로 보낸다.
이번에는 close_session_request 에 대한 것이다. 가장 먼저, 현재 열려 있는 윗단의 application 을 닫는다. 또한 이 신호에 대한 응답으로 close_session_reponse 신호를 내보낸다.
close_session_response 에 대한 것이다. 현재 세션의 상태를 확인한 뒤에, ssnb 를 지우고, 더 보낼 데이터가 있다면, T_RCV 신호를 보내고, 없다면, T_DATA_LAST 신호를 보낸다.
마지막으로 session_nb 에 대한 것이다. malloc 함수로 size 를 잡고, 보낼 데이터와 크기를 넣어서, 상위, 리소스 계층으로 보낸다.
이번에는 간단하지만 make_SPDU 에 대해서 알아보자!!
스펙에 나온 그대로, 메모리를 잡아서 , tag , length_field, 등등을 넣어서 전송 계층으로 보낸다.