8.1 Cryptographic Acceleration and Assurance Module (CAAM)
8.1.1 CAAM Device Driver Overview
이 섹션에서는 Linux 커널 내에서 CAAM(Cryptographic Acceleration and Assurance Module)을 지원하는 커널 드라이버 컴포넌트의 세부 구현 사항에 대해 설명한다.
CAAM의 기본 드라이버 패키징은 뚜렷하게 두 가지 레벨로 분류할 수 있다:
- Configuration and Job Execution Level (구성과 작업 실행 레벨)
- API Interface Level
Configuration and Job Execution Level의 구성은 아래와 같다:
- 메인 레지스터 페이지를 매핑하고 전역이나 시스템 필수 구성 정보를 작성하는 컨트롤과 구성 모듈.
- 작업 링을 통해 작업을 제공하고 상태를 보고하는 모듈.
API Interface Level의 구성은 아래와 같다:
- 비동기 단일 패스 인증 암호화 작업과 일반적인 블록 암호를 지원하는 Sctterlist Crypto API에 대한 인터페이스 - caamalg.
- 비동기 해시를 지원하는 Scatterlist Crypto API에 대한 인터페이스 - caamhash.
- Random Number Generator(난수 생성기)의 사용을 지원하는 hwrng API에 대한 인터페이스 - caamrng.
8.1.2 Configuration and Job Execution Level
이 섹션은 두 개의 부분으로 구성되어 있다:
- Control/Configuration Driver (컨트롤/구성 드라이버)
- Job Ring Driver (작업 링 드라이버)
8.1.3 Control/Configuration Driver
컨트롤과 구성 드라이버는 마스터 레지스터 페이지를 초기화 및 설정하고, 초기 기능(early-on feature) 초기화를 초기화하고, 제한된 디버그와 모니터링 기능을 제공하고, 일반적으로 다른 모든 종속 드라이버의 서브시스템이 올바르게 구성된 디바이스에 연결할 수 있도록 보장한다.
단계별로 시작 시 아래 작업을 수행한다:
- 이 레벨에 대한 사적인 저장 불록(private storage block)을 할당한다.
- 전체 CAAM 레지스터 페이지에 가상 주소를 매핑한다.
- SNVS 레지스터 페이지에 대한 가상 주소를 매핑한다.
- Secure Memory에 대한 가상(캐시 일관성: cache coherent) 주소를 매핑한다.
- 보안 위반(security violation) 인터럽트를 등록한다.
- 플랫폼에 대한 올바른 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 드라이버는 상위 레벨 드라이버에 작업(job) 실행 서비스를 제공하는 역할을 한다. 입력과 출력 링의 전반적인 관리와 출력 링을 구동하는 인터럽트 서비스를 처리한다.
하나의 드라이버 호출은 상위 레이어의 실행을 위해 링에 작업을 대기시티는 데 사용할 수 있다:
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에 대한 포인터이다. 현재 구성에서 하나 이상의 struct device 항목이 컨트롤러의 사적인 데이터 블록에 존재하며 각 링에 대해 하나씩 있다.
desc : 실행할 CAAM 작업 디스크립터에 대한 포인터이다. 드라이버는 실행 전에 디스크립터를 매핑하고 완료되면 매핑을 해제한다. 그러나 드라이버는 디스크립터가 참조하는 데이터에 대해 합리적으로 알 수 없으므로, 제출하기 전에 이 데이터를 map/flush하고 요청이 완료된 후 데이터 unmap/invalidate하는 것은 호출자의 책임이다.
cbk : 작업이 처리를 완료했을 때 호출될 콜백 함수에 대한 포인터이다.
areq : 이 요청과 관련된 메타데이터나 컨텍스트 데이터에 대한 포인터이다.
Callback Function Arguments (콜백 함수 인수):
dev : 사용할 작업 링과 연관된 struct device에 대한 포인터이다.
desc : 실행을 위해 제출된 원래 디스크립터에 대한 포인터이다.
status : 요청을 실행한 CAAM DECO로 부터 받은 완료 상태이다. 오류가 발생한 경우에만 nonzero 이다. 각 오류를 설명하는 문자열은 error.c에 열거되어 있다.
areq : 원래 요청에 전달된 메타데이터/컨텍스트 포인터이다.
Returns (반환값):
- 성공적인 작업 제출 시 0
- 입력 링이 가득찬 경우 -EBUSY
- 드라이버가 작업 디스크립터를 매핑할 수 없는 경우에는 -EIO
8.1.5 API Interface Level
CAAM 모듈은 일반적인 대칭 블록 암호화(symmetric blockcipher)와 단일 패스 인증 암호화(single-pass authentication-encryption) 서비스 모두에 대해 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_edecaam | SHA1와 Triple-DES-CBC를 사용한 단일 패스 인증/암호화 |
authenc(hmac(sha224),cbc(des3_ede)) | authenc-hmac-sha224-cbc-des3_edecaam | SHA224와 Triple-DES-CBC를 사용한 단일 패스 인증/암호화 |
authenc(hmac(sha256),cbc(des3_ede)) | authenc-hmac-sha256-cbc-des3_edecaam | SHA256와 Triple-DES-CBC를 사용한 단일 패스 인증/암호화 |
authenc(hmac(sha384),cbc(des3_ede)) | authenc-hmac-sha384-cbc-des3_edecaam | SHA384와 Triple-DES-CBC를 사용한 단일 패스 인증/암호화 |
authenc(hmac(sha512),cbc(des3_ede)) | authenc-hmac-sha512-cbc-des3_edecaam | 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를 사용한 단일 패스 인증/암호화 |
이 테이블에는 설치된 모든 대칭 키 블록 암호화(symmetric key blockcipher) 알고리즘이 그들의 일반적인 이름, 드라이버 이름 그리고 용도별로 나열되어 있다.
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로 알려진 커널의 암호화 서브시스템에 있는 일반적인 적합/성능 테스트 모듈에 예시되어 있다.
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로 알려진 커널의 암호화 서브시스템에 있는 일반적인 적합/성능 테스트 모듈에 예시되어 있다.
caamrng 모듈은 /dev/random을 통해 액세스할 수 있는 버퍼 쌍에 임의의 데이터를 공급하기 위해 CAAM 난수 생성기를 사용하는 메커니즘을 설치한다.
/dev/random은 일반적으로 다른 임의의 데이터 "devices"에 대한 엔트로피 소스로 내부에서 사용할 수 있는 커널의 자체 엔트로피 풀을 공급하는 데 사용된다.
이 서비스 지원에 대한 자세한 내용은 sourceforge.net/projects/gkernel/files/rngtools에서 사용 가능한 rng-tools를 참조한다.
8.1.6 Driver Configuration
드라이버 구성은 아래 커널 구성 파라미터(Cryptographic API -> Hardware Crypto Devices 아래에서 찾을 수 있음)에 의해 컨트롤된다:
CRYPTO_DEV_FSL_CAAM
기본 컨트롤러 드라이버와 작업 링 백엔드(job ring backend)를 빌드할 수 있다.
CRYPTO_DEV_FSL_CAAM_RINGSIZE
작업 링의 크기(예: 최대 항목 수)를 선택한다. 이것은 2~9 범위의 2의 거듭제곱으로 선택할 수 있으며, 4에서 512 항목 범위의 링 깊이를 선택할 수 있다.
기본 선택은 9이며, 링 깊이는 512개의 작업 항목이 된다.
CRYPTO_DEV_FSL_CAAM_INTC
하드웨어 인터럽트 병합 기능의 사용을 활성화하면, 사용률이 높은 기간 동안 시스템에서 발생하는 인터럽트 오버헤드의 양을 줄일 수 있다. 단일 인터럽트나 각 작업 완료에서 비활성화 상태로 두면, 작업은 단순화되지만 오버헤드가 증가한다.
CRYPTO_DEV_FSL_CAAM_INTC_COUNT_THLD
병합이 활성화된 경우, 인터럽트가 발생하기 전에 큐에 허용되는 작업 완료 수를 선택한다.1~255 범위에서 선택 가능하다. 1을 선택하면 병합 기능이 효과적으로 무효화된다. 작업 링 크기보다 큰 크기를 선택하면, 인터럽트가 발생하기 전에 인터럽트 시간이 초과되는 상황이 발생한다.
기본 선택은 255이다.
CRYPTO_DEV_FSL_CAAM_INTC_TIME_THLD
병합이 활성화된 경우, 병합 제한 시간 이전에 버스 clock 수(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 난수 생성기를 사용할 수 있다. 이것은 커널 의사 난수 생성기에 대한 엔트로피 풀을 공급하기 위해 임의의 데이터를 생성하는 데 사용할 수 있다.
CRYPTO_DEV_FSL_CAAM_RNG_TEST
CAAM RNG 드라이버가 작동하고 임의 데이터를 버퍼링하는지 확인하기 위해 종속 테스트를 활성화한다.
8.1.7 Limitations
- 드라이버의 컴포넌트는 현재 모듈로 빌드와 실행되지 않는다. 이는 향후 버전에서 수정될 수 있다.
- 컨트롤러와 작업 링 백엔드 사이에는 상호 종속성이 있으므로, 모두 동일한 시스템 파티션에서 실행해야 한다. 드라이버의 향후 버전은 작업 링 백엔드를 자체 시스템 파티션에서 독립적(그리고 독립 API와 SM 인스턴스를 지원하는)으로 실행할 수 있는 독립형 모듈로 분리할 수 있다.
- 전체 CAAM 레지스터 페이지는 컨트롤러 드라이버에 의해 매핑되고, 선택된 서브시스템에 대한 파생 포인터가 계산되어 드라이버 컴포넌트의 상위 레이어에 전달된다. 파티션 독립 구성은 대신 자체 서브시스템 포인터를 매핑해야 한다.
- 이 드라이버의 업스트림 변형은 Power 아키텍처만 지원한다. 이 Arm 아키텍처별 포트는 현재는 업스트림되지 않지만, 어느 시점에서 일부가 업스트림될 수 있다.
- RNG를 더 일찍 사용할 수 있도록, TRNG 킥스타트를 향후 릴리즈에서 부트로더로 이동할 수도 있다.
- Job Ring 드라이버에는 현재 필요하지 않은 등록과 등록 취소 기능이 있다(향후 버전에서는 상위 레이어에 종료 알림을 제공하기 위해 다시 작성될 수도 있다).
- 전체 CAAM 기능은 DSM의 Mega/Fast mix off 기능과 배타적이다. CAAM이 활성화된 경우, Mega/Fast mix off 기능을 비활성화해야 하며, 사용자는 커널 부팅 후 "echo enabled > /sys/bus/platform/devices/2100000.aips-bus/2100000.caam/2101000.jr0/power/wakeup"를 실행한 다음, Mega/Fast mix가 DSM의 전원을 계속 켜진 상태로 유지한다.
8.1.8 Limitations in the Existing Implementation Overview
이 장에서는 CAAM Secure Memory에 대한 액세스를 제공하기 위한 Keystore Management Interface의 프로토타입에 대해 설명한다.
중요한 시스템 보안 파라미터가 버스 레벨에서 명백하게 secret 노출 없이 실행 중인 시스템에서 저장과 처리될 수 있는 컨트롤되고 액세스 보호된 영역을 보안 메모리는 제공한다. 보안 메모리에서 secret을 가져오고 내보낼 수 있지만, 보안 메모리에서 일반 텍스트 형식으로 내보낼 수는 없다. 대신 외부에서 볼 수 없는 키를 사용하여, 보안 메모리에서 숨겨진 형태로 secret을 내보낼 수 있다.
커널 레벨의 API가 있는 이 드라이버는, 보안 메모리 기능에 대한 커널 레벨 서비스의 액세스를 하용하는 기본 인터페이스를 노출한다. 이는 두 부분으로 나뉜다 :
- Keystore Initialization(키 스토어 초기화)와 Maintenance Interfaces(유지 관리 인터페이스)
- Keystore Access Interface(키 스토어 액세스 인터페이스)
초기화와 유지 관리 서비스는 keystore 인터페이스의 인스턴스를 초기화하고 정의하기 위해 존재한다. 마찬가지로 액세스 인터페이스를 통해 커널 레벨 서비스에서 보안 파라미터 관리를 위해 API를 사용할 수 있다.
8.1.9 Initialize Keystore Management Interface
Keystore 서브시스템에 대한 물리적인 기본(underlying) 인터페이스를 구현하는 함수에 대한 포인터 집합을 설치한다.
현재 릴리즈에서는 기본(및 숨겨진) 함수의 모음이 이 인터페이스를 구현한다. 이 API의 향후 구현에서는 대체 인터페이스의 설치를 제공할 수 있다. 이러한 상황이 발생하면, 이 호출에 대한 대안이 제공될 수 있다.
void sm_init_keystore(struct device *dev);
Arguments (인수):
dev : 보안 메모리 서브시스템에 대한 리소스를 관리하기 위해 설정된 struct device의 포인트.
8.1.10 Detect Available Secure Memory Storage Units
이 드라이버의 로컬 인스턴스에서 액세스할 수 있는 사용 가능한 유닛("pages")의 수를 반환한다. 리소스 프로브(probe)로 사용하기 위한 것이다.
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
키(또는 기타 secret)의 저장소로 사용할 수 있는 감지된 유닛의 할당 테이블을 설정한다. 유닛은 일련의 고정 크기 슬롯으로 나뉘며, 각 슬롯은 할당 테이블에서 사용 가능한 것으로 표시된다. 각 슬롯의 크기는 빌드 시 선택 가능한 파라미터이다.
sm_establish_keystore()가 호출될 때까지, 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
- Keystore 서브시스템이 초기화되지 않은 경우 -EINVAL
- 할당 테이블과 관련 컨텍스트 데이터에 사용할 수 있는 메모리가 없는 경우 -ENOSPC
8.1.12 Release Keystore
이 keystore 유닛에서 사용하는 모든 리소스를 해제한다. 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
Keystore 액세스 인터페이스에서 다른 모든 후속 작업에 사용하기 위해 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
다른 작업(캡슐화와 같은)을 수행할 수 있도록 할당된 keystore 슬롯에 데이터를 로드한다.
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
Keystore 슬롯에 저장된 데이터를 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()에 의해 해당 슬롯에 로드된 입력 secret을 보유하는 슬롯. 이 secret이 포함된 슬롯은, 이 시점에서 일반 텍스트를 포함하므로 가능한 한 빨리 덮어 쓰거나 할당을 취소해야 한다.
outslot : Secure Memory Blob으로 캡슐화된 출력을 보유하기 위해 할당된 슬롯이다.
secretlen : blob 저장소 오버헤드(blob 키, MAC 등)를 포함하지 않고, 캡슐화할 secret의 길이이다.
keymod : 캡슐화에 사용할 키 수정자 컴포넌트. 키 수정자는 캡슐화 프로세스에서 특별한 secret을 사용할 수 있도록 한다. 캡슐화 해제에도 동일한 수정자가 필요하다.
keymodlen : 키 수정자의 길이(바이트 단위).
Returns (반환값):
- 성공이면 0
- 실패하면 CAAM 작업 상태
8.1.16 Decapsulate Data in the Keystore
다른 암호화 작업에 사용하기 위해 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 저장소 오버헤드 없이 캡슐화할 secret의 길이.
keymod : 캡슐화 시 지정된 키로 수정된 컴포넌트.
keymodlen : 키 수정자의 길이(바이트).
Returns (반환값):
- 성공이면 0
- 실패하면 CAAM 작업 상태
8.1.17 Read Data From a Keystore Slot
Keystore 슬롯에서 다시 사용자 버퍼로 데이터를 추출한다. 일반적으로 다른 작업(예: 캡슐화 해제)이 발생한 후에 사용된다.
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
Keystore 슬롯을 다시 사용 가능한 풀로 해제한다. 저장소의 정보는 할당 해제가 발생하기 전에 완전히 지워진다.
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"으로 세분화 될 수 있다. 이러한 슬롯의 크기는 의도한 가장 큰 secret 크기와 blob 파라미터의 오버헤드(blob 키와 MAC, 일반적으로 48 바이트 이하)를 보유할 수 있는 값으로 설정해야 한다.
값은 2의 거듭제곱으로 선택할 수 있으며, 32 ~ 512 바이트 범위로 제한된다. 기본 값은128 크기의 7이다.
CRYPTO_DEV_FSL_CAAM_SM_TEST
기능을 확인하면서, API를 사용하는 방법을 보여주는 종속 테스트 / 예제 모듈의 작동을 활성화한다. 테스트 모듈은 다음 흐름에 따라 작동한다:
- 알려진 여러 개의 클리어 키(3가지 크기)를 생성한다.
- 할당된 보안 메모리 슬롯.
- 보안 메모리 슬롯에 해당 키를 삽입하고 캡슐화한다.
- 해당 키를 블랙 키로 캡슐화 해제한다.
- 블랙 키로 DES, AES128와 AES256 일반 텍스트를 암호화한다. 이것은 대칭 암호를 사용하기 때문에, 동일한 키로 암호화/복호화한 결과와 동일하다.
- 동등한 클리어 키를 사용하여 암호화된 버퍼를 해독한다.
- 복호화된 결과를 원본 암호문과 비교한다. 일치하는 경우, 테스트는 테스트된 각 주요 사례에 대해 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
- 보안 메모리 드라이버는 현재 시점에서 커널 모듈로 구현되어 있지 않다.
- 구현은 현재 커널 모드 작업으로 제한된다.
- 현재는 하나의 인스턴스가 가능하다. 향후에는 작업 링이 다른 시스템 파티션에서 독립적으로 실행될 수 있을 때, 다중 인스턴스 보안 메모리 드라이버를 고려해야 한다.
- 모든 스토리지 요청은 단일 슬롯(빌드시 구성 가능 길이)의 스토리지 크기로 제한된다. 해당 슬롯이 연속적으로 할당될 수 있는 한 secret이 여러 슬롯에 걸쳐 있도록 허용할 수 있다.
- 슬롯 크기는 모든 페이지/파티션에서 고정된다.
- Encapsulation/Decapsulation 인터페이스는 인증을 지정할 수 있다. 기본(underlying) 인터페이스는 이를 요청하지 않는다.
- Encapsulation/Decapsulation 인터페이스는 작업 상태를 반환한다. 이 상태는 error.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 - 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, source 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 드라이버와 구성 인터페이스를 빌드 구성의 일부로 포함할 수 있다. 드라이버는 현재 형태의 모듈로 빌드할 수 없다.
※ 보안에서 secret : secret은 암호, 토큰이나 키와 같은 소량의 중요한 데이터를 포함하는 오브젝트이다.