Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
package eu.webeid.example.security;

import eu.webeid.security.authtoken.SupportedSignatureAlgorithm;
import eu.webeid.security.authtoken.UnverifiedSigningCertificate;
import eu.webeid.security.certificate.CertificateData;
import org.springframework.lang.Nullable;
import org.springframework.security.core.Authentication;
Expand All @@ -48,11 +49,17 @@ private WebEidAuthentication(String principalName, String idCode, String signing
this.supportedSignatureAlgorithms = supportedSignatureAlgorithms;
}

public static Authentication fromCertificate(X509Certificate userCertificate, @Nullable String signingCertificate, @Nullable List<SupportedSignatureAlgorithm> supportedSignatureAlgorithms, List<GrantedAuthority> authorities) throws CertificateEncodingException {
public static Authentication fromCertificate(X509Certificate userCertificate, @Nullable UnverifiedSigningCertificate signingCertificate, List<GrantedAuthority> authorities) throws CertificateEncodingException {
final String principalName = getPrincipalNameFromCertificate(userCertificate);
final String idCode = CertificateData.getSubjectIdCode(userCertificate)
.orElseThrow(() -> new CertificateEncodingException("Certificate does not contain subject ID code"));
return new WebEidAuthentication(principalName, idCode, signingCertificate, supportedSignatureAlgorithms, authorities);
return new WebEidAuthentication(
principalName,
idCode,
signingCertificate != null ? signingCertificate.getCertificate() : null,
signingCertificate != null ? signingCertificate.getSupportedSignatureAlgorithms() : null,
authorities
);
}

private static String getPrincipalNameFromCertificate(X509Certificate userCertificate) throws CertificateEncodingException {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.security.cert.CertificateEncodingException;
import java.security.cert.X509Certificate;
Expand Down Expand Up @@ -76,14 +77,10 @@ public Authentication authenticate(Authentication auth) throws AuthenticationExc
try {
final String nonce = challengeNonceStore.getAndRemove().getBase64EncodedNonce();
final X509Certificate userCertificate = tokenValidator.validate(authToken, nonce);
final String signingCertificate = requireSigningCert
? authToken.getUnverifiedSigningCertificate()
final var signingCertificate = requireSigningCert && !CollectionUtils.isEmpty(authToken.getUnverifiedSigningCertificates())
? authToken.getUnverifiedSigningCertificates().getFirst() // NOTE: Handling multiple signing certificates is out of scope of this example.
: null;
final List<SupportedSignatureAlgorithm> supportedSignatureAlgorithms = requireSigningCert
? authToken.getSupportedSignatureAlgorithms()
: null;

return WebEidAuthentication.fromCertificate(userCertificate, signingCertificate, supportedSignatureAlgorithms, authorities);
return WebEidAuthentication.fromCertificate(userCertificate, signingCertificate, authorities);
} catch (AuthTokenException e) {
throw new AuthenticationServiceException("Web eID token validation failed", e);
} catch (CertificateEncodingException e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ class WebEidAuthenticationTest {
@Test
void whenOrganizationCertificate_thenSucceeds() throws Exception {
final X509Certificate certificate = CertificateLoader.decodeCertificateFromBase64(ORGANIZATION_CERT);
final Authentication authentication = WebEidAuthentication.fromCertificate(certificate, null, null, Collections.emptyList());
final Authentication authentication = WebEidAuthentication.fromCertificate(certificate, null, Collections.emptyList());
assertThat(authentication.getPrincipal()).isEqualTo("Testijad.ee isikutuvastus");
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,9 +68,11 @@ public class ObjectMother {
VALID_WEB_EID_1_1AUTH_TOKEN = MAPPER.readValue(
"{\"algorithm\":\"ES384\"," +
"\"unverifiedCertificate\":\"MIIEBDCCA2WgAwIBAgIQY5OGshxoPMFg+Wfc0gFEaTAKBggqhkjOPQQDBDBgMQswCQYDVQQGEwJFRTEbMBkGA1UECgwSU0sgSUQgU29sdXRpb25zIEFTMRcwFQYDVQRhDA5OVFJFRS0xMDc0NzAxMzEbMBkGA1UEAwwSVEVTVCBvZiBFU1RFSUQyMDE4MB4XDTIxMDcyMjEyNDMwOFoXDTI2MDcwOTIxNTk1OVowfzELMAkGA1UEBhMCRUUxKjAoBgNVBAMMIUrDlUVPUkcsSkFBSy1LUklTVEpBTiwzODAwMTA4NTcxODEQMA4GA1UEBAwHSsOVRU9SRzEWMBQGA1UEKgwNSkFBSy1LUklTVEpBTjEaMBgGA1UEBRMRUE5PRUUtMzgwMDEwODU3MTgwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQmwEKsJTjaMHSaZj19hb9EJaJlwbKc5VFzmlGMFSJVk4dDy+eUxa5KOA7tWXqzcmhh5SYdv+MxcaQKlKWLMa36pfgv20FpEDb03GCtLqjLTRZ7649PugAQ5EmAqIic29CjggHDMIIBvzAJBgNVHRMEAjAAMA4GA1UdDwEB/wQEAwIDiDBHBgNVHSAEQDA+MDIGCysGAQQBg5EhAQIBMCMwIQYIKwYBBQUHAgEWFWh0dHBzOi8vd3d3LnNrLmVlL0NQUzAIBgYEAI96AQIwHwYDVR0RBBgwFoEUMzgwMDEwODU3MThAZWVzdGkuZWUwHQYDVR0OBBYEFPlp/ceABC52itoqppEmbf71TJz6MGEGCCsGAQUFBwEDBFUwUzBRBgYEAI5GAQUwRzBFFj9odHRwczovL3NrLmVlL2VuL3JlcG9zaXRvcnkvY29uZGl0aW9ucy1mb3ItdXNlLW9mLWNlcnRpZmljYXRlcy8TAkVOMCAGA1UdJQEB/wQWMBQGCCsGAQUFBwMCBggrBgEFBQcDBDAfBgNVHSMEGDAWgBTAhJkpxE6fOwI09pnhClYACCk+ezBzBggrBgEFBQcBAQRnMGUwLAYIKwYBBQUHMAGGIGh0dHA6Ly9haWEuZGVtby5zay5lZS9lc3RlaWQyMDE4MDUGCCsGAQUFBzAChilodHRwOi8vYy5zay5lZS9UZXN0X29mX0VTVEVJRDIwMTguZGVyLmNydDAKBggqhkjOPQQDBAOBjAAwgYgCQgDCAgybz0u3W+tGI+AX+PiI5CrE9ptEHO5eezR1Jo4j7iGaO0i39xTGUB+NSC7P6AQbyE/ywqJjA1a62jTLcS9GHAJCARxN4NO4eVdWU3zVohCXm8WN3DWA7XUcn9TZiLGQ29P4xfQZOXJi/z4PNRRsR4plvSNB3dfyBvZn31HhC7my8woi\"," +
"\"unverifiedSigningCertificate\":\"MIID6zCCA02gAwIBAgIQT7j6zk6pmVRcyspLo5SqejAKBggqhkjOPQQDBDBgMQswCQYDVQQGEwJFRTEbMBkGA1UECgwSU0sgSUQgU29sdXRpb25zIEFTMRcwFQYDVQRhDA5OVFJFRS0xMDc0NzAxMzEbMBkGA1UEAwwSVEVTVCBvZiBFU1RFSUQyMDE4MB4XDTE5MDUwMjEwNDUzMVoXDTI5MDUwMjEwNDUzMVowfzELMAkGA1UEBhMCRUUxFjAUBgNVBCoMDUpBQUstS1JJU1RKQU4xEDAOBgNVBAQMB0rDlUVPUkcxKjAoBgNVBAMMIUrDlUVPUkcsSkFBSy1LUklTVEpBTiwzODAwMTA4NTcxODEaMBgGA1UEBRMRUE5PRUUtMzgwMDEwODU3MTgwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASkwENR8GmCpEs6OshDWDfIiKvGuyNMOD2rjIQW321AnZD3oIsqD0svBMNEJJj9Dlvq/47TYDObIa12KAU5IuOBfJs2lrFdSXZjaM+a5TWT3O2JTM36YDH2GcMe/eisepejggGrMIIBpzAJBgNVHRMEAjAAMA4GA1UdDwEB/wQEAwIGQDBIBgNVHSAEQTA/MDIGCysGAQQBg5EhAQIBMCMwIQYIKwYBBQUHAgEWFWh0dHBzOi8vd3d3LnNrLmVlL0NQUzAJBgcEAIvsQAECMB0GA1UdDgQWBBTVX3s48Spy/Es2TcXgkRvwUn2YcjCBigYIKwYBBQUHAQMEfjB8MAgGBgQAjkYBATAIBgYEAI5GAQQwEwYGBACORgEGMAkGBwQAjkYBBgEwUQYGBACORgEFMEcwRRY/aHR0cHM6Ly9zay5lZS9lbi9yZXBvc2l0b3J5L2NvbmRpdGlvbnMtZm9yLXVzZS1vZi1jZXJ0aWZpY2F0ZXMvEwJFTjAfBgNVHSMEGDAWgBTAhJkpxE6fOwI09pnhClYACCk+ezBzBggrBgEFBQcBAQRnMGUwLAYIKwYBBQUHMAGGIGh0dHA6Ly9haWEuZGVtby5zay5lZS9lc3RlaWQyMDE4MDUGCCsGAQUFBzAChilodHRwOi8vYy5zay5lZS9UZXN0X29mX0VTVEVJRDIwMTguZGVyLmNydDAKBggqhkjOPQQDBAOBiwAwgYcCQgGBr+Jbo1GeqgWdIwgMo7SA29AP38JxNm2HWq2Qb+kIHpusAK574Co1K5D4+Mk7/ITTuXQaET5WphHoN7tdAciTaQJBAn0zBigYyVPYSTO68HM6hmlwTwi/KlJDdXW/2NsMjSqofFFJXpGvpxk2CTqSRCjcavxLPnkasTbNROYSJcmM8Xc=\"," +
"\"supportedSignatureAlgorithms\":[{\"cryptoAlgorithm\":\"RSA\",\"hashFunction\":\"SHA-256\",\"paddingScheme\":\"PKCS1.5\"}]," +
"\"issuerApp\":\"https://web-eid.eu/web-eid-mobile-app/releases/v1.0.0\"," +
"\"unverifiedSigningCertificates\":[{" +
"\"certificate\":\"MIID6zCCA02gAwIBAgIQT7j6zk6pmVRcyspLo5SqejAKBggqhkjOPQQDBDBgMQswCQYDVQQGEwJFRTEbMBkGA1UECgwSU0sgSUQgU29sdXRpb25zIEFTMRcwFQYDVQRhDA5OVFJFRS0xMDc0NzAxMzEbMBkGA1UEAwwSVEVTVCBvZiBFU1RFSUQyMDE4MB4XDTE5MDUwMjEwNDUzMVoXDTI5MDUwMjEwNDUzMVowfzELMAkGA1UEBhMCRUUxFjAUBgNVBCoMDUpBQUstS1JJU1RKQU4xEDAOBgNVBAQMB0rDlUVPUkcxKjAoBgNVBAMMIUrDlUVPUkcsSkFBSy1LUklTVEpBTiwzODAwMTA4NTcxODEaMBgGA1UEBRMRUE5PRUUtMzgwMDEwODU3MTgwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASkwENR8GmCpEs6OshDWDfIiKvGuyNMOD2rjIQW321AnZD3oIsqD0svBMNEJJj9Dlvq/47TYDObIa12KAU5IuOBfJs2lrFdSXZjaM+a5TWT3O2JTM36YDH2GcMe/eisepejggGrMIIBpzAJBgNVHRMEAjAAMA4GA1UdDwEB/wQEAwIGQDBIBgNVHSAEQTA/MDIGCysGAQQBg5EhAQIBMCMwIQYIKwYBBQUHAgEWFWh0dHBzOi8vd3d3LnNrLmVlL0NQUzAJBgcEAIvsQAECMB0GA1UdDgQWBBTVX3s48Spy/Es2TcXgkRvwUn2YcjCBigYIKwYBBQUHAQMEfjB8MAgGBgQAjkYBATAIBgYEAI5GAQQwEwYGBACORgEGMAkGBwQAjkYBBgEwUQYGBACORgEFMEcwRRY/aHR0cHM6Ly9zay5lZS9lbi9yZXBvc2l0b3J5L2NvbmRpdGlvbnMtZm9yLXVzZS1vZi1jZXJ0aWZpY2F0ZXMvEwJFTjAfBgNVHSMEGDAWgBTAhJkpxE6fOwI09pnhClYACCk+ezBzBggrBgEFBQcBAQRnMGUwLAYIKwYBBQUHMAGGIGh0dHA6Ly9haWEuZGVtby5zay5lZS9lc3RlaWQyMDE4MDUGCCsGAQUFBzAChilodHRwOi8vYy5zay5lZS9UZXN0X29mX0VTVEVJRDIwMTguZGVyLmNydDAKBggqhkjOPQQDBAOBiwAwgYcCQgGBr+Jbo1GeqgWdIwgMo7SA29AP38JxNm2HWq2Qb+kIHpusAK574Co1K5D4+Mk7/ITTuXQaET5WphHoN7tdAciTaQJBAn0zBigYyVPYSTO68HM6hmlwTwi/KlJDdXW/2NsMjSqofFFJXpGvpxk2CTqSRCjcavxLPnkasTbNROYSJcmM8Xc=\"," +
"\"supportedSignatureAlgorithms\":[{\"cryptoAlgorithm\":\"RSA\",\"hashFunction\":\"SHA-256\",\"paddingScheme\":\"PKCS1.5\"}]" +
"}]," +
"\"appVersion\":\"https://web-eid.eu/web-eid-mobile-app/releases/v1.0.0\"," +
"\"signature\":\"0Ov7ME6pTY1K2GXMj8Wxov/o2fGIMEds8OMY5dKdkB0nrqQX7fG1E5mnsbvyHpMDecMUH6Yg+p1HXdgB/lLqOcFZjt/OVXPjAAApC5d1YgRYATDcxsR1zqQwiNcHdmWn\"," +
"\"format\":\"web-eid:1.1\"}",
WebEidAuthToken.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@

package eu.webeid.security.authtoken;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown = true)
public class SupportedSignatureAlgorithm {
private String cryptoAlgorithm;
private String hashFunction;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/*
* Copyright (c) 2020-2025 Estonian Information System Authority
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/

package eu.webeid.security.authtoken;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

import java.util.List;

@JsonIgnoreProperties(ignoreUnknown = true)
public class UnverifiedSigningCertificate {

private String certificate;
private List<SupportedSignatureAlgorithm> supportedSignatureAlgorithms;

public String getCertificate() {
return certificate;
}

public void setCertificate(String certificate) {
this.certificate = certificate;
}

public List<SupportedSignatureAlgorithm> getSupportedSignatureAlgorithms() {
return supportedSignatureAlgorithms;
}

public void setSupportedSignatureAlgorithms(List<SupportedSignatureAlgorithm> supportedSignatureAlgorithms) {
this.supportedSignatureAlgorithms = supportedSignatureAlgorithms;
}
}
19 changes: 5 additions & 14 deletions src/main/java/eu/webeid/security/authtoken/WebEidAuthToken.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,7 @@ public class WebEidAuthToken {
private String algorithm;
private String format;

private String unverifiedSigningCertificate;
private List<SupportedSignatureAlgorithm> supportedSignatureAlgorithms;
private List<UnverifiedSigningCertificate> unverifiedSigningCertificates;

public String getUnverifiedCertificate() {
return unverifiedCertificate;
Expand Down Expand Up @@ -69,19 +68,11 @@ public void setFormat(String format) {
this.format = format;
}

public String getUnverifiedSigningCertificate() {
return unverifiedSigningCertificate;
public List<UnverifiedSigningCertificate> getUnverifiedSigningCertificates() {
return unverifiedSigningCertificates;
}

public void setUnverifiedSigningCertificate(String unverifiedSigningCertificate) {
this.unverifiedSigningCertificate = unverifiedSigningCertificate;
}

public List<SupportedSignatureAlgorithm> getSupportedSignatureAlgorithms() {
return supportedSignatureAlgorithms;
}

public void setSupportedSignatureAlgorithms(List<SupportedSignatureAlgorithm> supportedSignatureAlgorithms) {
this.supportedSignatureAlgorithms = supportedSignatureAlgorithms;
public void setUnverifiedSigningCertificates(List<UnverifiedSigningCertificate> unverifiedSigningCertificates) {
this.unverifiedSigningCertificates = unverifiedSigningCertificates;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
package eu.webeid.security.validator.versionvalidators;

import eu.webeid.security.authtoken.SupportedSignatureAlgorithm;
import eu.webeid.security.authtoken.UnverifiedSigningCertificate;
import eu.webeid.security.authtoken.WebEidAuthToken;
import eu.webeid.security.certificate.CertificateLoader;
import eu.webeid.security.exceptions.AuthTokenException;
Expand All @@ -45,6 +46,7 @@
import java.security.cert.CertificateNotYetValidException;
import java.security.cert.TrustAnchor;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
Expand Down Expand Up @@ -90,37 +92,57 @@ protected String getSupportedFormatPrefix() {
@Override
public X509Certificate validate(WebEidAuthToken token, String currentChallengeNonce) throws AuthTokenException {
final X509Certificate subjectCertificate = validateV1(token, currentChallengeNonce);
final X509Certificate signingCertificate = validateSigningCertificateExists(token);
validateSupportedSignatureAlgorithms(token.getSupportedSignatureAlgorithms());
validateSameSubject(subjectCertificate, signingCertificate);
validateSameIssuer(subjectCertificate, signingCertificate);
validateSigningCertificateValidity(signingCertificate);
validateKeyUsage(signingCertificate);
final List<X509Certificate> signingCertificates = validateSigningCertificates(token);
for (X509Certificate signingCertificate : signingCertificates) {
validateSameSubject(subjectCertificate, signingCertificate);
validateSameIssuer(subjectCertificate, signingCertificate);
validateSigningCertificateValidity(signingCertificate);
validateKeyUsage(signingCertificate);
}

return subjectCertificate;
}

private static void validateSupportedSignatureAlgorithms(List<SupportedSignatureAlgorithm> algorithms) throws AuthTokenParseException {
private static void validateSupportedSignatureAlgorithms(UnverifiedSigningCertificate cert) throws AuthTokenParseException {
List<SupportedSignatureAlgorithm> algorithms = cert.getSupportedSignatureAlgorithms();

if (algorithms == null || algorithms.isEmpty()) {
throw new AuthTokenParseException("'supportedSignatureAlgorithms' field is missing");
}

boolean hasInvalid = algorithms.stream().anyMatch(supportedSignatureAlgorithm ->
!SUPPORTED_SIGNING_CRYPTO_ALGORITHMS.contains(supportedSignatureAlgorithm.getCryptoAlgorithm()) ||
!SUPPORTED_SIGNING_HASH_FUNCTIONS.contains(supportedSignatureAlgorithm.getHashFunction()) ||
!SUPPORTED_SIGNING_PADDING_SCHEMES.contains(supportedSignatureAlgorithm.getPaddingScheme())
boolean hasInvalid = algorithms.stream().anyMatch(algorithm ->
algorithm == null ||
algorithm.getCryptoAlgorithm() == null ||
algorithm.getHashFunction() == null ||
algorithm.getPaddingScheme() == null ||
!SUPPORTED_SIGNING_CRYPTO_ALGORITHMS.contains(algorithm.getCryptoAlgorithm()) ||
!SUPPORTED_SIGNING_HASH_FUNCTIONS.contains(algorithm.getHashFunction()) ||
!SUPPORTED_SIGNING_PADDING_SCHEMES.contains(algorithm.getPaddingScheme())
);

if (hasInvalid) {
throw new AuthTokenParseException("Unsupported signature algorithm");
}
}

private static X509Certificate validateSigningCertificateExists(WebEidAuthToken token) throws AuthTokenParseException, CertificateDecodingException {
if (isNullOrEmpty(token.getUnverifiedSigningCertificate())) {
throw new AuthTokenParseException("'unverifiedSigningCertificate' field is missing, null or empty for format 'web-eid:1.1'");
private static List<X509Certificate> validateSigningCertificates(WebEidAuthToken token) throws AuthTokenParseException, CertificateDecodingException {
List<UnverifiedSigningCertificate> signingCertificates = token.getUnverifiedSigningCertificates();

if (signingCertificates == null || signingCertificates.isEmpty()) {
throw new AuthTokenParseException("'unverifiedSigningCertificates' contains a null or empty entry for format 'web-eid:1.1'");
}

List<X509Certificate> result = new ArrayList<>();

for (UnverifiedSigningCertificate certificate : signingCertificates) {
if (certificate == null || isNullOrEmpty(certificate.getCertificate())) {
throw new AuthTokenParseException("'unverifiedSigningCertificates' contains a null or empty entry for format 'web-eid:1.1'");
}
validateSupportedSignatureAlgorithms(certificate);
result.add(CertificateLoader.decodeCertificateFromBase64(certificate.getCertificate()));
}
return CertificateLoader.decodeCertificateFromBase64(token.getUnverifiedSigningCertificate());

return result;
}

private static void validateSameSubject(X509Certificate subjectCertificate, X509Certificate signingCertificate)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,12 @@ protected String getSupportedFormatPrefix() {

@Override
public X509Certificate validate(WebEidAuthToken token, String currentChallengeNonce) throws AuthTokenException {
if (isExactV10Format(token.getFormat()) && token.getUnverifiedSigningCertificates() != null) {
throw new AuthTokenParseException(
"'unverifiedSigningCertificates' field is not allowed for format '" + token.getFormat() + "'"
);
}

if (token.getUnverifiedCertificate() == null || token.getUnverifiedCertificate().isEmpty()) {
throw new AuthTokenParseException("'unverifiedCertificate' field is missing, null or empty");
}
Expand Down Expand Up @@ -105,4 +111,8 @@ public X509Certificate validate(WebEidAuthToken token, String currentChallengeNo

return subjectCertificate;
}

private static boolean isExactV10Format(String format) {
return V1_SUPPORTED_TOKEN_FORMAT_PREFIX.equals(format) || "web-eid:1.0".equals(format);
}
}
Loading
Loading