Skip to content

Commit ae2c91c

Browse files
authored
fix: certificate path construction (#135)
Feat: - implemented certificate path construction without using built-in library due to #117 Fix: - imported PFX certificate chain with leaf to root order doesn't work Resolves #136 Signed-off-by: Junjie Gao <junjiegao@microsoft.com> --------- Signed-off-by: Junjie Gao <junjiegao@microsoft.com>
1 parent 585ce0c commit ae2c91c

28 files changed

+1363
-30
lines changed
Lines changed: 48 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,65 @@
1-
using System.Collections.Generic;
21
using System.IO;
32
using System.Security.Cryptography.X509Certificates;
3+
using Notation.Plugin.Protocol;
44
using Xunit;
55

66
namespace Notation.Plugin.AzureKeyVault.Certificate.Tests
77
{
88
public class CertificateChainTests
99
{
1010
[Fact]
11-
public void Build_WithValidLeafAndCertificateBundle_BuildsCertificateChain()
11+
public void Build_Empty()
1212
{
1313
// Arrange
14-
X509Certificate2 leafCert = new X509Certificate2(Path.Combine(Directory.GetCurrentDirectory(), "TestData", "leaf.crt"));
15-
X509Certificate2Collection certificateBundle = CertificateBundle.Create(Path.Combine(Directory.GetCurrentDirectory(), "TestData", "root.crt"));
14+
X509Certificate2Collection certs = new X509Certificate2Collection();
1615

1716
// Act
18-
List<byte[]> certificateChain = CertificateChain.Build(leafCert, certificateBundle);
17+
Assert.Throws<PluginException>(() => CertificateChain.Build(certs));
18+
}
19+
20+
[Theory]
21+
[InlineData("leaf.pem", "leaf.pem", false)] // 1: non-self-signed leaf cert
22+
[InlineData("self_signed_leaf.pem", "self_signed_leaf.pem", true)] // 1: self-signed leaf cert
23+
[InlineData("2self_signed_leaf.pem", "2self_signed_leaf.pem", false)] // 2: duplicated self-signed leaf cert
24+
[InlineData("leaf_unknown.pem", "leaf_unknown.pem", false)] // 2: leaf + unknown cert
25+
[InlineData("leaf_root.pem", "leaf_root.pem", true)] // 2: leaf + root certs
26+
[InlineData("root_leaf.pem", "leaf_root.pem", true)] // 2: unordered root + leaf certs
27+
[InlineData("leaf_root_without_inter.pem", "leaf_root_without_inter.pem", false)] // 3: leaf + root certs without intermediate cert
28+
[InlineData("2root_leaf.pem", "2root_leaf.pem", false)] // 3: duplicated root + leaf certs
29+
[InlineData("DN_loop.pem", "DN_loop.pem", false)] // 3: DN naming loop
30+
[InlineData("root1_leaf_root2.pem", "root1_leaf_root2.pem", false)] // 3: root1 + root2 + leaf certs
31+
[InlineData("root_leaf1_leaf2.pem", "root_leaf1_leaf2.pem", false)] // 3: root + leaf1 + leaf2 certs
32+
[InlineData("leaf_root_unknown.pem", "leaf_root_unknown.pem", false)] // 3: leaf + root + unknown certs
33+
[InlineData("leaf_inter.pem", "leaf_inter.pem", false)] // 2: leaf + intermediate certs
34+
[InlineData("leaf_inter_root.pem", "leaf_inter_root.pem", true)] // 3: leaf + inter + root certs
35+
[InlineData("inter_root_leaf.pem", "leaf_inter_root.pem", true)] // 3: unordered inter + root + leaf certs
36+
[InlineData("leaf_inter_root_otherinter.pem", "leaf_inter_root_otherinter.pem", false)] // 3: leaf + inter + root + other intermediate cert certs
37+
[InlineData("leaf_inter_root_unknown.pem", "leaf_inter_root_unknown.pem", false)] // 4: leaf + inter + root + unknown certs
38+
[InlineData("leaf_inter2_inter1_unknown.pem", "leaf_inter2_inter1_unknown.pem", false)] // 4: leaf + inter2 + inter1 + unknown certs
39+
[InlineData("leaf_inter2_inter1_root.pem", "leaf_inter2_inter1_root.pem", true)] // 4: leaf + inter2 + inter1 + root certs
40+
[InlineData("inter2_inter1_root_leaf.pem", "leaf_inter2_inter1_root.pem", true)] // 4: inter2 + inter1 + root + leaf certs
41+
[InlineData("leaf_inter_root_leaf2_root2.pem", "leaf_inter_root_leaf2_root2.pem", false)] // 5: leaf + inter + root cert chain + leaf2 + root2 cert chain
42+
public void Build(string certName, string targetChainName, bool isValid)
43+
{
44+
// Arrange
45+
X509Certificate2Collection certBundle = CertificateBundle.Create(Path.Combine(Directory.GetCurrentDirectory(), "TestData", "chain", certName));
46+
X509Certificate2Collection targetChain = CertificateBundle.Create(Path.Combine(Directory.GetCurrentDirectory(), "TestData", "chain", targetChainName));
47+
48+
// Act
49+
if (isValid)
50+
{
51+
var certificateChain = CertificateChain.Build(certBundle);
1952

20-
// Assert
21-
Assert.NotNull(certificateChain);
22-
Assert.True(certificateChain.Count > 0);
53+
// Assert
54+
for (int i = 0; i < certificateChain.Count; i++)
55+
{
56+
Assert.Equal(targetChain[i].Thumbprint, certificateChain[i].Thumbprint);
57+
}
58+
}
59+
else
60+
{
61+
Assert.Throws<PluginException>(() => CertificateChain.Build(certBundle));
62+
}
2363
}
2464
}
2565
}

Notation.Plugin.AzureKeyVault.Tests/Notation.Plugin.AzureKeyVault.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
<Content Include="TestData\*.crt" CopyToOutputDirectory="PreserveNewest" />
2525
<Content Include="TestData\*.pem" CopyToOutputDirectory="PreserveNewest" />
2626
<Content Include="TestData\*.pfx" CopyToOutputDirectory="PreserveNewest" />
27+
<Content Include="TestData\chain\*.pem" CopyToOutputDirectory="PreserveNewest" />
2728
</ItemGroup>
2829

2930
<ItemGroup>
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDFzCCAf+gAwIBAgIUcXSzPd52oq3cTzlLBJOoO7fiprkwDQYJKoZIhvcNAQEL
3+
BQAwEjEQMA4GA1UEAwwHVGVzdCBDQTAgFw0yMzA1MDQwNzAwNTVaGA8yMTIzMDQx
4+
MDA3MDA1NVowEjEQMA4GA1UEAwwHVGVzdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD
5+
ggEPADCCAQoCggEBAJoVdivOR5V/Qot+h8rwuHxYF4T0uWFF3XrIqJ3BIw7Ts8Ev
6+
6EyIzc2oHlGOv5aM3IcW4Adn5bZgT0kPSi4ZAyxUVHG9o2TeeGIN6q8skrzP7316
7+
hnB92shXYCgqXwo3KP5uKhbNPRTQ7OVwhGQqLaVrJXLw9rddAnLLG9AtkiuCCi+b
8+
U7ytPeq+vsP04BX1EKMuuErOt+TJLjJ7caYN6sobjmWEIrLcB31rPNuHBGJXXLYP
9+
LXIJ/IcnDRIeq8M28QEOiEKpIb+OR6nojnkJG2zk14RCzrM+TrudPsE9PGUojYOL
10+
qD5iKvexVLkum2zbYEOorl6q9BK+IL88m3Yr6j0CAwEAAaNjMGEwHQYDVR0OBBYE
11+
FFGaS7VNB8EdOojqlqqIpHjS6FggMB8GA1UdIwQYMBaAFFGaS7VNB8EdOojqlqqI
12+
pHjS6FggMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgIEMA0GCSqGSIb3
13+
DQEBCwUAA4IBAQCKJsj78P6r6+NFDHfrKC730JDUeThokcYKVqSLOKm1Sc0gEAx2
14+
wM88fZay2LRTisynt0qFxwUFcrPqlXJeob7bI+aJRGBEqyY/zDkycpEaOyHJFpiN
15+
elrfpQ1bVjTgOpUqmG21URMenxCApbbrBiCeNmeHcIsL/MGLAU2UL1rhjG6NrZLE
16+
IK/qRDNmDdntvn8SOHBg9nsc4u7OkNryKCTfqGwkB2TCNWB40DM6akPSRb5dVh/P
17+
viqpIeyPYMHw+yvs74s6/xTim9/Jy9MROScurGxFb9Vrby7gjd+41WuGf1hUBQ7S
18+
F/83FanddfSmtN/tyCz65FhyVyQJPT9oZATK
19+
-----END CERTIFICATE-----
20+
-----BEGIN CERTIFICATE-----
21+
MIIDFzCCAf+gAwIBAgIUcXSzPd52oq3cTzlLBJOoO7fiprkwDQYJKoZIhvcNAQEL
22+
BQAwEjEQMA4GA1UEAwwHVGVzdCBDQTAgFw0yMzA1MDQwNzAwNTVaGA8yMTIzMDQx
23+
MDA3MDA1NVowEjEQMA4GA1UEAwwHVGVzdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD
24+
ggEPADCCAQoCggEBAJoVdivOR5V/Qot+h8rwuHxYF4T0uWFF3XrIqJ3BIw7Ts8Ev
25+
6EyIzc2oHlGOv5aM3IcW4Adn5bZgT0kPSi4ZAyxUVHG9o2TeeGIN6q8skrzP7316
26+
hnB92shXYCgqXwo3KP5uKhbNPRTQ7OVwhGQqLaVrJXLw9rddAnLLG9AtkiuCCi+b
27+
U7ytPeq+vsP04BX1EKMuuErOt+TJLjJ7caYN6sobjmWEIrLcB31rPNuHBGJXXLYP
28+
LXIJ/IcnDRIeq8M28QEOiEKpIb+OR6nojnkJG2zk14RCzrM+TrudPsE9PGUojYOL
29+
qD5iKvexVLkum2zbYEOorl6q9BK+IL88m3Yr6j0CAwEAAaNjMGEwHQYDVR0OBBYE
30+
FFGaS7VNB8EdOojqlqqIpHjS6FggMB8GA1UdIwQYMBaAFFGaS7VNB8EdOojqlqqI
31+
pHjS6FggMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgIEMA0GCSqGSIb3
32+
DQEBCwUAA4IBAQCKJsj78P6r6+NFDHfrKC730JDUeThokcYKVqSLOKm1Sc0gEAx2
33+
wM88fZay2LRTisynt0qFxwUFcrPqlXJeob7bI+aJRGBEqyY/zDkycpEaOyHJFpiN
34+
elrfpQ1bVjTgOpUqmG21URMenxCApbbrBiCeNmeHcIsL/MGLAU2UL1rhjG6NrZLE
35+
IK/qRDNmDdntvn8SOHBg9nsc4u7OkNryKCTfqGwkB2TCNWB40DM6akPSRb5dVh/P
36+
viqpIeyPYMHw+yvs74s6/xTim9/Jy9MROScurGxFb9Vrby7gjd+41WuGf1hUBQ7S
37+
F/83FanddfSmtN/tyCz65FhyVyQJPT9oZATK
38+
-----END CERTIFICATE-----
39+
-----BEGIN CERTIFICATE-----
40+
MIIDOTCCAiGgAwIBAgIBAjANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAdUZXN0
41+
IENBMCAXDTIzMDUwNDA3MDIwNloYDzIxMjMwNDEwMDcwMjA2WjBDMREwDwYDVQQK
42+
Ewhub3RhdGlvbjELMAkGA1UECBMCV0ExCzAJBgNVBAYTAlVTMRQwEgYDVQQDEwtU
43+
ZXN0LVNpZ25lcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOZenQqj
44+
cimpyADt540GvlXsAwYqAyFpXmJDVsWImNMvHt+kaWabK1C5HJjTlXqGE9wIg1oY
45+
YG20pqbFKpPwULTBA7AkZvQipvMbkrqp9fJQUDi32HBLM4yIp1rYWciHIlKnv/Rk
46+
tSbtNxg6ES50xLJl/V0YFwgxT9JayVYk6D5BEEgXffpZsMUtuGbRe0QsHED09jaX
47+
onCvSV+sIpn0zAF4ahcWRseoTtfLAUfk5cJpFqwYvf3eIfvjWx7fvltpcEjfBDTj
48+
8TxPXNlst9lgn3X5z2dr2dbltXOgNzX/NfLh7MbAe3uM0AE5fkrQ4CoIm/9tFuhT
49+
nEv28Mk3WJQquX0CAwEAAaNnMGUwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoG
50+
CCsGAQUFBwMDMB0GA1UdDgQWBBTyceghcpaJ6QYyDNhHjIq2UkWmYzAfBgNVHSME
51+
GDAWgBRRmku1TQfBHTqI6paqiKR40uhYIDANBgkqhkiG9w0BAQsFAAOCAQEAlzNY
52+
LsYcV3hk22ZDFzGj8mZg6TjhHaejMgfOEm88UAUSjeHLaathV38sYHfqTwPwHjtf
53+
lGGoSqzhiWasQ4Le4wRPraD/kFhRMRiUJ3YmW9EwwpXRDc7YexypbqVIKr/48gb3
54+
oMtUMYEarYlAOfWfMaMPHvXBlAIOq1oGLtuZ12doNJ3NqyqPoyLXNyjwYETnq+I/
55+
6qZQ4R1prdOwCdBuay6vn4lSrD45WxdjdWTDpAbYoT6voje+nHtH21EIxo1iWMpD
56+
jzwp93CVbVxQnVf+dvSthHrUDPah+WPQ8yu4qhITxOrrAggCzBee3sK6WknERShf
57+
aIZK0TY5G9C8rxUIhg==
58+
-----END CERTIFICATE-----
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDRzCCAi+gAwIBAgIUNXnCwLi1z10bqyxXvXa8tZrKW6kwDQYJKoZIhvcNAQEL
3+
BQAwKjEPMA0GA1UECgwGUmF0aWZ5MRcwFQYDVQQDDA5SYXRpZnkgUm9vdCBDQTAg
4+
Fw0yMzA5MDExMDUwMzZaGA8yMTIzMDgwODEwNTAzNlowKjEPMA0GA1UECgwGUmF0
5+
aWZ5MRcwFQYDVQQDDA5SYXRpZnkgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD
6+
ggEPADCCAQoCggEBAKgG13pRD+ZN1OaHwRDGd5aMCYFocr7stN7hCBoqD2qDit2n
7+
a46IkQsBdEp+EoslFDzG627exL0h57OTp4T3bREAnNPgpzQcSHfiheerW5/iIP2m
8+
NFswfc4bwlhWBzlKcWXChzp7WX40H1DdjipktFyFgWhTwU7HJBW8smPO5NYGs2Yk
9+
68BIvS5RHhdlAFu88KvEbOrrfBptT1DBAL4CIS36TMQznZbu6FxAAXDfYKbE/4SL
10+
mpHUsAoOZVPer0sWOVEe7YVp1RZMwVzNnLPsb8gjlKxJwpYjeC0d6Il4b5hVgppy
11+
lu+rkxXc+ZYUccnWBy9yxHPsU65KdAxRo9YwbecCAwEAAaNjMGEwHQYDVR0OBBYE
12+
FJSoL6jK75sG1UbURor0xcxhjTX6MB8GA1UdIwQYMBaAFJSoL6jK75sG1UbURor0
13+
xcxhjTX6MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgIEMA0GCSqGSIb3
14+
DQEBCwUAA4IBAQB9oc5382B22ltr856jXxtHJVMDJ0JoZ5jZSFSfvJCked7gpW5p
15+
SA5OSL++0HLa9naM7wAETFw3lMERJ8zDvl9cVi9NFXdvk6aIiPYDnhbviM6pr3d9
16+
NzvumM1tNtZG8OP5hVNUHvZEvijInBRLaJQKvSunZwosoMcIL27RFMicteOnNBy6
17+
My81rbZDRNhnEU/FX4fnyMH3+Eyv2eMEj9cHPOS7aANq3Y8sNveaW85e+4GPwfU7
18+
XuWqDGLusupgY2yulrBPqJp7JpgkIPhY/wkZ8ttBymdxmTGGdFH0hDqhy1TF6Ujd
19+
9JbDe0j+cgU9C70fY+tCH6qBkDqYD/OUUOtt
20+
-----END CERTIFICATE-----
21+
-----BEGIN CERTIFICATE-----
22+
MIIDRzCCAi+gAwIBAgIUNXnCwLi1z10bqyxXvXa8tZrKW6kwDQYJKoZIhvcNAQEL
23+
BQAwKjEPMA0GA1UECgwGUmF0aWZ5MRcwFQYDVQQDDA5SYXRpZnkgUm9vdCBDQTAg
24+
Fw0yMzA5MDExMDUwMzZaGA8yMTIzMDgwODEwNTAzNlowKjEPMA0GA1UECgwGUmF0
25+
aWZ5MRcwFQYDVQQDDA5SYXRpZnkgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD
26+
ggEPADCCAQoCggEBAKgG13pRD+ZN1OaHwRDGd5aMCYFocr7stN7hCBoqD2qDit2n
27+
a46IkQsBdEp+EoslFDzG627exL0h57OTp4T3bREAnNPgpzQcSHfiheerW5/iIP2m
28+
NFswfc4bwlhWBzlKcWXChzp7WX40H1DdjipktFyFgWhTwU7HJBW8smPO5NYGs2Yk
29+
68BIvS5RHhdlAFu88KvEbOrrfBptT1DBAL4CIS36TMQznZbu6FxAAXDfYKbE/4SL
30+
mpHUsAoOZVPer0sWOVEe7YVp1RZMwVzNnLPsb8gjlKxJwpYjeC0d6Il4b5hVgppy
31+
lu+rkxXc+ZYUccnWBy9yxHPsU65KdAxRo9YwbecCAwEAAaNjMGEwHQYDVR0OBBYE
32+
FJSoL6jK75sG1UbURor0xcxhjTX6MB8GA1UdIwQYMBaAFJSoL6jK75sG1UbURor0
33+
xcxhjTX6MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgIEMA0GCSqGSIb3
34+
DQEBCwUAA4IBAQB9oc5382B22ltr856jXxtHJVMDJ0JoZ5jZSFSfvJCked7gpW5p
35+
SA5OSL++0HLa9naM7wAETFw3lMERJ8zDvl9cVi9NFXdvk6aIiPYDnhbviM6pr3d9
36+
NzvumM1tNtZG8OP5hVNUHvZEvijInBRLaJQKvSunZwosoMcIL27RFMicteOnNBy6
37+
My81rbZDRNhnEU/FX4fnyMH3+Eyv2eMEj9cHPOS7aANq3Y8sNveaW85e+4GPwfU7
38+
XuWqDGLusupgY2yulrBPqJp7JpgkIPhY/wkZ8ttBymdxmTGGdFH0hDqhy1TF6Ujd
39+
9JbDe0j+cgU9C70fY+tCH6qBkDqYD/OUUOtt
40+
-----END CERTIFICATE-----
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDITCCAgmgAwIBAgIUPK45Qm7RR4wZoQjscXpVXKut7M4wDQYJKoZIhvcNAQEL
3+
BQAwGDEWMBQGA1UEAwwNcmF0aWZ5LmludGVyMTAeFw0yMzA5MDQxNDEyMjNaFw0y
4+
MzEwMDQxNDEyMjNaMBgxFjAUBgNVBAMMDXJhdGlmeS5pbnRlcjIwggEiMA0GCSqG
5+
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDeIlcvhTD/aXBKPuP0Cx9v4bFjJMmT88Qq
6+
Ua3z1IGn7QLXprwoOHJzHm36xwEnb64UnfZHBkpddiiFllcPMaKo+QLQ3lvO8AX6
7+
P5tgQyyfnkDJ9Et8jFMMal4JygOl8HX6RrqiQakU0P7tnwoE8ghvLBncfDfwHS3H
8+
vevZFdDi51KJIt2ZOnnoA+oOqVWtUx2H9CRHeEF2OaVMnQemo+9sDDtFrFALPdVZ
9+
coWWHJdA6g7xgb+OLtydQg1cJJdAlUiWwAV6CxlgS3lGZAfZV6enU2/fJNIszEcA
10+
jZnTxbaao6aY/UF5kZ6BPbNGyuDBA57qDrStpzovJPct5e2nAL3jAgMBAAGjYzBh
11+
MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgIEMB0GA1UdDgQWBBTYyOol
12+
YvPBcOz4gzyEpvjjrt7trDAfBgNVHSMEGDAWgBRc6cYN2Kng0oWFBKgTVePd8dBU
13+
UzANBgkqhkiG9w0BAQsFAAOCAQEAYLMHCP3QNE4HBf35y/k9kEeBvyFBh7IFC4P0
14+
jyyhmwTiX9YRD5jiV/n2dYSXXuMDuJd52oq/drgUD3dINJ0ZCYlhkEN+5oNbqsTl
15+
ISOjeBCjIPLyCCQAUOF4WlZqaUu/Q42deHpAok73mdcNIFK0XRwkFF8dAGQ8hcU1
16+
gYsJbm1SuUcUqBvqomzQAHyGyAboOmFZiS4ePFqJMkt5L47Vhw2AZY+xn0GgAous
17+
laaA+TpptKvO0hNV8kYoJ084KYyMU7bsKsrA3nbkAnSvTfx5a8fD+5eLf0fQZb4j
18+
L9j6ijZ8oi+W0KDgPfFhtDMMPHqSmqh0mZ9HGR3VewQUR+F1Og==
19+
-----END CERTIFICATE-----
20+
-----BEGIN CERTIFICATE-----
21+
MIIDITCCAgmgAwIBAgIUI1tC37NFchWmsNpzPrEVhA4SSHMwDQYJKoZIhvcNAQEL
22+
BQAwGDEWMBQGA1UEAwwNcmF0aWZ5LmludGVyMjAeFw0yMzA5MDQxNDIyNTNaFw0y
23+
MzEwMDQxNDIyNTNaMBgxFjAUBgNVBAMMDXJhdGlmeS5pbnRlcjEwggEiMA0GCSqG
24+
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYhjxclbLrIrTUHXgVh86V3IFsurejjG6F
25+
2O3h0GofQAy7V11AUr8egJXfBMYGJ5nECwMpjFsgG2PPFtxDZfvg2709pXAQ6zQL
26+
DpW2c1xAHxBAf7Hfgsy1lLQtMRWDuKQIgp4V13CHxK0mS3QuqTZlNdygbnI4SNvb
27+
C61oY+hUJbgBdBHuxRnGC5OY2+tqCO3bPFlHQ7jn5hSb/0h+3x1g1hqEtBkrd2ub
28+
AdgDMsTCqxkKOH4ococxLxerIJEq/4/vSPoX+cqarldEEL1pTOyLJtJHn7mVJ3Xa
29+
btTriUkUR+jNtbSCjQKOju8I8ZJq4GMzXqaIJ+3XYU9gAazuXdwJAgMBAAGjYzBh
30+
MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgIEMB0GA1UdDgQWBBSR3Hpr
31+
qkqxfJ6kqYw2qly8t/1CZzAfBgNVHSMEGDAWgBRWBu/fCpHWdX6wVEDrgWDhU1Kv
32+
2DANBgkqhkiG9w0BAQsFAAOCAQEAgN+sLwG87Ko1qykJIDnOTcVDHvqOU01klTgo
33+
GAD/k+KrNinOnQ8z0kMFHXmWYeGs2sWYn+0XHYgufr9//0Zo3bthXS1t9XB6qzyM
34+
hOiVVMcJWcjQBzJtyZANk7cGF9rrVcvjzd0vxECwaehcaP8b//HonCqoOwjnN8Oq
35+
4rZe0H1e110nnamva8mS/6kcwZp/nukIATp2L1A2gniysboRPdnSTMeVwj1XEj3I
36+
XZanrQ6UQLsM9YFwBCpyUVYuCk0FDH7+q9Eg+xT1NBloiZ1wbuFYOUIukbqtpc9D
37+
/0HZyZHdILZc7jAwKK3GhqmKGyRaCPKSbnrSRUjSwYNdsWWcUQ==
38+
-----END CERTIFICATE-----
39+
-----BEGIN CERTIFICATE-----
40+
MIIDITCCAgmgAwIBAgIUIsazvzFvmJkutImL9Idp6CCmfsEwDQYJKoZIhvcNAQEL
41+
BQAwGDEWMBQGA1UEAwwNcmF0aWZ5LmludGVyMjAgFw0yMzA5MDQxNDIyNTRaGA8y
42+
MTIzMDgxMTE0MjI1NFowGTEXMBUGA1UEAwwOcmF0aWZ5LmRlZmF1bHQwggEiMA0G
43+
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsQdWar/Cr32J0nDglXP04PLm8jiEC
44+
U5gYui0hsX+Rs8z7CNvmruBC1Lftg/AJQgcgWQNi2EIbVA6APb4N3n/IeaREV0MW
45+
naAcz4Tv+YZAHwaBw96aynAOs2SbXB/xU1DcW+9LqNJhFkHLMLwPOMS1r+B7Nu2S
46+
G/Uq87pMXvcxtkT/RoHYs9x7aEnIKDKKA20iTBwKo3UeSxPMDzUqnSilZ9LS/oxF
47+
V5D51LjSxtz/WcnrXyE/q/mY4vtH3eF8onB4Mh2DM/MS+HXPi6wn0KVHX4/e7jZe
48+
qfkgoL5doAAv+54Aq0lHPJ9ZKepIQZu5MWtYgIxeUmkIG7Df2iYvprFdAgMBAAGj
49+
YDBeMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMB0GA1UdDgQWBBT5kbQ0
50+
Y0VnA7K47Ijs6qe9dJo7ajAfBgNVHSMEGDAWgBTYyOolYvPBcOz4gzyEpvjjrt7t
51+
rDANBgkqhkiG9w0BAQsFAAOCAQEAjxZSppgaCJG23Z7KPLuOWQr6ALTiWQ7L+fOY
52+
8MTtmujageV+uevbNK8h/B7qXitJ68DYSSCqLp4uO1W+PGC3nKwzt4szL2y2tlqd
53+
cLklzAYhKqWZ/e3v/7exdqogxAtyjoa6P6a7nvnNiMEvSSAb9lgz7gGXI2rs6D/c
54+
TUuiFldxflaqxOGbG2S4k2MNCDV1FhG3vmMLN4DCd26rHxtm/onE76fVN18BdV9y
55+
AefsGWB4337WW9m0O1n5k/Xwvi4NXfow5o3d9jbKtIqUI9U6oCw6gkqnWYbPW9wi
56+
cqWlFtqZE0ioM8snDyV+WHz04m6xjJ/F5vhgZh2/Fb8/+yh9Wg==
57+
-----END CERTIFICATE-----

Notation.Plugin.AzureKeyVault.Tests/TestData/chain/empty.pem

Whitespace-only changes.
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDITCCAgmgAwIBAgIUEOAI0YVqF+ekkskGAq5+dJ3LUkowDQYJKoZIhvcNAQEL
3+
BQAwGDEWMBQGA1UEAwwNcmF0aWZ5LmludGVyMTAeFw0yMzA5MDQwNjIwMjFaFw0y
4+
MzEwMDQwNjIwMjFaMBgxFjAUBgNVBAMMDXJhdGlmeS5pbnRlcjIwggEiMA0GCSqG
5+
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDfjb0zculL/tVGxg2hFXvDUdJ6BmPwSCq2
6+
lJiH1SoRBFIbSXRk+MZFvk4dEK4rcIfh96UQr3EsnMEHUjHzI3oJ5PR2upS+vD+2
7+
IlLGW/SPtZgEDkSh6c9uGU9lx/DVLO2ZZrhckMq2IxpMiTM3TocTKwzoO+ccY805
8+
LXVKEhbqk8PyO33Jhv2JDZtC8/NfQVQdkUTRUh0cGtoRG+PeI8EA0iU4JhJ9YWoy
9+
wzuCrsqhhkBXwGDIkbq7a2avupL7ENirItm20LN//hny1ZjwBLE0eqO2VpbXn+gE
10+
M8Xgp6ijGh2XPrWU+YbLv5K89hQ5wi61QjUXo0DNFTgREjaNFuETAgMBAAGjYzBh
11+
MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgIEMB0GA1UdDgQWBBRp0AmE
12+
b91kIObTWLSZYLCWTSaO1zAfBgNVHSMEGDAWgBReRIer4BfYN1IofVtvc92eEAPE
13+
izANBgkqhkiG9w0BAQsFAAOCAQEARdQO0CspA3reD1Ws8Bj0sMaubNsieyup+zYa
14+
BjuTCsqGLve50kR5WRmq5ayqeBOYtB1+ksjZc7MEv4aysk+6+uJTgIToQhb/scGs
15+
om/lJQnXWZHOohniw/4gA2Y4RfT2BBI9CO7OEjVdcHgXhweADWV72Yp6/3TOlIVP
16+
7THycrUi8Pz0WpQJLnN0fq9PpvgG6cvhjWiIEoC4T8IJK8pIPx1CPT/WkBIE8cS3
17+
5yIDsZbJOQ/M3yRRd7f/nmGPHAdn+fId5T2jX+Hh+isQhVas57yzZjokYIVy/dOw
18+
QZeR2p/LsEKb+ebqOzeMNU3Ir/KUdohrxescBw8xW2JR2XXVIA==
19+
-----END CERTIFICATE-----
20+
-----BEGIN CERTIFICATE-----
21+
MIIDMzCCAhugAwIBAgIUY9SnCSWXwc5Jrqj+mLKnzwASHywwDQYJKoZIhvcNAQEL
22+
BQAwKjEPMA0GA1UECgwGUmF0aWZ5MRcwFQYDVQQDDA5SYXRpZnkgUm9vdCBDQTAe
23+
Fw0yMzA5MDQwNjIwMjBaFw0yMzEwMDQwNjIwMjBaMBgxFjAUBgNVBAMMDXJhdGlm
24+
eS5pbnRlcjEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzeV+1gfkx
25+
BIVdsntcs0QOJSp2qC0W2K241EaimPcVxFmDmKweJtuX1WOHqmQHoRdYVYqlFP8r
26+
GNc0jTxF1dizhGaC7W/I+KThyWOwa9r0JDrSSLap/piTrM0hE+OHCL7cbCI0znr3
27+
Z+MsiXA41oTZeZd7H9U3tObgiWFaUqoaEbNTN0f20RgHC8QZrFNHxj0OphtgA7RG
28+
xqAt5qHD35XqR5skYyKGk9lNy6B4sJ+5kCOmXKvI7wsJpEcO2rvsdGpaSpnHX/V/
29+
pC/BaurvFnbI4mUkTdETX30+KtpIgexbqg33xvKt3BUo4waCaVmV3AK0EE7MxInm
30+
4aWGwguG1kZ9AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
31+
AgIEMB0GA1UdDgQWBBReRIer4BfYN1IofVtvc92eEAPEizAfBgNVHSMEGDAWgBQo
32+
IQk1tdF2EtspOFPCremuCntvrTANBgkqhkiG9w0BAQsFAAOCAQEATUU0EZ/FPecm
33+
jSvI7DJ2wlN0SyHuBumf0w+iXXPu5IE6x5G6zZss7dvbem1QGm6UcMDyeM6deAt+
34+
LHPIUpqK6eRflolMbrvHU1CAHzrCOAyBof7vGJxPPYOgmMykF+e/QSNmpi2mukM1
35+
DeG4Ao1099C/a3P2LcT5gdocGLNrcDywE2t///TeLMUvjrQ0YmOR6TzcZYYUxgAI
36+
yGY4yNmfsk3DaacN+sB9e0IlsIGyDnOWETSLvvJ5vhiAo3CVjgjjiUVWVUwHpEJp
37+
AXQH+fcao23DLhVFr00+lM9IzhzAVmSRRd+qK7bScuTviDeBoh1cv4wEsH+XQTdH
38+
fFYB6pyUsg==
39+
-----END CERTIFICATE-----
40+
-----BEGIN CERTIFICATE-----
41+
MIIDRzCCAi+gAwIBAgIUXUWcqeMN5dXBgjcLwUmaD1PZf3kwDQYJKoZIhvcNAQEL
42+
BQAwKjEPMA0GA1UECgwGUmF0aWZ5MRcwFQYDVQQDDA5SYXRpZnkgUm9vdCBDQTAg
43+
Fw0yMzA5MDQwNjIwMjBaGA8yMTIzMDgxMTA2MjAyMFowKjEPMA0GA1UECgwGUmF0
44+
aWZ5MRcwFQYDVQQDDA5SYXRpZnkgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD
45+
ggEPADCCAQoCggEBALD9s+pF4us6SDnFNXwzwiRHFecSIaLfh/epdRws0jDd8ly0
46+
v4Y000OQcqGwc3f888H3uLYJScuUlNmOfKpHhCpi5wDLMIZzxK7UfV//9R8Xon5L
47+
QcGw0tPeyMp6IxNduLxe5wbiLjuwsPXsYluxdBCJCgsO3tMl/rvCopjrI6yxeR8K
48+
UZK1OrsTOENDBbc9+jAQ81hVR6fY24EQ4bVaqxCH+ZbtafpQBpH6NOkCVen29JgM
49+
DWKqBJvq0NtqdyfgiE6WV0nhNspGGqk+VMSUG2Jb55EAEQt1UU/Us77KVMs32+kr
50+
/EIqq2JbuVRmRaAocrhZSxabg3z0qokrv+qdXZUCAwEAAaNjMGEwHQYDVR0OBBYE
51+
FCghCTW10XYS2yk4U8Kt6a4Ke2+tMB8GA1UdIwQYMBaAFCghCTW10XYS2yk4U8Kt
52+
6a4Ke2+tMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgIEMA0GCSqGSIb3
53+
DQEBCwUAA4IBAQCkgHj4OOAmp5QAMAe09qYNTiwyHgK3tYmiuc9+Brl8lcuYeRQb
54+
nBllI9cFZ226AziVpy6rbfKNzh/WpfG0gEVMOa3NnOfJI3gqa6ajrHRSC3Yc8LDO
55+
VaLUdUB+Tjnw/dKvPfcoGyn5UK0UHJJwBOmlpDiY57qpLG2qUROW6V56SJ+MDtVQ
56+
XR8sQxbXTVNIOrnLiUYML8UKWwWcnbR4FK6ShZDHoLAofGJ68wguRGFLhLX2lOE3
57+
C0FcP7R0b9cGYTeQMKSbYvb4628ltRGWsJYA8opunN/c6ydsj9+DYx1FOcH+OLon
58+
Yy4fIsb33S0MS/lKz0HrELZevVY1Eeu7i5Yg
59+
-----END CERTIFICATE-----
60+
-----BEGIN CERTIFICATE-----
61+
MIIDITCCAgmgAwIBAgIUcIJtSZ/A8Mswp/c8Pv3OB9CIAycwDQYJKoZIhvcNAQEL
62+
BQAwGDEWMBQGA1UEAwwNcmF0aWZ5LmludGVyMjAgFw0yMzA5MDQwNjIwMjFaGA8y
63+
MTIzMDgxMTA2MjAyMVowGTEXMBUGA1UEAwwOcmF0aWZ5LmRlZmF1bHQwggEiMA0G
64+
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCY+15WH6uY+YBx/wGZfcO0m2ApcpwB
65+
dKudpjB72IYaRbL2lxQK05U0F3n0H+oaqABx1QbUWVW/DfC5MNkbs4CQFp2TlIIc
66+
R7D+CmbCvJ+03HKU6L7CLjLDwisyYSFJw3rW8qhvM1OTDX1Icjas8MS2ijsW4hJ/
67+
T+pM84gCD8IrzdRrRsPSHcP/lMafzdADaeKC2GLsJ4FXXFnmzW0XiyzG9HVEjHP3
68+
XjliDNHQDE4ePfRsmubRkl3zfFlt8Nfp/6W2/5fLGaz2v41IxzxjeKwWvZM4UQQg
69+
OVEKe/+OHMHUfeXWXhj8UDhq8uXHVIPMO2bbtJ2TLRnPQ+gx8L8yIIylAgMBAAGj
70+
YDBeMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMB0GA1UdDgQWBBQvZODV
71+
Nkeng9kqb0jHYZtf+XWbHTAfBgNVHSMEGDAWgBRp0AmEb91kIObTWLSZYLCWTSaO
72+
1zANBgkqhkiG9w0BAQsFAAOCAQEAF7w0oztrfiWPLacWVEHq54vryuT9QnHJZKON
73+
f/jiYviSIsdnSo2/Hi8jSusmCW+Z49sfIdhUUqlSqNMDCpnmIGsyaF5pWaqUNYEC
74+
StVJ8X1BxbybrzZg7ZOdhXW3RwGTeGEB1WikyzJoBHHrpCm3DPn/kyvCpKJ8CrG7
75+
Pe9Xpocm+pqm2aZjyAuHiiOrz1tNx1HKl2vi/vC+0R64aSMWBzR38XhDsoes3MEs
76+
oN2HA8g6DZXNVERqo4KGfHavh8nDYV2bhASNdLryjoSaYZe/pUJrIrIriUf52Wo7
77+
N3aSWoinYUuAOwTYwm5MPxW+JU1PbBJ0/AVcXb6RYWSmhp1ImA==
78+
-----END CERTIFICATE-----

0 commit comments

Comments
 (0)