title: How to Create Digital Signature and Verify it in C# using PKCS 7 and SHA algorithm
body: <p>I am trying to digitally sign xml document and verify the signature with the original xml file with public key and signed document. I have a java code for reference. I need to convert java code to C# where I have java code like this:</p>
  
  <pre><code>   certList = new ArrayList&lt;X509Certificate&gt;();
     certList.add(signerCert);
     certStore = new JcaCertStore(certList);
     signedDataGenerator = new CMSSignedDataGenerator();
     ContentSigner sha2Signer = new JcaContentSignerBuilder("SHA512with" + privateKey.getAlgorithm()).build(privateKey);
  
     ignedDataGenerator.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().build()).setDirectSignature(true).build(sha2Signer, signerCert));
     signedDataGenerator.addCertificates(certStore);
     CMSSignedData sigData = signedDataGenerator.generate(new CMSProcessableFile(inputXmlFile), false);
     signedBytes = sigData.getEncoded();
  </code></pre>
  
  <p>I have converted java code to C# like this:</p>
  
  <pre><code>        X509Store my = new X509Store(StoreName.My, StoreLocation.LocalMachine);
          my.Open(OpenFlags.ReadOnly);
          // Find the certificate we’ll use to sign
          RSACryptoServiceProvider csp = null;
          foreach (X509Certificate2 cert in my.Certificates)
          {
              if (cert.Subject.Contains(certSubject))
              {
                  // We found it.
                  // Get its associated CSP and private key
                  csp = (RSACryptoServiceProvider)cert.PrivateKey;                  
              }
          }
          if (csp == null)
          {
              throw new Exception("oppose no valid application was found");
          }
          // Hash the data
          SHA512Managed sha1 = new SHA512Managed();
          UnicodeEncoding encoding = new UnicodeEncoding();
          byte[] data = encoding.GetBytes(text);
          byte[] hash = sha1.ComputeHash(data);
          // Sign the hash
          return csp.SignHash(hash, CryptoConfig.MapNameToOID("SHA1"));
  </code></pre>
  
  <p>I am trying to convert it since two days, It is generating sign byte array but not been able to verify. While verifying it is throwing <strong>bad hash\r\n</strong> error I shall be highly grateful for any assistance. I know I am somewhere wrong in converting the java code to C#. I am able to verify the code but not been able to sign the document</p>