@@ -265,8 +265,8 @@ private static boolean hasContentType(Header header) {
265265 return header != null && Strings .hasText (header .getContentType ());
266266 }
267267
268- private void verifySignature (final TokenizedJwt tokenized , final JwsHeader jwsHeader , final String alg ,
269- @ SuppressWarnings ("deprecation" ) SigningKeyResolver resolver , Claims claims , Payload payload ) {
268+ private byte [] verifySignature (final TokenizedJwt tokenized , final JwsHeader jwsHeader , final String alg ,
269+ @ SuppressWarnings ("deprecation" ) SigningKeyResolver resolver , Claims claims , Payload payload ) {
270270
271271 Assert .notNull (resolver , "SigningKeyResolver instance cannot be null." );
272272
@@ -354,6 +354,8 @@ private void verifySignature(final TokenizedJwt tokenized, final JwsHeader jwsHe
354354 } finally {
355355 Streams .reset (payloadStream );
356356 }
357+
358+ return signature ;
357359 }
358360
359361 @ Override
@@ -485,7 +487,7 @@ private void verifySignature(final TokenizedJwt tokenized, final JwsHeader jwsHe
485487 }
486488
487489 byte [] iv = null ;
488- byte [] tag = null ;
490+ byte [] digest = null ; // either JWE AEAD tag or JWS signature after Base64Url-decoding
489491 if (tokenized instanceof TokenizedJwe ) {
490492
491493 TokenizedJwe tokenizedJwe = (TokenizedJwe ) tokenized ;
@@ -521,8 +523,8 @@ private void verifySignature(final TokenizedJwt tokenized, final JwsHeader jwsHe
521523 base64Url = base64UrlDigest ;
522524 //guaranteed to be non-empty via the `alg` + digest check above:
523525 Assert .hasText (base64Url , "JWE AAD Authentication Tag cannot be null or empty." );
524- tag = decode (base64Url , "JWE AAD Authentication Tag" );
525- if (Bytes .isEmpty (tag )) {
526+ digest = decode (base64Url , "JWE AAD Authentication Tag" );
527+ if (Bytes .isEmpty (digest )) {
526528 String msg = "Compact JWE strings must always contain an AAD Authentication Tag." ;
527529 throw new MalformedJwtException (msg );
528530 }
@@ -564,7 +566,7 @@ private void verifySignature(final TokenizedJwt tokenized, final JwsHeader jwsHe
564566 // TODO: add encProvider(Provider) builder method that applies to this request only?
565567 InputStream ciphertext = payload .toInputStream ();
566568 ByteArrayOutputStream plaintext = new ByteArrayOutputStream (8192 );
567- DecryptAeadRequest dreq = new DefaultDecryptAeadRequest (ciphertext , cek , aad , iv , tag );
569+ DecryptAeadRequest dreq = new DefaultDecryptAeadRequest (ciphertext , cek , aad , iv , digest );
568570 encAlg .decrypt (dreq , plaintext );
569571 payload = new Payload (plaintext .toByteArray (), header .getContentType ());
570572
@@ -574,7 +576,7 @@ private void verifySignature(final TokenizedJwt tokenized, final JwsHeader jwsHe
574576 // not using a signing key resolver, so we can verify the signature before reading the payload, which is
575577 // always safer:
576578 JwsHeader jwsHeader = Assert .stateIsInstance (JwsHeader .class , header , "Not a JwsHeader. " );
577- verifySignature (tokenized , jwsHeader , alg , new LocatingKeyResolver (this .keyLocator ), null , payload );
579+ digest = verifySignature (tokenized , jwsHeader , alg , new LocatingKeyResolver (this .keyLocator ), null , payload );
578580 integrityVerified = true ; // no exception means signature verified
579581 }
580582
@@ -635,26 +637,28 @@ private void verifySignature(final TokenizedJwt tokenized, final JwsHeader jwsHe
635637 }
636638 }
637639
640+ // =============== Post-SKR Signature Check =================
641+ if (hasDigest && signingKeyResolver != null ) { // TODO: remove for 1.0
642+ // A SigningKeyResolver has been configured, and due to it's API, we have to verify the signature after
643+ // parsing the body. This can be a security risk, so it needs to be removed before 1.0
644+ JwsHeader jwsHeader = Assert .stateIsInstance (JwsHeader .class , header , "Not a JwsHeader. " );
645+ digest = verifySignature (tokenized , jwsHeader , alg , this .signingKeyResolver , claims , payload );
646+ //noinspection UnusedAssignment
647+ integrityVerified = true ; // no exception means verified successfully
648+ }
649+
638650 Jwt <?, ?> jwt ;
639651 Object body = claims != null ? claims : payloadBytes ;
640652 if (header instanceof JweHeader ) {
641- jwt = new DefaultJwe <>((JweHeader ) header , body , iv , tag );
653+ jwt = new DefaultJwe <>((JweHeader ) header , body , iv , digest );
642654 } else if (hasDigest ) {
643655 JwsHeader jwsHeader = Assert .isInstanceOf (JwsHeader .class , header , "JwsHeader required." );
644- jwt = new DefaultJws <>(jwsHeader , body , base64UrlDigest .toString ());
656+ jwt = new DefaultJws <>(jwsHeader , body , digest , base64UrlDigest .toString ());
645657 } else {
646658 //noinspection rawtypes
647659 jwt = new DefaultJwt (header , body );
648660 }
649661
650- // =============== Signature =================
651- if (hasDigest && signingKeyResolver != null ) { // TODO: remove for 1.0
652- // A SigningKeyResolver has been configured, and due to it's API, we have to verify the signature after
653- // parsing the body. This can be a security risk, so it needs to be removed before 1.0
654- JwsHeader jwsHeader = Assert .stateIsInstance (JwsHeader .class , header , "Not a JwsHeader. " );
655- verifySignature (tokenized , jwsHeader , alg , this .signingKeyResolver , claims , payload );
656- }
657-
658662 final boolean allowSkew = this .allowedClockSkewMillis > 0 ;
659663
660664 //since 0.3:
0 commit comments