DSCClassResources/CipherSuites/CipherSuites.psm1

$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
            }
        }
    }
}