REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737 Apply uncrustify changes to .c/.h files in the MdePkg package Cc: Andrew Fish <afish@apple.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn>
		
			
				
	
	
		
			524 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			524 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   The UEFI Inline Cryptographic Interface protocol provides services to abstract
 | |
|   access to inline cryptographic capabilities.
 | |
| 
 | |
|   Copyright (c) 2015-2018, Intel Corporation. All rights reserved.<BR>
 | |
|   SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| 
 | |
|   @par Revision Reference:
 | |
|   This Protocol was introduced in UEFI Specification 2.5.
 | |
| 
 | |
| **/
 | |
| 
 | |
| #ifndef __BLOCK_IO_CRYPTO_H__
 | |
| #define __BLOCK_IO_CRYPTO_H__
 | |
| 
 | |
| #include <Protocol/BlockIo.h>
 | |
| 
 | |
| #define EFI_BLOCK_IO_CRYPTO_PROTOCOL_GUID \
 | |
|     { \
 | |
|       0xa00490ba, 0x3f1a, 0x4b4c, {0xab, 0x90, 0x4f, 0xa9, 0x97, 0x26, 0xa1, 0xe8} \
 | |
|     }
 | |
| 
 | |
| typedef struct _EFI_BLOCK_IO_CRYPTO_PROTOCOL EFI_BLOCK_IO_CRYPTO_PROTOCOL;
 | |
| 
 | |
| ///
 | |
| /// The struct of Block I/O Crypto Token.
 | |
| ///
 | |
| typedef struct {
 | |
|   //
 | |
|   // If Event is NULL, then blocking I/O is performed. If Event is not NULL and
 | |
|   // non-blocking I/O is supported, then non-blocking I/O is performed, and
 | |
|   // Event will be signaled when the read request is completed and data was
 | |
|   // decrypted  (when Index was specified).
 | |
|   //
 | |
|   EFI_EVENT     Event;
 | |
|   //
 | |
|   // Defines whether or not the signaled event encountered an error.
 | |
|   //
 | |
|   EFI_STATUS    TransactionStatus;
 | |
| } EFI_BLOCK_IO_CRYPTO_TOKEN;
 | |
| 
 | |
| typedef struct {
 | |
|   //
 | |
|   // GUID of the algorithm.
 | |
|   //
 | |
|   EFI_GUID    Algorithm;
 | |
|   //
 | |
|   // Specifies KeySizein bits used with this Algorithm.
 | |
|   //
 | |
|   UINT64      KeySize;
 | |
|   //
 | |
|   // Specifies bitmask of block sizes supported by this algorithm.
 | |
|   // Bit j being set means that 2^j bytes crypto block size is supported.
 | |
|   //
 | |
|   UINT64      CryptoBlockSizeBitMask;
 | |
| } EFI_BLOCK_IO_CRYPTO_CAPABILITY;
 | |
| 
 | |
| ///
 | |
| /// EFI_BLOCK_IO_CRYPTO_IV_INPUT structure is used as a common header in CryptoIvInput
 | |
| /// parameters passed to the ReadExtended and WriteExtended methods for Inline
 | |
| /// Cryptographic Interface.
 | |
| /// Its purpose is to pass size of the entire CryptoIvInputparameter memory buffer to
 | |
| /// the Inline Cryptographic Interface.
 | |
| ///
 | |
| typedef struct {
 | |
|   UINT64    InputSize;
 | |
| } EFI_BLOCK_IO_CRYPTO_IV_INPUT;
 | |
| 
 | |
| #define EFI_BLOCK_IO_CRYPTO_ALGO_GUID_AES_XTS \
 | |
|     { \
 | |
|       0x2f87ba6a, 0x5c04, 0x4385, {0xa7, 0x80, 0xf3, 0xbf, 0x78, 0xa9, 0x7b, 0xec} \
 | |
|     }
 | |
| 
 | |
| extern EFI_GUID  gEfiBlockIoCryptoAlgoAesXtsGuid;
 | |
| 
 | |
| typedef struct {
 | |
|   EFI_BLOCK_IO_CRYPTO_IV_INPUT    Header;
 | |
|   UINT64                          CryptoBlockNumber;
 | |
|   UINT64                          CryptoBlockByteSize;
 | |
| } EFI_BLOCK_IO_CRYPTO_IV_INPUT_AES_XTS;
 | |
