8.1 Cryptographic Acceleration and Assurance Module (CAAM)
8.1.1 CAAM Device Driver Overview
이 섹션에서는 Linux 커널 내에서 CAAM(Cryptographic Acceleration and Assurance Module)을 지원하는 커널 드라이버 컴포넌트의 구현 세부 사항에 대해 설명한다.
CAAM의 기본 드라이버 패키징은 두 가지 레벨로 분류할 수 있다:
- 구성과 작업의 실행 레벨
- API 인터페이스 레벨
구성과 작업의 실행 레벨은 다음으로 구성된다:
- 기본 레지스터 페이지를 매핑하고 전역 또는 시스템 필수 구성 정보를 작성하는 컨트롤과 구성 모듈
- 작업 링을 통해 작업을 공급하고 상태를 보고하는 모듈
API 인터페이스 레벨은 다음으로 구성된다:
- 비동기 단일 패스 인증 암호화 작업과 일반적인 블럭 암호인 caamalg를 지원하는 Sctterlist Crypto API에 대한 인터페이스
- 비동기 해시인 caamhash를 지원하는 Scatterlist Crypto API에 대한 인터페이스
- Random Number Generator인 caamrng의 사용을 지원하는 hwrng API에 대한 인터페이스
8.1.2 Configuration and Job Execution Level
이 섹션은 두 부분으로 구성된다:
- Control/Configuration Driver (컨트롤/구성 드라이버)
- Job Ring Driver (작업 링 드라이버)
8.1.3 Control/Configuration Driver
컨트롤/구성 드라이버는 마스터 레지스터 페이지의 초기화와 설정, early-on 초기화 기능의 초기화, 제한된 디버그와 모니터링 기능의 제공 그리고 일반적으로 다른 모든 종속 드라이버 서브 시스템이 올바르게 구성된 디바이스에 연결할 수 있도록 보장한다.
시작 시, 단계별로 아래 작업을 수행한다:
- 이 레벨에 대한 비 공개(private) 스토리지 블럭을 할당한다.
- 가상 주소를 전체 CAAM 레지스터 페이지에 매핑한다.
- SNVS 레지스터 페이지의 가상 주소를 매핑한다.
- Secure Memory의 가상(캐시 일관성) 주소를 매핑한다.
- 보안 위반 인터럽트를 등록한다.
- 플랫폼에 대한 올바른 DMA 주소 크기를 선택하고, 일치하도록 DMA 주소 마스크를 설정한다.
- 다른 적절한 인터럽트 연결을 식별한다.
- 모든 작업 링 인스턴스를 초기화한다.
- 시스템 구성에 DPAA Queue Interface를 포함한 경우, 해당 인터페이스는 frame-pop이 활성화되어 있다.
참고: i.MX 6 구성에는 이 로직이 포함되어 있지 않다. - 인스턴스에 TRNG가 포함되어 있는 경우, oscillator/entropy 구성이 설정된 다음 "kickstarted"된다.
- 구성 정보는 시스템 콘솔로 전송되어, 드라이버가 활성 상태이고 드라이버가 어떤 구성을 사용했는지를 나타낸다.
- CONFIG_DEBUG_FS가 커널 구성에서 선택되면, 성능 모니터의 유용한 레지스터에 debugfs 보기를 사용할 수 있도록 항목이 추가된다. 레지스터 보기는 debugfs 루트 항목의 caam/ctl 디렉토리에서 액세스할 수 있다.
8.1.4 Job Ring Driver
Job Ring 드라이버는 상위 레벨 드라이버에 작업 실행 서비스를 제공하는 역할을 한다. 입력과 출력 링의 전반적인 관리와 출력 링을 구동하는 인터럽트 서비스를 처리한다.
상위 레이어에서 실행을 위해 링에 작업을 큐에 넣는데 사용할 수 있는 드라이버 호출은 아래와 같다:
int caam_jr_enqueue(struct device *dev, u32 *desc, void (*cbk)
(struct device *dev, u32 *desc, u32 status, void *areq), void *areq);
Arguments:
dev 사용할 작업 링과 연결된 struct device에 대한 포인터이다. 현재 구성에서, 컨트롤러의 비 공개(private) 데이터 블록에 하나 이상의 struct device 항목이 각 링에 대해 하나씩 존재한다.
desc 실행할 CAAM 작업 디스크립터에 대한 포인터이다. 드라이버는 실행 전에 디스크립터를 매핑하고 완료 시 매핑을 해제한다. 그러나 드라이버는 디스크립터가 참조하는 데이터에 대해 합리적으로 알 수 없기 때문에, 제출 전에 이 데이터를 map/flush하고 요청이 완료된 후 데이터를 unmap/invalidate하는 것은 호출자의 책임이다.
cbk 작업 처리를 완료했을 때, 호출될 콜백 함수에 대한 포인터이다.
areq 이 요청관 관련된 메타데이터 또는 컨텍스트 데이터에 대한 포인터이다. 종종 여기에는 요청 후처리(콜백을 통해)가 완료되면, 리소스를 정리하거나 해제하는 데 사용할 수 있는 참조된 데이터 매핑 정보가 포함될 수 있다.
Callback Function Arguments:
dev 사용할 작업 링과 연결된 struct device에 대한 포인터이다.
desc 실행을 위해 제출된 원래의 디스크립터에 대한 포인터이다.
status 요청을 실행한 CAAM DECO에서 받은 완료 상태이다. 오류가 발생한 경우에만 0이 아니다. 각 오류를 설명하는 문자열은 error.c에 열거되어 있다.
areq 원래의 요청에 전달된 메타데이터/컨텍스트 포인터이다.
Returns:
- 0 성공적인 작업 제출
- -EBUSY 입력 링이 가득찬 경우
- -EIO 드라이버 작업 디스크립터를 매핑할 수 없는 경우
8.1.5 API Interface Level
CAAM 모듈은 일반적인 대칭 암호화와 단일 패스 인증 암호화 서비스에 대해 Scatterlist Crypto API를 통한 연결을 제공한다. 이 테이블에는 설치된 모든 인증-암호화 알고리즘이 일반적인 이름, 드라이버 이름과 용도별로 나열되어 있다. i.MX 6과 같은 특정 플랫폼에는 SHA384 또는 SHA512를 지원할 수 없는 저전력 MDHA 가속기가 포함되어 있다.
Name | Driver Name | Purpose |
---|---|---|
authenc(hmac(md5),cbc(aes)) | authenc-hmac-md5- cbc-aes-caam |
MD5와 AES-CBC를 사용하는 단일 패스 인증/암호화 |
authenc(hmac(sha1),cbc(aes)) | authenc-hmac-sha1- cbc-aes-caam |
SHA1와 AES-CBC를 사용하는 단일 패스 인증/암호화 |
authenc(hmac(sha224),cbc(aes)) | authenc-hmac- sha224-cbc-aes- caam |
SHA224와 AES-CBC를 사용하는 단일 패스 인증/암호화 |
authenc(hmac(sha256),cbc(aes)) | authenc-hmac- sha256-cbc-aes- caam |
SHA256와 AES-CBC를 사용하는 단일 패스 인증/암호화 |
authenc(hmac(sha384),cbc(aes)) | authenc-hmac- sha384-cbc-aes- caam |
SHA384와 AES-CBC를 사용하는 단일 패스 인증/암호화 |
authenc(hmac(sha512),cbc(aes)) | authenc-hmac- sha512-cbc-aes- caam |
SHA512와 AES-CBC를 사용하는 단일 패스 인증/암호화 |
authenc(hmac(md5),cbc(des3_ede)) | authenc-hmac-md5- cbcdes3_ede-caam |
MD5와 Triple-DES-CBC를 사용하는 단일 패스 인증/암호화 |
authenc(hmac(sha1),cbc(des3_ede)) | authenc-hmac-sha1- cbc-des3_ede-caam |
SHA1와 Triple-DES-CBC를 사용하는 단일 패스 인증/암호화 |
authenc(hmac(sha224),cbc(des3_ede)) | authenc-hmac- sha224-cbc-des3_ ede-caam |
SHA224와 Triple-DES-CBC를 사용하는 단일 패스 인증/암호화 |
authenc(hmac(sha256),cbc(des3_ede)) | authenc-hmac- sha256-cbc-des3_ ede-caam |
SHA256와 Triple-DES-CBC를 사용하는 단일 패스 인증/암호화 |
authenc(hmac(sha384),cbc(des3_ede)) | authenc-hmac- sha384-cbc-des3_ ede-caam |
SHA384와 Triple-DES-CBC를 사용하는 단일 패스 인증/암호화 |
authenc(hmac(sha512),cbc(des3_ede)) | authenc-hmac- sha512-cbc-des3_ ede-caam |
SHA512와 Triple-DES-CBC를 사용하는 단일 패스 인증/암호화 |
authenc(hmac(md5),cbc(des)) | authenc-hmac-md5- cbc-des-caam |
MD5와 Single-DES-CBC를 사용하는 단일 패스 인증/암호화 |
authenc(hmac(sha1),cbc(des)) | authenc-hmac-sha1- cbc-des-caam |
SHA1와 Single-DES-CBC를 사용하는 단일 패스 인증/암호화 |
authenc(hmac(sha224),cbc(des)) | authenc-hmac- sha224-cbc-des- caam |
SHA224와 Single-DES-CBC를 사용하는 단일 패스 인증/암호화 |
authenc(hmac(sha256),cbc(des)) | authenc-hmac- sha256-cbc-des- caam |
SHA256와 Single-DES-CBC를 사용하는 단일 패스 인증/암호화 |
authenc(hmac(sha384),cbc(des)) | authenc-hmac- sha384-cbc-des- caam |
SHA384와 Single-DES-CBC를 사용하는 단일 패스 인증/암호화 |
authenc(hmac(sha512),cbc(des)) | authenc-hmac- sha512-cbc-des- caam |
SHA512와 Single-DES-CBC를 사용하는 단일 패스 인증/암호화 |
이 테이블에는 설치된 모든 대칭 키 블럭암호화 알고리즘이 일반적인 이름, 드라이버 이름과 용도별로 나열되어 있다.
Name | Driver Name | Purpose |
---|---|---|
cbc(aes) | cbc-aes-caam | CBC 모드 래퍼를 사용하는 AES |
cbc(des3_ede) | cbc-3des-caam | CBC 모드 래퍼를 사용하는 Triple DES |
cbc(des) | cbc-des-caam | CBC 모드 래퍼를 사용하는 Single DES |
ecb(aes) | ecb-aes-caam | ECB 모드 래퍼를 사용하는 AES |
ecb(des3_ede) | ecb-3des-caam | ECB 모드 래퍼를 사용하는 Triples DES |
ecb(des) | ecb-des-caam | ECB 모드 래퍼를 사용하는 Single DES |
ecb(arc4) | ecb-arc4-caam | ECB 모드 래퍼를 사용하는 ARC4 |
ctr(aes) | ctr-aes-caam | CTR 모드 래퍼를 사용하는 AES |
API를 통한 이러한 서비스의 사용은 커널 소스 트리(crypto/tcrypt.c)에서 볼 수 있는 tcrypt로 알려진, 커널의 암호화 서브 시스템에 있는 일반적인 conformance/performance(적합성/성능) 테스트 모듈에 예시되어 있다.
caamhashmodule은 일반적인 비동기 해시에 대해 Scatterlist Crypto API를 통한 연결을 제공한다.
이 테이블에는 설치된 모든 비동기 해시가 일반적인 이름, 드라이버 이름과 용도별로 나열되어 있다. i.MX 6과 같은 특정 플랫폼은 SHA384 또는 SHA512를 지원할 수 없는 저전력 MDHA 가속기가 포함되어 있다.
Name | Driver Name | Purpose |
---|---|---|
sha1 | sha1-caam | SHA1-160 Hash Computation |
sha224 | sha224-caam | SHA224 Hash Computation |
sha256 | sha256-caam | SHA256 Hash Computation |
sha384 | sha384-caam | SHA384 Hash Computation |
sha512 | sha512-caam | SHA512 Hash Computation |
md5 | md5-caam | MD5 Hash Computation |
hmac(sha1) | hmac-sha1-caam | SHA1-160 Hash-based Message Authentication Code |
hmac(sha224) | hmac-sha224- caam |
SHA224 Hash-based Message Authentication Code |
hmac(sha256) | hmac-sha256- caam |
SHA256 Hash-based Message Authentication Code |
hmac(sha384) | hmac-sha384- caam |
SHA384 Hash-based Message Authentication Code |
hmac(sha512) | hmac-sha512- caam |
SHA512 Hash-based Message Authentication Code |
hmac(md5) | hmac-md5-caam | MD5 Hash-based Message Authentication Code |
API를 통한 이러한 서비스의 사용은 커널 소스 트리(crypto/tcrypt.c)에서 볼 수 있는 tcrypt로 알려진, 커널의 암호화 서브 시스템에 있는 일반적인 conformance/performance(적합성/성능) 테스트 모듈에 예시되어 있다.
caamrng 모듈은 /dev/random을 통해 액세스할 수 있는 한 쌍의 버퍼에 랜덤 데이터를 공급하기 위해 CAAM의 난수 생성기를 사용하는 메커니즘을 설치한다.
/dev/random은 일반적으로 다른 랜덤 데이터 "devices"의 엔트로피 소스로 내부적으로 사용할 수 있는 커널 고유의 엔트로피 풀을 공급하는 데 사용된다.
이 서비스 지원에 대한 자세한 내용은 sourceforge.net/projects/gkernel/files/rng-tools에서 제공되는 rng-tools를 참조한다.
8.1.6 Driver Configuration
드라이버 구성은 아래 커널 구성 파라미터에 의해 컨트롤된다(Cryptographic API -> Hardware Crypto Devices 에서 찾을 수 있음):
CRYPTO_DEV_FSL_CAAM
기본 컨트롤러 드라이버와 작업 링 백엔드 빌드를 활성화한다.
CRYPTO_DEV_FSL_CAAM_RINGSIZE
작업 링의 크기(예: 최대 항목 수)를 선택한다. 이것은 2 ~ 9 범위에서 2의 거듭제곱으로 선택 가능하며 4 ~ 512 항목 범위의 링 깊이를 선택할 수 있다.
기본 선택은 9이며, 링 깊이는 512개의 작업 항목이 된다.
CRYPTO_DEV_FSL_CAAM_INTC
사용률이 높은 기간 동안 시스템에서 발생하는 인터럽트 오버헤드의 양을 줄일 수 있는 하드웨어의 인터럽트 병합(coalescing) 기능을 사용할 수 있다. 이 기능을 비활성화하면 작업이 완료될 때마다 단일 인터럽트가 발생하여 작업이 간소화되지만 오버헤드가 증가한다.
CRYPTO_DEV_FSL_CAAM_INTC_COUNT_THLD
병합(coalescing)이 활성화된 경우, 인터럽트가 발생하기 전에 큐에 허용되는 작업 완료 수를 선택한다. 1 ~ 255 범위 내에서 선택할 수 있다. 1을 선택하면 병합 기능이 무효화된다. 작업 링 크기보다 큰 크기를 선택하면, 인터럽트가 발생하기 전에 인터럽트가 시간 초과되는 상황이 발생한다.
기본 선택은 255이다.
CRYPTO_DEV_FSL_CAAM_INTC_TIME_THLD
병합(coalescing)이 활성화된 경우, 병합 제한 시간 전에 버스 클럭 카운트(64로 나눈 값)를 선택한다. 여기서 카운트 임계값이 충족되지 않으면, 기간이 끝날 때 인터럽트가 발생한다. 선택 범위는 1 ~ 65535의 정수이다.
기본 선택은 2048이다.
CRYPTO_DEV_FSL_CAAM_CRYPTO_API
가속을 위해 CAAM 하드웨어를 사용하는 API로 비동기 블럭 암호화와 단일 패스 인증 암호화 작업에 대한 Scatterlist Crypto API 지원을 활성화한다.
CRYPTO_DEV_FSL_CAAM_AHASH_API
가속를 위해 CAAM 하드웨어를 사용하는 API로 비동기 해싱을 위한 Scatterlist Crypto API 지원을 활성화한다.
CRYPTO_DEV_FSL_CAAM_RNG_API
hwrng API로 CAAM Random Number 생성기의 사용을 활성화한다. 이것은 커널 의사 램덤 생성기에 대해 엔트로피 풀을 제공하기 위한 랜덤 데이터를 생성하는 데 사용할 수 있다.
CRYPTO_DEV_FSL_CAAM_RNG_TEST
CAAM RNG 드라이버가 램덤 데이터를 작동하고 버퍼링하는지 확인하기 위해 captive 테스트를 활성화한다.
8.1.7 Limitations
- 드라이버의 컴포넌트는 현재 모듈로 빌드와 실행이 되지 않는다. 이는 향후 버전에서 수정될 수 있다.
- 컨트롤러와 작업 링 백엔드 사이에 상호 종속성이 존재하므로, 모두 동일한 시스템 파티션에서 실행되어야 한다. 드라이버의 향후 버전은 작업 링 백엔드를 자체 시스템 파티션에서 독립적(그리고 독립적인 API와 SM 인스턴스 지원)으로 실행할 수 있는 독립 실행형 모듈로 분리할 수 있다.
- 전체 CAAM 레지스터 페이지는 컨트롤러 드라이버에 의해 매핑되고, 선택된 서브 시스템에 대한 파생된 포인터가 계산되어 상위 레이어 드라이버 컴포넌트로 전달된다. 파티션에 독립적인 구성은 대신 자체 서브 시스템 포인터를 매핑해야 한다.
- 이 드라이버의 업스트림 변형은 Power 아키텍처만 지원한다. 이 Arm 아키텍처별 포트는 현재 업스트림되지 않지만, 일부 지점에서 업스트림될 수 있다.
- RNG를 더 빨리(earlier) 사용할 수 있도록, TRNG 킥스타트는 향후 릴리스에서 부트로더로 이동해야 할 수 있다.
- Job Ring 드라이버에는 현재 필요하지 않은 등록(registration)과 등록 해제(de-registration) 기능이 있으며, 상위 레이어에 종료(shutdown) 알림을 제공하기 위해 향후 버전에서 다시 작성될 수 있다.
- 전체 CAAM 기능은 DSM의 Mega/Fast 믹스 오프 기능과 배타적이다. CAAM이 활성화된 경우, Mega/Fast 믹스 오프 기능을 비활성화해야 하며, 사용자는 커널이 부팅된 후, "echo enabled > /sys/bus/platform/devices/2100000.aips-bus/2100000.caam/2101000.jr0/power/wakeup"를 해야 한다. 그러면 Mega/Fast 믹스가 DSM에서 계속 파워-온 되어 있다.
8.1.8 Limitations in the Existing Implementation Overview
이 장에서는 CAAM Secure Memory에 액세스를 제공하기 위한 Keystore Management Interface의 프로토타입을 설명한다.
보안 메모리는 중요한 시스템 보안 파라미터를 버스 레벨에서 명백하게 스크릿 노출 없이, 실행 중인 시스템에 저장하고 처리할 수 있는 컨트롤과 액세스 보호 영역을 제공한다. 시크릿은 보안 메모리에서 가져오고 내보낼 수 있지만, 일반 텍스트 형식으로 보안 메모리에서 내보낼 수는 없다. 대신, 외부에 절대 표시되지 않는 키를 사용하여 숨겨진 형식으로 보안 메모리에서 시스릿을 내보낼 수 있다.
커널 레벨 API가 있는 이 드라이버는 커널 레벨 서비스가 보안 메모리 기능에 액세스할 수 있도록 기본 인터페이스를 노출한다. 이는 두 부분으로 나뉜다:
- Keystore Initialization와 Maintenance Interfaces
- Keystore Access Interface
초기화와 유지 관리 서비스는 키 저장소 인터페이스의 인스턴스를 초기화하고 정의하기 위해 존재한다. 마찬가지로, 액세스 인터페이스로 커널 레벨 서비스에서 보안 파라미터 관리를 위해 API를 사용할 수 있다.
8.1.9 Initialize Keystore Management Interface
키 저장소 서브 시스템에 대한 기본(underlying) 물리적인 인터페이스를 구현하는 함수에 대한 포인터 집합을 설치한다.
현재 릴리스에서는, 함수의 기본(그리고 숨겨진)적인 모음이 이 인터페이스를 구현한다. 이 API의 향후 구현에서는 대체 인터페이스 설치를 제공할 수 있다. 이 경우, 이 호출에 대한 대안이 제공될 수 있다.
void sm_init_keystore(struct device *dev);
Arguments:
dev 보안 메모리 서브 시스템의 리소스를 관리하기 위해 설정된 struct device를 가리킨다.
8.1.10 Detect Available Secure Memory Storage Units
이 드라이버의 로컬 인스턴스에서 액세스할 수 있는 사용 가능한 유닛("pages")의 수를 반환한다. 리소스 프로브로 사용하기 위한 것이다.
u32 sm_detect_keystore_units(struct device *dev);
Arguments:
dev 보안 메모리 서브 시스템에 대한 리소스를 관리하기 위해 설정된 struct device를 가리킨다.
Returns:
사용할 수 있는 감지된 유닛의 수, 0 ~ n - 1은 다른 모든 API 함수에 대한 후속 호출과 함께 사용될 수 있다.
8.1.11 Establish Keystore in Detected Unit
키(또는 다른 시크릿) 저장에 사용할 수 있는 감지된 유닛의 할당 테이블을 설정한다.유닛은 일련의 고정 크기 슬롯으로 나뉘며, 각 슬롯은 할당 테이블에서 사용 가능으로 표시된다. 각 슬롯의 크기는 빌드 시 선택 가능한 파라미터이다.
sm_establish_keystore()가 호출될 때까지, 키 저장소 액세스 인터페이스에 대한 호출이 발생할 수 없다.
sm_establish_keystore()는 sm_detect_keystore_units()에 대한 호출을 따라야 한다.
int sm_establish_keystore(struct device *dev, u32 unit);
Arguments:
dev 보안 메모리 서브 시스템의 리소스를 관리하기 위해 설정된 struct device를 가리킨다.
unit sm_detect_keystore_units() 호출로 감지된 유닛 중 하나이다.
Returns:
- 0 성공적인 반환
- -EINVAL 키 저장소 서브 시스템이 초기화되지 않은 경우
- -ENOSPC 할당 테이블과 관련 컨텍스트 데이터에 사용할 수 있는 메모리가 없는 경우
8.1.12 Release Keystore
이 키 저장소 유닛에서 사용되는 모든 리소스를 해제한다. 키 저장소 액세스 인터페이스에 대한 추가 호출을 수행할 수 없다.
void sm_release_keystore(struct device *dev, u32 unit);
Arguments:
dev 보안 메모리 서브 시스템에 대한 리소스를 관리하기 위해 설정된 struct device를 가리킨다.
unit sm_detect_keystore_units() 호출로 감지된 유닛 중 하나이다.
8.1.13 Allocate a Slot from the Keystore
키 저장소 액세스 인터페이스에서 다른 모든 후속 작업에 사용할 키 저장소에서 슬롯을 할당한다.
int sm_keystore_slot_alloc(struct device *dev, u32 unit, u32 size, u32*slot);
Arguments:
dev 보안 메모리 서브 시스템의 리소스를 관리하기 위해 설정된 struct device를 가리킨다.
unit sm_detect_keystore_units() 호출로 감지된 유닛 중 하나이다.
size 할당된 슬롯에 저장하기 위 원하는 데이터 크기이다.
slot 일단 알려디면, 할당된 슬롯 번호를 수신할 변수에 대한 포인터이다.
Returns:
- 0 성공적인 완료
- -EKEYREJECTED 요청된 크기가 선택된 슬롯 크기를 초과하는 경우
8.1.14 Load Data into a Keystore Slot
다른 작업(예: 캡슐화)을 수행할 수 있도록 할당된 키 저장소 슬롯에 데이터를 로드한다.
int sm_keystore_slot_load(struct device *dev, u32 unit, u32
slot, constu8 *key_data, u32 key_length);
Arguments:
dev 보안 메모리 서브 시스템의 리소스를 관리하기 위해 설정된 struct device를 가리킨다.
unit sm_detect_keystore_units() 호출로 감지된 유닛 중 하나이다.
key_length 슬롯에 저장할 정보의 길이(바이트 단위)이다.
key_data 로드할 데이터가 있는 버퍼에 대한 포인터이다. 연속적인 버퍼이어야 한다.
Returns:
- 0 성공적인 완료
- -EFBIG 요청된 크기가 슬롯이 수용할 수 있는 크기를 초과하는 경우
8.1.15 Demo Image Update
Secure Memory Blob으로 키 저장소 슬롯에 기록된 데이터를 캡슐화한다.
int sm_keystore_slot_encapsulate(struct device *dev, u32 unit,
u32 inslot, u32 outslot, u16 secretlen, u8 *keymod, u16 keymodlen);
Arguments:
dev 보안 메모리 서브 시스템의 리소스를 관리하기 위해 설정된 struct device를 가리킨다.
unit sm_detect_keystore_units() 호출로 감지된 유닛 중 하나이다.
inslot sm_keystore_slot_load()에 의해 해당 슬롯에 로드된 시크릿을 보유하는 슬롯. 이 시크릿이 포함된 슬롯은 현재 일반 텍스트를 포함하고 있으므로 가능한 빨리 덮어쓰거나 할당을 취소해야 한다.
outslot 캡슐화된 출력을 Secure Memory Blob으로 유지하기 위해 할당된 슬롯이다.
secretlen Blob 스토리지 오버헤드(BLOB 키, MAC 등)를 포함하지 않고 캡슐화된 시크릿의 길이이다.
keymod 캡슐화에 사용할 키 수정자 컴포넌트이다. 키 수정자를 사용하면 캡슐화 프로세스에서 추가 스크릿을 사용할 수 있다. 캡슐화 해제(decapsulation)에도 동일한 수정자가 필요하다.
keymodlen 키 수정자의 길이(바이트)이다.
Returns:
- 0 성공
- CAAM 작업 상태 실패한 경우
8.1.16 Decapsulate Data in the Keystore
다른 암호 작업에 사용할 수 있도록 키 저장소의 데이터를 Black Key Blob으로 캡슐화를 해제한다. Black Key Blob을 사용하면 키를 일반 텍스트로 노출하지 않고 메인 메모리에서 "covered"하여 사용할 수 있다.
int sm_keystore_slot_decapsulate(struct device *dev, u32 unit,
u32 inslot, u32 outslot, u16 secretlen, u8 *keymod, u16 keymodlen);
Arguments:
dev 보안 메모리 서브 시스템의 리소스를 관리하기 위해 설정된 struct device를 가리킨다.
unit sm_detect_keystore_units() 호출로 감지된 유닛 중 하나이다.
inslot sm_keystore_slot_encapsulate()에 대한 이전 호출에 의해 처리되고 Secure Memory Blob를 포함하는 입력 데이터를 보유하는 슬롯이다.
outslot 캡슐화 해제된 출력 데이터를 Black Key Blob 형태로 보관하기 위해 할당된 슬롯이다.
secretlen Blob 저장소 오버헤드 없이 캡슐화를 해제할 스크릿의 길이이다.
keymod 캡슐화 시 지정된 키 수정 컴포넌트이다.
keymodlen 키 수정자의 길이(바이트 단위)이다.
Returns:
- 0 성공
- CAAM 작업 상태 실패한 경우
8.1.17 Read Data From a Keystore Slot
키 저장소 슬롯에서 다시 사용자 버퍼로 데이터를 추출한다. 일반적으로 일부 다른 작업(예: 캡슐화 해제)이 발생한 후에 사용된다.
int sm_keystore_slot_read(struct device *dev, u32 unit, u32
slot, u32 key_length, u8 *key_data);
Arguments:
dev 보안 메모리 서브 시스템의 리소스를 관리하기 위해 설정된 struct device를 가리킨다.
unit sm_detect_keystore_units() 호출로 감지된 유닛 중 하나이다.
slot 읽기 위해 할당된 슬롯이다.
key_length 슬롯에서 읽을 정보의 길이(바이트 단위)이다.
key_data 추출된 데이터를 보관할 버퍼에 대한 포인터이다. 연속적인 버퍼이여야 한다.
Returns:
- 0 성공적인 완료
- -EFBIG 요청된 크기가 슬롯이 수용할 수 있는 크기를 초과하는 경우
8.1.18 Release a Slot back to the Keystore
키 저장소 슬롯을 다시 사용 가능한 풀(pool)로 해제한다. 저장소의 정보는 할당 해제가 발생하기 전에 깨끗이 지원진다.
int sm_keystore_slot_dealloc(struct device *dev, u32 unit, u32 slot);
Arguments:
dev 보안 메모리 서브 시스템의 리소스를 관리하기 위해 설정된 struct device를 가리킨다.
unit sm_detect_keystore_units() 호출로 감지된 유닛 중 하나이다.
slot 저장소로 다시 해제할 할당된 슬롯의 번호이다.
Returns:
- 0 성공적인 완료
- -EINVAL 할당되지 않은 슬롯이 지정된 경우
Secure Memory Driver / Keystore API의 구성은 아래 커널 구성 파라미터에 따라 다르다:
CRYPTO_DEV_FSL_CAAM_SM
커널 빌드에서 보안 메모리 드라이버를 켠다.
CRYPTO_DEV_FSL_CAAM_SM_SLOTSIZE
보안 메모리 "slot"의 크기를 구성한다.
각 보안 메모리 유닛은 내부 메모리 블럭이며, 그 크기는 구현에 따라 다르다. 이 블럭은 이 값으로 선택할 수 있는 크기의 논리적 "slots"의 수를 세분화할 수 있다. 이러한 슬롯의 크기는 의도한 가장 큰 스크릿 크기와 blob 파라미터의 오버헤드(blob 키와 MAC, 일반적으로 48바이트 이하)를 포함할 수있는 값으로 설정해야 한다.
값은 2의 거듭제곱으로 선택할 수 있으며, 32 ~ 512 바이트 범위로 제한된다. 기본 값은 7이며 크기는 128바이트이다.
CRYPTO_DEV_FSL_CAAM_SM_TEST
기능을 확인하면서, API를 사용하는 방법을 보여주는 캡티브(captive) 테스트 / 예제 모듈의 작동을 활성화한다. 테스트 모듈은 아래 흐름에 따라 작동한다:
- 알려진 여러 개의 일반 키(3개 크기)를 생성한다.
- 할당된 보안 메모리 슬롯.
- 해당 키를 보안 메모리 슬롯에 삽입하고 캡슐화한다.
- 해당 키를 블랙 키로 캡슐화를 해제한다.
- 블랙 키로 DES, AES128 그리고 AES256 플레인-텍스트(plaintext)를 암호화한다. 이것은 대칭 암호를 사용하기 때문에 동일한 키에 대한 암호화/복호화의 결과는 동일하다.
- 동등한 일반 키로 암호화된 버퍼를 해독한다.
- 해독된 결과를 원본 암호문과 비교한다. 일치하는 경우, 테스트는 테스트된 각 주요 케이스에 대해 OK를 보고한다.
정상 출력은 콘솔에서 다음과 같이 보고된다:
platform caam_sm.0: caam_sm_test: 8-byte key test match OK
platform caam_sm.0: caam_sm_test: 16-byte key test match OK
platform caam_sm.0: caam_sm_test: 32-byte key test match OK
- 보안 메모리 드라이버는 현재 커널 모듈로 구현되지 않는다.
- 구현은 현재 커널 모드 작업으로 제한된다.
- 현재 하나의 인스턴스가 가능하다. 앞으로 작업 링이 다른 시스템 파티션에서 독립적으로 실행될 수 있게 되면, 다중 인스턴스 보안 메모리 드라이버를 고려해야 한다.
- 모든 스토리지 요청은 단일 슬롯의 스토리지 크기(빌드 시 구성 가능한 길이)로 제한된다. 이러한 슬롯이 연속적으로 할당될 수 있는 한, 시크릿이 여러 슬롯에 걸쳐 있도록 허용할 수 있다.
- 슬롯 크기는 모든 페이지/파티션에서 고정된다.
- Encapsulation/Decapsulation 인터페이스는 인증을 지정할 수 있다. 기본(underlying) 인터페이스는 이를 요청하지 않는다.
- Encapsulation/Decapsulation 인터페이스는 작업 상태를 반환한다. 이 상태는 errno.h에서 의미 있는 오류로 변환되어야 한다.
8.1.19 CAAM/SNVS - Security Violation Handling Interface Overview
이 장에서는 SNVS Security Violations에 대한 드라이버 컴포넌트와 컨트롤 인터페이스의 프로토타입을 설명한다. 이는 시스템에서 발생하는 보안 위반 이벤트에 대한 응답으로, 보안 위반 이벤트를 처리하기 위한 애플리케이션 정의 핸들러를 설치, 관리 그리고 실행하는 수단을 제공한다.
SNVS를 사용하면 실행중인 시스템에서 여러 가능한 공격 벡터를 지속적으로 모니터링할 수 있다. 이러한 연결 벡터 중 하나의 발생이 감지되면(예: Security Violation이 감지됨), SNVS는 중요한 보안 파리미터를 지우고 실패 상태로 전환할 수 있다. 위반이 발생했다는 것을 나타내는 인터럽트를 생성한다. 이 인터럽트는 규칙에 따라 보안 서비스가 종료될 수 있도록 위반의 결과로 정리 작업을 수행하도록 애플리케이션 정의 루틴을 디스패치할 수 있다.
따라서 이 인터페이스의 목적은 시스템 레벨 서비스가 이러한 유형의 이벤트에 대한 핸들러를 설치할 수 있도록 하는 것이다. 이를 통해 시스템 디자이너는 시스템별 요구 사항에 작성된 간단한 함수 호출을 사용하여 특정 보안 위반 원인에 대응하는 방법을 선택할 수 있다.
8.1.20 Operation
기존 플랫폼의 경우, SNVS 내에서 6가지 보안 위한 인터럽트 원인이 가능하다. 이러한 위반 원인 중 5개는 일반적으로 배선되어 사용되며, 이러한 원인은 다음과 같이 정의된다:
- SECVIO_CAUSE_CAAM_VIOLATION - CAAM/SNVS 내에서 감지된 위반
- SECVIO_CAUSE JTAG_ALARM - JTAG 활동 감지됨
- SECVIO_CAUSE_WATCHDOG - 워치독 만료
- SECVIO_CAUSE_EXTERNAL_BOOT - 외부 부트로드 활동
- SECVIO_CAUSE_TAMPER_DETECT - 변조 감지 로직이 트리거됨
이러한 각 원인은 이 드라이버와 함께 제공되는 API로 애플리케이션 정의 핸들러와 연관될 수 있다. 핸들러를 지정하지 않으면, 기본 핸들러가 호출된다. 이 핸들러는 시스템 콘솔에 대한 인터럽트 원인을 식별하는 것 이상을 수행하지 않는다.
8.1.21 Configuration Interface
아래 인터페이스를 사용하여 드라이버의 디스패치 테이블에서 애플리케이션 정의 위한 핸들러를 정의하거나 제거할 수 있다.
8.1.22 Install a Handler
int caam_secvio_install_handler(struct device *dev, enum secvio_cause cause,
void (*handler)(struct device *dev, u32 cause, void *ext),
u8 *cause_description, void *ext);
Arguments:
dev SNVS 소유 디바이스를 가르킨다.
cause 위의 열거된 원인 목록에서 인터럽트 소스 원인이다.
handler 애플리케이션 정의 핸들러는 dev, 소스 cause 그리고 로컬로 정의된 핸들러 인수와 함께 호출된다.
cause_description 기본 원인 이름을 재정의하는 문자열을 가리키며, 오류 메세지 등에 대한 대한으로 사용할 수 있다. NULL로 두며, 기본 설명 문자열이 사용된다.
ext 핸들러에 필요한 추가 데이터에 대한 포인터이다.
Returns:
- 0 성공
- -EINVAL 인수가 유효하지 않거나 사용할 수 없는 경우
8.1.23 Remove an Installed Driver
int caam_secvio_remove_handler(struct device *dev, enum secvio_cause cause);
Arguments:
dev SNVS 소유 디바이스를 가르킨다.
cause 인터럽트 소스 원인.
Returns:
- 0 성공
- -EINVAL 인수가 유효하지 않거나 사용할 수 없는 경우
8.1.24 Driver Configuration CAAM/SNVS
CRYPTO_DEV_FSL_CAAM_SECVIO
Security Violation 드라이버와 구성 인터페이스를 빌드 구성의 일부로 포함할 수 있다. 드라이버는 현재 모듈 형태로 빌드할 수 없다.