RsaEndpointIdentity.cs 4.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. //----------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //------------------------------------------------------------
  4. namespace System.ServiceModel
  5. {
  6. using System;
  7. using System.IdentityModel.Claims;
  8. using System.IdentityModel.Policy;
  9. using System.Security.Cryptography;
  10. using System.Security.Cryptography.X509Certificates;
  11. using System.ServiceModel.Security;
  12. using System.Xml;
  13. using System.Xml.Serialization;
  14. public class RsaEndpointIdentity : EndpointIdentity
  15. {
  16. public RsaEndpointIdentity(string publicKey)
  17. {
  18. if (publicKey == null)
  19. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("publicKey");
  20. base.Initialize(Claim.CreateRsaClaim(ToRsa(publicKey)));
  21. }
  22. public RsaEndpointIdentity(X509Certificate2 certificate)
  23. {
  24. if (certificate == null)
  25. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("certificate");
  26. #pragma warning suppress 56506 // A Certificate Public key can never be null.
  27. RSA rsa = certificate.PublicKey.Key as RSA;
  28. if (rsa == null)
  29. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException(SR.GetString(SR.PublicKeyNotRSA)));
  30. base.Initialize(Claim.CreateRsaClaim(rsa));
  31. }
  32. public RsaEndpointIdentity(Claim identity)
  33. {
  34. if (identity == null)
  35. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("identity");
  36. // PreSharp Bug: Parameter 'identity.ClaimType' to this public method must be validated: A null-dereference can occur here.
  37. #pragma warning suppress 56506 // Claim.ClaimType will never return null
  38. if (!identity.ClaimType.Equals(ClaimTypes.Rsa))
  39. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgument(SR.GetString(SR.UnrecognizedClaimTypeForIdentity, identity.ClaimType, ClaimTypes.Rsa));
  40. base.Initialize(identity);
  41. }
  42. internal RsaEndpointIdentity(XmlDictionaryReader reader)
  43. {
  44. reader.ReadStartElement(XD.XmlSignatureDictionary.RsaKeyValue, XD.XmlSignatureDictionary.Namespace);
  45. byte[] modulus = Convert.FromBase64String(reader.ReadElementString(XD.XmlSignatureDictionary.Modulus.Value, XD.XmlSignatureDictionary.Namespace.Value));
  46. byte[] exponent = Convert.FromBase64String(reader.ReadElementString(XD.XmlSignatureDictionary.Exponent.Value, XD.XmlSignatureDictionary.Namespace.Value));
  47. reader.ReadEndElement();
  48. RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
  49. RSAParameters parameters = new RSAParameters();
  50. parameters.Exponent = exponent;
  51. parameters.Modulus = modulus;
  52. rsa.ImportParameters(parameters);
  53. base.Initialize(Claim.CreateRsaClaim(rsa));
  54. }
  55. internal override void WriteContentsTo(XmlDictionaryWriter writer)
  56. {
  57. if (writer == null)
  58. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("writer");
  59. writer.WriteStartElement(XD.XmlSignatureDictionary.Prefix.Value, XD.XmlSignatureDictionary.KeyInfo, XD.XmlSignatureDictionary.Namespace);
  60. writer.WriteStartElement(XD.XmlSignatureDictionary.Prefix.Value, XD.XmlSignatureDictionary.RsaKeyValue, XD.XmlSignatureDictionary.Namespace);
  61. RSA rsa = (RSA)this.IdentityClaim.Resource;
  62. RSAParameters parameters = rsa.ExportParameters(false);
  63. writer.WriteElementString(XD.XmlSignatureDictionary.Prefix.Value, XD.XmlSignatureDictionary.Modulus, XD.XmlSignatureDictionary.Namespace, Convert.ToBase64String(parameters.Modulus));
  64. writer.WriteElementString(XD.XmlSignatureDictionary.Prefix.Value, XD.XmlSignatureDictionary.Exponent, XD.XmlSignatureDictionary.Namespace, Convert.ToBase64String(parameters.Exponent));
  65. writer.WriteEndElement();
  66. writer.WriteEndElement();
  67. }
  68. static RSA ToRsa(string keyString)
  69. {
  70. if (keyString == null)
  71. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("keyString");
  72. RSA rsa = new RSACryptoServiceProvider();
  73. rsa.FromXmlString(keyString);
  74. return rsa;
  75. }
  76. }
  77. }