//
//
// 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);
  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 = DEFAULT | MANUFACTURING | RESET_REQUIRED;
      option text = STRING_TOKEN(STR_DISABLE), value= 0, flags= RESET_REQUIRED;
  endoneof;

  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;

  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;

