@@ -818,6 +818,123 @@ final class SigningTests: XCTestCase {
818
818
}
819
819
#endif
820
820
821
+ func testCMS1_0_0ExtractSigningEntity( ) async throws {
822
+ let keyAndCertChain = try tsc_await { self . ecTestKeyAndCertChain ( callback: $0) }
823
+ let signingIdentity = SwiftSigningIdentity (
824
+ certificate: try Certificate ( keyAndCertChain. leafCertificate) ,
825
+ privateKey: try Certificate
826
+ . PrivateKey ( P256 . Signing. PrivateKey ( derRepresentation: keyAndCertChain. privateKey) )
827
+ )
828
+ let content = Array ( " per aspera ad astra " . utf8)
829
+
830
+ let signatureFormat = SignatureFormat . cms_1_0_0
831
+ let signature = try SignatureProvider . sign (
832
+ content: content,
833
+ identity: signingIdentity,
834
+ intermediateCertificates: keyAndCertChain. intermediateCertificates,
835
+ format: signatureFormat,
836
+ observabilityScope: ObservabilitySystem . NOOP
837
+ )
838
+
839
+ let verifierConfiguration = VerifierConfiguration (
840
+ trustedRoots: [ keyAndCertChain. rootCertificate] ,
841
+ includeDefaultTrustStore: false ,
842
+ certificateExpiration: . disabled,
843
+ certificateRevocation: . disabled
844
+ )
845
+
846
+ let signingEntity = try await SignatureProvider . extractSigningEntity (
847
+ signature: signature,
848
+ format: signatureFormat,
849
+ verifierConfiguration: verifierConfiguration
850
+ )
851
+
852
+ guard case . unrecognized( let name, let organizationalUnit, let organization) = signingEntity else {
853
+ return XCTFail ( " Expected SigningEntity.unrecognized but got \( signingEntity) " )
854
+ }
855
+ XCTAssertEqual ( " Test (EC) leaf " , name)
856
+ XCTAssertEqual ( " Test (EC) org unit " , organizationalUnit)
857
+ XCTAssertEqual ( " Test (EC) org " , organization)
858
+ }
859
+
860
+ func testCMS1_0_0ExtractSigningEntityWithSelfSignedCertificate( ) async throws {
861
+ let keyAndCertChain = try tsc_await { self . ecSelfSignedTestKeyAndCertChain ( callback: $0) }
862
+ let signingIdentity = SwiftSigningIdentity (
863
+ certificate: try Certificate ( keyAndCertChain. leafCertificate) ,
864
+ privateKey: try Certificate
865
+ . PrivateKey ( P256 . Signing. PrivateKey ( derRepresentation: keyAndCertChain. privateKey) )
866
+ )
867
+ let content = Array ( " per aspera ad astra " . utf8)
868
+
869
+ let signatureFormat = SignatureFormat . cms_1_0_0
870
+ let signature = try SignatureProvider . sign (
871
+ content: content,
872
+ identity: signingIdentity,
873
+ intermediateCertificates: keyAndCertChain. intermediateCertificates,
874
+ format: signatureFormat,
875
+ observabilityScope: ObservabilitySystem . NOOP
876
+ )
877
+
878
+ let verifierConfiguration = VerifierConfiguration (
879
+ trustedRoots: [ keyAndCertChain. rootCertificate] ,
880
+ includeDefaultTrustStore: false ,
881
+ certificateExpiration: . disabled,
882
+ certificateRevocation: . disabled
883
+ )
884
+
885
+ let signingEntity = try await SignatureProvider . extractSigningEntity (
886
+ signature: signature,
887
+ format: signatureFormat,
888
+ verifierConfiguration: verifierConfiguration
889
+ )
890
+
891
+ guard case . unrecognized( let name, let organizationalUnit, let organization) = signingEntity else {
892
+ return XCTFail ( " Expected SigningEntity.unrecognized but got \( signingEntity) " )
893
+ }
894
+ XCTAssertEqual ( " Test (EC) " , name)
895
+ XCTAssertEqual ( " Test (EC) org unit " , organizationalUnit)
896
+ XCTAssertEqual ( " Test (EC) org " , organization)
897
+ }
898
+
899
+ func testCMS1_0_0ExtractSigningEntityWithUntrustedCertificate( ) async throws {
900
+ let keyAndCertChain = try tsc_await { self . ecTestKeyAndCertChain ( callback: $0) }
901
+ let signingIdentity = SwiftSigningIdentity (
902
+ certificate: try Certificate ( keyAndCertChain. leafCertificate) ,
903
+ privateKey: try Certificate
904
+ . PrivateKey ( P256 . Signing. PrivateKey ( derRepresentation: keyAndCertChain. privateKey) )
905
+ )
906
+ let content = Array ( " per aspera ad astra " . utf8)
907
+
908
+ let signatureFormat = SignatureFormat . cms_1_0_0
909
+ let signature = try SignatureProvider . sign (
910
+ content: content,
911
+ identity: signingIdentity,
912
+ intermediateCertificates: keyAndCertChain. intermediateCertificates,
913
+ format: signatureFormat,
914
+ observabilityScope: ObservabilitySystem . NOOP
915
+ )
916
+
917
+ let verifierConfiguration = VerifierConfiguration (
918
+ trustedRoots: [ ] , // trust store is empty
919
+ includeDefaultTrustStore: false ,
920
+ certificateExpiration: . disabled,
921
+ certificateRevocation: . disabled
922
+ )
923
+
924
+ do {
925
+ _ = try await SignatureProvider . extractSigningEntity (
926
+ signature: signature,
927
+ format: signatureFormat,
928
+ verifierConfiguration: verifierConfiguration
929
+ )
930
+ XCTFail ( " expected error " )
931
+ } catch {
932
+ guard case SigningError . certificateNotTrusted = error else {
933
+ return XCTFail ( " Expected error to be SigningError.certificateNotTrusted but got \( error) " )
934
+ }
935
+ }
936
+ }
937
+
821
938
private func ecTestKeyAndCertChain( callback: ( Result < KeyAndCertChain , Error > ) -> Void ) {
822
939
do {
823
940
try fixture ( name: " Signing " , createGitRepo: false ) { fixturePath in
0 commit comments