Skip to content

Instantly share code, notes, and snippets.

@marchof
Created November 1, 2024 13:29
Show Gist options
  • Save marchof/4e62893b636837411994f6fcf6fc371c to your computer and use it in GitHub Desktop.
Save marchof/4e62893b636837411994f6fcf6fc371c to your computer and use it in GitHub Desktop.
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.util.Map;
import org.junit.jupiter.api.Test;
public class KeyPairChecker {
private static Map<String, String> SIGNATURE_ALGOS = Map.of( //
"DSA", "SHA256WithDSA", //
"RSA", "SHA256WithRSA", //
"EC", "SHA256WithECDSA");
boolean isKeyPair(PrivateKey privateKey, PublicKey publicKey) throws Exception {
if (!privateKey.getAlgorithm().equals(publicKey.getAlgorithm())) {
return false;
}
var signature = Signature.getInstance(SIGNATURE_ALGOS.get(privateKey.getAlgorithm()));
signature.initSign(privateKey);
var signed = signature.sign();
signature.initVerify(publicKey);
return signature.verify(signed);
}
// Testing
private KeyPair createKeyPair(String algo, int size) throws NoSuchAlgorithmException {
var kpg = KeyPairGenerator.getInstance(algo);
kpg.initialize(size);
return kpg.generateKeyPair();
}
@Test
void dsa_match() throws Exception {
var pair = createKeyPair("DSA", 1024);
assertTrue(isKeyPair(pair.getPrivate(), pair.getPublic()));
}
@Test
void dsa_no_match() throws Exception {
var pair1 = createKeyPair("DSA", 1024);
var pair2 = createKeyPair("DSA", 1024);
assertFalse(isKeyPair(pair1.getPrivate(), pair2.getPublic()));
}
@Test
void rsa_match() throws Exception {
var pair = createKeyPair("RSA", 1024);
assertTrue(isKeyPair(pair.getPrivate(), pair.getPublic()));
}
@Test
void rsa_no_match() throws Exception {
var pair1 = createKeyPair("RSA", 1024);
var pair2 = createKeyPair("RSA", 1024);
assertFalse(isKeyPair(pair1.getPrivate(), pair2.getPublic()));
}
@Test
void ec_match() throws Exception {
var pair = createKeyPair("EC", 256);
assertTrue(isKeyPair(pair.getPrivate(), pair.getPublic()));
}
@Test
void ec_no_match() throws Exception {
var pair1 = createKeyPair("EC", 256);
var pair2 = createKeyPair("EC", 256);
assertFalse(isKeyPair(pair1.getPrivate(), pair2.getPublic()));
}
@Test
void algo_no_match() throws Exception {
var pair1 = createKeyPair("RSA", 1024);
var pair2 = createKeyPair("EC", 256);
assertFalse(isKeyPair(pair1.getPrivate(), pair2.getPublic()));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment