trusted-encrypted.rst 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. ==========================
  2. Trusted and Encrypted Keys
  3. ==========================
  4. Trusted and Encrypted Keys are two new key types added to the existing kernel
  5. key ring service. Both of these new types are variable length symmetric keys,
  6. and in both cases all keys are created in the kernel, and user space sees,
  7. stores, and loads only encrypted blobs. Trusted Keys require the availability
  8. of a Trust Source for greater security, while Encrypted Keys can be used on any
  9. system. All user level blobs, are displayed and loaded in hex ASCII for
  10. convenience, and are integrity verified.
  11. Trust Source
  12. ============
  13. A trust source provides the source of security for Trusted Keys. This
  14. section lists currently supported trust sources, along with their security
  15. considerations. Whether or not a trust source is sufficiently safe depends
  16. on the strength and correctness of its implementation, as well as the threat
  17. environment for a specific use case. Since the kernel doesn't know what the
  18. environment is, and there is no metric of trust, it is dependent on the
  19. consumer of the Trusted Keys to determine if the trust source is sufficiently
  20. safe.
  21. * Root of trust for storage
  22. (1) TPM (Trusted Platform Module: hardware device)
  23. Rooted to Storage Root Key (SRK) which never leaves the TPM that
  24. provides crypto operation to establish root of trust for storage.
  25. (2) TEE (Trusted Execution Environment: OP-TEE based on Arm TrustZone)
  26. Rooted to Hardware Unique Key (HUK) which is generally burnt in on-chip
  27. fuses and is accessible to TEE only.
  28. (3) CAAM (Cryptographic Acceleration and Assurance Module: IP on NXP SoCs)
  29. When High Assurance Boot (HAB) is enabled and the CAAM is in secure
  30. mode, trust is rooted to the OTPMK, a never-disclosed 256-bit key
  31. randomly generated and fused into each SoC at manufacturing time.
  32. Otherwise, a common fixed test key is used instead.
  33. * Execution isolation
  34. (1) TPM
  35. Fixed set of operations running in isolated execution environment.
  36. (2) TEE
  37. Customizable set of operations running in isolated execution
  38. environment verified via Secure/Trusted boot process.
  39. (3) CAAM
  40. Fixed set of operations running in isolated execution environment.
  41. * Optional binding to platform integrity state
  42. (1) TPM
  43. Keys can be optionally sealed to specified PCR (integrity measurement)
  44. values, and only unsealed by the TPM, if PCRs and blob integrity
  45. verifications match. A loaded Trusted Key can be updated with new
  46. (future) PCR values, so keys are easily migrated to new PCR values,
  47. such as when the kernel and initramfs are updated. The same key can
  48. have many saved blobs under different PCR values, so multiple boots are
  49. easily supported.
  50. (2) TEE
  51. Relies on Secure/Trusted boot process for platform integrity. It can
  52. be extended with TEE based measured boot process.
  53. (3) CAAM
  54. Relies on the High Assurance Boot (HAB) mechanism of NXP SoCs
  55. for platform integrity.
  56. * Interfaces and APIs
  57. (1) TPM
  58. TPMs have well-documented, standardized interfaces and APIs.
  59. (2) TEE
  60. TEEs have well-documented, standardized client interface and APIs. For
  61. more details refer to ``Documentation/staging/tee.rst``.
  62. (3) CAAM
  63. Interface is specific to silicon vendor.
  64. * Threat model
  65. The strength and appropriateness of a particular trust source for a given
  66. purpose must be assessed when using them to protect security-relevant data.
  67. Key Generation
  68. ==============
  69. Trusted Keys
  70. ------------
  71. New keys are created from random numbers. They are encrypted/decrypted using
  72. a child key in the storage key hierarchy. Encryption and decryption of the
  73. child key must be protected by a strong access control policy within the
  74. trust source. The random number generator in use differs according to the
  75. selected trust source:
  76. * TPM: hardware device based RNG
  77. Keys are generated within the TPM. Strength of random numbers may vary
  78. from one device manufacturer to another.
  79. * TEE: OP-TEE based on Arm TrustZone based RNG
  80. RNG is customizable as per platform needs. It can either be direct output
  81. from platform specific hardware RNG or a software based Fortuna CSPRNG
  82. which can be seeded via multiple entropy sources.
  83. * CAAM: Kernel RNG
  84. The normal kernel random number generator is used. To seed it from the
  85. CAAM HWRNG, enable CRYPTO_DEV_FSL_CAAM_RNG_API and ensure the device
  86. is probed.
  87. Users may override this by specifying ``trusted.rng=kernel`` on the kernel
  88. command-line to override the used RNG with the kernel's random number pool.
  89. Encrypted Keys
  90. --------------
  91. Encrypted keys do not depend on a trust source, and are faster, as they use AES
  92. for encryption/decryption. New keys are created either from kernel-generated
  93. random numbers or user-provided decrypted data, and are encrypted/decrypted
  94. using a specified ‘master’ key. The ‘master’ key can either be a trusted-key or
  95. user-key type. The main disadvantage of encrypted keys is that if they are not
  96. rooted in a trusted key, they are only as secure as the user key encrypting
  97. them. The master user key should therefore be loaded in as secure a way as
  98. possible, preferably early in boot.
  99. Usage
  100. =====
  101. Trusted Keys usage: TPM
  102. -----------------------
  103. TPM 1.2: By default, trusted keys are sealed under the SRK, which has the
  104. default authorization value (20 bytes of 0s). This can be set at takeownership
  105. time with the TrouSerS utility: "tpm_takeownership -u -z".
  106. TPM 2.0: The user must first create a storage key and make it persistent, so the
  107. key is available after reboot. This can be done using the following commands.
  108. With the IBM TSS 2 stack::
  109. #> tsscreateprimary -hi o -st
  110. Handle 80000000
  111. #> tssevictcontrol -hi o -ho 80000000 -hp 81000001
  112. Or with the Intel TSS 2 stack::
  113. #> tpm2_createprimary --hierarchy o -G rsa2048 -c key.ctxt
  114. [...]
  115. #> tpm2_evictcontrol -c key.ctxt 0x81000001
  116. persistentHandle: 0x81000001
  117. Usage::
  118. keyctl add trusted name "new keylen [options]" ring
  119. keyctl add trusted name "load hex_blob [pcrlock=pcrnum]" ring
  120. keyctl update key "update [options]"
  121. keyctl print keyid
  122. options:
  123. keyhandle= ascii hex value of sealing key
  124. TPM 1.2: default 0x40000000 (SRK)
  125. TPM 2.0: no default; must be passed every time
  126. keyauth= ascii hex auth for sealing key default 0x00...i
  127. (40 ascii zeros)
  128. blobauth= ascii hex auth for sealed data default 0x00...
  129. (40 ascii zeros)
  130. pcrinfo= ascii hex of PCR_INFO or PCR_INFO_LONG (no default)
  131. pcrlock= pcr number to be extended to "lock" blob
  132. migratable= 0|1 indicating permission to reseal to new PCR values,
  133. default 1 (resealing allowed)
  134. hash= hash algorithm name as a string. For TPM 1.x the only
  135. allowed value is sha1. For TPM 2.x the allowed values
  136. are sha1, sha256, sha384, sha512 and sm3-256.
  137. policydigest= digest for the authorization policy. must be calculated
  138. with the same hash algorithm as specified by the 'hash='
  139. option.
  140. policyhandle= handle to an authorization policy session that defines the
  141. same policy and with the same hash algorithm as was used to
  142. seal the key.
  143. "keyctl print" returns an ascii hex copy of the sealed key, which is in standard
  144. TPM_STORED_DATA format. The key length for new keys are always in bytes.
  145. Trusted Keys can be 32 - 128 bytes (256 - 1024 bits), the upper limit is to fit
  146. within the 2048 bit SRK (RSA) keylength, with all necessary structure/padding.
  147. Trusted Keys usage: TEE
  148. -----------------------
  149. Usage::
  150. keyctl add trusted name "new keylen" ring
  151. keyctl add trusted name "load hex_blob" ring
  152. keyctl print keyid
  153. "keyctl print" returns an ASCII hex copy of the sealed key, which is in format
  154. specific to TEE device implementation. The key length for new keys is always
  155. in bytes. Trusted Keys can be 32 - 128 bytes (256 - 1024 bits).
  156. Trusted Keys usage: CAAM
  157. ------------------------
  158. Usage::
  159. keyctl add trusted name "new keylen" ring
  160. keyctl add trusted name "load hex_blob" ring
  161. keyctl print keyid
  162. "keyctl print" returns an ASCII hex copy of the sealed key, which is in a
  163. CAAM-specific format. The key length for new keys is always in bytes.
  164. Trusted Keys can be 32 - 128 bytes (256 - 1024 bits).
  165. Encrypted Keys usage
  166. --------------------
  167. The decrypted portion of encrypted keys can contain either a simple symmetric
  168. key or a more complex structure. The format of the more complex structure is
  169. application specific, which is identified by 'format'.
  170. Usage::
  171. keyctl add encrypted name "new [format] key-type:master-key-name keylen"
  172. ring
  173. keyctl add encrypted name "new [format] key-type:master-key-name keylen
  174. decrypted-data" ring
  175. keyctl add encrypted name "load hex_blob" ring
  176. keyctl update keyid "update key-type:master-key-name"
  177. Where::
  178. format:= 'default | ecryptfs | enc32'
  179. key-type:= 'trusted' | 'user'
  180. Examples of trusted and encrypted key usage
  181. -------------------------------------------
  182. Create and save a trusted key named "kmk" of length 32 bytes.
  183. Note: When using a TPM 2.0 with a persistent key with handle 0x81000001,
  184. append 'keyhandle=0x81000001' to statements between quotes, such as
  185. "new 32 keyhandle=0x81000001".
  186. ::
  187. $ keyctl add trusted kmk "new 32" @u
  188. 440502848
  189. $ keyctl show
  190. Session Keyring
  191. -3 --alswrv 500 500 keyring: _ses
  192. 97833714 --alswrv 500 -1 \_ keyring: _uid.500
  193. 440502848 --alswrv 500 500 \_ trusted: kmk
  194. $ keyctl print 440502848
  195. 0101000000000000000001005d01b7e3f4a6be5709930f3b70a743cbb42e0cc95e18e915
  196. 3f60da455bbf1144ad12e4f92b452f966929f6105fd29ca28e4d4d5a031d068478bacb0b
  197. 27351119f822911b0a11ba3d3498ba6a32e50dac7f32894dd890eb9ad578e4e292c83722
  198. a52e56a097e6a68b3f56f7a52ece0cdccba1eb62cad7d817f6dc58898b3ac15f36026fec
  199. d568bd4a706cb60bb37be6d8f1240661199d640b66fb0fe3b079f97f450b9ef9c22c6d5d
  200. dd379f0facd1cd020281dfa3c70ba21a3fa6fc2471dc6d13ecf8298b946f65345faa5ef0
  201. f1f8fff03ad0acb083725535636addb08d73dedb9832da198081e5deae84bfaf0409c22b
  202. e4a8aea2b607ec96931e6f4d4fe563ba
  203. $ keyctl pipe 440502848 > kmk.blob
  204. Load a trusted key from the saved blob::
  205. $ keyctl add trusted kmk "load `cat kmk.blob`" @u
  206. 268728824
  207. $ keyctl print 268728824
  208. 0101000000000000000001005d01b7e3f4a6be5709930f3b70a743cbb42e0cc95e18e915
  209. 3f60da455bbf1144ad12e4f92b452f966929f6105fd29ca28e4d4d5a031d068478bacb0b
  210. 27351119f822911b0a11ba3d3498ba6a32e50dac7f32894dd890eb9ad578e4e292c83722
  211. a52e56a097e6a68b3f56f7a52ece0cdccba1eb62cad7d817f6dc58898b3ac15f36026fec
  212. d568bd4a706cb60bb37be6d8f1240661199d640b66fb0fe3b079f97f450b9ef9c22c6d5d
  213. dd379f0facd1cd020281dfa3c70ba21a3fa6fc2471dc6d13ecf8298b946f65345faa5ef0
  214. f1f8fff03ad0acb083725535636addb08d73dedb9832da198081e5deae84bfaf0409c22b
  215. e4a8aea2b607ec96931e6f4d4fe563ba
  216. Reseal (TPM specific) a trusted key under new PCR values::
  217. $ keyctl update 268728824 "update pcrinfo=`cat pcr.blob`"
  218. $ keyctl print 268728824
  219. 010100000000002c0002800093c35a09b70fff26e7a98ae786c641e678ec6ffb6b46d805
  220. 77c8a6377aed9d3219c6dfec4b23ffe3000001005d37d472ac8a44023fbb3d18583a4f73
  221. d3a076c0858f6f1dcaa39ea0f119911ff03f5406df4f7f27f41da8d7194f45c9f4e00f2e
  222. df449f266253aa3f52e55c53de147773e00f0f9aca86c64d94c95382265968c354c5eab4
  223. 9638c5ae99c89de1e0997242edfb0b501744e11ff9762dfd951cffd93227cc513384e7e6
  224. e782c29435c7ec2edafaa2f4c1fe6e7a781b59549ff5296371b42133777dcc5b8b971610
  225. 94bc67ede19e43ddb9dc2baacad374a36feaf0314d700af0a65c164b7082401740e489c9
  226. 7ef6a24defe4846104209bf0c3eced7fa1a672ed5b125fc9d8cd88b476a658a4434644ef
  227. df8ae9a178e9f83ba9f08d10fa47e4226b98b0702f06b3b8
  228. The initial consumer of trusted keys is EVM, which at boot time needs a high
  229. quality symmetric key for HMAC protection of file metadata. The use of a
  230. trusted key provides strong guarantees that the EVM key has not been
  231. compromised by a user level problem, and when sealed to a platform integrity
  232. state, protects against boot and offline attacks. Create and save an
  233. encrypted key "evm" using the above trusted key "kmk":
  234. option 1: omitting 'format'::
  235. $ keyctl add encrypted evm "new trusted:kmk 32" @u
  236. 159771175
  237. option 2: explicitly defining 'format' as 'default'::
  238. $ keyctl add encrypted evm "new default trusted:kmk 32" @u
  239. 159771175
  240. $ keyctl print 159771175
  241. default trusted:kmk 32 2375725ad57798846a9bbd240de8906f006e66c03af53b1b3
  242. 82dbbc55be2a44616e4959430436dc4f2a7a9659aa60bb4652aeb2120f149ed197c564e0
  243. 24717c64 5972dcb82ab2dde83376d82b2e3c09ffc
  244. $ keyctl pipe 159771175 > evm.blob
  245. Load an encrypted key "evm" from saved blob::
  246. $ keyctl add encrypted evm "load `cat evm.blob`" @u
  247. 831684262
  248. $ keyctl print 831684262
  249. default trusted:kmk 32 2375725ad57798846a9bbd240de8906f006e66c03af53b1b3
  250. 82dbbc55be2a44616e4959430436dc4f2a7a9659aa60bb4652aeb2120f149ed197c564e0
  251. 24717c64 5972dcb82ab2dde83376d82b2e3c09ffc
  252. Instantiate an encrypted key "evm" using user-provided decrypted data::
  253. $ evmkey=$(dd if=/dev/urandom bs=1 count=32 | xxd -c32 -p)
  254. $ keyctl add encrypted evm "new default user:kmk 32 $evmkey" @u
  255. 794890253
  256. $ keyctl print 794890253
  257. default user:kmk 32 2375725ad57798846a9bbd240de8906f006e66c03af53b1b382d
  258. bbc55be2a44616e4959430436dc4f2a7a9659aa60bb4652aeb2120f149ed197c564e0247
  259. 17c64 5972dcb82ab2dde83376d82b2e3c09ffc
  260. Other uses for trusted and encrypted keys, such as for disk and file encryption
  261. are anticipated. In particular the new format 'ecryptfs' has been defined
  262. in order to use encrypted keys to mount an eCryptfs filesystem. More details
  263. about the usage can be found in the file
  264. ``Documentation/security/keys/ecryptfs.rst``.
  265. Another new format 'enc32' has been defined in order to support encrypted keys
  266. with payload size of 32 bytes. This will initially be used for nvdimm security
  267. but may expand to other usages that require 32 bytes payload.
  268. TPM 2.0 ASN.1 Key Format
  269. ------------------------
  270. The TPM 2.0 ASN.1 key format is designed to be easily recognisable,
  271. even in binary form (fixing a problem we had with the TPM 1.2 ASN.1
  272. format) and to be extensible for additions like importable keys and
  273. policy::
  274. TPMKey ::= SEQUENCE {
  275. type OBJECT IDENTIFIER
  276. emptyAuth [0] EXPLICIT BOOLEAN OPTIONAL
  277. parent INTEGER
  278. pubkey OCTET STRING
  279. privkey OCTET STRING
  280. }
  281. type is what distinguishes the key even in binary form since the OID
  282. is provided by the TCG to be unique and thus forms a recognizable
  283. binary pattern at offset 3 in the key. The OIDs currently made
  284. available are::
  285. 2.23.133.10.1.3 TPM Loadable key. This is an asymmetric key (Usually
  286. RSA2048 or Elliptic Curve) which can be imported by a
  287. TPM2_Load() operation.
  288. 2.23.133.10.1.4 TPM Importable Key. This is an asymmetric key (Usually
  289. RSA2048 or Elliptic Curve) which can be imported by a
  290. TPM2_Import() operation.
  291. 2.23.133.10.1.5 TPM Sealed Data. This is a set of data (up to 128
  292. bytes) which is sealed by the TPM. It usually
  293. represents a symmetric key and must be unsealed before
  294. use.
  295. The trusted key code only uses the TPM Sealed Data OID.
  296. emptyAuth is true if the key has well known authorization "". If it
  297. is false or not present, the key requires an explicit authorization
  298. phrase. This is used by most user space consumers to decide whether
  299. to prompt for a password.
  300. parent represents the parent key handle, either in the 0x81 MSO space,
  301. like 0x81000001 for the RSA primary storage key. Userspace programmes
  302. also support specifying the primary handle in the 0x40 MSO space. If
  303. this happens the Elliptic Curve variant of the primary key using the
  304. TCG defined template will be generated on the fly into a volatile
  305. object and used as the parent. The current kernel code only supports
  306. the 0x81 MSO form.
  307. pubkey is the binary representation of TPM2B_PRIVATE excluding the
  308. initial TPM2B header, which can be reconstructed from the ASN.1 octet
  309. string length.
  310. privkey is the binary representation of TPM2B_PUBLIC excluding the
  311. initial TPM2B header which can be reconstructed from the ASN.1 octed
  312. string length.