KeyMint 함수

이 페이지에서는 KeyMint 하드웨어 추상화 계층 (HAL)의 구현자를 지원하기 위한 추가 세부정보와 가이드라인을 제공합니다. HAL의 기본 문서는 AIDL 인터페이스 사양입니다.

API 오용

호출자는 API 매개변수로 유효하지만 결과 키를 안전하지 않게 만들거나 사용할 수 없게 만드는 승인으로 KeyMint 키를 만들 수 있습니다. KeyMint 구현은 이러한 경우에 실패할 필요가 없으며 진단을 실행합니다. 너무 작은 키 사용, 무관한 입력 매개변수의 지정, IV 또는 nonce의 재사용, 목적이 없어 불필요한 키의 생성 등을 구현에서 진단해서는 안 됩니다.

앱, 프레임워크, Android 키 저장소에는 KeyMint 모듈 호출이 합리적이고 유용한지 확인할 책임이 있습니다.

addRngEntropy 진입점

addRngEntropy 진입점은 KeyMint 구현에서 키와 IV의 랜덤 숫자를 생성하는 데 사용한 풀에 호출자 제공 엔트로피를 추가합니다.

KeyMint 구현은 하드웨어 랜덤 숫자 생성기에서 내부적으로 생성된 엔트로피도 포함해야 하는 풀에 제공된 엔트로피를 안전하게 혼합해야 합니다. 혼합은 addRngEntropy 제공 비트 또는 하드웨어에서 생성한 비트 중 하나 (둘 다는 아님)를 완전히 제어하는 공격자가 엔트로피 풀에서 생성된 비트를 예측할 때 상당한 이점이 없도록 처리되어야 합니다.

키 특성

KeyMint 키를 만드는 각 메커니즘 (generateKey, importKey, importWrappedKey)은 새로 생성된 키의 특성을 각 특성을 적용하는 보안 수준으로 적절하게 나눈 값을 반환합니다. 반환되는 특성에는 Tag::APPLICATION_IDTag::APPLICATION_DATA를 제외하고 키 생성에 지정된 모든 매개변수가 포함됩니다. 이러한 태그가 키 매개변수에 포함된 경우 반환된 키 blob을 검사하여 태그 값을 찾을 수 없도록 태그는 반환된 특성에서 삭제됩니다. 그러나 태그는 키 blob에 암호화 방식으로 결합하므로 키가 사용될 때 올바른 값이 제공되지 않으면 사용에 실패합니다. 마찬가지로 Tag::ROOT_OF_TRUST는 키에 암호화 방식으로 결합되어 있지만, 키를 생성하거나 가져오는 동안 지정될 수 없으며 반환되지 않습니다.

제공된 태그 외에도 KeyMint 구현은 키가 생성된 방식 (KeyOrigin::GENERATED, KeyOrigin::IMPORTED 또는 KeyOrigin::SECURELY_IMPORTED)을 나타내는 Tag::ORIGIN도 추가합니다.

롤백 방지

롤백 방지는 Tag::ROLLBACK_RESISTANCE로 표시되며, deleteKey 또는 deleteAllKeys로 키가 삭제되면 보안 하드웨어에서 다시 사용할 수 없도록 보장된다는 의미입니다.

KeyMint 구현은 생성되거나 가져온 키 자료를 호출자에게 키 blob 및 암호화된 인증 양식으로 반환합니다. 키 저장소가 키 blob을 삭제하면 키는 없어지지만, 이전에 키 자료를 검색한 적이 있는 공격자가 잠재적으로 키 blob을 기기에 복원할 수 있습니다.

보안 하드웨어에서 삭제된 키를 나중에 복원할 수 없도록 보장하면 키의 롤백이 방지됩니다. 이는 일반적으로 신뢰할 수 있는 위치에 추가 키 메타데이터를 저장하여 실행됩니다. 이 위치는 공격자가 조작할 수 없습니다. 휴대기기에서는 일반적으로 롤백 방지에 RPMB (Replay Protected Memory Blocks) 메커니즘을 사용합니다. 생성할 수 있는 키의 수는 기본적으로 무제한이며 롤백 방지에 사용되는 신뢰할 수 있는 저장소의 크기는 제한될 수 있기 때문에 저장소가 가득 찼을 때 구현은 롤백 방지 키를 만들기 위한 요청을 실패시킬 수 있습니다.

begin

begin() 진입점은 지정된 키를 사용하여 지정된 목적을 위해 적절하게 지정된 매개변수를 가지고 암호화 작업을 시작합니다. 작업을 완료하는 데 사용되는 새 IKeyMintOperation 바인더 객체를 반환합니다. 또한 인증된 작업에서 인증 토큰의 일부로 사용되는 챌린지 값이 반환됩니다.

KeyMint 구현은 최소 16개의 동시 작업을 지원합니다. 키 저장소는 최대 15개까지 사용하며 vold가 비밀번호 암호화에 하나를 사용합니다. 키 저장소에 진행 중인 작업이 15개 (begin()는 호출되었지만 finish 또는 abort는 호출되지 않음)이고 16번째 작업을 시작하라는 요청을 수신하면 가장 최근에 사용되지 않은 작업에서 abort()를 호출하여 활성 작업 수를 14개로 줄인 후 begin()를 호출하여 새로 요청된 작업을 시작합니다.

키를 생성하거나 가져오는 동안 Tag::APPLICATION_ID 또는 Tag::APPLICATION_DATA가 지정되었다면 begin()의 호출은 이 메서드의 params 인수에 원래 지정된 값을 가진 태그를 포함해야 합니다.

오류 처리

IKeyMintOperation의 메서드가 ErrorCode::OK이 아닌 오류 코드를 반환하면 작업이 취소되고 작업 바인더 객체가 무효화됩니다. 이후에 객체를 사용하면 ErrorCode::INVALID_OPERATION_HANDLE이 반환됩니다.

승인 시행

키 승인 시행은 주로 begin()에서 실행됩니다. 단, 키에 Tag::USER_SECURE_ID 값이 하나 이상 있고 Tag::AUTH_TIMEOUT 값이 없는 경우는 예외입니다.

이 경우 키는 작업당 승인이 필요하며 update() 또는 finish() 메서드는 authToken 인수에서 인증 토큰을 수신합니다. 토큰이 유효한지 확인하기 위해 KeyMint 구현은 다음을 실행합니다.

  • 인증 토큰의 HMAC 서명을 확인합니다.
  • 토큰에 키와 연결된 보안 사용자 ID와 일치하는 보안 사용자 ID가 포함되어 있는지 확인합니다.
  • 토큰의 인증 유형이 키의 Tag::USER_AUTH_TYPE와 일치하는지 확인합니다.
  • 토큰의 challenge 필드에 현재 작업의 챌린지 값이 포함되어 있는지 확인합니다.

이러한 조건이 충족되지 않으면 KeyMint는 ErrorCode::KEY_USER_NOT_AUTHENTICATED를 반환합니다.

호출자는 update()finish()의 모든 호출에 인증 토큰을 제공합니다. 구현은 토큰의 유효성을 한 번만 검사할 수 있습니다.