REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737 Apply uncrustify changes to .c/.h files in the SecurityPkg package Cc: Andrew Fish <afish@apple.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Reviewed-by: Jian J Wang <jian.j.wang@intel.com>
		
			
				
	
	
		
			1138 lines
		
	
	
		
			32 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			1138 lines
		
	
	
		
			32 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Public API for Opal Core library.
 | |
| 
 | |
| Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
 | |
| SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| 
 | |
| **/
 | |
| #include <Uefi.h>
 | |
| #include <Library/BaseLib.h>
 | |
| #include <Library/DebugLib.h>
 | |
| #include <Library/TcgStorageOpalLib.h>
 | |
| #include "TcgStorageOpalLibInternal.h"
 | |
| 
 | |
| #define OPAL_MSID_LENGTH  128
 | |
| 
 | |
| /**
 | |
|   Creates a session with OPAL_UID_ADMIN_SP as OPAL_ADMIN_SP_PSID_AUTHORITY, then reverts device using Admin SP Revert method.
 | |
| 
 | |
|   @param[in]      Session,           The session info for one opal device.
 | |
|   @param[in]      Psid               PSID of device to revert.
 | |
|   @param[in]      PsidLength         Length of PSID in bytes.
 | |
| 
 | |
| **/
 | |
| TCG_RESULT
 | |
| EFIAPI
 | |
| OpalUtilPsidRevert (
 | |
|   OPAL_SESSION  *Session,
 | |
|   const VOID    *Psid,
 | |
|   UINT32        PsidLength
 | |
|   )
 | |
