solicitado siguiente significa qué que por fue desmarcar configuracion cambio borrar windows encryption tpm trusted-computing

windows - siguiente - Cómo encriptar bytes usando el TPM(Trusted Platform Module)



trusted platform module clear (3)

¿Cómo puedo encriptar bytes usando el módulo TPM de una máquina?

CryptProtectData

Windows proporciona una API (relativamente) simple para encriptar un blob usando la API CryptProtectData , que podemos CryptProtectData una función fácil de usar:

public Byte[] ProtectBytes(Byte[] plaintext) { //... }

Los detalles de ProtectBytes son menos importantes que la idea de que puede usarlo con bastante facilidad:

  • Aquí están los bytes que quiero encriptar con una clave secreta contenida en el System
  • devuélveme el blob cifrado

El blob devuelto es una estructura de documentation no documentation que contiene todo lo necesario para descifrar y devolver los datos originales (algoritmo hash, algoritmo de cifrado, sal, firma HMAC, etc.).

Para completar, aquí está la implementación de pseudocódigo de muestra de ProtectBytes que usa la Crypt API para proteger los bytes:

public Byte[] ProtectBytes(Byte[] plaintext) { //Setup our n-byte plaintext blob DATA_BLOB dataIn; dataIn.cbData = plaintext.Length; dataIn.pbData = Addr(plaintext[0]); DATA_BLOB dataOut; //dataOut = EncryptedFormOf(dataIn) BOOL bRes = CryptProtectData( dataIn, null, //data description (optional PWideChar) null, //optional entropy (PDATA_BLOB) null, //reserved null, //prompt struct CRYPTPROTECT_UI_FORBIDDEN || CRYPTPROTECT_LOCAL_MACHINE, ref dataOut); if (!bRes) then { DWORD le = GetLastError(); throw new Win32Error(le, "Error calling CryptProtectData"); } //Copy ciphertext from dataOut blob into an actual array bytes[] result; SetLength(result, dataOut.cbData); CopyMemory(dataOut.pbData, Addr(result[0]), dataOut.cbData); //When you have finished using the DATA_BLOB structure, free its pbData member by calling the LocalFree function LocalFree(HANDLE(dataOut.pbData)); //LocalFree takes a handle, not a pointer. But that''s what the SDK says. }

¿Cómo hacer lo mismo con el TPM?

El código anterior es útil para cifrar datos solo para la máquina local. Los datos se cifran utilizando la cuenta del System como generador de claves (los documentation ). El resultado final es que puedo cifrar datos (por ejemplo, una clave maestra de cifrado del disco duro) que solo puede ser descifrada por la máquina local.

Ahora es el momento de llevar esto un paso más allá. Quiero encriptar algunos datos (por ejemplo, una clave maestra de encriptación del disco duro) que solo pueden ser desencriptados por el TPM local. En otras palabras, quiero reemplazar el Entorno de ejecución de confianza de Qualcomm ( TEE ) en el diagrama de bloques a continuación para Android, con el TPM en Windows:

Nota : Me doy cuenta de que el TPM no firma datos (o si lo hace, no garantiza que firmar los mismos datos dará la misma salida binaria cada vez). Es por eso que estaría dispuesto a reemplazar la "firma de RSA" con "cifrar un blob de 256 bits con una clave vinculada por hardware" .

Entonces, ¿dónde está el código?

El problema es que la programación TPM está completamente indocumentada en MSDN . No hay API disponible para realizar ninguna operación. En su lugar, debe buscar una copia de la Pila de software del Trusted Computing Group (también conocido como TSS) , averiguar qué comandos enviar al TPM, con cargas útiles, en qué orden, y llamar a la función Tbsip_Submit_Command de Window para enviar comandos directamente:

TBS_RESULT Tbsip_Submit_Command( _In_ TBS_HCONTEXT hContext, _In_ TBS_COMMAND_LOCALITY Locality, _In_ TBS_COMMAND_PRIORITY Priority, _In_ const PCBYTE *pabCommand, _In_ UINT32 cbCommand, _Out_ PBYTE *pabResult, _Inout_ UINT32 *pcbOutput );

Windows no tiene una API de nivel superior para realizar acciones.

Es el equivalente moral de intentar crear un archivo de texto emitiendo comandos SATA I / O en su disco duro .

¿Por qué no solo usar pantalones?

Trusted Computing Group (TCG) definió su propia API: TCB Software Stack (TSS) . Algunas personas crearon una implementación de esta API, y se llama TrouSerS . Un chico luego portó ese proyecto a Windows .

El problema con ese código es que no es portátil en el mundo de Windows. Por ejemplo, no puede usarlo desde Delphi, no puede usarlo desde C #. Requiere:

  • OpenSSL
  • pThread

Solo quiero que el código cifre algo con mi TPM.

El CryptProtectData anterior CryptProtectData requiere nada más que lo que está en el cuerpo de la función.

¿Cuál es el código equivalente para cifrar datos usando el TPM? Como otros han notado, probablemente tenga que consultar los tres manuales de TPM y construir los blobs usted mismo . Probablemente implica el comando TPM_seal . Aunque creo que no quiero sellar datos, creo que quiero vincularlos :

Enlace : encripta los datos con la clave de enlace TPM, una clave RSA única que desciende de una clave de almacenamiento. Sellado : encripta los datos de manera similar al enlace, pero además especifica un estado en el que TPM debe estar para que los datos se desencripten (sin sellar)

Intento leer los tres volúmenes necesarios para encontrar las 20 líneas de código que necesito:

Pero no tengo idea de lo que estoy leyendo. Si hubiera algún tipo de tutorial o ejemplos, podría tener una oportunidad. Pero estoy completamente perdido.

Entonces le preguntamos a Stackoverflow

De la misma manera pude proporcionar:

Byte[] ProtectBytes_Crypt(Byte[] plaintext) { //... CryptProtectData(...); //... }

alguien puede proporcionar el equivalente correspondiente:

Byte[] ProtectBytes_TPM(Byte[] plaintext) { //... Tbsip_Submit_Command(...); Tbsip_Submit_Command(...); Tbsip_Submit_Command(...); //...snip... Tbsip_Submit_Command(...); //... }

Qué hace lo mismo, excepto que una clave bloqueada en el System LSA, está bloqueada en el TPM?

Inicio de investigación

No sé exactamente qué significa atar . Pero mirando TPM Main - Parte 3 Comandos - Especificación Versión 1.2, hay una mención de bind :

10.3 TPM_UnBind

TPM_UnBind toma el blob de datos que es el resultado de un comando Tspi_Data_Bind y lo descifra para exportarlo al Usuario. La persona que llama debe autorizar el uso de la clave que descifrará el blob entrante. TPM_UnBind opera bloque por bloque y no tiene ninguna noción de relación entre un bloque y otro.

Lo que es confuso es que no hay Tspi_Data_Bind comando Tspi_Data_Bind .

Esfuerzo de investigación

Es horrible cómo nadie se ha molestado en documentar el TPM o su funcionamiento. Es como si pasaran todo su tiempo inventando esta cosa genial con la que jugar, pero no quisieran lidiar con el doloroso paso de hacerla utilizable para algo.

Comenzando con el (ahora) libro gratuito Una guía práctica para TPM 2.0: Uso del Módulo de plataforma confiable en la nueva era de seguridad :

Capítulo 3 - Tutorial rápido en TPM 2.0

El TPM tiene acceso a una clave privada autogenerada, por lo que puede cifrar las claves con una clave pública y luego almacenar el blob resultante en el disco duro. De esta manera, el TPM puede mantener un número prácticamente ilimitado de claves disponibles para su uso, pero no desperdiciará un valioso almacenamiento interno. Las claves almacenadas en el disco duro pueden borrarse, pero también pueden copiarse, lo que a los diseñadores les pareció una compensación aceptable.

¿Cómo puedo cifrar una clave con la clave pública del TPM?

Capítulo 4 - Aplicaciones existentes que usan TPM

Aplicaciones que deberían usar el TPM pero no

En los últimos años, el número de aplicaciones basadas en la web ha aumentado. Entre ellos se encuentran el respaldo y el almacenamiento basados ​​en la web. Una gran cantidad de compañías ahora ofrecen dichos servicios, pero hasta donde sabemos, ninguno de los clientes de estos servicios permite que el usuario bloquee la clave del servicio de respaldo a un TPM. Si se hiciera esto, sin duda sería bueno si la clave TPM se copiara en varias máquinas. Esto parece ser una oportunidad para los desarrolladores.

¿Cómo bloquea un desarrollador una clave para el TPM?

Capítulo 9 - Jerarquías

CASO DE USO: ALMACENAMIENTO DE CONTRASEÑAS DE INICIO DE SESIÓN

Un archivo de contraseña típico almacena hashes de contraseñas salados. La verificación consiste en salar y trocear una contraseña suministrada y compararla con el valor almacenado. Debido a que el cálculo no incluye un secreto, está sujeto a un ataque fuera de línea en el archivo de contraseña.

Este caso de uso utiliza una clave HMAC generada por TPM. El archivo de contraseña almacena un HMAC de la contraseña salada. La verificación consiste en salar y HMACing la contraseña suministrada y compararla con el valor almacenado. Debido a que un atacante sin conexión no tiene la clave HMAC, el atacante no puede montar un ataque realizando el cálculo.

Esto podría funcionar Si el TPM tiene una clave HMAC secreta, y solo mi TPM conoce la clave HMAC, entonces podría reemplazar "Firmar (también conocido como TPM cifrar con su clave privada)" con "HMAC". Pero luego, en la siguiente línea, se revierte por completo:

TPM2_Create, especificando una clave HMAC

No es un secreto TPM si tengo que especificar la clave HMAC. El hecho de que la clave HMAC no sea secreta tiene sentido cuando te das cuenta de que este es el capítulo sobre las utilidades criptográficas que proporciona el TPM. En lugar de tener que escribir SHA2, AES, HMAC o RSA usted mismo, puede reutilizar lo que ya tiene el TPM.

Capítulo 10 - Llaves

Como dispositivo de seguridad, la capacidad de una aplicación para usar claves mientras las mantiene seguras en un dispositivo de hardware es la mayor fortaleza del TPM. El TPM puede generar e importar claves generadas externamente. Admite teclas asimétricas y simétricas.

¡Excelente! ¿¡Cómo lo haces!?

Generador de llaves

Podría decirse que la mayor fortaleza del TPM es su capacidad para generar una clave criptográfica y proteger su secreto dentro de un límite de hardware. El generador de claves se basa en el propio generador de números aleatorios del TPM y no se basa en fuentes externas de aleatoriedad. Por lo tanto, elimina las debilidades basadas en software de software débil con una fuente insuficiente de entropía.

¿ El TPM tiene la capacidad de generar claves criptográficas y proteger sus secretos dentro de un límite de hardware? ¿Es así cómo?

Capítulo 12 - Registros de configuración de la plataforma

PCR para autorización

CASO DE USO: SELLAR UNA CLAVE DE ENCRIPTACIÓN DE DISCO DURO PARA PLATAFORMAR EL ESTADO

Las aplicaciones de cifrado de disco completo son mucho más seguras si un TPM protege la clave de cifrado que si está almacenada en el mismo disco, protegida solo por una contraseña. Primero, el hardware TPM tiene protección contra el martilleo (consulte el Capítulo 8 para obtener una descripción detallada de la protección contra ataques de diccionario TPM), lo que hace que un ataque de fuerza bruta en la contraseña no sea práctico. Una clave protegida solo por software es mucho más vulnerable a una contraseña débil. En segundo lugar, una clave de software almacenada en el disco es mucho más fácil de robar. Tome el disco (o una copia de seguridad del disco) y obtendrá la clave. Cuando un TPM tiene la llave, se debe robar toda la plataforma, o al menos el disco y la placa base.

El sellado permite que la clave esté protegida no solo por una contraseña sino también por una política. Una política típica bloquea la clave de los valores de PCR (el estado del software) actual en el momento del sellado. Esto supone que el estado en el primer arranque no se ve comprometido. Cualquier malware preinstalado presente en el primer arranque se mediría en los PCR y, por lo tanto, la clave se sellaría a un estado de software comprometido. Una empresa menos confiable podría tener una imagen de disco estándar y sellar a los PCR que representan esa imagen. Estos valores de PCR se calcularían previamente en una plataforma presumiblemente más confiable. Una empresa aún más sofisticada usaría TPM2_PolicyAuthorize y proporcionaría varios tickets que autorizan un conjunto de valores de PCR confiables. Consulte el Capítulo 14 para obtener una descripción detallada de la autorización de políticas y su aplicación para resolver el problema de brillo de PCR.

Aunque una contraseña también podría proteger la clave, hay una ganancia de seguridad incluso sin una contraseña de clave TPM. Un atacante podría arrancar la plataforma sin proporcionar una contraseña de TPMkey pero no podría iniciar sesión sin el nombre de usuario y la contraseña del sistema operativo. OSsecurity protege los datos. El atacante podría iniciar un sistema operativo alternativo, por ejemplo, desde un DVD en vivo o una memoria USB en lugar de desde el disco duro, para evitar la seguridad de inicio de sesión del sistema operativo. Sin embargo, esta configuración y software de arranque diferentes cambiarían los valores de PCR. Debido a que estos nuevos PCR no coincidirían con los valores sellados, el TPM no liberaría la clave de descifrado y el disco duro no podría descifrarse.

¡Excelente! Este es exactamente el caso de uso que deseo. También es el caso de uso para el que Microsoft usa el TPM. ¿¡Cómo lo hago!?

Entonces leí todo el libro y no me proporcionó nada útil. Lo cual es bastante impresionante porque tiene 375 páginas. Te preguntas qué contiene el libro y, si lo recuerdo, no tengo idea.

Por lo tanto, renunciamos a la guía definitiva para programar el TPM, y recurrimos a alguna documentación de Microsoft:

Del kit de herramientas de criptoproveedor de la plataforma Microsoft TPM . Menciona exactamente lo que quiero hacer:

La clave de aprobación o EK

El EK está diseñado para proporcionar un identificador criptográfico confiable para la plataforma. Una empresa puede mantener una base de datos de las Claves de aprobación que pertenecen a los TPM de todas las PC de su empresa, o un controlador de estructura de centro de datos puede tener una base de datos de los TPM en todos los blades. En Windows, puede usar el proveedor NCrypt descrito en la sección "Proveedor de cifrado de plataforma en Windows 8" para leer la parte pública del EK.

En algún lugar dentro del TPM hay una clave privada RSA. Esa llave está encerrada allí, nunca será vista por el mundo exterior. Quiero que el TPM firme algo con su clave privada (es decir, cifrarlo con su clave privada).

Así que quiero la operación más básica que pueda existir:

Cifre algo con su clave privada. Ni siquiera estoy (todavía) preguntando por las cosas más complicadas:

  • "sellarlo" según el estado de PCR
  • crear una clave y almacenarla en una memoria volátil o no volátil
  • creando una clave simétrica e intentando cargarla en el TPM

Estoy pidiendo la operación más básica que puede hacer un TPM. ¿Por qué es imposible obtener información sobre cómo hacerlo?

Puedo obtener datos aleatorios

Supongo que estaba siendo simplista cuando dije que la firma de RSA era lo más básico que podía hacer el TPM. Lo más básico que se le puede pedir al TPM es que me dé bytes aleatorios. Que he descubierto cómo hacer:

public Byte[] GetRandomBytesTPM(int desiredBytes) { //The maximum random number size is limited to 4,096 bytes per call Byte[] result = new Byte[desiredBytes]; BCRYPT_ALG_HANDLE hAlgorithm; BCryptOpenAlgorithmProvider( out hAlgorithm, BCRYPT_RNG_ALGORITHM, //AlgorithmID: "RNG" MS_PLATFORM_CRYPTO_PROVIDER, //Implementation: "Microsoft Platform Crypto Provider" i.e. the TPM 0 //Flags ); try { BCryptGenRandom(hAlgorithm, @result[0], desiredBytes, 0); } finally { BCryptCloseAlgorithmProvider(hAlgorithm); } return result; }

La cosa de lujo

Me doy cuenta de que el volumen de personas que usan el TPM es muy bajo. Es por eso que nadie en Stackoverflow tiene una respuesta. Así que no puedo ser demasiado codicioso para encontrar una solución a mi problema común. Pero lo que realmente quiero hacer es "sellar" algunos datos:

  • presentar al TPM algunos datos (por ejemplo, 32 bytes de material clave)
  • haga que el TPM encripte los datos, devolviendo una estructura de gotas opacas
  • luego pida al TPM que descifre el blob
  • el descifrado solo funcionará si los registros de PCR del TPM son los mismos que durante el cifrado.

En otras palabras:

Byte[] ProtectBytes_TPM(Byte[] plaintext, Boolean sealToPcr) { //... } Byte[] UnprotectBytes_TPM(Byte[] protectedBlob) { //... }

Criptografía Next Gen (Cng, también conocido como BCrypt) es compatible con TPM

La API de criptografía original en Windows se conocía como la API de criptografía.

Comenzando con Windows Vista, Crypto API ha sido reemplazado por Cryptography API: Next Generation (conocido internamente como BestCrypt , abreviado como BCrypt , que no debe confundirse con el algoritmo de hash de contraseña ).

Windows se entrega con dos proveedores de BCrypt:

El proveedor de Crypto de plataforma no está documentado en MSDN, pero tiene documentación de un sitio de investigación de Microsoft 2012:

Kit de herramientas de proveedor de cifrado de plataforma TPM

El Kit de herramientas y el proveedor de cifrado de la plataforma TPM contiene código de muestra, utilidades y documentación para usar la funcionalidad relacionada con TPM en Windows 8. Los subsistemas descritos incluyen el proveedor criptográfico de la plataforma Crypto-Next-Gen (CNG) respaldado por TPM y cómo los proveedores de servicios de certificación puede usar las nuevas funciones de Windows. Se admiten los sistemas basados ​​en TPM1.2 y TPM2.0.

Parece que la intención de Microsoft es sacar a la superficie la funcionalidad criptográfica TPM con Microsoft Platform Crypto Provider de Cryptography NG API.

Cifrado de clave pública con Microsoft BCrypt

Dado que:

Un camino a seguir podría ser descubrir cómo hacer la firma digital utilizando la API Microsoft Cryptography Next Gen.

Mi próximo paso será crear el código para cifrar en BCrypt, con una clave pública RSA, utilizando el proveedor estándar ( MS_PRIMITIVE_PROVIDER ). P.ej:

  • modulus : 0xDC 67 FA F4 9E F2 72 1D 45 2C B4 80 79 06 A0 94 27 50 8209 DD 67 CE 57 B8 6C 4A 4F 40 9F D2 D1 69 FB 995D 85 0C 07 A1 F9 47 1B 56 16 6E F6 7F B9 CF 2A 58 36 37 99 29 AA 4F A8 12 E8 4F C7 82 2B 9D 72 2A 9C DE 6F C2 EE 12 6D CF F0 F2 B8 C4 DD 7C 5C 1A C8 17 51 A9 AC DF 08 22 04 9D 2B D7 F9 4B 09 DE 9A EB 5C 51 1A D8 F8 F9 56 9E F8 FB 37 9B 3F D3 74 65 24 0D FF 34 75 57 A4 F5 BF 55
  • publicExponent : 65537

Con ese código funcionando, puedo cambiar a usar el proveedor TPM ( MS_PLATFORM_CRYPTO_PROVIDER ).

22/02/2016: Y con la obligación de Apple de ayudar a descifrar los datos del usuario, hay un renovado interés en cómo hacer que el TPM realice la tarea más simple para la que se inventó: cifrar algo.

Es más o menos equivalente a que todos tengan un automóvil, pero nadie sabe cómo arrancarlo. Puede hacer cosas realmente útiles y geniales, si solo pudiéramos pasar el Paso 1 .

Lectura adicional


Cebador

Todo lo que sigue es sobre TPM 1.2. Tenga en cuenta que Microsoft requiere un TPM 2.0 para todas las futuras versiones de Windows. La generación 2.0 es fundamentalmente diferente a la 1.2.

No existe una solución de una línea debido a los principios de diseño de TPM. Piense en el TPM como un microcontrolador con recursos limitados. Su principal objetivo de diseño era ser barato y seguro. Entonces, el TPM fue arrancado de toda lógica que no era necesaria para una operación segura. Por lo tanto, un TPM solo funciona cuando tiene al menos un software más o menos pesado , emitiendo muchos comandos en el orden correcto. Y esas secuencias de comandos pueden volverse muy complejas. Es por eso que TCG especificó el TSS con una API bien definida. Si desea seguir el camino de Java, incluso hay una API de Java de alto nivel. No conozco un proyecto similar para C # / .net

Desarrollo

En su caso, le sugiero que mire el software TPM de IBM.

En el paquete encontrarás 3 componentes muy útiles:

  • un emulador de software TPM
  • una libra ligera de tpm
  • algunas utilidades básicas de línea de comando

No necesariamente necesita el emulador de software TPM, también puede conectarse al HW TPM de la máquina. Sin embargo, puede interceptar los comandos emitidos y mirar las respuestas, así aprender cómo se ensamblan y cómo se corresponden con la especificación del comando.

Nivel alto

Prerrequisitos:

  1. TPM está activado
  2. El controlador TPM está cargado
  3. ha tomado posesión del TPM

Para sellar un blob, debe hacer lo siguiente:

  1. crear una clave
  2. almacenar el blob clave en alguna parte
  3. asegúrese de que la clave esté cargada en el TPM
  4. sellar la gota

Para desbloquear necesitas:

  1. obtener el blob clave
  2. cargar la llave al TPM
  3. abrir el sello sellado

Puede almacenar el blob clave en su estructura de datos que usa para almacenar los bytes protegidos.

La mayoría de los comandos TPM que necesita son los autorizados. Por lo tanto, debe establecer sesiones de autorización donde sea necesario. AFAIR esas son principalmente sesiones de OSAP.

Comandos TPM

Actualmente no puedo ejecutar una versión de depuración, por lo que no puedo proporcionarle la secuencia exacta. Considere esto una lista desordenada de comandos que tendrá que usar:

  • TPM_OSAP
  • TPM_CreateWrapKey
  • TPM_LoadKey2
  • TPM_Seal

Si también desea leer los valores actuales de PCR:

  • TPM_PCRRead

Claves confiables y cifradas

Las claves de confianza y cifradas son dos nuevos tipos de clave agregados al servicio de anillo de claves del núcleo existente. Ambos tipos nuevos son claves simétricas de longitud variable, y en ambos casos todas las claves se crean en el núcleo, y el espacio de usuario ve, almacena y carga solo blobs cifrados. Trusted Keys requiere la disponibilidad de un chip Trusted Platform Module (TPM) para una mayor seguridad, mientras que las claves cifradas se pueden utilizar en cualquier sistema. Todos los blobs de nivel de usuario se muestran y cargan en hexadecimal ascii para mayor comodidad y se verifica su integridad.

Trusted Keys utiliza un TPM tanto para generar como para sellar las claves. Las claves se sellan bajo una clave RSA de 2048 bits en el TPM, y opcionalmente se sellan a los valores especificados de PCR (medición de integridad), y solo se sellan mediante el TPM, si los PCR y las verificaciones de integridad de blob coinciden. Una clave de confianza cargada se puede actualizar con nuevos valores de PCR (futuros), por lo que las claves se pueden migrar fácilmente a nuevos valores de pcr, como cuando se actualizan el kernel y initramfs. La misma clave puede tener muchos blobs guardados con diferentes valores de PCR, por lo que se admiten fácilmente varias botas.

Por defecto, las claves de confianza están selladas bajo el SRK, que tiene el valor de autorización predeterminado (20 ceros). Esto se puede configurar en el momento de la adquisición con la utilidad del pantalón: tpm_takeownership -u -z .

Usage: keyctl add trusted name "new keylen [options]" ring keyctl add trusted name "load hex_blob [pcrlock=pcrnum]" ring keyctl update key "update [options]" keyctl print keyid options: keyhandle= ascii hex value of sealing key default 0x40000000 (SRK) keyauth= ascii hex auth for sealing key default 0x00...i (40 ascii zeros) blobauth= ascii hex auth for sealed data default 0x00... (40 ascii zeros) blobauth= ascii hex auth for sealed data default 0x00... (40 ascii zeros) pcrinfo= ascii hex of PCR_INFO or PCR_INFO_LONG (no default) pcrlock= pcr number to be extended to "lock" blob migratable= 0|1 indicating permission to reseal to new PCR values, default 1 (resealing allowed)

keyctl print devuelve una copia hexadecimal ascii de la llave sellada, que está en formato TPM_STORED_DATA estándar. La longitud de la clave para las nuevas claves siempre está en bytes. Trusted Keys puede ser de 32 a 128 bytes (256 a 1024 bits), el límite superior debe ajustarse dentro de la longitud de keke de SRK (RSA) de 2048 bits, con toda la estructura / relleno necesarios.

Las claves cifradas no dependen de un TPM, y son más rápidas, ya que utilizan AES para el cifrado / descifrado. Las nuevas claves se crean a partir de números aleatorios generados por el núcleo y se cifran / descifran utilizando una clave ''maestra'' especificada. La clave ''maestra'' puede ser una clave de confianza o un tipo de clave de usuario. La principal desventaja de las claves cifradas es que si no están enraizadas en una clave confiable, solo son tan seguras como la clave de usuario que las cifra. Por lo tanto, la clave de usuario maestra debe cargarse de la manera más segura posible, preferiblemente al inicio del arranque.

La parte descifrada de las claves cifradas puede contener una clave simétrica simple o una estructura más compleja. El formato de la estructura más compleja es específico de la aplicación, que se identifica por ''formato''.

Usage: keyctl add encrypted name "new [format] key-type:master-key-name keylen" ring keyctl add encrypted name "load hex_blob" ring keyctl update keyid "update key-type:master-key-name" format:= ''default | ecryptfs'' key-type:= ''trusted'' | ''user''

Ejemplos de uso de claves confiables y cifradas

Cree y guarde una clave de confianza llamada "kmk" de 32 bytes de longitud:

$ keyctl add trusted kmk "new 32" @u 440502848 $ keyctl show Session Keyring -3 --alswrv 500 500 keyring: _ses 97833714 --alswrv 500 -1 /_ keyring: _uid.500 440502848 --alswrv 500 500 /_ trusted: kmk $ keyctl print 440502848 0101000000000000000001005d01b7e3f4a6be5709930f3b70a743cbb42e0cc95e18e915 3f60da455bbf1144ad12e4f92b452f966929f6105fd29ca28e4d4d5a031d068478bacb0b 27351119f822911b0a11ba3d3498ba6a32e50dac7f32894dd890eb9ad578e4e292c83722 a52e56a097e6a68b3f56f7a52ece0cdccba1eb62cad7d817f6dc58898b3ac15f36026fec d568bd4a706cb60bb37be6d8f1240661199d640b66fb0fe3b079f97f450b9ef9c22c6d5d dd379f0facd1cd020281dfa3c70ba21a3fa6fc2471dc6d13ecf8298b946f65345faa5ef0 f1f8fff03ad0acb083725535636addb08d73dedb9832da198081e5deae84bfaf0409c22b e4a8aea2b607ec96931e6f4d4fe563ba $ keyctl pipe 440502848 > kmk.blob

Cargue una clave de confianza del blob guardado:

$ keyctl add trusted kmk "load `cat kmk.blob`" @u 268728824 $ keyctl print 268728824 0101000000000000000001005d01b7e3f4a6be5709930f3b70a743cbb42e0cc95e18e915 3f60da455bbf1144ad12e4f92b452f966929f6105fd29ca28e4d4d5a031d068478bacb0b 27351119f822911b0a11ba3d3498ba6a32e50dac7f32894dd890eb9ad578e4e292c83722 a52e56a097e6a68b3f56f7a52ece0cdccba1eb62cad7d817f6dc58898b3ac15f36026fec d568bd4a706cb60bb37be6d8f1240661199d640b66fb0fe3b079f97f450b9ef9c22c6d5d dd379f0facd1cd020281dfa3c70ba21a3fa6fc2471dc6d13ecf8298b946f65345faa5ef0 f1f8fff03ad0acb083725535636addb08d73dedb9832da198081e5deae84bfaf0409c22b e4a8aea2b607ec96931e6f4d4fe563ba

Vuelva a sellar una clave confiable bajo nuevos valores pcr:

$ keyctl update 268728824 "update pcrinfo=`cat pcr.blob`" $ keyctl print 268728824 010100000000002c0002800093c35a09b70fff26e7a98ae786c641e678ec6ffb6b46d805 77c8a6377aed9d3219c6dfec4b23ffe3000001005d37d472ac8a44023fbb3d18583a4f73 d3a076c0858f6f1dcaa39ea0f119911ff03f5406df4f7f27f41da8d7194f45c9f4e00f2e df449f266253aa3f52e55c53de147773e00f0f9aca86c64d94c95382265968c354c5eab4 9638c5ae99c89de1e0997242edfb0b501744e11ff9762dfd951cffd93227cc513384e7e6 e782c29435c7ec2edafaa2f4c1fe6e7a781b59549ff5296371b42133777dcc5b8b971610 94bc67ede19e43ddb9dc2baacad374a36feaf0314d700af0a65c164b7082401740e489c9 7ef6a24defe4846104209bf0c3eced7fa1a672ed5b125fc9d8cd88b476a658a4434644ef df8ae9a178e9f83ba9f08d10fa47e4226b98b0702f06b3b8

El consumidor inicial de claves confiables es EVM, que en el momento del arranque necesita una clave simétrica de alta calidad para la protección HMAC de los metadatos de los archivos. El uso de una clave confiable proporciona fuertes garantías de que la clave EVM no ha sido comprometida por un problema de nivel de usuario, y cuando se sella a valores específicos de PCR de arranque, protege contra ataques de arranque y fuera de línea. Cree y guarde una clave cifrada "evm" utilizando la clave de confianza "kmk" anterior:

opción 1: omitir ''formato''

$ keyctl add encrypted evm "new trusted:kmk 32" @u 159771175

opción 2: definir explícitamente ''formato'' como ''predeterminado''

$ keyctl add encrypted evm "new default trusted:kmk 32" @u 159771175 $ keyctl print 159771175 default trusted:kmk 32 2375725ad57798846a9bbd240de8906f006e66c03af53b1b3 82dbbc55be2a44616e4959430436dc4f2a7a9659aa60bb4652aeb2120f149ed197c564e0 24717c64 5972dcb82ab2dde83376d82b2e3c09ffc $ keyctl pipe 159771175 > evm.blob

Cargue una clave cifrada "evm" del blob guardado:

$ keyctl add encrypted evm "load `cat evm.blob`" @u 831684262 $ keyctl print 831684262 default trusted:kmk 32 2375725ad57798846a9bbd240de8906f006e66c03af53b1b3 82dbbc55be2a44616e4959430436dc4f2a7a9659aa60bb4652aeb2120f149ed197c564e0 24717c64 5972dcb82ab2dde83376d82b2e3c09ffc

Se anticipan otros usos para las claves confiables y cifradas, como para el cifrado de discos y archivos. En particular, se ha definido el nuevo formato ''ecryptfs'' para utilizar claves cifradas para montar un sistema de archivos eCryptfs. Se pueden encontrar más detalles sobre el uso en el archivo ''Documentation / security / keys-ecryptfs.txt''.


Cuando dice

especificando la clave HMAC

NO significa proporcionar la clave HMAC, significa "señalar la clave HMAC que desea utilizar" .

Los TPM pueden usar una cantidad virtualmente ilimitada de claves HMAC, como se señala en el libro. Tienes que decirle al TPM cuál usar.