]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/Application/IpsecConfig/PolicyEntryOperation.c
NetworkPkg: Fix SPD entry edit policy issue in IPSecConfig.
[mirror_edk2.git] / NetworkPkg / Application / IpsecConfig / PolicyEntryOperation.c
index ddfbb4c5041dc1b9da454c7976a02c511fc2a666..9bbc11490c5430cfb883c9c444b99e6414235a59 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   The implementation of policy entry operation function in IpSecConfig application.\r
 \r
-  Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.<BR>\r
 \r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
@@ -25,7 +25,7 @@
 \r
   @param[out]     Selector        The pointer to the EFI_IPSEC_SPD_SELECTOR structure.\r
   @param[in]      ParamPackage    The pointer to the ParamPackage list.\r
-  @param[in, out] ParamPackage    The pointer to the Mask.\r
+  @param[in, out] Mask            The pointer to the Mask.\r
 \r
   @retval EFI_SUCCESS              Fill in EFI_IPSEC_SPD_SELECTOR successfully.\r
   @retval EFI_INVALID_PARAMETER    Invalid user input parameter.\r
@@ -579,22 +579,22 @@ CreateSpdEntry (
 }\r
 \r
 /**\r
-  Fill in EFI_IPSEC_SA_ID and EFI_IPSEC_SA_DATA through ParamPackage list.\r
+  Fill in EFI_IPSEC_SA_ID and EFI_IPSEC_SA_DATA2 through ParamPackage list.\r
 \r
   @param[out] SaId            The pointer to the EFI_IPSEC_SA_ID structure.\r
-  @param[out] Data            The pointer to the EFI_IPSEC_SA_DATA structure.\r
+  @param[out] Data            The pointer to the EFI_IPSEC_SA_DATA2 structure.\r
   @param[in]  ParamPackage    The pointer to the ParamPackage list.\r
   @param[out] Mask            The pointer to the Mask.\r
   @param[in]  CreateNew       The switch to create new.\r
 \r
-  @retval EFI_SUCCESS              Fill in EFI_IPSEC_SA_ID and EFI_IPSEC_SA_DATA successfully.\r
+  @retval EFI_SUCCESS              Fill in EFI_IPSEC_SA_ID and EFI_IPSEC_SA_DATA2 successfully.\r
   @retval EFI_INVALID_PARAMETER    Invalid user input parameter.\r
 \r
 **/\r
 EFI_STATUS\r
 CreateSadEntry (\r
   OUT EFI_IPSEC_SA_ID      **SaId,\r
-  OUT EFI_IPSEC_SA_DATA    **Data,\r
+  OUT EFI_IPSEC_SA_DATA2   **Data,\r
   IN  LIST_ENTRY           *ParamPackage,\r
   OUT UINT32               *Mask,\r
   IN  BOOLEAN              CreateNew\r
@@ -605,6 +605,7 @@ CreateSadEntry (
   UINTN           AuthKeyLength;\r
   UINTN           EncKeyLength;\r
   CONST CHAR16    *ValueStr;\r
+  CHAR8           *AsciiStr;\r
   UINTN           DataSize;\r
 \r
   Status        = EFI_SUCCESS;\r
@@ -649,45 +650,22 @@ CreateSadEntry (
   }\r
 \r
   //\r
-  // Convert user imput from string to integer, and fill in the DestAddress in EFI_IPSEC_SA_ID.\r
-  //\r
-  ValueStr = ShellCommandLineGetValue (ParamPackage, L"--dest");\r
-  if (ValueStr != NULL) {\r
-    Status = EfiInetAddr2 ((CHAR16 *) ValueStr, &(*SaId)->DestAddress);\r
-    if (EFI_ERROR (Status)) {\r
-      ShellPrintHiiEx (\r
-        -1,\r
-        -1,\r
-        NULL,\r
-        STRING_TOKEN (STR_IPSEC_CONFIG_INCORRECT_PARAMETER_VALUE),\r
-        mHiiHandle,\r
-        mAppName,\r
-        L"--dest",\r
-        ValueStr\r
-        );\r
-      ReturnStatus = EFI_INVALID_PARAMETER;\r
-    } else {\r
-      *Mask |= DEST;\r
-    }\r
-  }\r
-\r
-  //\r
-  // Convert user imput from string to integer, and fill in EFI_IPSEC_SA_DATA.\r
+  // Convert user imput from string to integer, and fill in EFI_IPSEC_SA_DATA2.\r
   //\r
   ValueStr = ShellCommandLineGetValue (ParamPackage, L"--auth-key");\r
   if (ValueStr != NULL) {\r
-    AuthKeyLength = (StrLen (ValueStr) + 1) * sizeof (CHAR16);\r
+    AuthKeyLength = StrLen (ValueStr);\r
   }\r
 \r
   ValueStr = ShellCommandLineGetValue (ParamPackage, L"--encrypt-key");\r
   if (ValueStr != NULL) {\r
-    EncKeyLength = (StrLen (ValueStr) + 1) * sizeof (CHAR16);\r
+    EncKeyLength = StrLen (ValueStr);\r
   }\r
 \r
   //\r
-  // EFI_IPSEC_SA_DATA:\r
+  // EFI_IPSEC_SA_DATA2:\r
   //   +------------\r
-  //   | EFI_IPSEC_SA_DATA\r
+  //   | EFI_IPSEC_SA_DATA2\r
   //   +-----------------------\r
   //   | AuthKey\r
   //   +-------------------------\r
@@ -697,7 +675,7 @@ CreateSadEntry (
   //\r
   // Notes: To make sure the address alignment add padding after each data if needed.\r
   //\r
-  DataSize  = ALIGN_VARIABLE (sizeof (EFI_IPSEC_SA_DATA));\r
+  DataSize  = ALIGN_VARIABLE (sizeof (EFI_IPSEC_SA_DATA2));\r
   DataSize  = ALIGN_VARIABLE (DataSize + AuthKeyLength);\r
   DataSize  = ALIGN_VARIABLE (DataSize + EncKeyLength);\r
   DataSize  = ALIGN_VARIABLE (DataSize + sizeof (EFI_IPSEC_SPD_SELECTOR));\r
@@ -805,7 +783,11 @@ CreateSadEntry (
   ValueStr = ShellCommandLineGetValue (ParamPackage, L"--encrypt-key");\r
   if (ValueStr != NULL ) {\r
     (*Data)->AlgoInfo.EspAlgoInfo.EncKeyLength = EncKeyLength;\r
-    CopyMem ((*Data)->AlgoInfo.EspAlgoInfo.EncKey, ValueStr, EncKeyLength);\r
+    AsciiStr = AllocateZeroPool (EncKeyLength + 1);\r
+    ASSERT (AsciiStr != NULL);\r
+    UnicodeStrToAsciiStr (ValueStr, AsciiStr);\r
+    CopyMem ((*Data)->AlgoInfo.EspAlgoInfo.EncKey,  AsciiStr, EncKeyLength);\r
+    FreePool (AsciiStr);\r
     *Mask |= ENCRYPT_KEY;\r
   } else {\r
     (*Data)->AlgoInfo.EspAlgoInfo.EncKey = NULL;\r
@@ -831,7 +813,11 @@ CreateSadEntry (
   ValueStr = ShellCommandLineGetValue (ParamPackage, L"--auth-key");\r
   if (ValueStr != NULL) {\r
     (*Data)->AlgoInfo.EspAlgoInfo.AuthKeyLength = AuthKeyLength;\r
-    CopyMem ((*Data)->AlgoInfo.EspAlgoInfo.AuthKey, ValueStr, AuthKeyLength);\r
+    AsciiStr = AllocateZeroPool (AuthKeyLength + 1);\r
+    ASSERT (AsciiStr != NULL);\r
+    UnicodeStrToAsciiStr (ValueStr, AsciiStr);\r
+    CopyMem ((*Data)->AlgoInfo.EspAlgoInfo.AuthKey, AsciiStr, AuthKeyLength);\r
+    FreePool (AsciiStr);\r
     *Mask |= AUTH_KEY;\r
   } else {\r
     (*Data)->AlgoInfo.EspAlgoInfo.AuthKey = NULL;\r
@@ -905,10 +891,73 @@ CreateSadEntry (
     ReturnStatus = EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  //\r
+  // Convert user imput from string to integer, and fill in the DestAddress in EFI_IPSEC_SA_ID.\r
+  //\r
+  ValueStr = ShellCommandLineGetValue (ParamPackage, L"--tunnel-dest");\r
+  if (ValueStr != NULL) {\r
+    Status = EfiInetAddr2 ((CHAR16 *) ValueStr, &(*Data)->TunnelDestinationAddress);\r
+    if (EFI_ERROR (Status)) {\r
+      ShellPrintHiiEx (\r
+        -1,\r
+        -1,\r
+        NULL,\r
+        STRING_TOKEN (STR_IPSEC_CONFIG_INCORRECT_PARAMETER_VALUE),\r
+        mHiiHandle,\r
+        mAppName,\r
+        L"--tunnel-dest",\r
+        ValueStr\r
+        );\r
+      ReturnStatus = EFI_INVALID_PARAMETER;\r
+    } else {\r
+      *Mask |= DEST;\r
+    }\r
+  }\r
+\r
+  //\r
+  // Convert user input from string to integer, and fill in the DestAddress in EFI_IPSEC_SA_ID.\r
+  //\r
+  ValueStr = ShellCommandLineGetValue (ParamPackage, L"--tunnel-source");\r
+  if (ValueStr != NULL) {\r
+    Status = EfiInetAddr2 ((CHAR16 *) ValueStr, &(*Data)->TunnelSourceAddress);\r
+    if (EFI_ERROR (Status)) {\r
+      ShellPrintHiiEx (\r
+        -1,\r
+        -1,\r
+        NULL,\r
+        STRING_TOKEN (STR_IPSEC_CONFIG_INCORRECT_PARAMETER_VALUE),\r
+        mHiiHandle,\r
+        mAppName,\r
+        L"--tunnel-source",\r
+        ValueStr\r
+        );\r
+      ReturnStatus = EFI_INVALID_PARAMETER;\r
+    } else {\r
+      *Mask |= SOURCE;\r
+    }\r
+  }\r
+\r
+  //\r
+  // If it is TunnelMode, then check if the tunnel-source and --tunnel-dest are set\r
+  //\r
+  if ((*Data)->Mode == EfiIPsecTunnel) {\r
+    if ((*Mask & (DEST|SOURCE)) != (DEST|SOURCE)) {\r
+      ShellPrintHiiEx (\r
+        -1,\r
+        -1,\r
+        NULL,\r
+        STRING_TOKEN (STR_IPSEC_CONFIG_MISSING_ONE_OF_PARAMETERS),\r
+        mHiiHandle,\r
+        mAppName,\r
+        L"--tunnel-source --tunnel-dest"\r
+        );\r
+      ReturnStatus = EFI_INVALID_PARAMETER;\r
+    }\r
+  }\r
   ReturnStatus = CreateSpdSelector ((*Data)->SpdSelector, ParamPackage, Mask);\r
 \r
   if (CreateNew) {\r
-    if ((*Mask & (SPI | IPSEC_PROTO | DEST)) != (SPI | IPSEC_PROTO | DEST)) {\r
+    if ((*Mask & (SPI|IPSEC_PROTO|LOCAL|REMOTE)) != (SPI|IPSEC_PROTO|LOCAL|REMOTE)) {\r
       ShellPrintHiiEx (\r
         -1,\r
         -1,\r
@@ -916,7 +965,7 @@ CreateSadEntry (
         STRING_TOKEN (STR_IPSEC_CONFIG_MISSING_ONE_OF_PARAMETERS),\r
         mHiiHandle,\r
         mAppName,\r
-        L"--spi --ipsec-proto --dest"\r
+        L"--spi --ipsec-proto --local --remote"\r
         );\r
       ReturnStatus = EFI_INVALID_PARAMETER;\r
     } else {\r
@@ -932,7 +981,7 @@ CreateSadEntry (
             L"--auth-algo"\r
             );\r
           ReturnStatus = EFI_INVALID_PARAMETER;\r
-        } else if ((*Data)->AlgoInfo.EspAlgoInfo.AuthAlgoId != EFI_IPSEC_AALG_NONE && (*Mask & AUTH_KEY) == 0) {\r
+        } else if ((*Data)->AlgoInfo.EspAlgoInfo.AuthAlgoId != IPSEC_AALG_NONE && (*Mask & AUTH_KEY) == 0) {\r
           ShellPrintHiiEx (\r
             -1,\r
             -1,\r
@@ -945,7 +994,7 @@ CreateSadEntry (
           ReturnStatus = EFI_INVALID_PARAMETER;\r
         }\r
       } else {\r
-        if ((*Mask & ENCRYPT_ALGO) == 0) {\r
+        if ((*Mask & (ENCRYPT_ALGO|AUTH_ALGO)) != (ENCRYPT_ALGO|AUTH_ALGO) ) {\r
           ShellPrintHiiEx (\r
             -1,\r
             -1,\r
@@ -953,10 +1002,10 @@ CreateSadEntry (
             STRING_TOKEN (STR_IPSEC_CONFIG_MISSING_PARAMETER),\r
             mHiiHandle,\r
             mAppName,\r
-            L"--encrypt-algo"\r
+            L"--encrypt-algo --auth-algo"\r
             );\r
           ReturnStatus = EFI_INVALID_PARAMETER;\r
-        } else if ((*Data)->AlgoInfo.EspAlgoInfo.EncAlgoId != EFI_IPSEC_EALG_NONE && (*Mask & ENCRYPT_KEY) == 0) {\r
+        } else if ((*Data)->AlgoInfo.EspAlgoInfo.EncAlgoId != IPSEC_EALG_NONE && (*Mask & ENCRYPT_KEY) == 0) {\r
           ShellPrintHiiEx (\r
             -1,\r
             -1,\r
@@ -967,6 +1016,17 @@ CreateSadEntry (
             L"--encrypt-key"\r
             );\r
           ReturnStatus = EFI_INVALID_PARAMETER;\r
+        } else if ((*Data)->AlgoInfo.EspAlgoInfo.AuthAlgoId != IPSEC_AALG_NONE && (*Mask & AUTH_KEY) == 0) {\r
+          ShellPrintHiiEx (\r
+            -1,\r
+            -1,\r
+            NULL,\r
+            STRING_TOKEN (STR_IPSEC_CONFIG_MISSING_PARAMETER),\r
+            mHiiHandle,\r
+            mAppName,\r
+            L"--auth-key"\r
+            );\r
+          ReturnStatus = EFI_INVALID_PARAMETER;\r
         }\r
       }\r
     }\r
@@ -999,7 +1059,7 @@ CreatePadEntry (
 {\r
   EFI_STATUS         Status;\r
   EFI_STATUS         ReturnStatus;\r
-  EFI_FILE_HANDLE    FileHandle;\r
+  SHELL_FILE_HANDLE  FileHandle;\r
   UINT64             FileSize;\r
   UINTN              AuthDataLength;\r
   UINTN              RevocationDataLength;\r
@@ -1044,7 +1104,7 @@ CreatePadEntry (
   ValueStr = ShellCommandLineGetValue (ParamPackage, L"--peer-id");\r
   if (ValueStr != NULL) {\r
     (*PadId)->PeerIdValid = TRUE;\r
-    StrnCpy ((CHAR16 *) (*PadId)->Id.PeerId, ValueStr, ARRAY_SIZE ((*PadId)->Id.PeerId) - 1);\r
+    StrnCpyS ((CHAR16 *) (*PadId)->Id.PeerId, MAX_PEERID_LEN / sizeof (CHAR16), ValueStr, MAX_PEERID_LEN / sizeof (CHAR16) - 1);\r
     *Mask |= PEER_ID;\r
   }\r
 \r
@@ -1178,7 +1238,7 @@ CreatePadEntry (
         (*Data)->AuthData = NULL;\r
       } else {\r
         DataLength = AuthDataLength;\r
-        Status = ShellReadFile (FileHandle, &DataLength, (*Data)->AuthData);\r
+        Status     = ShellReadFile (FileHandle, &DataLength, (*Data)->AuthData);\r
         ShellCloseFile (&FileHandle);\r
         if (EFI_ERROR (Status)) {\r
           ShellPrintHiiEx (\r
@@ -1338,8 +1398,10 @@ CombineSpdEntry (
   //\r
   // Process Data\r
   //\r
+  OldData->SaIdCount = 0;\r
+\r
   if ((Mask & NAME) != 0) {\r
-    AsciiStrCpy ((CHAR8 *) OldData->Name, (CHAR8 *) NewData->Name);\r
+    AsciiStrCpyS ((CHAR8 *) OldData->Name, MAX_PEERID_LEN, (CHAR8 *) NewData->Name);\r
   }\r
 \r
   if ((Mask & PACKET_FLAG) != 0) {\r
@@ -1475,9 +1537,9 @@ CombineSpdEntry (
   Combine old SAD entry with new SAD entry.\r
 \r
   @param[in, out] OldSaId      The pointer to the EFI_IPSEC_SA_ID structure.\r
-  @param[in, out] OldData      The pointer to the EFI_IPSEC_SA_DATA structure.\r
+  @param[in, out] OldData      The pointer to the EFI_IPSEC_SA_DATA2 structure.\r
   @param[in]      NewSaId      The pointer to the EFI_IPSEC_SA_ID structure.\r
-  @param[in]      NewData      The pointer to the EFI_IPSEC_SA_DATA structure.\r
+  @param[in]      NewData      The pointer to the EFI_IPSEC_SA_DATA2 structure.\r
   @param[in]      Mask         The pointer to the Mask.\r
   @param[out]     CreateNew    The switch to create new.\r
 \r
@@ -1488,9 +1550,9 @@ CombineSpdEntry (
 EFI_STATUS\r
 CombineSadEntry (\r
   IN OUT EFI_IPSEC_SA_ID      *OldSaId,\r
-  IN OUT EFI_IPSEC_SA_DATA    *OldData,\r
+  IN OUT EFI_IPSEC_SA_DATA2   *OldData,\r
   IN     EFI_IPSEC_SA_ID      *NewSaId,\r
-  IN     EFI_IPSEC_SA_DATA    *NewData,\r
+  IN     EFI_IPSEC_SA_DATA2   *NewData,\r
   IN     UINT32               Mask,\r
      OUT BOOLEAN              *CreateNew\r
   )\r
@@ -1511,11 +1573,16 @@ CombineSadEntry (
   }\r
 \r
   if ((Mask & DEST) == 0) {\r
-    CopyMem (&NewSaId->DestAddress, &OldSaId->DestAddress, sizeof (EFI_IP_ADDRESS));\r
-  } else if (CompareMem (&NewSaId->DestAddress, &OldSaId->DestAddress, sizeof (EFI_IP_ADDRESS)) != 0) {\r
+    CopyMem (&NewData->TunnelDestinationAddress, &OldData->TunnelDestinationAddress, sizeof (EFI_IP_ADDRESS));\r
+  } else if (CompareMem (&NewData->TunnelDestinationAddress, &OldData->TunnelDestinationAddress, sizeof (EFI_IP_ADDRESS)) != 0) {\r
     *CreateNew = TRUE;\r
   }\r
 \r
+  if ((Mask & SOURCE) == 0) {\r
+    CopyMem (&NewData->TunnelSourceAddress, &OldData->TunnelSourceAddress, sizeof (EFI_IP_ADDRESS));\r
+  } else if (CompareMem (&NewData->TunnelSourceAddress, &OldData->TunnelSourceAddress, sizeof (EFI_IP_ADDRESS)) != 0) {\r
+    *CreateNew = TRUE;\r
+  }\r
   //\r
   // Process SA_DATA.\r
   //\r
@@ -1588,7 +1655,7 @@ CombineSadEntry (
     //\r
     // Encrypt_key should be provided if algorithm is not NONE.\r
     //\r
-    if (NewData->AlgoInfo.EspAlgoInfo.EncAlgoId != EFI_IPSEC_EALG_NONE && (Mask & ENCRYPT_KEY) == 0) {\r
+    if (NewData->AlgoInfo.EspAlgoInfo.EncAlgoId != IPSEC_EALG_NONE && (Mask & ENCRYPT_KEY) == 0) {\r
       ShellPrintHiiEx (\r
         -1,\r
         -1,\r
@@ -1797,37 +1864,30 @@ EditOperatePolicyEntry (
                &CreateNew\r
                );\r
     if (!EFI_ERROR (Status)) {\r
+      //\r
+      // If the Selector already existed, this Entry will be updated by set data.\r
+      //\r
+      Status = mIpSecConfig->SetData (\r
+                               mIpSecConfig,\r
+                               Context->DataType,\r
+                               Context->Selector, /// New created selector.\r
+                               Data, /// Old date which has been modified, need to be set data.\r
+                               Selector\r
+                               );\r
+      ASSERT_EFI_ERROR (Status);\r
+      \r
       if (CreateNew) {\r
         //\r
-        // Insert new entry before old entry\r
+        // Edit the entry to a new one. So, we need delete the old entry.\r
         //\r
         Status = mIpSecConfig->SetData (\r
                                  mIpSecConfig,\r
                                  Context->DataType,\r
-                                 Context->Selector,\r
-                                 Data,\r
-                                 Selector\r
-                                 );\r
-        ASSERT_EFI_ERROR (Status);\r
-        //\r
-        // Delete old entry\r
-        //\r
-        Status = mIpSecConfig->SetData (\r
-                                 mIpSecConfig,\r
-                                 Context->DataType,\r
-                                 Selector,\r
-                                 NULL,\r
+                                 Selector, /// Old selector.\r
+                                 NULL, /// NULL means to delete this Entry specified by Selector.\r
                                  NULL\r
                                  );\r
         ASSERT_EFI_ERROR (Status);\r
-      } else {\r
-        Status = mIpSecConfig->SetData (\r
-                                 mIpSecConfig,\r
-                                 Context->DataType,\r
-                                 Context->Selector,\r
-                                 Data,\r
-                                 NULL\r
-                                 );\r
       }\r
     }\r
 \r