Thanks and with the changes:
Reviewed-by: Hao Wu <[email protected]>

Best Regards,
Hao Wu


> -----Original Message-----
> From: Dong, Eric
> Sent: Monday, May 07, 2018 1:33 PM
> To: Wu, Hao A; [email protected]
> Subject: RE: [Patch 3/3] SecurityPkg/OpalPassword: Add support for pyrite 2.0
> devices.
> 
> Hi Hao,
> 
> Thanks for your comments, I will update it when I check in the code.
> 
> Thanks,
> Eric
> 
> -----Original Message-----
> From: Wu, Hao A
> Sent: Monday, May 7, 2018 11:08 AM
> To: Dong, Eric <[email protected]>; [email protected]
> Subject: RE: [Patch 3/3] SecurityPkg/OpalPassword: Add support for pyrite 2.0
> devices.
> 
> Some comments below:
> 
> > -----Original Message-----
> > From: Dong, Eric
> > Sent: Thursday, May 03, 2018 11:17 AM
> > To: [email protected]; Wu, Hao A
> > Subject: [Patch 3/3] SecurityPkg/OpalPassword: Add support for pyrite
> > 2.0 devices.
> >
> > Contributed-under: TianoCore Contribution Agreement 1.1
> > Signed-off-by: Eric Dong <[email protected]>
> > ---
> >  SecurityPkg/Tcg/Opal/OpalPassword/OpalDriver.c     | 60 ++++++++++++++--
> >  SecurityPkg/Tcg/Opal/OpalPassword/OpalDriver.h     |  9 +++
> >  SecurityPkg/Tcg/Opal/OpalPassword/OpalHii.c        | 84
> > ++++++++++++++++++++++
> >  .../Tcg/Opal/OpalPassword/OpalPasswordPei.c        |  1 +
> >  4 files changed, 147 insertions(+), 7 deletions(-)
> >
> > diff --git a/SecurityPkg/Tcg/Opal/OpalPassword/OpalDriver.c
> > b/SecurityPkg/Tcg/Opal/OpalPassword/OpalDriver.c
> > index 4133e503e2..91ab372f0c 100644
> > --- a/SecurityPkg/Tcg/Opal/OpalPassword/OpalDriver.c
> > +++ b/SecurityPkg/Tcg/Opal/OpalPassword/OpalDriver.c
> > @@ -105,10 +105,9 @@ OpalSupportGetAvailableActions(
> >    }
> >
> >    //
> > -  // Psid revert is available for any device with media encryption
> > support
> > -  // Revert is allowed for any device with media encryption support,
> > however it requires
> > +  // Psid revert is available for any device with media encryption
> > + support or
> > pyrite 2.0 type support.
> >    //
> > -  if (SupportedAttributes->MediaEncryption) {
> > +  if (SupportedAttributes->PyriteSscV2 || SupportedAttributes-
> > >MediaEncryption) {
> >
> >      //
> >      // Only allow psid revert if media encryption is enabled.
> 
> For the comments here:
>     //
>     // Only allow psid revert if media encryption is enabled.
>     // Otherwise, someone who steals a disk can psid revert the disk and the 
> user
> Data is still
>     // intact and accessible
>     //
> I think we'd better update it as well.
> 
> > @@ -657,6 +656,8 @@ OpalEndOfDxeEventNotify (
> >    @param[in]  Dev           The device which need Psid to process Psid 
> > Revert
> >                              OPAL request.
> >    @param[in]  PopUpString   Pop up string.
> > +  @param[in]  PopUpString2  Pop up string in line 2.
> > +
> >    @param[out] PressEsc      Whether user escape function through Press ESC.
> >
> >    @retval Psid string if success. NULL if failed.
> > @@ -666,6 +667,7 @@ CHAR8 *
> >  OpalDriverPopUpPsidInput (
> >    IN OPAL_DRIVER_DEVICE     *Dev,
> >    IN CHAR16                 *PopUpString,
> > +  IN CHAR16                 *PopUpString2,
> >    OUT BOOLEAN               *PressEsc
> >    )
> >  {
> > @@ -689,6 +691,7 @@ OpalDriverPopUpPsidInput (
> >        EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
> >        &InputKey,
> >        PopUpString,
> > +      PopUpString2,
> >        L"---------------------",
> >        Mask,
> >        NULL
> > @@ -1369,6 +1372,8 @@ ProcessOpalRequestPsidRevert (
> >    EFI_INPUT_KEY         Key;
> >    TCG_RESULT            Ret;
> >    CHAR16                *PopUpString;
> > +  CHAR16                *PopUpString2;
> > +  UINTN                 BufferSize;
> >
> >    if (Dev == NULL) {
> >      return;
> > @@ -1378,6 +1383,20 @@ ProcessOpalRequestPsidRevert (
> >
> >    PopUpString = OpalGetPopUpString (Dev, RequestString);
> >
> > +  if (Dev->OpalDisk.EstimateTimeCost >
> MAX_ACCEPTABLE_REVERTING_TIME)
> > {
> > +    BufferSize = StrSize (L"Warning: Revert action will take about
> > + ######
> > seconds, DO NOT power off system during the revert action!");
> 
> The 'BufferSize' seems not big enough to me.
> Per my understanding, the possible max timeout value can be:
> 65534 * 2 * 60 = 7864080 seconds
> 
> So using '######' to keep space for 6 digits maybe not enough. Some
> characters might get truncated.
> 
> > +    PopUpString2 = AllocateZeroPool (BufferSize);
> > +    ASSERT (PopUpString2 != NULL);
> > +    UnicodeSPrint (
> > +        PopUpString2,
> > +        BufferSize,
> > +        L"WARNING: Revert action will take about %d seconds, DO NOT
> > + power
> > off system during the revert action!",
> > +        Dev->OpalDisk.EstimateTimeCost
> > +      );
> > +  } else {
> > +    PopUpString2 = NULL;
> > +  }
> > +
> >    Count = 0;
> >
> >    ZeroMem(&Session, sizeof(Session)); @@ -1386,7 +1405,7 @@
> > ProcessOpalRequestPsidRevert (
> >    Session.OpalBaseComId = Dev->OpalDisk.OpalBaseComId;
> >
> >    while (Count < MAX_PSID_TRY_COUNT) {
> > -    Psid = OpalDriverPopUpPsidInput (Dev, PopUpString, &PressEsc);
> > +    Psid = OpalDriverPopUpPsidInput (Dev, PopUpString, PopUpString2,
> > &PressEsc);
> >      if (PressEsc) {
> >          do {
> >            CreatePopUp (
> > @@ -1400,7 +1419,7 @@ ProcessOpalRequestPsidRevert (
> >
> >          if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {
> >            gST->ConOut->ClearScreen(gST->ConOut);
> > -          return;
> > +          goto Done;
> >          } else {
> >            //
> >            // Let user input Psid again.
> > @@ -1456,6 +1475,11 @@ ProcessOpalRequestPsidRevert (
> >      } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);
> >      gST->ConOut->ClearScreen(gST->ConOut);
> >    }
> > +
> > +Done:
> > +  if (PopUpString2 != NULL) {
> > +    FreePool (PopUpString2);
> > +  }
> >  }
> >
> >  /**
> > @@ -1482,6 +1506,8 @@ ProcessOpalRequestRevert (
> >    TCG_RESULT            Ret;
> >    BOOLEAN               PasswordFailed;
> >    CHAR16                *PopUpString;
> > +  CHAR16                *PopUpString2;
> > +  UINTN                 BufferSize;
> >
> >    if (Dev == NULL) {
> >      return;
> > @@ -1491,6 +1517,20 @@ ProcessOpalRequestRevert (
> >
> >    PopUpString = OpalGetPopUpString (Dev, RequestString);
> >
> > +  if (Dev->OpalDisk.EstimateTimeCost >
> MAX_ACCEPTABLE_REVERTING_TIME)
> > {
> > +    BufferSize = StrSize (L"Warning: Revert action will take about
> > + ######
> > seconds, DO NOT power off system during the revert action!");
> 
> Similar comments as above.
> 
> Using '######' to keep space for 6 digits maybe not enough. Some characters
> might get truncated.
> 
> > +    PopUpString2 = AllocateZeroPool (BufferSize);
> > +    ASSERT (PopUpString2 != NULL);
> > +    UnicodeSPrint (
> > +        PopUpString2,
> > +        BufferSize,
> > +        L"WARNING: Revert action will take about %d seconds, DO NOT
> > + power
> > off system during the revert action!",
> > +        Dev->OpalDisk.EstimateTimeCost
> > +      );
> > +  } else {
> > +    PopUpString2 = NULL;
> > +  }
> > +
> >    Count = 0;
> >
> >    ZeroMem(&Session, sizeof(Session)); @@ -1499,7 +1539,7 @@
> > ProcessOpalRequestRevert (
> >    Session.OpalBaseComId = Dev->OpalDisk.OpalBaseComId;
> >
> >    while (Count < MAX_PASSWORD_TRY_COUNT) {
> > -    Password = OpalDriverPopUpPasswordInput (Dev, PopUpString, NULL,
> > &PressEsc);
> > +    Password = OpalDriverPopUpPasswordInput (Dev, PopUpString,
> > PopUpString2, &PressEsc);
> >      if (PressEsc) {
> >          do {
> >            CreatePopUp (
> > @@ -1513,7 +1553,7 @@ ProcessOpalRequestRevert (
> >
> >          if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {
> >            gST->ConOut->ClearScreen(gST->ConOut);
> > -          return;
> > +          goto Done;
> >          } else {
> >            //
> >            // Let user input password again.
> > @@ -1596,6 +1636,11 @@ ProcessOpalRequestRevert (
> >      } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);
> >      gST->ConOut->ClearScreen(gST->ConOut);
> >    }
> > +
> > +Done:
> > +  if (PopUpString2 != NULL) {
> > +    FreePool (PopUpString2);
> > +  }
> >  }
> >
> >  /**
> > @@ -2337,6 +2382,7 @@ ReadyToBootCallback (
> >          Session.MediaId = Itr->OpalDisk.MediaId;
> >          Session.OpalBaseComId = Itr->OpalDisk.OpalBaseComId;
> >
> > +        DEBUG ((DEBUG_INFO, "OpalPassword: ReadyToBoot point, send
> > BlockSid command to device!\n"));
> >          Result = OpalBlockSid (&Session, TRUE);  // HardwareReset
> > must always be TRUE
> >          if (Result != TcgResultSuccess) {
> >            DEBUG ((DEBUG_ERROR, "OpalBlockSid fail\n")); diff --git
> > a/SecurityPkg/Tcg/Opal/OpalPassword/OpalDriver.h
> > b/SecurityPkg/Tcg/Opal/OpalPassword/OpalDriver.h
> > index 2154523e93..2fe7ada29b 100644
> > --- a/SecurityPkg/Tcg/Opal/OpalPassword/OpalDriver.h
> > +++ b/SecurityPkg/Tcg/Opal/OpalPassword/OpalDriver.h
> > @@ -75,6 +75,13 @@ extern EFI_COMPONENT_NAME2_PROTOCOL
> > gOpalComponentName2;
> >  #define PSID_CHARACTER_LENGTH   0x20
> >  #define MAX_PSID_TRY_COUNT      5
> >
> > +//
> > +// The max timeout value assume the user can wait for the revert action.
> > +// If the revert time value bigger than this one, driver needs to
> > +popup a // dialog to let user confirm the revert action.
> > +//
> > +#define MAX_ACCEPTABLE_REVERTING_TIME    10
> 
> It would be better to state that the unit of this macro is second.
> 
> > +
> >  #pragma pack(1)
> >
> >  //
> > @@ -140,6 +147,8 @@ typedef struct {
> >    TCG_LOCKING_FEATURE_DESCRIPTOR                  LockingFeature;         
> > //
> > Locking Feature Descriptor retrieved from performing a Level 0 Discovery
> >    UINT8                                           PasswordLength;
> >    UINT8                                           
> > Password[OPAL_MAX_PASSWORD_SIZE];
> > +
> > +  UINT32                                          EstimateTimeCost;
> >  } OPAL_DISK;
> >
> >  //
> > diff --git a/SecurityPkg/Tcg/Opal/OpalPassword/OpalHii.c
> > b/SecurityPkg/Tcg/Opal/OpalPassword/OpalHii.c
> > index e4972227b6..479f413c07 100644
> > --- a/SecurityPkg/Tcg/Opal/OpalPassword/OpalHii.c
> > +++ b/SecurityPkg/Tcg/Opal/OpalPassword/OpalHii.c
> > @@ -13,6 +13,10 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF
> ANY KIND,
> > EITHER EXPRESS OR IMPLIED.
> >  **/
> >
> >  #include "OpalHii.h"
> > +//
> > +// Character definitions
> > +//
> > +#define UPPER_LOWER_CASE_OFFSET 0x20
> >
> >  //
> >  // This is the generated IFR binary Data for each formset defined in VFR.
> > @@ -520,6 +524,59 @@ GetDiskNameStringId(
> >    return 0;
> >  }
> >
> > +/**
> > +  Confirm whether user truly want to do the revert action.
> > +
> > +  @param     OpalDisk            The device which need to do the revert 
> > action.
> > +
> > +  @retval  EFI_SUCCESS           Confirmed user want to do the revert 
> > action.
> > +**/
> > +EFI_STATUS
> > +HiiConfirmRevertAction (
> > +  IN OPAL_DISK                  *OpalDisk
> > +
> > +  )
> > +{
> > +  CHAR16                        Unicode[512];
> > +  EFI_INPUT_KEY                 Key;
> > +  CHAR16                        ApproveResponse;
> > +  CHAR16                        RejectResponse;
> > +
> > +  //
> > +  // When the estimate cost time bigger than
> > MAX_ACCEPTABLE_REVERTING_TIME, pop up dialog to let user confirm
> > +  // the revert action.
> > +  //
> > +  if (OpalDisk->EstimateTimeCost < MAX_ACCEPTABLE_REVERTING_TIME) {
> > +    return EFI_SUCCESS;
> > +  }
> > +
> > +  ApproveResponse = L'Y';
> > +  RejectResponse  = L'N';
> > +
> > +  UnicodeSPrint(Unicode, StrSize(L"WARNING: Revert device needs about
> > ###### seconds"), L"WARNING: Revert device needs about %d seconds",
> > OpalDisk->EstimateTimeCost);
> 
> Again, using '######' to keep space for 6 digits maybe not enough. Some
> characters might get truncated.
> 
> Best Regards,
> Hao Wu
> 
> > +
> > +  do {
> > +    CreatePopUp(
> > +        EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
> > +        &Key,
> > +        Unicode,
> > +        L" System should not be powered off until revert completion ",
> > +        L" ",
> > +        L" Press 'Y/y' to continue, press 'N/n' to cancal ",
> > +        NULL
> > +    );
> > +  } while (
> > +      ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) !=
> > + (ApproveResponse
> > | UPPER_LOWER_CASE_OFFSET)) &&
> > +      ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) != (RejectResponse
> > + |
> > UPPER_LOWER_CASE_OFFSET))
> > +    );
> > +
> > +  if ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) == (RejectResponse
> > + |
> > UPPER_LOWER_CASE_OFFSET)) {
> > +    return EFI_ABORTED;
> > +  }
> > +
> > +  return EFI_SUCCESS;
> > +}
> > +
> >  /**
> >    This function processes the results of changes in configuration.
> >
> > @@ -588,6 +645,17 @@ DriverCallback(
> >      switch (HiiKeyId) {
> >        case HII_KEY_ID_GOTO_DISK_INFO:
> >          return HiiSelectDisk((UINT8)HiiKey.KeyBits.Index);
> > +
> > +      case HII_KEY_ID_REVERT:
> > +      case HII_KEY_ID_PSID_REVERT:
> > +        OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex);
> > +        if (OpalDisk != NULL) {
> > +          return HiiConfirmRevertAction (OpalDisk);
> > +        } else {
> > +          ASSERT (FALSE);
> > +          return EFI_SUCCESS;
> > +        }
> > +
> >      }
> >    } else if (Action == EFI_BROWSER_ACTION_CHANGED) {
> >      switch (HiiKeyId) {
> > @@ -1112,6 +1180,8 @@ OpalDiskInitialize (  {
> >    TCG_RESULT                  TcgResult;
> >    OPAL_SESSION                Session;
> > +  UINT8                       ActiveDataRemovalMechanism;
> > +  UINT32                      RemovalMechanishLists[ResearvedMechanism];
> >
> >    ZeroMem(&Dev->OpalDisk, sizeof(OPAL_DISK));
> >    Dev->OpalDisk.Sscp = Dev->Sscp;
> > @@ -1133,6 +1203,20 @@ OpalDiskInitialize (
> >      return EFI_DEVICE_ERROR;
> >    }
> >
> > +  if (Dev->OpalDisk.SupportedAttributes.DataRemoval) {
> > +    TcgResult = OpalUtilGetDataRemovalMechanismLists (&Session,
> > RemovalMechanishLists);
> > +    if (TcgResult != TcgResultSuccess) {
> > +      return EFI_DEVICE_ERROR;
> > +    }
> > +
> > +    TcgResult = OpalUtilGetActiveDataRemovalMechanism (&Session, Dev-
> > >OpalDisk.Msid, Dev->OpalDisk.MsidLength,
> > >&ActiveDataRemovalMechanism);
> > +    if (TcgResult != TcgResultSuccess) {
> > +      return EFI_DEVICE_ERROR;
> > +    }
> > +
> > +    Dev->OpalDisk.EstimateTimeCost =
> > RemovalMechanishLists[ActiveDataRemovalMechanism];
> > +  }
> > +
> >    return OpalDiskUpdateStatus (&Dev->OpalDisk);  }
> >
> > diff --git a/SecurityPkg/Tcg/Opal/OpalPassword/OpalPasswordPei.c
> > b/SecurityPkg/Tcg/Opal/OpalPassword/OpalPasswordPei.c
> > index b4b2d4b3f0..edb47ca8bc 100644
> > --- a/SecurityPkg/Tcg/Opal/OpalPassword/OpalPasswordPei.c
> > +++ b/SecurityPkg/Tcg/Opal/OpalPassword/OpalPasswordPei.c
> > @@ -635,6 +635,7 @@ UnlockOpalPassword (
> >      BlockSIDEnabled = FALSE;
> >    }
> >    if (BlockSIDEnabled && BlockSidSupport) {
> > +    DEBUG ((DEBUG_INFO, "OpalPassword: S3 phase send BlockSid command
> > to device!\n"));
> >      ZeroMem(&Session, sizeof (Session));
> >      Session.Sscp = &OpalDev->Sscp;
> >      Session.MediaId = 0;
> > --
> > 2.15.0.windows.1

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to