https://bugzilla.tianocore.org/show_bug.cgi?id=1373 Replace BSD 2-Clause License with BSD+Patent License. This change is based on the following emails: https://lists.01.org/pipermail/edk2-devel/2019-February/036260.html https://lists.01.org/pipermail/edk2-devel/2018-October/030385.html RFCs with detailed process for the license change: V3: https://lists.01.org/pipermail/edk2-devel/2019-March/038116.html V2: https://lists.01.org/pipermail/edk2-devel/2019-March/037669.html V1: https://lists.01.org/pipermail/edk2-devel/2019-March/037500.html Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com>
		
			
				
	
	
		
			320 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			320 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  The UEFI Smart Card Reader Protocol provides an abstraction for device to provide
 | 
						|
  smart card reader support. This protocol is very close to Part 5 of PC/SC workgroup
 | 
						|
  specifications and provides an API to applications willing to communicate with a
 | 
						|
  smart card or a smart card reader.
 | 
						|
 | 
						|
  Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
 | 
						|
  SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#ifndef __SMART_CARD_READER_H__
 | 
						|
#define __SMART_CARD_READER_H__
 | 
						|
 | 
						|
#define EFI_SMART_CARD_READER_PROTOCOL_GUID \
 | 
						|
    { \
 | 
						|
      0x2a4d1adf, 0x21dc, 0x4b81, {0xa4, 0x2f, 0x8b, 0x8e, 0xe2, 0x38, 0x00, 0x60} \
 | 
						|
    }
 | 
						|
 | 
						|
typedef struct _EFI_SMART_CARD_READER_PROTOCOL  EFI_SMART_CARD_READER_PROTOCOL;
 | 
						|
 | 
						|
//
 | 
						|
// Codes for access mode
 | 
						|
//
 | 
						|
#define SCARD_AM_READER              0x0001 // Exclusive access to reader
 | 
						|
#define SCARD_AM_CARD                0x0002 // Exclusive access to card
 | 
						|
//
 | 
						|
// Codes for card action
 | 
						|
//
 | 
						|
#define SCARD_CA_NORESET             0x0000 // Don't reset card
 | 
						|
#define SCARD_CA_COLDRESET           0x0001 // Perform a cold reset
 | 
						|
#define SCARD_CA_WARMRESET           0x0002 // Perform a warm reset
 | 
						|
#define SCARD_CA_UNPOWER             0x0003 // Power off the card
 | 
						|
#define SCARD_CA_EJECT               0x0004 // Eject the card
 | 
						|
//
 | 
						|
// Protocol types
 | 
						|
//
 | 
						|
#define SCARD_PROTOCOL_UNDEFINED     0x0000
 | 
						|
#define SCARD_PROTOCOL_T0            0x0001
 | 
						|
#define SCARD_PROTOCOL_T1            0x0002
 | 
						|
#define SCARD_PROTOCOL_RAW           0x0004
 | 
						|
//
 | 
						|
// Codes for state type
 | 
						|
//
 | 
						|
#define SCARD_UNKNOWN                0x0000 /* state is unknown */
 | 
						|
#define SCARD_ABSENT                 0x0001 /* Card is absent */
 | 
						|
#define SCARD_INACTIVE               0x0002 /* Card is present and not powered*/
 | 
						|
#define SCARD_ACTIVE                 0x0003 /* Card is present and powered */
 | 
						|
//
 | 
						|
// Macro to generate a ControlCode & PC/SC part 10 control code
 | 
						|
//
 | 
						|
#define SCARD_CTL_CODE(code)         (0x42000000 + (code))
 | 
						|
#define CM_IOCTL_GET_FEATURE_REQUEST SCARD_CTL_CODE(3400)
 | 
						|
 | 
						|
