Skip to content

Commit

Permalink
Experimental: Attempt to implement key conversion using JCA and BC
Browse files Browse the repository at this point in the history
  • Loading branch information
vanitasvitae committed Mar 14, 2023
1 parent 3529e75 commit 2319d7a
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -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");
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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());
}
Expand Down Expand Up @@ -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());
}
Expand Down Expand Up @@ -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");
}
Expand Down

0 comments on commit 2319d7a

Please sign in to comment.