using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Cryptography.Xml;
using System.Text;
using System.Web;
using System.Xml;
public class SignDemo
{
/// <summary>
/// Vytvoří autentitační token pro volání služby
/// </summary>
/// <param name="key">Přístupový klíč</param>
/// <param name="request">Request služby včetně elementu <SOAP:Envelope></SOAP:Envelope></param>
/// <returns></returns>
private string Sign(string key, string request)
{
//z request se vytvoří XmlDocument
XmlDocument xmlRequest = new XmlDocument();
xmlRequest.LoadXml(request);
//spočítá se SHA1 hash přístupového klíče
SHA1 sha1 = SHA1.Create();
byte[] hashKey = sha1.ComputeHash(Encoding.UTF8.GetBytes(key));
//z requestu se vytáhne element body včetně krajních XML značek - outer xml
XmlDocument xmlBody = new XmlDocument();
xmlBody.LoadXml(xmlRequest.GetElementsByTagName("Body", xmlRequest.DocumentElement.NamespaceURI)[0].OuterXml);
//provede se kanonizace body
XmlDsigC14NTransform tr = new XmlDsigC14NTransform();
tr.LoadInput(xmlBody);
MemoryStream transOutput = (MemoryStream)tr.GetOutput();
byte[] bodyBytes = transOutput.ToArray(); ;
//ke kanonizovanému body se bytově připojí SHA1 hash hesla
byte[] combined = new byte[bodyBytes.Length + hashKey.Length];
System.Buffer.BlockCopy(bodyBytes, 0, combined, 0, bodyBytes.Length);
System.Buffer.BlockCopy(hashKey, 0, combined, bodyBytes.Length, hashKey.Length);
//výsledek se zahashuje SHA512
SHA512 sha512 = SHA512.Create();
byte[] hashResult = sha512.ComputeHash(combined);
//převede se do base64
string result = Convert.ToBase64String(hashResult);
return result;
}
}