/// <summary>SignedXml生成メソッド</summary> /// <param name="xmlDoc">XmlDocument</param> /// <param name="referenceId">署名対象ノードのID値(「#」は含まない)</param> /// <param name="preserveWhitespace">SignedXmlの空白・改行を保持する()・しない(false)</param> /// <returns>Signed XmlDocument</returns> public XmlDocument Create(XmlDocument xmlDoc, string referenceId, bool preserveWhitespace = false) { // - SignedXml SignedXml signedXml = new SignedXml(xmlDoc); signedXml.SigningKey = this._rsa; // Reference要素 // - 署名対象ノードをポイント Reference reference = new Reference("#" + referenceId); // - Add Transform reference.AddTransform(new XmlDsigEnvelopedSignatureTransform()); // - Add Transform reference.AddTransform(new XmlDsigExcC14NTransform()); // - Add Reference signedXml.AddReference(reference); // 署名対象ノードのXML署名の生成 // - 署名の計算 signedXml.ComputeSignature(); // - 署名対象ノードのXML署名を XmlNode signatureNode = xmlDoc.ImportNode(signedXml.GetXml(), true); // - 署名対象ノード直下に追加 XmlLib.GetXmlNodeById(xmlDoc, referenceId).AppendChild(signatureNode); // Signed XmlDocumentを返す。 return(xmlDoc); }
/// <summary>SignedXml検証メソッド</summary> /// <param name="signedXmlString">SignedXml</param> /// <param name="referenceId">署名対象ノードのID値(「#」は含まない)</param> /// <param name="preserveWhitespace">SignedXmlの空白・改行を保持する()・しない(false)</param> /// <returns>署名の検証結果</returns> public bool Verify(string signedXmlString, string referenceId, bool preserveWhitespace = false) { // 初期処理 // - XmlDocument XmlDocument xmlDoc = new XmlDocument(); xmlDoc.PreserveWhitespace = preserveWhitespace; xmlDoc.LoadXml(signedXmlString); // 子ノード のXML検証 XmlNode targetNode = XmlLib.GetXmlNodeById(xmlDoc, referenceId); // 署名ノードの直下のSignatureを取り出して、signedXml.LoadXmlする。 SignedXml signedXml = new SignedXml(targetNode.OwnerDocument); signedXml.LoadXml(targetNode["Signature"] as XmlElement); // XML検証 return(signedXml.CheckSignature(this._rsa)); }