Re: Sign and PDF with SmartCard and web browser only

arnabroy <[email protected]>
Newsgroups gmane.comp.java.lib.itext.general
Message-ID <[email protected]>
hi michael,
same error file corrupted
please help

STEP1: creating the hash of the pdf file in the server
        protected void Button1_Click(object sender, EventArgs e)
        {
            string _gstrFilePath =
Server.MapPath("~/NewFolder1/TRANSFER_[PROVISIONAL]_29_05_2014.pdf");
            SHA1Managed sha1 = new SHA1Managed();
            UnicodeEncoding encoding = new UnicodeEncoding();
            byte[] data1 = File.ReadAllBytes(_gstrFilePath);
            byte[] hash1 = sha1.ComputeHash(data1);
            hdnSignatureHash.Text = Convert.ToBase64String(hash1);
        }

STEP2: getting the certificate and signed hash in the client side
javascript:
        function fnGetCertificate() {
            var obj = new ActiveXObject('PDFSIGNATURE.PDFSIG');
            var cer = obj.PdfSignature("1A87CCE901002C24");
            document.getElementById("FeaturedContent_hdnCertificate").value
= cer;
        }
        function fnGetSignature() {
            var obj = new ActiveXObject('PDFSIGNATURE.PDFSIG');
            var signedhash = obj.PdfSignedHash("1A87CCE901002C24",
document.getElementById("FeaturedContent_hdnSignatureHash").value);
            document.getElementById("FeaturedContent_hdnSignature").value =
signedhash;
        }

.net dll in the client side
        public string PdfSignature(string SerialNumber)
        {
            bool Success = false;
            byte[] extCert = null;
            String strReturn = string.Empty;
            try
            {

                System.Security.Cryptography.X509Certificates.X509Store
store = new System.Security.Cryptography.X509Certificates.X509Store("MY",
System.Security.Cryptography.X509Certificates.StoreLocation.CurrentUser);
               
store.Open(System.Security.Cryptography.X509Certificates.OpenFlags.ReadOnly
| System.Security.Cryptography.X509Certificates.OpenFlags.OpenExistingOnly);
               
//System.Security.Cryptography.X509Certificates.X509Certificate2Collection
sel =
System.Security.Cryptography.X509Certificates.X509Certificate2UI.SelectFromCollection(store.Certificates,
null, null,
System.Security.Cryptography.X509Certificates.X509SelectionFlag.SingleSelection);

               
System.Security.Cryptography.X509Certificates.X509Certificate2 cert =
store.Certificates.Find(System.Security.Cryptography.X509Certificates.X509FindType.FindBySerialNumber,
SerialNumber, false)[0];
               
//System.Security.Cryptography.X509Certificates.X509Certificate2 cert =
store.Certificates[0];
                Org.BouncyCastle.X509.X509CertificateParser cp = new
Org.BouncyCastle.X509.X509CertificateParser();
                Org.BouncyCastle.X509.X509Certificate[] chain = new
Org.BouncyCastle.X509.X509Certificate[] {
                cp.ReadCertificate(cert.RawData)};
                return
Convert.ToBase64String(cert.Export(System.Security.Cryptography.X509Certificates.X509ContentType.Cert,
"PASSWORD"));

            }
            catch (Exception ex)
            {
                strReturn = ex.Message;
                return strReturn;
            }
        }

            [ComVisible(true)]
        public string PdfSignedHash(string SerialNumber,string hash)
        {
            bool Success = false;
            byte[] signedhash = null;
            String strReturn = string.Empty;
            try
            {

                System.Security.Cryptography.X509Certificates.X509Store
store = new System.Security.Cryptography.X509Certificates.X509Store("MY",
System.Security.Cryptography.X509Certificates.StoreLocation.CurrentUser);
               
store.Open(System.Security.Cryptography.X509Certificates.OpenFlags.ReadOnly
| System.Security.Cryptography.X509Certificates.OpenFlags.OpenExistingOnly);
               
//System.Security.Cryptography.X509Certificates.X509Certificate2Collection
sel =
System.Security.Cryptography.X509Certificates.X509Certificate2UI.SelectFromCollection(store.Certificates,
null, null,
System.Security.Cryptography.X509Certificates.X509SelectionFlag.SingleSelection);

               
System.Security.Cryptography.X509Certificates.X509Certificate2 ocert =
store.Certificates.Find(System.Security.Cryptography.X509Certificates.X509FindType.FindBySerialNumber,
SerialNumber, false)[0];
                System.Security.Cryptography.RSACryptoServiceProvider
privateKey =
(System.Security.Cryptography.RSACryptoServiceProvider)ocert.PrivateKey;
                signedhash =
privateKey.SignHash(Convert.FromBase64String(hash), "SHA1");


                return Convert.ToBase64String(signedhash);

            }
            catch (Exception ex)
            {
                strReturn = ex.Message;
                return strReturn;
            }
        }  