| 
 | |
| #define EFI_BLOCK_IO_CRYPTO_ALGO_GUID_AES_CBC_MICROSOFT_BITLOCKER \
 | |
|     { \
 | |
|       0x689e4c62, 0x70bf, 0x4cf3, {0x88, 0xbb, 0x33, 0xb3, 0x18, 0x26, 0x86, 0x70} \
 | |
|     }
 | |
| 
 | |
| extern EFI_GUID  gEfiBlockIoCryptoAlgoAesCbcMsBitlockerGuid;
 | |
| 
 | |
| typedef struct {
 | |
|   EFI_BLOCK_IO_CRYPTO_IV_INPUT    Header;
 | |
|   UINT64                          CryptoBlockByteOffset;
 | |
|   UINT64                          CryptoBlockByteSize;
 | |
| } EFI_BLOCK_IO_CRYPTO_IV_INPUT_AES_CBC_MICROSOFT_BITLOCKER;
 | |
| 
 | |
| #define EFI_BLOCK_IO_CRYPTO_INDEX_ANY  0xFFFFFFFFFFFFFFFF
 | |
| 
 | |
| typedef struct {
 | |
|   //
 | |
|   // Is inline cryptographic capability supported on this device.
 | |
|   //
 | |
|   BOOLEAN                           Supported;
 | |
|   //
 | |
|   // Maximum number of keys that can be configured at the same time.
 | |
|   //
 | |
|   UINT64                            KeyCount;
 | |
|   //
 | |
|   // Number of supported capabilities.
 | |
|   //
 | |
|   UINT64                            CapabilityCount;
 | |
|   //
 | |
|   // Array of supported capabilities.
 | |
|   //
 | |
|   EFI_BLOCK_IO_CRYPTO_CAPABILITY    Capabilities[1];
 | |
| } EFI_BLOCK_IO_CRYPTO_CAPABILITIES;
 | |
| 
 | |
| typedef struct {
 | |
|   //
 | |
|   // Configuration table index. A special Index EFI_BLOCK_IO_CRYPTO_INDEX_ANY can be
 | |
|   // used to set any available entry in the configuration table.
 | |
|   //
 | |
|   UINT64                            Index;
 | |
|   //
 | |
|   // Identifies the owner of the configuration table entry. Entry can also be used
 | |
|   // with the Nil value to clear key from the configuration table index.
 | |
|   //
 | |
|   EFI_GUID                          KeyOwnerGuid;
 | |
|   //
 | |
|   // A supported capability to be used. The CryptoBlockSizeBitMask field of the
 | |
|   // structure should have only one bit set from the supported mask.
 | |
|   //
 | |
|   EFI_BLOCK_IO_CRYPTO_CAPABILITY    Capability;
 | |
|   //
 | |
|   // Pointer to the key. The size of the key is defined by the KeySize field of
 | |
|   // the capability specified by the Capability parameter.
 | |
|   //
 | |
|   VOID                              *CryptoKey;
 | |
| } EFI_BLOCK_IO_CRYPTO_CONFIGURATION_TABLE_ENTRY;
 | |
| 
 | |
| typedef struct {
 | |
|   //
 | |
|   // Configuration table index.
 | |
|   //
 | |
|   UINT64                            Index;
 | |
|   //
 | |
|   // Identifies the current owner of the entry.
 | |
|   //
 | |
|   EFI_GUID                          KeyOwnerGuid;
 | |
|   //
 | |
|   // The capability to be used. The CryptoBlockSizeBitMask field of the structure
 | |
|   // has only one bit set from the supported mask.
 | |
|   //
 | |
|   EFI_BLOCK_IO_CRYPTO_CAPABILITY    Capability;
 | |
| } EFI_BLOCK_IO_CRYPTO_RESPONSE_CONFIGURATION_ENTRY;
 | |
| 
 | |
