TECHNOLOGIES
FORUMS
JOBS
BOOKS
EVENTS
INTERVIEWS
Live
MORE
LEARN
Training
CAREER
MEMBERS
VIDEOS
NEWS
BLOGS
Sign Up
Login
No unread comment.
View All Comments
No unread message.
View All Messages
No unread notification.
View All Notifications
Answers
Post
An Article
A Blog
A News
A Video
An EBook
An Interview Question
Ask Question
Forums
Monthly Leaders
Forum guidelines
Juan Manuel Diaz
NA
5
0
Signing PDF with itextsharp and CSP
Sep 14 2009 9:45 AM
Hi, i am new in this forum... i am a java programmer trying to do something with c# .net, in this case i am trying to sign multiple pdf files using iTextSharp. This is the code:
public
void
sign()
{
Org.BouncyCastle.X509.X509CertificateParser cp =
new
Org.BouncyCastle.X509.X509CertificateParser();
Org.BouncyCastle.X509.X509Certificate[] chain =
new
Org.BouncyCastle.X509.X509Certificate[] { cp.ReadCertificate(
this
.getCertificate().RawData) };
bool
bHasPrivateKey;
bHasPrivateKey =
this
.getCertificate().HasPrivateKey;
if
(!bHasPrivateKey)
{
MessageBox.Show(
"El certificado seleccionado no es válido para firmar digitalmente."
);
return
;
}
PdfReader reader =
new
PdfReader(
this
.getOriginalFileName());
FileStream signedFileStream =
new
FileStream(
this
.getSignedFileName(), FileMode.Create);
PdfStamper stp = PdfStamper.CreateSignature(reader, signedFileStream,
'\0'
, null,
true
);
sap = stp.SignatureAppearance;
appearanceHandler.setAppearanceStyleTo(sap, appearanceStyle,
new
System.Drawing.Rectangle(100, 100, 200, 300));
sap.SetCrypto(null, chain, null, null);
sap.Location = PdfPKCS7.GetSubjectFields(chain[0]).GetField(
"L"
);
sap.Contact =
this
.contactInfo;
sap.Reason =
this
.getReason();
sap.Acro6Layers =
true
;
PdfSignature dic =
new
PdfSignature(PdfName.ADOBE_PPKMS, PdfName.ADBE_PKCS7_SHA1);
dic.Date =
new
PdfDate(sap.SignDate);
dic.Name = PdfPKCS7.GetSubjectFields(chain[0]).GetField(
"CN"
);
if
(sap.Reason != null)
dic.Reason = sap.Reason;
if
(appearanceHandler.showLocation)
dic.Location = sap.Location;
if
(appearanceHandler.showContact)
dic.Contact = sap.Contact;
sap.CryptoDictionary = dic;
int
csize = 15000;
Hashtable exc =
new
Hashtable();
exc[PdfName.CONTENTS] = csize * 2 + 2;
sap.PreClose(exc);
try
{
RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)
this
.certificate.PrivateKey;
SHA1Managed sha =
new
SHA1Managed();
byte[] hashedData = sha.ComputeHash(sap.RangeStream);
byte[] sig = rsa.SignHash(hashedData, CryptoConfig.MapNameToOID(
"SHA1"
));
bool
verified = rsa.VerifyHash(hashedData,
"SHA1"
, sig);
MessageBox.Show(
"Verified: "
+ verified);
byte[] outc =
new
byte[csize];
PdfDictionary dic2 =
new
PdfDictionary();
Array.Copy(sig, 0, outc, 0, sig.Length);
dic2.Put(PdfName.CONTENTS,
new
PdfString(outc).SetHexWriting(
true
));
sap.Close(dic2);
signedFileStream.Close();
}
catch
(CryptographicException ce)
{
MessageBox.Show(ce.Message);
}
}
I iterate the sign method one time for each pdf file.
I use a private CSP instead the Microsoft Base CSP, because i need to do a massive signature of files, when i tried to do that with the Microsoft CSP, the application hangs and throws a Cryptographic Exception, the only way that i found to get it works, was to use the CSP provided by the token manufacturer.
When i used the Microsoft CSP with CMSSigner, everything, except the massive signature, went well... when i signed a single pdf file, the signature was verified correct by adobe reader. But now with this code, using the Safenet CSP,the massive signature work fine but all signatures are verified wrong... the message that acrobat reader throws is: "Error decoding BER:".
I do not know what can i do for solve this. Any Ideas on what could be happen?,
Thanks in advance,
Juan Manuel Diaz
Reply
Answers (
8
)
How to storage images/sounds in a .dll .xml .dat?
Validate java SAML signature from C#