BinaryNegotiation.cs 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. //------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //------------------------------------------------------------
  4. namespace System.ServiceModel.Security
  5. {
  6. using System;
  7. using System.Xml;
  8. using System.ServiceModel.Channels;
  9. internal sealed class BinaryNegotiation
  10. {
  11. private byte[] negotiationData;
  12. XmlDictionaryString valueTypeUriDictionaryString;
  13. string valueTypeUri;
  14. public BinaryNegotiation(
  15. string valueTypeUri,
  16. byte[] negotiationData)
  17. {
  18. if (valueTypeUri == null)
  19. {
  20. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("valueTypeUri");
  21. }
  22. if (negotiationData == null)
  23. {
  24. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("negotiationData");
  25. }
  26. this.valueTypeUriDictionaryString = null;
  27. this.valueTypeUri = valueTypeUri;
  28. this.negotiationData = negotiationData;
  29. }
  30. public BinaryNegotiation(
  31. XmlDictionaryString valueTypeDictionaryString,
  32. byte[] negotiationData)
  33. {
  34. if (valueTypeDictionaryString == null)
  35. {
  36. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("valueTypeDictionaryString");
  37. }
  38. if (negotiationData == null)
  39. {
  40. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("negotiationData");
  41. }
  42. this.valueTypeUriDictionaryString = valueTypeDictionaryString;
  43. this.valueTypeUri = valueTypeDictionaryString.Value;
  44. this.negotiationData = negotiationData;
  45. }
  46. public void Validate(XmlDictionaryString valueTypeUriDictionaryString)
  47. {
  48. if (this.valueTypeUri != valueTypeUriDictionaryString.Value)
  49. {
  50. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new SecurityNegotiationException(SR.GetString(SR.IncorrectBinaryNegotiationValueType, this.valueTypeUri)));
  51. }
  52. this.valueTypeUriDictionaryString = valueTypeUriDictionaryString;
  53. }
  54. public void WriteTo(XmlDictionaryWriter writer, string prefix, XmlDictionaryString localName, XmlDictionaryString ns, XmlDictionaryString valueTypeLocalName, XmlDictionaryString valueTypeNs)
  55. {
  56. writer.WriteStartElement(prefix, localName, ns);
  57. writer.WriteStartAttribute(valueTypeLocalName, valueTypeNs);
  58. if (valueTypeUriDictionaryString != null)
  59. writer.WriteString(valueTypeUriDictionaryString);
  60. else
  61. writer.WriteString(valueTypeUri);
  62. writer.WriteEndAttribute();
  63. writer.WriteStartAttribute(XD.SecurityJan2004Dictionary.EncodingType, null);
  64. writer.WriteString(XD.SecurityJan2004Dictionary.EncodingTypeValueBase64Binary);
  65. writer.WriteEndAttribute();
  66. writer.WriteBase64(this.negotiationData, 0, this.negotiationData.Length);
  67. writer.WriteEndElement();
  68. }
  69. public string ValueTypeUri
  70. {
  71. get
  72. {
  73. return this.valueTypeUri;
  74. }
  75. }
  76. public byte[] GetNegotiationData()
  77. {
  78. // avoid copying since this is internal and callers use it as read-only
  79. return this.negotiationData;
  80. }
  81. }
  82. }