diff options
Diffstat (limited to 'crypto/src/security/DotNetUtilities.cs')
-rw-r--r-- | crypto/src/security/DotNetUtilities.cs | 49 |
1 files changed, 35 insertions, 14 deletions
diff --git a/crypto/src/security/DotNetUtilities.cs b/crypto/src/security/DotNetUtilities.cs index 4df1ae739..d50e17d39 100644 --- a/crypto/src/security/DotNetUtilities.cs +++ b/crypto/src/security/DotNetUtilities.cs @@ -1,9 +1,10 @@ -#if !(NETCF_1_0 || SILVERLIGHT || PORTABLE) +#if !(NETCF_1_0 || SILVERLIGHT) using System; using System.Security.Cryptography; using SystemX509 = System.Security.Cryptography.X509Certificates; +using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Asn1.X509; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Parameters; @@ -161,22 +162,21 @@ namespace Org.BouncyCastle.Security public static RSA ToRSA(RsaKeyParameters rsaKey) { - RSAParameters rp = ToRSAParameters(rsaKey); - RSACryptoServiceProvider rsaCsp = new RSACryptoServiceProvider(); - // TODO This call appears to not work for private keys (when no CRT info) - rsaCsp.ImportParameters(rp); - return rsaCsp; - } + // TODO This appears to not work for private keys (when no CRT info) + return CreateRSAProvider(ToRSAParameters(rsaKey)); + } public static RSA ToRSA(RsaPrivateCrtKeyParameters privKey) { - RSAParameters rp = ToRSAParameters(privKey); - RSACryptoServiceProvider rsaCsp = new RSACryptoServiceProvider(); - rsaCsp.ImportParameters(rp); - return rsaCsp; - } + return CreateRSAProvider(ToRSAParameters(privKey)); + } - public static RSAParameters ToRSAParameters(RsaKeyParameters rsaKey) + public static RSA ToRSA(RsaPrivateKeyStructure privKey) + { + return CreateRSAProvider(ToRSAParameters(privKey)); + } + + public static RSAParameters ToRSAParameters(RsaKeyParameters rsaKey) { RSAParameters rp = new RSAParameters(); rp.Modulus = rsaKey.Modulus.ToByteArrayUnsigned(); @@ -201,7 +201,21 @@ namespace Org.BouncyCastle.Security return rp; } - // TODO Move functionality to more general class + public static RSAParameters ToRSAParameters(RsaPrivateKeyStructure privKey) + { + RSAParameters rp = new RSAParameters(); + rp.Modulus = privKey.Modulus.ToByteArrayUnsigned(); + rp.Exponent = privKey.PublicExponent.ToByteArrayUnsigned(); + rp.P = privKey.Prime1.ToByteArrayUnsigned(); + rp.Q = privKey.Prime2.ToByteArrayUnsigned(); + rp.D = ConvertRSAParametersField(privKey.PrivateExponent, rp.Modulus.Length); + rp.DP = ConvertRSAParametersField(privKey.Exponent1, rp.P.Length); + rp.DQ = ConvertRSAParametersField(privKey.Exponent2, rp.Q.Length); + rp.InverseQ = ConvertRSAParametersField(privKey.Coefficient, rp.Q.Length); + return rp; + } + + // TODO Move functionality to more general class private static byte[] ConvertRSAParametersField(BigInteger n, int size) { byte[] bs = n.ToByteArrayUnsigned(); @@ -216,6 +230,13 @@ namespace Org.BouncyCastle.Security Array.Copy(bs, 0, padded, size - bs.Length, bs.Length); return padded; } + + private static RSA CreateRSAProvider(RSAParameters rp) + { + RSACryptoServiceProvider rsaCsp = new RSACryptoServiceProvider(); + rsaCsp.ImportParameters(rp); + return rsaCsp; + } } } |