@@ -18,6 +18,7 @@ import FoundationEssentials
18
18
import Foundation
19
19
#endif
20
20
import XCTest
21
+ import Testing
21
22
import SwiftASN1
22
23
@testable import X509
23
24
import Crypto
@@ -761,3 +762,59 @@ final class CertificateDERTests: XCTestCase {
761
762
XCTAssertNoThrow ( try decoded. extensions. nameConstraints)
762
763
}
763
764
}
765
+
766
+ @Suite ( " CertificatePrivateKey DER-encoded tests " )
767
+ struct CertificatePrivateKeyDEREncodedTests {
768
+ @Suite ( " Using ECDSA " )
769
+ struct ECDSA {
770
+ @Test ( " P256 " )
771
+ func testP256( ) throws {
772
+ let key = P256 . Signing. PrivateKey ( )
773
+ let derBytes = Array ( key. derRepresentation)
774
+ let parsedKey = try Certificate . PrivateKey ( derBytes: derBytes)
775
+ try #require( parsedKey != nil )
776
+ #expect( parsedKey. backing == . p256( key) )
777
+ }
778
+
779
+ @Test ( " P384 " )
780
+ func testP384( ) throws {
781
+ let key = P384 . Signing. PrivateKey ( )
782
+ let derBytes = Array ( key. derRepresentation)
783
+ let parsedKey = try Certificate . PrivateKey ( derBytes: derBytes)
784
+ try #require( parsedKey != nil )
785
+ #expect( parsedKey. backing == . p384( key) )
786
+ }
787
+
788
+ @Test ( " P521 " )
789
+ func testP521( ) throws {
790
+ let key = P521 . Signing. PrivateKey ( )
791
+ let derBytes = Array ( key. derRepresentation)
792
+ let parsedKey = try Certificate . PrivateKey ( derBytes: derBytes)
793
+ try #require( parsedKey != nil )
794
+ #expect( parsedKey. backing == . p521( key) )
795
+ }
796
+ }
797
+
798
+ @Test ( " Using ED25519 " )
799
+ func testED25519( ) throws {
800
+ let key = Curve25519 . Signing. PrivateKey ( )
801
+ let derBytes = key. derRepresentation
802
+ let parsedKey = try Certificate . PrivateKey ( derBytes: derBytes)
803
+ try #require( parsedKey != nil )
804
+ #expect( parsedKey. backing == . ed25519( key) )
805
+ }
806
+
807
+ @Test ( " Using RSA " )
808
+ func testRSA( ) throws {
809
+ // Unlike other algorithms, RSA's bytes representation is not in PKCS#8 format, so we have
810
+ // to bridge it by first serialising the key as a PKCS#8 PEM document, and then getting
811
+ // its DER bytes.
812
+ let key = try _CryptoExtras. _RSA. Signing. PrivateKey ( keySize: . bits2048)
813
+ let pkcs8 = key. pkcs8PEMRepresentation
814
+ let pemDoc = try PEMDocument ( pemString: pkcs8)
815
+ let derBytes = pemDoc. derBytes
816
+ let parsedKey = try Certificate . PrivateKey ( derBytes: derBytes)
817
+ try #require( parsedKey != nil )
818
+ #expect( parsedKey. backing == . rsa( key) )
819
+ }
820
+ }
0 commit comments