Private/ConvertTo-Base64Url.ps1

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
function ConvertTo-Base64Url {
    [CmdletBinding()]
    [OutputType('System.String')]
    param(
        [Parameter(ParameterSetName='String',Mandatory,Position=0,ValueFromPipeline)]
        [AllowEmptyString()]
        [string]$Text,
        [Parameter(ParameterSetName='String')]
        [switch]$FromBase64,
        [Parameter(ParameterSetName='Bytes',Mandatory,Position=0)]
        [AllowEmptyCollection()]
        [byte[]]$Bytes
    )

    Process {

        if (!$FromBase64) {

            # get a byte array from the input string
            if ($PSCmdlet.ParameterSetName -eq 'String') {
                $Bytes = [Text.Encoding]::UTF8.GetBytes($Text)
            }

            # standard base64 encoder
            $s = [Convert]::ToBase64String($Bytes)

        } else {
            # $Text is already Base64 encoded, we just need the Url'ized version
            $s = $Text
        }

        # remove trailing '='s
        $s = $s.Split('=')[0]

        # 62nd and 63rd char of encoding
        $s = $s.Replace('+','-').Replace('/','_')

        return $s

    }

}