// 1.2.840.113549.1.9.5 -- sign time
// 1.2.840.113549.1.9.16.2.12 -- signcertificate
if (ConditionUtils.isNotEmpty(informations)) {
for (SignerInformation information : informations) {
Signature signature = new Signature();
signature.setEncoded(information.getSignature());
signature.setSignatories(new ArrayList<Signatory>());
signature.setValid(null); // FIXME
// TimeStamp
AttributeTable signedAttributeTable = information.getSignedAttributes();
AttributeTable unsignedAttributeTable = information.getUnsignedAttributes();
// DERSequence contentTypeDerSequence = this.getAttribute(signedAttributeTable,
// unsignedAttributeTable, PKCSObjectIdentifiers.pkcs_9_at_contentType);
// DERSequence messageDigestDerSequence = this.getAttribute(signedAttributeTable,
// unsignedAttributeTable, PKCSObjectIdentifiers.pkcs_9_at_messageDigest);
DERSequence timeStampDerSequence = this.getAttribute(signedAttributeTable, unsignedAttributeTable, PKCSObjectIdentifiers.id_aa_signatureTimeStampToken);
if (timeStampDerSequence != null) {
if (timeStampDerSequence.size() == 2) {
DERObject derObjectIdentifier = ((DERObject) timeStampDerSequence.getObjectAt(0)).toASN1Object();
DERObject derObjectValue = ((DERObject) timeStampDerSequence.getObjectAt(1)).toASN1Object();
if ((derObjectIdentifier instanceof ASN1ObjectIdentifier) && (derObjectValue instanceof DERSet)) {
// ASN1ObjectIdentifier asn1ObjectIdentifier = (ASN1ObjectIdentifier)
// derObjectIdentifier;
DERSet set = (DERSet) derObjectValue;
DEREncodable encodable = set.getObjectAt(0);
TimeStampToken timeStampToken = new TimeStampToken(new CMSSignedData(encodable.getDERObject().getEncoded()));
TimeStamp timeStamp = BouncyCastleTimeStampHelper.toTimeStamp(timeStampToken);
signature.setTimeStamp(timeStamp);
}
}
}
DERSequence signTimeDerSequence = this.getAttribute(signedAttributeTable, unsignedAttributeTable, PKCSObjectIdentifiers.pkcs_9_at_signingTime);
if (signTimeDerSequence != null) {
DERObject derObjectIdentifier = ((DERObject) signTimeDerSequence.getObjectAt(0)).toASN1Object();
DERObject derObjectValue = ((DERObject) signTimeDerSequence.getObjectAt(1)).toASN1Object();
if ((derObjectIdentifier instanceof ASN1ObjectIdentifier) && (derObjectValue instanceof DERSet)) {
DERSet set = (DERSet) derObjectValue;
ASN1UTCTime time = (ASN1UTCTime) set.getObjectAt(0);
signature.setDate(time.getAdjustedDate());
}
}
SignerId signerId = information.getSID();
if (signerId != null) {
BigInteger serialNumber = signerId.getSerialNumber();
X509CertificateHolder certificateHolder = null;
for (X509CertificateHolder tmp : certificates) {
if (tmp.getSerialNumber().equals(serialNumber)) {
certificateHolder = tmp;
break;
}
}
if (certificateHolder != null) {
Signatory signatory = new Signatory();
signatory.setSubject(BouncyCastleProviderHelper.getName(certificateHolder.getSubject()));
signatory.setIssuer(BouncyCastleProviderHelper.getName(certificateHolder.getIssuer()));
signatory.setCertificate(BouncyCastleProviderHelper.getCertificate(certificateHolder));
signature.getSignatories().add(signatory);
}
}
signatures.add(signature);
}