+ PKCS7 p7 = new PKCS7(new AlgorithmId[0], new ContentInfo(ContentInfo.DATA_OID, null), ll.toArray(new X509Certificate[ll.size()]), new SignerInfo[0]) {
+
+ @Override
+ public void encodeSignedData(DerOutputStream out) throws IOException {
+ DerOutputStream signedData = new DerOutputStream();
+ BigInteger version = getVersion();
+ AlgorithmId[] digestAlgorithmIds = getDigestAlgorithmIds();
+ ContentInfo contentInfo = getContentInfo();
+ X509Certificate[] certificates = getCertificates();
+ X509CRL[] crls = getCRLs();
+ SignerInfo[] signerInfos = getSignerInfos();
+
+ // version
+ signedData.putInteger(version);
+
+ // digestAlgorithmIds
+ signedData.putOrderedSetOf(DerValue.tag_Set, digestAlgorithmIds);
+
+ // contentInfo
+ contentInfo.encode(signedData);
+
+ // certificates (optional)
+ if (certificates != null && certificates.length != 0) {
+ DerOutputStream sub = new DerOutputStream();
+ // cast to X509CertImpl[] since X509CertImpl implements
+ // DerEncoder
+ X509CertImpl implCerts[] = new X509CertImpl[certificates.length];
+ for (int i = 0; i < certificates.length; i++) {
+ try {
+ sub.write(certificates[i].getEncoded());
+ } catch (CertificateEncodingException e) {
+ sub.close();
+ throw new IOException(e);
+ }
+ if (certificates[i] instanceof X509CertImpl) {
+ implCerts[i] = (X509CertImpl) certificates[i];
+ } else {
+ try {
+ byte[] encoded = certificates[i].getEncoded();
+ implCerts[i] = new X509CertImpl(encoded);
+ } catch (CertificateException ce) {
+ sub.close();
+ throw new IOException(ce);
+ }
+ }
+ }
+
+ // Add the certificate set (tagged with [0] IMPLICIT)
+ // to the signed data
+ signedData.write((byte) 0xA0, sub);
+ sub.close();
+ }
+
+ // CRLs (optional)
+ if (crls != null && crls.length != 0) {
+ // cast to X509CRLImpl[] since X509CRLImpl implements
+ // DerEncoder
+ Set<X509CRLImpl> implCRLs = new HashSet<X509CRLImpl>(crls.length);
+ for (X509CRL crl : crls) {
+ if (crl instanceof X509CRLImpl) {
+ implCRLs.add((X509CRLImpl) crl);
+ } else {
+ try {
+ byte[] encoded = crl.getEncoded();
+ implCRLs.add(new X509CRLImpl(encoded));
+ } catch (CRLException ce) {
+ throw new IOException(ce);
+ }
+ }
+ }
+
+ // Add the CRL set (tagged with [1] IMPLICIT)
+ // to the signed data
+ signedData.putOrderedSetOf((byte) 0xA1, implCRLs.toArray(new X509CRLImpl[implCRLs.size()]));
+ }
+
+ // signerInfos
+ signedData.putOrderedSetOf(DerValue.tag_Set, signerInfos);
+
+ // making it a signed data block
+ DerValue signedDataSeq = new DerValue(DerValue.tag_Sequence, signedData.toByteArray());
+
+ // making it a content info sequence
+ ContentInfo block = new ContentInfo(ContentInfo.SIGNED_DATA_OID, signedDataSeq);
+
+ // writing out the contentInfo sequence
+ block.encode(out);
+ }
+
+ };