2 // System.Security.Cryptography.RSA.cs
5 // Dan Lewis (dihlewis@yahoo.co.uk)
6 // Sebastien Pouliot (spouliot@motus.com)
9 // Portions (C) 2002 Motus Technologies Inc. (http://www.motus.com)
15 namespace System.Security.Cryptography
17 internal class RSAHandler : MiniParser.IHandler {
19 private RSAParameters rsa;
25 rsa = new RSAParameters();
28 public RSAParameters GetParams () {
32 public void OnStartParsing (MiniParser parser) {}
34 public void OnStartElement (string name, MiniParser.IAttrList attrs) {}
36 public void OnEndElement (string name) {
63 // unknown tag in parameters
68 public void OnChars (string ch)
70 temp = Convert.FromBase64String (ch);
73 public void OnEndParsing (MiniParser parser) {}
76 public abstract class RSA : AsymmetricAlgorithm
78 public static new RSA Create ()
80 return Create ("System.Security.Cryptography.RSA");
83 public static new RSA Create (string algName)
85 return (RSA) CryptoConfig.CreateFromName (algName);
90 public abstract byte[] EncryptValue (byte[] rgb);
91 public abstract byte[] DecryptValue (byte[] rgb);
93 public abstract RSAParameters ExportParameters (bool include);
94 public abstract void ImportParameters (RSAParameters parameters);
96 protected void ZeroizePrivateKey (RSAParameters parameters)
98 if (parameters.P != null)
99 Array.Clear(parameters.P, 0, parameters.P.Length);
100 if (parameters.Q != null)
101 Array.Clear(parameters.Q, 0, parameters.Q.Length);
102 if (parameters.DP != null)
103 Array.Clear(parameters.DP, 0, parameters.DP.Length);
104 if (parameters.DQ != null)
105 Array.Clear(parameters.DQ, 0, parameters.DQ.Length);
106 if (parameters.InverseQ != null)
107 Array.Clear(parameters.InverseQ, 0, parameters.InverseQ.Length);
108 if (parameters.D != null)
109 Array.Clear(parameters.D, 0, parameters.D.Length);
112 public override void FromXmlString (string xmlString)
114 if (xmlString == null)
115 throw new ArgumentNullException ();
117 RSAParameters rsaParams = new RSAParameters ();
119 MiniParser parser = new MiniParser ();
120 AsymmetricParameters reader = new AsymmetricParameters (xmlString);
121 RSAHandler handler = new RSAHandler ();
122 parser.Parse(reader, handler);
123 ImportParameters (handler.GetParams ());
126 ZeroizePrivateKey (rsaParams);
127 throw new CryptographicException ();
130 ZeroizePrivateKey (rsaParams);
134 public override string ToXmlString (bool includePrivateParameters)
136 StringBuilder sb = new StringBuilder ();
137 RSAParameters rsaParams = ExportParameters (includePrivateParameters);
139 sb.Append ("<RSAKeyValue>");
141 sb.Append ("<Modulus>");
142 sb.Append (Convert.ToBase64String (rsaParams.Modulus));
143 sb.Append ("</Modulus>");
145 sb.Append ("<Exponent>");
146 sb.Append (Convert.ToBase64String (rsaParams.Exponent));
147 sb.Append ("</Exponent>");
149 if (includePrivateParameters)
152 sb.Append (Convert.ToBase64String (rsaParams.P));
156 sb.Append (Convert.ToBase64String (rsaParams.Q));
160 sb.Append (Convert.ToBase64String (rsaParams.DP));
164 sb.Append (Convert.ToBase64String (rsaParams.DQ));
167 sb.Append ("<InverseQ>");
168 sb.Append (Convert.ToBase64String (rsaParams.InverseQ));
169 sb.Append ("</InverseQ>");
172 sb.Append (Convert.ToBase64String (rsaParams.D));
176 sb.Append ("</RSAKeyValue>");
179 ZeroizePrivateKey (rsaParams);
183 return sb.ToString ();