XmlSigningNodeWriter.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. //------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //------------------------------------------------------------
  4. namespace System.Xml
  5. {
  6. using System.IO;
  7. using System.Text;
  8. class XmlSigningNodeWriter : XmlNodeWriter
  9. {
  10. XmlNodeWriter writer;
  11. XmlCanonicalWriter signingWriter;
  12. byte[] chars;
  13. byte[] base64Chars;
  14. bool text;
  15. public XmlSigningNodeWriter(bool text)
  16. {
  17. this.text = text;
  18. }
  19. public void SetOutput(XmlNodeWriter writer, Stream stream, bool includeComments, string[] inclusivePrefixes)
  20. {
  21. this.writer = writer;
  22. if (signingWriter == null)
  23. signingWriter = new XmlCanonicalWriter();
  24. this.signingWriter.SetOutput(stream, includeComments, inclusivePrefixes);
  25. this.chars = new byte[XmlConverter.MaxPrimitiveChars];
  26. this.base64Chars = null;
  27. }
  28. public XmlNodeWriter NodeWriter
  29. {
  30. get
  31. {
  32. return writer;
  33. }
  34. set
  35. {
  36. writer = value;
  37. }
  38. }
  39. public XmlCanonicalWriter CanonicalWriter
  40. {
  41. get
  42. {
  43. return signingWriter;
  44. }
  45. }
  46. public override void Flush()
  47. {
  48. writer.Flush();
  49. signingWriter.Flush();
  50. }
  51. public override void Close()
  52. {
  53. writer.Close();
  54. signingWriter.Close();
  55. }
  56. public override void WriteDeclaration()
  57. {
  58. writer.WriteDeclaration();
  59. signingWriter.WriteDeclaration();
  60. }
  61. public override void WriteComment(string text)
  62. {
  63. writer.WriteComment(text);
  64. signingWriter.WriteComment(text);
  65. }
  66. public override void WriteCData(string text)
  67. {
  68. writer.WriteCData(text);
  69. signingWriter.WriteEscapedText(text);
  70. }
  71. public override void WriteStartElement(string prefix, string localName)
  72. {
  73. writer.WriteStartElement(prefix, localName);
  74. signingWriter.WriteStartElement(prefix, localName);
  75. }
  76. public override void WriteStartElement(byte[] prefixBuffer, int prefixOffset, int prefixLength,
  77. byte[] localNameBuffer, int localNameOffset, int localNameLength)
  78. {
  79. writer.WriteStartElement(prefixBuffer, prefixOffset, prefixLength, localNameBuffer, localNameOffset, localNameLength);
  80. signingWriter.WriteStartElement(prefixBuffer, prefixOffset, prefixLength, localNameBuffer, localNameOffset, localNameLength);
  81. }
  82. public override void WriteStartElement(string prefix, XmlDictionaryString localName)
  83. {
  84. writer.WriteStartElement(prefix, localName);
  85. signingWriter.WriteStartElement(prefix, localName.Value);
  86. }
  87. public override void WriteEndStartElement(bool isEmpty)
  88. {
  89. writer.WriteEndStartElement(isEmpty);
  90. signingWriter.WriteEndStartElement(isEmpty);
  91. }
  92. public override void WriteEndElement(string prefix, string localName)
  93. {
  94. writer.WriteEndElement(prefix, localName);
  95. signingWriter.WriteEndElement(prefix, localName);
  96. }
  97. public override void WriteXmlnsAttribute(string prefix, string ns)
  98. {
  99. writer.WriteXmlnsAttribute(prefix, ns);
  100. signingWriter.WriteXmlnsAttribute(prefix, ns);
  101. }
  102. public override void WriteXmlnsAttribute(byte[] prefixBuffer, int prefixOffset, int prefixLength,
  103. byte[] nsBuffer, int nsOffset, int nsLength)
  104. {
  105. writer.WriteXmlnsAttribute(prefixBuffer, prefixOffset, prefixLength, nsBuffer, nsOffset, nsLength);
  106. signingWriter.WriteXmlnsAttribute(prefixBuffer, prefixOffset, prefixLength, nsBuffer, nsOffset, nsLength);
  107. }
  108. public override void WriteXmlnsAttribute(string prefix, XmlDictionaryString ns)
  109. {
  110. writer.WriteXmlnsAttribute(prefix, ns);
  111. signingWriter.WriteXmlnsAttribute(prefix, ns.Value);
  112. }
  113. public override void WriteStartAttribute(string prefix, string localName)
  114. {
  115. writer.WriteStartAttribute(prefix, localName);
  116. signingWriter.WriteStartAttribute(prefix, localName);
  117. }
  118. public override void WriteStartAttribute(byte[] prefixBuffer, int prefixOffset, int prefixLength,
  119. byte[] localNameBuffer, int localNameOffset, int localNameLength)
  120. {
  121. writer.WriteStartAttribute(prefixBuffer, prefixOffset, prefixLength, localNameBuffer, localNameOffset, localNameLength);
  122. signingWriter.WriteStartAttribute(prefixBuffer, prefixOffset, prefixLength, localNameBuffer, localNameOffset, localNameLength);
  123. }
  124. public override void WriteStartAttribute(string prefix, XmlDictionaryString localName)
  125. {
  126. writer.WriteStartAttribute(prefix, localName);
  127. signingWriter.WriteStartAttribute(prefix, localName.Value);
  128. }
  129. public override void WriteEndAttribute()
  130. {
  131. writer.WriteEndAttribute();
  132. signingWriter.WriteEndAttribute();
  133. }
  134. public override void WriteCharEntity(int ch)
  135. {
  136. writer.WriteCharEntity(ch);
  137. signingWriter.WriteCharEntity(ch);
  138. }
  139. public override void WriteEscapedText(string value)
  140. {
  141. writer.WriteEscapedText(value);
  142. signingWriter.WriteEscapedText(value);
  143. }
  144. public override void WriteEscapedText(char[] chars, int offset, int count)
  145. {
  146. writer.WriteEscapedText(chars, offset, count);
  147. signingWriter.WriteEscapedText(chars, offset, count);
  148. }
  149. public override void WriteEscapedText(XmlDictionaryString value)
  150. {
  151. writer.WriteEscapedText(value);
  152. signingWriter.WriteEscapedText(value.Value);
  153. }
  154. public override void WriteEscapedText(byte[] chars, int offset, int count)
  155. {
  156. writer.WriteEscapedText(chars, offset, count);
  157. signingWriter.WriteEscapedText(chars, offset, count);
  158. }
  159. public override void WriteText(string value)
  160. {
  161. writer.WriteText(value);
  162. signingWriter.WriteText(value);
  163. }
  164. public override void WriteText(char[] chars, int offset, int count)
  165. {
  166. writer.WriteText(chars, offset, count);
  167. signingWriter.WriteText(chars, offset, count);
  168. }
  169. public override void WriteText(byte[] chars, int offset, int count)
  170. {
  171. writer.WriteText(chars, offset, count);
  172. signingWriter.WriteText(chars, offset, count);
  173. }
  174. public override void WriteText(XmlDictionaryString value)
  175. {
  176. writer.WriteText(value);
  177. signingWriter.WriteText(value.Value);
  178. }
  179. public override void WriteInt32Text(int value)
  180. {
  181. int count = XmlConverter.ToChars(value, chars, 0);
  182. if (text)
  183. writer.WriteText(chars, 0, count);
  184. else
  185. writer.WriteInt32Text(value);
  186. signingWriter.WriteText(chars, 0, count);
  187. }
  188. public override void WriteInt64Text(Int64 value)
  189. {
  190. int count = XmlConverter.ToChars(value, chars, 0);
  191. if (text)
  192. writer.WriteText(chars, 0, count);
  193. else
  194. writer.WriteInt64Text(value);
  195. signingWriter.WriteText(chars, 0, count);
  196. }
  197. public override void WriteBoolText(bool value)
  198. {
  199. int count = XmlConverter.ToChars(value, chars, 0);
  200. if (text)
  201. writer.WriteText(chars, 0, count);
  202. else
  203. writer.WriteBoolText(value);
  204. signingWriter.WriteText(chars, 0, count);
  205. }
  206. public override void WriteUInt64Text(UInt64 value)
  207. {
  208. int count = XmlConverter.ToChars(value, chars, 0);
  209. if (text)
  210. writer.WriteText(chars, 0, count);
  211. else
  212. writer.WriteUInt64Text(value);
  213. signingWriter.WriteText(chars, 0, count);
  214. }
  215. public override void WriteFloatText(float value)
  216. {
  217. int count = XmlConverter.ToChars(value, chars, 0);
  218. if (text)
  219. writer.WriteText(chars, 0, count);
  220. else
  221. writer.WriteFloatText(value);
  222. signingWriter.WriteText(chars, 0, count);
  223. }
  224. public override void WriteDoubleText(double value)
  225. {
  226. int count = XmlConverter.ToChars(value, chars, 0);
  227. if (text)
  228. writer.WriteText(chars, 0, count);
  229. else
  230. writer.WriteDoubleText(value);
  231. signingWriter.WriteText(chars, 0, count);
  232. }
  233. public override void WriteDecimalText(decimal value)
  234. {
  235. int count = XmlConverter.ToChars(value, chars, 0);
  236. if (text)
  237. writer.WriteText(chars, 0, count);
  238. else
  239. writer.WriteDecimalText(value);
  240. signingWriter.WriteText(chars, 0, count);
  241. }
  242. public override void WriteDateTimeText(DateTime value)
  243. {
  244. int count = XmlConverter.ToChars(value, chars, 0);
  245. if (text)
  246. writer.WriteText(chars, 0, count);
  247. else
  248. writer.WriteDateTimeText(value);
  249. signingWriter.WriteText(chars, 0, count);
  250. }
  251. public override void WriteUniqueIdText(UniqueId value)
  252. {
  253. string s = XmlConverter.ToString(value);
  254. if (text)
  255. writer.WriteText(s);
  256. else
  257. writer.WriteUniqueIdText(value);
  258. signingWriter.WriteText(s);
  259. }
  260. public override void WriteTimeSpanText(TimeSpan value)
  261. {
  262. string s = XmlConverter.ToString(value);
  263. if (text)
  264. writer.WriteText(s);
  265. else
  266. writer.WriteTimeSpanText(value);
  267. signingWriter.WriteText(s);
  268. }
  269. public override void WriteGuidText(Guid value)
  270. {
  271. string s = XmlConverter.ToString(value);
  272. if (text)
  273. writer.WriteText(s);
  274. else
  275. writer.WriteGuidText(value);
  276. signingWriter.WriteText(s);
  277. }
  278. public override void WriteStartListText()
  279. {
  280. writer.WriteStartListText();
  281. }
  282. public override void WriteListSeparator()
  283. {
  284. writer.WriteListSeparator();
  285. signingWriter.WriteText(' ');
  286. }
  287. public override void WriteEndListText()
  288. {
  289. writer.WriteEndListText();
  290. }
  291. public override void WriteBase64Text(byte[] trailBytes, int trailByteCount, byte[] buffer, int offset, int count)
  292. {
  293. if (trailByteCount > 0)
  294. WriteBase64Text(trailBytes, 0, trailByteCount);
  295. WriteBase64Text(buffer, offset, count);
  296. if (!text)
  297. {
  298. writer.WriteBase64Text(trailBytes, trailByteCount, buffer, offset, count);
  299. }
  300. }
  301. void WriteBase64Text(byte[] buffer, int offset, int count)
  302. {
  303. if (base64Chars == null)
  304. base64Chars = new byte[512];
  305. Base64Encoding encoding = XmlConverter.Base64Encoding;
  306. while (count >= 3)
  307. {
  308. int byteCount = Math.Min(base64Chars.Length / 4 * 3, count - count % 3);
  309. int charCount = byteCount / 3 * 4;
  310. encoding.GetChars(buffer, offset, byteCount, base64Chars, 0);
  311. signingWriter.WriteText(base64Chars, 0, charCount);
  312. if (text)
  313. {
  314. writer.WriteText(base64Chars, 0, charCount);
  315. }
  316. offset += byteCount;
  317. count -= byteCount;
  318. }
  319. if (count > 0)
  320. {
  321. encoding.GetChars(buffer, offset, count, base64Chars, 0);
  322. signingWriter.WriteText(base64Chars, 0, 4);
  323. if (text)
  324. {
  325. writer.WriteText(base64Chars, 0, 4);
  326. }
  327. }
  328. }
  329. public override void WriteQualifiedName(string prefix, XmlDictionaryString localName)
  330. {
  331. writer.WriteQualifiedName(prefix, localName);
  332. if (prefix.Length != 0)
  333. {
  334. signingWriter.WriteText(prefix);
  335. signingWriter.WriteText(":");
  336. }
  337. signingWriter.WriteText(localName.Value);
  338. }
  339. }
  340. }