STEP 3: sign pdf by itextsharp in the server
        protected void Button2_Click(object sender, EventArgs e)
        {
            string _gstrFilePath =
Server.MapPath("~/NewFolder1/TRANSFER_[PROVISIONAL]_29_05_2014.pdf");
            System.Security.Cryptography.X509Certificates.X509Certificate2
oCert = new
System.Security.Cryptography.X509Certificates.X509Certificate2(Convert.FromBase64String(hdnCertificate.Text),
"PASSWORD");

            Org.BouncyCastle.X509.X509CertificateParser cp = new
Org.BouncyCastle.X509.X509CertificateParser();
            Org.BouncyCastle.X509.X509Certificate[] chain = new
Org.BouncyCastle.X509.X509Certificate[] {
                cp.ReadCertificate(oCert.RawData)};

            /*start verification*/
            RSACryptoServiceProvider csp =
(RSACryptoServiceProvider)oCert.PublicKey.Key;

            // Hash the data
            SHA1Managed sha1 = new SHA1Managed();
            UnicodeEncoding encoding = new UnicodeEncoding();
            byte[] data1 = File.ReadAllBytes(_gstrFilePath);
            byte[] hash1 = sha1.ComputeHash(data1);
            bool bln = csp.VerifyHash(hash1,
CryptoConfig.MapNameToOID("SHA1"),
Convert.FromBase64String(hdnSignature.Text));
            /*end verification*/

            ServerSignature externalSignature = new ServerSignature();
            externalSignature.DigSign =
Convert.FromBase64String(hdnSignature.Text);

            // reader and stamper
            byte[] OwnerPassword =
System.Text.Encoding.ASCII.GetBytes("secret");

            PdfReader reader = new PdfReader(_gstrFilePath, OwnerPassword);
            bool isencrypted = reader.IsEncrypted();
            bool hasuserPassword = false;

            string OutputFilename =
Server.MapPath("~/NewFolder1/TRANSFER_[PROVISIONAL]_29_05_20141.pdf");
            using (FileStream fout = new FileStream(OutputFilename,
FileMode.Create, FileAccess.ReadWrite))
            {
                using (PdfStamper stamper =
PdfStamper.CreateSignature(reader, fout, '\0'))
                {
                    if (isencrypted)
                        stamper.SetEncryption(PdfWriter.STRENGTH128BITS,
null, "secret", PdfWriter.ALLOW_SCREENREADERS);
                    if (hasuserPassword)
                        stamper.SetEncryption(PdfWriter.STRENGTH128BITS,
null, "secret", PdfWriter.ALLOW_SCREENREADERS);
                    // appearance
                    PdfSignatureAppearance appearance =
stamper.SignatureAppearance;
                    //appearance.Image = new iTextSharp.text.pdf.PdfImage();
                    appearance.Reason = "Reason";
                    appearance.Location = "Location";
                    appearance.SetVisibleSignature(new
iTextSharp.text.Rectangle(36, 748, 244, 880), 2, "Secure-PDF");
                    //DateTime signatureDatetime = DateTime.Now;
                    //appearance.SignDate = signatureDatetime;
                    // digital signature

                    MakeSignature.SignDetached(appearance,
externalSignature, chain, null, null, null, 0, CryptoStandard.CMS);
                    stamper.Close();
                    stamper.Dispose();
                }
            }
            reader.Close();
            reader.Dispose();
        }

serversignature class:
    class ServerSignature : iTextSharp.text.pdf.security.IExternalSignature
    {
        public byte[] DigSign { get; set; }

        string
iTextSharp.text.pdf.security.IExternalSignature.GetEncryptionAlgorithm()
        {
            return "RSA";
        }

        string
iTextSharp.text.pdf.security.IExternalSignature.GetHashAlgorithm()
        {
            return iTextSharp.text.pdf.security.DigestAlgorithms.SHA1;
        }

        byte[] iTextSharp.text.pdf.security.IExternalSignature.Sign(byte[]
message)
        {
            return DigSign;
        }
    }
}

signed pdf file
TRANSFER_[PROVISIONAL]_29_05_20141.pdf
<http://itext-general.2136553.n4.nabble.com/file/n4660339/TRANSFER_%5BPROVISIONAL%5D_29_05_20141.pdf>  



--
View this message in context: http://itext-general.2136553.n4.nabble.com/Sign-and-PDF-with-SmartCard-and-web-browser-only-tp4319344p4660339.html
Sent from the iText - General mailing list archive at Nabble.com.

------------------------------------------------------------------------------
Slashdot TV.  
Video for Nerds.  Stuff that matters.
http://tv.slashdot.org/
_______________________________________________
iText-questions mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/itext-questions

iText(R) is a registered trademark of 1T3XT BVBA.
Many questions posted to this list can (and will) be answered with a reference to the iText book: http://www.itextpdf.com/book/
Please check the keywords list before you ask for examples: http://itextpdf.com/themes/keywords.php
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.