Home | History | Annotate | Download | only in IpSecDxe
      1 /** @file
      2   Common operation of the IKE.
      3 
      4   Copyright (c) 2010 - 2016, 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 
     16 #ifndef _IKE_COMMON_H_
     17 #define _IKE_COMMON_H_
     18 
     19 #include <Protocol/Udp4.h>
     20 #include <Protocol/Udp6.h>
     21 #include <Protocol/Ip4Config2.h>
     22 
     23 #include <Library/BaseLib.h>
     24 #include <Library/BaseMemoryLib.h>
     25 #include <Library/MemoryAllocationLib.h>
     26 #include <Library/UefiRuntimeServicesTableLib.h>
     27 #include <Library/UefiBootServicesTableLib.h>
     28 #include <Library/DebugLib.h>
     29 #include <Library/UdpIoLib.h>
     30 #include <Library/BaseCryptLib.h>
     31 
     32 #include "Ikev2/Ikev2.h"
     33 #include "IpSecImpl.h"
     34 #include "IkePacket.h"
     35 #include "IpSecCryptIo.h"
     36 
     37 
     38 #define IKE_DEFAULT_PORT              500
     39 #define IKE_DEFAULT_TIMEOUT_INTERVAL  10000 // 10s
     40 #define IKE_NONCE_SIZE                16
     41 #define IKE_MAX_RETRY                 4
     42 #define IKE_SPI_BASE                  0x100
     43 #define IKE_PAYLOAD_SIGNATURE         SIGNATURE_32('I','K','E','P')
     44 #define IKE_PAYLOAD_BY_PACKET(a)      CR(a,IKE_PAYLOAD,ByPacket,IKE_PAYLOAD_SIGNATURE)
     45 
     46 
     47 #define IKE_PACKET_APPEND_PAYLOAD(IkePacket,IkePayload)                 \
     48   do {                                                                  \
     49     InsertTailList(&(IkePacket)->PayloadList, &(IkePayload)->ByPacket); \
     50   } while (0)
     51 
     52 #define IKE_PACKET_REMOVE_PAYLOAD(IkePacket,IkePayload)                 \
     53   do {                                                                  \
     54     RemoveEntryList(&(IkePayload)->ByPacket);                           \
     55   } while (0)
     56 
     57 #define IKE_PACKET_END_PAYLOAD(IkePacket, Node)                        \
     58   Node = GetFirstNode (&(IkePacket)->PayloadList);                      \
     59   while (!IsNodeAtEnd (&(IkePacket)->PayloadList, Node)) {             \
     60     Node = GetNextNode (&(IkePacket)->PayloadList, Node);              \
     61   }                                                                     \
     62 
     63 /**
     64   Call Crypto Lib to generate a random value with eight-octet length.
     65 
     66   @return the 64 byte vaule.
     67 
     68 **/
     69 UINT64
     70 IkeGenerateCookie (
     71   VOID
     72   );
     73 
     74 /**
     75   Generate the random data for Nonce payload.
     76 
     77   @param[in]  NonceSize      Size of the data in bytes.
     78 
     79   @return Buffer which contains the random data of the spcified size.
     80 
     81 **/
     82 UINT8 *
     83 IkeGenerateNonce (
     84   IN UINTN              NonceSize
     85   );
     86 
     87 /**
     88   Convert the IKE Header from Network order to Host order.
     89 
     90   @param[in, out]  Header    The pointer of the IKE_HEADER.
     91 
     92 **/
     93 VOID
     94 IkeHdrNetToHost (
     95   IN OUT IKE_HEADER *Header
     96   );
     97 
     98 
     99 /**
    100   Convert the IKE Header from Host order to Network order.
    101 
    102   @param[in, out] Header     The pointer of the IKE_HEADER.
    103 
    104 **/
    105 VOID
    106 IkeHdrHostToNet (
    107   IN OUT IKE_HEADER *Header
    108   );
    109 
    110 /**
    111   Allocate a buffer of IKE_PAYLOAD and set its Signature.
    112 
    113   @return A buffer of IKE_PAYLOAD.
    114 
    115 **/
    116 IKE_PAYLOAD *
    117 IkePayloadAlloc (
    118   VOID
    119   );
    120 
    121 /**
    122   Free a specified IKE_PAYLOAD buffer.
    123 
    124   @param[in]  IkePayload   Pointer of IKE_PAYLOAD to be freed.
    125 
    126 **/
    127 VOID
    128 IkePayloadFree (
    129   IN IKE_PAYLOAD *IkePayload
    130   );
    131 
    132 /**
    133   Generate an new SPI.
    134 
    135   @param[in]       IkeSaSession   Pointer to IKEV2_SA_SESSION related to this Child SA
    136                                   Session.
    137   @param[in, out]  SpiValue       Pointer to the new generated SPI value.
    138 
    139   @retval EFI_SUCCESS         The operation performs successfully.
    140   @retval Otherwise           The operation is failed.
    141 
    142 **/
    143 EFI_STATUS
    144 IkeGenerateSpi (
    145   IN     IKEV2_SA_SESSION         *IkeSaSession,
    146   IN OUT UINT32                   *SpiValue
    147   );
    148 
    149 /**
    150   Generate a random data for IV
    151 
    152   @param[in]  IvBuffer  The pointer of the IV buffer.
    153   @param[in]  IvSize    The IV size.
    154 
    155   @retval     EFI_SUCCESS  Create a random data for IV.
    156   @retval     otherwise    Failed.
    157 
    158 **/
    159 EFI_STATUS
    160 IkeGenerateIv (
    161   IN UINT8                           *IvBuffer,
    162   IN UINTN                           IvSize
    163   );
    164 
    165 /**
    166   Get the IKE Version from the IKE_SA_SESSION.
    167 
    168   @param[in]  Session  Pointer of the IKE_SA_SESSION.
    169 
    170 **/
    171 UINT8
    172 IkeGetVersionFromSession (
    173   IN UINT8                    *Session
    174   );
    175 
    176 /**
    177   Find SPD entry by a specified SPD selector.
    178 
    179   @param[in] SpdSel       Point to SPD Selector to be searched for.
    180 
    181   @retval Point to Spd Entry if the SPD entry found.
    182   @retval NULL if not found.
    183 
    184 **/
    185 IPSEC_SPD_ENTRY *
    186 IkeSearchSpdEntry (
    187   IN EFI_IPSEC_SPD_SELECTOR             *SpdSel
    188   );
    189 
    190 extern MODP_GROUP             OakleyModpGroup[];
    191 extern IKE_ALG_GUID_INFO      mIPsecEncrAlgInfo[];
    192 extern IKE_ALG_GUID_INFO      mIPsecAuthAlgInfo[];
    193 
    194 #endif
    195 
    196