@@ -715,6 +715,237 @@ public function getTokenVariants(): array
715
715
];
716
716
}
717
717
718
+ /**
719
+ * Test reading headers.
720
+ *
721
+ * @param JwtInterface $tokenData
722
+ * @param EncryptionSettingsInterface $settings
723
+ * @return void
724
+ *
725
+ * @dataProvider getJwtsForHeaders
726
+ */
727
+ public function testReadHeaders (JwtInterface $ tokenData , EncryptionSettingsInterface $ settings ): void
728
+ {
729
+ $ token = $ this ->manager ->create ($ tokenData , $ settings );
730
+ $ headers = $ this ->manager ->readHeaders ($ token );
731
+ /** @var HeaderInterface[] $expectedHeaders */
732
+ $ expectedHeaders = [];
733
+ if ($ tokenData instanceof JwsInterface) {
734
+ $ expectedHeaders = $ tokenData ->getProtectedHeaders ();
735
+ if ($ tokenData ->getUnprotectedHeaders ()) {
736
+ $ expectedHeaders = array_merge ($ expectedHeaders , $ tokenData ->getUnprotectedHeaders ());
737
+ }
738
+ } elseif ($ tokenData instanceof JweInterface) {
739
+ $ expectedHeaders [] = $ tokenData ->getProtectedHeader ();
740
+ if ($ tokenData ->getSharedUnprotectedHeader ()) {
741
+ $ expectedHeaders [] = $ tokenData ->getSharedUnprotectedHeader ();
742
+ }
743
+ if ($ tokenData ->getPerRecipientUnprotectedHeaders ()) {
744
+ $ expectedHeaders = array_merge ($ expectedHeaders , $ tokenData ->getPerRecipientUnprotectedHeaders ());
745
+ }
746
+ } elseif ($ tokenData instanceof UnsecuredJwtInterface) {
747
+ $ expectedHeaders = $ tokenData ->getProtectedHeaders ();
748
+ if ($ tokenData ->getUnprotectedHeaders ()) {
749
+ $ expectedHeaders = array_merge ($ expectedHeaders , $ tokenData ->getUnprotectedHeaders ());
750
+ }
751
+ }
752
+
753
+ foreach ($ headers as $ header ) {
754
+ $ this ->verifyAgainstHeaders ($ expectedHeaders , $ header );
755
+ }
756
+ }
757
+
758
+ public function getJwtsForHeaders (): array
759
+ {
760
+
761
+ /** @var JwkFactory $jwkFactory */
762
+ $ jwkFactory = Bootstrap::getObjectManager ()->get (JwkFactory::class);
763
+
764
+ $ flatJws = new Jws (
765
+ [
766
+ new JwsHeader (
767
+ [
768
+ new PrivateHeaderParameter ('custom-header ' , 'value ' ),
769
+ new PrivateHeaderParameter ('another-custom-header ' , 'value2 ' )
770
+ ]
771
+ )
772
+ ],
773
+ new ClaimsPayload (
774
+ [
775
+ new PrivateClaim ('custom-claim ' , 'value ' ),
776
+ new PrivateClaim ('custom-claim2 ' , 'value2 ' ),
777
+ new PrivateClaim ('custom-claim3 ' , 'value3 ' ),
778
+ new IssuedAt (new \DateTimeImmutable ()),
779
+ new Issuer ('magento.com ' )
780
+ ]
781
+ ),
782
+ null
783
+ );
784
+ $ flatJsonJws = new Jws (
785
+ [
786
+ new JwsHeader (
787
+ [
788
+ new PrivateHeaderParameter ('custom-header ' , 'value ' ),
789
+ new Critical (['magento ' ])
790
+ ]
791
+ )
792
+ ],
793
+ new ClaimsPayload (
794
+ [
795
+ new PrivateClaim ('custom-claim ' , 'value ' ),
796
+ new PrivateClaim ('custom-claim2 ' , 'value2 ' ),
797
+ new ExpirationTime (new \DateTimeImmutable ())
798
+ ]
799
+ ),
800
+ [
801
+ new JwsHeader (
802
+ [
803
+ new PublicHeaderParameter ('public-header ' , 'magento ' , 'public-value ' )
804
+ ]
805
+ )
806
+ ]
807
+ );
808
+ $ jsonJws = new Jws (
809
+ [
810
+ new JwsHeader (
811
+ [
812
+ new PrivateHeaderParameter ('test ' , true ),
813
+ new PublicHeaderParameter ('test2 ' , 'magento ' , 'value ' )
814
+ ]
815
+ ),
816
+ new JwsHeader (
817
+ [
818
+ new PrivateHeaderParameter ('test3 ' , true ),
819
+ new PublicHeaderParameter ('test4 ' , 'magento ' , 'value-another ' )
820
+ ]
821
+ )
822
+ ],
823
+ new ClaimsPayload ([
824
+ new Issuer ('magento.com ' ),
825
+ new JwtId (),
826
+ new Subject ('stuff ' )
827
+ ]),
828
+ [
829
+ new JwsHeader ([new PrivateHeaderParameter ('public ' , 'header1 ' )]),
830
+ new JwsHeader ([new PrivateHeaderParameter ('public2 ' , 'header ' )])
831
+ ]
832
+ );
833
+ $ flatJwe = new Jwe (
834
+ new JweHeader (
835
+ [
836
+ new PrivateHeaderParameter ('test ' , true ),
837
+ new PublicHeaderParameter ('test2 ' , 'magento ' , 'value ' )
838
+ ]
839
+ ),
840
+ null ,
841
+ null ,
842
+ new ClaimsPayload (
843
+ [
844
+ new PrivateClaim ('custom-claim ' , 'value ' ),
845
+ new PrivateClaim ('custom-claim2 ' , 'value2 ' , true ),
846
+ new PrivateClaim ('custom-claim3 ' , 'value3 ' ),
847
+ new IssuedAt (new \DateTimeImmutable ()),
848
+ new Issuer ('magento.com ' )
849
+ ]
850
+ )
851
+ );
852
+ $ jsonFlatJwe = new Jwe (
853
+ new JweHeader (
854
+ [
855
+ new PrivateHeaderParameter ('test ' , true ),
856
+ new PublicHeaderParameter ('test2 ' , 'magento ' , 'value ' )
857
+ ]
858
+ ),
859
+ null ,
860
+ [
861
+ new JweHeader (
862
+ [
863
+ new PrivateHeaderParameter ('mage ' , 'test ' )
864
+ ]
865
+ )
866
+ ],
867
+ new ClaimsPayload (
868
+ [
869
+ new PrivateClaim ('custom-claim ' , 'value ' ),
870
+ new PrivateClaim ('custom-claim2 ' , 'value2 ' , true ),
871
+ new PrivateClaim ('custom-claim3 ' , 'value3 ' ),
872
+ new IssuedAt (new \DateTimeImmutable ()),
873
+ new Issuer ('magento.com ' )
874
+ ]
875
+ )
876
+ );
877
+ $ jsonJwe = new Jwe (
878
+ new JweHeader (
879
+ [
880
+ new PrivateHeaderParameter ('test ' , true ),
881
+ new PublicHeaderParameter ('test2 ' , 'magento ' , 'value ' )
882
+ ]
883
+ ),
884
+ new JweHeader (
885
+ [
886
+ new PrivateHeaderParameter ('mage ' , 'test ' )
887
+ ]
888
+ ),
889
+ [
890
+ new JweHeader ([new PrivateHeaderParameter ('tst ' , 2 )]),
891
+ new JweHeader ([new PrivateHeaderParameter ('test2 ' , 3 )])
892
+ ],
893
+ new ClaimsPayload (
894
+ [
895
+ new PrivateClaim ('custom-claim ' , 'value ' ),
896
+ new PrivateClaim ('custom-claim2 ' , 'value2 ' , true ),
897
+ new PrivateClaim ('custom-claim3 ' , 'value3 ' ),
898
+ new IssuedAt (new \DateTimeImmutable ()),
899
+ new Issuer ('magento.com ' )
900
+ ]
901
+ )
902
+ );
903
+ $ flatUnsecured = new UnsecuredJwt (
904
+ [
905
+ new JwsHeader (
906
+ [
907
+ new PrivateHeaderParameter ('test ' , true ),
908
+ new PublicHeaderParameter ('test2 ' , 'magento ' , 'value ' )
909
+ ]
910
+ )
911
+ ],
912
+ new ClaimsPayload (
913
+ [
914
+ new PrivateClaim ('custom-claim ' , 'value ' ),
915
+ new PrivateClaim ('custom-claim2 ' , 'value2 ' , true ),
916
+ new PrivateClaim ('custom-claim3 ' , 'value3 ' ),
917
+ new IssuedAt (new \DateTimeImmutable ()),
918
+ new Issuer ('magento.com ' )
919
+ ]
920
+ ),
921
+ null
922
+ );
923
+
924
+ $ sharedSecret = random_bytes (2048 );
925
+ $ jwsJwk = $ jwkFactory ->createHs256 ($ sharedSecret );
926
+ $ jweJwk = $ jwkFactory ->createA128KW ($ sharedSecret );
927
+ $ jwsSettings = new JwsSignatureJwks ($ jwsJwk );
928
+ $ jsonJwsSettings = new JwsSignatureJwks (new JwkSet ([$ jwsJwk , $ jwsJwk ]));
929
+ $ jweJwkSettings = new JweEncryptionJwks (
930
+ $ jweJwk ,
931
+ JweEncryptionSettingsInterface::CONTENT_ENCRYPTION_ALGO_A128GCM
932
+ );
933
+ $ jsonJweSettings = new JweEncryptionJwks (
934
+ new JwkSet ([$ jweJwk , $ jweJwk ]),
935
+ JweEncryptionSettingsInterface::CONTENT_ENCRYPTION_ALGO_A128GCM
936
+ );
937
+
938
+ return [
939
+ 'jws ' => [$ flatJws , $ jwsSettings ],
940
+ 'flat-jws ' => [$ flatJsonJws , $ jwsSettings ],
941
+ 'json-jws ' => [$ jsonJws , $ jsonJwsSettings ],
942
+ 'jwe ' => [$ flatJwe , $ jweJwkSettings ],
943
+ 'flat-jwe ' => [$ jsonFlatJwe , $ jweJwkSettings ],
944
+ 'json-jwe ' => [$ jsonJwe , $ jsonJweSettings ],
945
+ 'none-jws ' => [$ flatUnsecured , new NoEncryption ()]
946
+ ];
947
+ }
948
+
718
949
private function validateHeader (HeaderInterface $ expected , HeaderInterface $ actual ): void
719
950
{
720
951
if (count ($ expected ->getParameters ()) > count ($ actual ->getParameters ())) {
0 commit comments