퀄컴 QSEE 개발(ca part)

2020. 4. 4. 09:23Security ★ Development/안드로이드 모바일 보안

반응형

모바일 ap로 많이 쓰이는 퀄컴의 칩셋에는 qsee(qualcomm secure execution environment)라는 trustzone이 지원됩니다.  Secure world라고 하며 normal world에서 동작하는 기존 os보다 보안이 필요한 기능을 동작시킬때 주로 사용됩니다.

qsee외에도 mobicore의 kinibi, 삼성의 teegris가 있습니다. 

 

NWd와 SWd

 

우선 qsee에서 동작하는 trusted application을 개발해야 하며 이와 상호작용하는 client application이 있어야 합니다.

ca는 nwd에서 동작하는 기존의 app과 같은 것이 있을 수 있고 kernel영역의 드라이버 형태로 구현될 수도 있습니다.

 

NWd에서 ca를 개발하려면 qsee에서 제공하는 library, 헤더 파일이 필요합니다.  qsee는 ta와 동작하기 위한 ca에서 사용할 library를 제공해주며 보통 이름은 libQSEEComAPI.so이고 헤더파일은 QSEEComAPI.h입니다.

커널영역에서도 비슷하며 qualcomm의 지원정책에 따라 smc를 사용하는 더 낮은 수준의 api를 이용해야 할 때도 있습니다.

 

https://android.googlesource.com/platform/hardware/qcom/keymaster/+/master/QSEEComAPI.h

검색해보면 여기 google git에서와 같이 헤더파일 내용은 쉽게 볼 수 있습니다만 qsee 버전에 따라 달라지니 칩셋 및 지원하는 qsee 버전에 맞는 라이브러리, 헤더파일을 사용해야 합니다.  퀄컴과 계약을 맺고 qsee를 지원하는 칩셋을 사용하는 경우 공식적으로 지원받을 수 있습니다.

 

보통 ca와 ta는 같이 쌍으로 개발하게 되며 본인이 개발한 ta를 여러 third party ca가 사용하는 경우에도 qsee lib을 한번 wrapping한 api를 ca한테 제공해주게 됩니다.  또한 여러 tz를 지원할 수 있는 경우에는 각 tz api를 지원 할 수 있도록 daemon을 추가해줍니다.

 

헤더파일에 잘 설명이 되어있지만 몇몇 api를 보겠습니다.

 

TA load

int QSEECom_start_app(struct QSEECom_handle **clnt_handle, const char *path, const char *fname, uint32_t sb_size)

처음 TA를 load할 때 쓰이며 보통 같은 ta를 사용한다고 해도 여러 ca에서 여러 ta를 호출하진 않고 하나의 ta를 사용합니다. 

clnt_handle : 이 함수를 통해 리턴받는 핸들러로 아래 함수들을 호출할 때 사용됩니다.

path : ta image가 있는 path입니다. 

fname : ta image이며 보통 .mdt 형식의 파일입니다.

sb_size : ca와 ta가 주고받을 때 사용할 shared buffer의 크기를 지정하는 것으로 보통 QSEECOM_ALIGN을 이용해서 send buffer size+receive buffer size로 맞춰줍니다.

 

Data send

int QSEECom_send_cmd(struct QSEECom_handle *handle, void *send_buf, uint32_t sbuf_len, void *rcv_buf, uint32_t rbuf_len)

실질적으로 ta에 데이터를 보내고 받을 때 사용됩니다.

 

int QSEECom_set_bandwidth(struct QSEECom_handle *handle, bool high)

Hardware 기반 crypto 연산 api를 ta에서 사용하는 경우 호출하는 것으로 performance를 올려줍니다.  send_cmd를 호출하기 전에 true로 불러주고, 호출 후 false로 꺼주는 방식으로 사용합니다.

 

TA unload

int QSEECom_shutdown_app(struct QSEECom_handle **handle)

TA사용이 끝나고 종료할 때 호출합니다.  보통 TA는 하나만 떠있으며 여러 ca가 사용할 때도 같은 TA를 여러개 띄우지 않습니다.  reference counter 등을 이용해서 ta가 떠있는지 관리하게 됩니다.

 

위 4개의 API면 ca와 ta의 기본적인 동작은 대부분 가능합니다.