Skip to content

Commit 8b7ae9b

Browse files
authored
Fix/connectedk8s ps5 (#20603)
* Create RSAHelper.ps1 * Update New-AzConnectedKubernetes.ps1 * Add try-catch and update function parameters * Update New-AzConnectedKubernetes.ps1
1 parent f3f65e2 commit 8b7ae9b

File tree

2 files changed

+167
-2
lines changed

2 files changed

+167
-2
lines changed

src/ConnectedKubernetes/custom/New-AzConnectedKubernetes.ps1

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -349,8 +349,19 @@ function New-AzConnectedKubernetes {
349349
#Endregion
350350

351351
$RSA = [System.Security.Cryptography.RSA]::Create(4096)
352-
$AgentPublicKey = [System.Convert]::ToBase64String($RSA.ExportRSAPublicKey())
353-
$AgentPrivateKey = "-----BEGIN RSA PRIVATE KEY-----`n" + [System.Convert]::ToBase64String($RSA.ExportRSAPrivateKey()) + "`n-----END RSA PRIVATE KEY-----"
352+
if ($PSVersionTable.PSVersion.Major -eq 5) {
353+
try {
354+
. "$PSScriptRoot/../utils/RSAHelper.ps1"
355+
$AgentPublicKey = ExportRSAPublicKeyBase64($RSA)
356+
$AgentPrivateKey = ExportRSAPrivateKeyBase64($RSA)
357+
} catch {
358+
Write-Error "Unable to generate RSA keys"
359+
throw
360+
}
361+
} else {
362+
$AgentPublicKey = [System.Convert]::ToBase64String($RSA.ExportRSAPublicKey())
363+
$AgentPrivateKey = "-----BEGIN RSA PRIVATE KEY-----`n" + [System.Convert]::ToBase64String($RSA.ExportRSAPrivateKey()) + "`n-----END RSA PRIVATE KEY-----"
364+
}
354365

355366
$HelmChartPath = Join-Path -Path $ChartExportPath -ChildPath 'azure-arc-k8sagents'
356367
if (Test-Path Env:HELMCHART) {
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
function ExportRSAPrivateKeyBase64{
2+
param(
3+
[Parameter(Mandatory)]
4+
[System.Security.Cryptography.RSA]
5+
$RSA
6+
)
7+
process{
8+
$RSAParams = $RSA.ExportParameters(1)
9+
[byte]$Sequence = 0x30
10+
[byte[]]$Version =(0x00)
11+
$stream = [System.IO.MemoryStream]::new()
12+
$writer = [System.IO.BinaryWriter]::new($stream)
13+
$writer.Write($Sequence); # SEQUENCE
14+
$innerStream = [System.IO.MemoryStream]::new()
15+
$innerWriter = [System.IO.BinaryWriter]::new($innerStream)
16+
17+
EncodeIntegerBigEndian $innerWriter $Version
18+
EncodeIntegerBigEndian $innerWriter $RSAParams.Modulus
19+
EncodeIntegerBigEndian $innerWriter $RSAParams.Exponent
20+
EncodeIntegerBigEndian $innerWriter $RSAParams.D
21+
EncodeIntegerBigEndian $innerWriter $RSAParams.P
22+
EncodeIntegerBigEndian $innerWriter $RSAParams.Q
23+
EncodeIntegerBigEndian $innerWriter $RSAParams.DP
24+
EncodeIntegerBigEndian $innerWriter $RSAParams.DQ
25+
EncodeIntegerBigEndian $innerWriter $RSAParams.InverseQ
26+
27+
$length = ([int]($innerStream.Length))
28+
EncodeLength $writer $length
29+
$writer.Write($innerStream.GetBuffer(), 0, $length)
30+
31+
$base64 = [Convert]::ToBase64String($stream.GetBuffer(), 0, ([int]($stream.Length)))
32+
33+
$offset = 0
34+
$line_length = 64
35+
36+
$sb = [System.Text.StringBuilder]::new()
37+
[void]$sb.AppendLine("-----BEGIN RSA PRIVATE KEY-----")
38+
while ($offset -lt $base64.Length) {
39+
$line_end = [Math]::Min($offset + $line_length, $base64.Length)
40+
[void]$sb.AppendLine($base64.Substring($offset, $line_end - $offset))
41+
$offset = $line_end
42+
}
43+
44+
[void]$sb.AppendLine("-----END RSA PRIVATE KEY-----")
45+
46+
return $sb.ToString()
47+
}
48+
}
49+
50+
function ExportRSAPublicKeyBase64{
51+
param(
52+
[Parameter(Mandatory)]
53+
[System.Security.Cryptography.RSA]
54+
$RSA
55+
)
56+
process{
57+
$RSAParams = $RSA.ExportParameters(0)
58+
[byte]$Sequence = 0x30
59+
$stream = [System.IO.MemoryStream]::new()
60+
$writer = [System.IO.BinaryWriter]::new($stream)
61+
$writer.Write($Sequence); # SEQUENCE
62+
$innerStream = [System.IO.MemoryStream]::new()
63+
$innerWriter = [System.IO.BinaryWriter]::new($innerStream)
64+
EncodeIntegerBigEndian $innerWriter $RSAParams.Modulus
65+
EncodeIntegerBigEndian $innerWriter $RSAParams.Exponent
66+
67+
$length = ([int]($innerStream.Length))
68+
EncodeLength $writer $length
69+
$writer.Write($innerStream.GetBuffer(), 0, $length)
70+
71+
$base64 = [Convert]::ToBase64String($stream.GetBuffer(), 0, ([int]($stream.Length)))
72+
73+
$offset = 0
74+
$line_length = 64
75+
76+
$sb = [System.Text.StringBuilder]::new()
77+
78+
while ($offset -lt $base64.Length) {
79+
$line_end = [Math]::Min($offset + $line_length, $base64.Length)
80+
[void]$sb.AppendLine($base64.Substring($offset, $line_end - $offset))
81+
$offset = $line_end
82+
}
83+
84+
return $sb.ToString()
85+
}
86+
}
87+
88+
function EncodeLength{
89+
param(
90+
[System.IO.BinaryWriter]$stream,
91+
[int]$length
92+
)
93+
process{
94+
[byte]$bytex80 = 0x80
95+
if($length -lt 0){
96+
throw "Length must be non-negative"
97+
}
98+
if($length -lt $bytex80){
99+
$stream.Write(([byte]$length))
100+
}
101+
else{
102+
$temp = $length
103+
$bytesRequired = 0;
104+
while ($temp -gt 0) {
105+
$temp = $temp -shr 8
106+
$bytesRequired++
107+
}
108+
109+
[byte]$byteToWrite = $bytesRequired -bor $bytex80
110+
$stream.Write($byteToWrite)
111+
$iValue = ($bytesRequired - 1)
112+
[byte]$0ffByte = 0xff
113+
for ($i = $iValue; $i -ge 0; $i--) {
114+
[byte]$byteToWrite = ($length -shr (8 * $i) -band $0ffByte)
115+
$stream.Write($byteToWrite )
116+
}
117+
}
118+
}
119+
}
120+
121+
function EncodeIntegerBigEndian{
122+
param(
123+
[System.IO.BinaryWriter]$stream,
124+
[byte[]]$value,
125+
[bool]$forceUnsigned = $true
126+
)
127+
process{
128+
[byte]$Integer = 0x02
129+
130+
$stream.Write($Integer); # INTEGER
131+
$prefixZeros = 0
132+
for ($i = 0; $i -lt $value.Length; $i++) {
133+
if ($value[$i] -ne 0){break}
134+
$prefixZeros++
135+
}
136+
if(($value.Length - $prefixZeros) -eq 0){
137+
EncodeLength $stream 1
138+
$stream.Write(([byte]0))
139+
}
140+
else{
141+
[byte]$newByte = 0x7f
142+
if(($forceUnsigned) -AND ($value[$prefixZeros] -gt $newByte)){
143+
EncodeLength $stream ($value.Length - $prefixZeros +1)
144+
$stream.Write(([byte]0))
145+
}
146+
else{
147+
EncodeLength $stream ($value.Length - $prefixZeros)
148+
}
149+
for ($i = $prefixZeros; $i -lt $value.Length; $i++) {
150+
$stream.Write($value[$i])
151+
}
152+
}
153+
}
154+
}

0 commit comments

Comments
 (0)