@ -0,0 +1,738 @@
#***************************************************************************************************************
# This script supports the TLS 1.2 everywhere project
# It does the following:
# * By default it disables TLS 1.O, TLS 1.1, SSLv2, SSLv3 and Enables TLS1.2
# * The CipherSuite order is set to the SDL approved version.
# * The FIPS MinEncryptionLevel is set to 3.
# * RC4 is disabled
# * A log with a transcript of all actions taken is generated
#***************************************************************************************************************
#************************************************ SCRIPT USAGE ************************************************
# .\TLSSettings.ps1
# -SetCipherOrder : Excellence/Min-Bar, default(Excellence), use B to set Min-Bar. (Min-Bar ordering prefers ciphers with smaller key sizes to improve performance over security)
# -RebootIfRequired : $true/$false, default($true), use $false to disable auto-reboot (Settings won't take effect until a reboot is completed)
# -EnableOlderTlsVersions : $true/$false, default($false), use $true to explicitly Enable TLS1.0, TLS1.1
#***************************************************************************************************************
#***************************TEAM CAN DETERMINE WHAT CIPHER SUITE ORDER IS CHOSEN ******************************
# Option B provides the min-bar configuration (small trade-off: performance over security)
# Syntax: .\TLSSettings.ps1 -SetCipherOrder B
# if no option is supplied, you will get the opportunity for excellence cipher order (small trade-off: security over performance)
# Syntax: .\TLSSettings.ps1
#***************************************************************************************************************
param (
[ string ] $SetCipherOrder = " " ,
[ bool ] $RebootIfRequired = $true ,
[ bool ] $EnableOlderTlsVersions = $false
)
#******************* FUNCTION THAT ACTUALLY UPDATES KEYS; WILL RETURN REBOOT FLAG IF CHANGES ***********************
Function Set-CryptoSetting {
param (
$regKeyName ,
$value ,
$valuedata ,
$valuetype
)
$restart = $false
# Check for existence of registry key, and create if it does not exist
If ( ! ( Test-Path -Path $regKeyName ) ) {
New-Item $regKeyName | Out-Null
}
# Get data of registry value, or null if it does not exist
$val = ( Get-ItemProperty -Path $regKeyName -Name $value -ErrorAction SilentlyContinue ) . $value
If ( $val -eq $null ) {
# Value does not exist - create and set to desired value
New-ItemProperty -Path $regKeyName -Name $value -Value $valuedata -PropertyType $valuetype | Out-Null
$restart = $true
}
Else {
# Value does exist - if not equal to desired value, change it
If ( $val -ne $valuedata ) {
Set-ItemProperty -Path $regKeyName -Name $value -Value $valuedata
$restart = $true
}
}
$restart
}
#***************************************************************************************************************
#******************* FUNCTION THAT DISABLES RC4 ***********************
Function DisableRC4 {
$restart = $false
$subkeys = Get-Item -Path " HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL "
$ciphers = $subkeys . OpenSubKey ( " Ciphers " , $true )
Write-Log -Message " ----- Checking the status of RC4 ----- " -Logfile $logLocation -Severity Information
$RC4 = $false
if ( $ciphers . SubKeyCount -eq 0 ) {
$k1 = $ciphers . CreateSubKey ( " RC4 128/128 " )
$k1 . SetValue ( " Enabled " , 0 , [ Microsoft.Win32.RegistryValueKind ] :: DWord )
$restart = $true
$k2 = $ciphers . CreateSubKey ( " RC4 64/128 " )
$k2 . SetValue ( " Enabled " , 0 , [ Microsoft.Win32.RegistryValueKind ] :: DWord )
$k3 = $ciphers . CreateSubKey ( " RC4 56/128 " )
$k3 . SetValue ( " Enabled " , 0 , [ Microsoft.Win32.RegistryValueKind ] :: DWord )
$k4 = $ciphers . CreateSubKey ( " RC4 40/128 " )
$k4 . SetValue ( " Enabled " , 0 , [ Microsoft.Win32.RegistryValueKind ] :: DWord )
Write-Log -Message " RC4 was disabled " -Logfile $logLocation -Severity Information
$RC4 = $true
}
If ( $RC4 -ne $true ) {
Write-Log -Message " There was no change for RC4 " -Logfile $logLocation -Severity Information
}
$restart
}
#***************************************************************************************************************
#******************* FUNCTION CHECKS FOR PROBLEMATIC FIPS SETTING AND FIXES IT ***********************
Function Test-RegistryValueForFipsSettings {
$restart = $false
$fipsPath = @ (
" HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp " ,
" HKLM:\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services " ,
" HKLM:\System\CurrentControlSet\Control\Terminal Server\DefaultUserConfiguration "
)
$fipsValue = " MinEncryptionLevel "
foreach ( $path in $fipsPath ) {
Write-Log -Message " Checking to see if $( $path ) \ $fipsValue exists " -Logfile $logLocation -Severity Information
$ErrorActionPreference = " stop "
Try {
$result = Get-ItemProperty -Path $path | Select-Object -ExpandProperty $fipsValue
if ( $result -eq 4 ) {
set-itemproperty -Path $path -Name $fipsValue -value 3
Write-Log -Message " Regkey $( $path ) \ $fipsValue was changed from value $result to a value of 3 " -Logfile $logLocation -Severity Information
$restart = $true
}
else {
Write-Log -Message " Regkey $( $path ) \ $fipsValue left at value $result " -Logfile $logLocation -Severity Information
}
}
Catch [ System.Management.Automation.ItemNotFoundException ] {
Write-Log -Message " Reg path $path was not found " -Logfile $logLocation -Severity Information
}
Catch [ System.Management.Automation.PSArgumentException ] {
Write-Log -Message " Regkey $( $path ) \ $fipsValue was not found " -Logfile $logLocation -Severity Information
}
Catch {
Write-Log -Message " Error of type $( $Error [ 0 ] . Exception . GetType ( ) . FullName ) trying to get $( $path ) \ $fipsValue " -Logfile $logLocation -Severity Information
}
Finally { $ErrorActionPreference = " Continue "
}
}
$restart
}
#***************************************************************************************************************
#********************************** FUNCTION THAT CREATE LOG DIRECTORY IF IT DOES NOT EXIST *******************************
function CreateLogDirectory {
$TARGETDIR = " $env:HOMEDRIVE \Logs "
if ( -Not ( Test-Path -Path $TARGETDIR ) ) {
New-Item -ItemType directory -Path $TARGETDIR | Out-Null
}
$TARGETDIR = $TARGETDIR + " \ " + " TLSSettingsLogFile.csv "
return $TARGETDIR
}
#***************************************************************************************************************
#********************************** FUNCTION THAT LOGS WHAT THE SCRIPT IS DOING *******************************
function Write-Log {
[ CmdletBinding ( ) ]
param (
[ Parameter ( ) ]
[ ValidateNotNullOrEmpty ( ) ]
[ string ] $Message ,
[ Parameter ( ) ]
[ ValidateNotNullOrEmpty ( ) ]
[ string ] $LogFile ,
[ Parameter ( ) ]
[ ValidateNotNullOrEmpty ( ) ]
[ ValidateSet ( 'Information' , 'Warning' , 'Error' ) ]
[ string ] $Severity = 'Information'
)
[ pscustomobject ] @ {
Time = ( Get-Date -f g )
Message = $Message
Severity = $Severity
} | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1 | Out-File -Append -FilePath $LogFile
}
#********************************TLS CipherSuite Settings *******************************************
# CipherSuites for windows OS < 10
function Get-BaseCipherSuitesOlderWindows ( )
{
param
(
[ Parameter ( Mandatory = $true , Position = 0 ) ] [ bool ] $isExcellenceOrder
)
$cipherorder = @ ( )
if ( $isExcellenceOrder -eq $true )
{
$cipherorder + = " TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P384 "
$cipherorder + = " TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P256 "
$cipherorder + = " TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384_P384 "
$cipherorder + = " TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P256 "
$cipherorder + = " TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384 "
$cipherorder + = " TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256 "
}
else
{
$cipherorder + = " TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P256 "
$cipherorder + = " TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P384 "
$cipherorder + = " TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P256 "
$cipherorder + = " TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384_P384 "
$cipherorder + = " TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256 "
$cipherorder + = " TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384 "
}
# Add additional ciphers when EnableOlderTlsVersions flag is set to true
if ( $EnableOlderTlsVersions )
{
$cipherorder + = " TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P256 "
$cipherorder + = " TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P256 "
$cipherorder + = " TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P256 "
$cipherorder + = " TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P256 "
$cipherorder + = " TLS_RSA_WITH_AES_256_GCM_SHA384 "
$cipherorder + = " TLS_RSA_WITH_AES_128_GCM_SHA256 "
$cipherorder + = " TLS_RSA_WITH_AES_256_CBC_SHA256 "
$cipherorder + = " TLS_RSA_WITH_AES_128_CBC_SHA256 "
$cipherorder + = " TLS_RSA_WITH_AES_256_CBC_SHA "
$cipherorder + = " TLS_RSA_WITH_AES_128_CBC_SHA "
}
return $cipherorder
}
# Ciphersuites needed for backwards compatibility with Firefox, Chrome
# Server 2012 R2 doesn't support TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
# Both firefox and chrome negotiate ECDHE_RSA_AES_256_CBC_SHA1, Edge negotiates ECDHE_RSA_AES_256_CBC_SHA384
function Get-BrowserCompatCipherSuitesOlderWindows ( )
{
param
(
[ Parameter ( Mandatory = $true , Position = 0 ) ] [ bool ] $isExcellenceOrder
)
$cipherorder = @ ( )
if ( $isExcellenceOrder -eq $true )
{
$cipherorder + = " TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384 " # (uses SHA-1)
$cipherorder + = " TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P256 " # (uses SHA-1)
}
else
{
$cipherorder + = " TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P256 " # (uses SHA-1)
$cipherorder + = " TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384 " # (uses SHA-1)
}
return $cipherorder
}
# Ciphersuites for OS versions windows 10 and above
function Get-BaseCipherSuitesWin10Above ( )
{
param
(
[ Parameter ( Mandatory = $true , Position = 0 ) ] [ bool ] $isExcellenceOrder
)
$cipherorder = @ ( )
if ( $isExcellenceOrder -eq $true )
{
$cipherorder + = " TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 "
$cipherorder + = " TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 "
$cipherorder + = " TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 "
$cipherorder + = " TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 "
$cipherorder + = " TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 "
$cipherorder + = " TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 "
$cipherorder + = " TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 "
$cipherorder + = " TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 "
}
else
{
$cipherorder + = " TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 "
$cipherorder + = " TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 "
$cipherorder + = " TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 "
$cipherorder + = " TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 "
$cipherorder + = " TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 "
$cipherorder + = " TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 "
$cipherorder + = " TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 "
$cipherorder + = " TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 "
}
# Add additional ciphers when EnableOlderTlsVersions flag is set to true
if ( $EnableOlderTlsVersions )
{
$cipherorder + = " TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P256 "
$cipherorder + = " TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P256 "
$cipherorder + = " TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P256 "
$cipherorder + = " TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P256 "
$cipherorder + = " TLS_RSA_WITH_AES_256_GCM_SHA384 "
$cipherorder + = " TLS_RSA_WITH_AES_128_GCM_SHA256 "
$cipherorder + = " TLS_RSA_WITH_AES_256_CBC_SHA256 "
$cipherorder + = " TLS_RSA_WITH_AES_128_CBC_SHA256 "
$cipherorder + = " TLS_RSA_WITH_AES_256_CBC_SHA "
$cipherorder + = " TLS_RSA_WITH_AES_128_CBC_SHA "
}
return $cipherorder
}
#******************************* TLS Version Settings ****************************************************
function Get-RegKeyPathForTls12 ( )
{
$regKeyPath = @ (
" HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2 " ,
" HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client " ,
" HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server "
)
return $regKeyPath
}
function Get-RegKeyPathForTls11 ( )
{
$regKeyPath = @ (
" HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1 " ,
" HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client " ,
" HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server "
)
return $regKeyPath
}
function Get-RegKeypathForTls10 ( )
{
$regKeyPath = @ (
" HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0 " ,
" HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client " ,
" HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server "
)
return $regKeyPath
}
function Get-RegKeyPathForSsl30 ( )
{
$regKeyPath = @ (
" HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0 " ,
" HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Client " ,
" HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 3.0\Server "
)
return $regKeyPath
}
function Get-RegKeyPathForSsl20 ( )
{
$regKeyPath = @ (
" HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0 " ,
" HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client " ,
" HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server "
)
return $regKeyPath
}
#Initialize reboot value to false
$reboot = $false
#*****************************Create the logfile if not does not exist***************************************
$logLocation = CreateLogDirectory
#Start writing to the logs
Write-Log -Message " ========== Start of logging for a script execution ========== " -Logfile $logLocation -Severity Information
$registryPathGoodGuys = @ ( )
$registryPathBadGuys = @ ( )
# we enable TLS 1.2 and disable SSL 2.0, 3.0 in any case
$registryPathGoodGuys + = Get-RegKeyPathForTls12
$registryPathBadGuys + = Get-RegKeyPathForSsl20
$registryPathBadGuys + = Get-RegKeyPathForSsl30
# add TLS 1.0/1.1 to good/bad depending on user's preference
# default is adding TLS 1.0/1.1 to bad
if ( $EnableOlderTlsVersions )
{
$registryPathGoodGuys + = Get-RegKeypathForTls10
$registryPathGoodGuys + = Get-RegKeyPathForTls11
Write-Log -Message " Enabling TLS1.2, TLS1.1, TLS1.0. Disabling SSL3.0, SSL2.0 " -Logfile $logLocation -Severity Information
}
else
{
$registryPathBadGuys + = Get-RegKeypathForTls10
$registryPathBadGuys + = Get-RegKeyPathForTls11
Write-Log -Message " Enabling TLS1.2. Disabling TLS1.1, TLS1.0, SSL3.0, SSL2.0 " -Logfile $logLocation -Severity Information
}
Write-Log -Message " Check which registry keys exist already and which registry keys need to be created. " -Logfile $logLocation -Severity Information
#******************* CREATE THE REGISTRY KEYS IF THEY DON'T EXIST********************************
# Check for existence of GoodGuy registry keys, and create if they do not exist
For ( $i = 0 ; $i -lt $registryPathGoodGuys . Length ; $i = $i + 1 ) {
Write-Log -Message " Checking for existing of key: $( $registryPathGoodGuys [ $i ] ) " -Logfile $logLocation -Severity Information
If ( ! ( Test-Path -Path $registryPathGoodGuys [ $i ] ) ) {
New-Item $registryPathGoodGuys [ $i ] | Out-Null
Write-Log -Message " Creating key: $( $registryPathGoodGuys [ $i ] ) " -Logfile $logLocation -Severity Information
}
}
# Check for existence of BadGuy registry keys, and create if they do not exist
For ( $i = 0 ; $i -lt $registryPathBadGuys . Length ; $i = $i + 1 ) {
Write-Log -Message " Checking for existing of key: $( $registryPathBadGuys [ $i ] ) " -Logfile $logLocation -Severity Information
If ( ! ( Test-Path -Path $registryPathBadGuys [ $i ] ) ) {
Write-Log -Message " Creating key: $( $registryPathBadGuys [ $i ] ) " -Logfile $logLocation -Severity Information
New-Item $registryPathBadGuys [ $i ] | Out-Null
}
}
#******************* EXPLICITLY DISABLE SSLV2, SSLV3, TLS10 AND TLS11 ********************************
For ( $i = 0 ; $i -lt $registryPathBadGuys . Length ; $i = $i + 1 ) {
if ( $registryPathBadGuys [ $i ] . Contains ( " Client " ) -Or $registryPathBadGuys [ $i ] . Contains ( " Server " ) ) {
Write-Log -Message " Disabling this key: $( $registryPathBadGuys [ $i ] ) " -Logfile $logLocation -Severity Information
$result = Set-CryptoSetting $registryPathBadGuys [ $i ] . ToString ( ) Enabled 0 DWord
$result = Set-CryptoSetting $registryPathBadGuys [ $i ] . ToString ( ) DisabledByDefault 1 DWord
$reboot = $reboot -or $result
}
}
#********************************* EXPLICITLY Enable TLS12 ****************************************
For ( $i = 0 ; $i -lt $registryPathGoodGuys . Length ; $i = $i + 1 ) {
if ( $registryPathGoodGuys [ $i ] . Contains ( " Client " ) -Or $registryPathGoodGuys [ $i ] . Contains ( " Server " ) ) {
Write-Log -Message " Enabling this key: $( $registryPathGoodGuys [ $i ] ) " -Logfile $logLocation -Severity Information
$result = Set-CryptoSetting $registryPathGoodGuys [ $i ] . ToString ( ) Enabled 1 DWord
$result = Set-CryptoSetting $registryPathGoodGuys [ $i ] . ToString ( ) DisabledByDefault 0 DWord
$reboot = $reboot -or $result
}
}
#************************************** Disable RC4 ************************************************
$result = DisableRC4
$reboot = $reboot -or $result
#************************************** Set Cipher Suite Order **************************************
Write-Log -Message " ----- starting ciphersuite order calculation ----- " -Logfile $logLocation -Severity Information
$configureExcellenceOrder = $true
if ( $SetCipherOrder . ToUpper ( ) -eq " B " )
{
$configureExcellenceOrder = $false
Write-Host " The min bar cipher suite order was chosen. "
Write-Log -Message " The min bar cipher suite order was chosen. " -Logfile $logLocation -Severity Information
}
else
{
Write-Host " The opportunity for excellence cipher suite order was chosen. "
Write-Log -Message " The opportunity for excellence cipher suite order was chosen. " -Logfile $logLocation -Severity Information
}
$cipherlist = @ ( )
if ( [ Environment ] :: OSVersion . Version . Major -lt 10 )
{
$cipherlist + = Get-BaseCipherSuitesOlderWindows -isExcellenceOrder $configureExcellenceOrder
$cipherlist + = Get-BrowserCompatCipherSuitesOlderWindows -isExcellenceOrder $configureExcellenceOrder
}
else
{
$cipherlist + = Get-BaseCipherSuitesWin10Above -isExcellenceOrder $configureExcellenceOrder
}
$cipherorder = [ System.String ] :: Join ( " , " , $cipherlist )
Write-Host " Appropriate ciphersuite order : $cipherorder "
Write-Log -Message " Appropriate ciphersuite order : $cipherorder " -Logfile $logLocation -Severity Information
$CipherSuiteRegKey = " HKLM:\SOFTWARE\Policies\Microsoft\Cryptography\Configuration\SSL\00010002 "
if ( ! ( Test-Path -Path $CipherSuiteRegKey ) )
{
New-Item $CipherSuiteRegKey | Out-Null
$reboot = $True
Write-Log -Message " Creating key: $( $CipherSuiteRegKey ) " -Logfile $logLocation -Severity Information
}
$val = ( Get-Item -Path $CipherSuiteRegKey -ErrorAction SilentlyContinue ) . GetValue ( " Functions " , $null )
Write-Log -Message " Previous cipher suite value: $val " -Logfile $logLocation -Severity Information
Write-Log -Message " New cipher suite value : $cipherorder " -Logfile $logLocation -Severity Information
if ( $val -ne $cipherorder )
{
Write-Log -Message " Cipher suite order needs to be updated. " -Logfile $logLocation -Severity Information
Write-Host " The original cipher suite order needs to be updated " , ` n , $val
Set-ItemProperty -Path $CipherSuiteRegKey -Name Function s -Value $cipherorder
Write-Log -Message " Cipher suite value was updated. " -Logfile $logLocation -Severity Information
$reboot = $True
}
else
{
Write-Log -Message " Cipher suite order does not need to be updated. " -Logfile $logLocation -Severity Information
Write-Log -Message " Cipher suite value was not updated as there was no change. " -Logfile $logLocation -Severity Information
}
#****************************** CHECK THE FIPS SETTING WHICH IMPACTS RDP'S ALLOWED CIPHERS **************************
#Check for FipsSettings
Write-Log -Message " Checking to see if reg keys exist and if MinEncryptionLevel is set to 4 " -Logfile $logLocation -Severity Information
$result = Test-RegistryValueForFipsSettings
$reboot = $reboot -or $result
#************************************** REBOOT **************************************
if ( $RebootIfRequired )
{
Write-Log -Message " You set the RebootIfRequired flag to true. If changes are made, the system will reboot " -Logfile $logLocation -Severity Information
# If any settings were changed, reboot
If ( $reboot )
{
Write-Log -Message " Rebooting now... " -Logfile $logLocation -Severity Information
Write-Log -Message " Using this command: shutdown.exe /r /t 5 /c "" Crypto settings changed "" /f /d p:2:4 " -Logfile $logLocation -Severity Information
Write-Host " Rebooting now... "
shutdown . exe / r / t 5 / c " Crypto settings changed " / f / d p: 2 : 4
}
Else
{
Write-Host " Nothing get updated. "
Write-Log -Message " Nothing get updated. " -Logfile $logLocation -Severity Information
}
}
else
{
Write-Log -Message " You set the RebootIfRequired flag to false. If changes are made, the system will NOT reboot " -Logfile $logLocation -Severity Information
Write-Log -Message " No changes will take effect until a reboot has been completed. " -Logfile $logLocation -Severity Information
Write-Log -Message " Script does not include a reboot by design " -Logfile $logLocation -Severity Information
}
Write-Log -Message " ========== End of logging for a script execution ========== " -Logfile $logLocation -Severity Information
# SIG # Begin signature block
# MIIjhgYJKoZIhvcNAQcCoIIjdzCCI3MCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAHtlEJwNffjnOP
# Sr2t1yq5EfE0ll4GozyZt3UXO9BXKKCCDYEwggX/MIID56ADAgECAhMzAAABh3IX
# chVZQMcJAAAAAAGHMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p
# bmcgUENBIDIwMTEwHhcNMjAwMzA0MTgzOTQ3WhcNMjEwMzAzMTgzOTQ3WjB0MQsw
# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
# AQDOt8kLc7P3T7MKIhouYHewMFmnq8Ayu7FOhZCQabVwBp2VS4WyB2Qe4TQBT8aB
# znANDEPjHKNdPT8Xz5cNali6XHefS8i/WXtF0vSsP8NEv6mBHuA2p1fw2wB/F0dH
# sJ3GfZ5c0sPJjklsiYqPw59xJ54kM91IOgiO2OUzjNAljPibjCWfH7UzQ1TPHc4d
# weils8GEIrbBRb7IWwiObL12jWT4Yh71NQgvJ9Fn6+UhD9x2uk3dLj84vwt1NuFQ
# itKJxIV0fVsRNR3abQVOLqpDugbr0SzNL6o8xzOHL5OXiGGwg6ekiXA1/2XXY7yV
# Fc39tledDtZjSjNbex1zzwSXAgMBAAGjggF+MIIBejAfBgNVHSUEGDAWBgorBgEE
# AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUhov4ZyO96axkJdMjpzu2zVXOJcsw
# UAYDVR0RBEkwR6RFMEMxKTAnBgNVBAsTIE1pY3Jvc29mdCBPcGVyYXRpb25zIFB1
# ZXJ0byBSaWNvMRYwFAYDVQQFEw0yMzAwMTIrNDU4Mzg1MB8GA1UdIwQYMBaAFEhu
# ZOVQBdOCqhc3NyK1bajKdQKVMFQGA1UdHwRNMEswSaBHoEWGQ2h0dHA6Ly93d3cu
# bWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY0NvZFNpZ1BDQTIwMTFfMjAxMS0w
# Ny0wOC5jcmwwYQYIKwYBBQUHAQEEVTBTMFEGCCsGAQUFBzAChkVodHRwOi8vd3d3
# Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY0NvZFNpZ1BDQTIwMTFfMjAx
# MS0wNy0wOC5jcnQwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQsFAAOCAgEAixmy
# S6E6vprWD9KFNIB9G5zyMuIjZAOuUJ1EK/Vlg6Fb3ZHXjjUwATKIcXbFuFC6Wr4K
# NrU4DY/sBVqmab5AC/je3bpUpjtxpEyqUqtPc30wEg/rO9vmKmqKoLPT37svc2NV
# BmGNl+85qO4fV/w7Cx7J0Bbqk19KcRNdjt6eKoTnTPHBHlVHQIHZpMxacbFOAkJr
# qAVkYZdz7ikNXTxV+GRb36tC4ByMNxE2DF7vFdvaiZP0CVZ5ByJ2gAhXMdK9+usx
# zVk913qKde1OAuWdv+rndqkAIm8fUlRnr4saSCg7cIbUwCCf116wUJ7EuJDg0vHe
# yhnCeHnBbyH3RZkHEi2ofmfgnFISJZDdMAeVZGVOh20Jp50XBzqokpPzeZ6zc1/g
# yILNyiVgE+RPkjnUQshd1f1PMgn3tns2Cz7bJiVUaqEO3n9qRFgy5JuLae6UweGf
# AeOo3dgLZxikKzYs3hDMaEtJq8IP71cX7QXe6lnMmXU/Hdfz2p897Zd+kU+vZvKI
# 3cwLfuVQgK2RZ2z+Kc3K3dRPz2rXycK5XCuRZmvGab/WbrZiC7wJQapgBodltMI5
# GMdFrBg9IeF7/rP4EqVQXeKtevTlZXjpuNhhjuR+2DMt/dWufjXpiW91bo3aH6Ea
# jOALXmoxgltCp1K7hrS6gmsvj94cLRf50QQ4U8Qwggd6MIIFYqADAgECAgphDpDS
# AAAAAAADMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMK
# V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0
# IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0
# ZSBBdXRob3JpdHkgMjAxMTAeFw0xMTA3MDgyMDU5MDlaFw0yNjA3MDgyMTA5MDla
# MH4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS
# ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMT
# H01pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTEwggIiMA0GCSqGSIb3DQEB
# AQUAA4ICDwAwggIKAoICAQCr8PpyEBwurdhuqoIQTTS68rZYIZ9CGypr6VpQqrgG
# OBoESbp/wwwe3TdrxhLYC/A4wpkGsMg51QEUMULTiQ15ZId+lGAkbK+eSZzpaF7S
# 35tTsgosw6/ZqSuuegmv15ZZymAaBelmdugyUiYSL+erCFDPs0S3XdjELgN1q2jz
# y23zOlyhFvRGuuA4ZKxuZDV4pqBjDy3TQJP4494HDdVceaVJKecNvqATd76UPe/7
# 4ytaEB9NViiienLgEjq3SV7Y7e1DkYPZe7J7hhvZPrGMXeiJT4Qa8qEvWeSQOy2u
# M1jFtz7+MtOzAz2xsq+SOH7SnYAs9U5WkSE1JcM5bmR/U7qcD60ZI4TL9LoDho33
# X/DQUr+MlIe8wCF0JV8YKLbMJyg4JZg5SjbPfLGSrhwjp6lm7GEfauEoSZ1fiOIl
# XdMhSz5SxLVXPyQD8NF6Wy/VI+NwXQ9RRnez+ADhvKwCgl/bwBWzvRvUVUvnOaEP
# 6SNJvBi4RHxF5MHDcnrgcuck379GmcXvwhxX24ON7E1JMKerjt/sW5+v/N2wZuLB
# l4F77dbtS+dJKacTKKanfWeA5opieF+yL4TXV5xcv3coKPHtbcMojyyPQDdPweGF
# RInECUzF1KVDL3SV9274eCBYLBNdYJWaPk8zhNqwiBfenk70lrC8RqBsmNLg1oiM
# CwIDAQABo4IB7TCCAekwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFEhuZOVQ
# BdOCqhc3NyK1bajKdQKVMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1Ud
# DwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFHItOgIxkEO5FAVO
# 4eqnxzHRI4k0MFoGA1UdHwRTMFEwT6BNoEuGSWh0dHA6Ly9jcmwubWljcm9zb2Z0
# LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dDIwMTFfMjAxMV8wM18y
# Mi5jcmwwXgYIKwYBBQUHAQEEUjBQME4GCCsGAQUFBzAChkJodHRwOi8vd3d3Lm1p
# Y3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Jvb0NlckF1dDIwMTFfMjAxMV8wM18y
# Mi5jcnQwgZ8GA1UdIASBlzCBlDCBkQYJKwYBBAGCNy4DMIGDMD8GCCsGAQUFBwIB
# FjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2RvY3MvcHJpbWFyeWNw
# cy5odG0wQAYIKwYBBQUHAgIwNB4yIB0ATABlAGcAYQBsAF8AcABvAGwAaQBjAHkA
# XwBzAHQAYQB0AGUAbQBlAG4AdAAuIB0wDQYJKoZIhvcNAQELBQADggIBAGfyhqWY
# 4FR5Gi7T2HRnIpsLlhHhY5KZQpZ90nkMkMFlXy4sPvjDctFtg/6+P+gKyju/R6mj
# 82nbY78iNaWXXWWEkH2LRlBV2AySfNIaSxzzPEKLUtCw/WvjPgcuKZvmPRul1LUd
# d5Q54ulkyUQ9eHoj8xN9ppB0g430yyYCRirCihC7pKkFDJvtaPpoLpWgKj8qa1hJ
# Yx8JaW5amJbkg/TAj/NGK978O9C9Ne9uJa7lryft0N3zDq+ZKJeYTQ49C/IIidYf
# wzIY4vDFLc5bnrRJOQrGCsLGra7lstnbFYhRRVg4MnEnGn+x9Cf43iw6IGmYslmJ
# aG5vp7d0w0AFBqYBKig+gj8TTWYLwLNN9eGPfxxvFX1Fp3blQCplo8NdUmKGwx1j
# NpeG39rz+PIWoZon4c2ll9DuXWNB41sHnIc+BncG0QaxdR8UvmFhtfDcxhsEvt9B
# xw4o7t5lL+yX9qFcltgA1qFGvVnzl6UJS0gQmYAf0AApxbGbpT9Fdx41xtKiop96
# eiL6SJUfq/tHI4D1nvi/a7dLl+LrdXga7Oo3mXkYS//WsyNodeav+vyL6wuA6mk7
# r/ww7QRMjt/fdW1jkT3RnVZOT7+AVyKheBEyIXrvQQqxP/uozKRdwaGIm1dxVk5I
# RcBCyZt2WwqASGv9eZ/BvW1taslScxMNelDNMYIVWzCCFVcCAQEwgZUwfjELMAkG
# A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx
# HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEoMCYGA1UEAxMfTWljcm9z
# b2Z0IENvZGUgU2lnbmluZyBQQ0EgMjAxMQITMwAAAYdyF3IVWUDHCQAAAAABhzAN
# BglghkgBZQMEAgEFAKCBrjAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgor
# BgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQgOQvu7NUq
# wmve+qCoalj/s9HX5Hz9/zYISdJyOFTC4FIwQgYKKwYBBAGCNwIBDDE0MDKgFIAS
# AE0AaQBjAHIAbwBzAG8AZgB0oRqAGGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbTAN
# BgkqhkiG9w0BAQEFAASCAQAHbtGz0AChe0qMPM3c7iU8BQCfJklePUlAlhwFSuCx
# careoloxao+ZtS+dQRlrxLu/ZSqtmJHNsyRoWzsHdOs65pwUYhV3svzaXd7pJwkc
# nbDXedLBbNuQrQrrL2xbGtzT3U+EwgpJ1TTEYwHgqkTFogIelGa2sjD5N+4Vvalq
# t+vxaYrWwkTtsm0qczLKGRUjJqCjARjviE1xsOvs4zwbpXx/bEs/6M7U9tR+w/DS
# nDY/5KAKYET0DCVDhmsMmzJi3xXdBr4sAz0484AAB0CIRVgPCgdgr8E0NQUESJzm
# xm3K4bMAgTMWRiGTL4MRYSuMIn09sbfYXP9hjXLvTV4YoYIS5TCCEuEGCisGAQQB
# gjcDAwExghLRMIISzQYJKoZIhvcNAQcCoIISvjCCEroCAQMxDzANBglghkgBZQME
# AgEFADCCAVEGCyqGSIb3DQEJEAEEoIIBQASCATwwggE4AgEBBgorBgEEAYRZCgMB
# MDEwDQYJYIZIAWUDBAIBBQAEIJBynrmlQmGS0UNGTk53HVKEc4aHvNdYrs5eCcHM
# puc5AgZfEgElnvMYEzIwMjAwNzI0MTgwNDM3Ljg3NlowBIACAfSggdCkgc0wgcox
# CzAJBgNVBAYTAlVTMQswCQYDVQQIEwJXQTEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG
# A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQg
# SXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJjAkBgNVBAsTHVRoYWxlcyBUU1Mg
# RVNOOkUwNDEtNEJFRS1GQTdFMSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFt
# cCBzZXJ2aWNloIIOPDCCBPEwggPZoAMCAQICEzMAAAEHfjdomIdaN9YAAAAAAQcw
# DQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0
# b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh
# dGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwHhcN
# MTkxMDA4MTczODM1WhcNMjEwMTAzMTczODM1WjCByjELMAkGA1UEBhMCVVMxCzAJ
# BgNVBAgTAldBMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg
# Q29ycG9yYXRpb24xLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlv
# bnMgTGltaXRlZDEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046RTA0MS00QkVFLUZB
# N0UxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIHNlcnZpY2UwggEiMA0G
# CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDUuqOUlbaeWirgwbCwhhNIOqTshpo+
# QdSYxAt9JnkeulQFeKrQ6rOSECXxwgOjL/TNMIXtkig1MaifFON6si/Ri+AsV8Gu
# rQp4fylJzLDMFdJcGSpV3CGRdpDb0au8kNQLmnZuxLxAL91R7//3mH2QDQI20w3G
# 06s+Xv8+js9wQksXAfclXX1TJoBIx1Pi1FGqCnY3KlW81+Plhz0T4yStm1MgnqH4
# RKYyPdcempCYC/BI04Ph2EJL+uQQfAfYdbf9vGqpKYjsuktnWr5uowD3H5At+x3l
# YH5rz4JCleKjeLpB/j74H7VZ0I5eTEbls9e2lEKaUzb9o0wjnjDc+t4BAgMBAAGj
# ggEbMIIBFzAdBgNVHQ4EFgQUNOHjlxlIJXMcP9n/0ogYdX8p6HcwHwYDVR0jBBgw
# FoAU1WM6XIoxkPNDe3xGG8UzaFqFbVUwVgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDov
# L2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljVGltU3RhUENB
# XzIwMTAtMDctMDEuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggrBgEFBQcwAoY+aHR0
# cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNUaW1TdGFQQ0FfMjAx
# MC0wNy0wMS5jcnQwDAYDVR0TAQH/BAIwADATBgNVHSUEDDAKBggrBgEFBQcDCDAN
# BgkqhkiG9w0BAQsFAAOCAQEAGN3/7XWSzHGKjk444w+2q1D3k7Bh/ZahUvWHFJ6E
# UKU5vLzEGsdsgJSvWXHZDRrpf5rcUGQyjnlo1hAY1mDteNKFushS6bedxcxPHJje
# lVZ9N2/e5+/7zLu18YjnKw5bFu7dWqYBMI3J0FOr56XJOJ1KTtMiJhpxuib+FWy+
# pyhVVgHGTUHuUdbE09dY9WxuRsbpb4DdWAWNrPDB6VAOO50QfEj+0tW+zF6h3RhB
# TI0ilj0+AzgXE+6DyJ7/br6aVvCEvNRJzE6akJnMyn/kzmC32LxvRZWKEwWDR0Fn
# zeXj5ynSStZ6iifTBP7gqiDsidguxh+BFX7HxhN1eHf7jTCCBnEwggRZoAMCAQIC
# CmEJgSoAAAAAAAIwDQYJKoZIhvcNAQELBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBSb290IENlcnRp
# ZmljYXRlIEF1dGhvcml0eSAyMDEwMB4XDTEwMDcwMTIxMzY1NVoXDTI1MDcwMTIx
# NDY1NVowfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNV
# BAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQG
# A1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwggEiMA0GCSqGSIb3
# DQEBAQUAA4IBDwAwggEKAoIBAQCpHQ28dxGKOiDs/BOX9fp/aZRrdFQQ1aUKAIKF
# ++18aEssX8XD5WHCdrc+Zitb8BVTJwQxH0EbGpUdzgkTjnxhMFmxMEQP8WCIhFRD
# DNdNuDgIs0Ldk6zWczBXJoKjRQ3Q6vVHgc2/JGAyWGBG8lhHhjKEHnRhZ5FfgVSx
# z5NMksHEpl3RYRNuKMYa+YaAu99h/EbBJx0kZxJyGiGKr0tkiVBisV39dx898Fd1
# rL2KQk1AUdEPnAY+Z3/1ZsADlkR+79BL/W7lmsqxqPJ6Kgox8NpOBpG2iAg16Hgc
# sOmZzTznL0S6p/TcZL2kAcEgCZN4zfy8wMlEXV4WnAEFTyJNAgMBAAGjggHmMIIB
# 4jAQBgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQU1WM6XIoxkPNDe3xGG8UzaFqF
# bVUwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
# EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQwVgYD
# VR0fBE8wTTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwv
# cHJvZHVjdHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEB
# BE4wTDBKBggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9j
# ZXJ0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwgaAGA1UdIAEB/wSBlTCB
# kjCBjwYJKwYBBAGCNy4DMIGBMD0GCCsGAQUFBwIBFjFodHRwOi8vd3d3Lm1pY3Jv
# c29mdC5jb20vUEtJL2RvY3MvQ1BTL2RlZmF1bHQuaHRtMEAGCCsGAQUFBwICMDQe
# MiAdAEwAZQBnAGEAbABfAFAAbwBsAGkAYwB5AF8AUwB0AGEAdABlAG0AZQBuAHQA
# LiAdMA0GCSqGSIb3DQEBCwUAA4ICAQAH5ohRDeLG4Jg/gXEDPZ2joSFvs+umzPUx
# vs8F4qn++ldtGTCzwsVmyWrf9efweL3HqJ4l4/m87WtUVwgrUYJEEvu5U4zM9GAS
# inbMQEBBm9xcF/9c+V4XNZgkVkt070IQyK+/f8Z/8jd9Wj8c8pl5SpFSAK84Dxf1
# L3mBZdmptWvkx872ynoAb0swRCQiPM/tA6WWj1kpvLb9BOFwnzJKJ/1Vry/+tuWO
# M7tiX5rbV0Dp8c6ZZpCM/2pif93FSguRJuI57BlKcWOdeyFtw5yjojz6f32WapB4
# pm3S4Zz5Hfw42JT0xqUKloakvZ4argRCg7i1gJsiOCC1JeVk7Pf0v35jWSUPei45
# V3aicaoGig+JFrphpxHLmtgOR5qAxdDNp9DvfYPw4TtxCd9ddJgiCGHasFAeb73x
# 4QDf5zEHpJM692VHeOj4qEir995yfmFrb3epgcunCaw5u+zGy9iCtHLNHfS4hQEe
# gPsbiSpUObJb2sgNVZl6h3M7COaYLeqN4DMuEin1wC9UJyH3yKxO2ii4sanblrKn
# QqLJzxlBTeCG+SqaoxFmMNO7dDJL32N79ZmKLxvHIa9Zta7cRDyXUHHXodLFVeNp
# 3lfB0d4wwP3M5k37Db9dT+mdHhk4L7zPWAUu7w2gUDXa7wknHNWzfjUeCLraNtvT
# X4/edIhJEqGCAs4wggI3AgEBMIH4oYHQpIHNMIHKMQswCQYDVQQGEwJVUzELMAkG
# A1UECBMCV0ExEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBD
# b3Jwb3JhdGlvbjEtMCsGA1UECxMkTWljcm9zb2Z0IElyZWxhbmQgT3BlcmF0aW9u
# cyBMaW1pdGVkMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVTTjpFMDQxLTRCRUUtRkE3
# RTElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgc2VydmljZaIjCgEBMAcG
# BSsOAwIaAxUAwwu+tfgG3rC7RZrxuFO2CmZSfPiggYMwgYCkfjB8MQswCQYDVQQG
# EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG
# A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQg
# VGltZS1TdGFtcCBQQ0EgMjAxMDANBgkqhkiG9w0BAQUFAAIFAOLFEVUwIhgPMjAy
# MDA3MjQxNTUwNDVaGA8yMDIwMDcyNTE1NTA0NVowdzA9BgorBgEEAYRZCgQBMS8w
# LTAKAgUA4sURVQIBADAKAgEAAgIa9QIB/zAHAgEAAgIR9DAKAgUA4sZi1QIBADA2
# BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZCgMCoAowCAIBAAIDB6EgoQowCAIB
# AAIDAYagMA0GCSqGSIb3DQEBBQUAA4GBADwvhE9bln801RR+oEXjtPJXTqtYMakR
# ymItUlO2HRorDqEv2SJR/V/kQjcsqS6ig54bOiKs0Il2fW/s/pi+x1ydJMpOyhM7
# zzqm3acQ9kbYHIDoPWVT/Rq2Oo33Dq380zXENcc0hpLAKF3Cu06SbbNbqu+A/wbI
# z5IClz6kU8kiMYIDDTCCAwkCAQEwgZMwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgT
# Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m
# dCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENB
# IDIwMTACEzMAAAEHfjdomIdaN9YAAAAAAQcwDQYJYIZIAWUDBAIBBQCgggFKMBoG
# CSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQxIgQg6+NCew+c
# OhYIOzhUKofOF7MxtgOvSMWQCMCIWlTFNMgwgfoGCyqGSIb3DQEJEAIvMYHqMIHn
# MIHkMIG9BCBBYvCj4pFkwhumagATn0gLh9fdDNzImQkKNeOtRj/LHjCBmDCBgKR+
# MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS
# ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMT
# HU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAABB343aJiHWjfWAAAA
# AAEHMCIEIGIH6vLdbEFNnxTxBhtIN7CtmhcKy/9m6/xoAA3LHzXUMA0GCSqGSIb3
# DQEBCwUABIIBAKGg3zNulscnGBDlD6Q/U6yLQ5dN3gF9UrprgACiQ1gs/DexU7oC
# hjNZxBnH5RTA/7q9TFf2a1rBydHWVnqXuuQQJ0HuskdpXahxR4y1jboDdGwr7F08
# v/gmPeeUik28Je72QZp5m/R0O61/kMQaDpLO9iPH0Z9iMGfqJonFPDeY4VX8Da2n
# cPY7mrv6YAI+ydZ+mUdBp2yjas7+/N8MntcNtAO0HpWFXQTAmb77RrSssfeZphRA
# mBD+gLx5C3q4uSmuOqaQxUaF0y8FeuetHp0bw2sfce6GlMXJwzTpC6HvXnaVtMy0
# pgzd/KPHW7EgSvmRVKmvwiQGiZBoRG/Gcg8=
# SIG # End signature block