| {
 | |
|   UINT8       MethodStatus;
 | |
|   TCG_RESULT  Ret;
 | |
|   UINT32      RemovalTimeOut;
 | |
| 
 | |
|   NULL_CHECK (Session);
 | |
|   NULL_CHECK (Psid);
 | |
| 
 | |
|   RemovalTimeOut = GetRevertTimeOut (Session);
 | |
|   DEBUG ((DEBUG_INFO, "OpalUtilPsidRevert: Timeout value = %d\n", RemovalTimeOut));
 | |
| 
 | |
|   Ret = OpalStartSession (
 | |
|           Session,
 | |
|           OPAL_UID_ADMIN_SP,
 | |
|           TRUE,
 | |
|           PsidLength,
 | |
|           Psid,
 | |
|           OPAL_ADMIN_SP_PSID_AUTHORITY,
 | |
|           &MethodStatus
 | |
|           );
 | |
|   if ((Ret == TcgResultSuccess) && (MethodStatus == TCG_METHOD_STATUS_CODE_SUCCESS)) {
 | |
|     Ret = OpalPyrite2PsidRevert (Session, RemovalTimeOut);
 | |
|     if (Ret != TcgResultSuccess) {
 | |
|       //
 | |
|       // If revert was successful, session was already ended by TPer, so only end session on failure
 | |
|       //
 | |
|       OpalEndSession (Session);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   if (MethodStatus != TCG_METHOD_STATUS_CODE_SUCCESS) {
 | |
|     Ret = TcgResultFailure;
 | |
|   }
 | |
| 
 | |
|   return Ret;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Opens a session with OPAL_UID_ADMIN_SP as OPAL_ADMIN_SP_SID_AUTHORITY,
 | |
|   sets the OPAL_UID_ADMIN_SP_C_PIN_SID column with the new password,
 | |
|   and activates the locking SP to copy SID PIN to Admin1 Locking SP PIN
 | |
| 
 | |
|   @param[in]      Session,           The session info for one opal device.
 | |
|   @param[in]      GeneratedSid       Generated SID of disk
 | |
|   @param[in]      SidLength          Length of generatedSid in bytes
 | |
|   @param[in]      Password           New admin password to set
 | |
|   @param[in]      PassLength         Length of password in bytes
 | |
| 
 | |
| **/
 | |
| TCG_RESULT
 | |
| EFIAPI
 | |
| OpalUtilSetAdminPasswordAsSid (
 | |
|   OPAL_SESSION  *Session,
 | |
|   const VOID    *GeneratedSid,
 | |
|   UINT32        SidLength,
 | |
|   const VOID    *Password,
 | |
|   UINT32        PassLength
 | |
|   )
 | |
| {
 | |
|   UINT8       MethodStatus;
 | |
|   TCG_RESULT  Ret;
 | |
| 
 | |
|   NULL_CHECK (Session);
 | |
|   NULL_CHECK (GeneratedSid);
 | |
|   NULL_CHECK (Password);
 | |
| 
 | |
|   Ret = OpalStartSession (
 | |
|           Session,
 | |
|           OPAL_UID_ADMIN_SP,
 | |
|           TRUE,
 | |
|           SidLength,
 | |
|           GeneratedSid,
 | |
|           OPAL_ADMIN_SP_SID_AUTHORITY,
 | |
|           &MethodStatus
 | |
|           );
 | |
|   if ((Ret != TcgResultSuccess) || (MethodStatus != TCG_METHOD_STATUS_CODE_SUCCESS)) {
 | |
|     DEBUG ((DEBUG_INFO, "start session with admin SP as SID authority failed: Ret=%d MethodStatus=%u\n", Ret, MethodStatus));
 | |
|     goto done;
 | |
|   }
 | |
| 
 | |
|   //
 | |
|   // 1. Update SID = new Password
 | |
|   //
 | |
|   Ret = OpalSetPassword (
 | |
|           Session,
 | |
|           OPAL_UID_ADMIN_SP_C_PIN_SID,
 | |
|           Password,
 | |
|           PassLength,
 | |
|           &MethodStatus
 | |
|           );
 | |
| 
 | |
|   if ((Ret != TcgResultSuccess) || (MethodStatus != TCG_METHOD_STATUS_CODE_SUCCESS)) {
 | |
|     OpalEndSession (Session);
 | |
|     DEBUG ((DEBUG_INFO, "set Password failed: Ret=%d MethodStatus=%u\n", Ret, MethodStatus));
 | |
|     goto done;
 | |
|   }
 | |
| 
 | |
|   //
 | |
|   // 2. Activate locking SP
 | |
|   //
 | |
|   Ret = OpalActivateLockingSp (Session, &MethodStatus);
 | |
|   OpalEndSession (Session);
 | |
|   if ((Ret != TcgResultSuccess) || (MethodStatus != TCG_METHOD_STATUS_CODE_SUCCESS)) {
 | |
|     DEBUG ((DEBUG_INFO, "activate locking SP failed: Ret=%d MethodStatus=%u\n", Ret, MethodStatus));
 | |
|     goto done;
 | |
|   }
 | |
| 
 | |
| done:
 | |
|   if (MethodStatus != TCG_METHOD_STATUS_CODE_SUCCESS) {
 | |
|     Ret = TcgResultFailure;
 | |
|   }
 | |
| 
 | |
|   return Ret;
 | |
| }
 | |
| 
 | |
| /**
 | |
| 
 | |
|   Opens a session with OPAL_UID_LOCKING_SP as OPAL_LOCKING_SP_ADMIN1_AUTHORITY,
 | |
|   and updates the specified locking range with the provided column values
 | |
| 
 | |
|   @param[in]      Session,               The session info for one opal device.
 | |
|   @param[in]      Password           New admin password to set
 | |
|   @param[in]      PassLength         Length of password in bytes
 | |
|   @param[in]      LockingRangeUid    Locking range UID to set values
 | |
|   @param[in]      RangeStart         Value to set RangeStart column for Locking Range
 | |
|   @param[in]      RangeLength        Value to set RangeLength column for Locking Range
 | |
|   @param[in]      ReadLockEnabled    Value to set readLockEnabled column for Locking Range
 | |
|   @param[in]      WriteLockEnabled   Value to set writeLockEnabled column for Locking Range
 | |
|   @param[in]      ReadLocked         Value to set ReadLocked column for Locking Range
 | |
|   @param[in]      WriteLocked        Value to set WriteLocked column for Locking Range
 | |
| 
 | |
| **/
 | |
| TCG_RESULT
 | |
| EFIAPI
 | |
| OpalUtilSetOpalLockingRange (
 | |
|   OPAL_SESSION  *Session,
 | |
|   const VOID    *Password,
 | |
|   UINT32        PassLength,
 | |
|   TCG_UID       LockingRangeUid,
 | |
|   UINT64        RangeStart,
 | |
|   UINT64        RangeLength,
 | |
|   BOOLEAN       ReadLockEnabled,
 | |
|   BOOLEAN       WriteLockEnabled,
 | |
|   BOOLEAN       ReadLocked,
 | |
|   BOOLEAN       WriteLocked
 | |
|   )
 | |
| {
 | |
|   UINT8       MethodStatus;
 | |
|   TCG_RESULT  Ret;
 | |
| 
 | |
|   NULL_CHECK (Session);
 | |
|   NULL_CHECK (Password);
 | |
| 
 | |
|   //
 | |
|   // Start session with Locking SP using current admin Password
 | |
|   //
 | |
|   Ret = OpalStartSession (
 | |
|           Session,
 | |
|           OPAL_UID_LOCKING_SP,
 | |
|           TRUE,
 | |
|           PassLength,
 | |
|           Password,
 | |
|           OPAL_LOCKING_SP_ADMIN1_AUTHORITY,
 | |
|           &MethodStatus
 | |
|           );
 | |
|   if ((Ret != TcgResultSuccess) || (MethodStatus != TCG_METHOD_STATUS_CODE_SUCCESS)) {
 | |
|     DEBUG ((DEBUG_INFO, "start session with locking SP failed: Ret=%d MethodStatus=%u\n", Ret, MethodStatus));
 | |
|     goto done;
 | |
|   }
 | |
| 
 | |
|   //
 | |
|   // Enable locking range
 | |
|   //
 | |
|   Ret = OpalSetLockingRange (
 | |
|           Session,
 | |
|           LockingRangeUid,
 | |
|           RangeStart,
 | |
|           RangeLength,
 | |
|           ReadLockEnabled,
 | |
|           WriteLockEnabled,
 | |
|           ReadLocked,
 | |
|           WriteLocked,
 | |
|           &MethodStatus
 | |
|           );
 | |
| 
 | |
|   OpalEndSession (Session);
 | |
|   if ((Ret != TcgResultSuccess) || (MethodStatus != TCG_METHOD_STATUS_CODE_SUCCESS)) {
 | |
|     DEBUG ((DEBUG_INFO, "set locking range failed: Ret=%d MethodStatus=0x%x\n", Ret, MethodStatus));
 | |
|   }
 | |
| 
 | |
| done:
 | |
|   if (MethodStatus != TCG_METHOD_STATUS_CODE_SUCCESS) {
 | |
|     Ret = TcgResultFailure;
 | |
|   }
 | |
| 
 | |
|   return Ret;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Opens a session with OPAL_UID_ADMIN_SP as OPAL_ADMIN_SP_SID_AUTHORITY,
 | |
|   sets OPAL_UID_ADMIN_SP_C_PIN_SID with the new password,
 | |
|   and sets OPAL_LOCKING_SP_C_PIN_ADMIN1 with the new password.
 | |
| 
 | |
|   @param[in]      Session,               The session info for one opal device.
 | |
|   @param[in]      OldPassword        Current admin password
 | |
|   @param[in]      OldPasswordLength  Length of current admin password in bytes
 | |
|   @param[in]      NewPassword        New admin password to set
 | |
|   @param[in]      NewPasswordLength  Length of new password in bytes
 | |
| 
 | |
| **/
 | |
| TCG_RESULT
 | |
| EFIAPI
 | |
| OpalUtilSetAdminPassword (
 | |
|   OPAL_SESSION  *Session,
 | |
|   const VOID    *OldPassword,
 | |
|   UINT32        OldPasswordLength,
 | |
|   const VOID    *NewPassword,
 | |
|   UINT32        NewPasswordLength
 | |
|   )
 | |
| {
 | |
|   TCG_RESULT  Ret;
 | |
|   UINT8       MethodStatus;
 | |
| 
 | |
|   NULL_CHECK (Session);
 | |
|   NULL_CHECK (OldPassword);
 | |
|   NULL_CHECK (NewPassword);
 | |
| 
 | |
|   //
 | |
|   // Unknown ownership
 | |
|   //
 | |
|   Ret = OpalStartSession (
 | |
|           Session,
 | |
|           OPAL_UID_ADMIN_SP,
 | |
|           TRUE,
 | |
|           OldPasswordLength,
 | |
|           OldPassword,
 | |
|           OPAL_ADMIN_SP_SID_AUTHORITY,
 | |
|           &MethodStatus
 | |
|           );
 | |
|   if ((Ret != TcgResultSuccess) || (MethodStatus != TCG_METHOD_STATUS_CODE_SUCCESS)) {
 | |
|     DEBUG ((DEBUG_INFO, "start session with admin SP using old Password failed\n"));
 | |
|     goto done;
 | |
|   }
 | |
| 
 | |
|   //
 | |
|   // Update SID = new pw
 | |
|   //
 | |
|   Ret = OpalSetPassword (Session, OPAL_UID_ADMIN_SP_C_PIN_SID, NewPassword, NewPasswordLength, &MethodStatus);
 | |
|   OpalEndSession (Session);
 | |
|   if ((Ret != TcgResultSuccess) || (MethodStatus != TCG_METHOD_STATUS_CODE_SUCCESS)) {
 | |
|     DEBUG ((DEBUG_INFO, "set new admin SP Password failed\n"));
 | |
|     goto done;
 | |
|   }
 | |
| 
 | |
|   Ret = OpalStartSession (
 | |
|           Session,
 | |
|           OPAL_UID_LOCKING_SP,
 | |
|           TRUE,
 | |
|           OldPasswordLength,
 | |
|           OldPassword,
 | |
|           OPAL_LOCKING_SP_ADMIN1_AUTHORITY,
 | |
|           &MethodStatus
 | |
|           );
 | |
|   if ((Ret != TcgResultSuccess) || (MethodStatus != TCG_METHOD_STATUS_CODE_SUCCESS)) {
 | |
|     DEBUG ((DEBUG_INFO, "start session with locking SP using old Password failed\n"));
 | |
|     goto done;
 | |
|   }
 | |
| 
 | |
|   //
 | |
|   // Update admin locking SP to new pw
 | |
|   //
 | |
|   Ret = OpalSetPassword (Session, OPAL_LOCKING_SP_C_PIN_ADMIN1, NewPassword, NewPasswordLength, &MethodStatus);
 | |
|   OpalEndSession (Session);
 | |
|   if ((Ret != TcgResultSuccess) || (MethodStatus != TCG_METHOD_STATUS_CODE_SUCCESS)) {
 | |
|     DEBUG ((DEBUG_INFO, "set new locking SP Password failed\n"));
 | |
|     goto done;
 | |
|   }
 | |
| 
 | |
| done:
 | |
|   if (MethodStatus != TCG_METHOD_STATUS_CODE_SUCCESS) {
 | |
|     Ret = TcgResultFailure;
 | |
|   }
 | |
| 
 | |
|   return Ret;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Starts a session with OPAL_UID_LOCKING_SP as OPAL_LOCKING_SP_USER1_AUTHORITY or OPAL_LOCKING_SP_ADMIN1_AUTHORITY
 | |
|   and sets the User1 SP authority to enabled and sets the User1 password.
 | |
| 
 | |
|   @param[in]      Session,               The session info for one opal device.
 | |
|   @param[in]      OldPassword        Current admin password
 | |
|   @param[in]      OldPasswordLength  Length of current admin password in bytes
 | |
|   @param[in]      NewPassword        New admin password to set
 | |
|   @param[in]      NewPasswordLength  Length of new password in bytes
 | |
| 
 | |
| **/
 | |
| TCG_RESULT
 | |
| EFIAPI
 | |
| OpalUtilSetUserPassword (
 | |
|   OPAL_SESSION  *Session,
 | |
|   const VOID    *OldPassword,
 | |
|   UINT32        OldPasswordLength,
 | |
|   const VOID    *NewPassword,
 | |
|   UINT32        NewPasswordLength
 | |
|   )
 | |
| {
 | |
|   UINT8       MethodStatus;
 | |
|   TCG_RESULT  Ret;
 | |
| 
 | |
|   NULL_CHECK (Session);
 | |
|   NULL_CHECK (OldPassword);
 | |
|   NULL_CHECK (NewPassword);
 | |
| 
 | |
|   //
 | |
|   // See if updating user1 authority
 | |
|   //
 | |
|   Ret = OpalStartSession (
 | |
|           Session,
 | |
|           OPAL_UID_LOCKING_SP,
 | |
|           TRUE,
 | |
|           OldPasswordLength,
 | |
|           OldPassword,
 | |
|           OPAL_LOCKING_SP_USER1_AUTHORITY,
 | |
|           &MethodStatus
 | |
|           );
 | |
|   if ((Ret == TcgResultSuccess) && (MethodStatus == TCG_METHOD_STATUS_CODE_SUCCESS)) {
 | |
|     Ret = OpalSetPassword (
 | |
|             Session,
 | |
|             OPAL_LOCKING_SP_C_PIN_USER1,
 | |
|             NewPassword,
 | |
|             NewPasswordLength,
 | |
|             &MethodStatus
 | |
|             );
 | |
|     OpalEndSession (Session);
 | |
|     if ((Ret == TcgResultSuccess) && (MethodStatus == TCG_METHOD_STATUS_CODE_SUCCESS)) {
 | |
|       return Ret;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   //
 | |
|   // Setting Password for first time or setting Password as admin
 | |
|   //
 | |
| 
 | |
|   //
 | |
|   // Start session with Locking SP using current admin Password
 | |
|   //
 | |
|   Ret = OpalStartSession (
 | |
|           Session,
 | |
|           OPAL_UID_LOCKING_SP,
 | |
|           TRUE,
 | |
|           OldPasswordLength,
 | |
|           OldPassword,
 | |
|           OPAL_LOCKING_SP_ADMIN1_AUTHORITY,
 | |
|           &MethodStatus
 | |
|           );
 | |
|   if ((Ret != TcgResultSuccess) || (MethodStatus != TCG_METHOD_STATUS_CODE_SUCCESS)) {
 | |
|     DEBUG ((DEBUG_INFO, "StartSession with locking SP as admin1 authority failed\n"));
 | |
|     goto done;
 | |
|   }
 | |
| 
 | |
|   //
 | |
|   // Enable User1 and set its PIN
 | |
|   //
 | |
|   Ret = OpalSetLockingSpAuthorityEnabledAndPin (
 | |
|           Session,
 | |
|           OPAL_LOCKING_SP_C_PIN_USER1,
 | |
|           OPAL_LOCKING_SP_USER1_AUTHORITY,
 | |
|           NewPassword,
 | |
|           NewPasswordLength,
 | |
|           &MethodStatus
 | |
|           );
 | |
|   OpalEndSession (Session);
 | |
|   if ((Ret != TcgResultSuccess) || (MethodStatus != TCG_METHOD_STATUS_CODE_SUCCESS)) {
 | |
|     DEBUG ((DEBUG_INFO, "OpalSetLockingSpAuthorityEnabledAndPin failed\n"));
 | |
|     goto done;
 | |
|   }
 | |
| 
 | |
| done:
 | |
|   if (MethodStatus != TCG_METHOD_STATUS_CODE_SUCCESS) {
 | |
|     Ret = TcgResultFailure;
 | |
|   }
 | |
| 
 | |
|   return Ret;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Verify whether user input the correct password.
 | |
| 
 | |
|   @param[in]      Session,               The session info for one opal device.
 | |
|   @param[in]      Password                    Admin password
 | |
|   @param[in]      PasswordLength              Length of password in bytes
 | |
|   @param[in/out]  HostSigningAuthority        Use the Host signing authority type.
 | |
| 
 | |
| **/
 | |
| TCG_RESULT
 | |
| EFIAPI
 | |
| OpalUtilVerifyPassword (
 | |
|   OPAL_SESSION  *Session,
 | |
|   const VOID    *Password,
 | |
|   UINT32        PasswordLength,
 | |
|   TCG_UID       HostSigningAuthority
 | |
|   )
 | |
| {
 | |
|   TCG_RESULT  Ret;
 | |
|   UINT8       MethodStatus;
 | |
| 
 | |
|   NULL_CHECK (Session);
 | |
|   NULL_CHECK (Password);
 | |
| 
 | |
|   Ret = OpalStartSession (
 | |
|           Session,
 | |
|           OPAL_UID_LOCKING_SP,
 | |
|           TRUE,
 | |
|           PasswordLength,
 | |
|           Password,
 | |
|           HostSigningAuthority,
 | |
|           &MethodStatus
 | |
|           );
 | |
|   if ((Ret == TcgResultSuccess) && (MethodStatus == TCG_METHOD_STATUS_CODE_SUCCESS)) {
 | |
|     OpalEndSession (Session);
 | |
|     return TcgResultSuccess;
 | |
|   }
 | |
| 
 | |
|   return TcgResultFailure;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Starts a session with OPAL_UID_LOCKING_SP as OPAL_LOCKING_SP_USER1_AUTHORITY or OPAL_LOCKING_SP_ADMIN1_AUTHORITY
 | |
|   and generates a new global locking range key to erase the Data.
 | |
| 
 | |
|   @param[in]      Session,               The session info for one opal device.
 | |
|   @param[in]      Password                   Admin or user password
 | |
|   @param[in]      PasswordLength         Length of password in bytes
 | |
|   @param[in/out]  PasswordFailed       indicates if password failed (start session didn't work)
 | |
| 
 | |
| **/
 | |
| TCG_RESULT
 | |
| EFIAPI
 | |
| OpalUtilSecureErase (
 | |
|   OPAL_SESSION  *Session,
 | |
|   const VOID    *Password,
 | |
|   UINT32        PasswordLength,
 | |
|   BOOLEAN       *PasswordFailed
 | |
|   )
 | |
| {
 | |
|   UINT8       MethodStatus;
 | |
|   TCG_RESULT  Ret;
 | |
| 
 | |
|   NULL_CHECK (Session);
 | |
|   NULL_CHECK (Password);
 | |
|   NULL_CHECK (PasswordFailed);
 | |
| 
 | |
|   //
 | |
|   // Try to generate a new key with admin1
 | |
|   //
 | |
|   Ret = OpalStartSession (
 | |
|           Session,
 | |
|           OPAL_UID_LOCKING_SP,
 | |
|           TRUE,
 | |
|           PasswordLength,
 | |
|           Password,
 | |
|           OPAL_LOCKING_SP_ADMIN1_AUTHORITY,
 | |
|           &MethodStatus
 | |
|           );
 | |
| 
 | |
|   if ((Ret == TcgResultSuccess) && (MethodStatus == TCG_METHOD_STATUS_CODE_SUCCESS)) {
 | |
|     Ret             = OpalGlobalLockingRangeGenKey (Session, &MethodStatus);
 | |
|     *PasswordFailed = FALSE;
 | |
|     OpalEndSession (Session);
 | |
|   } else {
 | |
|     //
 | |
|     // Try to generate a new key with user1
 | |
|     //
 | |
|     Ret = OpalStartSession (
 | |
|             Session,
 | |
|             OPAL_UID_LOCKING_SP,
 | |
|             TRUE,
 | |
|             PasswordLength,
 | |
|             Password,
 | |
|             OPAL_LOCKING_SP_USER1_AUTHORITY,
 | |
|             &MethodStatus
 | |
|             );
 | |
| 
 | |
|     if ((Ret == TcgResultSuccess) && (MethodStatus == TCG_METHOD_STATUS_CODE_SUCCESS)) {
 | |
|       Ret             = OpalGlobalLockingRangeGenKey (Session, &MethodStatus);
 | |
|       *PasswordFailed = FALSE;
 | |
|       OpalEndSession (Session);
 | |
|     } else {
 | |
|       *PasswordFailed = TRUE;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   if (MethodStatus != TCG_METHOD_STATUS_CODE_SUCCESS) {
 | |
|     Ret = TcgResultFailure;
 | |
|   }
 | |
| 
 | |
|   return Ret;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Starts a session with OPAL_UID_LOCKING_SP as OPAL_LOCKING_SP_ADMIN1_AUTHORITY and disables the User1 authority.
 | |
| 
 | |
|   @param[in]      Session,               The session info for one opal device.
 | |
|   @param[in]      Password               Admin password
 | |
|   @param[in]      PasswordLength         Length of password in bytes
 | |
|   @param[in/out]  PasswordFailed         indicates if password failed (start session didn't work)
 | |
| 
 | |
| **/
 | |
| TCG_RESULT
 | |
| EFIAPI
 | |
| OpalUtilDisableUser (
 | |
|   OPAL_SESSION  *Session,
 | |
|   const VOID    *Password,
 | |
|   UINT32        PasswordLength,
 | |
|   BOOLEAN       *PasswordFailed
 | |
|   )
 | |
| {
 | |
|   UINT8       MethodStatus;
 | |
|   TCG_RESULT  Ret;
 | |
| 
 | |
|   NULL_CHECK (Session);
 | |
|   NULL_CHECK (Password);
 | |
|   NULL_CHECK (PasswordFailed);
 | |
| 
 | |
|   //
 | |
|   // Start session with Locking SP using current admin Password
 | |
|   //
 | |
|   Ret = OpalStartSession (
 | |
|           Session,
 | |
|           OPAL_UID_LOCKING_SP,
 | |
|           TRUE,
 | |
|           PasswordLength,
 | |
|           Password,
 | |
|           OPAL_LOCKING_SP_ADMIN1_AUTHORITY,
 | |
|           &MethodStatus
 | |
|           );
 | |
|   if ((Ret != TcgResultSuccess) || (MethodStatus != TCG_METHOD_STATUS_CODE_SUCCESS)) {
 | |
|     DEBUG ((DEBUG_INFO, "StartSession with Locking SP as Admin1 failed\n"));
 | |
|     *PasswordFailed = TRUE;
 | |
|     goto done;
 | |
|   }
 | |
| 
 | |
|   *PasswordFailed = FALSE;
 | |
|   Ret             = OpalDisableUser (Session, &MethodStatus);
 | |
|   OpalEndSession (Session);
 | |
| 
 | |
| done:
 | |
|   if (MethodStatus != TCG_METHOD_STATUS_CODE_SUCCESS) {
 | |
|     Ret = TcgResultFailure;
 | |
|   }
 | |
| 
 | |
|   return Ret;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Opens a session with OPAL_UID_ADMIN_SP as OPAL_ADMIN_SP_PSID_AUTHORITY, then reverts the device using the RevertSP method.
 | |
| 
 | |
|   @param[in]      Session,           The session info for one opal device.
 | |
|   @param[in]      KeepUserData       TRUE to keep existing Data on the disk, or FALSE to erase it
 | |
|   @param[in]      Password           Admin password
 | |
|   @param[in]      PasswordLength     Length of password in bytes
 | |
|   @param[in/out]  PasswordFailed     indicates if password failed (start session didn't work)
 | |
|   @param[in]      Msid               Msid info.
 | |
|   @param[in]      MsidLength         Msid data length.
 | |
| 
 | |
| **/
 | |
| TCG_RESULT
 | |
| EFIAPI
 | |
| OpalUtilRevert (
 | |
|   OPAL_SESSION  *Session,
 | |
|   BOOLEAN       KeepUserData,
 | |
|   const VOID    *Password,
 | |
|   UINT32        PasswordLength,
 | |
|   BOOLEAN       *PasswordFailed,
 | |
|   UINT8         *Msid,
 | |
|   UINT32        MsidLength
 | |
|   )
 | |
| {
 | |
|   UINT8       MethodStatus;
 | |
|   TCG_RESULT  Ret;
 | |
|   UINT32      RemovalTimeOut;
 | |
| 
 | |
|   NULL_CHECK (Session);
 | |
|   NULL_CHECK (Msid);
 | |
|   NULL_CHECK (Password);
 | |
|   NULL_CHECK (PasswordFailed);
 | |
| 
 | |
|   RemovalTimeOut = GetRevertTimeOut (Session);
 | |
|   DEBUG ((DEBUG_INFO, "OpalUtilRevert: Timeout value = %d\n", RemovalTimeOut));
 | |
| 
 | |
|   Ret = OpalStartSession (
 | |
|           Session,
 | |
|           OPAL_UID_LOCKING_SP,
 | |
|           TRUE,
 | |
|           PasswordLength,
 | |
|           Password,
 | |
|           OPAL_LOCKING_SP_ADMIN1_AUTHORITY,
 | |
|           &MethodStatus
 | |
|           );
 | |
| 
 | |
|   if ((Ret != TcgResultSuccess) || (MethodStatus != TCG_METHOD_STATUS_CODE_SUCCESS)) {
 | |
|     DEBUG ((DEBUG_INFO, "error starting session: Ret=%d, MethodStatus=%u\n", Ret, MethodStatus));
 | |
|     *PasswordFailed = TRUE;
 | |
|     goto done;
 | |
|   }
 | |
| 
 | |
|   *PasswordFailed = FALSE;
 | |
|   //
 | |
|   // Try to revert with admin1
 | |
|   //
 | |
|   Ret = OpalPyrite2AdminRevert (Session, KeepUserData, &MethodStatus, RemovalTimeOut);
 | |
|   if ((Ret != TcgResultSuccess) || (MethodStatus != TCG_METHOD_STATUS_CODE_SUCCESS)) {
 | |
|     //
 | |
|     // Device ends the session on successful revert, so only call OpalEndSession when fail.
 | |
|     //
 | |
|     DEBUG ((DEBUG_INFO, "OpalAdminRevert as admin failed\n"));
 | |
|     OpalEndSession (Session);
 | |
|   }
 | |
| 
 | |
|   Ret = OpalUtilSetSIDtoMSID (Session, Password, PasswordLength, Msid, MsidLength);
 | |
| 
 | |
| done:
 | |
|   if (MethodStatus != TCG_METHOD_STATUS_CODE_SUCCESS) {
 | |
|     Ret = TcgResultFailure;
 | |
|   }
 | |
| 
 | |
|   return Ret;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   After revert success, set SID to MSID.
 | |
| 
 | |
|   @param          Session,           The session info for one opal device.
 | |
|   @param          Password,          Input password info.
 | |
|   @param          PasswordLength,    Input password length.
 | |
|   @param          Msid               Msid info.
 | |
|   @param          MsidLength         Msid data length.
 | |
| 
 | |
| **/
 | |
| TCG_RESULT
 | |
| EFIAPI
 | |
| OpalUtilSetSIDtoMSID (
 | |
|   OPAL_SESSION  *Session,
 | |
|   const VOID    *Password,
 | |
|   UINT32        PasswordLength,
 | |
|   UINT8         *Msid,
 | |
|   UINT32        MsidLength
 | |
|   )
 | |
| {
 | |
|   TCG_RESULT  Ret;
 | |
|   UINT8       MethodStatus;
 | |
| 
 | |
|   NULL_CHECK (Session);
 | |
|   NULL_CHECK (Msid);
 | |
|   NULL_CHECK (Password);
 | |
| 
 | |
|   //
 | |
|   // Start session with admin sp to update SID to MSID
 | |
|   //
 | |
|   Ret = OpalStartSession (
 | |
|           Session,
 | |
|           OPAL_UID_ADMIN_SP,
 | |
|           TRUE,
 | |
|           PasswordLength,
 | |
|           Password,
 | |
|           OPAL_ADMIN_SP_SID_AUTHORITY,
 | |
|           &MethodStatus
 | |
|           );
 | |
|   if ((Ret != TcgResultSuccess) || (MethodStatus != TCG_METHOD_STATUS_CODE_SUCCESS)) {
 | |
|     goto done;
 | |
|   }
 | |
| 
 | |
|   //
 | |
|   // Update SID pin
 | |
|   //
 | |
|   Ret = OpalSetPassword (Session, OPAL_UID_ADMIN_SP_C_PIN_SID, Msid, MsidLength, &MethodStatus);
 | |
|   OpalEndSession (Session);
 | |
| 
 | |
| done:
 | |
|   if (MethodStatus != TCG_METHOD_STATUS_CODE_SUCCESS) {
 | |
|     Ret = TcgResultFailure;
 | |
|   }
 | |
| 
 | |
|   return Ret;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Update global locking range.
 | |
| 
 | |
|   @param          Session,           The session info for one opal device.
 | |
|   @param          Password,          Input password info.
 | |
|   @param          PasswordLength,    Input password length.
 | |
|   @param          ReadLocked,        Read lock info.
 | |
|   @param          WriteLocked        write lock info.
 | |
| 
 | |
| **/
 | |
| TCG_RESULT
 | |
| EFIAPI
 | |
| OpalUtilUpdateGlobalLockingRange (
 | |
|   OPAL_SESSION  *Session,
 | |
|   const VOID    *Password,
 | |
|   UINT32        PasswordLength,
 | |
|   BOOLEAN       ReadLocked,
 | |
|   BOOLEAN       WriteLocked
 | |
|   )
 | |
| {
 | |
|   UINT8       MethodStatus;
 | |
|   TCG_RESULT  Ret;
 | |
| 
 | |
|   NULL_CHECK (Session);
 | |
|   NULL_CHECK (Password);
 | |
| 
 | |
|   //
 | |
|   // Try to start session with Locking SP as admin1 authority
 | |
|   //
 | |
|   Ret = OpalStartSession (
 | |
|           Session,
 | |
|           OPAL_UID_LOCKING_SP,
 | |
|           TRUE,
 | |
|           PasswordLength,
 | |
|           Password,
 | |
|           OPAL_LOCKING_SP_ADMIN1_AUTHORITY,
 | |
|           &MethodStatus
 | |
|           );
 | |
|   if ((Ret == TcgResultSuccess) && (MethodStatus == TCG_METHOD_STATUS_CODE_SUCCESS)) {
 | |
|     Ret = OpalUpdateGlobalLockingRange (
 | |
|             Session,
 | |
|             ReadLocked,
 | |
|             WriteLocked,
 | |
|             &MethodStatus
 | |
|             );
 | |
|     OpalEndSession (Session);
 | |
|     if ((Ret == TcgResultSuccess) && (MethodStatus == TCG_METHOD_STATUS_CODE_SUCCESS)) {
 | |
|       goto done;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   if (MethodStatus == TCG_METHOD_STATUS_CODE_AUTHORITY_LOCKED_OUT) {
 | |
|     DEBUG ((DEBUG_INFO, "unlock as admin failed with AUTHORITY_LOCKED_OUT\n"));
 | |
|   }
 | |
| 
 | |
|   //
 | |
|   // Try user1 authority
 | |
|   //
 | |
|   Ret = OpalStartSession (
 | |
|           Session,
 | |
|           OPAL_UID_LOCKING_SP,
 | |
|           TRUE,
 | |
|           PasswordLength,
 | |
|           Password,
 | |
|           OPAL_LOCKING_SP_USER1_AUTHORITY,
 | |
|           &MethodStatus
 | |
|           );
 | |
|   if ((Ret != TcgResultSuccess) || (MethodStatus != TCG_METHOD_STATUS_CODE_SUCCESS)) {
 | |
|     DEBUG ((DEBUG_INFO, "StartSession with Locking SP as User1 failed\n"));
 | |
|     goto done;
 | |
|   }
 | |
| 
 | |
|   Ret = OpalUpdateGlobalLockingRange (Session, ReadLocked, WriteLocked, &MethodStatus);
 | |
|   OpalEndSession (Session);
 | |
| 
 | |
| done:
 | |
|   if (MethodStatus != TCG_METHOD_STATUS_CODE_SUCCESS) {
 | |
|     if (MethodStatus == TCG_METHOD_STATUS_CODE_AUTHORITY_LOCKED_OUT) {
 | |
|       //
 | |
|       // Caller need to know this special error, but return status not has type for it.
 | |
|       // so here use TcgResultFailureInvalidType as an replacement.
 | |
|       //
 | |
|       Ret = TcgResultFailureInvalidType;
 | |
|     } else {
 | |
|       Ret = TcgResultFailure;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return Ret;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Update global locking range.
 | |
| 
 | |
|   @param          Session,           The session info for one opal device.
 | |
|   @param          Msid,              The data buffer to save Msid info.
 | |
|   @param          MsidBufferLength,  The data buffer length for Msid.
 | |
|   @param          MsidLength,        The actual data length for Msid.
 | |
| 
 | |
| **/
 | |
| TCG_RESULT
 | |
| EFIAPI
 | |
| OpalUtilGetMsid (
 | |
|   OPAL_SESSION  *Session,
 | |
|   UINT8         *Msid,
 | |
|   UINT32        MsidBufferLength,
 | |
|   UINT32        *MsidLength
 | |
|   )
 | |
| {
 | |
|   UINT8       MethodStatus;
 | |
|   TCG_RESULT  Ret;
 | |
| 
 | |
|   NULL_CHECK (Session);
 | |
|   NULL_CHECK (Msid);
 | |
|   NULL_CHECK (MsidLength);
 | |
| 
 | |
|   Ret = OpalStartSession (
 | |
|           Session,
 | |
|           OPAL_UID_ADMIN_SP,
 | |
|           TRUE,
 | |
|           0,
 | |
|           NULL,
 | |
|           TCG_UID_NULL,
 | |
|           &MethodStatus
 | |
|           );
 | |
|   if ((Ret == TcgResultSuccess) && (MethodStatus == TCG_METHOD_STATUS_CODE_SUCCESS)) {
 | |
|     Ret = OpalGetMsid (Session, MsidBufferLength, Msid, MsidLength);
 | |
|     OpalEndSession (Session);
 | |
|   }
 | |
| 
 | |
|   if (MethodStatus != TCG_METHOD_STATUS_CODE_SUCCESS) {
 | |
|     Ret = TcgResultFailure;
 | |
|   }
 | |
| 
 | |
|   return Ret;
 | |
| }
 | |
| 
 | |
| /**
 | |
| 
 | |
|   The function determines who owns the device by attempting to start a session with different credentials.
 | |
|   If the SID PIN matches the MSID PIN, the no one owns the device.
 | |
|   If the SID PIN matches the ourSidPin, then "Us" owns the device.  Otherwise it is unknown.
 | |
| 
 | |
| 
 | |
|   @param[in]      Session            The session info for one opal device.
 | |
|   @param          Msid,              The Msid info.
 | |
|   @param          MsidLength,        The data length for Msid.
 | |
| 
 | |
| **/
 | |
| OPAL_OWNER_SHIP
 | |
| EFIAPI
 | |
| OpalUtilDetermineOwnership (
 | |
|   OPAL_SESSION  *Session,
 | |
|   UINT8         *Msid,
 | |
|   UINT32        MsidLength
 | |
|   )
 | |
| {
 | |
|   UINT8            MethodStatus;
 | |
|   TCG_RESULT       Ret;
 | |
|   OPAL_OWNER_SHIP  Owner;
 | |
| 
 | |
|   if ((Session == NULL) || (Msid == NULL)) {
 | |
|     return OpalOwnershipUnknown;
 | |
|   }
 | |
| 
 | |
|   Owner = OpalOwnershipUnknown;
 | |
|   //
 | |
|   // Start Session as SID_UID with ADMIN_SP using MSID PIN
 | |
|   //
 | |
|   Ret = OpalStartSession (
 | |
|           Session,
 | |
|           OPAL_UID_ADMIN_SP,
 | |
|           TRUE,
 | |
|           MsidLength,
 | |
|           Msid,
 | |
|           OPAL_ADMIN_SP_SID_AUTHORITY,
 | |
|           &MethodStatus
 | |
|           );
 | |
|   if ((Ret == TcgResultSuccess) && (MethodStatus == TCG_METHOD_STATUS_CODE_SUCCESS)) {
 | |
|     //
 | |
|     // now we know that SID PIN == MSID PIN
 | |
|     //
 | |
|     Owner = OpalOwnershipNobody;
 | |
| 
 | |
|     OpalEndSession (Session);
 | |
|   }
 | |
| 
 | |
|   return Owner;
 | |
| }
 | |
| 
 | |
| /**
 | |
| 
 | |
|   The function returns if admin password exists.
 | |
| 
 | |
|   @param[in]      OwnerShip         The owner ship of the opal device.
 | |
|   @param[in]      LockingFeature    The locking info of the opal device.
 | |
| 
 | |
|   @retval         TRUE              Admin password existed.
 | |
|   @retval         FALSE             Admin password not existed.
 | |
| 
 | |
| **/
 | |
| BOOLEAN
 | |
| EFIAPI
 | |
| OpalUtilAdminPasswordExists (
 | |
|   IN  UINT16                          OwnerShip,
 | |
|   IN  TCG_LOCKING_FEATURE_DESCRIPTOR  *LockingFeature
 | |
|   )
 | |
| {
 | |
|   NULL_CHECK (LockingFeature);
 | |
| 
 | |
|   // if it is Unknown who owns the device
 | |
|   // then someone has set password previously through our UI
 | |
|   // because the SID would no longer match the generated SID (ownership us)
 | |
|   // or someone has set password using 3rd party software
 | |
| 
 | |
|   //
 | |
|   // Locking sp enabled is checked b/c it must be enabled to change the PIN of the Admin1.
 | |
|   //
 | |
|   return (OwnerShip == OpalOwnershipUnknown && LockingFeature->LockingEnabled);
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Get Active Data Removal Mechanism Value.
 | |
| 
 | |
|   @param[in]      Session                        The session info for one opal device.
 | |
|   @param[in]      GeneratedSid                   Generated SID of disk
 | |
|   @param[in]      SidLength                      Length of generatedSid in bytes
 | |
|   @param[out]     ActiveDataRemovalMechanism     Return the active data removal mechanism.
 | |
| 
 | |
| **/
 | |
| TCG_RESULT
 | |
| EFIAPI
 | |
| OpalUtilGetActiveDataRemovalMechanism (
 | |
|   OPAL_SESSION  *Session,
 | |
|   const VOID    *GeneratedSid,
 | |
|   UINT32        SidLength,
 | |
|   UINT8         *ActiveDataRemovalMechanism
 | |
|   )
 | |
| {
 | |
|   TCG_RESULT  Ret;
 | |
|   UINT8       MethodStatus;
 | |
| 
 | |
|   NULL_CHECK (Session);
 | |
|   NULL_CHECK (GeneratedSid);
 | |
|   NULL_CHECK (ActiveDataRemovalMechanism);
 | |
| 
 | |
|   Ret = OpalStartSession (
 | |
|           Session,
 | |
|           OPAL_UID_ADMIN_SP,
 | |
|           TRUE,
 | |
|           SidLength,
 | |
|           GeneratedSid,
 | |
|           OPAL_ADMIN_SP_ANYBODY_AUTHORITY,
 | |
|           &MethodStatus
 | |
|           );
 | |
|   if ((Ret != TcgResultSuccess) || (MethodStatus != TCG_METHOD_STATUS_CODE_SUCCESS)) {
 | |
|     DEBUG ((DEBUG_INFO, "Start session with admin SP as SID authority failed: Ret=%d MethodStatus=%u\n", Ret, MethodStatus));
 | |
|     if (MethodStatus != TCG_METHOD_STATUS_CODE_SUCCESS) {
 | |
|       Ret = TcgResultFailure;
 | |
|     }
 | |
| 
 | |
|     return Ret;
 | |
|   }
 | |
| 
 | |
|   Ret = OpalPyrite2GetActiveDataRemovalMechanism (
 | |
|           Session,
 | |
|           ActiveDataRemovalMechanism
 | |
|           );
 | |
| 
 | |
|   if (Ret != TcgResultSuccess) {
 | |
|     DEBUG ((DEBUG_INFO, "Pyrite2 Get Active Data Removal Mechanism failed: Ret=%d\n", Ret));
 | |
|   }
 | |
| 
 | |
|   OpalEndSession (Session);
 | |
| 
 | |
|   return Ret;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Calculate the estimated time.
 | |
| 
 | |
|   @param[in]      IsMinute               Whether the input time value is minute type or second type.
 | |
|   @param[in]      Time                   The input time value.
 | |
| 
 | |
| **/
 | |
| UINT32
 | |
| CalculateDataRemovalTime (
 | |
|   IN BOOLEAN  IsMinute,
 | |
|   IN UINT16   Time
 | |
|   )
 | |
| {
 | |
|   if (IsMinute) {
 | |
|     return Time * 2 * 60;
 | |
|   } else {
 | |
|     return Time * 2;
 | |
|   }
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Return the estimated time for specific type.
 | |
| 
 | |
|   @param[in]      Index               The input data removal type.
 | |
|   @param[in]      Descriptor          DATA_REMOVAL_FEATURE_DESCRIPTOR
 | |
| 
 | |
| **/
 | |
| UINT32
 | |
| GetDataRemovalTime (
 | |
|   IN  UINT8                            Index,
 | |
|   IN  DATA_REMOVAL_FEATURE_DESCRIPTOR  *Descriptor
 | |
|   )
 | |
| {
 | |
|   switch (Index) {
 | |
|     case OverwriteDataErase:
 | |
|       return CalculateDataRemovalTime (Descriptor->FormatBit0, SwapBytes16 (Descriptor->TimeBit0));
 | |
| 
 | |
|     case BlockErase:
 | |
|       return CalculateDataRemovalTime (Descriptor->FormatBit1, SwapBytes16 (Descriptor->TimeBit1));
 | |
| 
 | |
|     case CryptoErase:
 | |
|       return CalculateDataRemovalTime (Descriptor->FormatBit2, SwapBytes16 (Descriptor->TimeBit2));
 | |
| 
 | |
|     case Unmap:
 | |
|       return CalculateDataRemovalTime (Descriptor->FormatBit3, SwapBytes16 (Descriptor->TimeBit3));
 | |
| 
 | |
|     case ResetWritePointers:
 | |
|       return CalculateDataRemovalTime (Descriptor->FormatBit4, SwapBytes16 (Descriptor->TimeBit4));
 | |
| 
 | |
|     case VendorSpecificErase:
 | |
|       return CalculateDataRemovalTime (Descriptor->FormatBit5, SwapBytes16 (Descriptor->TimeBit5));
 | |
| 
 | |
|     default:
 | |
|       return 0;
 | |
|   }
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Get the supported Data Removal Mechanism list.
 | |
| 
 | |
|   @param[in]      Session                        The session info for one opal device.
 | |
|   @param[out]     RemovalMechanismLists          Return the supported data removal mechanism lists.
 | |
| 
 | |
| **/
 | |
| TCG_RESULT
 | |
| EFIAPI
 | |
| OpalUtilGetDataRemovalMechanismLists (
 | |
|   IN  OPAL_SESSION  *Session,
 | |
|   OUT UINT32        *RemovalMechanismLists
 | |
|   )
 | |
| {
 | |
|   TCG_RESULT                       Ret;
 | |
|   UINTN                            DataSize;
 | |
|   DATA_REMOVAL_FEATURE_DESCRIPTOR  Descriptor;
 | |
|   UINT8                            Index;
 | |
|   UINT8                            BitValue;
 | |
| 
 | |
|   NULL_CHECK (Session);
 | |
|   NULL_CHECK (RemovalMechanismLists);
 | |
| 
 | |
|   DataSize = sizeof (Descriptor);
 | |
|   Ret      = OpalGetFeatureDescriptor (Session, TCG_FEATURE_DATA_REMOVAL, &DataSize, &Descriptor);
 | |
|   if (Ret != TcgResultSuccess) {
 | |
|     return TcgResultFailure;
 | |
|   }
 | |
| 
 | |
|   ASSERT (Descriptor.RemovalMechanism != 0);
 | |
| 
 | |
|   for (Index = 0; Index < ResearvedMechanism; Index++) {
 | |
|     BitValue = (BOOLEAN)BitFieldRead8 (Descriptor.RemovalMechanism, Index, Index);
 | |
| 
 | |
|     if (BitValue == 0) {
 | |
|       RemovalMechanismLists[Index] = 0;
 | |
|     } else {
 | |
|       RemovalMechanismLists[Index] = GetDataRemovalTime (Index, &Descriptor);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return TcgResultSuccess;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Get revert timeout value.
 | |
| 
 | |
|   @param[in]      Session                       The session info for one opal device.
 | |
| 
 | |
| **/
 | |
| UINT32
 | |
| GetRevertTimeOut (
 | |
|   IN OPAL_SESSION  *Session
 | |
|   )
 | |
| {
 | |
|   TCG_RESULT                   TcgResult;
 | |
|   OPAL_DISK_SUPPORT_ATTRIBUTE  SupportedAttributes;
 | |
|   UINT16                       BaseComId;
 | |
|   UINT32                       MsidLength;
 | |
|   UINT8                        Msid[OPAL_MSID_LENGTH];
 | |
|   UINT32                       RemovalMechanishLists[ResearvedMechanism];
 | |
|   UINT8                        ActiveDataRemovalMechanism;
 | |
| 
 | |
|   TcgResult = OpalGetSupportedAttributesInfo (Session, &SupportedAttributes, &BaseComId);
 | |
|   if ((TcgResult != TcgResultSuccess) || (SupportedAttributes.DataRemoval == 0)) {
 | |
|     return 0;
 | |
|   }
 | |
| 
 | |
|   TcgResult = OpalUtilGetMsid (Session, Msid, OPAL_MSID_LENGTH, &MsidLength);
 | |
|   if (TcgResult != TcgResultSuccess) {
 | |
|     return 0;
 | |
|   }
 | |
| 
 | |
|   TcgResult = OpalUtilGetDataRemovalMechanismLists (Session, RemovalMechanishLists);
 | |
|   if (TcgResult != TcgResultSuccess) {
 | |
|     return 0;
 | |
|   }
 | |
| 
 | |
|   TcgResult = OpalUtilGetActiveDataRemovalMechanism (Session, Msid, MsidLength, &ActiveDataRemovalMechanism);
 | |
|   if (TcgResult != TcgResultSuccess) {
 | |
|     return 0;
 | |
|   }
 | |
| 
 | |
|   return RemovalMechanishLists[ActiveDataRemovalMechanism];
 | |
| }
 |