public AsymmetricCipherKeyPair ReadSsh2KeyData(
AsymmetricKeyParameter publicKeyParameter)
{
if (publicKeyParameter is RsaKeyParameters) {
var rsaD = new BigInteger(1, ReadBlob());
var rsaIQMP = new BigInteger(1, ReadBlob());
var rsaP = new BigInteger(1, ReadBlob());
var rsaQ = new BigInteger(1, ReadBlob());
/* compute missing parameters */
var rsaDP = rsaD.Remainder(rsaP.Subtract(BigInteger.One));
var rsaDQ = rsaD.Remainder(rsaQ.Subtract(BigInteger.One));
var rsaPublicKeyParams = publicKeyParameter as RsaKeyParameters;
var rsaPrivateKeyParams = new RsaPrivateCrtKeyParameters(
rsaPublicKeyParams.Modulus, rsaPublicKeyParams.Exponent,
rsaD, rsaP, rsaQ, rsaDP, rsaDQ, rsaIQMP);
return new AsymmetricCipherKeyPair(rsaPublicKeyParams, rsaPrivateKeyParams);
} else if (publicKeyParameter is DsaPublicKeyParameters) {
var dsaX = new BigInteger(1, ReadBlob()); // private key
var dsaPublicKeyParams = publicKeyParameter as DsaPublicKeyParameters;
DsaPrivateKeyParameters dsaPrivateKeyParams =
new DsaPrivateKeyParameters(dsaX, dsaPublicKeyParams.Parameters);
return new AsymmetricCipherKeyPair(dsaPublicKeyParams, dsaPrivateKeyParams);
} else if (publicKeyParameter is ECPublicKeyParameters) {
var ecdsaPrivate = new BigInteger(1, ReadBlob());
var ecPublicKeyParams = publicKeyParameter as ECPublicKeyParameters;
ECPrivateKeyParameters ecPrivateKeyParams =
new ECPrivateKeyParameters(ecdsaPrivate, ecPublicKeyParams.Parameters);
return new AsymmetricCipherKeyPair(ecPublicKeyParams, ecPrivateKeyParams);
} else if (publicKeyParameter is Ed25519PublicKeyParameter) {
var ed25519Signature = ReadBlob();
var ed25519PrivateKey = new Ed25519PrivateKeyParameter(ed25519Signature);
return new AsymmetricCipherKeyPair(publicKeyParameter, ed25519PrivateKey);
} else {
// unsupported encryption algorithm
throw new Exception("Unsupported algorithm");
}
}