From 6b6cefd827abb84e672377ce8ad36f91758ac96f Mon Sep 17 00:00:00 2001 From: Steven Hawkins Date: Tue, 16 Sep 2025 10:11:30 -0400 Subject: [PATCH] fix: aligning the elytron alt name extraction logic (#41975) closes: #40629 Signed-off-by: Steve Hawkins --- .../ElytronUserIdentityExtractorProvider.java | 121 +++++++++--------- ...ytronCertificateIdentityExtractorTest.java | 7 + 2 files changed, 69 insertions(+), 59 deletions(-) create mode 100644 crypto/elytron/src/test/java/org/keycloak/crypto/elytron/test/ElytronCertificateIdentityExtractorTest.java diff --git a/crypto/elytron/src/main/java/org/keycloak/crypto/elytron/ElytronUserIdentityExtractorProvider.java b/crypto/elytron/src/main/java/org/keycloak/crypto/elytron/ElytronUserIdentityExtractorProvider.java index a28de70b03b..3b6088da9a7 100644 --- a/crypto/elytron/src/main/java/org/keycloak/crypto/elytron/ElytronUserIdentityExtractorProvider.java +++ b/crypto/elytron/src/main/java/org/keycloak/crypto/elytron/ElytronUserIdentityExtractorProvider.java @@ -22,6 +22,7 @@ import java.security.cert.CertificateParsingException; import java.security.cert.X509Certificate; import java.util.Arrays; import java.util.Collection; +import java.util.Iterator; import java.util.List; import java.util.function.Function; @@ -31,7 +32,6 @@ import org.keycloak.common.crypto.UserIdentityExtractorProvider; import org.wildfly.security.asn1.ASN1; import org.wildfly.security.asn1.DERDecoder; import org.wildfly.security.asn1.OidsUtil; -import org.wildfly.security.x500.GeneralName; import org.wildfly.security.x500.principal.X500AttributePrincipalDecoder; /** @@ -108,73 +108,76 @@ public class ElytronUserIdentityExtractorProvider extends UserIdentityExtractor if (subjectAlternativeNames == null) { return null; } - log.info(Arrays.toString(subjectAlternativeNames.toArray())); - for (List sbjAltName : subjectAlternativeNames) { - if (sbjAltName == null) - continue; - + Iterator> iterator = subjectAlternativeNames.iterator(); + boolean upnOidFound = false; + log.debug(Arrays.toString(subjectAlternativeNames.toArray())); + while (iterator.hasNext() && !upnOidFound) { + List sbjAltName = iterator.next(); + Integer nameType = (Integer) sbjAltName.get(0); if (nameType == generalName) { - Object sbjObj = sbjAltName.get(1); - switch (nameType) { - case GeneralName.RFC_822_NAME: - case GeneralName.DNS_NAME: - case GeneralName.DIRECTORY_NAME: - case GeneralName.URI_NAME: - subjectName = (String) sbjObj; - break; - case GeneralName.OTHER_NAME: - DERDecoder derDecoder = new DERDecoder((byte[])sbjObj); - derDecoder.startSequence(); - boolean upnOidFound = false; - while (derDecoder.hasNextElement() && !upnOidFound) { - int asn1Type = derDecoder.peekType(); - log.debug("ASN.1 Type: " + derDecoder.peekType()); - - switch (asn1Type) { - case ASN1.OBJECT_IDENTIFIER_TYPE: - String oid = derDecoder.decodeObjectIdentifier(); - log.debug("OID: " + oid); - if(UPN_OID.equals(oid)) { - derDecoder.decodeImplicit(160); - byte[] sb = derDecoder.drainElementValue(); - while(!Character.isLetterOrDigit(sb[0])) { - sb = Arrays.copyOfRange(sb, 1, sb.length); + altName: for (int i = 1 ; i