| /**
 | |
|   Reset the block device hardware.
 | |
| 
 | |
|   The Reset() function resets the block device hardware.
 | |
| 
 | |
|   As part of the initialization process, the firmware/device will make a quick but
 | |
|   reasonable attempt to verify that the device is functioning.
 | |
| 
 | |
|   If the ExtendedVerificationflag is TRUE the firmware may take an extended amount
 | |
|   of time to verify the device is operating on reset. Otherwise the reset operation
 | |
|   is to occur as quickly as possible.
 | |
| 
 | |
|   The hardware verification process is not defined by this specification and is left
 | |
|   up to the platform firmware or driver to implement.
 | |
| 
 | |
|   @param[in]  This                 Pointer to the EFI_BLOCK_IO_CRYPTO_PROTOCOL instance.
 | |
|   @param[in]  ExtendedVerification Indicates that the driver may perform a more exhausive
 | |
|                                    verification operation of the device during reset.
 | |
| 
 | |
|   @retval EFI_SUCCESS              The block device was reset.
 | |
|   @retval EFI_DEVICE_ERROR         The block device is not functioning correctly and could
 | |
|                                    not be reset.
 | |
|   @retval EFI_INVALID_PARAMETER    This is NULL.
 | |
| 
 | |
| **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (EFIAPI *EFI_BLOCK_IO_CRYPTO_RESET)(
 | |
|   IN EFI_BLOCK_IO_CRYPTO_PROTOCOL  *This,
 | |
|   IN BOOLEAN                       ExtendedVerification
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Get the capabilities of the underlying inline cryptographic interface.
 | |
| 
 | |
|   The GetCapabilities() function determines whether pre-OS controllable inline crypto
 | |
|   is supported by the system for the current disk and, if so, returns the capabilities
 | |
|   of the crypto engine.
 | |
| 
 | |
|   The caller is responsible for providing the Capabilities structure with a sufficient
 | |
|   number of entries.
 | |
| 
 | |
|   If the structure is too small, the EFI_BUFFER_TOO_SMALL error code is returned and the
 | |
|   CapabilityCount field contains the number of entries needed to contain the capabilities.
 | |
| 
 | |
|   @param[in]  This              Pointer to the EFI_BLOCK_IO_CRYPTO_PROTOCOL instance.
 | |
|   @param[out] Capabilities      Pointer to the EFI_BLOCK_IO_CRYPTO_CAPABILITIES structure.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The ICI is ready for use.
 | |
|   @retval EFI_BUFFER_TOO_SMALL  The Capabilities structure was too small. The number of
 | |
|                                 entries needed is returned in the CapabilityCount field
 | |
|                                 of the structure.
 | |
|   @retval EFI_NO_RESPONSE       No response was received from the ICI.
 | |
|   @retval EFI_DEVICE_ERROR      An error occurred when attempting to access the ICI.
 | |
|   @retval EFI_INVALID_PARAMETER This is NULL.
 | |
|   @retval EFI_INVALID_PARAMETER Capabilities is NULL.
 | |
| 
 | |
| **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (EFIAPI *EFI_BLOCK_IO_CRYPTO_GET_CAPABILITIES)(
 | |
|   IN     EFI_BLOCK_IO_CRYPTO_PROTOCOL           *This,
 | |
|   OUT EFI_BLOCK_IO_CRYPTO_CAPABILITIES       *Capabilities
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Set the configuration of the underlying inline cryptographic interface.
 | |
| 
 | |
|   The SetConfiguration() function allows the user to set the current configuration of the
 | |
|   inline cryptographic interface and should be called before attempting any crypto operations.
 | |
| 
 | |
|   This configures the configuration table entries with algorithms, key sizes and keys. Each
 | |
|   configured entry can later be referred to by index at the time of storage transaction.
 | |
| 
 | |
|   The configuration table index will refer to the combination ofKeyOwnerGuid, Algorithm, and
 | |
|   CryptoKey.
 | |
| 
 | |
|   KeyOwnerGuid identifies the component taking ownership of the entry. It helps components to
 | |
|   identify their own entries, cooperate with other owner components, and avoid conflicts. This
 | |
|   Guid identifier is there to help coordination between cooperating components and not a security
 | |
|   or synchronization feature. The Nil GUID can be used by a component to release use of entry
 | |
|   owned. It is also used to identify potentially available entries (see GetConfiguration).
 | |
| 
 | |
|   CryptoKey specifies algorithm-specific key material to use within parameters of selected crypto
 | |
|   capability.
 | |
| 
 | |
|   This function is called infrequently typically once, on device start, before IO starts. It
 | |
|   can be called at later times in cases the number of keysused on the drive is higher than what
 | |
|   can be configured at a time or a new key has to be added.
 | |
| 
 | |
|   Components setting or changing an entry or entries for a given index or indices must ensure
 | |
|   that IO referencing affected indices is temporarily blocked (run-down) at the time of change.
 | |
| 
 | |
|   Indices parameters in each parameter table entry allow to set only a portion of the available
 | |
|   table entries in the crypto module anywhere from single entry to entire table supported.
 | |
| 
 | |
|   If corresponding table entry or entries being set are already in use by another owner the call
 | |
|   should be failed and none of the entries should be modified. The interface implementation must
 | |
|   enforce atomicity of this operation (should either succeed fully or fail completely without
 | |
|   modifying state).
 | |
| 
 | |
|   Note that components using GetConfiguration command to discover available entries should be
 | |
|   prepared that by the time of calling SetConfiguration the previously available entry may have
 | |
|   become occupied. Such components should be prepared to re-try the sequence of operations.
 | |
| 
 | |
|   Alternatively EFI_BLOCK_IO_CRYPTO_INDEX_ANY can be used to have the implementation discover
 | |
|   and allocate available,if any, indices atomically.
 | |
| 
 | |
|   An optional ResultingTable pointer can be provided by the caller to receive the newly configured
 | |
|   entries. The array provided by the caller must have at least ConfigurationCount of entries.
 | |
| 
 | |
|   @param[in]  This                Pointer to the EFI_BLOCK_IO_CRYPTO_PROTOCOL instance.
 | |
|   @param[in]  ConfigurationCount  Number of entries being configured with this call.
 | |
|   @param[in]  ConfigurationTable  Pointer to a table used to populate the configuration table.
 | |
|   @param[out] ResultingTable      Optional pointer to a table that receives the newly configured
 | |
|                                   entries.
 | |
| 
 | |
|   @retval EFI_SUCCESS             The ICI is ready for use.
 | |
|   @retval EFI_NO_RESPONSE         No response was received from the ICI.
 | |
|   @retval EFI_DEVICE_ERROR        An error occurred when attempting to access the ICI.
 | |
|   @retval EFI_INVALID_PARAMETER   This is NULL.
 | |
|   @retval EFI_INVALID_PARAMETER   ConfigurationTable is NULL.
 | |
|   @retval EFI_INVALID_PARAMETER   ConfigurationCount is 0.
 | |
|   @retval EFI_OUT_OF_RESOURCES    Could not find the requested number of available entries in the
 | |
|                                   configuration table.
 | |
| 
 | |
| **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (EFIAPI *EFI_BLOCK_IO_CRYPTO_SET_CONFIGURATION)(
 | |
|   IN     EFI_BLOCK_IO_CRYPTO_PROTOCOL                     *This,
 | |
|   IN     UINT64                                           ConfigurationCount,
 | |
|   IN     EFI_BLOCK_IO_CRYPTO_CONFIGURATION_TABLE_ENTRY    *ConfigurationTable,
 | |
|   OUT EFI_BLOCK_IO_CRYPTO_RESPONSE_CONFIGURATION_ENTRY *ResultingTable OPTIONAL
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Get the configuration of the underlying inline cryptographic interface.
 | |
| 
 | |
|   The GetConfiguration() function allows the user to get the configuration of the inline
 | |
|   cryptographic interface.
 | |
| 
 | |
|   Retrieves, entirely or partially, the currently configured key table. Note that the keys
 | |
|   themselves are not retrieved, but rather just indices, owner GUIDs and capabilities.
 | |
| 
 | |
|   If fewer entries than specified by ConfigurationCount are returned, the Index field of the
 | |
|   unused entries is set to EFI_BLOCK_IO_CRYPTO_INDEX_ANY.
 | |
| 
 | |
|   @param[in]  This                Pointer to the EFI_BLOCK_IO_CRYPTO_PROTOCOL instance.
 | |
|   @param[in]  StartIndex          Configuration table index at which to start the configuration
 | |
|                                   query.
 | |
|   @param[in]  ConfigurationCount  Number of entries to return in the response table.
 | |
|   @param[in]  KeyOwnerGuid        Optional parameter to filter response down to entries with a
 | |
|                                   given owner. A pointer to the Nil value can be used to return
 | |
|                                   available entries. Set to NULL when no owner filtering is required.
 | |
|   @param[out] ConfigurationTable  Table of configured configuration table entries (with no CryptoKey
 | |
|                                   returned): configuration table index, KeyOwnerGuid, Capability.
 | |
|                                   Should have sufficient space to store up to ConfigurationCount
 | |
|                                   entries.
 | |
| 
 | |
|   @retval EFI_SUCCESS             The ICI is ready for use.
 | |
|   @retval EFI_NO_RESPONSE         No response was received from the ICI.
 | |
|   @retval EFI_DEVICE_ERROR        An error occurred when attempting to access the ICI.
 | |
|   @retval EFI_INVALID_PARAMETER   This is NULL.
 | |
|   @retval EFI_INVALID_PARAMETER   Configuration table is NULL.
 | |
|   @retval EFI_INVALID_PARAMETER   StartIndex is out of bounds.
 | |
| 
 | |
| **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (EFIAPI *EFI_BLOCK_IO_CRYPTO_GET_CONFIGURATION)(
 | |
|   IN     EFI_BLOCK_IO_CRYPTO_PROTOCOL                     *This,
 | |
|   IN     UINT64                                           StartIndex,
 | |
|   IN     UINT64                                           ConfigurationCount,
 | |
|   IN     EFI_GUID                                         *KeyOwnerGuid OPTIONAL,
 | |
|   OUT EFI_BLOCK_IO_CRYPTO_RESPONSE_CONFIGURATION_ENTRY *ConfigurationTable
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Reads the requested number of blocks from the device and optionally decrypts
 | |
|   them inline.
 | |
| 
 | |
|   TheReadExtended() function allows the caller to perform a storage device read
 | |
|   operation. The function reads the requested number of blocks from the device
 | |
|   and then if Index is specified decrypts them inline. All the blocks are read
 | |
|   and decrypted (if decryption requested),  or an error is returned.
 | |
| 
 | |
|   If there is no media in the device, the function returns EFI_NO_MEDIA. If the
 | |
|   MediaId is not the ID for the current media in the device, the function returns
 | |
|   EFI_MEDIA_CHANGED.
 | |
| 
 | |
|   If EFI_DEVICE_ERROR, EFI_NO_MEDIA, or EFI_MEDIA_CHANGED is returned and nonblocking
 | |
|   I/O is being used, the Event associated with this request will not be signaled.
 | |
| 
 | |
|   In addition to standard storage transaction parameters (LBA, IO size, and buffer),
 | |
|   this command will also specify a configuration table Index and CryptoIvInput
 | |
|   when data has  to be decrypted inline by the controller after being read from
 | |
|   the storage device. If an Index parameter is not specified, no decryption is
 | |
|   performed.
 | |
| 
 | |
|   @param[in]      This          Pointer to the EFI_BLOCK_IO_CRYPTO_PROTOCOL instance.
 | |
|   @param[in]      MediaId       The media ID that the read request is for.
 | |
|   @param[in]      LBA           The starting logical block address to read from on
 | |
|                                 the device.
 | |
|   @param[in, out] Token         A pointer to the token associated with the transaction.
 | |
|   @param[in]      BufferSize    The size of the Buffer in bytes. This must be a multiple
 | |
|                                 of the intrinsic block size of the device.
 | |
|   @param[out]     Buffer        A pointer to the destination buffer for the data. The
 | |
|                                 caller is responsible for either having implicit or
 | |
|                                 explicit ownership of the buffer.
 | |
|   @param[in]      Index         A pointer to the configuration table index. This is
 | |
|                                 optional.
 | |
|   @param[in]      CryptoIvInput A pointer to a buffer that contains additional
 | |
|                                 cryptographic parameters as required by the capability
 | |
|                                 referenced by the configuration table index, such as
 | |
|                                 cryptographic initialization vector.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The read request was queued if Token-> Event is not NULL.
 | |
|                                 The data was read correctly from the device if the
 | |
|                                 Token->Event is NULL.
 | |
|   @retval EFI_DEVICE_ERROR      The device reported an error while attempting to perform
 | |
|                                 the read operation and/or decryption operation.
 | |
|   @retval EFI_NO_MEDIA          There is no media in the device.
 | |
|   @retval EFI_MEDIA_CHANGED     The MediaId is not for the current media.
 | |
|   @retval EFI_BAD_BUFFER_SIZE   The BufferSize parameter is not a multiple of the intrinsic
 | |
|                                 block size of the device.
 | |
|   @retval EFI_INVALID_PARAMETER This is NULL, or the read request contains LBAs that are
 | |
|                                 not valid, or the buffer is not on proper alignment.
 | |
|   @retval EFI_INVALID_PARAMETER CryptoIvInput is incorrect.
 | |
|   @retval EFI_OUT_OF_RESOURCES  The request could not be completed due to a lack of
 | |
|                                 resources.
 | |
| 
 | |
| **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (EFIAPI *EFI_BLOCK_IO_CRYPTO_READ_EXTENDED)(
 | |
|   IN     EFI_BLOCK_IO_CRYPTO_PROTOCOL  *This,
 | |
|   IN     UINT32                        MediaId,
 | |
|   IN     EFI_LBA                       LBA,
 | |
|   IN OUT EFI_BLOCK_IO_CRYPTO_TOKEN     *Token,
 | |
|   IN     UINT64                        BufferSize,
 | |
|   OUT VOID                          *Buffer,
 | |
|   IN     UINT64                        *Index OPTIONAL,
 | |
|   IN     VOID                          *CryptoIvInput OPTIONAL
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Optionally encrypts a specified number of blocks inline and then writes to the
 | |
|   device.
 | |
| 
 | |
|   The WriteExtended() function allows the caller to perform a storage device write
 | |
|   operation. The function encrypts the requested number of blocks inline if Index
 | |
|   is specified  and then writes them to the device. All the blocks are encrypted
 | |
|   (if encryption requested) and  written, or an error is returned.
 | |
| 
 | |
|   If there is no media in the device, the function returns EFI_NO_MEDIA. If the
 | |
|   MediaId is not the ID for the current media in the device, the function returns
 | |
|   EFI_MEDIA_CHANGED.
 | |
| 
 | |
|   If EFI_DEVICE_ERROR, EFI_NO_MEDIA, or EFI_MEDIA_CHANGED is returned and nonblocking
 | |
|   I/O is being used, the Event associated with this request will not be signaled.
 | |
| 
 | |
|   In addition to standard storage transaction parameters (LBA, IO size, and buffer),
 | |
|   this command will also specify a configuration table Index and a CryptoIvInput
 | |
|   when data has to be decrypted inline by the controller before being written to
 | |
|   the storage device. If no Index parameter is specified, no encryption is performed.
 | |
| 
 | |
|   @param[in]      This          Pointer to the EFI_BLOCK_IO_CRYPTO_PROTOCOL instance.
 | |
|   @param[in]      MediaId       The media ID that the read request is for.
 | |
|   @param[in]      LBA           The starting logical block address to read from on
 | |
|                                 the device.
 | |
|   @param[in, out] Token         A pointer to the token associated with the transaction.
 | |
|   @param[in]      BufferSize    The size of the Buffer in bytes. This must be a multiple
 | |
|                                 of the intrinsic block size of the device.
 | |
|   @param[in]      Buffer        A pointer to the source buffer for the data.
 | |
|   @param[in]      Index         A pointer to the configuration table index. This is
 | |
|                                 optional.
 | |
|   @param[in]      CryptoIvInput A pointer to a buffer that contains additional
 | |
|                                 cryptographic parameters as required by the capability
 | |
|                                 referenced by the configuration table index, such as
 | |
|                                 cryptographic initialization vector.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The request to encrypt (optionally) and write was queued
 | |
|                                 if Event is not NULL. The data was encrypted (optionally)
 | |
|                                 and written correctly to the device if the Event is NULL.
 | |
|   @retval EFI_WRITE_PROTECTED   The device cannot be written to.
 | |
|   @retval EFI_NO_MEDIA          There is no media in the device.
 | |
|   @retval EFI_MEDIA_CHANGED     The MediaId is not for the current media.
 | |
|   @retval EFI_DEVICE_ERROR      The device reported an error while attempting to encrypt
 | |
|                                 blocks or to perform the write operation.
 | |
|   @retval EFI_BAD_BUFFER_SIZE   The BufferSize parameter is not a multiple of the intrinsic
 | |
|                                 block size of the device.
 | |
|   @retval EFI_INVALID_PARAMETER This is NULL, or the write request contains LBAs that are
 | |
|                                 not valid, or the buffer is not on proper alignment.
 | |
|   @retval EFI_INVALID_PARAMETER CryptoIvInput is incorrect.
 | |
|   @retval EFI_OUT_OF_RESOURCES  The request could not be completed due to a lack of
 | |
|                                 resources.
 | |
| 
 | |
| **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (EFIAPI *EFI_BLOCK_IO_CRYPTO_WRITE_EXTENDED)(
 | |
|   IN     EFI_BLOCK_IO_CRYPTO_PROTOCOL  *This,
 | |
|   IN     UINT32                        MediaId,
 | |
|   IN     EFI_LBA                       LBA,
 | |
|   IN OUT EFI_BLOCK_IO_CRYPTO_TOKEN     *Token,
 | |
|   IN     UINT64                        BufferSize,
 | |
|   IN     VOID                          *Buffer,
 | |
|   IN     UINT64                        *Index OPTIONAL,
 | |
|   IN     VOID                          *CryptoIvInput OPTIONAL
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Flushes all modified data toa physical block device.
 | |
| 
 | |
|   The FlushBlocks() function flushes all modified data to the physical block device.
 | |
|   Any modified data that has to be encrypted must have been already encrypted as a
 | |
|   part of WriteExtended() operation - inline crypto operation cannot be a part of
 | |
|   flush operation.
 | |
| 
 | |
|   All data written to the device prior to the flush must be physically written before
 | |
|   returning EFI_SUCCESS from this function. This would include any cached data the
 | |
|   driver may have cached, and cached data the device may have cached. A flush may
 | |
|   cause a read request following the flush to force a device access.
 | |
| 
 | |
|   If EFI_DEVICE_ERROR, EFI_NO_MEDIA, EFI_WRITE_PROTECTED or EFI_MEDIA_CHANGED is
 | |
|   returned and non-blocking I/O is being used, the Event associated with this request
 | |
|   will not be signaled.
 | |
| 
 | |
|   @param[in]      This          Pointer to the EFI_BLOCK_IO_CRYPTO_PROTOCOL instance.
 | |
|   @param[in, out] Token         A pointer to the token associated with the transaction.
 | |
| 
 | |
|   @retval EFI_SUCCESS           The flush request was queued if Event is not NULL. All
 | |
|                                 outstanding data was written correctly to the device if
 | |
|                                 the Event is NULL.
 | |
|   @retval EFI_DEVICE_ERROR      The device reported an error while attempting to write data.
 | |
|   @retval EFI_WRITE_PROTECTED   The device cannot be written to.
 | |
|   @retval EFI_NO_MEDIA          There is no media in the device.
 | |
|   @retval EFI_MEDIA_CHANGED     The MediaId is not for the current media.
 | |
|   @retval EFI_INVALID_PARAMETER This is NULL.
 | |
|   @retval EFI_OUT_OF_RESOURCES  The request could not be completed due to a lack of
 | |
|                                 resources.
 | |
| 
 | |
| **/
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (EFIAPI *EFI_BLOCK_IO_CRYPTO_FLUSH)(
 | |
|   IN     EFI_BLOCK_IO_CRYPTO_PROTOCOL  *This,
 | |
|   IN OUT EFI_BLOCK_IO_CRYPTO_TOKEN     *Token
 | |
|   );
 | |
