RSA.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. //
  2. // System.Security.Cryptography.RSA.cs
  3. //
  4. // Authors:
  5. // Dan Lewis ([email protected])
  6. // Sebastien Pouliot ([email protected])
  7. //
  8. // (C) 2002
  9. // Portions (C) 2002 Motus Technologies Inc. (http://www.motus.com)
  10. //
  11. using System;
  12. using System.Text;
  13. namespace System.Security.Cryptography
  14. {
  15. internal class RSAHandler : MiniParser.IHandler {
  16. private RSAParameters rsa;
  17. private byte[] temp;
  18. public RSAHandler ()
  19. {
  20. rsa = new RSAParameters();
  21. }
  22. public RSAParameters GetParams () {
  23. return rsa;
  24. }
  25. public void OnStartParsing (MiniParser parser) {}
  26. public void OnStartElement (string name, MiniParser.IAttrList attrs) {}
  27. public void OnEndElement (string name) {
  28. switch (name) {
  29. case "P":
  30. rsa.P = temp;
  31. break;
  32. case "Q":
  33. rsa.Q = temp;
  34. break;
  35. case "D":
  36. rsa.D = temp;
  37. break;
  38. case "DP":
  39. rsa.DP = temp;
  40. break;
  41. case "DQ":
  42. rsa.DQ = temp;
  43. break;
  44. case "Exponent":
  45. rsa.Exponent = temp;
  46. break;
  47. case "InverseQ":
  48. rsa.InverseQ = temp;
  49. break;
  50. case "Modulus":
  51. rsa.Modulus = temp;
  52. break;
  53. default:
  54. // unknown tag in parameters
  55. break;
  56. }
  57. }
  58. public void OnChars (string ch)
  59. {
  60. temp = Convert.FromBase64String (ch);
  61. }
  62. public void OnEndParsing (MiniParser parser) {}
  63. }
  64. public abstract class RSA : AsymmetricAlgorithm
  65. {
  66. public static new RSA Create ()
  67. {
  68. return Create ("System.Security.Cryptography.RSA");
  69. }
  70. public static new RSA Create (string algName)
  71. {
  72. return (RSA) CryptoConfig.CreateFromName (algName);
  73. }
  74. public RSA () { }
  75. public abstract byte[] EncryptValue (byte[] rgb);
  76. public abstract byte[] DecryptValue (byte[] rgb);
  77. public abstract RSAParameters ExportParameters (bool include);
  78. public abstract void ImportParameters (RSAParameters parameters);
  79. internal void ZeroizePrivateKey (RSAParameters parameters)
  80. {
  81. if (parameters.P != null)
  82. Array.Clear(parameters.P, 0, parameters.P.Length);
  83. if (parameters.Q != null)
  84. Array.Clear(parameters.Q, 0, parameters.Q.Length);
  85. if (parameters.DP != null)
  86. Array.Clear(parameters.DP, 0, parameters.DP.Length);
  87. if (parameters.DQ != null)
  88. Array.Clear(parameters.DQ, 0, parameters.DQ.Length);
  89. if (parameters.InverseQ != null)
  90. Array.Clear(parameters.InverseQ, 0, parameters.InverseQ.Length);
  91. if (parameters.D != null)
  92. Array.Clear(parameters.D, 0, parameters.D.Length);
  93. }
  94. public override void FromXmlString (string xmlString)
  95. {
  96. if (xmlString == null)
  97. throw new ArgumentNullException ();
  98. RSAParameters rsaParams = new RSAParameters ();
  99. try {
  100. MiniParser parser = new MiniParser ();
  101. AsymmetricParameters reader = new AsymmetricParameters (xmlString);
  102. RSAHandler handler = new RSAHandler ();
  103. parser.Parse(reader, handler);
  104. ImportParameters (handler.GetParams ());
  105. }
  106. catch {
  107. ZeroizePrivateKey (rsaParams);
  108. throw new CryptographicException ();
  109. }
  110. finally {
  111. ZeroizePrivateKey (rsaParams);
  112. }
  113. }
  114. public override string ToXmlString (bool includePrivateParameters)
  115. {
  116. StringBuilder sb = new StringBuilder ();
  117. RSAParameters rsaParams = ExportParameters (includePrivateParameters);
  118. try {
  119. sb.Append ("<RSAKeyValue>");
  120. sb.Append ("<Modulus>");
  121. sb.Append (Convert.ToBase64String (rsaParams.Modulus));
  122. sb.Append ("</Modulus>");
  123. sb.Append ("<Exponent>");
  124. sb.Append (Convert.ToBase64String (rsaParams.Exponent));
  125. sb.Append ("</Exponent>");
  126. if (includePrivateParameters)
  127. {
  128. sb.Append ("<P>");
  129. sb.Append (Convert.ToBase64String (rsaParams.P));
  130. sb.Append ("</P>");
  131. sb.Append ("<Q>");
  132. sb.Append (Convert.ToBase64String (rsaParams.Q));
  133. sb.Append ("</Q>");
  134. sb.Append ("<DP>");
  135. sb.Append (Convert.ToBase64String (rsaParams.DP));
  136. sb.Append ("</DP>");
  137. sb.Append ("<DQ>");
  138. sb.Append (Convert.ToBase64String (rsaParams.DQ));
  139. sb.Append ("</DQ>");
  140. sb.Append ("<InverseQ>");
  141. sb.Append (Convert.ToBase64String (rsaParams.InverseQ));
  142. sb.Append ("</InverseQ>");
  143. sb.Append ("<D>");
  144. sb.Append (Convert.ToBase64String (rsaParams.D));
  145. sb.Append ("</D>");
  146. }
  147. sb.Append ("</RSAKeyValue>");
  148. }
  149. catch {
  150. ZeroizePrivateKey (rsaParams);
  151. throw;
  152. }
  153. return sb.ToString ();
  154. }
  155. }
  156. }