[java-oidc-common] branch main updated: Allow local JOSE credential resolver resolve credentials without kid
Phil Smart
philip.smart at jisc.ac.uk
Fri Feb 10 12:42:13 UTC 2023
This is an automated email from the git hooks/post-receive script.
philsmart pushed a commit to branch main
in repository java-oidc-common.
View the commit online:
http://git.shibboleth.net/view/?p=java-oidc-common.git;a=commit;h=eef1755e1db8120f6d671463856fc90148591e9d
The following commit(s) were added to refs/heads/main by this push:
new eef1755 Allow local JOSE credential resolver resolve credentials without kid
eef1755 is described below
commit eef1755e1db8120f6d671463856fc90148591e9d
Author: Phil Smart <philip.smart at jisc.ac.uk>
AuthorDate: Fri Feb 10 12:42:08 2023 +0000
Allow local JOSE credential resolver resolve credentials without kid
---
.../impl/LocalJOSEObjectCredentialResolver.java | 17 ++++++++++++----
.../LocalJOSEObjectCredentialResolverTest.java | 23 ++++++++++++++++++++++
2 files changed, 36 insertions(+), 4 deletions(-)
diff --git a/oidc-common-crypto-impl/src/main/java/net/shibboleth/oidc/security/credential/impl/LocalJOSEObjectCredentialResolver.java b/oidc-common-crypto-impl/src/main/java/net/shibboleth/oidc/security/credential/impl/LocalJOSEObjectCredentialResolver.java
index 53eadd8..b1b4cd2 100644
--- a/oidc-common-crypto-impl/src/main/java/net/shibboleth/oidc/security/credential/impl/LocalJOSEObjectCredentialResolver.java
+++ b/oidc-common-crypto-impl/src/main/java/net/shibboleth/oidc/security/credential/impl/LocalJOSEObjectCredentialResolver.java
@@ -79,6 +79,8 @@ import net.shibboleth.utilities.java.support.resolver.ResolverException;
* </ol>
* Adds either 'kid' or 'public key' to the criteria set sent to the local credential resolver for resolution.
*
+ * @since 2.2.0
+ *
*/
public class LocalJOSEObjectCredentialResolver extends BasicJOSEObjectCredentialResolver {
@@ -122,6 +124,7 @@ public class LocalJOSEObjectCredentialResolver extends BasicJOSEObjectCredential
for (final Credential inputCred : credentials) {
if (isLocalCredential(inputCred)) {
+ // TODO this is impossible in the JOSE case implemented here?
log.debug("Input credential was local, including in results");
results.add(inputCred);
} else if (inputCred.getPublicKey() != null) {
@@ -134,6 +137,7 @@ public class LocalJOSEObjectCredentialResolver extends BasicJOSEObjectCredential
// Also filter public key by keyID if one exists in the 'kid' parameter.
// This is also caught upstream, so add in-case resolver needs it and filter
// anyway.
+ log.trace("Adding 'kid' value '{}' to credential resolver", kid);
criteria.add(new EvaluableKeyIDCredentialCriterion(kid));
}
final List<Credential> localCredentials = resolveLocalCredentialsByCriteria(criteria);
@@ -145,16 +149,21 @@ public class LocalJOSEObjectCredentialResolver extends BasicJOSEObjectCredential
}
}
- // If 'kid' exists in the header, also resolve by kid (in-case there were no input credentials)
- if (kid != null) {
+ // If we have not found credentials by matching those from the JOSE object, try and find local credentials only
+ if (results.isEmpty()) {
final CriteriaSet criteria = new CriteriaSet();
- criteria.add(new EvaluableKeyIDCredentialCriterion(kid));
+ // If 'kid' exists in the header, also resolve by kid for efficiency.
+ if (kid != null) {
+ log.trace("Adding 'kid' value '{}' to credential resolver", kid);
+ criteria.add(new EvaluableKeyIDCredentialCriterion(kid));
+ }
final List<Credential> localCredentials = resolveLocalCredentialsByCriteria(criteria);
- log.trace("Found {} credential(s) from 'kid' criterion alone", localCredentials.size());
+ log.trace("Found {} local credential(s)", localCredentials.size());
// There is no point in adding a duplicate credential, so filter out those already resolved
results.addAll(filterAlreadyContained(results, localCredentials));
}
+
credentials.clear();
credentials.addAll(results);
}
diff --git a/oidc-common-crypto-impl/src/test/java/net/shibboleth/oidc/security/credential/impl/LocalJOSEObjectCredentialResolverTest.java b/oidc-common-crypto-impl/src/test/java/net/shibboleth/oidc/security/credential/impl/LocalJOSEObjectCredentialResolverTest.java
index 5b81f9b..69d332f 100644
--- a/oidc-common-crypto-impl/src/test/java/net/shibboleth/oidc/security/credential/impl/LocalJOSEObjectCredentialResolverTest.java
+++ b/oidc-common-crypto-impl/src/test/java/net/shibboleth/oidc/security/credential/impl/LocalJOSEObjectCredentialResolverTest.java
@@ -159,6 +159,29 @@ public class LocalJOSEObjectCredentialResolverTest {
assertTrue(resolvedCredential.get(0).getKeyNames().contains("mock-key"));
}
+ /* There is no KID to use for filtering, but a credential should be returned anyway. */
+ @Test
+ public void testSuccessful_NoKeyIDInJOSEHeader() throws Exception {
+ final JWEObject jweObject =
+ new JWEObject(new JWEHeader.Builder(JWEAlgorithm.RSA_OAEP_256, EncryptionMethod.A256GCM)
+ .contentType("JWT")
+ // No Key ID on purpose
+ // .keyID("mock-key")
+ .build(),
+ new Payload(createdSignedJWT()));
+ jweObject.encrypt(new RSAEncrypter(localRSAKey));
+ final EncryptedJWT jwe = EncryptedJWT.parse(jweObject.serialize());
+ System.out.println(jwe.serialize());
+
+ final CriteriaSet criteria = new CriteriaSet(new JOSEObjectCriterion(jwe));
+ final List<Credential> resolvedCredential = StreamSupport.stream(
+ resolver.resolve(criteria).spliterator(), false).collect(Collectors.toList());
+ assertNotNull(resolvedCredential);
+ assertEquals(resolvedCredential.size(),1);
+ assertNotNull(resolvedCredential.get(0).getPrivateKey());
+ assertTrue(resolvedCredential.get(0).getKeyNames().contains("mock-key"));
+ }
+
/* Just 'kid' no 'jwk'.*/
@Test
public void testUnSuccessful_KeyIDInJOSEHeaderDifferentThanLocalCred() throws Exception {
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the commits
mailing list