@@ -715,6 +715,237 @@ public function getTokenVariants(): array
715715 ];
716716 }
717717
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+
718949 private function validateHeader (HeaderInterface $ expected , HeaderInterface $ actual ): void
719950 {
720951 if (count ($ expected ->getParameters ()) > count ($ actual ->getParameters ())) {
0 commit comments