blob: 7b991ea37384a028409fa215e26efd43d26d9f2a [file] [log] [blame]
package org.bouncycastle.crypto.params;
import org.bouncycastle.crypto.CipherParameters;
/**
* Parameters holder for private unified static/ephemeral agreement using Edwards Curves.
*/
public class XDHUPrivateParameters
implements CipherParameters
{
private AsymmetricKeyParameter staticPrivateKey;
private AsymmetricKeyParameter ephemeralPrivateKey;
private AsymmetricKeyParameter ephemeralPublicKey;
public XDHUPrivateParameters(
AsymmetricKeyParameter staticPrivateKey,
AsymmetricKeyParameter ephemeralPrivateKey)
{
this(staticPrivateKey, ephemeralPrivateKey, null);
}
public XDHUPrivateParameters(
AsymmetricKeyParameter staticPrivateKey,
AsymmetricKeyParameter ephemeralPrivateKey,
AsymmetricKeyParameter ephemeralPublicKey)
{
if (staticPrivateKey == null)
{
throw new NullPointerException("staticPrivateKey cannot be null");
}
if (!(staticPrivateKey instanceof X448PrivateKeyParameters || staticPrivateKey instanceof X25519PrivateKeyParameters))
{
throw new IllegalArgumentException("only X25519 and X448 paramaters can be used");
}
if (ephemeralPrivateKey == null)
{
throw new NullPointerException("ephemeralPrivateKey cannot be null");
}
if (!staticPrivateKey.getClass().isAssignableFrom(ephemeralPrivateKey.getClass()))
{
throw new IllegalArgumentException("static and ephemeral private keys have different domain parameters");
}
if (ephemeralPublicKey == null)
{
if (ephemeralPrivateKey instanceof X448PrivateKeyParameters)
{
ephemeralPublicKey = ((X448PrivateKeyParameters)ephemeralPrivateKey).generatePublicKey();
}
else
{
ephemeralPublicKey = ((X25519PrivateKeyParameters)ephemeralPrivateKey).generatePublicKey();
}
}
else
{
if (ephemeralPublicKey instanceof X448PublicKeyParameters && !(staticPrivateKey instanceof X448PrivateKeyParameters))
{
throw new IllegalArgumentException("ephemeral public key has different domain parameters");
}
if (ephemeralPublicKey instanceof X25519PublicKeyParameters && !(staticPrivateKey instanceof X25519PrivateKeyParameters))
{
throw new IllegalArgumentException("ephemeral public key has different domain parameters");
}
}
this.staticPrivateKey = staticPrivateKey;
this.ephemeralPrivateKey = ephemeralPrivateKey;
this.ephemeralPublicKey = ephemeralPublicKey;
}
public AsymmetricKeyParameter getStaticPrivateKey()
{
return staticPrivateKey;
}
public AsymmetricKeyParameter getEphemeralPrivateKey()
{
return ephemeralPrivateKey;
}
public AsymmetricKeyParameter getEphemeralPublicKey()
{
return ephemeralPublicKey;
}
}