SmartCard Modülü ile BES Tipi İmza Atılması

PKCS7 yapısı en basit imza yapılarından biridir. PKCS7Signature sınıfı PKCS7 formatında imza atılmasından sorumlu sınıftır. Bu sınıf kullanılarak ayrık imza veya bütünleşik imza atılabilir.

signExternalContent fonksiyonu ile ayrık imza, signInternalContent fonksiyonu ile bütünleşik imza atılabilir. Aşağıdaki örnek kodda PKCS7 yapısında imzanın nasıl atılacağı gösterilmiştir. Örnekte ayrık imza atılmıştır. signInternalContent fonksiyonu kullanılırsa bütünleşik imza atılacaktır. Bütünleşik imzadan içerik PKCS7 nesnesinin getContentInfo().getContentBytes() fonksiyonu ile alınabilir.

Aşağıdaki örnek kod sadece Java için geçerli olup, PKCS7 yapısının .NET ESYA API tarafında desteği bulunmamaktadır.

PKCS7Signature pkcsSignature = new PKCS7Signature();
ByteArrayOutputStream signature = new ByteArrayOutputStream();

SmartCard sc = new SmartCard(CardType.AKIS);
long [] slots = sc.getSlotList();
//sc.getSlotInfo(slots[0]).slotDescription;
long session = sc.openSession(slots[0]);
sc.login(session, "12345");

//Gets first certificate, it must be asked to user if it is more than one certificate.
byte [] certBytes = sc.getSignatureCertificates(session).get(0);
CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate)cf.generateCertificate(new ByteArrayInputStream(certBytes));

BaseSigner signer = new SCSignerWithCertSerialNo(sc, session, slots[0]
                                                                    ,cert.getSerialNumber().toByteArray() 
                                                                    , Algorithms.SIGNATURE_RSA_SHA1);

ByteArrayInputStream bais = new ByteArrayInputStream(toBeSigned);
pkcsSignature.signExternalContent(bais, cert, signature, signer);

Assert.assertEquals(true, validate(new ByteArrayInputStream(signature.toByteArray()), cert));
PKCS7 p = new PKCS7(signature);
//validates the signature, not the person.
SignerInfo  [] signerInfo = p.verify(toBeSigned);
if(signerInfo == null)
	returnfalse;
else
{
	//Checks whether the expected person signed the data.
	return signerInfo[0].getCertificateSerialNumber().equals(cert.getSerialNumber()) == true;
}