SW 개발

[OPTEE 문서번역] OPTEE Architecture - 2 Crypt

. . . 2019. 10. 11. 17:00
반응형

개요

https://optee.readthedocs.io 문서를 구글 번역기 + 네이버번역기를 이용하여 번역하였습니다.

즉, 기계가 번역한 내용이므로 대략적인 내용은 확인가능합니다. 제대로 보시려면 원문을 보시길 권유드립니다.

글순서

2. Cryptographic implementation

이 문서에서는 TEE Cryptographic Operations API가 구현되는 방법, 컴파일시 기본 암호화 공급자를 구성하는 방법 및 다른 구현으로 대체 할 수있는 방법에 대해 설명합니다.

2.1. Overview

신뢰할 수있는 응용 프로그램에서 실제 암호화 알고리즘까지 여러 계층이 있습니다. 대부분의 암호화 코드는 TEE 코어 내부의 커널 모드로 실행됩니다. 다음은 암호화 API에 대한 일반적인 호출의 개략도입니다. 대괄호 ([1], [2] ...)로 표시된 숫자는 아래 섹션을 참조하십시오.

-   some_function()                             (Trusted App) -
[1]   TEE_*()                      User space   (libutee.a)
------- utee_*() ----------------------------------------------
[2]       tee_svc_*()              Kernel space
[3]         crypto_*()                          (libtomcrypt.a and crypto.c)
[4]           /* LibTomCrypt */                 (libtomcrypt.a)

2.2. [1] The TEE Cryptographic Operations API

OP-TEE는 TEE Internal Core API에서 GlobalPlatform 연관에 의해 정의 된 Cryptographic Operations API를 구현합니다. 이것은 메시지 다이제스트, 대칭 암호, 메시지 인증 코드 (MAC), 인증 된 암호화, 비대칭 연산 (암호화 / 복호화 또는 서명 / 검증), 키 유도 및 임의 데이터 생성과 같은 다양한 암호화 요구를 포괄하는 암호화 기능을 포함합니다. 이러한 기능은 TEE Cryptographic Operations API를 구성합니다.

내부 API는 tee_api_operations.c에서 구현됩니다. which is compiled into a static library: ${O}/ta_arm{32,64}-lib/libutee/libutee.a.

대부분의 API 함수는 매개 변수 검사 및 조작을 수행 한 다음 커널 모드로 전환하고 하위 수준의 작업을 수행하기 위해 utee_* 함수를 호출합니다.

utee_* 함수는 utee_syscalls.h에서 선언되고 utee_syscalls_asm.S에 구현됩니다. 이들은 간단한 시스템 호출 래퍼로서 SVC 명령어를 사용하여 OP-TEE 커널에서 적절한 시스템 서비스로 전환합니다.

2.3. [2] The crypto services

모든 암호화 관련 시스템 호출은 tee_svc_cryp.h에서 선언되고 tee_svc_cryp.c에 구현됩니다. 사용자 / 커널 인터페이스 (매개 변수를 확인하고 사용자와 커널 공간간에 메모리 버퍼를 복사)에서 필요한 일반적인 작업을 처리하는 것 외에도 시스템 호출은 crypto.h에 선언 된 Crypto API라는 개인 추상화 계층을 호출합니다. 그것은 두 가지 주요 목적을 수행합니다 :

  1. 하드웨어 가속 버전과 같은 대체 구현을 허용합니다.
  2. 공간을 절약하기 위해 컴파일시에 일부 패밀리 알고리즘을 비활성화하는 쉬운 방법을 제공하십시오. 아래의 LibTomCrypt를 참조하십시오.

2.4. [3] crypto_*()

crypto_*()함수는 실제 알고리즘과 도우미 함수를 구현합니다. TEE Core에는이 인터페이스에 대한 하나의 전역 활성 구현이 있습니다. 주로 LibTomCrypt를 기반으로하는 기본 구현은 다음과 같습니다.

File: core/crypto/crypto.c

/*
 * Default implementation for all functions in crypto.h
 */

