From 2319d7aad760eb8a3ae7467730012da8d4f8bb21 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Tue, 14 Mar 2023 01:57:21 +0100 Subject: [PATCH] Experimental: Attempt to implement key conversion using JCA and BC --- .../operator/bc/BcPGPKeyConverter.java | 16 ++++- .../operator/jcajce/JcaPGPKeyConverter.java | 65 +++++++++++++++++++ 2 files changed, 80 insertions(+), 1 deletion(-) diff --git a/pg/src/main/java/org/bouncycastle/openpgp/operator/bc/BcPGPKeyConverter.java b/pg/src/main/java/org/bouncycastle/openpgp/operator/bc/BcPGPKeyConverter.java index a795c626c8..4e47f40638 100644 --- a/pg/src/main/java/org/bouncycastle/openpgp/operator/bc/BcPGPKeyConverter.java +++ b/pg/src/main/java/org/bouncycastle/openpgp/operator/bc/BcPGPKeyConverter.java @@ -380,7 +380,21 @@ private BCPGKey getPrivateBCPGKey(PGPPublicKey pubKey, AsymmetricKeyParameter pr return new RSASecretBCPGKey(rsK.getExponent(), rsK.getP(), rsK.getQ()); } - default: + case PublicKeyAlgorithmTags.X25519: + X25519PrivateKeyParameters x25519K = (X25519PrivateKeyParameters) privKey; + return new X25519SecretBCPGKey(x25519K.getEncoded()); + case PublicKeyAlgorithmTags.X448: + X448PrivateKeyParameters x448K = (X448PrivateKeyParameters) privKey; + return new X448SecretBCPGKey(x448K.getEncoded()); + case PublicKeyAlgorithmTags.Ed25519: + Ed25519PrivateKeyParameters ed25519K = (Ed25519PrivateKeyParameters) privKey; + return new Ed25519SecretBCPGKey(ed25519K.getEncoded()); + case PublicKeyAlgorithmTags.Ed448: + Ed448PrivateKeyParameters ed448K = (Ed448PrivateKeyParameters) privKey; + return new Ed448SecretBCPGKey(ed448K.getEncoded()); + + + default: throw new PGPException("unknown key class"); } } diff --git a/pg/src/main/java/org/bouncycastle/openpgp/operator/jcajce/JcaPGPKeyConverter.java b/pg/src/main/java/org/bouncycastle/openpgp/operator/jcajce/JcaPGPKeyConverter.java index cb2235af45..f307da031f 100644 --- a/pg/src/main/java/org/bouncycastle/openpgp/operator/jcajce/JcaPGPKeyConverter.java +++ b/pg/src/main/java/org/bouncycastle/openpgp/operator/jcajce/JcaPGPKeyConverter.java @@ -56,6 +56,10 @@ import org.bouncycastle.bcpg.ECDSAPublicBCPGKey; import org.bouncycastle.bcpg.ECPublicBCPGKey; import org.bouncycastle.bcpg.ECSecretBCPGKey; +import org.bouncycastle.bcpg.Ed25519PublicBCPGKey; +import org.bouncycastle.bcpg.Ed25519SecretBCPGKey; +import org.bouncycastle.bcpg.Ed448PublicBCPGKey; +import org.bouncycastle.bcpg.Ed448SecretBCPGKey; import org.bouncycastle.bcpg.EdDSAPublicBCPGKey; import org.bouncycastle.bcpg.EdSecretBCPGKey; import org.bouncycastle.bcpg.ElGamalPublicBCPGKey; @@ -66,6 +70,10 @@ import org.bouncycastle.bcpg.RSAPublicBCPGKey; import org.bouncycastle.bcpg.RSASecretBCPGKey; import org.bouncycastle.bcpg.SymmetricKeyAlgorithmTags; +import org.bouncycastle.bcpg.X25519PublicBCPGKey; +import org.bouncycastle.bcpg.X25519SecretBCPGKey; +import org.bouncycastle.bcpg.X448PublicBCPGKey; +import org.bouncycastle.bcpg.X448SecretBCPGKey; import org.bouncycastle.jcajce.util.DefaultJcaJceHelper; import org.bouncycastle.jcajce.util.NamedJcaJceHelper; import org.bouncycastle.jcajce.util.ProviderJcaJceHelper; @@ -234,6 +242,30 @@ public PrivateKey getPrivateKey(PGPPrivateKey privKey) return implGeneratePrivate("RSA", rsaPrivSpec); } + case PublicKeyAlgorithmTags.X25519: + X25519SecretBCPGKey x25519Priv = (X25519SecretBCPGKey) privPk; + return implGetPrivateKeyPKCS8("XDH", new PrivateKeyInfo( + new AlgorithmIdentifier(EdECObjectIdentifiers.id_X25519), + new DEROctetString(x25519Priv.getKey()))); + + case PublicKeyAlgorithmTags.X448: + X448SecretBCPGKey x448Priv = (X448SecretBCPGKey) privPk; + return implGetPrivateKeyPKCS8("XDH", new PrivateKeyInfo( + new AlgorithmIdentifier(EdECObjectIdentifiers.id_X448), + new DEROctetString(x448Priv.getKey()))); + + case PublicKeyAlgorithmTags.Ed25519: + Ed25519SecretBCPGKey ed25519Priv = (Ed25519SecretBCPGKey) privPk; + return implGetPrivateKeyPKCS8("EdDSA", new PrivateKeyInfo( + new AlgorithmIdentifier(EdECObjectIdentifiers.id_Ed25519), + new DEROctetString(ed25519Priv.getKey()))); + + case PublicKeyAlgorithmTags.Ed448: + Ed448SecretBCPGKey ed448Priv = (Ed448SecretBCPGKey) privPk; + return implGetPrivateKeyPKCS8("EdDSA", new PrivateKeyInfo( + new AlgorithmIdentifier(EdECObjectIdentifiers.id_Ed448), + new DEROctetString(ed448Priv.getKey()))); + default: throw new PGPException("unknown public key algorithm encountered: " + pubPk.getAlgorithm()); } @@ -325,6 +357,30 @@ public PublicKey getPublicKey(PGPPublicKey publicKey) return implGeneratePublic("RSA", rsaSpec); } + case PublicKeyAlgorithmTags.X25519: + X25519PublicBCPGKey x25519Pub = (X25519PublicBCPGKey) publicPk.getKey(); + return implGetPublicKeyX509("XDH", new SubjectPublicKeyInfo( + new AlgorithmIdentifier(EdECObjectIdentifiers.id_X25519), + x25519Pub.getKey())); + + case PublicKeyAlgorithmTags.X448: + X448PublicBCPGKey x448Pub = (X448PublicBCPGKey) publicPk.getKey(); + return implGetPublicKeyX509("XDH", new SubjectPublicKeyInfo( + new AlgorithmIdentifier(EdECObjectIdentifiers.id_X448), + x448Pub.getKey())); + + case PublicKeyAlgorithmTags.Ed25519: + Ed25519PublicBCPGKey ed25519Pub = (Ed25519PublicBCPGKey) publicPk.getKey(); + return implGetPublicKeyX509("EdDSA", new SubjectPublicKeyInfo( + new AlgorithmIdentifier(EdECObjectIdentifiers.id_Ed25519), + ed25519Pub.getKey())); + + case PublicKeyAlgorithmTags.Ed448: + Ed448PublicBCPGKey ed448Pub = (Ed448PublicBCPGKey) publicPk.getKey(); + return implGetPublicKeyX509("EdDSA", new SubjectPublicKeyInfo( + new AlgorithmIdentifier(EdECObjectIdentifiers.id_Ed25519), + ed448Pub.getKey())); + default: throw new PGPException("unknown public key algorithm encountered: " + publicPk.getAlgorithm()); } @@ -426,6 +482,15 @@ private BCPGKey getPrivateBCPGKey(PGPPublicKey pub, PrivateKey privKey) return new RSASecretBCPGKey(rsK.getPrivateExponent(), rsK.getPrimeP(), rsK.getPrimeQ()); } + case PublicKeyAlgorithmTags.X25519: + return new X25519SecretBCPGKey(privKey.getEncoded()); + case PublicKeyAlgorithmTags.X448: + return new X448SecretBCPGKey(privKey.getEncoded()); + case PublicKeyAlgorithmTags.Ed25519: + return new Ed25519SecretBCPGKey(privKey.getEncoded()); + case PublicKeyAlgorithmTags.Ed448: + return new Ed448SecretBCPGKey(privKey.getEncoded()); + default: throw new PGPException("unknown key class"); }