DSCClassResources/CipherSuites/CipherSuites.psm1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
$resourceModuleRootPath = Split-Path -Path (Split-Path $PSScriptRoot -Parent) -Parent
$modulesRootPath = Join-Path -Path $resourceModuleRootPath -ChildPath 'Modules'
Import-Module -Name (Join-Path -Path $modulesRootPath -ChildPath 'SchannelResourceHelper\SchannelResourceHelper.psm1') -Force

enum Ensure {
    Absent
    Present
}

enum Exists {
    Yes
    No
}

[DscResource()]
class CipherSuites {
    [DscProperty(Key)]
    [ValidateSet("Yes")]
    [string] $IsSingleInstance

    [DscProperty(Mandatory)]
    [System.String[]] $CipherSuitesOrder
    
    [DscProperty()]
    [Ensure] $Ensure = [Ensure]::Present

    [DscProperty(NotConfigurable)]
    [Exists] $Exists

    [CipherSuites] Get() {
        $itemKey = 'HKLM:\SOFTWARE\Policies\Microsoft\Cryptography\Configuration\SSL\00010002'
        $item = Get-ItemProperty -Path $itemKey -ErrorAction SilentlyContinue

        if($item) {
            $this.Exists = [Ensure]::Yes
            $this.CipherSuitesOrder = (Get-ItemPropertyValue -Path $itemKey -Name Functions -ErrorAction SilentlyContinue).Split(',')
        }
        else {
            $this.Exists = [Ensure]::No
        }

        return $this
    }
  
    [void] Set() {
        if($this.Ensure -eq [Ensure]::Present) {
            $itemKey = 'HKLM:\SOFTWARE\Policies\Microsoft\Cryptography\Configuration\SSL\00010002' 
            $cipherSuitesAsString = [string]::Join(',', $this.CipherSuitesOrder)
            New-Item $itemKey -Force 
            New-ItemProperty -Path $itemKey -Name 'Functions' -Value $cipherSuitesAsString -PropertyType 'String' -Force | Out-Null
        }
        else {
            $itemKey = 'HKLM:\SOFTWARE\Policies\Microsoft\Cryptography\Configuration\SSL\' 
            Remove-Item $itemKey -Force
        }
    }

    [bool] Test() {
        $itemKey = 'HKLM:\SOFTWARE\Policies\Microsoft\Cryptography\Configuration\SSL\00010002'
        $item = Get-ItemProperty -Path $itemKey -ErrorAction SilentlyContinue

        if($item) {
            $CurrentCipherSuitesOrder = Get-ItemPropertyValue -Path $itemKey -Name Functions -ErrorAction SilentlyContinue
        }
        else {
            $CurrentCipherSuitesOrder = ""
        }

        if($this.Ensure -eq [Ensure]::Present) {
            if($item -and $CurrentCipherSuitesOrder -eq [string]::join(',', $this.CipherSuitesOrder)) {
                return $true
            }
            else {
                return $false
            }
        }
        else {
            if($item) {
                return $false
            }
            else {
                return $true
            }
        }
    }
}