diff --git a/jans-bom/pom.xml b/jans-bom/pom.xml index a506833ba66..8fb081c9814 100644 --- a/jans-bom/pom.xml +++ b/jans-bom/pom.xml @@ -832,7 +832,44 @@ 4.13.2 test + + org.jboss.weld + weld-junit5 + 4.0.0.Final + test + + + org.junit.jupiter + junit-jupiter-api + 5.9.2 + test + + + org.junit.jupiter + junit-jupiter-engine + 5.9.2 + test + + + org.junit.jupiter + junit-jupiter-params + 5.9.2 + test + + + org.mockito + mockito-core + 5.1.1 + test + + + org.mockito + mockito-inline + 5.1.1 + test + + net.openhft diff --git a/jans-core/service/src/main/java/io/jans/service/net/NetworkService.java b/jans-core/service/src/main/java/io/jans/service/net/NetworkService.java index e1dd51424dd..29a0e165c7f 100644 --- a/jans-core/service/src/main/java/io/jans/service/net/NetworkService.java +++ b/jans-core/service/src/main/java/io/jans/service/net/NetworkService.java @@ -6,18 +6,18 @@ package io.jans.service.net; -import io.jans.net.InetAddressUtility; -import io.jans.util.StringHelper; +import java.io.Serializable; +import java.net.URI; +import java.net.URISyntaxException; + import org.slf4j.Logger; +import io.jans.net.InetAddressUtility; +import io.jans.util.StringHelper; import jakarta.enterprise.context.ApplicationScoped; import jakarta.faces.context.FacesContext; import jakarta.inject.Inject; -import jakarta.inject.Named; import jakarta.servlet.http.HttpServletRequest; -import java.io.Serializable; -import java.net.URI; -import java.net.URISyntaxException; /** * Network service @@ -25,7 +25,6 @@ * @author Yuriy Movchan Date: 04/28/2016 */ @ApplicationScoped -@Named public class NetworkService implements Serializable { private static final long serialVersionUID = -1393318600428448743L; diff --git a/jans-fido2/pom.xml b/jans-fido2/pom.xml index da48914c817..38b6d8ffbe5 100644 --- a/jans-fido2/pom.xml +++ b/jans-fido2/pom.xml @@ -127,6 +127,11 @@ + + org.apache.maven.plugins + maven-war-plugin + 2.3 + org.apache.maven.plugins maven-clean-plugin @@ -175,6 +180,18 @@ jacoco-maven-plugin ${jacoco.version} + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0-M9 + + + org.junit.jupiter + junit-jupiter-engine + 5.9.2 + + + diff --git a/jans-fido2/server/pom.xml b/jans-fido2/server/pom.xml index 8116f3c4595..7bbc27517d6 100644 --- a/jans-fido2/server/pom.xml +++ b/jans-fido2/server/pom.xml @@ -36,6 +36,8 @@ **/*.json **/*.xml + **/keys/**/*.* + **/*.properties @@ -90,6 +92,18 @@ false + @@ -149,6 +163,33 @@ kerby-asn1 2.0.1 + + + + org.jboss.weld + weld-junit5 + test + + + org.junit.jupiter + junit-jupiter-engine + test + + + org.junit.jupiter + junit-jupiter-params + test + + + org.mockito + mockito-core + test + + + org.mockito + mockito-inline + test + diff --git a/jans-fido2/server/src/main/java/io/jans/fido2/service/sg/converter/AttestationSuperGluuController.java b/jans-fido2/server/src/main/java/io/jans/fido2/service/sg/converter/AttestationSuperGluuController.java index de869f5032a..f99d7a263c6 100644 --- a/jans-fido2/server/src/main/java/io/jans/fido2/service/sg/converter/AttestationSuperGluuController.java +++ b/jans-fido2/server/src/main/java/io/jans/fido2/service/sg/converter/AttestationSuperGluuController.java @@ -103,7 +103,24 @@ public class AttestationSuperGluuController { * "appId":"https://yurem-emerging-pig.gluu.info/identity/authcode.htm","version":"U2F_V2"}]} */ public JsonNode startRegistration(String userName, String appId, String sessionId, String enrollmentCode) { - boolean oneStep = StringHelper.isEmpty(userName); + ObjectNode params = buildFido2AttestationStartResponse(userName, appId, sessionId); + + ObjectNode result = attestationService.options(params); + + // Build start registration response + ObjectNode superGluuResult = dataMapperService.createObjectNode(); + ArrayNode registerRequests = superGluuResult.putArray("registerRequests"); + + result.put("appId", appId); + registerRequests.add(result); + + result.put("version", "U2F_V2"); + + return superGluuResult; + } + + public ObjectNode buildFido2AttestationStartResponse(String userName, String appId, String sessionId) { + boolean oneStep = StringHelper.isEmpty(userName); boolean valid = userSessionIdService.isValidSessionId(sessionId, userName); if (!valid) { @@ -130,20 +147,8 @@ public JsonNode startRegistration(String userName, String appId, String sessionI params.put("attestation", "direct"); log.debug("Prepared U2F_V2 attestation options request: {}", params.toString()); - - ObjectNode result = attestationService.options(params); - - // Build start registration response - ObjectNode superGluuResult = dataMapperService.createObjectNode(); - ArrayNode registerRequests = superGluuResult.putArray("registerRequests"); - - result.put("appId", appId); - registerRequests.add(result); - - result.put("version", "U2F_V2"); - - return superGluuResult; - } + return params; + } /* Example for one_step: * - request: @@ -189,14 +194,31 @@ public JsonNode startRegistration(String userName, String appId, String sessionI * */ public JsonNode finishRegistration(String userName, String registerResponseString) { - RegisterResponse registerResponse; + RegisterResponse registerResponse = parseRegisterResponse(registerResponseString); + + ObjectNode params = buildFido2AttestationVerifyResponse(userName, registerResponse); + + ObjectNode result = attestationService.verify(params); + + result.put("status", "success"); + result.put("challenge", registerResponse.getClientData().getChallenge()); + + return result; + } + + public RegisterResponse parseRegisterResponse(String registerResponseString) { + RegisterResponse registerResponse; try { registerResponse = dataMapperService.readValue(registerResponseString, RegisterResponse.class); } catch (IOException ex) { throw new Fido2RpRuntimeException("Failed to parse options attestation request", ex); } - if (!ArrayUtils.contains(RawRegistrationService.SUPPORTED_REGISTER_TYPES, registerResponse.getClientData().getTyp())) { + return registerResponse; + } + + public ObjectNode buildFido2AttestationVerifyResponse(String userName, RegisterResponse registerResponse) { + if (!ArrayUtils.contains(RawRegistrationService.SUPPORTED_REGISTER_TYPES, registerResponse.getClientData().getTyp())) { throw new Fido2RuntimeException("Invalid options attestation request type"); } @@ -250,14 +272,8 @@ public JsonNode finishRegistration(String userName, String registerResponseStrin } log.debug("Prepared U2F_V2 attestation verify request: {}", params.toString()); - - ObjectNode result = attestationService.verify(params); - - result.put("status", "success"); - result.put("challenge", registerResponse.getClientData().getChallenge()); - - return result; - } + return params; + } private byte[] generateAuthData(ClientData clientData, RawRegisterResponse rawRegisterResponse) throws IOException { byte[] rpIdHash = digestService.hashSha256(clientData.getOrigin()); diff --git a/jans-fido2/server/src/test/java/io/jans/fido2/service/KeySignatureVerifierTest.java b/jans-fido2/server/src/test/java/io/jans/fido2/service/KeySignatureVerifierTest.java new file mode 100644 index 00000000000..3a42477e8bf --- /dev/null +++ b/jans-fido2/server/src/test/java/io/jans/fido2/service/KeySignatureVerifierTest.java @@ -0,0 +1,78 @@ +/* + * Janssen Project software is available under the Apache License (2004). See http://www.apache.org/licenses/ for full text. + * + * Copyright (c) 2023, Janssen Project + */ + +package io.jans.fido2.service; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.security.InvalidKeyException; +import java.security.KeyFactory; +import java.security.NoSuchAlgorithmException; +import java.security.NoSuchProviderException; +import java.security.PublicKey; +import java.security.Signature; +import java.security.SignatureException; +import java.security.spec.InvalidKeySpecException; +import java.security.spec.X509EncodedKeySpec; + +import org.apache.commons.io.FileUtils; +import org.jboss.weld.junit5.auto.AddPackages; +import org.jboss.weld.junit5.auto.WeldJunit5AutoExtension; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; + +import io.jans.as.model.util.SecurityProviderUtility; +import jakarta.inject.Inject; + +/** + * @author Yuriy Movchan + * @version 0.1, 17/02/2023 + */ +@ExtendWith(WeldJunit5AutoExtension.class) +@AddPackages(io.jans.service.util.Resources.class) +public class KeySignatureVerifierTest { + + @Inject + Base64Service base64Service; + + @BeforeAll + public static void beforeAll() { + SecurityProviderUtility.installBCProvider(); + } + + /* + * openssl ecparam -name secp256r1 -genkey -noout -out private.key + * openssl ec -in private.key -pubout -out public.pem + * echo -n "test" > data.txt + * + * openssl dgst -sha256 -sign private.key data.txt | openssl enc -base64 > signature.txt + */ + @Test + public void testSHA256withECDSASignature() throws IOException, NoSuchAlgorithmException, NoSuchProviderException, InvalidKeySpecException, InvalidKeyException, SignatureException { + String key = FileUtils.readFileToString(new File("./target/test-classes/keys/secp256r1/public.pem"), StandardCharsets.UTF_8); + String publicKeyPEM = key.replace("-----BEGIN PUBLIC KEY-----", "").replaceAll(System.lineSeparator(), "").replace("-----END PUBLIC KEY-----", ""); + + KeyFactory keyFactory = KeyFactory.getInstance("EC", "BC"); + X509EncodedKeySpec keySpec = new X509EncodedKeySpec(base64Service.decode(publicKeyPEM)); + PublicKey publicKey = keyFactory.generatePublic(keySpec); + + byte[] signature = base64Service.decode(FileUtils.readFileToString(new File("./target/test-classes/keys/secp256r1/signature.txt"), + StandardCharsets.UTF_8).replaceAll(System.lineSeparator(), "")); + byte[] signedBytes = FileUtils.readFileToString(new File("./target/test-classes/keys/secp256r1/data.txt"), StandardCharsets.UTF_8).getBytes(StandardCharsets.UTF_8); + + Signature ecdsaSignature = Signature.getInstance("SHA256withECDSA", "BC"); + ecdsaSignature.initVerify(publicKey); + ecdsaSignature.update(signedBytes); + + boolean isValid = ecdsaSignature.verify(signature); + assertTrue(isValid); + } + +} diff --git a/jans-fido2/server/src/test/java/io/jans/fido2/service/sg/AttestationSignatureAndroidTest.java b/jans-fido2/server/src/test/java/io/jans/fido2/service/sg/AttestationSignatureAndroidTest.java new file mode 100644 index 00000000000..92d021ecf8f --- /dev/null +++ b/jans-fido2/server/src/test/java/io/jans/fido2/service/sg/AttestationSignatureAndroidTest.java @@ -0,0 +1,209 @@ +/* + * Janssen Project software is available under the Apache License (2004). See http://www.apache.org/licenses/ for full text. + * + * Copyright (c) 2023, Janssen Project + */ + +package io.jans.fido2.service.sg; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyString; + +import java.util.Arrays; + +import org.jboss.weld.junit5.ExplicitParamInjection; +import org.jboss.weld.junit5.auto.AddBeanClasses; +import org.jboss.weld.junit5.auto.EnableAutoWeld; +import org.jboss.weld.junit5.auto.ExcludeBean; +import org.jboss.weld.junit5.auto.WeldJunit5AutoExtension; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; + +import io.jans.as.common.model.common.User; +import io.jans.as.model.config.BaseDnConfiguration; +import io.jans.as.model.config.StaticConfiguration; +import io.jans.as.model.fido.u2f.protocol.RegisterResponse; +import io.jans.as.model.util.SecurityProviderUtility; +import io.jans.fido2.model.conf.AppConfiguration; +import io.jans.fido2.model.conf.Fido2Configuration; +import io.jans.fido2.service.ChallengeGenerator; +import io.jans.fido2.service.operation.AttestationService; +import io.jans.fido2.service.persist.RegistrationPersistenceService; +import io.jans.fido2.service.persist.UserSessionIdService; +import io.jans.fido2.service.processor.attestation.U2FSuperGluuAttestationProcessor; +import io.jans.fido2.service.sg.converter.AttestationSuperGluuController; +import io.jans.fido2.service.shared.UserService; +import io.jans.fido2.service.verifier.CommonVerifiers; +import io.jans.fido2.sg.SuperGluuMode; +import io.jans.junit.extension.CustomExtension; +import io.jans.junit.extension.Name; +import io.jans.orm.model.fido2.Fido2RegistrationEntry; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.inject.Produces; +import jakarta.inject.Inject; + +/** + * @author Yuriy Movchan + * @version 0.1, 17/02/2023 + */ +@EnableAutoWeld +@ExtendWith(WeldJunit5AutoExtension.class) +@TestMethodOrder(OrderAnnotation.class) +@AddBeanClasses(io.jans.service.util.Resources.class) +@AddBeanClasses(io.jans.service.net.NetworkService.class) +@ExplicitParamInjection +public class AttestationSignatureAndroidTest { + + private String issuer; + private String challenge; + + // Static to store value between tests executions + static Fido2RegistrationEntry registrationEntry; + + AutoCloseable closeable; + + @Inject + AttestationSuperGluuController attestationSuperGluuController; + + @Inject + U2FSuperGluuAttestationProcessor attestationProcessor; + + @Inject + AttestationService attestationService; + + @Mock + UserService userService = Mockito.mock(UserService.class); + + @InjectMocks + RegistrationPersistenceService registrationPersistenceService = Mockito.mock(RegistrationPersistenceService.class); + + @BeforeAll + public static void beforeAll() { + SecurityProviderUtility.installBCProvider(); + } + + @BeforeEach + void initService() { + closeable = MockitoAnnotations.openMocks(this); + } + + @AfterEach + void closeService() throws Exception { + closeable.close(); + } + + @ApplicationScoped + @Produces + StaticConfiguration produceStaticConfiguration() { + StaticConfiguration staticConfiguration = Mockito.mock(StaticConfiguration.class); + + BaseDnConfiguration baseDnConfiguration = new BaseDnConfiguration(); + Mockito.when(staticConfiguration.getBaseDn()).thenReturn(baseDnConfiguration); + + return staticConfiguration; + } + + @ApplicationScoped + @Produces + AppConfiguration produceAppConfiguration() { + AppConfiguration appConfiguration = Mockito.mock(AppConfiguration.class); + + Fido2Configuration fido2Configuration = new Fido2Configuration(); + Mockito.when(appConfiguration.getFido2Configuration()).thenReturn(fido2Configuration); + Mockito.when(appConfiguration.getIssuer()).thenReturn(issuer); + + return appConfiguration; + } + + @ApplicationScoped + @Produces + @ExcludeBean + RegistrationPersistenceService produceRegistrationPersistenceService() { + Mockito.when(registrationPersistenceService.buildFido2RegistrationEntry(any(), anyBoolean())).thenCallRealMethod(); + Mockito.when(registrationPersistenceService.findByChallenge(anyString(), anyBoolean())).thenReturn(Arrays.asList(registrationEntry)); + + Mockito.when(userService.getUser(anyString(), any())).thenReturn(new User()); + + return registrationPersistenceService; + } + + @ApplicationScoped + @Produces + @ExcludeBean + ChallengeGenerator produceChallengeGenerator() { + return Mockito.when(Mockito.mock(ChallengeGenerator.class).getChallenge()) + .thenReturn(challenge).getMock(); + } + + @ApplicationScoped + @Produces + @ExcludeBean + UserSessionIdService produceUserSessionIdService() { + return Mockito.when(Mockito.mock(UserSessionIdService.class).isValidSessionId(anyString(), anyString())) + .thenReturn(true).getMock(); + } + + @Test + @Order(1) + @ExtendWith(CustomExtension.class) + public void testStartAttestationSignature(@Name("attestation.android.two-step.issuer") String issuer, @Name("attestation.android.two-step.challenge") String challenge, + @Name("attestation.android.two-step.userName") String userName, @Name("attestation.android.two-step.applicationId") String applicationId, + @Name("attestation.android.two-step.sessionId") String sessionId, @Name("attestation.android.two-step.enrollmentCode") String enrollmentCode) { + + this.issuer = issuer; + this.challenge = challenge; + + JsonNode request = attestationSuperGluuController.buildFido2AttestationStartResponse(userName, applicationId, sessionId); + assertEquals(request.get(CommonVerifiers.SUPER_GLUU_REQUEST).asBoolean(), true); + assertEquals(request.get(CommonVerifiers.SUPER_GLUU_MODE).asText(), SuperGluuMode.TWO_STEP.getMode()); + assertEquals(request.get(CommonVerifiers.SUPER_GLUU_APP_ID).asText(), applicationId); + + ObjectNode response = attestationService.options(request); + + // Get saved entry for finish attestation test + ArgumentCaptor captor = ArgumentCaptor.forClass(Fido2RegistrationEntry.class); + Mockito.verify(registrationPersistenceService).save(captor.capture()); + registrationEntry = captor.getValue(); + + assertNotNull(registrationEntry); + assertNotNull(response); + assertEquals(response.get("challenge").asText(), challenge); + } + + @Test + @Order(2) + @ExtendWith(CustomExtension.class) + public void testFinishAttestationSignature(@Name("attestation.android.two-step.userName") String userName, + @Name("attestation.android.two-step.finish.request") String registerFinishResponse) { + // Parse register response + RegisterResponse registerResponse = attestationSuperGluuController.parseRegisterResponse(registerFinishResponse); + + JsonNode request = attestationSuperGluuController.buildFido2AttestationVerifyResponse(userName, registerResponse); + assertEquals(request.get(CommonVerifiers.SUPER_GLUU_REQUEST).asBoolean(), true); + assertEquals(request.get(CommonVerifiers.SUPER_GLUU_MODE).asText(), SuperGluuMode.TWO_STEP.getMode()); + + ObjectNode response = attestationService.verify(request); + + assertNotNull(response); + assertEquals(response.get("status").asText(), "ok"); + assertEquals(response.get("createdCredentials").get("id").asText(), "lGWf7urVmKzN_4vklat2W8jqJoWCTIYfrjkLFDkef2Zmdl7k13FXCFHdMMw0G_YyluFAHwx5oDf-7bcbAlG0Wg"); + } + +} diff --git a/jans-fido2/server/src/test/java/io/jans/junit/extension/CustomExtension.java b/jans-fido2/server/src/test/java/io/jans/junit/extension/CustomExtension.java new file mode 100644 index 00000000000..02181057e0b --- /dev/null +++ b/jans-fido2/server/src/test/java/io/jans/junit/extension/CustomExtension.java @@ -0,0 +1,89 @@ +/* + * Janssen Project software is available under the Apache License (2004). See http://www.apache.org/licenses/ for full text. + * + * Copyright (c) 2023, Janssen Project + */ + +package io.jans.junit.extension; + +import java.io.FileInputStream; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Properties; + +import org.apache.commons.io.IOUtils; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.ParameterContext; +import org.junit.jupiter.api.extension.ParameterResolutionException; +import org.junit.jupiter.api.extension.ParameterResolver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import io.jans.util.StringHelper; + +/** + * @author Yuriy Movchan + * @version 0.1, 17/02/2023 + */ +public class CustomExtension implements ParameterResolver { + + Logger logger = LoggerFactory.getLogger(CustomExtension.class); + + private Map parameters; + + public CustomExtension() throws IOException { + logger.info("Loading test properties..."); + + String propertiesFile = "target/test-classes/test.properties"; + + // Load test parameters + FileInputStream conf = new FileInputStream(propertiesFile); + Properties prop; + try { + prop = new Properties(); + prop.load(conf); + } finally { + IOUtils.closeQuietly(conf); + } + + parameters = new HashMap(); + for (Entry entry : prop.entrySet()) { + Object key = entry.getKey(); + Object value = entry.getValue(); + + if (StringHelper.isEmptyString(key)) { + continue; + } + parameters.put(key.toString(), value.toString()); + } + } + + @Override + public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { + Name name = parameterContext.getParameter().getAnnotation(Name.class); + if (name == null) { + return null; + } + + return parameters.get(name.value()); + } + + @Override + public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { + Name name = parameterContext.getParameter().getAnnotation(Name.class); + if (name == null) { + return false; + } + + boolean supports = parameters.containsKey(name.value()); + + if (!supports) { + logger.error("Parameter '{}' is not defined!", name.value()); + } + + return supports; + } + +} diff --git a/jans-fido2/server/src/test/java/io/jans/junit/extension/Name.java b/jans-fido2/server/src/test/java/io/jans/junit/extension/Name.java new file mode 100644 index 00000000000..492b3b2b737 --- /dev/null +++ b/jans-fido2/server/src/test/java/io/jans/junit/extension/Name.java @@ -0,0 +1,22 @@ +/* + * Janssen Project software is available under the Apache License (2004). See http://www.apache.org/licenses/ for full text. + * + * Copyright (c) 2023, Janssen Project + */ + +package io.jans.junit.extension; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @author Yuriy Movchan + * @version 0.1, 17/02/2023 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ ElementType.PARAMETER }) +public @interface Name { + String value() default ""; +} diff --git a/jans-fido2/server/src/test/resources/junit-platform.properties b/jans-fido2/server/src/test/resources/junit-platform.properties new file mode 100644 index 00000000000..f2ed301920c --- /dev/null +++ b/jans-fido2/server/src/test/resources/junit-platform.properties @@ -0,0 +1,3 @@ +junit.jupiter.execution.parallel.enabled = true +junit.jupiter.execution.parallel.mode.default = concurrent +junit.jupiter.execution.parallel.mode.classes.default = concurrent diff --git a/jans-fido2/server/src/test/resources/keys/secp256r1/data.txt b/jans-fido2/server/src/test/resources/keys/secp256r1/data.txt new file mode 100644 index 00000000000..30d74d25844 --- /dev/null +++ b/jans-fido2/server/src/test/resources/keys/secp256r1/data.txt @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/jans-fido2/server/src/test/resources/keys/secp256r1/private.key b/jans-fido2/server/src/test/resources/keys/secp256r1/private.key new file mode 100644 index 00000000000..d67407c6ede --- /dev/null +++ b/jans-fido2/server/src/test/resources/keys/secp256r1/private.key @@ -0,0 +1,5 @@ +-----BEGIN EC PRIVATE KEY----- +MHcCAQEEIKaIc3klyC5KegSIR/vOYP0Nc8i7iWne4gCu5VC6NTNfoAoGCCqGSM49 +AwEHoUQDQgAE0O4oVczA8JWKf0B+kEwig4JgTroni9YRzdYJlljBW1CCmDmG9MPx ++gsd9QjT/orvJ1ECgAsS03aUipgsljo2wA== +-----END EC PRIVATE KEY----- diff --git a/jans-fido2/server/src/test/resources/keys/secp256r1/public.pem b/jans-fido2/server/src/test/resources/keys/secp256r1/public.pem new file mode 100644 index 00000000000..061d3d9e890 --- /dev/null +++ b/jans-fido2/server/src/test/resources/keys/secp256r1/public.pem @@ -0,0 +1,4 @@ +-----BEGIN PUBLIC KEY----- +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE0O4oVczA8JWKf0B+kEwig4JgTron +i9YRzdYJlljBW1CCmDmG9MPx+gsd9QjT/orvJ1ECgAsS03aUipgsljo2wA== +-----END PUBLIC KEY----- diff --git a/jans-fido2/server/src/test/resources/keys/secp256r1/signature.txt b/jans-fido2/server/src/test/resources/keys/secp256r1/signature.txt new file mode 100644 index 00000000000..fb761eb41ce --- /dev/null +++ b/jans-fido2/server/src/test/resources/keys/secp256r1/signature.txt @@ -0,0 +1,2 @@ +MEQCIHpiA6t2JE77e2NGCZUd2HsInI9zpnaFEerRxUFGWxlIAiAyi54q3MCljbt7 +jhZFCjsFGmtRXmfIb3Ll66/hB3uUng== diff --git a/jans-fido2/server/src/test/resources/log4j2.xml b/jans-fido2/server/src/test/resources/log4j2.xml new file mode 100644 index 00000000000..e849b40b9ce --- /dev/null +++ b/jans-fido2/server/src/test/resources/log4j2.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/jans-fido2/server/src/test/resources/test.properties b/jans-fido2/server/src/test/resources/test.properties new file mode 100644 index 00000000000..9d0f103616e --- /dev/null +++ b/jans-fido2/server/src/test/resources/test.properties @@ -0,0 +1,9 @@ +attestation.android.two-step.issuer=https://u204.jans.info +attestation.android.two-step.challenge=PaQK6o4stA-OV53k0gTpvbVd6c80QvUE1ZSIMMy7A8c + +attestation.android.two-step.userName=admin +attestation.android.two-step.applicationId=https://u204.jans.info/jans-auth/device_authorization.htm +attestation.android.two-step.sessionId=beef5a32-1806-4757-be7f-874ef52291e1 +attestation.android.two-step.enrollmentCode= +attestation.android.two-step.finish.request={\"registrationData\":\"BQTQkVFq9hpoVXSvZqSmpjicHmb52gFz9h4Kfe3ySakpyDK2XPmdBnfM7hfRFX3VpVUt2CEnPseWvTS23UxLDGQRQJRln-7q1Ziszf-L5JWrdlvI6iaFgkyGH645CxQ5Hn9mZnZe5NdxVwhR3TDMNBv2MpbhQB8MeaA3_u23GwJRtFowggImMIIBzKADAgECAoGBAPMsD5b5G58AphKuKWl4Yz27sbE_rXFy7nPRqtJ_r4E5DSZbFvfyuos-Db0095ubB0JoyM8ccmSO_eZQ6IekOLPKCR7yC5kes-f7MaxyaphmmD4dEvmuKjF-fRsQP5tQG7zerToto8eIz0XjPaupiZxQXtSHGHHTuPhri2nfoZlrMAoGCCqGSM49BAMCMFwxIDAeBgNVBAMTF0dsdXUgb3hQdXNoMiBVMkYgdjEuMC4wMQ0wCwYDVQQKEwRHbHV1MQ8wDQYDVQQHEwZBdXN0aW4xCzAJBgNVBAgTAlRYMQswCQYDVQQGEwJVUzAeFw0xNjAzMDExODU5NDZaFw0xOTAzMDExODU5NDZaMFwxIDAeBgNVBAMTF0dsdXUgb3hQdXNoMiBVMkYgdjEuMC4wMQ0wCwYDVQQKEwRHbHV1MQ8wDQYDVQQHEwZBdXN0aW4xCzAJBgNVBAgTAlRYMQswCQYDVQQGEwJVUzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABICUKnzCE5PJ7tihiKkYu6E5Uy_sZ-RSqs_MnUJt0tB8G8GSg9nKo6P2424iV9lXX9Pil8qw4ofZ-fAXXepbp4MwCgYIKoZIzj0EAwIDSAAwRQIgUWwawAB2udURWQziDXVjSOi_QcuXiRxylqj5thFwFhYCIQCGY-CTZFi7JdkhZ05nDpbSYJBTOo1Etckh7k0qcvnO0TBFAiB5itKtggMqvS17qt613oneBSEGaNdXDKbXSmuySOJCnQIhAIKTERJWlYtz3dQF_BlKr3bREQgWUa7WCGarVhMbfSh8\",\"clientData\":\"eyJ0eXAiOiJuYXZpZ2F0b3IuaWQuZmluaXNoRW5yb2xsbWVudCIsImNoYWxsZW5nZSI6IlBhUUs2bzRzdEEtT1Y1M2swZ1RwdmJWZDZjODBRdlVFMVpTSU1NeTdBOGMiLCJvcmlnaW4iOiJodHRwczpcL1wvdTIwNC5qYW5zLmluZm8ifQ\",\"deviceData\":\"eyJuYW1lIjoiU00tRzk5MUIiLCJvc19uYW1lIjoidGlyYW1pc3UiLCJvc192ZXJzaW9uIjoiMTMiLCJwbGF0Zm9ybSI6ImFuZHJvaWQiLCJwdXNoX3Rva2VuIjoicHVzaF90b2tlbiIsInR5cGUiOiJub3JtYWwiLCJ1dWlkIjoiM2ZlNjA2OWMtMDExMi0zMmQwLWFkNjAtNTc2MjRmZmE1ODQ0In0=\"} +