#if !defined(_CFG_CRYPTO_WITH_HASH)
TEE_Result crypto_hash_get_ctx_size(uint32_t algo __unused,
                                    size_t *size __unused)
{
        return TEE_ERROR_NOT_IMPLEMENTED;
}
...
#endif /*_CFG_CRYPTO_WITH_HASH*/

File: core/lib/libtomcrypt/tee_ltc_provider.c

#if defined(_CFG_CRYPTO_WITH_HASH)
TEE_Result crypto_hash_get_ctx_size(uint32_t algo, size_t *size)
{
    /* ... */
    return TEE_SUCCESS;
}

#endif /*_CFG_CRYPTO_WITH_HASH*/

위에서 볼 수 있듯이, 알고리즘 계열은 비활성화 될 수 있으며 crypto.cTEE_ERROR_NOT_IMPLEMENTED를 반환하는 기본 null 구현을 제공합니다.

2.5. Public/private key format

crypto.h는 비대칭 알고리즘의 핵심 데이터를 저장하기 위해 구현 특정 유형을 사용합니다. 예를 들어, 공개 RSA 키의 표현 방법은 다음과 같습니다.

File: core/include/crypto/crypto.h

struct rsa_public_key {
    struct bignum *e;       /* Public exponent */
    struct bignum *n;       /* Modulus */
};

이것은 또한 그러한 키가 TEE 객체 속성 (이 경우 TEE_ATTR_RSA_PUBLIC_KEY) 내에 저장되는 방법이기도합니다. struct bignum은 불투명한 유형으로, 기본 구현에만 알려져 있다. struct bignum_ops는 시스템 서비스가 이런 유형의 데이터를 조작할 수 있도록 기능을 제공한다. 여기에는 할당/분할, 복사 및 빅 엔디안 바이너리 포맷으로의 변환이 포함된다.

File: core/include/crypto/crypto.h

struct bignum *crypto_bignum_allocate(size_t size_bits);

TEE_Result crypto_bignum_bin2bn(const uint8_t *from, size_t fromsize,
                struct bignum *to);

void crypto_bignum_bn2bin(const struct bignum *from, uint8_t *to);
/*...*/

2.6. [4] LibTomCrypt

일부 알고리즘은 OP-TEE 이미지의 크기를 줄이고 메모리 사용을 줄이기 위해 컴파일 시간에 필요하지 않으면 비활성화 될 수 있습니다. 이는 적절한 구성 변수를 설정하여 수행됩니다. 예 :

make CFG_CRYPTO_AES=n              # disable AES only
make CFG_CRYPTO_{AES,DES}=n        # disable symmetric ciphers
make CFG_CRYPTO_{DSA,RSA,DH,ECC}=n # disable public key algorithms
make CFG_CRYPTO=n                  # disable all algorithms

지원되는 모든 변수 목록은 core/lib/libtomcrypt/sub.mk를 참조하십시오.

알고리즘이 비활성화되면 응용 프로그램 인터페이스는 수정되지 않습니다. 예를 들어, 모든 대칭 암호가 비활성화되어 있어도TEE_CipherInit (),TEE_CipherUpdate ()TEE_CipherFinal ()함수가libutee.a에 남아있을 것입니다 (단순히TEE_ERROR_NOT_IMPLEMENTED ).

2.7. Add a new crypto implementation

새 구현을 추가하려면 core/lib/libtomcryptcore/crypto에있는 것과 조합 된 기본값이 참조로 사용되어야합니다. 새 암호화 공급자를 추가 할 때 고려해야 할 주요 사항은 다음과 같습니다.

  • 사용중인 암호화 프로 바이더에 상관없이 사용될 코드가 아닌 한 모든 새로운 코드를 core/lib 아래에 자신의 디렉토리에 넣으십시오. core/crypto의 AES-GCM을 처리하는 방법을 예로들 수 있습니다.
  • tee_svc_cryp.c를 수정하지 마십시오. 필요하지 않아야합니다.
  • 모든 암호화 패밀리를 정의 할 필요는 없지만 모두 GlobalPlatform 사양을 준수해야합니다.
  • 일부 알고리즘을 선택적으로 만들려는 경우 구성 변수에 동일한 이름을 기본 구현으로 다시 사용하십시오.
반응형