//
//
// Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
//                                                                                  
// This program and the accompanying materials are licensed and made available under
// the terms and conditions of the BSD License that accompanies this distribution.  
// The full text of the license may be found at                                     
// http://opensource.org/licenses/bsd-license.php.                                  
//                                                                                  
// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,            
// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.    
//                                                                                  
//
//
//
// Module Name:
//
//   Security.vfi
//
// Abstract:
//
//   Driver Setup formset.
//
// --*/

//
// Security Configuration Form
//


form formid = SECURITY_CONFIGURATION_FORM_ID,
  title    = STRING_TOKEN(STR_SECURITY_CONFIGURATION_TITLE);


  subtitle text = STRING_TOKEN(STR_NULL_STRING);
  //
  //TPM related
  //
  subtitle text = STRING_TOKEN(STR_TPM_CONFIGURATION_PROMPT);
grayoutif ideqval Setup.ETpm== 0x1;
  oneof   varid   = Setup.fTPM,
    prompt      = STRING_TOKEN(STR_PTT_PROMPT),
    help        = STRING_TOKEN(STR_PTT_HELP),
      option text = STRING_TOKEN(STR_ENABLE), value = 1, flags = RESET_REQUIRED;
      option text = STRING_TOKEN(STR_DISABLE), value= 0, flags = DEFAULT | MANUFACTURING | RESET_REQUIRED;
  endoneof;
endif;

grayoutif ideqval Setup.fTPM == 0x1;
  oneof   varid   = Setup.ETpm,
    prompt      = STRING_TOKEN(STR_TPM_PROMPT),
    help        = STRING_TOKEN(STR_TPM_HELP),
      option text = STRING_TOKEN(STR_ENABLE), value = 1, flags = RESET_REQUIRED;
      option text = STRING_TOKEN(STR_DISABLE), value= 0, flags = DEFAULT | MANUFACTURING | RESET_REQUIRED;
  endoneof;
endif;

suppressif ideqval Setup.fTPM == 0;
  oneof varid = Setup.MeasuredBootEnable,
    prompt      = STRING_TOKEN(STR_MEASURED_BOOT_ENABLE_PROMPT),
    help        = STRING_TOKEN(STR_MEASURED_BOOT_ENABLE_HELP),
    option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = RESET_REQUIRED;
    option text = STRING_TOKEN(STR_ENABLE), value = 1, flags =  DEFAULT | MANUFACTURING | RESET_REQUIRED;
  endoneof;
endif;

  subtitle text = STRING_TOKEN(STR_NULL_STRING);

  subtitle text = STRING_TOKEN(STR_PASSWORD_CONFIGURATION_SUBTITLE);

  password varid  = Setup.AdminPassword,
    prompt      = STRING_TOKEN(STR_ADMIN_PASSWORD),
    help        = STRING_TOKEN(STR_ADMIN_PASSWORD_HELP),
    flags       = 0,
    minsize     = 0,
    maxsize     = PASSWORD_MAX_SIZE,
    encoding    = 1,
  endpassword;

  password varid  = Setup.UserPassword,
    prompt      = STRING_TOKEN(STR_USER_PASSWORD),
    help        = STRING_TOKEN(STR_USER_PASSWORD_HELP),
    flags       = 0,
    minsize     = 0,
    maxsize     = PASSWORD_MAX_SIZE,
    encoding    = 1,
  endpassword;
suppressif TRUE;
  password varid  = Setup.AdminPassword,
    prompt      = STRING_TOKEN(STR_CHANGE_ADMIN_PASSWORD),
    help        = STRING_TOKEN(STR_CHANGE_ADMIN_PASSWORD_HELP),
    flags       = 0,
    minsize     = 0,
    maxsize     = PASSWORD_MAX_SIZE,
    encoding    = 1,
  endpassword;

  password varid  = Setup.UserPassword,
    prompt      = STRING_TOKEN(STR_CHANGE_USER_PASSWORD),
    help        = STRING_TOKEN(STR_CHANGE_USER_PASSWORD_HELP),
    flags       = 0,
    minsize     = 0,
    maxsize     = PASSWORD_MAX_SIZE,
    encoding    = 1,
  endpassword;
endif;

endform;

