@@ -27,6 +27,108 @@ public CertTests(ITestOutputHelper output)
27
27
_log = output ;
28
28
}
29
29
30
+ [ Fact ]
31
+ public static void PrivateKey_FromCertificate_CanExportPrivate_ECDsa ( )
32
+ {
33
+ using ( ECDsa ca = ECDsa . Create ( ECCurve . NamedCurves . nistP256 ) )
34
+ {
35
+ CertificateRequest req = new ( "CN=potatos" , ca , HashAlgorithmName . SHA256 ) ;
36
+
37
+ using ( X509Certificate2 cert = req . CreateSelfSigned ( DateTimeOffset . Now , DateTimeOffset . Now . AddDays ( 3 ) ) )
38
+ using ( ECDsa certKey = cert . GetECDsaPrivateKey ( ) )
39
+ {
40
+ ECParameters certParameters = certKey . ExportParameters ( true ) ;
41
+ ECParameters originalParameters = ca . ExportParameters ( true ) ;
42
+ AssertExtensions . SequenceEqual ( originalParameters . D , certParameters . D ) ;
43
+ }
44
+ }
45
+ }
46
+
47
+ [ Fact ]
48
+ public static void PrivateKey_FromCertificate_CanExportPrivate_RSA ( )
49
+ {
50
+ using ( RSA ca = RSA . Create ( 2048 ) )
51
+ {
52
+ CertificateRequest req = new ( "CN=potatos" , ca , HashAlgorithmName . SHA256 , RSASignaturePadding . Pkcs1 ) ;
53
+
54
+ using ( X509Certificate2 cert = req . CreateSelfSigned ( DateTimeOffset . Now , DateTimeOffset . Now . AddDays ( 3 ) ) )
55
+ using ( RSA certKey = cert . GetRSAPrivateKey ( ) )
56
+ {
57
+ RSAParameters certParameters = certKey . ExportParameters ( true ) ;
58
+ RSAParameters originalParameters = ca . ExportParameters ( true ) ;
59
+ AssertExtensions . SequenceEqual ( originalParameters . P , certParameters . P ) ;
60
+ AssertExtensions . SequenceEqual ( originalParameters . Q , certParameters . Q ) ;
61
+ }
62
+ }
63
+ }
64
+
65
+ [ Fact ]
66
+ [ SkipOnPlatform ( PlatformSupport . MobileAppleCrypto , "DSA is not available" ) ]
67
+ public static void PrivateKey_FromCertificate_CanExportPrivate_DSA ( )
68
+ {
69
+ DSAParameters originalParameters = DSATestData . GetDSA1024Params ( ) ;
70
+
71
+ using ( DSA ca = DSA . Create ( ) )
72
+ {
73
+ ca . ImportParameters ( originalParameters ) ;
74
+ DSAX509SignatureGenerator gen = new DSAX509SignatureGenerator ( ca ) ;
75
+ X500DistinguishedName dn = new X500DistinguishedName ( "CN=potatos" ) ;
76
+
77
+ CertificateRequest req = new CertificateRequest (
78
+ dn ,
79
+ gen . PublicKey ,
80
+ HashAlgorithmName . SHA1 ) ;
81
+
82
+ using ( X509Certificate2 cert = req . Create ( dn , gen , DateTimeOffset . Now , DateTimeOffset . Now . AddDays ( 3 ) , [ 1 , 2 , 3 ] ) )
83
+ using ( X509Certificate2 certWithKey = cert . CopyWithPrivateKey ( ca ) )
84
+ using ( DSA certKey = certWithKey . GetDSAPrivateKey ( ) )
85
+ {
86
+ DSAParameters certParameters = certKey . ExportParameters ( true ) ;
87
+ AssertExtensions . SequenceEqual ( originalParameters . X , certParameters . X ) ;
88
+ }
89
+ }
90
+ }
91
+
92
+ [ Fact ]
93
+ public static void PrivateKey_FromCertificate_CanExportPrivate_ECDiffieHellman ( )
94
+ {
95
+ using ( ECDsa ca = ECDsa . Create ( ECCurve . NamedCurves . nistP256 ) )
96
+ using ( ECDiffieHellman ecdh = ECDiffieHellman . Create ( ECCurve . NamedCurves . nistP256 ) )
97
+ {
98
+ CertificateRequest issuerRequest = new CertificateRequest (
99
+ new X500DistinguishedName ( "CN=root" ) ,
100
+ ca ,
101
+ HashAlgorithmName . SHA256 ) ;
102
+
103
+ issuerRequest . CertificateExtensions . Add (
104
+ new X509BasicConstraintsExtension ( true , false , 0 , true ) ) ;
105
+
106
+ CertificateRequest request = new CertificateRequest (
107
+ new X500DistinguishedName ( "CN=potato" ) ,
108
+ new PublicKey ( ecdh ) ,
109
+ HashAlgorithmName . SHA256 ) ;
110
+
111
+ request . CertificateExtensions . Add (
112
+ new X509BasicConstraintsExtension ( false , false , 0 , true ) ) ;
113
+ request . CertificateExtensions . Add (
114
+ new X509KeyUsageExtension ( X509KeyUsageFlags . KeyAgreement , true ) ) ;
115
+
116
+ DateTimeOffset notBefore = DateTimeOffset . UtcNow ;
117
+ DateTimeOffset notAfter = notBefore . AddDays ( 30 ) ;
118
+ byte [ ] serial = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ] ;
119
+
120
+ using ( X509Certificate2 issuer = issuerRequest . CreateSelfSigned ( notBefore , notAfter ) )
121
+ using ( X509Certificate2 cert = request . Create ( issuer , notBefore , notAfter , serial ) )
122
+ using ( X509Certificate2 certWithKey = cert . CopyWithPrivateKey ( ecdh ) )
123
+ using ( ECDiffieHellman certKey = certWithKey . GetECDiffieHellmanPrivateKey ( ) )
124
+ {
125
+ ECParameters certParameters = certKey . ExportParameters ( true ) ;
126
+ ECParameters originalParameters = ecdh . ExportParameters ( true ) ;
127
+ AssertExtensions . SequenceEqual ( originalParameters . D , certParameters . D ) ;
128
+ }
129
+ }
130
+ }
131
+
30
132
[ Fact ]
31
133
public static void PublicPrivateKey_IndependentLifetimes_ECDsa ( )
32
134
{
0 commit comments