Todas las claves de KeyMint deben estar vinculadas a una raíz de confianza para el dispositivo. La raíz de confianza es una cadena de bits derivada de la clave pública que se usa para verificar la firma de la imagen de arranque, junto con el estado de bloqueo del bootloader.
Las claves de KeyMint también deben estar vinculadas a la versión del sistema operativo y al nivel de parche del dispositivo. Para admitir la estructura modular de Treble, esta vinculación de versión incluye
niveles de parche separados para cada partición
(boot, system y vendor). Esto permite
que cada partición se actualice de forma independiente, a la vez que proporciona protección
contra reversiones.
Para implementar esta vinculación de versiones, la app de confianza (TA) de KeyMint necesita una forma de recibir de forma segura la versión actual del SO y los niveles de parches, y de garantizar que la información que recibe coincida con toda la información sobre el sistema en ejecución.
- Dispositivos con Inicio verificado de Android (AVB):
- Los niveles de parches y la versión del SO se pueden incluir en
vbmeta.imgpara que el bootloader pueda proporcionarlos a KeyMint. - En el caso de las particiones encadenadas, la información de la versión de la partición se encuentra en el VBMeta encadenado.
- En general, la información de la versión debe estar en el
VBMeta structque contiene los datos de verificación (hash o hashtree) de una partición determinada.
- Los niveles de parches y la versión del SO se pueden incluir en
- Dispositivos sin AVB:
- Las implementaciones de inicio verificado deben proporcionar un hash de los metadatos de la versión al bootloader para que este pueda proporcionarlo a KeyMint.
boot.imgpuede seguir almacenando niveles de parches en el encabezado.system.imgpuede seguir almacenando los niveles de parche y la versión del SO en propiedades de solo lectura.vendor.imgalmacena el nivel de parche en la propiedad de solo lecturaro.vendor.build.version.security_patch.- El bootloader puede proporcionar un hash de todos los datos validados por el inicio verificado a KeyMint.
Las siguientes etiquetas describen la información de la versión de las particiones relevantes:
Tag::VENDOR_PATCHLEVEL: ParticiónvendorTag::BOOT_PATCHLEVEL: ParticiónbootTag::OS_PATCHLEVELyTag::OS_VERSION: Particiónsystem;Tag::OS_VERSIONse quita del encabezadoboot.img
Las implementaciones de KeyMint deben tratar todos los niveles de parche de forma independiente. Las claves se pueden usar si toda la información de la versión coincide con los valores asociados a una clave. Si la versión actual del dispositivo es más reciente que cualquier valor asociado con una clave, KeyMint muestra el error KEY_REQUIRES_UPGRADE en cualquier intento de usar la clave. Luego, Keystore realiza IKeyMintDevice::upgradeKey para generar un nuevo blob de claves vinculado a los niveles de parche actuales (y, posteriormente, Keystore borra el blob de claves anterior con una llamada a IKeyMintDevice::deleteKey).