2002-10-19 Sebastien Pouliot <spouliot@videotron.ca>
[mono.git] / mcs / class / corlib / System.Security.Cryptography / RSA.cs
1 //
2 // System.Security.Cryptography.RSA.cs
3 //
4 // Authors:
5 //   Dan Lewis (dihlewis@yahoo.co.uk)
6 //   Sebastien Pouliot (spouliot@motus.com)
7 //
8 // (C) 2002
9 // Portions (C) 2002 Motus Technologies Inc. (http://www.motus.com)
10 //
11
12 using System;
13 using System.Text;
14 //using System.Xml;
15
16 namespace System.Security.Cryptography 
17 {
18         public abstract class RSA : AsymmetricAlgorithm 
19         {
20                 public static new RSA Create () 
21                 {
22                         return Create ("System.Security.Cryptography.RSA");
23                 }
24
25                 public static new RSA Create (string algName)
26                 {
27                         return (RSA) CryptoConfig.CreateFromName (algName);
28                 }
29         
30                 public RSA () { }
31
32                 public abstract byte[] EncryptValue (byte[] rgb);
33                 public abstract byte[] DecryptValue (byte[] rgb);
34
35                 public abstract RSAParameters ExportParameters (bool include);
36                 public abstract void ImportParameters (RSAParameters parameters);
37
38                 protected void ZeroizePrivateKey (RSAParameters parameters)
39                 {
40                         if (parameters.P != null)
41                                 Array.Clear(parameters.P, 0, parameters.P.Length);
42                         if (parameters.Q != null)
43                                 Array.Clear(parameters.Q, 0, parameters.Q.Length);
44                         if (parameters.DP != null)
45                                 Array.Clear(parameters.DP, 0, parameters.DP.Length);
46                         if (parameters.DQ != null)
47                                 Array.Clear(parameters.DQ, 0, parameters.DQ.Length);
48                         if (parameters.InverseQ != null)
49                                 Array.Clear(parameters.InverseQ, 0, parameters.InverseQ.Length);
50                         if (parameters.D != null)
51                                 Array.Clear(parameters.D, 0, parameters.D.Length);
52                 }
53
54                 public override void FromXmlString (string xmlString) 
55                 {
56                         if (xmlString == null)
57                                 throw new ArgumentNullException ();
58
59                         RSAParameters rsaParams = new RSAParameters ();
60                         try {
61 /*                              XmlDocument xml = new XmlDocument ();
62                                 xml.LoadXml (xmlString);
63                                 rsaParams.Modulus = GetElement (xml, "Modulus");
64                                 rsaParams.Exponent = GetElement (xml, "Exponent");
65                                 rsaParams.P = GetElement (xml, "P");
66                                 rsaParams.Q = GetElement (xml, "Q");
67                                 rsaParams.DP = GetElement (xml, "DP");
68                                 rsaParams.DQ = GetElement (xml, "DQ");
69                                 rsaParams.InverseQ = GetElement (xml, "InverseQ");
70                                 rsaParams.D = GetElement (xml, "D");*/
71                                 ImportParameters (rsaParams);
72                         }
73                         catch {
74                                 ZeroizePrivateKey (rsaParams);
75                                 throw new CryptographicException ();
76                         }
77                         finally {
78                                 ZeroizePrivateKey (rsaParams);
79                         }
80                 }
81
82                 public override string ToXmlString (bool includePrivateParameters) 
83                 {
84                         StringBuilder sb = new StringBuilder ();
85                         RSAParameters rsaParams = ExportParameters (includePrivateParameters);
86                         try {
87                                 sb.Append ("<RSAKeyValue>");
88                                 
89                                 sb.Append ("<Modulus>");
90                                 sb.Append (Convert.ToBase64String (rsaParams.Modulus));
91                                 sb.Append ("</Modulus>");
92
93                                 sb.Append ("<Exponent>");
94                                 sb.Append (Convert.ToBase64String (rsaParams.Exponent));
95                                 sb.Append ("</Exponent>");
96
97                                 if (includePrivateParameters)
98                                 {
99                                         sb.Append ("<P>");
100                                         sb.Append (Convert.ToBase64String (rsaParams.P));
101                                         sb.Append ("</P>");
102
103                                         sb.Append ("<Q>");
104                                         sb.Append (Convert.ToBase64String (rsaParams.Q));
105                                         sb.Append ("</Q>");
106
107                                         sb.Append ("<DP>");
108                                         sb.Append (Convert.ToBase64String (rsaParams.DP));
109                                         sb.Append ("</DP>");
110
111                                         sb.Append ("<DQ>");
112                                         sb.Append (Convert.ToBase64String (rsaParams.DQ));
113                                         sb.Append ("</DQ>");
114
115                                         sb.Append ("<InverseQ>");
116                                         sb.Append (Convert.ToBase64String (rsaParams.InverseQ));
117                                         sb.Append ("</InverseQ>");
118
119                                         sb.Append ("<D>");
120                                         sb.Append (Convert.ToBase64String (rsaParams.D));
121                                         sb.Append ("</D>");
122                                 }
123                                 
124                                 sb.Append ("</RSAKeyValue>");
125                         }
126                         catch {
127                                 ZeroizePrivateKey (rsaParams);
128                                 throw;
129                         }
130                         finally {
131                                 ZeroizePrivateKey (rsaParams);
132                         }
133
134                         
135                         return sb.ToString ();
136                 }
137         }
138 }