none
Perform signedXml.ComputeSignature method manually RRS feed

  • Question

  • Hello,

    I have tried to compute enveloped signature using signedXml.ComputeSignature() method as show in example below. It worked fine, signedXml.ComputeSignature() method have calculated hash value of data and signed it for me. However, the problem is that I need to perform all these steps manually.

    I was not able to find out how i can calculate identical hash value of data in "Example.xml" manually, moreover i have tried to sign already calculated hash value using RSACryptoServiceProvider.SignHash() method and it gave me SignatureValue that is different form signedXml generated value.

    Any ideas how i can compute hash and signature value manually, without using signedXml class?

    Thanks for your help.

    My attempt to sign hash value:

     CspParameters cspParams = new CspParameters();
    
       cspParams.KeyContainerName = "XML_DSIG_RSA_KEY";
    
    
    
       // Create a new RSA signing key and save it in the container. 
    
       RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);
    
    
    
       byte[] hashSignature = rsaKey.SignHash(Convert.FromBase64String("e7jQRU4xmLaQmWVO9pVovhWSeGU="), CryptoConfig.MapNameToOID("SHA1"));
    
    
    
       Console.WriteLine(Convert.ToBase64String(hashSignature));
    
    

    The following code example shows how to sign and verify an entire XML document using an enveloping signature:

    //
    
    // This example signs an XML file using an
    
    // envelope signature. It then verifies the 
    
    // signed XML.
    
    //
    
    using System;
    
    using System.Security.Cryptography;
    
    using System.Security.Cryptography.X509Certificates;
    
    using System.Security.Cryptography.Xml;
    
    using System.Text;
    
    using System.Xml;
    
    
    
    public class SignVerifyEnvelope
    
    {
    
    
    
     public static void Main(String[] args)
    
     {
    
      try
    
      {
    
       // Generate a signing key.
    
       RSACryptoServiceProvider Key = new RSACryptoServiceProvider();
    
    
    
       // Create an XML file to sign.
    
       CreateSomeXml("Example.xml");
    
       Console.WriteLine("New XML file created."); 
    
    
    
       // Sign the XML that was just created and save it in a 
    
       // new file.
    
       SignXmlFile("Example.xml", "SignedExample.xml", Key);
    
       Console.WriteLine("XML file signed."); 
    
    
    
       // Verify the signature of the signed XML.
    
       Console.WriteLine("Verifying signature...");
    
       bool result = VerifyXmlFile("SignedExample.xml");
    
    
    
       // Display the results of the signature verification to \
    
       // the console.
    
       if(result)
    
       {
    
        Console.WriteLine("The XML signature is valid.");
    
       }
    
       else
    
       {
    
        Console.WriteLine("The XML signature is not valid.");
    
       }
    
      }
    
      catch(CryptographicException e)
    
      {
    
       Console.WriteLine(e.Message);
    
      }
    
     }
    
    
    
     // Sign an XML file and save the signature in a new file.
    
     public static void SignXmlFile(string FileName, string SignedFileName, RSA Key)
    
     {
    
      // Create a new XML document.
    
      XmlDocument doc = new XmlDocument();
    
    
    
      // Format the document to ignore white spaces.
    
      doc.PreserveWhitespace = false;
    
    
    
      // Load the passed XML file using it's name.
    
      doc.Load(new XmlTextReader(FileName));
    
    
    
      // Create a SignedXml object.
    
      SignedXml signedXml = new SignedXml(doc);
    
    
    
      // Add the key to the SignedXml document. 
    
      signedXml.SigningKey = Key;
    
    
    
      // Create a reference to be signed.
    
      Reference reference = new Reference();
    
      reference.Uri = "";
    
    
    
      // Add an enveloped transformation to the reference.
    
      XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
    
      reference.AddTransform(env);
    
    
    
      // Add the reference to the SignedXml object.
    
      signedXml.AddReference(reference);
    
    
    
      
    
      // Add an RSAKeyValue KeyInfo (optional; helps recipient find key to validate).
    
      KeyInfo keyInfo = new KeyInfo();
    
      keyInfo.AddClause(new RSAKeyValue((RSA)Key));
    
      signedXml.KeyInfo = keyInfo;
    
    
    
      // Compute the signature.
    
      signedXml.ComputeSignature();
    
    
    
      // Get the XML representation of the signature and save
    
      // it to an XmlElement object.
    
      XmlElement xmlDigitalSignature = signedXml.GetXml();
    
    
    
      // Append the element to the XML document.
    
      doc.DocumentElement.AppendChild(doc.ImportNode(xmlDigitalSignature, true));
    
      
    
      
    
      if (doc.FirstChild is XmlDeclaration) 
    
      {
    
       doc.RemoveChild(doc.FirstChild);
    
      }
    
    
    
      // Save the signed XML document to a file specified
    
      // using the passed string.
    
      XmlTextWriter xmltw = new XmlTextWriter(SignedFileName, new UTF8Encoding(false));
    
      doc.WriteTo(xmltw);
    
      xmltw.Close();
    
     }
    
     // Verify the signature of an XML file and return the result.
    
     public static Boolean VerifyXmlFile(String Name)
    
     {
    
      // Create a new XML document.
    
      XmlDocument xmlDocument = new XmlDocument();
    
    
    
      // Format using white spaces.
    
      xmlDocument.PreserveWhitespace = true;
    
    
    
      // Load the passed XML file into the document. 
    
      xmlDocument.Load(Name);
    
    
    
      // Create a new SignedXml object and pass it
    
      // the XML document class.
    
      SignedXml signedXml = new SignedXml(xmlDocument);
    
    
    
      // Find the "Signature" node and create a new
    
      // XmlNodeList object.
    
      XmlNodeList nodeList = xmlDocument.GetElementsByTagName("Signature");
    
    
    
      // Load the signature node.
    
      signedXml.LoadXml((XmlElement)nodeList[0]);
    
    
    
      // Check the signature and return the result.
    
      return signedXml.CheckSignature();
    
     }
    
    
    
     // Create example data to sign.
    
     public static void CreateSomeXml(string FileName)
    
     {
    
      // Create a new XmlDocument object.
    
      XmlDocument document = new XmlDocument();
    
    
    
      // Create a new XmlNode object.
    
      XmlNode node = document.CreateNode(XmlNodeType.Element, "", "MyElement", "samples");
    
      
    
      // Add some text to the node.
    
      node.InnerText = "Example text to be signed.";
    
    
    
      // Append the node to the document.
    
      document.AppendChild(node);
    
    
    
      // Save the XML document to the file name specified.
    
      XmlTextWriter xmltw = new XmlTextWriter(FileName, 
    Monday, April 11, 2011 12:22 PM

Answers

  • Got it to work afterall. I'd made a mistake in what I was signing...
    After making sure that I generated the same ds:SignedInfo as SignedXML, than canonicalizing the whole ds:SignedInfo node, get a sha1 hash over this and than calculating the signature over that hash, I did get the same signature as SignedXml.
    • Marked as answer by Qizas Monday, May 16, 2011 11:29 AM
    Monday, May 16, 2011 9:48 AM

All replies

  • Hello,

    I have tried to compute enveloped signature using signedXml.ComputeSignature() method as show in example below. It worked fine, signedXml.ComputeSignature() method have calculated hash value of data and signed it for me. However, the problem is that I need to perform all these steps manually.

    I was not able to find out how i can calculate identical hash value of data in "Example.xml" manually, moreover i have tried to sign already calculated hash value using RSACryptoServiceProvider.SignHash() method and it gave me SignatureValue that is different form signedXml generated value.

    Any ideas how i can compute hash and signature value manually, without using signedXml class?

    Thanks for your help.

    My attempt to sign hash value:

     CspParameters cspParams = new CspParameters();
          cspParams.KeyContainerName = "XML_DSIG_RSA_KEY";
    
          // Create a new RSA signing key and save it in the container. 
          RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);
    
          byte[] hashSignature = rsaKey.SignHash(Convert.FromBase64String("e7jQRU4xmLaQmWVO9pVovhWSeGU="), CryptoConfig.MapNameToOID("SHA1"));
    
          Console.WriteLine(Convert.ToBase64String(hashSignature));

    The following code example shows how to sign and verify an entire XML document using an enveloping signature:

    //
    // This example signs an XML file using an
    // envelope signature. It then verifies the 
    // signed XML.
    //
    using System;
    using System.Security.Cryptography;
    using System.Security.Cryptography.X509Certificates;
    using System.Security.Cryptography.Xml;
    using System.Text;
    using System.Xml;
    
    public class SignVerifyEnvelope
    {
    
      public static void Main(String[] args)
      {
        try
        {
          // Generate a signing key.
          RSACryptoServiceProvider Key = new RSACryptoServiceProvider();
    
          // Create an XML file to sign.
          CreateSomeXml("Example.xml");
          Console.WriteLine("New XML file created."); 
    
          // Sign the XML that was just created and save it in a 
          // new file.
          SignXmlFile("Example.xml", "SignedExample.xml", Key);
          Console.WriteLine("XML file signed."); 
    
          // Verify the signature of the signed XML.
          Console.WriteLine("Verifying signature...");
          bool result = VerifyXmlFile("SignedExample.xml");
    
          // Display the results of the signature verification to \
          // the console.
          if(result)
          {
            Console.WriteLine("The XML signature is valid.");
          }
          else
          {
            Console.WriteLine("The XML signature is not valid.");
          }
        }
        catch(CryptographicException e)
        {
          Console.WriteLine(e.Message);
        }
      }
    
      // Sign an XML file and save the signature in a new file.
      public static void SignXmlFile(string FileName, string SignedFileName, RSA Key)
      {
        // Create a new XML document.
        XmlDocument doc = new XmlDocument();
    
        // Format the document to ignore white spaces.
        doc.PreserveWhitespace = false;
    
        // Load the passed XML file using it's name.
        doc.Load(new XmlTextReader(FileName));
    
        // Create a SignedXml object.
        SignedXml signedXml = new SignedXml(doc);
    
        // Add the key to the SignedXml document. 
        signedXml.SigningKey = Key;
    
        // Create a reference to be signed.
        Reference reference = new Reference();
        reference.Uri = "";
    
        // Add an enveloped transformation to the reference.
        XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
        reference.AddTransform(env);
    
        // Add the reference to the SignedXml object.
        signedXml.AddReference(reference);
    
        
        // Add an RSAKeyValue KeyInfo (optional; helps recipient find key to validate).
        KeyInfo keyInfo = new KeyInfo();
        keyInfo.AddClause(new RSAKeyValue((RSA)Key));
        signedXml.KeyInfo = keyInfo;
    
        // Compute the signature.
        signedXml.ComputeSignature();
    
        // Get the XML representation of the signature and save
        // it to an XmlElement object.
        XmlElement xmlDigitalSignature = signedXml.GetXml();
    
        // Append the element to the XML document.
        doc.DocumentElement.AppendChild(doc.ImportNode(xmlDigitalSignature, true));
        
        
        if (doc.FirstChild is XmlDeclaration) 
        {
          doc.RemoveChild(doc.FirstChild);
        }
    
        // Save the signed XML document to a file specified
        // using the passed string.
        XmlTextWriter xmltw = new XmlTextWriter(SignedFileName, new UTF8Encoding(false));
        doc.WriteTo(xmltw);
        xmltw.Close();
      }
      // Verify the signature of an XML file and return the result.
      public static Boolean VerifyXmlFile(String Name)
      {
        // Create a new XML document.
        XmlDocument xmlDocument = new XmlDocument();
    
        // Format using white spaces.
        xmlDocument.PreserveWhitespace = true;
    
        // Load the passed XML file into the document. 
        xmlDocument.Load(Name);
    
        // Create a new SignedXml object and pass it
        // the XML document class.
        SignedXml signedXml = new SignedXml(xmlDocument);
    
        // Find the "Signature" node and create a new
        // XmlNodeList object.
        XmlNodeList nodeList = xmlDocument.GetElementsByTagName("Signature");
    
        // Load the signature node.
        signedXml.LoadXml((XmlElement)nodeList[0]);
    
        // Check the signature and return the result.
        return signedXml.CheckSignature();
      }
    
      // Create example data to sign.
      public static void CreateSomeXml(string FileName)
      {
        // Create a new XmlDocument object.
        XmlDocument document = new XmlDocument();
    
        // Create a new XmlNode object.
        XmlNode node = document.CreateNode(XmlNodeType.Element, "", "MyElement", "samples");
        
        // Add some text to the node.
        node.InnerText = "Example text to be signed.";
    
        // Append the node to the document.
        document.AppendChild(node);
    
        // Save the XML document to the file name specified.
        XmlTextWriter xmltw = new XmlTextWriter(FileName, new UTF8Encoding(false));
        document.WriteTo(xmltw);
        xmltw.Close();
      }
    }
    
    • Merged by Paul Zhou Monday, April 18, 2011 5:09 AM the same question
    Monday, April 11, 2011 11:31 AM
  •  

    Hi Qizas,

     

    RSACryptoServiceProvider.SignHash Method is used to compute the signature for the specified hash value by encrypting it with the private key.

     

    The first parameter is the hash value of the data to be signed. So the retrieve value of signhash method in your code is the RSA signature for "e7jQRU4xmLaQmWVO9pVovhWSeGU=".

     

    Have a nice day!


    Paul Zhou [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    Monday, April 18, 2011 5:31 AM
  •  

    Hi Qizas,

     

    RSACryptoServiceProvider.SignHash Method is used to compute the signature for the specified hash value by encrypting it with the private key.

     

    The first parameter is the hash value of the data to be signed. So the retrieve value of signhash method in your code is the RSA signature for "e7jQRU4xmLaQmWVO9pVovhWSeGU=".

     

    Have a nice day!


    Paul Zhou [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    Monday, April 18, 2011 5:32 AM
  • Hello Paul,
     
    Thanks for your replay. RSACryptoServiceProvider.SignHash Method works fine, however what I am trying to achieve is to get DigestValue and SignatureValue exactly the same as using SignedXml.ComputeSignature Method.
     
    In short, we need to generate hash value of data in server, pass it for signing in client application (to save expensive data transferring) and send it back to server to generate signed xml document containing business data and signature (the end result is pretty much the same as signing xml document using SignedXml class with enveloped signature).
    I have managed to generate the same hash value of data xml file using SHA1Managed class:
    XmlDocument xmlDoc = new XmlDocument();
    // Load an XML file into the XmlDocument object.
    xmlDoc.PreserveWhitespace = false;
    xmlDoc.Load("data.xml");
    byte[] xmlDocumentBytes = 
    System.Text.Encoding.UTF8.GetBytes(xmlDoc.InnerXml);
    byte[] xmlDocumentHash = 
    SHA1Managed.Create().ComputeHash(xmlDocumentBytes);
    Console.WriteLine("Manually calculated hash:\n" + 
    Convert.ToBase64String(xmlDocumentHash));
    
     
    Great news, however SignatureValue calculation as I understand is far more complex. In various internet blogs and resources I managed to find out that SignatureValue calculation includes these steps:
    1. Perform hash calculation of xml data in canonicalized form (already done using SHA1Managed)
    2. Encapsulate calculated digest value in <SignedInfo> element (easy step to do)
    3. Compute RSA SignatureValue of the canonicalized <SignedInfo> element
    I have tried to calculate RSA SignatureValue using RSACryptoServiceProvider.SignData method.
    Note: signedInfo.xml contains only <SignedInfo> element with calculated DigestValue of xml data as shown below (1 and 2 steps of Signaturevalue calculation are already done):
     
    <SignedInfo>
     <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
     <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
     <Reference URI="">
     <Transforms>
     <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
     </Transforms>
     <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
     <DigestValue>DnRTx4DmojhgGBvHAXS1OUNyubQ=</DigestValue>
     </Reference>
    </SignedInfo>
    SignatureValue calculation code:
     
    XmlDocument xmlDoc = new XmlDocument();
    // Load an XML file into the XmlDocument object.
    xmlDoc.PreserveWhitespace = false;
    xmlDoc.Load("signedInfo.xml"); // load xml containing <SignedInfo> 
    byte[] xmlDocumentBytes = System.Text.Encoding.UTF8.GetBytes(xmlDoc.InnerXml);
    byte[] signatureValue = HashAndSignBytes(xmlDocumentBytes, rsaKey.ExportParameters(true));
    Console.WriteLine("SignatureValue value:\n" + Convert.ToBase64String(signatureValue));
    
    
    HashAndSignBytes function implementation:
    public static byte[] HashAndSignBytes(byte[] DataToSign, RSAParameters Key)
    {
     try
     {
     // Create a new instance of RSACryptoServiceProvider using the 
     // key from RSAParameters. 
     RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider();
     
     RSAalg.ImportParameters(Key);
     
     // Hash and sign the data. Pass a new instance of SHA1CryptoServiceProvider
     // to specify the use of SHA1 for hashing.
     return RSAalg.SignData(DataToSign, new SHA1CryptoServiceProvider());
     }
     catch (CryptographicException e)
     {
     Console.WriteLine(e.Message);
     
     return null;
     }
    }
    
    
    However manually calculated SignatureValue is not the same as calculated using SignedXml class.
    Is there any suggestions how we can calculate SignatureValue manually to get correct results?
    How can i get fully canonicalized SignedInfo xml fragment?
     
    Thanks for your time, 
    Qizas




    Monday, April 18, 2011 6:52 AM
  • I'm running into the same issue... Both SignedXml and sha1.ComputeHash() come up with the same hash/digest, but when calling RSACryptoServiceProvider's SignHash using the same certificate, the resulting signiture if different from what SignedXml came up with...
    Friday, May 13, 2011 10:18 AM
  • Got it to work afterall. I'd made a mistake in what I was signing...
    After making sure that I generated the same ds:SignedInfo as SignedXML, than canonicalizing the whole ds:SignedInfo node, get a sha1 hash over this and than calculating the signature over that hash, I did get the same signature as SignedXml.
    • Marked as answer by Qizas Monday, May 16, 2011 11:29 AM
    Monday, May 16, 2011 9:48 AM
  • Hi GDEJ,

    I have managed to compute SignatureValue in exactly the same way.

    Cherrs,

    Qizas

     

    Monday, May 16, 2011 11:31 AM
  • Hi All,

    I am getting the valid SAML response from the vendor and I just want to validate SAML Assertion.

    Below is the SAML response and I have mask few things with xxxxxxxxxxxxxxxxxxxxxx due to vendor concern.

    <samlp:Response IssueInstant="" ID="gzRaMPjm98mgG0_s0ylFgO85wao" Version="2.0" xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol">
    <saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">http://xxxxxxxxxx.com/</saml:Issuer>
    <samlp:Status>
    <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
    </samlp:Status>
    <saml:Assertion Version="2.0" IssueInstant="6273" ID="wZT13pIVg8n60RZgGm_fWAhYNSP" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
    <saml:Issuer>http://xxxxxx.com/</saml:Issuer>
    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <ds:SignedInfo>
    <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
    <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
    <ds:Reference URI="#wZT13pIVg8n60RZgGm_fWAhYNSP">
    <ds:Transforms>
    <ds:Transform Algorithm="http://www..w3.org/2000/09/xmldsig#enveloped-signature"/>
    <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
    </ds:Transforms>
    <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
    <ds:DigestValue>xxxxxxxxxxxxxxxxxxxxxxx</ds:DigestValue>
    </ds:Reference>
    </ds:SignedInfo>
    <ds:SignatureValue>
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    </ds:SignatureValue>
    <ds:KeyInfo>
    <ds:X509Data>
    <ds:X509Certificate>
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    </ds:X509Certificate>
    </ds:X509Data>
    <ds:KeyValue>
    <ds:RSAKeyValue>
    <ds:Modulus>
    xxxxxxxx
    </ds:Modulus>
    <ds:Exponent>xxx</ds:Exponent>
    </ds:RSAKeyValue>
    </ds:KeyValue>
    </ds:KeyInfo>
    </ds:Signature>
    <saml:Subject>
    <saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">staff</saml:NameID>
    <saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
    <saml:SubjectConfirmationData NotOnOrAfter=" " Recipient="https://xxxxxxxxx.com"/>
    </saml:SubjectConfirmation>
    </saml:Subject>
    <saml:Conditions NotOnOrAfter="" NotBefore="">
    <saml:AudienceRestriction>
    <saml:Audience>http://xxxxxxxxxxxxxxxx.com</saml:Audience>
    </saml:AudienceRestriction>
    </saml:Conditions>
    <saml:AuthnStatement AuthnInstant=" " SessionIndex="wZT13pIVg8n60RZgGm_fWAhYNSP">
    <saml:AuthnContext>
    <saml:AuthnContextClassRef></saml:AuthnContextClassRef>
    </saml:AuthnContext>
    </saml:AuthnStatement>
    <saml:AttributeStatement xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <saml:Attribute NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" Name="role">
    <saml:AttributeValue xsi:type="xs:string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">http://xxxx.com/</saml:AttributeValue>
    </saml:Attribute>
    </saml:AttributeStatement>
    </saml:Assertion>
    </samlp:Response>

    I have tried the below code in the .NET 3.5 web application and I am always getting the invalid signature message from the code. Please have a look in the code and suggest me.

    Thanks in Advance.

    XmlDocument doc = new XmlDocument();

    doc.Load(Server.MapPath("SAML.xml"));

    SignedXml signer = new CustomIdSignedXml(doc);

    signer.AddReference(new Reference("#_d4559638-3abf-4433-9fad-b10f8a950351"));
    // _d4559638-3abf-4433-9fad-b10f8a950351 is used as reference to DigestMethod & DigestValue.

    signer.SigningKey = new RSACryptoServiceProvider();

    signer.ComputeSignature();

    string s = signer.GetXml().OuterXml;

    SignedXml verifier = new CustomIdSignedXml(doc);

    verifier.LoadXml(signer.GetXml());

    if (verifier.CheckSignature(signer.SigningKey))
         Response.Write("Signature verified");
    else
         Response.Write("Invalid signature");

     

    Wednesday, June 29, 2011 3:49 PM
  • Hi Gdej,
    I am trying to do the same thing as you. So far I am able to compute the right hash from xml file. Then I create ds:SignedInfo (I tried both with and without xmlns ) -> then canonicalize whole damm thing -> compute sha1 hash -> calculate signature oh this hash.

    But in the end this signature is different then the signature computed with method signedXml.ComputeSignature()

    So could you please post some code, how did you managed to compute the same signature? Thanks in advance.

    Friday, April 18, 2014 3:28 PM
  • Could you please provide some code. I have similar problem but I cannot get this solution working
    Tuesday, May 12, 2015 12:39 PM