inline-encryption.rst 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517
  1. .. SPDX-License-Identifier: GPL-2.0
  2. .. _inline_encryption:
  3. =================
  4. Inline Encryption
  5. =================
  6. Background
  7. ==========
  8. Inline encryption hardware sits logically between memory and disk, and can
  9. en/decrypt data as it goes in/out of the disk. For each I/O request, software
  10. can control exactly how the inline encryption hardware will en/decrypt the data
  11. in terms of key, algorithm, data unit size (the granularity of en/decryption),
  12. and data unit number (a value that determines the initialization vector(s)).
  13. Some inline encryption hardware accepts all encryption parameters including raw
  14. keys directly in low-level I/O requests. However, most inline encryption
  15. hardware instead has a fixed number of "keyslots" and requires that the key,
  16. algorithm, and data unit size first be programmed into a keyslot. Each
  17. low-level I/O request then just contains a keyslot index and data unit number.
  18. Note that inline encryption hardware is very different from traditional crypto
  19. accelerators, which are supported through the kernel crypto API. Traditional
  20. crypto accelerators operate on memory regions, whereas inline encryption
  21. hardware operates on I/O requests. Thus, inline encryption hardware needs to be
  22. managed by the block layer, not the kernel crypto API.
  23. Inline encryption hardware is also very different from "self-encrypting drives",
  24. such as those based on the TCG Opal or ATA Security standards. Self-encrypting
  25. drives don't provide fine-grained control of encryption and provide no way to
  26. verify the correctness of the resulting ciphertext. Inline encryption hardware
  27. provides fine-grained control of encryption, including the choice of key and
  28. initialization vector for each sector, and can be tested for correctness.
  29. Objective
  30. =========
  31. We want to support inline encryption in the kernel. To make testing easier, we
  32. also want support for falling back to the kernel crypto API when actual inline
  33. encryption hardware is absent. We also want inline encryption to work with
  34. layered devices like device-mapper and loopback (i.e. we want to be able to use
  35. the inline encryption hardware of the underlying devices if present, or else
  36. fall back to crypto API en/decryption).
  37. Constraints and notes
  38. =====================
  39. - We need a way for upper layers (e.g. filesystems) to specify an encryption
  40. context to use for en/decrypting a bio, and device drivers (e.g. UFSHCD) need
  41. to be able to use that encryption context when they process the request.
  42. Encryption contexts also introduce constraints on bio merging; the block layer
  43. needs to be aware of these constraints.
  44. - Different inline encryption hardware has different supported algorithms,
  45. supported data unit sizes, maximum data unit numbers, etc. We call these
  46. properties the "crypto capabilities". We need a way for device drivers to
  47. advertise crypto capabilities to upper layers in a generic way.
  48. - Inline encryption hardware usually (but not always) requires that keys be
  49. programmed into keyslots before being used. Since programming keyslots may be
  50. slow and there may not be very many keyslots, we shouldn't just program the
  51. key for every I/O request, but rather keep track of which keys are in the
  52. keyslots and reuse an already-programmed keyslot when possible.
  53. - Upper layers typically define a specific end-of-life for crypto keys, e.g.
  54. when an encrypted directory is locked or when a crypto mapping is torn down.
  55. At these times, keys are wiped from memory. We must provide a way for upper
  56. layers to also evict keys from any keyslots they are present in.
  57. - When possible, device-mapper devices must be able to pass through the inline
  58. encryption support of their underlying devices. However, it doesn't make
  59. sense for device-mapper devices to have keyslots themselves.
  60. Basic design
  61. ============
  62. We introduce ``struct blk_crypto_key`` to represent an inline encryption key and
  63. how it will be used. This includes the type of the key (standard or
  64. hardware-wrapped); the actual bytes of the key; the size of the key; the
  65. algorithm and data unit size the key will be used with; and the number of bytes
  66. needed to represent the maximum data unit number the key will be used with.
  67. We introduce ``struct bio_crypt_ctx`` to represent an encryption context. It
  68. contains a data unit number and a pointer to a blk_crypto_key. We add pointers
  69. to a bio_crypt_ctx to ``struct bio`` and ``struct request``; this allows users
  70. of the block layer (e.g. filesystems) to provide an encryption context when
  71. creating a bio and have it be passed down the stack for processing by the block
  72. layer and device drivers. Note that the encryption context doesn't explicitly
  73. say whether to encrypt or decrypt, as that is implicit from the direction of the
  74. bio; WRITE means encrypt, and READ means decrypt.
  75. We also introduce ``struct blk_crypto_profile`` to contain all generic inline
  76. encryption-related state for a particular inline encryption device. The
  77. blk_crypto_profile serves as the way that drivers for inline encryption hardware
  78. advertise their crypto capabilities and provide certain functions (e.g.,
  79. functions to program and evict keys) to upper layers. Each device driver that
  80. wants to support inline encryption will construct a blk_crypto_profile, then
  81. associate it with the disk's request_queue.
  82. The blk_crypto_profile also manages the hardware's keyslots, when applicable.
  83. This happens in the block layer, so that users of the block layer can just
  84. specify encryption contexts and don't need to know about keyslots at all, nor do
  85. device drivers need to care about most details of keyslot management.
  86. Specifically, for each keyslot, the block layer (via the blk_crypto_profile)
  87. keeps track of which blk_crypto_key that keyslot contains (if any), and how many
  88. in-flight I/O requests are using it. When the block layer creates a
  89. ``struct request`` for a bio that has an encryption context, it grabs a keyslot
  90. that already contains the key if possible. Otherwise it waits for an idle
  91. keyslot (a keyslot that isn't in-use by any I/O), then programs the key into the
  92. least-recently-used idle keyslot using the function the device driver provided.
  93. In both cases, the resulting keyslot is stored in the ``crypt_keyslot`` field of
  94. the request, where it is then accessible to device drivers and is released after
  95. the request completes.
  96. ``struct request`` also contains a pointer to the original bio_crypt_ctx.
  97. Requests can be built from multiple bios, and the block layer must take the
  98. encryption context into account when trying to merge bios and requests. For two
  99. bios/requests to be merged, they must have compatible encryption contexts: both
  100. unencrypted, or both encrypted with the same key and contiguous data unit
  101. numbers. Only the encryption context for the first bio in a request is
  102. retained, since the remaining bios have been verified to be merge-compatible
  103. with the first bio.
  104. To make it possible for inline encryption to work with request_queue based
  105. layered devices, when a request is cloned, its encryption context is cloned as
  106. well. When the cloned request is submitted, it is then processed as usual; this
  107. includes getting a keyslot from the clone's target device if needed.
  108. blk-crypto-fallback
  109. ===================
  110. It is desirable for the inline encryption support of upper layers (e.g.
  111. filesystems) to be testable without real inline encryption hardware, and
  112. likewise for the block layer's keyslot management logic. It is also desirable
  113. to allow upper layers to just always use inline encryption rather than have to
  114. implement encryption in multiple ways.
  115. Therefore, we also introduce *blk-crypto-fallback*, which is an implementation
  116. of inline encryption using the kernel crypto API. blk-crypto-fallback is built
  117. into the block layer, so it works on any block device without any special setup.
  118. Essentially, when a bio with an encryption context is submitted to a
  119. block_device that doesn't support that encryption context, the block layer will
  120. handle en/decryption of the bio using blk-crypto-fallback.
  121. For encryption, the data cannot be encrypted in-place, as callers usually rely
  122. on it being unmodified. Instead, blk-crypto-fallback allocates bounce pages,
  123. fills a new bio with those bounce pages, encrypts the data into those bounce
  124. pages, and submits that "bounce" bio. When the bounce bio completes,
  125. blk-crypto-fallback completes the original bio. If the original bio is too
  126. large, multiple bounce bios may be required; see the code for details.
  127. For decryption, blk-crypto-fallback "wraps" the bio's completion callback
  128. (``bi_complete``) and private data (``bi_private``) with its own, unsets the
  129. bio's encryption context, then submits the bio. If the read completes
  130. successfully, blk-crypto-fallback restores the bio's original completion
  131. callback and private data, then decrypts the bio's data in-place using the
  132. kernel crypto API. Decryption happens from a workqueue, as it may sleep.
  133. Afterwards, blk-crypto-fallback completes the bio.
  134. In both cases, the bios that blk-crypto-fallback submits no longer have an
  135. encryption context. Therefore, lower layers only see standard unencrypted I/O.
  136. blk-crypto-fallback also defines its own blk_crypto_profile and has its own
  137. "keyslots"; its keyslots contain ``struct crypto_skcipher`` objects. The reason
  138. for this is twofold. First, it allows the keyslot management logic to be tested
  139. without actual inline encryption hardware. Second, similar to actual inline
  140. encryption hardware, the crypto API doesn't accept keys directly in requests but
  141. rather requires that keys be set ahead of time, and setting keys can be
  142. expensive; moreover, allocating a crypto_skcipher can't happen on the I/O path
  143. at all due to the locks it takes. Therefore, the concept of keyslots still
  144. makes sense for blk-crypto-fallback.
  145. Note that regardless of whether real inline encryption hardware or
  146. blk-crypto-fallback is used, the ciphertext written to disk (and hence the
  147. on-disk format of data) will be the same (assuming that both the inline
  148. encryption hardware's implementation and the kernel crypto API's implementation
  149. of the algorithm being used adhere to spec and function correctly).
  150. blk-crypto-fallback is optional and is controlled by the
  151. ``CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK`` kernel configuration option.
  152. API presented to users of the block layer
  153. =========================================
  154. ``blk_crypto_config_supported()`` allows users to check ahead of time whether
  155. inline encryption with particular crypto settings will work on a particular
  156. block_device -- either via hardware or via blk-crypto-fallback. This function
  157. takes in a ``struct blk_crypto_config`` which is like blk_crypto_key, but omits
  158. the actual bytes of the key and instead just contains the algorithm, data unit
  159. size, etc. This function can be useful if blk-crypto-fallback is disabled.
  160. ``blk_crypto_init_key()`` allows users to initialize a blk_crypto_key.
  161. Users must call ``blk_crypto_start_using_key()`` before actually starting to use
  162. a blk_crypto_key on a block_device (even if ``blk_crypto_config_supported()``
  163. was called earlier). This is needed to initialize blk-crypto-fallback if it
  164. will be needed. This must not be called from the data path, as this may have to
  165. allocate resources, which may deadlock in that case.
  166. Next, to attach an encryption context to a bio, users should call
  167. ``bio_crypt_set_ctx()``. This function allocates a bio_crypt_ctx and attaches
  168. it to a bio, given the blk_crypto_key and the data unit number that will be used
  169. for en/decryption. Users don't need to worry about freeing the bio_crypt_ctx
  170. later, as that happens automatically when the bio is freed or reset.
  171. Finally, when done using inline encryption with a blk_crypto_key on a
  172. block_device, users must call ``blk_crypto_evict_key()``. This ensures that
  173. the key is evicted from all keyslots it may be programmed into and unlinked from
  174. any kernel data structures it may be linked into.
  175. In summary, for users of the block layer, the lifecycle of a blk_crypto_key is
  176. as follows:
  177. 1. ``blk_crypto_config_supported()`` (optional)
  178. 2. ``blk_crypto_init_key()``
  179. 3. ``blk_crypto_start_using_key()``
  180. 4. ``bio_crypt_set_ctx()`` (potentially many times)
  181. 5. ``blk_crypto_evict_key()`` (after all I/O has completed)
  182. 6. Zeroize the blk_crypto_key (this has no dedicated function)
  183. If a blk_crypto_key is being used on multiple block_devices, then
  184. ``blk_crypto_config_supported()`` (if used), ``blk_crypto_start_using_key()``,
  185. and ``blk_crypto_evict_key()`` must be called on each block_device.
  186. API presented to device drivers
  187. ===============================
  188. A device driver that wants to support inline encryption must set up a
  189. blk_crypto_profile in the request_queue of its device. To do this, it first
  190. must call ``blk_crypto_profile_init()`` (or its resource-managed variant
  191. ``devm_blk_crypto_profile_init()``), providing the number of keyslots.
  192. Next, it must advertise its crypto capabilities by setting fields in the
  193. blk_crypto_profile, e.g. ``modes_supported`` and ``max_dun_bytes_supported``.
  194. It then must set function pointers in the ``ll_ops`` field of the
  195. blk_crypto_profile to tell upper layers how to control the inline encryption
  196. hardware, e.g. how to program and evict keyslots. Most drivers will need to
  197. implement ``keyslot_program`` and ``keyslot_evict``. For details, see the
  198. comments for ``struct blk_crypto_ll_ops``.
  199. Once the driver registers a blk_crypto_profile with a request_queue, I/O
  200. requests the driver receives via that queue may have an encryption context. All
  201. encryption contexts will be compatible with the crypto capabilities declared in
  202. the blk_crypto_profile, so drivers don't need to worry about handling
  203. unsupported requests. Also, if a nonzero number of keyslots was declared in the
  204. blk_crypto_profile, then all I/O requests that have an encryption context will
  205. also have a keyslot which was already programmed with the appropriate key.
  206. If the driver implements runtime suspend and its blk_crypto_ll_ops don't work
  207. while the device is runtime-suspended, then the driver must also set the ``dev``
  208. field of the blk_crypto_profile to point to the ``struct device`` that will be
  209. resumed before any of the low-level operations are called.
  210. If there are situations where the inline encryption hardware loses the contents
  211. of its keyslots, e.g. device resets, the driver must handle reprogramming the
  212. keyslots. To do this, the driver may call ``blk_crypto_reprogram_all_keys()``.
  213. Finally, if the driver used ``blk_crypto_profile_init()`` instead of
  214. ``devm_blk_crypto_profile_init()``, then it is responsible for calling
  215. ``blk_crypto_profile_destroy()`` when the crypto profile is no longer needed.
  216. Layered Devices
  217. ===============
  218. Request queue based layered devices like dm-rq that wish to support inline
  219. encryption need to create their own blk_crypto_profile for their request_queue,
  220. and expose whatever functionality they choose. When a layered device wants to
  221. pass a clone of that request to another request_queue, blk-crypto will
  222. initialize and prepare the clone as necessary; see
  223. ``blk_crypto_insert_cloned_request()``.
  224. Interaction between inline encryption and blk integrity
  225. =======================================================
  226. At the time of this patch, there is no real hardware that supports both these
  227. features. However, these features do interact with each other, and it's not
  228. completely trivial to make them both work together properly. In particular,
  229. when a WRITE bio wants to use inline encryption on a device that supports both
  230. features, the bio will have an encryption context specified, after which
  231. its integrity information is calculated (using the plaintext data, since
  232. the encryption will happen while data is being written), and the data and
  233. integrity info is sent to the device. Obviously, the integrity info must be
  234. verified before the data is encrypted. After the data is encrypted, the device
  235. must not store the integrity info that it received with the plaintext data
  236. since that might reveal information about the plaintext data. As such, it must
  237. re-generate the integrity info from the ciphertext data and store that on disk
  238. instead. Another issue with storing the integrity info of the plaintext data is
  239. that it changes the on disk format depending on whether hardware inline
  240. encryption support is present or the kernel crypto API fallback is used (since
  241. if the fallback is used, the device will receive the integrity info of the
  242. ciphertext, not that of the plaintext).
  243. Because there isn't any real hardware yet, it seems prudent to assume that
  244. hardware implementations might not implement both features together correctly,
  245. and disallow the combination for now. Whenever a device supports integrity, the
  246. kernel will pretend that the device does not support hardware inline encryption
  247. (by setting the blk_crypto_profile in the request_queue of the device to NULL).
  248. When the crypto API fallback is enabled, this means that all bios with and
  249. encryption context will use the fallback, and IO will complete as usual. When
  250. the fallback is disabled, a bio with an encryption context will be failed.
  251. .. _hardware_wrapped_keys:
  252. Hardware-wrapped keys
  253. =====================
  254. Motivation and threat model
  255. ---------------------------
  256. Linux storage encryption (dm-crypt, fscrypt, eCryptfs, etc.) traditionally
  257. relies on the raw encryption key(s) being present in kernel memory so that the
  258. encryption can be performed. This traditionally isn't seen as a problem because
  259. the key(s) won't be present during an offline attack, which is the main type of
  260. attack that storage encryption is intended to protect from.
  261. However, there is an increasing desire to also protect users' data from other
  262. types of attacks (to the extent possible), including:
  263. - Cold boot attacks, where an attacker with physical access to a system suddenly
  264. powers it off, then immediately dumps the system memory to extract recently
  265. in-use encryption keys, then uses these keys to decrypt user data on-disk.
  266. - Online attacks where the attacker is able to read kernel memory without fully
  267. compromising the system, followed by an offline attack where any extracted
  268. keys can be used to decrypt user data on-disk. An example of such an online
  269. attack would be if the attacker is able to run some code on the system that
  270. exploits a Meltdown-like vulnerability but is unable to escalate privileges.
  271. - Online attacks where the attacker fully compromises the system, but their data
  272. exfiltration is significantly time-limited and/or bandwidth-limited, so in
  273. order to completely exfiltrate the data they need to extract the encryption
  274. keys to use in a later offline attack.
  275. Hardware-wrapped keys are a feature of inline encryption hardware that is
  276. designed to protect users' data from the above attacks (to the extent possible),
  277. without introducing limitations such as a maximum number of keys.
  278. Note that it is impossible to **fully** protect users' data from these attacks.
  279. Even in the attacks where the attacker "just" gets read access to kernel memory,
  280. they can still extract any user data that is present in memory, including
  281. plaintext pagecache pages of encrypted files. The focus here is just on
  282. protecting the encryption keys, as those instantly give access to **all** user
  283. data in any following offline attack, rather than just some of it (where which
  284. data is included in that "some" might not be controlled by the attacker).
  285. Solution overview
  286. -----------------
  287. Inline encryption hardware typically has "keyslots" into which software can
  288. program keys for the hardware to use; the contents of keyslots typically can't
  289. be read back by software. As such, the above security goals could be achieved
  290. if the kernel simply erased its copy of the key(s) after programming them into
  291. keyslot(s) and thereafter only referred to them via keyslot number.
  292. However, that naive approach runs into the problem that it limits the number of
  293. unlocked keys to the number of keyslots, which typically is a small number. In
  294. cases where there is only one encryption key system-wide (e.g., a full-disk
  295. encryption key), that can be tolerable. However, in general there can be many
  296. logged-in users with many different keys, and/or many running applications with
  297. application-specific encrypted storage areas. This is especially true if
  298. file-based encryption (e.g. fscrypt) is being used.
  299. Thus, it is important for the kernel to still have a way to "remind" the
  300. hardware about a key, without actually having the raw key itself. This would
  301. ensure that the number of hardware keyslots only limits the number of active I/O
  302. requests, not other things such as the number of logged-in users, the number of
  303. running apps, or the number of encrypted storage areas that apps can create.
  304. Somewhat less importantly, it is also desirable that the raw keys are never
  305. visible to software at all, even while being initially unlocked. This would
  306. ensure that a read-only compromise of system memory will never allow a key to be
  307. extracted to be used off-system, even if it occurs when a key is being unlocked.
  308. To solve all these problems, some vendors of inline encryption hardware have
  309. made their hardware support *hardware-wrapped keys*. Hardware-wrapped keys
  310. are encrypted keys that can only be unwrapped (decrypted) and used by hardware
  311. -- either by the inline encryption hardware itself, or by a dedicated hardware
  312. block that can directly provision keys to the inline encryption hardware.
  313. (We refer to them as "hardware-wrapped keys" rather than simply "wrapped keys"
  314. to add some clarity in cases where there could be other types of wrapped keys,
  315. such as in file-based encryption. Key wrapping is a commonly used technique.)
  316. The key which wraps (encrypts) hardware-wrapped keys is a hardware-internal key
  317. that is never exposed to software; it is either a persistent key (a "long-term
  318. wrapping key") or a per-boot key (an "ephemeral wrapping key"). The long-term
  319. wrapped form of the key is what is initially unlocked, but it is erased from
  320. memory as soon as it is converted into an ephemerally-wrapped key. In-use
  321. hardware-wrapped keys are always ephemerally-wrapped, not long-term wrapped.
  322. As inline encryption hardware can only be used to encrypt/decrypt data on-disk,
  323. the hardware also includes a level of indirection; it doesn't use the unwrapped
  324. key directly for inline encryption, but rather derives both an inline encryption
  325. key and a "software secret" from it. Software can use the "software secret" for
  326. tasks that can't use the inline encryption hardware, such as filenames
  327. encryption. The software secret is not protected from memory compromise.
  328. Key hierarchy
  329. -------------
  330. Here is the key hierarchy for a hardware-wrapped key::
  331. Hardware-wrapped key
  332. |
  333. |
  334. <Hardware KDF>
  335. |
  336. -----------------------------
  337. | |
  338. Inline encryption key Software secret
  339. The components are:
  340. - *Hardware-wrapped key*: a key for the hardware's KDF (Key Derivation
  341. Function), in ephemerally-wrapped form. The key wrapping algorithm is a
  342. hardware implementation detail that doesn't impact kernel operation, but a
  343. strong authenticated encryption algorithm such as AES-256-GCM is recommended.
  344. - *Hardware KDF*: a KDF (Key Derivation Function) which the hardware uses to
  345. derive subkeys after unwrapping the wrapped key. The hardware's choice of KDF
  346. doesn't impact kernel operation, but it does need to be known for testing
  347. purposes, and it's also assumed to have at least a 256-bit security strength.
  348. All known hardware uses the SP800-108 KDF in Counter Mode with AES-256-CMAC,
  349. with a particular choice of labels and contexts; new hardware should use this
  350. already-vetted KDF.
  351. - *Inline encryption key*: a derived key which the hardware directly provisions
  352. to a keyslot of the inline encryption hardware, without exposing it to
  353. software. In all known hardware, this will always be an AES-256-XTS key.
  354. However, in principle other encryption algorithms could be supported too.
  355. Hardware must derive distinct subkeys for each supported encryption algorithm.
  356. - *Software secret*: a derived key which the hardware returns to software so
  357. that software can use it for cryptographic tasks that can't use inline
  358. encryption. This value is cryptographically isolated from the inline
  359. encryption key, i.e. knowing one doesn't reveal the other. (The KDF ensures
  360. this.) Currently, the software secret is always 32 bytes and thus is suitable
  361. for cryptographic applications that require up to a 256-bit security strength.
  362. Some use cases (e.g. full-disk encryption) won't require the software secret.
  363. Example: in the case of fscrypt, the fscrypt master key (the key that protects a
  364. particular set of encrypted directories) is made hardware-wrapped. The inline
  365. encryption key is used as the file contents encryption key, while the software
  366. secret (rather than the master key directly) is used to key fscrypt's KDF
  367. (HKDF-SHA512) to derive other subkeys such as filenames encryption keys.
  368. Note that currently this design assumes a single inline encryption key per
  369. hardware-wrapped key, without any further key derivation. Thus, in the case of
  370. fscrypt, currently hardware-wrapped keys are only compatible with the "inline
  371. encryption optimized" settings, which use one file contents encryption key per
  372. encryption policy rather than one per file. This design could be extended to
  373. make the hardware derive per-file keys using per-file nonces passed down the
  374. storage stack, and in fact some hardware already supports this; future work is
  375. planned to remove this limitation by adding the corresponding kernel support.
  376. Kernel support
  377. --------------
  378. The inline encryption support of the kernel's block layer ("blk-crypto") has
  379. been extended to support hardware-wrapped keys as an alternative to standard
  380. keys, when hardware support is available. This works in the following way:
  381. - A ``key_types_supported`` field is added to the crypto capabilities in
  382. ``struct blk_crypto_profile``. This allows device drivers to declare that
  383. they support standard keys, hardware-wrapped keys, or both.
  384. - ``struct blk_crypto_key`` can now contain a hardware-wrapped key as an
  385. alternative to a standard key; a ``key_type`` field is added to
  386. ``struct blk_crypto_config`` to distinguish between the different key types.
  387. This allows users of blk-crypto to en/decrypt data using a hardware-wrapped
  388. key in a way very similar to using a standard key.
  389. - A new method ``blk_crypto_ll_ops::derive_sw_secret`` is added. Device drivers
  390. that support hardware-wrapped keys must implement this method. Users of
  391. blk-crypto can call ``blk_crypto_derive_sw_secret()`` to access this method.
  392. - The programming and eviction of hardware-wrapped keys happens via
  393. ``blk_crypto_ll_ops::keyslot_program`` and
  394. ``blk_crypto_ll_ops::keyslot_evict``, just like it does for standard keys. If
  395. a driver supports hardware-wrapped keys, then it must handle hardware-wrapped
  396. keys being passed to these methods.
  397. blk-crypto-fallback doesn't support hardware-wrapped keys. Therefore,
  398. hardware-wrapped keys can only be used with actual inline encryption hardware.
  399. Currently, the kernel only works with hardware-wrapped keys in
  400. ephemerally-wrapped form. No generic kernel interfaces are provided for
  401. generating or importing hardware-wrapped keys in the first place, or converting
  402. them to ephemerally-wrapped form. In Android, SoC vendors are required to
  403. support these operations in their KeyMint implementation (a hardware abstraction
  404. layer in userspace); for details, see the `Android documentation
  405. <https://source.android.com/security/encryption/hw-wrapped-keys>`_.
  406. Testability
  407. -----------
  408. Both the hardware KDF and the inline encryption itself are well-defined
  409. algorithms that don't depend on any secrets other than the unwrapped key.
  410. Therefore, if the unwrapped key is known to software, these algorithms can be
  411. reproduced in software in order to verify the ciphertext that is written to disk
  412. by the inline encryption hardware.
  413. However, the unwrapped key will only be known to software for testing if the
  414. "import" functionality is used. Proper testing is not possible in the
  415. "generate" case where the hardware generates the key itself. The correct
  416. operation of the "generate" mode thus relies on the security and correctness of
  417. the hardware RNG and its use to generate the key, as well as the testing of the
  418. "import" mode as that should cover all parts other than the key generation.
  419. For an example of a test that verifies the ciphertext written to disk in the
  420. "import" mode, see the fscrypt hardware-wrapped key tests in xfstests, or
  421. `Android's vts_kernel_encryption_test
  422. <https://android.googlesource.com/platform/test/vts-testcase/kernel/+/refs/heads/master/encryption/>`_.