Skip to content

Commit 13c1cbf

Browse files
NFC-46 Format version constant to private. Update format version exception message. Inline createCertTrustValidators. Remove final from AuthTokenV11Validator. Use constants for supported signature algorithms. Replace NFC with V11 in tests. Format code. Simplify supports() in AuthTokenValidatorImpl.
1 parent 2fcedc0 commit 13c1cbf

13 files changed

+114
-109
lines changed

src/main/java/eu/webeid/security/validator/AuthTokenV11Validator.java

Lines changed: 24 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -17,27 +17,33 @@
1717

1818
import static eu.webeid.security.util.Strings.isNullOrEmpty;
1919

20-
final class AuthTokenV11Validator extends AuthTokenV1Validator {
20+
class AuthTokenV11Validator extends AuthTokenV1Validator {
2121

2222
private static final String SUPPORTED_PREFIX = "web-eid:1.1";
23+
private static final Set<String> SUPPORTED_CRYPTO_ALGORITHMS = Set.of("ECC", "RSA");
24+
private static final Set<String> SUPPORTED_PADDING_SCHEMES = Set.of("NONE", "PKCS1.5", "PSS");
25+
private static final Set<String> SUPPORTED_HASH_FUNCTIONS = Set.of(
26+
"SHA-224", "SHA-256", "SHA-384", "SHA-512",
27+
"SHA3-224", "SHA3-256", "SHA3-384", "SHA3-512"
28+
);
2329

2430
public AuthTokenV11Validator(
25-
SubjectCertificateValidatorBatch simpleSubjectCertificateValidators,
26-
Set<TrustAnchor> trustedCACertificateAnchors,
27-
CertStore trustedCACertificateCertStore,
28-
AuthTokenSignatureValidator authTokenSignatureValidator,
29-
AuthTokenValidationConfiguration configuration,
30-
OcspClient ocspClient,
31-
OcspServiceProvider ocspServiceProvider
31+
SubjectCertificateValidatorBatch simpleSubjectCertificateValidators,
32+
Set<TrustAnchor> trustedCACertificateAnchors,
33+
CertStore trustedCACertificateCertStore,
34+
AuthTokenSignatureValidator authTokenSignatureValidator,
35+
AuthTokenValidationConfiguration configuration,
36+
OcspClient ocspClient,
37+
OcspServiceProvider ocspServiceProvider
3238
) {
3339
super(
34-
simpleSubjectCertificateValidators,
35-
trustedCACertificateAnchors,
36-
trustedCACertificateCertStore,
37-
authTokenSignatureValidator,
38-
configuration,
39-
ocspClient,
40-
ocspServiceProvider
40+
simpleSubjectCertificateValidators,
41+
trustedCACertificateAnchors,
42+
trustedCACertificateCertStore,
43+
authTokenSignatureValidator,
44+
configuration,
45+
ocspClient,
46+
ocspServiceProvider
4147
);
4248
}
4349

@@ -74,28 +80,13 @@ public X509Certificate validate(WebEidAuthToken token, String currentChallengeNo
7480

7581
private static void validateSupportedSignatureAlgorithms(List<SupportedSignatureAlgorithm> algorithms) throws AuthTokenParseException {
7682
boolean hasInvalid = algorithms.stream().anyMatch(supportedSignatureAlgorithm ->
77-
!isValidCryptoAlgorithm(supportedSignatureAlgorithm.getCryptoAlgorithm())
78-
|| !isValidHashFunction(supportedSignatureAlgorithm.getHashFunction())
79-
|| !isValidPaddingScheme(supportedSignatureAlgorithm.getPaddingScheme())
83+
!SUPPORTED_CRYPTO_ALGORITHMS.contains(supportedSignatureAlgorithm.getCryptoAlgorithm()) ||
84+
!SUPPORTED_HASH_FUNCTIONS.contains(supportedSignatureAlgorithm.getHashFunction()) ||
85+
!SUPPORTED_PADDING_SCHEMES.contains(supportedSignatureAlgorithm.getPaddingScheme())
8086
);
8187

8288
if (hasInvalid) {
8389
throw new AuthTokenParseException("Unsupported signature algorithm");
8490
}
8591
}
86-
87-
private static boolean isValidCryptoAlgorithm(String value) {
88-
return "RSA".equals(value) || "ECC".equals(value);
89-
}
90-
91-
private static boolean isValidHashFunction(String value) {
92-
return Set.of(
93-
"SHA-224", "SHA-256", "SHA-384", "SHA-512",
94-
"SHA3-224", "SHA3-256", "SHA3-384", "SHA3-512"
95-
).contains(value);
96-
}
97-
98-
private static boolean isValidPaddingScheme(String value) {
99-
return "NONE".equals(value) || "PKCS1.5".equals(value) || "PSS".equals(value);
100-
}
10192
}

src/main/java/eu/webeid/security/validator/AuthTokenV1Validator.java

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
class AuthTokenV1Validator implements AuthTokenValidator {
2121

22-
protected static final String SUPPORTED_TOKEN_FORMAT_VERSION = "web-eid:1";
22+
private static final String SUPPORTED_TOKEN_FORMAT_VERSION = "web-eid:1";
2323

2424
private final SubjectCertificateValidatorBatch simpleSubjectCertificateValidators;
2525
private final Set<TrustAnchor> trustedCACertificateAnchors;
@@ -81,7 +81,14 @@ public X509Certificate validate(WebEidAuthToken token, String currentChallengeNo
8181
final X509Certificate subjectCertificate = CertificateLoader.decodeCertificateFromBase64(token.getUnverifiedCertificate());
8282

8383
simpleSubjectCertificateValidators.executeFor(subjectCertificate);
84-
getCertTrustValidators().executeFor(subjectCertificate);
84+
85+
createCertTrustValidators(
86+
configuration,
87+
trustedCACertificateAnchors,
88+
trustedCACertificateCertStore,
89+
ocspClient,
90+
ocspServiceProvider
91+
).executeFor(subjectCertificate);
8592

8693
// It is guaranteed that if the signature verification succeeds, then the origin and challenge
8794
// have been implicitly and correctly verified without the need to implement any additional checks.
@@ -103,16 +110,6 @@ public X509Certificate validate(WebEidAuthToken token, String currentChallengeNo
103110
*
104111
* @return certificate trust validator batch
105112
*/
106-
private SubjectCertificateValidatorBatch getCertTrustValidators() {
107-
return createCertTrustValidators(
108-
configuration,
109-
trustedCACertificateAnchors,
110-
trustedCACertificateCertStore,
111-
ocspClient,
112-
ocspServiceProvider
113-
);
114-
}
115-
116113
public static SubjectCertificateValidatorBatch createCertTrustValidators(
117114
AuthTokenValidationConfiguration configuration,
118115
Set<TrustAnchor> trustedCACertificateAnchors,

src/main/java/eu/webeid/security/validator/AuthTokenValidatorFactory.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,21 @@
44

55
import java.util.List;
66

7-
import static eu.webeid.security.validator.AuthTokenV1Validator.SUPPORTED_TOKEN_FORMAT_VERSION;
8-
97
public final class AuthTokenValidatorFactory {
108
private final List<AuthTokenValidator> validators;
119

1210
public AuthTokenValidatorFactory(List<AuthTokenValidator> validators) {
1311
this.validators = List.copyOf(validators);
1412
}
1513

14+
public boolean supports(String format) {
15+
return validators.stream().anyMatch(v -> v.supports(format));
16+
}
17+
1618
public AuthTokenValidator requireFor(String format) throws AuthTokenParseException {
1719
return validators.stream()
18-
.filter(v -> v.supports(format))
19-
.findFirst()
20-
.orElseThrow(() -> new AuthTokenParseException("Only token format version '" + SUPPORTED_TOKEN_FORMAT_VERSION + "' is currently supported"));
20+
.filter(v -> v.supports(format))
21+
.findFirst()
22+
.orElseThrow(() -> new AuthTokenParseException("Token format version '" + format + "' is currently not supported"));
2123
}
2224
}

src/main/java/eu/webeid/security/validator/AuthTokenValidatorImpl.java

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -60,38 +60,38 @@ final class AuthTokenValidatorImpl implements AuthTokenValidator {
6060
private final AuthTokenValidatorFactory tokenValidatorFactory;
6161

6262
AuthTokenValidatorImpl(AuthTokenValidationConfiguration configuration, OcspClient ocspClient) throws JceException {
63-
final AuthTokenValidationConfiguration copiedConfig = configuration.copy();
63+
final AuthTokenValidationConfiguration validationConfig = configuration.copy();
6464

65-
final Set<TrustAnchor> trustedCACertificateAnchors = CertificateValidator.buildTrustAnchorsFromCertificates(copiedConfig.getTrustedCACertificates());
66-
final CertStore trustedCACertificateCertStore = CertificateValidator.buildCertStoreFromCertificates(copiedConfig.getTrustedCACertificates());
65+
final Set<TrustAnchor> trustedCACertificateAnchors = CertificateValidator.buildTrustAnchorsFromCertificates(validationConfig.getTrustedCACertificates());
66+
final CertStore trustedCACertificateCertStore = CertificateValidator.buildCertStoreFromCertificates(validationConfig.getTrustedCACertificates());
6767

6868
final SubjectCertificateValidatorBatch simpleSubjectCertificateValidators = SubjectCertificateValidatorBatch.createFrom(
6969
SubjectCertificatePurposeValidator::validateCertificatePurpose,
70-
new SubjectCertificatePolicyValidator(copiedConfig.getDisallowedSubjectCertificatePolicies())::validateCertificatePolicies
70+
new SubjectCertificatePolicyValidator(validationConfig.getDisallowedSubjectCertificatePolicies())::validateCertificatePolicies
7171
);
7272

7373
// OcspClient uses built-in HttpClient internally by default.
7474
// A single HttpClient instance is reused for all HTTP calls to utilize connection and thread pools.
75-
if (copiedConfig.isUserCertificateRevocationCheckWithOcspEnabled()) {
75+
if (validationConfig.isUserCertificateRevocationCheckWithOcspEnabled()) {
7676
Objects.requireNonNull(ocspClient, "OCSP client must not be null when OCSP check is enabled");
7777
ocspServiceProvider = new OcspServiceProvider(
78-
copiedConfig.getDesignatedOcspServiceConfiguration(),
78+
validationConfig.getDesignatedOcspServiceConfiguration(),
7979
new AiaOcspServiceConfiguration(
80-
copiedConfig.getNonceDisabledOcspUrls(),
80+
validationConfig.getNonceDisabledOcspUrls(),
8181
trustedCACertificateAnchors,
8282
trustedCACertificateCertStore));
8383
}
8484

8585
final AuthTokenSignatureValidator authTokenSignatureValidator =
86-
new AuthTokenSignatureValidator(copiedConfig.getSiteOrigin());
86+
new AuthTokenSignatureValidator(validationConfig.getSiteOrigin());
8787

8888
this.tokenValidatorFactory = new AuthTokenValidatorFactory(List.of(
8989
new AuthTokenV11Validator(
9090
simpleSubjectCertificateValidators,
9191
trustedCACertificateAnchors,
9292
trustedCACertificateCertStore,
9393
authTokenSignatureValidator,
94-
copiedConfig,
94+
validationConfig,
9595
ocspClient,
9696
ocspServiceProvider
9797
),
@@ -100,7 +100,7 @@ final class AuthTokenValidatorImpl implements AuthTokenValidator {
100100
trustedCACertificateAnchors,
101101
trustedCACertificateCertStore,
102102
authTokenSignatureValidator,
103-
copiedConfig,
103+
validationConfig,
104104
ocspClient,
105105
ocspServiceProvider
106106
)
@@ -109,12 +109,7 @@ final class AuthTokenValidatorImpl implements AuthTokenValidator {
109109

110110
@Override
111111
public boolean supports(String format) {
112-
try {
113-
tokenValidatorFactory.requireFor(format);
114-
return true;
115-
} catch (AuthTokenParseException e) {
116-
return false;
117-
}
112+
return tokenValidatorFactory.supports(format);
118113
}
119114

120115
@Override

src/test/java/eu/webeid/security/testutil/AbstractTestWithValidator.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public abstract class AbstractTestWithValidator {
4444
"\"signature\":\"0Ov7ME6pTY1K2GXMj8Wxov/o2fGIMEds8OMY5dKdkB0nrqQX7fG1E5mnsbvyHpMDecMUH6Yg+p1HXdgB/lLqOcFZjt/OVXPjAAApC5d1YgRYATDcxsR1zqQwiNcHdmWn\"," +
4545
"\"format\":\"web-eid:1.0\"}";
4646

47-
public static final String VALID_NFC_AUTH_TOKEN = "{\"algorithm\":\"ES384\"," +
47+
public static final String VALID_V11_AUTH_TOKEN = "{\"algorithm\":\"ES384\"," +
4848
"\"unverifiedCertificate\":\"MIIEBDCCA2WgAwIBAgIQY5OGshxoPMFg+Wfc0gFEaTAKBggqhkjOPQQDBDBgMQswCQYDVQQGEwJFRTEbMBkGA1UECgwSU0sgSUQgU29sdXRpb25zIEFTMRcwFQYDVQRhDA5OVFJFRS0xMDc0NzAxMzEbMBkGA1UEAwwSVEVTVCBvZiBFU1RFSUQyMDE4MB4XDTIxMDcyMjEyNDMwOFoXDTI2MDcwOTIxNTk1OVowfzELMAkGA1UEBhMCRUUxKjAoBgNVBAMMIUrDlUVPUkcsSkFBSy1LUklTVEpBTiwzODAwMTA4NTcxODEQMA4GA1UEBAwHSsOVRU9SRzEWMBQGA1UEKgwNSkFBSy1LUklTVEpBTjEaMBgGA1UEBRMRUE5PRUUtMzgwMDEwODU3MTgwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQmwEKsJTjaMHSaZj19hb9EJaJlwbKc5VFzmlGMFSJVk4dDy+eUxa5KOA7tWXqzcmhh5SYdv+MxcaQKlKWLMa36pfgv20FpEDb03GCtLqjLTRZ7649PugAQ5EmAqIic29CjggHDMIIBvzAJBgNVHRMEAjAAMA4GA1UdDwEB/wQEAwIDiDBHBgNVHSAEQDA+MDIGCysGAQQBg5EhAQIBMCMwIQYIKwYBBQUHAgEWFWh0dHBzOi8vd3d3LnNrLmVlL0NQUzAIBgYEAI96AQIwHwYDVR0RBBgwFoEUMzgwMDEwODU3MThAZWVzdGkuZWUwHQYDVR0OBBYEFPlp/ceABC52itoqppEmbf71TJz6MGEGCCsGAQUFBwEDBFUwUzBRBgYEAI5GAQUwRzBFFj9odHRwczovL3NrLmVlL2VuL3JlcG9zaXRvcnkvY29uZGl0aW9ucy1mb3ItdXNlLW9mLWNlcnRpZmljYXRlcy8TAkVOMCAGA1UdJQEB/wQWMBQGCCsGAQUFBwMCBggrBgEFBQcDBDAfBgNVHSMEGDAWgBTAhJkpxE6fOwI09pnhClYACCk+ezBzBggrBgEFBQcBAQRnMGUwLAYIKwYBBQUHMAGGIGh0dHA6Ly9haWEuZGVtby5zay5lZS9lc3RlaWQyMDE4MDUGCCsGAQUFBzAChilodHRwOi8vYy5zay5lZS9UZXN0X29mX0VTVEVJRDIwMTguZGVyLmNydDAKBggqhkjOPQQDBAOBjAAwgYgCQgDCAgybz0u3W+tGI+AX+PiI5CrE9ptEHO5eezR1Jo4j7iGaO0i39xTGUB+NSC7P6AQbyE/ywqJjA1a62jTLcS9GHAJCARxN4NO4eVdWU3zVohCXm8WN3DWA7XUcn9TZiLGQ29P4xfQZOXJi/z4PNRRsR4plvSNB3dfyBvZn31HhC7my8woi\"," +
4949
"\"unverifiedSigningCertificate\":\"MIIEBDCCA2WgAwIBAgIQY5OGshxoPMFg+Wfc0gFEaTAKBggqhkjOPQQDBDBgMQswCQYDVQQGEwJFRTEbMBkGA1UECgwSU0sgSUQgU29sdXRpb25zIEFTMRcwFQYDVQRhDA5OVFJFRS0xMDc0NzAxMzEbMBkGA1UEAwwSVEVTVCBvZiBFU1RFSUQyMDE4MB4XDTIxMDcyMjEyNDMwOFoXDTI2MDcwOTIxNTk1OVowfzELMAkGA1UEBhMCRUUxKjAoBgNVBAMMIUrDlUVPUkcsSkFBSy1LUklTVEpBTiwzODAwMTA4NTcxODEQMA4GA1UEBAwHSsOVRU9SRzEWMBQGA1UEKgwNSkFBSy1LUklTVEpBTjEaMBgGA1UEBRMRUE5PRUUtMzgwMDEwODU3MTgwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQmwEKsJTjaMHSaZj19hb9EJaJlwbKc5VFzmlGMFSJVk4dDy+eUxa5KOA7tWXqzcmhh5SYdv+MxcaQKlKWLMa36pfgv20FpEDb03GCtLqjLTRZ7649PugAQ5EmAqIic29CjggHDMIIBvzAJBgNVHRMEAjAAMA4GA1UdDwEB/wQEAwIDiDBHBgNVHSAEQDA+MDIGCysGAQQBg5EhAQIBMCMwIQYIKwYBBQUHAgEWFWh0dHBzOi8vd3d3LnNrLmVlL0NQUzAIBgYEAI96AQIwHwYDVR0RBBgwFoEUMzgwMDEwODU3MThAZWVzdGkuZWUwHQYDVR0OBBYEFPlp/ceABC52itoqppEmbf71TJz6MGEGCCsGAQUFBwEDBFUwUzBRBgYEAI5GAQUwRzBFFj9odHRwczovL3NrLmVlL2VuL3JlcG9zaXRvcnkvY29uZGl0aW9ucy1mb3ItdXNlLW9mLWNlcnRpZmljYXRlcy8TAkVOMCAGA1UdJQEB/wQWMBQGCCsGAQUFBwMCBggrBgEFBQcDBDAfBgNVHSMEGDAWgBTAhJkpxE6fOwI09pnhClYACCk+ezBzBggrBgEFBQcBAQRnMGUwLAYIKwYBBQUHMAGGIGh0dHA6Ly9haWEuZGVtby5zay5lZS9lc3RlaWQyMDE4MDUGCCsGAQUFBzAChilodHRwOi8vYy5zay5lZS9UZXN0X29mX0VTVEVJRDIwMTguZGVyLmNydDAKBggqhkjOPQQDBAOBjAAwgYgCQgDCAgybz0u3W+tGI+AX+PiI5CrE9ptEHO5eezR1Jo4j7iGaO0i39xTGUB+NSC7P6AQbyE/ywqJjA1a62jTLcS9GHAJCARxN4NO4eVdWU3zVohCXm8WN3DWA7XUcn9TZiLGQ29P4xfQZOXJi/z4PNRRsR4plvSNB3dfyBvZn31HhC7my8woi\"," +
5050
"\"supportedSignatureAlgorithms\":[{\"cryptoAlgorithm\":\"RSA\",\"hashFunction\":\"SHA-256\",\"paddingScheme\":\"PKCS1.5\"}]," +
@@ -55,14 +55,14 @@ public abstract class AbstractTestWithValidator {
5555

5656
protected AuthTokenValidator validator;
5757
protected WebEidAuthToken validAuthToken;
58-
protected WebEidAuthToken validNfcAuthToken;
58+
protected WebEidAuthToken validV11AuthToken;
5959

6060
@BeforeEach
6161
protected void setup() {
6262
try {
6363
validator = AuthTokenValidators.getAuthTokenValidator();
6464
validAuthToken = validator.parse(VALID_AUTH_TOKEN);
65-
validNfcAuthToken = validator.parse(VALID_NFC_AUTH_TOKEN);
65+
validV11AuthToken = validator.parse(VALID_V11_AUTH_TOKEN);
6666
} catch (CertificateException | IOException | AuthTokenException e) {
6767
throw new RuntimeException(e);
6868
}
@@ -75,7 +75,7 @@ protected WebEidAuthToken replaceTokenField(String token, String field, String v
7575

7676
protected WebEidAuthToken removeJsonField() throws Exception {
7777
ObjectMapper mapper = new ObjectMapper();
78-
ObjectNode node = (ObjectNode) mapper.readTree(AbstractTestWithValidator.VALID_NFC_AUTH_TOKEN);
78+
ObjectNode node = (ObjectNode) mapper.readTree(AbstractTestWithValidator.VALID_V11_AUTH_TOKEN);
7979
node.remove("supportedSignatureAlgorithms");
8080
return validator.parse(mapper.writeValueAsString(node));
8181
}

src/test/java/eu/webeid/security/validator/AuthTokenAlgorithmTest.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ void whenAlgorithmInvalid_thenParsingFails() throws AuthTokenException {
6060
}
6161

6262
@Test
63-
void whenNfcTokenMissingSupportedAlgorithms_thenValidationFails() throws Exception {
63+
void whenV11TokenMissingSupportedAlgorithms_thenValidationFails() throws Exception {
6464
final WebEidAuthToken token = removeJsonField();
6565

6666
assertThatThrownBy(() -> validator.validate(token, VALID_CHALLENGE_NONCE))
@@ -69,9 +69,9 @@ void whenNfcTokenMissingSupportedAlgorithms_thenValidationFails() throws Excepti
6969
}
7070

7171
@Test
72-
void whenNfcTokenHasInvalidCryptoAlgorithm_thenValidationFails() throws Exception {
72+
void whenV11TokenHasInvalidCryptoAlgorithm_thenValidationFails() throws Exception {
7373
final WebEidAuthToken token = replaceTokenField(
74-
VALID_NFC_AUTH_TOKEN,
74+
VALID_V11_AUTH_TOKEN,
7575
"\"cryptoAlgorithm\":\"RSA\"",
7676
"\"cryptoAlgorithm\":\"INVALID\""
7777
);
@@ -82,9 +82,9 @@ void whenNfcTokenHasInvalidCryptoAlgorithm_thenValidationFails() throws Exceptio
8282
}
8383

8484
@Test
85-
void whenNfcTokenHasInvalidHashFunction_thenValidationFails() throws Exception {
85+
void whenV11TokenHasInvalidHashFunction_thenValidationFails() throws Exception {
8686
final WebEidAuthToken token = replaceTokenField(
87-
VALID_NFC_AUTH_TOKEN,
87+
VALID_V11_AUTH_TOKEN,
8888
"\"hashFunction\":\"SHA-256\"",
8989
"\"hashFunction\":\"NOT_A_HASH\""
9090
);
@@ -95,9 +95,9 @@ void whenNfcTokenHasInvalidHashFunction_thenValidationFails() throws Exception {
9595
}
9696

9797
@Test
98-
void whenNfcTokenHasInvalidPaddingScheme_thenValidationFails() throws Exception {
98+
void whenV11TokenHasInvalidPaddingScheme_thenValidationFails() throws Exception {
9999
final WebEidAuthToken token = replaceTokenField(
100-
VALID_NFC_AUTH_TOKEN,
100+
VALID_V11_AUTH_TOKEN,
101101
"\"paddingScheme\":\"PKCS1.5\"",
102102
"\"paddingScheme\":\"BAD_PADDING\""
103103
);
@@ -108,9 +108,9 @@ void whenNfcTokenHasInvalidPaddingScheme_thenValidationFails() throws Exception
108108
}
109109

110110
@Test
111-
void whenNfcTokenHasEmptySupportedAlgorithms_thenValidationFails() throws Exception {
111+
void whenV11TokenHasEmptySupportedAlgorithms_thenValidationFails() throws Exception {
112112
final WebEidAuthToken token = replaceTokenField(
113-
VALID_NFC_AUTH_TOKEN,
113+
VALID_V11_AUTH_TOKEN,
114114
"\"supportedSignatureAlgorithms\":[{\"cryptoAlgorithm\":\"RSA\",\"hashFunction\":\"SHA-256\",\"paddingScheme\":\"PKCS1.5\"}]",
115115
"\"supportedSignatureAlgorithms\":[]"
116116
);

0 commit comments

Comments
 (0)