Skip to content

Commit

Permalink
Merge PR #146
Browse files Browse the repository at this point in the history
  • Loading branch information
AdamVe committed Jul 23, 2024
2 parents 9a7d87d + 48fd760 commit 274e2f6
Show file tree
Hide file tree
Showing 28 changed files with 1,345 additions and 1,095 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@
*
* @see <a href="https://fidoalliance.org/specs/fido-v2.1-ps-20210615/fido-client-to-authenticator-protocol-v2.1-ps-errata-20220621.html">Client to Authenticator Protocol (CTAP)</a>
*/
@SuppressWarnings("unused")
public class Ctap2Session extends ApplicationSession<Ctap2Session> {

private static final byte NFCCTAP_MSG = 0x10;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package com.yubico.yubikit.testing;

import com.yubico.yubikit.testing.mpe.MultiProtocolResetTests;
import com.yubico.yubikit.testing.fido.FidoTests;
import com.yubico.yubikit.testing.oath.OathTests;
import com.yubico.yubikit.testing.openpgp.OpenPgpTests;
import com.yubico.yubikit.testing.piv.PivTests;
Expand All @@ -25,14 +26,18 @@
import org.junit.runners.Suite;

/**
* All integration tests.
* All integration tests for PIV, OpenPGP, OATH, FIDO2 and MPE.
* <p>
* The YubiKey applications will be reset several times.
* <p>
*/
@RunWith(Suite.class)
@Suite.SuiteClasses({
PivTests.class,
OpenPgpTests.class,
OathTests.class,
MultiProtocolResetTests.class
MultiProtocolResetTests.class,
FidoTests.class
})
public class DeviceTests {
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,16 @@
* These tests are here to make testing a bit faster and exclude following:
* <ul>
* <li>{@link SlowTest}</li>
* <li>{@link PinUvAuthProtocolV1Test}</li>
* <li>{@link AlwaysManualTest}</li>
* </ul>
*/
@RunWith(Categories.class)
@Suite.SuiteClasses(DeviceTests.class)
@Categories.ExcludeCategory(SlowTest.class)
@Categories.ExcludeCategory({
SlowTest.class,
PinUvAuthProtocolV1Test.class,
AlwaysManualTest.class
})
public class FastDeviceTests {
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,109 +16,72 @@

package com.yubico.yubikit.testing.fido;

import static com.yubico.yubikit.testing.fido.Ctap2ClientPinInstrumentedTests.supportsPinUvAuthProtocol;

import androidx.test.filters.LargeTest;

import com.yubico.yubikit.fido.ctap.ClientPin;
import com.yubico.yubikit.fido.ctap.PinUvAuthProtocol;
import com.yubico.yubikit.fido.ctap.PinUvAuthProtocolV1;
import com.yubico.yubikit.fido.ctap.PinUvAuthProtocolV2;
import com.yubico.yubikit.testing.PinUvAuthProtocolV1Test;
import com.yubico.yubikit.testing.SmokeTest;
import com.yubico.yubikit.testing.framework.FidoInstrumentedTests;

import org.junit.Test;
import org.junit.experimental.runners.Enclosed;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

import java.util.Arrays;
import java.util.Collection;
import org.junit.runners.Suite;

@RunWith(Enclosed.class)
@RunWith(Suite.class)
@Suite.SuiteClasses({
BasicWebAuthnClientInstrumentedTests.PinUvAuthV2Test.class,
BasicWebAuthnClientInstrumentedTests.PinUvAuthV1Test.class,
})
public class BasicWebAuthnClientInstrumentedTests {
@LargeTest
@RunWith(Parameterized.class)
public static class BasicWebAuthnClientParametrizedTests extends FidoInstrumentedTests {

@Parameterized.Parameter
public PinUvAuthProtocol pinUvAuthProtocol;

@Parameterized.Parameters
public static Collection<PinUvAuthProtocol> data() {
return Arrays.asList(
new PinUvAuthProtocolV1(),
new PinUvAuthProtocolV2());
}
public static class PinUvAuthV2Test extends FidoInstrumentedTests {

@Test
@Category(SmokeTest.class)
public void testMakeCredentialGetAssertion() throws Throwable {
withCtap2Session(
(device, session) -> supportsPinUvAuthProtocol(session, pinUvAuthProtocol),
BasicWebAuthnClientTests::testMakeCredentialGetAssertion,
pinUvAuthProtocol,
TestData.PIN);
withDevice(BasicWebAuthnClientTests::testMakeCredentialGetAssertion);
}

@Test
public void testMakeCredentialGetAssertionTokenUvOnly() throws Throwable {
withCtap2Session(
(device, session) -> supportsPinUvAuthProtocol(session, pinUvAuthProtocol)
&& ClientPin.isTokenSupported(session.getCachedInfo()),
BasicWebAuthnClientTests::testMakeCredentialGetAssertion,
pinUvAuthProtocol,
null);
withDevice(BasicWebAuthnClientTests::testMakeCredentialGetAssertionTokenUvOnly);
}

@Test
public void testGetAssertionMultipleUsersRk() throws Throwable {
withCtap2Session(
(device, session) -> supportsPinUvAuthProtocol(session, pinUvAuthProtocol),
BasicWebAuthnClientTests::testGetAssertionMultipleUsersRk,
pinUvAuthProtocol);
withDevice(BasicWebAuthnClientTests::testGetAssertionMultipleUsersRk);
}

@Test
public void testGetAssertionWithAllowList() throws Throwable {
withCtap2Session(
(device, session) -> supportsPinUvAuthProtocol(session, pinUvAuthProtocol),
BasicWebAuthnClientTests::testGetAssertionWithAllowList,
pinUvAuthProtocol);
withDevice(BasicWebAuthnClientTests::testGetAssertionWithAllowList);
}

@Test
public void testMakeCredentialWithExcludeList() throws Throwable {
withCtap2Session(
(device, session) -> supportsPinUvAuthProtocol(session, pinUvAuthProtocol),
BasicWebAuthnClientTests::testMakeCredentialWithExcludeList,
pinUvAuthProtocol);
withDevice(BasicWebAuthnClientTests::testMakeCredentialWithExcludeList);
}

@Test
public void testMakeCredentialKeyAlgorithms() throws Throwable {
withCtap2Session(
(device, session) -> supportsPinUvAuthProtocol(session, pinUvAuthProtocol),
BasicWebAuthnClientTests::testMakeCredentialKeyAlgorithms,
pinUvAuthProtocol);
withDevice(BasicWebAuthnClientTests::testMakeCredentialKeyAlgorithms);
}

@Test
public void testClientPinManagement() throws Throwable {
withCtap2Session(
(device, session) -> supportsPinUvAuthProtocol(session, pinUvAuthProtocol),
BasicWebAuthnClientTests::testClientPinManagement,
pinUvAuthProtocol);
withDevice(BasicWebAuthnClientTests::testClientPinManagement);
}

@Test
public void testClientCredentialManagement() throws Throwable {
withCtap2Session(
"Credential management or PIN/UV Auth protocol not supported",
(device, session) ->
Ctap2CredentialManagementInstrumentedTests
.isCredentialManagementSupported(session) &&
supportsPinUvAuthProtocol(session, pinUvAuthProtocol),
BasicWebAuthnClientTests::testClientCredentialManagement,
pinUvAuthProtocol);
withDevice(BasicWebAuthnClientTests::testClientCredentialManagement);
}
}

@Category(PinUvAuthProtocolV1Test.class)
public static class PinUvAuthV1Test extends PinUvAuthV2Test {
@Override
protected PinUvAuthProtocol getPinUvAuthProtocol() {
return new PinUvAuthProtocolV1();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,55 +18,14 @@

import androidx.test.filters.LargeTest;

import com.yubico.yubikit.fido.ctap.BioEnrollment;
import com.yubico.yubikit.fido.ctap.Ctap2Session;
import com.yubico.yubikit.fido.ctap.PinUvAuthProtocolV2;
import com.yubico.yubikit.testing.framework.FidoInstrumentedTests;

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;

@LargeTest
public class Ctap2BioEnrollmentInstrumentedTests extends FidoInstrumentedTests {

@Test
public void testFingerprintEnrollment() {
runTest(Ctap2BioEnrollmentTests::testFingerprintEnrollment);
}

// helpers
private final static Logger logger =
LoggerFactory.getLogger(Ctap2BioEnrollmentInstrumentedTests.class);

private static boolean supportsPinUvAuthProtocol(
Ctap2Session session,
int pinUvAuthProtocolVersion) {
final List<Integer> pinUvAuthProtocols =
session.getCachedInfo().getPinUvAuthProtocols();
return pinUvAuthProtocols.contains(pinUvAuthProtocolVersion);
}

private static boolean supportsBioEnrollment(Ctap2Session session) {
return BioEnrollment.isSupported(session.getCachedInfo());
}

private static boolean isSupported(Ctap2Session session) {
return supportsBioEnrollment(session) && supportsPinUvAuthProtocol(session, 2);
}

private void runTest(Callback callback) {
try {
withCtap2Session(
"Bio enrollment or pinUvProtocol Two not supported",
(device, session) -> supportsBioEnrollment(session) && supportsPinUvAuthProtocol(session, 2),
callback,
new PinUvAuthProtocolV2()
);
} catch (Throwable throwable) {
logger.error("Caught exception: ", throwable);
}
public void testFingerprintEnrollment() throws Throwable {
withCtap2Session(Ctap2BioEnrollmentTests::testFingerprintEnrollment);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2022-2023 Yubico.
* Copyright (C) 2022-2024 Yubico.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -16,53 +16,39 @@

package com.yubico.yubikit.testing.fido;

import androidx.test.filters.LargeTest;

import com.yubico.yubikit.fido.ctap.Ctap2Session;
import com.yubico.yubikit.fido.ctap.PinUvAuthProtocol;
import com.yubico.yubikit.fido.ctap.PinUvAuthProtocolV1;
import com.yubico.yubikit.fido.ctap.PinUvAuthProtocolV2;
import com.yubico.yubikit.testing.PinUvAuthProtocolV1Test;
import com.yubico.yubikit.testing.framework.FidoInstrumentedTests;

import org.junit.Test;

import java.util.List;

@LargeTest
public class Ctap2ClientPinInstrumentedTests extends FidoInstrumentedTests {

public static boolean supportsPinUvAuthProtocol(
Ctap2Session session,
PinUvAuthProtocol pinUvAuthProtocol) {
return supportsPinUvAuthProtocol(session, pinUvAuthProtocol.getVersion());
}

public static boolean supportsPinUvAuthProtocol(
Ctap2Session session,
int pinUvAuthProtocolVersion) {
final List<Integer> pinUvAuthProtocols =
session.getCachedInfo().getPinUvAuthProtocols();
return pinUvAuthProtocols.contains(pinUvAuthProtocolVersion);
}

@Test
public void testSetPinProtocolV1() throws Throwable {
withCtap2Session(
Ctap2ClientPinTests::testSetPinProtocol,
new PinUvAuthProtocolV1()
);
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(Suite.class)
@Suite.SuiteClasses({
Ctap2ClientPinInstrumentedTests.PinUvAuthV2Test.class,
Ctap2ClientPinInstrumentedTests.PinUvAuthV1Test.class,
})
public class Ctap2ClientPinInstrumentedTests {
public static class PinUvAuthV2Test extends FidoInstrumentedTests {
@Test
public void testClientPin() throws Throwable {
withCtap2Session(Ctap2ClientPinTests::testClientPin);
}

@Test
public void testPinComplexity() throws Throwable {
withDevice(Ctap2ClientPinTests::testPinComplexity);
}
}

@Test
public void testSetPinProtocolV2() throws Throwable {
final PinUvAuthProtocol pinUvAuthProtocol = new PinUvAuthProtocolV2();
withCtap2Session(
"PIN/UV Auth Protocol not supported",
(device, session) -> supportsPinUvAuthProtocol(
session,
pinUvAuthProtocol),
Ctap2ClientPinTests::testSetPinProtocol,
pinUvAuthProtocol
);
@Category(PinUvAuthProtocolV1Test.class)
public static class PinUvAuthV1Test extends PinUvAuthV2Test {
@Override
protected PinUvAuthProtocol getPinUvAuthProtocol() {
return new PinUvAuthProtocolV1();
}
}
}
Loading

0 comments on commit 274e2f6

Please sign in to comment.