Il 13/03/2010 16.40, mkl ha scritto:
> 
> Salvo,
> 
> 
> Salvo Rapisarda wrote:
>> [...] A postback of page is made with Javascript and the output of
>> signature was encapsuled with iTextSharp inside the PDF at server-side.
>> All it's done without problem, but when I open signed version of PDF with
>> Acrobat Reader the sign is not valid with reason: the document was
>> modified after the signing.
>>
>> So the question is: I have made some mistake in my code or it's not
>> possible to do a "asynchronous" signature process?
> 
> In principle it is possible, but you have to take care.
> 
> On the one hand, you must be sure --- as Andreas already mentioned --- to
> calculate the hash for the range stream returned by
> PdfSignatureAppearance.getRangeStream(), not simply the whole PDF file.
> 
> On the other hand, you should be aware that when you start creating a
> signature at different times, the range streams will be different, even if
> you use the same explicite input data. You have to inject the returned
> signature container in the very PdfStamper instance whose
> PdfSignatureAppearance's RangeStream you used.
> 
> Regards,   Michael.

Yes, I use getRangeStream() for calculate the PDF hash.
This is the VB.NET (in asp.net web page) code:

Public Sub GetHash(ByVal pdfInput As String)
        Dim reader As New PdfReader(pdfInput)
        Dim mm As New MemoryStream
        Dim st As PdfStamper = PdfStamper.CreateSignature(reader, mm,
"\0", Nothing, True)

        Dim sap As PdfSignatureAppearance = st.SignatureAppearance
        sap.Acro6Layers = True
        sap.SetCrypto(Nothing, Nothing, Nothing, Nothing)

        Dim dic As New PdfSignature(PdfName.ADOBE_PPKMS,
PdfName.ADBE_PKCS7_SHA1)
        dic.Name = "TEST"

        sap.CryptoDictionary = dic


        Dim csize As Integer = 4000
        Dim exc As Hashtable = New Hashtable
        exc(PdfName.CONTENTS) = csize * 2 + 2
        sap.PreClose(exc)


        Dim sha As HashAlgorithm = New SHA1CryptoServiceProvider

        sHash = Convert.ToBase64String(sha.ComputeHash(sap.RangeStream))

        mm.Close()
        mm.Dispose()
    End Sub


Where sHash is the Base64String of ComputeHash output.

This is the Java code:

CMSSignedDataGenerator generator = new CMSSignedDataGenerator();
CMSSignedDataGenerator.DIGEST_SHA1);
generator.addSigner(theKey,
theCertificate,CMSSignedDataGenerator.DIGEST_SHA1);


ArrayList list = new ArrayList();
list.add(theCertificate);
Security.addProvider(new
org.bouncycastle.jce.provider.BouncyCastleProvider());
chainStore = CertStore.getInstance("Collection", new
CollectionCertStoreParameters(list), "BC");

generator.addCertificatesAndCRLs(chainStore);

CMSProcessable content = new CMSProcessableByteArray(dataToSign);
            CMSSignedData signedData = generator.generate(content,true,
"SunMSCAPI");


signature = signedData.getEncoded();

base64SignedString = new String(Base64.encode(signature));

There is another fact. If I save the content of "base64SignedString" in
a .P7S file (always Base64) and verify the signature with external
program there are no problem with signature! :S :S :S

Only for Acrobat the signature isn't valid!

Tomorrow I post to you a example of PDF signed with my program.

Thank you for all your reply.

Salvo.

------------------------------------------------------------------------------
Download Intel® Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
iText-questions mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/itext-questions

Buy the iText book: http://www.1t3xt.com/docs/book.php
Check the site with examples before you ask questions: 
http://www.1t3xt.info/examples/
You can also search the keywords list: http://1t3xt.info/tutorials/keywords/

Reply via email to