Home | History | Annotate | Download | only in IpSecDxe
      1 /** @file
      2   Definitions related to the Cryptographic Operations in IPsec.
      3 
      4   Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>
      5 
      6   This program and the accompanying materials
      7   are licensed and made available under the terms and conditions of the BSD License
      8   which accompanies this distribution.  The full text of the license may be found at
      9   http://opensource.org/licenses/bsd-license.php.
     10 
     11   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     12   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     13 
     14 **/
     15 #ifndef _EFI_IPSEC_CRYPTIO_H_
     16 #define _EFI_IPSEC_CRYPTIO_H_
     17 
     18 #include <Protocol/IpSecConfig.h>
     19 #include <Library/DebugLib.h>
     20 #include <Library/BaseCryptLib.h>
     21 #include <Library/BaseMemoryLib.h>
     22 #include <Library/MemoryAllocationLib.h>
     23 
     24 #include "IpSecImpl.h"
     25 #include "IkeCommon.h"
     26 
     27 #define IPSEC_ENCRYPT_ALGORITHM_LIST_SIZE 4
     28 #define IPSEC_AUTH_ALGORITHM_LIST_SIZE    3
     29 #define IPSEC_HASH_ALGORITHM_LIST_SIZE    3
     30 
     31 ///
     32 /// Authentication Algorithm Definition
     33 ///   The number value definition is aligned to IANA assignment
     34 ///
     35 #define IKE_AALG_NONE                0x00
     36 #define IKE_AALG_SHA1HMAC            0x02
     37 #define IKE_AALG_NULL                0xFB
     38 
     39 ///
     40 /// Encryption Algorithm Definition
     41 ///   The number value definition is aligned to IANA assignment
     42 ///
     43 #define IKE_EALG_NONE                0x00
     44 #define IKE_EALG_3DESCBC             0x03
     45 #define IKE_EALG_NULL                0x0B
     46 #define IKE_EALG_AESCBC              0x0C
     47 
     48 /**
     49   Prototype of HMAC GetContextSize.
     50 
     51   Retrieves the size, in bytes, of the context buffer required.
     52 
     53   @return  The size, in bytes, of the context buffer required.
     54 
     55 **/
     56 typedef
     57 UINTN
     58 (EFIAPI *CRYPTO_HMAC_GETCONTEXTSIZE)(
     59   VOID
     60   );
     61 
     62 /**
     63   Prototype of HMAC Operation Initiating.
     64 
     65   Initialization with a new context.
     66 
     67   @param[out]     Context  Input Context.
     68   @param[in]      Key      Pointer to the key for HMAC.
     69   @param[in]      KeySize  The length of the Key in bytes.
     70 
     71   @retval TRUE  Initialization Successfully.
     72 
     73 **/
     74 typedef
     75 BOOLEAN
     76 (EFIAPI *CRYPTO_HMAC_INIT)(
     77   OUT           VOID     *Context,
     78   IN     CONST  UINT8    *Key,
     79   IN            UINTN    KeySize
     80   );
     81 
     82 /**
     83   Prototype of HMAC update.
     84   HMAC update operation. Continue an HMAC message digest operation, processing
     85   another message block, and updating the HMAC context.
     86 
     87   If Context is NULL, then ASSERT().
     88   If Data is NULL, then ASSERT().
     89 
     90   @param[in,out]  Context     The Specified Context.
     91   @param[in,out]  Data        The Input Data to be digested.
     92   @param[in]      DataLength  The length, in bytes, of Data.
     93 
     94   @retval TRUE   Update data successfully.
     95   @retval FALSE  The Context has been finalized.
     96 
     97 **/
     98 typedef
     99 BOOLEAN
    100 (EFIAPI *CRYPTO_HMAC_UPDATE)(
    101   IN OUT       VOID  *Context,
    102   IN     CONST VOID  *Data,
    103   IN           UINTN DataLength
    104   );
    105 
    106 /**
    107   Prototype of HMAC finallization.
    108   Terminate a HMAC message digest operation and output the message digest.
    109 
    110   If Context is NULL, then ASSERT().
    111   If HashValue is NULL, then ASSERT().
    112 
    113   @param[in,out]  Context     The specified Context.
    114   @param[out]     HmacValue   Pointer to a 16-byte message digest output buffer.
    115 
    116   @retval TRUE  Finalized successfully.
    117 
    118 **/
    119 typedef
    120 BOOLEAN
    121 (EFIAPI *CRYPTO_HMAC_FINAL)(
    122   IN OUT  VOID   *Context,
    123      OUT  UINT8  *HmacValue
    124   );
    125 
    126 /**
    127   Prototype of Block Cipher GetContextSize.
    128 
    129   Retrieves the size, in bytes, of the context buffer required.
    130 
    131   @return  The size, in bytes, of the context buffer required.
    132 
    133 **/
    134 typedef
    135 UINTN
    136 (EFIAPI *CRYPTO_CIPHER_GETCONTEXTSIZE)(
    137   VOID
    138   );
    139 
    140 /**
    141   Prototype of Block Cipher initiation.
    142   Intializes the user-supplied key as the specifed context (key materials) for both
    143   encryption and decryption operations.
    144 
    145   If Context is NULL, then ASSERT().
    146   If Key is NULL, then generate random key for usage.
    147 
    148   @param[in,out]  Context      The specified Context.
    149   @param[in]      Key          User-supplied cipher key.
    150   @param[in]      KeyBits      Key length in bits.
    151 
    152   @retval TRUE  Block Cipher Initialization was successful.
    153 
    154 **/
    155 typedef
    156 BOOLEAN
    157 (EFIAPI *CRYPTO_CIPHER_INIT)(
    158   IN OUT        VOID   *Context,
    159   IN      CONST UINT8  *Key,
    160   IN            UINTN  KeyBits
    161   );
    162 
    163 /**
    164   Prototype of Cipher encryption.
    165   Encrypts plaintext message with the specified cipher.
    166 
    167   If Context is NULL, then ASSERT().
    168   if InData is NULL, then ASSERT().
    169   If Size of input data is not multiple of Cipher algorithm related block size,
    170   then ASSERT().
    171 
    172   @param[in]      Context      The specified Context.
    173   @param[in]      InData       The input plaintext data to be encrypted.
    174   @param[in]      InputSize    The size of input data.
    175   @param[in]      Ivec         Pointer to Initial Vector data for encryption.
    176   @param[out]     OutData      The resultant encrypted ciphertext.
    177 
    178   @retval TRUE  Encryption successful.
    179 
    180 **/
    181 typedef
    182 BOOLEAN
    183 (EFIAPI *CRYPTO_CIPHER_ENCRYPT)(
    184   IN            VOID   *Context,
    185   IN      CONST UINT8  *InData,
    186   IN            UINTN  InputSize,
    187   IN      CONST UINT8  *Ivec,
    188       OUT       UINT8  *OutData
    189   );
    190 
    191 /**
    192   Prototype of Cipher decryption.
    193   Decrypts cipher message with specified cipher.
    194 
    195   If Context is NULL, then ASSERT().
    196   if InData is NULL, then ASSERT().
    197   If Size of input data is not a multiple of a certaion block size , then ASSERT().
    198 
    199   @param[in]      Context      The specified Context.
    200   @param[in]      InData       The input ciphertext data to be decrypted.
    201   @param[in]      InputSize    The InData size.
    202   @param[in]      Ivec         Pointer to the Initial Vector data for decryption.
    203   @param[out]     OutData      The resultant decrypted plaintext.
    204 
    205   @retval TRUE  Decryption successful.
    206 
    207 **/
    208 typedef
    209 BOOLEAN
    210 (EFIAPI *CRYPTO_CIPHER_DECRYPT)(
    211   IN           VOID   *Context,
    212   IN     CONST UINT8  *InData,
    213   IN           UINTN  InputSize,
    214   IN     CONST UINT8  *Ivec,
    215      OUT       UINT8  *OutData
    216   );
    217 
    218 /**
    219   Prototype of Hash ContextSize.
    220 
    221   Retrieves the size, in bytes, of the context buffer required for specified hash operations.
    222 
    223   @return  The size, in bytes, of the context buffer required for certain hash operations.
    224 
    225 **/
    226 typedef
    227 UINTN
    228 (EFIAPI *CRYPTO_HASH_GETCONTEXTSIZE)(
    229   VOID
    230   );
    231 
    232 /**
    233   Prototype of Hash Initiate.
    234 
    235   Initializes user-supplied memory pointed by Context as specified hash context for
    236   subsequent use.
    237 
    238   If Context is NULL, then ASSERT().
    239 
    240   @param[out]  Context  Pointer to specified context being initialized.
    241 
    242   @retval TRUE   context initialization succeeded.
    243   @retval FALSE  context initialization failed.
    244 
    245 **/
    246 typedef
    247 BOOLEAN
    248 (EFIAPI *CRYPTO_HASH_INIT)(
    249   OUT  VOID  *Context
    250   );
    251 
    252 /**
    253   Prototype of Hash Update
    254 
    255   Digests the input data and updates hash context.
    256 
    257   This function performs digest on a data buffer of the specified size.
    258   It can be called multiple times to compute the digest of long or discontinuous data streams.
    259   Context should be already correctly intialized by HashInit(), and should not be finalized
    260   by HashFinal(). Behavior with invalid context is undefined.
    261 
    262   If Context is NULL, then ASSERT().
    263 
    264   @param[in, out]  Context      Pointer to the specified context.
    265   @param[in]       Data         Pointer to the buffer containing the data to be hashed.
    266   @param[in]       DataSize     Size of Data buffer in bytes.
    267 
    268   @retval TRUE   data digest succeeded.
    269   @retval FALSE  data digest failed.
    270 
    271 **/
    272 typedef
    273 BOOLEAN
    274 (EFIAPI *CRYPTO_HASH_UPDATE)(
    275   IN OUT  VOID        *Context,
    276   IN      CONST VOID  *Data,
    277   IN      UINTN       DataSize
    278   );
    279 
    280 /**
    281   Prototype of Hash Finalization.
    282 
    283   Completes computation of the digest value.
    284 
    285   This function completes hash computation and retrieves the digest value into
    286   the specified memory. After this function has been called, the context cannot
    287   be used again.
    288   context should be already correctly intialized by HashInit(), and should not be
    289   finalized by HashFinal(). Behavior with invalid context is undefined.
    290 
    291   If Context is NULL, then ASSERT().
    292   If HashValue is NULL, then ASSERT().
    293 
    294   @param[in, out]  Context      Pointer to the specified context.
    295   @param[out]      HashValue    Pointer to a buffer that receives the digest
    296                                 value.
    297 
    298   @retval TRUE   digest computation succeeded.
    299   @retval FALSE  digest computation failed.
    300 
    301 **/
    302 typedef
    303 BOOLEAN
    304 (EFIAPI *CRYPTO_HASH_FINAL)(
    305   IN OUT  VOID   *Context,
    306   OUT     UINT8  *HashValue
    307   );
    308 
    309 //
    310 // The struct used to store the information and operation of Block Cipher algorithm.
    311 //
    312 typedef struct _ENCRYPT_ALGORITHM {
    313   //
    314   // The ID of the Algorithm
    315   //
    316   UINT8                     AlgorithmId;
    317   //
    318   // The Key length of the Algorithm
    319   //
    320   UINTN                     KeyLength;
    321   //
    322   // Iv Size of the Algorithm
    323   //
    324   UINTN                     IvLength;
    325   //
    326   // The Block Size of the Algorithm
    327   //
    328   UINTN                     BlockSize;
    329   //
    330   // The Function pointer of GetContextSize.
    331   //
    332   CRYPTO_CIPHER_GETCONTEXTSIZE CipherGetContextSize;
    333   //
    334   // The Function pointer of Cipher initiation.
    335   //
    336   CRYPTO_CIPHER_INIT           CipherInitiate;
    337   //
    338   // The Function pointer of Cipher Encryption.
    339   //
    340   CRYPTO_CIPHER_ENCRYPT        CipherEncrypt;
    341   //
    342   // The Function pointer of Cipher Decrption.
    343   //
    344   CRYPTO_CIPHER_DECRYPT        CipherDecrypt;
    345 } ENCRYPT_ALGORITHM;
    346 
    347 //
    348 // The struct used to store the information and operation of Autahentication algorithm.
    349 //
    350 typedef struct _AUTH_ALGORITHM {
    351   //
    352   // ID of the Algorithm
    353   //
    354   UINT8                    AlgorithmId;
    355   //
    356   // The Key length of the Algorithm
    357   //
    358   UINTN                    DigestLength;
    359   //
    360   // The ICV length of the Algorithm
    361   //
    362   UINTN                    IcvLength;
    363   //
    364   // The block size of the Algorithm
    365   //
    366   UINTN                    BlockSize;
    367   //
    368   // The function pointer of GetContextSize.
    369   //
    370   CRYPTO_HMAC_GETCONTEXTSIZE  HmacGetContextSize;
    371   //
    372   // The function pointer of Initiation
    373   //
    374   CRYPTO_HMAC_INIT            HmacInitiate;
    375   //
    376   // The function pointer of HMAC Update.
    377   //
    378   CRYPTO_HMAC_UPDATE          HmacUpdate;
    379   //
    380   // The fucntion pointer of HMAC Final
    381   //
    382   CRYPTO_HMAC_FINAL           HmacFinal;
    383 } AUTH_ALGORITHM;
    384 
    385 //
    386 // The struct used to store the informatino and operation of Hash algorithm.
    387 //
    388 typedef struct _HASH_ALGORITHM {
    389   //
    390   // ID of the Algorithm
    391   //
    392   UINT8                    AlgorithmId;
    393   //
    394   // The Key length of the Algorithm
    395   //
    396   UINTN                    DigestLength;
    397   //
    398   // The ICV length of the Algorithm
    399   //
    400   UINTN                    IcvLength;
    401   //
    402   // The block size of the Algorithm
    403   //
    404   UINTN                    BlockSize;
    405   //
    406   // The function pointer of GetContextSize
    407   //
    408   CRYPTO_HASH_GETCONTEXTSIZE  HashGetContextSize;
    409   //
    410   // The function pointer of Initiation
    411   //
    412   CRYPTO_HASH_INIT            HashInitiate;
    413   //
    414   // The function pointer of Hash Update
    415   //
    416   CRYPTO_HASH_UPDATE          HashUpdate;
    417   //
    418   // The fucntion pointer of Hash Final
    419   //
    420   CRYPTO_HASH_FINAL           HashFinal;
    421 } HASH_ALGORITHM;
    422 
    423 /**
    424   Get the IV size of specified encryption alogrithm.
    425 
    426   @param[in]  AlgorithmId          The encryption algorithm ID.
    427 
    428   @return The value of IV size.
    429 
    430 **/
    431 UINTN
    432 IpSecGetEncryptIvLength (
    433   IN UINT8 AlgorithmId
    434   );
    435 
    436 /**
    437   Get the block size of specified encryption alogrithm.
    438 
    439   @param[in]  AlgorithmId          The encryption algorithm ID.
    440 
    441   @return The value of block size.
    442 
    443 **/
    444 UINTN
    445 IpSecGetEncryptBlockSize (
    446   IN UINT8   AlgorithmId
    447   );
    448 
    449 /**
    450   Get the required key length of the specified encryption alogrithm.
    451 
    452   @param[in]  AlgorithmId          The encryption algorithm ID.
    453 
    454   @return The value of key length.
    455 
    456 **/
    457 UINTN
    458 IpSecGetEncryptKeyLength (
    459   IN UINT8   AlgorithmId
    460   );
    461 
    462 /**
    463   Get the ICV size of the specified Authenticaion alogrithm.
    464 
    465   @param[in]  AlgorithmId          The Authentication algorithm ID.
    466 
    467   @return The value of ICV size.
    468 
    469 **/
    470 UINTN
    471 IpSecGetIcvLength (
    472   IN UINT8  AlgorithmId
    473   );
    474 
    475 /**
    476   Get the HMAC digest length by the specified Algorithm ID.
    477 
    478   @param[in]  AlgorithmId  The specified Alogrithm ID.
    479 
    480   @return The digest length of the specified Authentication Algorithm ID.
    481 
    482 **/
    483 UINTN
    484 IpSecGetHmacDigestLength (
    485   IN UINT8  AlgorithmId
    486   );
    487 
    488 /**
    489   Generate a random data for IV. If the IvSize is zero, not needed to create
    490   IV and return EFI_SUCCESS.
    491 
    492   @param[in]  IvBuffer  The pointer of the IV buffer.
    493   @param[in]  IvSize    The IV size in bytes.
    494 
    495   @retval     EFI_SUCCESS  Create random data for IV.
    496 
    497 **/
    498 EFI_STATUS
    499 IpSecGenerateIv (
    500   IN UINT8                           *IvBuffer,
    501   IN UINTN                           IvSize
    502   );
    503 
    504 /**
    505   Encrypt the buffer.
    506 
    507   This function calls relevant encryption interface from CryptoLib according to
    508   the input alogrithm ID. The InData should be multiple of block size. This function
    509   doesn't perform the padding. If it has the Ivec data, the length of it should be
    510   same with the block size. The block size is different from the different algorithm.
    511 
    512   @param[in]       AlgorithmId    The Alogrithem identification defined in RFC.
    513   @param[in]       Key            Pointer to the buffer containing encrypting key.
    514   @param[in]       KeyBits        The length of the key in bits.
    515   @param[in]       Ivec           Point to the buffer containning the Initializeion
    516                                   Vector (IV) data.
    517   @param[in]       InData         Point to the buffer containing the data to be
    518                                   encrypted.
    519   @param[in]       InDataLength   The length of InData in Bytes.
    520   @param[out]      OutData        Point to the buffer that receives the encryption
    521                                   output.
    522 
    523   @retval EFI_UNSUPPORTED       The input Algorithm is not supported.
    524   @retval EFI_OUT_OF_RESOURCE   The required resource can't be allocated.
    525   @retval EFI_SUCCESS           The operation completed successfully.
    526 
    527 **/
    528 EFI_STATUS
    529 IpSecCryptoIoEncrypt (
    530   IN CONST UINT8      AlgorithmId,
    531   IN CONST UINT8      *Key,
    532   IN CONST UINTN      KeyBits,
    533   IN CONST UINT8      *Ivec, OPTIONAL
    534   IN       UINT8      *InData,
    535   IN       UINTN      InDataLength,
    536      OUT   UINT8      *OutData
    537   );
    538 
    539 /**
    540   Decrypts the buffer.
    541 
    542   This function calls relevant Decryption interface from CryptoLib according to
    543   the input alogrithm ID. The InData should be multiple of block size. This function
    544   doesn't perform the padding. If it has the Ivec data, the length of it should be
    545   same with the block size. The block size is different from the different algorithm.
    546 
    547   @param[in]       AlgorithmId    The Alogrithem identification defined in RFC.
    548   @param[in]       Key            Pointer to the buffer containing encrypting key.
    549   @param[in]       KeyBits        The length of the key in bits.
    550   @param[in]       Ivec           Point to the buffer containning the Initializeion
    551                                   Vector (IV) data.
    552   @param[in]       InData         Point to the buffer containing the data to be
    553                                   decrypted.
    554   @param[in]       InDataLength   The length of InData in Bytes.
    555   @param[out]      OutData        Pointer to the buffer that receives the decryption
    556                                   output.
    557 
    558   @retval EFI_UNSUPPORTED       The input Algorithm is not supported.
    559   @retval EFI_OUT_OF_RESOURCE   The required resource can't be allocated.
    560   @retval EFI_SUCCESS           The operation completed successfully.
    561 
    562 **/
    563 EFI_STATUS
    564 IpSecCryptoIoDecrypt (
    565   IN CONST UINT8      AlgorithmId,
    566   IN CONST UINT8      *Key,
    567   IN CONST UINTN      KeyBits,
    568   IN CONST UINT8      *Ivec, OPTIONAL
    569   IN       UINT8      *InData,
    570   IN       UINTN      InDataLength,
    571      OUT   UINT8      *OutData
    572   );
    573 
    574 /**
    575   Digests the Payload with key and store the result into the OutData.
    576 
    577   This function calls relevant Hmac interface from CryptoLib according to
    578   the input alogrithm ID. It computes all datas from InDataFragment and output
    579   the result into the OutData buffer. If the OutDataSize is larger than the related
    580   HMAC alogrithm output size, return EFI_INVALID_PARAMETER.
    581 
    582   @param[in]      AlgorithmId     The authentication Identification.
    583   @param[in]      Key             Pointer of the authentication key.
    584   @param[in]      KeyLength       The length of the Key in bytes.
    585   @param[in]      InDataFragment  The list contains all data to be authenticated.
    586   @param[in]      FragmentCount   The size of the InDataFragment.
    587   @param[out]     OutData         For in, the buffer to receive the output data.
    588                                   For out, the buffer contains the authenticated data.
    589   @param[in]      OutDataSize     The size of the buffer of OutData.
    590 
    591   @retval EFI_UNSUPPORTED       If the AuthAlg is not in the support list.
    592   @retval EFI_INVALID_PARAMETER The OutData buffer size is larger than algorithm digest size.
    593   @retval EFI_SUCCESS           Authenticate the payload successfully.
    594   @retval otherwise             Authentication of the payload fails.
    595 
    596 **/
    597 EFI_STATUS
    598 IpSecCryptoIoHmac (
    599   IN     CONST UINT8              AlgorithmId,
    600   IN     CONST UINT8              *Key,
    601   IN           UINTN              KeyLength,
    602   IN           HASH_DATA_FRAGMENT *InDataFragment,
    603   IN           UINTN              FragmentCount,
    604      OUT       UINT8              *OutData,
    605   IN           UINTN              OutDataSize
    606   );
    607 
    608 /**
    609   Digests the Payload and store the result into the OutData.
    610 
    611   This function calls relevant Hash interface from CryptoLib according to
    612   the input alogrithm ID. It computes all datas from InDataFragment and output
    613   the result into the OutData buffer. If the OutDataSize is larger than the related
    614   Hash alogrithm output size, return EFI_INVALID_PARAMETER.
    615 
    616   @param[in]      AlgorithmId     The authentication Identification.
    617   @param[in]      InDataFragment  A list contains all data to be authenticated.
    618   @param[in]      FragmentCount   The size of the InDataFragment.
    619   @param[out]     OutData         For in, the buffer to receive the output data.
    620                                   For out, the buffer contains the authenticated data.
    621   @param[in]      OutDataSize     The size of the buffer of OutData.
    622 
    623   @retval EFI_UNSUPPORTED       If the AuthAlg is not in the support list.
    624   @retval EFI_SUCCESS           Authenticated the payload successfully.
    625   @retval EFI_INVALID_PARAMETER If the OutDataSize is larger than the related Hash
    626                                 algorithm could handle.
    627   @retval otherwise             Authentication of the payload failed.
    628 
    629 **/
    630 EFI_STATUS
    631 IpSecCryptoIoHash (
    632   IN     CONST UINT8              AlgorithmId,
    633   IN           HASH_DATA_FRAGMENT *InDataFragment,
    634   IN           UINTN              FragmentCount,
    635      OUT       UINT8              *OutData,
    636   IN           UINTN              OutDataSize
    637   );
    638 
    639 /**
    640   Generates the Diffie-Hellman public key.
    641 
    642   This function first initiate a DHContext, then call the DhSetParameter() to set
    643   the prime and primelenght, at end call the DhGenerateKey() to generates random
    644   secret exponent, and computes the public key. The output returned via parameter
    645   PublicKey and PublicKeySize. DH context is updated accordingly. If the PublicKey
    646   buffer is too small to hold the public key, EFI_INVALID_PARAMETER is returned
    647   and PublicKeySize is set to the required buffer size to obtain the public key.
    648 
    649   @param[in, out] DhContext       Pointer to the DH context.
    650   @param[in]      Generator       Vlaue of generator.
    651   @param[in]      PrimeLength     Length in bits of prime to be generated.
    652   @param[in]      Prime           Pointer to the buffer to receive the generated
    653                                   prime number.
    654   @param[out]     PublicKey       Pointer to the buffer to receive generated public key.
    655   @param[in, out] PublicKeySize   For in, the size of PublicKey buffer in bytes.
    656                                   For out, the size of data returned in PublicKey
    657                                   buffer in bytes.
    658 
    659   @retval EFI_SUCCESS             The operation perfoms successfully.
    660   @retval Otherwise               The operation is failed.
    661 
    662 **/
    663 EFI_STATUS
    664 IpSecCryptoIoDhGetPublicKey (
    665   IN OUT   UINT8  **DhContext,
    666   IN       UINTN  Generator,
    667   IN       UINTN  PrimeLength,
    668   IN CONST UINT8  *Prime,
    669      OUT   UINT8  *PublicKey,
    670   IN OUT   UINTN  *PublicKeySize
    671   );
    672 
    673 /**
    674   Generates exchanged common key.
    675 
    676   Given peer's public key, this function computes the exchanged common key, based
    677   on its own context including value of prime modulus and random secret exponent.
    678 
    679   @param[in, out] DhContext         Pointer to the DH context.
    680   @param[in]      PeerPublicKey     Pointer to the peer's Public Key.
    681   @param[in]      PeerPublicKeySize Size of peer's public key in bytes.
    682   @param[out]     Key               Pointer to the buffer to receive generated key.
    683   @param[in, out] KeySize           For in, the size of Key buffer in bytes.
    684                                     For out, the size of data returned in Key
    685                                     buffer in bytes.
    686 
    687   @retval EFI_SUCCESS              The operation perfoms successfully.
    688   @retval Otherwise                The operation is failed.
    689 
    690 **/
    691 EFI_STATUS
    692 IpSecCryptoIoDhComputeKey (
    693   IN   OUT   UINT8  *DhContext,
    694   IN   CONST UINT8  *PeerPublicKey,
    695   IN         UINTN  PeerPublicKeySize,
    696        OUT   UINT8  *Key,
    697   IN   OUT   UINTN  *KeySize
    698   );
    699 
    700 /**
    701   Releases the DH context. If DhContext is NULL, return EFI_INVALID_PARAMETER.
    702 
    703   @param[in, out]     DhContext         Pointer to the DH context to be freed.
    704 
    705   @retval EFI_SUCCESS              The operation perfoms successfully.
    706   @retval EFI_INVALID_PARAMETER    The DhContext is NULL.
    707 
    708 **/
    709 EFI_STATUS
    710 IpSecCryptoIoFreeDh (
    711   IN   OUT   UINT8  **DhContext
    712   );
    713 
    714 /**
    715   Generates random numbers of specified size.
    716 
    717   If the Random Generator wasn't initiated, initiate it first, then call RandomBytes.
    718 
    719   @param[out]  OutBuffer        Pointer to buffer to receive random value.
    720   @param[in]   Bytes            Size of randome bytes to generate.
    721 
    722   @retval EFI_SUCCESS              The operation perfoms successfully.
    723   @retval Otherwise                The operation is failed.
    724 
    725 **/
    726 EFI_STATUS
    727 IpSecCryptoIoGenerateRandomBytes (
    728   OUT UINT8*    OutBuffer,
    729   IN  UINTN     Bytes
    730   );
    731 
    732 /**
    733   Authenticate data with the certificate.
    734 
    735   @param[in]      InData          Pointer to the Data to be signed.
    736   @param[in]      InDataSize      InData size in bytes.
    737   @param[in]      PrivateKey      Pointer to the  private key.
    738   @param[in]      PrivateKeySize  The size of Private Key in bytes.
    739   @param[in]      KeyPassWord     Pointer to the password for retrieving private key.
    740   @param[in]      KeyPwdSize      The size of Key Password in bytes.
    741   @param[out]     OutData         The pointer to the signed data.
    742   @param[in, out] OutDataSize     Pointer to contain the size of out data.
    743 
    744 **/
    745 VOID
    746 IpSecCryptoIoAuthDataWithCertificate (
    747   IN     UINT8   *InData,
    748   IN     UINTN   InDataSize,
    749   IN     UINT8   *PrivateKey,
    750   IN     UINTN   PrivateKeySize,
    751   IN     UINT8   *KeyPassWord,
    752   IN     UINTN   KeyPwdSize,
    753      OUT UINT8   **OutData,
    754   IN OUT UINTN   *OutDataSize
    755   );
    756 
    757 /**
    758   Verify the singed data with the public key which is contained in a certificate.
    759 
    760   @param[in]     InCert          Pointer to the Certificate which contains the
    761                                  public key.
    762   @param[in]     CertLen         The size of Certificate in bytes.
    763   @param[in]     InCa            Pointer to the CA certificate
    764   @param[in]     CaLen           The size of CA certificate in bytes.
    765   @param[in]     InData          Pointer to octect message hash to be checked.
    766   @param[in]     InDataSize      Size of the message hash in bytes.
    767   @param[in]     Singnature      The pointer to the RSA PKCS1-V1_5 signature to be verifed.
    768   @param[in]     SigSize         Size of signature in bytes.
    769 
    770   @retval  TRUE   Valid signature encoded in PKCS1-v1_5.
    771   @retval  FALSE  Invalid signature or invalid RSA context.
    772 
    773 **/
    774 BOOLEAN
    775 IpSecCryptoIoVerifySignDataByCertificate (
    776   IN     UINT8   *InCert,
    777   IN     UINTN   CertLen,
    778   IN     UINT8   *InCa,
    779   IN     UINTN   CaLen,
    780   IN     UINT8   *InData,
    781   IN     UINTN   InDataSize,
    782   IN     UINT8   *Singnature,
    783   IN     UINTN   SigSize
    784   );
    785 
    786 /**
    787   Retrieves the RSA Public Key from one X509 certificate (DER format only).
    788 
    789   @param[in]     InCert            Pointer to the certificate.
    790   @param[in]     CertLen           The size of the certificate in bytes.
    791   @param[out]    PublicKey         Pointer to the retrieved public key.
    792   @param[out]    PublicKeyLen      Size of Public Key in bytes.
    793 
    794   @retval  EFI_SUCCESS            Successfully get the public Key.
    795   @retval  EFI_INVALID_PARAMETER  The CA certificate is malformed.
    796 
    797 **/
    798 EFI_STATUS
    799 IpSecCryptoIoGetPublicKeyFromCert (
    800   IN     UINT8   *InCert,
    801   IN     UINTN   CertLen,
    802   OUT    UINT8   **PublicKey,
    803   OUT    UINTN   *PublicKeyLen
    804   );
    805 
    806 /**
    807   Retrieves the subject name from one X509 certificate (DER format only).
    808 
    809   @param[in]     InCert            Pointer to the X509 certificate.
    810   @param[in]     CertSize          The size of the X509 certificate in bytes.
    811   @param[out]    CertSubject       Pointer to the retrieved certificate subject.
    812   @param[out]    SubjectSize       The size of Certificate Subject in bytes.
    813 
    814   @retval  EFI_SUCCESS            Retrieved the certificate subject successfully.
    815   @retval  EFI_INVALID_PARAMETER  The certificate is malformed.
    816 
    817 **/
    818 EFI_STATUS
    819 IpSecCryptoIoGetSubjectFromCert (
    820   IN     UINT8   *InCert,
    821   IN     UINTN   CertSize,
    822   OUT    UINT8   **CertSubject,
    823   OUT    UINTN   *SubjectSize
    824   );
    825 
    826 #endif
    827 
    828