This is an automated email from the ASF dual-hosted git repository.
joewitt pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git
The following commit(s) were added to refs/heads/main by this push:
new e3fff91dd1 NIFI-14048 Added fallback to RSA for Framework Application
Tokens This closes #9603.
e3fff91dd1 is described below
commit e3fff91dd175ed30346520a870db4b9d19237d75
Author: exceptionfactory <[email protected]>
AuthorDate: Sat Dec 28 09:39:16 2024 -0600
NIFI-14048 Added fallback to RSA for Framework Application Tokens
This closes #9603.
- Added KeyPairGeneratorConfiguration with Security Provider detection for
Ed25519 and fallback to RSA when not found
- Added StandardJWSVerifierFactory supporting either EdDSA for Ed25519 or
PS512 for RSA signatures
- Updated KeyGenerationCommand with provided KeyPairGenerator and
conditional JWS Algorithm selection
Signed-off-by: Joseph Witt <[email protected]>
---
.../AuthenticationSecurityConfiguration.java | 1 +
.../JwtAuthenticationSecurityConfiguration.java | 6 +-
.../configuration/JwtDecoderConfiguration.java | 4 +-
.../KeyPairGeneratorConfiguration.java | 64 ++++++++++++++++++++
...actory.java => StandardJWSVerifierFactory.java} | 29 +++++----
.../jwt/key/command/KeyGenerationCommand.java | 42 +++++++++----
.../KeyPairGeneratorConfigurationTest.java | 69 ++++++++++++++++++++++
.../jwt/key/command/KeyGenerationCommandTest.java | 11 +++-
8 files changed, 198 insertions(+), 28 deletions(-)
diff --git
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/configuration/AuthenticationSecurityConfiguration.java
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/configuration/AuthenticationSecurityConfiguration.java
index d100298ee7..cd2269e1fc 100644
---
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/configuration/AuthenticationSecurityConfiguration.java
+++
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/configuration/AuthenticationSecurityConfiguration.java
@@ -35,6 +35,7 @@ import
org.springframework.security.authentication.AuthenticationManager;
@Configuration
@Import({
ClientRegistrationConfiguration.class,
+ KeyPairGeneratorConfiguration.class,
JwtAuthenticationSecurityConfiguration.class,
JwtDecoderConfiguration.class,
OidcSecurityConfiguration.class,
diff --git
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/configuration/JwtAuthenticationSecurityConfiguration.java
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/configuration/JwtAuthenticationSecurityConfiguration.java
index 1057c50a1e..f9acf2d812 100644
---
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/configuration/JwtAuthenticationSecurityConfiguration.java
+++
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/configuration/JwtAuthenticationSecurityConfiguration.java
@@ -45,6 +45,7 @@ import
org.springframework.security.oauth2.server.resource.web.BearerTokenAuthen
import
org.springframework.security.oauth2.server.resource.web.BearerTokenResolver;
import
org.springframework.security.oauth2.server.resource.web.authentication.BearerTokenAuthenticationFilter;
+import java.security.KeyPairGenerator;
import java.time.Duration;
/**
@@ -180,11 +181,12 @@ public class JwtAuthenticationSecurityConfiguration {
/**
* Key Generation Command responsible for rotating JSON Web Signature key
pairs based on configuration
*
+ * @param keyPairGenerator Key Pair Generator for JSON Web Signatures
* @return Key Generation Command scheduled according to application
properties
*/
@Bean
- public KeyGenerationCommand keyGenerationCommand() {
- final KeyGenerationCommand command = new
KeyGenerationCommand(jwsSignerProvider(), verificationKeySelector);
+ public KeyGenerationCommand keyGenerationCommand(final KeyPairGenerator
keyPairGenerator) {
+ final KeyGenerationCommand command = new
KeyGenerationCommand(jwsSignerProvider(), verificationKeySelector,
keyPairGenerator);
commandScheduler().scheduleAtFixedRate(command, keyRotationPeriod);
return command;
}
diff --git
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/configuration/JwtDecoderConfiguration.java
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/configuration/JwtDecoderConfiguration.java
index 597b409637..e69b852e45 100644
---
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/configuration/JwtDecoderConfiguration.java
+++
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/configuration/JwtDecoderConfiguration.java
@@ -27,7 +27,7 @@ import org.apache.nifi.components.state.StateManagerProvider;
import org.apache.nifi.util.NiFiProperties;
import org.apache.nifi.web.security.jwt.converter.StandardIssuerJwtDecoder;
import org.apache.nifi.web.security.jwt.jws.StandardJWSKeySelector;
-import org.apache.nifi.web.security.jwt.key.Ed25519VerifierFactory;
+import org.apache.nifi.web.security.jwt.key.StandardJWSVerifierFactory;
import org.apache.nifi.web.security.jwt.key.StandardVerificationKeySelector;
import
org.apache.nifi.web.security.jwt.key.service.StandardVerificationKeyService;
import org.apache.nifi.web.security.jwt.key.service.VerificationKeyService;
@@ -126,7 +126,7 @@ public class JwtDecoderConfiguration {
final JWTClaimsSetVerifier<SecurityContext> claimsSetVerifier = new
DefaultJWTClaimsVerifier<>(null, REQUIRED_CLAIMS);
jwtProcessor.setJWTClaimsSetVerifier(claimsSetVerifier);
- jwtProcessor.setJWSVerifierFactory(new Ed25519VerifierFactory());
+ jwtProcessor.setJWSVerifierFactory(new StandardJWSVerifierFactory());
return jwtProcessor;
}
diff --git
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/configuration/KeyPairGeneratorConfiguration.java
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/configuration/KeyPairGeneratorConfiguration.java
new file mode 100644
index 0000000000..63f8a7eaaf
--- /dev/null
+++
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/configuration/KeyPairGeneratorConfiguration.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.nifi.web.security.configuration;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.security.KeyPairGenerator;
+import java.security.NoSuchAlgorithmException;
+import java.security.Provider;
+import java.security.Security;
+
+@Configuration
+public class KeyPairGeneratorConfiguration {
+ /** Standard Key Pair Algorithm for signing JSON Web Tokens */
+ private static final String STANDARD_KEY_PAIR_ALGORITHM = "Ed25519";
+
+ private static final String STANDARD_KEY_PAIR_ALGORITHM_FILTER =
"KeyPairGenerator.Ed25519";
+
+ /** Fallback Key Pair Algorithm when standard algorithm not supported in
current Security Provider */
+ private static final String FALLBACK_KEY_PAIR_ALGORITHM = "RSA";
+
+ private static final Logger logger =
LoggerFactory.getLogger(KeyPairGeneratorConfiguration.class);
+
+ /**
+ * JSON Web Token Key Pair Generator defaults to Ed25519 and falls back to
RSA when current Security Providers do
+ * not support Ed25519. The fallback strategy supports security
configurations that have not included Ed25519
+ * as an approved algorithm. This strategy works with restricted providers
such as those that have not incorporated
+ * algorithm approvals described in FIPS 186-5
+ *
+ * @return Key Pair Generator for JSON Web Token signing
+ * @throws NoSuchAlgorithmException Thrown on failure to get Key Pair
Generator for selected algorithm
+ */
+ @Bean
+ public KeyPairGenerator jwtKeyPairGenerator() throws
NoSuchAlgorithmException {
+ final String keyPairAlgorithm;
+
+ final Provider[] providers =
Security.getProviders(STANDARD_KEY_PAIR_ALGORITHM_FILTER);
+ if (providers == null) {
+ keyPairAlgorithm = FALLBACK_KEY_PAIR_ALGORITHM;
+ } else {
+ keyPairAlgorithm = STANDARD_KEY_PAIR_ALGORITHM;
+ }
+
+ logger.info("Configured Key Pair Algorithm [{}] for JSON Web
Signatures", keyPairAlgorithm);
+ return KeyPairGenerator.getInstance(keyPairAlgorithm);
+ }
+}
diff --git
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/jwt/key/Ed25519VerifierFactory.java
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/jwt/key/StandardJWSVerifierFactory.java
similarity index 72%
rename from
nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/jwt/key/Ed25519VerifierFactory.java
rename to
nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/jwt/key/StandardJWSVerifierFactory.java
index eb20bd75ef..1ca60b9033 100644
---
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/jwt/key/Ed25519VerifierFactory.java
+++
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/jwt/key/StandardJWSVerifierFactory.java
@@ -21,44 +21,51 @@ import com.nimbusds.jose.JWSAlgorithm;
import com.nimbusds.jose.JWSHeader;
import com.nimbusds.jose.JWSVerifier;
import com.nimbusds.jose.KeyTypeException;
+import com.nimbusds.jose.crypto.RSASSAVerifier;
import com.nimbusds.jose.jca.JCAContext;
import com.nimbusds.jose.proc.JWSVerifierFactory;
import java.security.Key;
import java.security.PublicKey;
+import java.security.interfaces.RSAPublicKey;
import java.util.Set;
/**
- * Ed25519 implementation of Verifier Factory
+ * Standard implementation of JSON Web Signature Verifier Factory
*/
-public class Ed25519VerifierFactory implements JWSVerifierFactory {
- private static final Set<JWSAlgorithm> SUPPORTED_ALGORITHMS =
Set.of(JWSAlgorithm.EdDSA);
+public class StandardJWSVerifierFactory implements JWSVerifierFactory {
+ /** Supported Algorithms aligned with supported Signers */
+ private static final Set<JWSAlgorithm> SUPPORTED_ALGORITHMS =
Set.of(JWSAlgorithm.EdDSA, JWSAlgorithm.PS512);
private final JCAContext jcaContext = new JCAContext();
/**
- * Create JSON Web Security Verifier for EdDSA using Ed25519 Public Key
+ * Create JSON Web Security Verifier for EdDSA using Ed25519 Public Key or
PS512 using RSA Public Key
*
* @param jwsHeader JSON Web Security Header
- * @param key Ed25519 Public Key required
+ * @param key Ed25519 or RSA Public Key required
* @return JSON Web Security Verifier
* @throws JOSEException Thrown on failure to create verifier
*/
@Override
public JWSVerifier createJWSVerifier(final JWSHeader jwsHeader, final Key
key) throws JOSEException {
final JWSAlgorithm algorithm = jwsHeader.getAlgorithm();
+ final JWSVerifier verifier;
if (SUPPORTED_ALGORITHMS.contains(algorithm)) {
- if (key instanceof PublicKey publicKey) {
- final Ed25519Verifier verifier = new
Ed25519Verifier(publicKey);
- verifier.getJCAContext().setProvider(jcaContext.getProvider());
- return verifier;
- } else {
+ if (key instanceof RSAPublicKey rsaPublicKey) {
+ verifier = new RSASSAVerifier(rsaPublicKey);
+ } else if (key instanceof PublicKey publicKey) {
+ verifier = new Ed25519Verifier(publicKey);
+ } else {
throw new KeyTypeException(PublicKey.class);
- }
+ }
} else {
throw new JOSEException("JWS Algorithm [%s] not
supported".formatted(algorithm));
}
+
+ verifier.getJCAContext().setProvider(jcaContext.getProvider());
+ return verifier;
}
@Override
diff --git
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/jwt/key/command/KeyGenerationCommand.java
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/jwt/key/command/KeyGenerationCommand.java
index 75c939cd71..34573eada2 100644
---
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/jwt/key/command/KeyGenerationCommand.java
+++
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/main/java/org/apache/nifi/web/security/jwt/key/command/KeyGenerationCommand.java
@@ -18,6 +18,7 @@ package org.apache.nifi.web.security.jwt.key.command;
import com.nimbusds.jose.JWSAlgorithm;
import com.nimbusds.jose.JWSSigner;
+import com.nimbusds.jose.crypto.RSASSASigner;
import org.apache.nifi.web.security.jwt.jws.JwsSignerContainer;
import org.apache.nifi.web.security.jwt.jws.SignerListener;
import org.apache.nifi.web.security.jwt.key.Ed25519Signer;
@@ -27,7 +28,7 @@ import org.slf4j.LoggerFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
-import java.security.NoSuchAlgorithmException;
+import java.security.PrivateKey;
import java.util.Objects;
import java.util.UUID;
@@ -37,23 +38,31 @@ import java.util.UUID;
public class KeyGenerationCommand implements Runnable {
private static final Logger LOGGER =
LoggerFactory.getLogger(KeyGenerationCommand.class);
- private static final String KEY_ALGORITHM = "Ed25519";
+ private static final String RSA_KEY_ALGORITHM = "RSA";
- private static final JWSAlgorithm JWS_ALGORITHM = JWSAlgorithm.EdDSA;
+ private static final JWSAlgorithm RSA_JWS_ALGORITHM = JWSAlgorithm.PS512;
+
+ private static final JWSAlgorithm DEFAULT_JWS_ALGORITHM =
JWSAlgorithm.EdDSA;
private final KeyPairGenerator keyPairGenerator;
+ private final JWSAlgorithm jwsAlgorithm;
+
private final SignerListener signerListener;
private final VerificationKeyListener verificationKeyListener;
- public KeyGenerationCommand(final SignerListener signerListener, final
VerificationKeyListener verificationKeyListener) {
+ public KeyGenerationCommand(final SignerListener signerListener, final
VerificationKeyListener verificationKeyListener, final KeyPairGenerator
keyPairGenerator) {
this.signerListener = Objects.requireNonNull(signerListener, "Signer
Listener required");
this.verificationKeyListener =
Objects.requireNonNull(verificationKeyListener, "Verification Key Listener
required");
- try {
- keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM);
- } catch (final NoSuchAlgorithmException e) {
- throw new IllegalArgumentException(e);
+ this.keyPairGenerator = Objects.requireNonNull(keyPairGenerator, "Key
Pair Generator required");
+
+ // Configure JWS Algorithm based on Key Pair Generator algorithm with
fallback to RSA when Ed25519 not supported
+ final String keyPairAlgorithm = keyPairGenerator.getAlgorithm();
+ if (RSA_KEY_ALGORITHM.equals(keyPairAlgorithm)) {
+ this.jwsAlgorithm = RSA_JWS_ALGORITHM;
+ } else {
+ this.jwsAlgorithm = DEFAULT_JWS_ALGORITHM;
}
}
@@ -64,11 +73,22 @@ public class KeyGenerationCommand implements Runnable {
public void run() {
final KeyPair keyPair = keyPairGenerator.generateKeyPair();
final String keyIdentifier = UUID.randomUUID().toString();
- LOGGER.debug("Generated Key Pair [{}] Key Identifier [{}]",
KEY_ALGORITHM, keyIdentifier);
+ LOGGER.debug("Generated Key Pair [{}] Key Identifier [{}]",
keyPairGenerator.getAlgorithm(), keyIdentifier);
verificationKeyListener.onVerificationKeyGenerated(keyIdentifier,
keyPair.getPublic());
- final JWSSigner jwsSigner = new Ed25519Signer(keyPair.getPrivate());
- signerListener.onSignerUpdated(new JwsSignerContainer(keyIdentifier,
JWS_ALGORITHM, jwsSigner));
+ final PrivateKey privateKey = keyPair.getPrivate();
+ final JWSSigner jwsSigner = getJwsSigner(privateKey);
+ signerListener.onSignerUpdated(new JwsSignerContainer(keyIdentifier,
jwsAlgorithm, jwsSigner));
+ }
+
+ private JWSSigner getJwsSigner(final PrivateKey privateKey) {
+ final JWSSigner jwsSigner;
+ if (RSA_JWS_ALGORITHM.equals(jwsAlgorithm)) {
+ jwsSigner = new RSASSASigner(privateKey);
+ } else {
+ jwsSigner = new Ed25519Signer(privateKey);
+ }
+ return jwsSigner;
}
}
diff --git
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/test/java/org/apache/nifi/web/security/configuration/KeyPairGeneratorConfigurationTest.java
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/test/java/org/apache/nifi/web/security/configuration/KeyPairGeneratorConfigurationTest.java
new file mode 100644
index 0000000000..be2bd4a7ab
--- /dev/null
+++
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/test/java/org/apache/nifi/web/security/configuration/KeyPairGeneratorConfigurationTest.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.nifi.web.security.configuration;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import java.security.KeyPairGenerator;
+import java.security.NoSuchAlgorithmException;
+import java.security.Provider;
+import java.security.Security;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+class KeyPairGeneratorConfigurationTest {
+ private static final String STANDARD_KEY_PAIR_ALGORITHM_FILTER =
"KeyPairGenerator.Ed25519";
+
+ private static final String STANDARD_KEY_PAIR_ALGORITHM = "Ed25519";
+
+ private static final String FALLBACK_KEY_PAIR_ALGORITHM = "RSA";
+
+ private KeyPairGeneratorConfiguration configuration;
+
+ @BeforeEach
+ void setConfiguration() {
+ configuration = new KeyPairGeneratorConfiguration();
+ }
+
+ @Test
+ void testJwtKeyPairGenerator() throws NoSuchAlgorithmException {
+ final KeyPairGenerator keyPairGenerator =
configuration.jwtKeyPairGenerator();
+
+ final String algorithm = keyPairGenerator.getAlgorithm();
+ assertEquals(STANDARD_KEY_PAIR_ALGORITHM, algorithm);
+ }
+
+ @Test
+ void testJwtKeyPairGeneratorFallbackAlgorithm() throws
NoSuchAlgorithmException {
+ final Provider[] providers =
Security.getProviders(STANDARD_KEY_PAIR_ALGORITHM_FILTER);
+ assertNotNull(providers);
+
+ final Provider provider = providers[0];
+ try {
+ Security.removeProvider(provider.getName());
+
+ final KeyPairGenerator keyPairGenerator =
configuration.jwtKeyPairGenerator();
+
+ final String algorithm = keyPairGenerator.getAlgorithm();
+ assertEquals(FALLBACK_KEY_PAIR_ALGORITHM, algorithm);
+ } finally {
+ Security.addProvider(provider);
+ }
+ }
+}
diff --git
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/test/java/org/apache/nifi/web/security/jwt/key/command/KeyGenerationCommandTest.java
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/test/java/org/apache/nifi/web/security/jwt/key/command/KeyGenerationCommandTest.java
index eb327d3082..a3c874d9c7 100644
---
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/test/java/org/apache/nifi/web/security/jwt/key/command/KeyGenerationCommandTest.java
+++
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-security/src/test/java/org/apache/nifi/web/security/jwt/key/command/KeyGenerationCommandTest.java
@@ -29,8 +29,12 @@ import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import java.security.Key;
+import java.security.KeyPairGenerator;
+import java.security.NoSuchAlgorithmException;
+import java.security.PublicKey;
import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertInstanceOf;
import static org.mockito.Mockito.verify;
@ExtendWith(MockitoExtension.class)
@@ -57,8 +61,10 @@ public class KeyGenerationCommandTest {
private KeyGenerationCommand command;
@BeforeEach
- public void setCommand() {
- command = new KeyGenerationCommand(signerListener,
verificationKeyListener);
+ public void setCommand() throws NoSuchAlgorithmException {
+ final KeyPairGenerator keyPairGenerator =
KeyPairGenerator.getInstance(JWS_ALGORITHM.getName());
+
+ command = new KeyGenerationCommand(signerListener,
verificationKeyListener, keyPairGenerator);
}
@Test
@@ -72,5 +78,6 @@ public class KeyGenerationCommandTest {
verify(verificationKeyListener).onVerificationKeyGenerated(keyIdentifierCaptor.capture(),
keyCaptor.capture());
final Key key = keyCaptor.getValue();
assertEquals(KEY_ALGORITHM, key.getAlgorithm());
+ assertInstanceOf(PublicKey.class, key);
}
}