/**
 | 
						|
  This function requests connection to the smart card or the reader, using the
 | 
						|
  appropriate reset type and protocol.
 | 
						|
 | 
						|
  The SCardConnectfunction requests access to the smart card or the reader. Upon
 | 
						|
  success, it is then possible to call SCardTransmit.
 | 
						|
 | 
						|
  If AccessMode is set to SCARD_AM_READER, PreferredProtocols must be set to
 | 
						|
  SCARD_PROTOCOL_UNDEFINED and CardAction to SCARD_CA_NORESET else function
 | 
						|
  fails with EFI_INVALID_PARAMETER.
 | 
						|
 | 
						|
  @param[in]  This               Indicates a pointer to the calling context.
 | 
						|
  @param[in]  AccessMode         Codes of access mode.
 | 
						|
  @param[in]  CardAction         SCARD_CA_NORESET, SCARD_CA_COLDRESET or
 | 
						|
                                 SCARD_CA_WARMRESET.
 | 
						|
  @param[in]  PreferredProtocols Bitmask of acceptable protocols.
 | 
						|
  @param[out] ActiveProtocol     A flag that indicates the active protocol.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS            The requested command completed successfully.
 | 
						|
  @retval EFI_INVALID_PARAMETER  This is NULL
 | 
						|
  @retval EFI_INVALID_PARAMETER  AccessMode is not valid.
 | 
						|
  @retval EFI_INVALID_PARAMETER  CardAction is not valid.
 | 
						|
  @retval EFI_INVALID_PARAMETER  Invalid combination of AccessMode/CardAction/
 | 
						|
                                 PreferredProtocols.
 | 
						|
  @retval EFI_NOT_READY          A smart card is inserted but failed to return an ATR.
 | 
						|
  @retval EFI_UNSUPPORTED        PreferredProtocols does not contain an available
 | 
						|
                                 protocol to use.
 | 
						|
  @retval EFI_NO_MEDIA           AccessMode is set to SCARD_AM_CARD but there is
 | 
						|
                                 no smart card inserted.
 | 
						|
  @retval EFI_ACCESS_DENIED      Access is already locked by a previous SCardConnectcall.
 | 
						|
  @retval EFI_DEVICE_ERROR       Any other error condition, typically a reader removal.
 | 
						|
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *EFI_SMART_CARD_READER_CONNECT) (
 | 
						|
  IN     EFI_SMART_CARD_READER_PROTOCOL    *This,
 | 
						|
  IN     UINT32                            AccessMode,
 | 
						|
  IN     UINT32                            CardAction,
 | 
						|
  IN     UINT32                            PreferredProtocols,
 | 
						|
     OUT UINT32                            *ActiveProtocol
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This function releases a connection previously taken by SCardConnect.
 | 
						|
 | 
						|
  The SCardDisconnect function releases the lock previously taken by SCardConnect.
 | 
						|
  In case the smart card has been removed before this call, thisfunction
 | 
						|
  returns EFI_SUCCESS. If there is no previous call to SCardConnect, this
 | 
						|
  function returns EFI_SUCCESS.
 | 
						|
 | 
						|
  @param[in]  This               Indicates a pointer to the calling context.
 | 
						|
  @param[in]  CardAction         Codes for card action.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS            The requested command completed successfully.
 | 
						|
  @retval EFI_INVALID_PARAMETER  This is NULL
 | 
						|
  @retval EFI_INVALID_PARAMETER  CardAction value is unknown.
 | 
						|
  @retval EFI_UNSUPPORTED        Reader does not support Eject card feature
 | 
						|
                                 (disconnect was not performed).
 | 
						|
  @retval EFI_DEVICE_ERROR       Any other error condition, typically a reader removal.
 | 
						|
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *EFI_SMART_CARD_READER_DISCONNECT) (
 | 
						|
  IN  EFI_SMART_CARD_READER_PROTOCOL    *This,
 | 
						|
  IN  UINT32                            CardAction
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This function retrieves some basic information about the smart card and reader.
 | 
						|
 | 
						|
  The SCardStatusfunction retrieves basic reader and card information.
 | 
						|
 | 
						|
  If ReaderName, State, CardProtocolor Atris NULL, the function does not fail but
 | 
						|
  does not fill in such variables.
 | 
						|
 | 
						|
  If EFI_SUCCESS is not returned, ReaderName and Atr contents shall not be considered
 | 
						|
  as valid.
 | 
						|
 | 
						|
  @param[in]      This             Indicates a pointer to the calling context.
 | 
						|
  @param[out]     ReaderName       A pointer to a NULL terminated string that will
 | 
						|
                                   contain the reader name.
 | 
						|
  @param[in, out] ReaderNameLength On input, a pointer to the variablethat holds the
 | 
						|
                                   maximal size, in bytes,of ReaderName.
 | 
						|
                                   On output, the required size, in bytes, for ReaderName.
 | 
						|
  @param[out]     State            Current state of the smart card reader.
 | 
						|
  @param[out]     CardProtocol     Current protocol used to communicate with the smart card.
 | 
						|
  @param[out]     Atr              A pointer to retrieve the ATR of the smart card.
 | 
						|
  @param[in, out] AtrLength        On input, a pointer to hold the maximum size, in bytes,
 | 
						|
                                   of Atr(usually 33).
 | 
						|
                                   On output, the required size, inbytes, for the smart
 | 
						|
                                   card ATR.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS            The requested command completed successfully.
 | 
						|
  @retval EFI_INVALID_PARAMETER  This is NULL
 | 
						|
  @retval EFI_INVALID_PARAMETER  ReaderName is not NULL but ReaderNameLength is NULL
 | 
						|
  @retval EFI_INVALID_PARAMETER  Atr is not NULL but AtrLength is NULL
 | 
						|
  @retval EFI_BUFFER_TOO_SMALL   ReaderNameLength is not big enough to hold the reader name.
 | 
						|
                                 ReaderNameLength has been updated to the required value.
 | 
						|
  @retval EFI_BUFFER_TOO_SMALL   AtrLength is not big enough to hold the ATR.
 | 
						|
                                 AtrLength has been updated to the required value.
 | 
						|
  @retval EFI_DEVICE_ERROR       Any other error condition, typically a reader removal.
 | 
						|
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *EFI_SMART_CARD_READER_STATUS) (
 | 
						|
  IN     EFI_SMART_CARD_READER_PROTOCOL    *This,
 | 
						|
     OUT CHAR16                            *ReaderName OPTIONAL,
 | 
						|
  IN OUT UINTN                             *ReaderNameLength OPTIONAL,
 | 
						|
     OUT UINT32                            *State OPTIONAL,
 | 
						|
     OUT UINT32                            *CardProtocol OPTIONAL,
 | 
						|
     OUT UINT8                             *Atr OPTIONAL,
 | 
						|
  IN OUT UINTN                             *AtrLength OPTIONAL
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This function sends a command to the card or reader and returns its response.
 | 
						|
 | 
						|
  The protocol to use to communicate with the smart card has been selected through
 | 
						|
  SCardConnectcall.
 | 
						|
 | 
						|
  In case RAPDULength indicates a buffer too small to holdthe response APDU, the
 | 
						|
  function fails with EFI_BUFFER_TOO_SMALL.
 | 
						|
 | 
						|
  @param[in]      This          A pointer to the EFI_USBFN_IO_PROTOCOLinstance.
 | 
						|
  @param[in]      CAPDU         A pointer to a byte array thatcontains the Command
 | 
						|
                                APDU to send to the smart card or reader.
 | 
						|
  @param[in]      CAPDULength   Command APDU size, in bytes.
 | 
						|
  @param[out]     RAPDU         A pointer to a byte array that will contain the
 | 
						|
                                Response APDU.
 | 
						|
  @param[in, out] RAPDULength   On input, the maximum size, inbytes, of the Response
 | 
						|
                                APDU.
 | 
						|
                                On output, the size, in bytes, of the Response APDU.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           The requested command completed successfully.
 | 
						|
  @retval EFI_INVALID_PARAMETER This is NULL.
 | 
						|
  @retval EFI_INVALID_PARAMETER CAPDU is NULL or CAPDULength is 0.
 | 
						|
  @retval EFI_BUFFER_TOO_SMALL  RAPDULength is not big enough to hold the response APDU.
 | 
						|
                                RAPDULength has been updated to the required value.
 | 
						|
  @retval EFI_NO_MEDIA          There is no card in the reader.
 | 
						|
  @retval EFI_NOT_READY         Card is not powered.
 | 
						|
  @retval EFI_PROTOCOL_ERROR    A protocol error has occurred.
 | 
						|
  @retval EFI_TIMEOUT           The reader did not respond.
 | 
						|
  @retval EFI_ACCESS_DENIED     A communication with the reader/card is already pending.
 | 
						|
  @retval EFI_DEVICE_ERROR      Any other error condition, typically a reader removal.
 | 
						|
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *EFI_SMART_CARD_READER_TRANSMIT) (
 | 
						|
  IN     EFI_SMART_CARD_READER_PROTOCOL    *This,
 | 
						|
  IN     UINT8                             *CAPDU,
 | 
						|
  IN     UINTN                             CAPDULength,
 | 
						|
     OUT UINT8                             *RAPDU,
 | 
						|
  IN OUT UINTN                             *RAPDULength
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This function provides direct access to the reader.
 | 
						|
 | 
						|
  This function gives direct control to send commands to the driver or the reader.
 | 
						|
  The ControlCode to use is vendor dependant; the only standard code defined is
 | 
						|
  the one to get PC/SC part 10 features.
 | 
						|
 | 
						|
  InBuffer and Outbuffer may be NULL when ControlCode operation does not require
 | 
						|
  them.
 | 
						|
 | 
						|
  @param[in]      This             Indicates a pointer to the calling context.
 | 
						|
  @param[in]      ControlCode      The control code for the operation to perform.
 | 
						|
  @param[in]      InBuffer         A pointer to the input parameters.
 | 
						|
  @param[in]      InBufferLength   Size, in bytes, of input parameters.
 | 
						|
  @param[out]     OutBuffer        A pointer to the output parameters.
 | 
						|
  @param[in, out] OutBufferLength  On input, maximal size, in bytes, to store output
 | 
						|
                                   parameters.
 | 
						|
                                   On output, the size, in bytes, of output parameters.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           The requested command completed successfully.
 | 
						|
  @retval EFI_INVALID_PARAMETER This is NULL.
 | 
						|
  @retval EFI_INVALID_PARAMETER ControlCode requires input parameters but:
 | 
						|
                                  InBuffer is NULL or InBufferLenth is NULL or
 | 
						|
                                  InBuffer is not NULL but InBufferLenth is less than
 | 
						|
                                  expected.
 | 
						|
  @retval EFI_INVALID_PARAMETER OutBuffer is not NULL but OutBufferLength is NULL.
 | 
						|
  @retval EFI_UNSUPPORTED       ControlCode is not supported.
 | 
						|
  @retval EFI_BUFFER_TOO_SMALL  OutBufferLength is not big enough to hold the output
 | 
						|
                                parameters.
 | 
						|
                                OutBufferLength has been updated to the required value.
 | 
						|
  @retval EFI_NO_MEDIA          There is no card in the reader and the control code
 | 
						|
                                specified requires one.
 | 
						|
  @retval EFI_NOT_READY         ControlCode requires a powered card to operate.
 | 
						|
  @retval EFI_PROTOCOL_ERROR    A protocol error has occurred.
 | 
						|
  @retval EFI_TIMEOUT           The reader did not respond.
 | 
						|
  @retval EFI_ACCESS_DENIED     A communication with the reader/card is already pending.
 | 
						|
  @retval EFI_DEVICE_ERROR      Any other error condition, typically a reader removal.
 | 
						|
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *EFI_SMART_CARD_READER_CONTROL) (
 | 
						|
  IN     EFI_SMART_CARD_READER_PROTOCOL    *This,
 | 
						|
  IN     UINT32                            ControlCode,
 | 
						|
  IN     UINT8                             *InBuffer OPTIONAL,
 | 
						|
  IN     UINTN                             InBufferLength OPTIONAL,
 | 
						|
     OUT UINT8                             *OutBuffer OPTIONAL,
 | 
						|
  IN OUT UINTN                             *OutBufferLength OPTIONAL
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  This function retrieves a reader or smart card attribute.
 | 
						|
 | 
						|
  Possibly supported attrib values are listed in "PC/SC specification, Part 3:
 | 
						|
  Requirements for PC-Connected Interface Devices".
 | 
						|
 | 
						|
  @param[in]      This             Indicates a pointer to the calling context.
 | 
						|
  @param[in]      Attrib           Identifier for the attribute to retrieve.
 | 
						|
  @param[out]     OutBuffer        A pointer to a buffer that will contain
 | 
						|
                                   attribute data.
 | 
						|
  @param[in, out] OutBufferLength  On input, maximal size, in bytes, to store
 | 
						|
                                   attribute data.
 | 
						|
                                   On output, the size, in bytes, of attribute
 | 
						|
                                   data.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS           The requested command completed successfully.
 | 
						|
  @retval EFI_INVALID_PARAMETER This is NULL.
 | 
						|
  @retval EFI_INVALID_PARAMETER OutBuffer is NULL or OutBufferLength is 0.
 | 
						|
  @retval EFI_BUFFER_TOO_SMALL  OutBufferLength is not big enough to hold the output
 | 
						|
                                parameters.
 | 
						|
                                OutBufferLength has been updated to the required value.
 | 
						|
  @retval EFI_UNSUPPORTED       Attribis not supported
 | 
						|
  @retval EFI_NO_MEDIA          There is no card in the reader and Attrib value
 | 
						|
                                requires one.
 | 
						|
  @retval EFI_NOT_READY         Attrib requires a powered card to operate.
 | 
						|
  @retval EFI_PROTOCOL_ERROR    A protocol error has occurred.
 | 
						|
  @retval EFI_TIMEOUT           The reader did not respond.
 | 
						|
  @retval EFI_DEVICE_ERROR      Any other error condition, typically a reader removal.
 | 
						|
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *EFI_SMART_CARD_READER_GET_ATTRIB) (
 | 
						|
  IN     EFI_SMART_CARD_READER_PROTOCOL    *This,
 | 
						|
  IN     UINT32                            Attrib,
 | 
						|
     OUT UINT8                             *OutBuffer,
 | 
						|
  IN OUT UINTN                             *OutBufferLength
 | 
						|
  );
 | 
						|
 | 
						|
///
 | 
						|
/// Smart card aware application invokes this protocol to get access to an inserted
 | 
						|
/// smart card in the reader or to the reader itself.
 | 
						|
///
 | 
						|
struct _EFI_SMART_CARD_READER_PROTOCOL {
 | 
						|
  EFI_SMART_CARD_READER_CONNECT        SCardConnect;
 | 
						|
  EFI_SMART_CARD_READER_DISCONNECT     SCardDisconnect;
 | 
						|
  EFI_SMART_CARD_READER_STATUS         SCardStatus;
 | 
						|
  EFI_SMART_CARD_READER_TRANSMIT       SCardTransmit;
 | 
						|
  EFI_SMART_CARD_READER_CONTROL        SCardControl;
 | 
						|
  EFI_SMART_CARD_READER_GET_ATTRIB     SCardGetAttrib;
 | 
						|
};
 | 
						|
 | 
						|
extern EFI_GUID gEfiSmartCardReaderProtocolGuid;
 | 
						|
 | 
						|
#endif
 | 
						|
 |