From 0fceb4db2d9a272188d2a2708070a6e4ce20efdc Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Wed, 29 Jan 2025 12:10:14 +0100 Subject: [PATCH] Basic v6 key generation test --- .../key/generation/KeyRingBuilder.kt | 5 ++- .../key/generation/KeyRingTemplates.kt | 45 ++++++++++--------- .../key/generation/GenerateV6KeyTest.java | 18 ++++++++ 3 files changed, 44 insertions(+), 24 deletions(-) create mode 100644 pgpainless-core/src/test/java/org/pgpainless/key/generation/GenerateV6KeyTest.java diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/KeyRingBuilder.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/KeyRingBuilder.kt index 483fd6d2..8f3c5176 100644 --- a/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/KeyRingBuilder.kt +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/KeyRingBuilder.kt @@ -91,7 +91,7 @@ class KeyRingBuilder(private val version: OpenPGPKeyVersion) : requireNotNull(primaryKeySpec) { "Primary Key spec required." } val certKey = generateKeyPair(primaryKeySpec!!, version) val signer = buildContentSigner(certKey) - val signatureGenerator = PGPSignatureGenerator(signer) + val signatureGenerator = PGPSignatureGenerator(signer, certKey.publicKey) val hashedSubPacketGenerator = primaryKeySpec!!.subpacketGenerator hashedSubPacketGenerator.setIssuerFingerprintAndKeyId(certKey.publicKey) @@ -203,7 +203,8 @@ class KeyRingBuilder(private val version: OpenPGPKeyVersion) : return hashedSubpackets } - val bindingSignatureGenerator = PGPSignatureGenerator(buildContentSigner(subKey)) + val bindingSignatureGenerator = + PGPSignatureGenerator(buildContentSigner(subKey), subKey.publicKey) bindingSignatureGenerator.init(SignatureType.PRIMARYKEY_BINDING.code, subKey.privateKey) val primaryKeyBindingSig = bindingSignatureGenerator.generateCertification(primaryKey.publicKey, subKey.publicKey) diff --git a/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/KeyRingTemplates.kt b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/KeyRingTemplates.kt index 98cf9b2b..bb8788e1 100644 --- a/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/KeyRingTemplates.kt +++ b/pgpainless-core/src/main/kotlin/org/pgpainless/key/generation/KeyRingTemplates.kt @@ -125,25 +125,25 @@ class KeyRingTemplates(private val version: OpenPGPKeyVersion) { fun simpleEcKeyRing( userId: CharSequence?, passphrase: Passphrase = Passphrase.emptyPassphrase() - ): PGPSecretKeyRing = - buildKeyRing(version) + ): PGPSecretKeyRing { + val signingKeyType = + if (version == OpenPGPKeyVersion.v6) KeyType.Ed25519() + else KeyType.EDDSA_LEGACY(EdDSALegacyCurve._Ed25519) + val encryptionKeyType = + if (version == OpenPGPKeyVersion.v6) KeyType.X25519() + else KeyType.XDH_LEGACY(XDHLegacySpec._X25519) + return buildKeyRing(version) .apply { - setPrimaryKey( - getBuilder( - KeyType.EDDSA_LEGACY(EdDSALegacyCurve._Ed25519), - KeyFlag.CERTIFY_OTHER, - KeyFlag.SIGN_DATA)) + setPrimaryKey(getBuilder(signingKeyType, KeyFlag.CERTIFY_OTHER, KeyFlag.SIGN_DATA)) addSubkey( - getBuilder( - KeyType.XDH_LEGACY(XDHLegacySpec._X25519), - KeyFlag.ENCRYPT_STORAGE, - KeyFlag.ENCRYPT_COMMS)) + getBuilder(encryptionKeyType, KeyFlag.ENCRYPT_STORAGE, KeyFlag.ENCRYPT_COMMS)) setPassphrase(passphrase) if (userId != null) { addUserId(userId.toString()) } } .build() + } /** * Creates a key ring consisting of an ed25519 EdDSA primary key and a X25519 XDH subkey. The @@ -175,25 +175,26 @@ class KeyRingTemplates(private val version: OpenPGPKeyVersion) { fun modernKeyRing( userId: CharSequence?, passphrase: Passphrase = Passphrase.emptyPassphrase() - ): PGPSecretKeyRing = - buildKeyRing(version) + ): PGPSecretKeyRing { + val signingKeyType = + if (version == OpenPGPKeyVersion.v6) KeyType.Ed25519() + else KeyType.EDDSA_LEGACY(EdDSALegacyCurve._Ed25519) + val encryptionKeyType = + if (version == OpenPGPKeyVersion.v6) KeyType.X25519() + else KeyType.XDH_LEGACY(XDHLegacySpec._X25519) + return buildKeyRing(version) .apply { - setPrimaryKey( - getBuilder( - KeyType.EDDSA_LEGACY(EdDSALegacyCurve._Ed25519), KeyFlag.CERTIFY_OTHER)) + setPrimaryKey(getBuilder(signingKeyType, KeyFlag.CERTIFY_OTHER)) addSubkey( - getBuilder( - KeyType.XDH_LEGACY(XDHLegacySpec._X25519), - KeyFlag.ENCRYPT_COMMS, - KeyFlag.ENCRYPT_STORAGE)) - addSubkey( - getBuilder(KeyType.EDDSA_LEGACY(EdDSALegacyCurve._Ed25519), KeyFlag.SIGN_DATA)) + getBuilder(encryptionKeyType, KeyFlag.ENCRYPT_COMMS, KeyFlag.ENCRYPT_STORAGE)) + addSubkey(getBuilder(signingKeyType, KeyFlag.SIGN_DATA)) setPassphrase(passphrase) if (userId != null) { addUserId(userId) } } .build() + } /** * Generate a modern PGP key ring consisting of an ed25519 EdDSA primary key which is used to diff --git a/pgpainless-core/src/test/java/org/pgpainless/key/generation/GenerateV6KeyTest.java b/pgpainless-core/src/test/java/org/pgpainless/key/generation/GenerateV6KeyTest.java new file mode 100644 index 00000000..48843b92 --- /dev/null +++ b/pgpainless-core/src/test/java/org/pgpainless/key/generation/GenerateV6KeyTest.java @@ -0,0 +1,18 @@ +package org.pgpainless.key.generation; + +import org.bouncycastle.openpgp.PGPSecretKeyRing; +import org.junit.jupiter.api.Test; +import org.pgpainless.PGPainless; +import org.pgpainless.algorithm.OpenPGPKeyVersion; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class GenerateV6KeyTest { + + @Test + public void generateModernV6Key() { + PGPSecretKeyRing secretKey = PGPainless.generateKeyRing(OpenPGPKeyVersion.v6) + .modernKeyRing("Alice "); + assertEquals(6, secretKey.getPublicKey().getVersion()); + } +}