| 
 | |
| ///
 | |
| /// The EFI_BLOCK_IO_CRYPTO_PROTOCOL defines a UEFI protocol that can be used by UEFI
 | |
| /// drivers and applications to perform block encryption on a storage device, such as UFS.
 | |
| ///
 | |
| struct _EFI_BLOCK_IO_CRYPTO_PROTOCOL {
 | |
|   EFI_BLOCK_IO_MEDIA                       *Media;
 | |
|   EFI_BLOCK_IO_CRYPTO_RESET                Reset;
 | |
|   EFI_BLOCK_IO_CRYPTO_GET_CAPABILITIES     GetCapabilities;
 | |
|   EFI_BLOCK_IO_CRYPTO_SET_CONFIGURATION    SetConfiguration;
 | |
|   EFI_BLOCK_IO_CRYPTO_GET_CONFIGURATION    GetConfiguration;
 | |
|   EFI_BLOCK_IO_CRYPTO_READ_EXTENDED        ReadExtended;
 | |
|   EFI_BLOCK_IO_CRYPTO_WRITE_EXTENDED       WriteExtended;
 | |
|   EFI_BLOCK_IO_CRYPTO_FLUSH                FlushBlocks;
 | |
| };
 | |
| 
 | |
| extern EFI_GUID  gEfiBlockIoCryptoProtocolGuid;
 | |
| 
 | |
| #endif
 |