116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giropackage org.bouncycastle.cms;
216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.io.IOException;
416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.io.InputStream;
516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.io.OutputStream;
616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.util.ArrayList;
716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.util.Collection;
8bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giroimport java.util.HashSet;
916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.util.Iterator;
1016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.util.List;
11bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giroimport java.util.Set;
1216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
1316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1Encodable;
1416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1EncodableVector;
1516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1InputStream;
1616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1ObjectIdentifier;
1716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1Set;
1853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giroimport org.bouncycastle.asn1.ASN1TaggedObject;
1916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.BEROctetStringGenerator;
2016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.BERSet;
21bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giroimport org.bouncycastle.asn1.DERNull;
2216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.DERSet;
2316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.DERTaggedObject;
2416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.cms.CMSObjectIdentifiers;
2516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.cms.ContentInfo;
26c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro// BEGIN android-removed
27c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro// import org.bouncycastle.asn1.cms.OtherRevocationInfoFormat;
28c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro// import org.bouncycastle.asn1.ocsp.OCSPResponse;
29c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro// import org.bouncycastle.asn1.ocsp.OCSPResponseStatus;
304a2d5c40ffefaaa02c656a091f33fecdf8592607Sergio Giro// import org.bouncycastle.asn1.oiw.OIWObjectIdentifiers;
314a2d5c40ffefaaa02c656a091f33fecdf8592607Sergio Giro// import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
32c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro// END android-removed
33bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giroimport org.bouncycastle.asn1.x509.AlgorithmIdentifier;
3416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.cert.X509AttributeCertificateHolder;
3516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.cert.X509CRLHolder;
3616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.cert.X509CertificateHolder;
3716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.operator.DigestCalculator;
3816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.util.Store;
3953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giroimport org.bouncycastle.util.Strings;
4016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.util.io.Streams;
4116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.util.io.TeeInputStream;
4216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.util.io.TeeOutputStream;
4316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
4416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroclass CMSUtils
4516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro{
46bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    private static final Set<String> des = new HashSet<String>();
47bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro
48bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    static
49bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    {
50bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        des.add("DES");
51bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        des.add("DESEDE");
524a2d5c40ffefaaa02c656a091f33fecdf8592607Sergio Giro        // BEGIN android-removed
534a2d5c40ffefaaa02c656a091f33fecdf8592607Sergio Giro        // des.add(OIWObjectIdentifiers.desCBC.getId());
544a2d5c40ffefaaa02c656a091f33fecdf8592607Sergio Giro        // des.add(PKCSObjectIdentifiers.des_EDE3_CBC.getId());
554a2d5c40ffefaaa02c656a091f33fecdf8592607Sergio Giro        // des.add(PKCSObjectIdentifiers.des_EDE3_CBC.getId());
564a2d5c40ffefaaa02c656a091f33fecdf8592607Sergio Giro        // des.add(PKCSObjectIdentifiers.id_alg_CMS3DESwrap.getId());
574a2d5c40ffefaaa02c656a091f33fecdf8592607Sergio Giro        // END android-removed
58bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    }
59bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro
60bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    static boolean isDES(String algorithmID)
61bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    {
62bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        String name = Strings.toUpperCase(algorithmID);
63bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro
64bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        return des.contains(name);
65bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    }
66bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro
67bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    static boolean isEquivalent(AlgorithmIdentifier algId1, AlgorithmIdentifier algId2)
68bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    {
69bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        if (algId1 == null || algId2 == null)
70bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        {
71bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro            return false;
72bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        }
73bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro
74bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        if (!algId1.getAlgorithm().equals(algId2.getAlgorithm()))
75bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        {
76bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro            return false;
77bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        }
78bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro
79bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        ASN1Encodable params1 = algId1.getParameters();
80bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        ASN1Encodable params2 = algId2.getParameters();
81bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        if (params1 != null)
82bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        {
83bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro            return params1.equals(params2) || (params1.equals(DERNull.INSTANCE) && params2 == null);
84bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        }
85bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro
86bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        return params2 == null || params2.equals(DERNull.INSTANCE);
87bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    }
88bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro
8916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    static ContentInfo readContentInfo(
9016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        byte[] input)
9116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        throws CMSException
9216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
9316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        // enforce limit checking as from a byte array
9416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return readContentInfo(new ASN1InputStream(input));
9516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
9616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
9716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    static ContentInfo readContentInfo(
9816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        InputStream input)
9916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        throws CMSException
10016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
10116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        // enforce some limit checking
10216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return readContentInfo(new ASN1InputStream(input));
10316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
10416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
10516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    static List getCertificatesFromStore(Store certStore)
10616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        throws CMSException
10716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
10816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        List certs = new ArrayList();
10916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
11016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        try
11116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
11216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            for (Iterator it = certStore.getMatches(null).iterator(); it.hasNext();)
11316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
11416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                X509CertificateHolder c = (X509CertificateHolder)it.next();
11516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
11616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                certs.add(c.toASN1Structure());
11716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
11816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
11916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return certs;
12016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
12116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        catch (ClassCastException e)
12216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
12316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            throw new CMSException("error processing certs", e);
12416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
12516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
12616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
12716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    static List getAttributeCertificatesFromStore(Store attrStore)
12816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        throws CMSException
12916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
13016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        List certs = new ArrayList();
13116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
13216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        try
13316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
13416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            for (Iterator it = attrStore.getMatches(null).iterator(); it.hasNext();)
13516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
13616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                X509AttributeCertificateHolder attrCert = (X509AttributeCertificateHolder)it.next();
13716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
13816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                certs.add(new DERTaggedObject(false, 2, attrCert.toASN1Structure()));
13916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
14016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
14116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return certs;
14216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
14316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        catch (ClassCastException e)
14416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
14516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            throw new CMSException("error processing certs", e);
14616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
14716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
14816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
14916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
15016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    static List getCRLsFromStore(Store crlStore)
15116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        throws CMSException
15216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
15353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        List crls = new ArrayList();
15416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
15516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        try
15616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
15716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            for (Iterator it = crlStore.getMatches(null).iterator(); it.hasNext();)
15816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
15953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                Object rev = it.next();
16016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
16153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                if (rev instanceof X509CRLHolder)
16253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                {
16353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                    X509CRLHolder c = (X509CRLHolder)rev;
16453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
16553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                    crls.add(c.toASN1Structure());
16653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                }
167c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro                // BEGIN android-removed
168c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro                // else if (rev instanceof OtherRevocationInfoFormat)
169c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro                // {
170c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro                //     OtherRevocationInfoFormat infoFormat = OtherRevocationInfoFormat.getInstance(rev);
171c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro                //
172c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro                //     validateInfoFormat(infoFormat);
173c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro                //
174c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro                //     crls.add(new DERTaggedObject(false, 1, infoFormat));
175c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro                // }
176c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro                // END android-removed
17753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                else if (rev instanceof ASN1TaggedObject)
17853b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                {
17953b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                    crls.add(rev);
18053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro                }
18116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
18216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
18353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro            return crls;
18416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
18516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        catch (ClassCastException e)
18616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
18716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            throw new CMSException("error processing certs", e);
18816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
18916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
19016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
191c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    // BEGIN android-removed
192c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    // private static void validateInfoFormat(OtherRevocationInfoFormat infoFormat)
193c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    // {
194c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    //     if (CMSObjectIdentifiers.id_ri_ocsp_response.equals(infoFormat.getInfoFormat()))
195c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    //     {
196c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    //         OCSPResponse resp = OCSPResponse.getInstance(infoFormat.getInfo());
197c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    //
198c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    //         if (resp.getResponseStatus().getValue().intValue() != OCSPResponseStatus.SUCCESSFUL)
199c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    //         {
200c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    //             throw new IllegalArgumentException("cannot add unsuccessful OCSP response to CMS SignedData");
201c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    //         }
202c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    //     }
203c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    // }
204c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    //
205c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    // static Collection getOthersFromStore(ASN1ObjectIdentifier otherRevocationInfoFormat, Store otherRevocationInfos)
206c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    // {
207c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    //     List others = new ArrayList();
208c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    //
209c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    //     for (Iterator it = otherRevocationInfos.getMatches(null).iterator(); it.hasNext();)
210c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    //     {
211c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    //         ASN1Encodable info = (ASN1Encodable)it.next();
212c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    //         OtherRevocationInfoFormat infoFormat = new OtherRevocationInfoFormat(otherRevocationInfoFormat, info);
213c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    //         validateInfoFormat(infoFormat);
214c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    //
215c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    //         others.add(new DERTaggedObject(false, 1, infoFormat));
216c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    //     }
217c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    //
218c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    //     return others;
219c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    // }
220c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro    // END android-removed
22116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
22216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    static ASN1Set createBerSetFromList(List derObjects)
22316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
22416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        ASN1EncodableVector v = new ASN1EncodableVector();
22516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
22616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        for (Iterator it = derObjects.iterator(); it.hasNext();)
22716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
22816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            v.add((ASN1Encodable)it.next());
22916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
23016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
23116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return new BERSet(v);
23216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
23316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
23416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    static ASN1Set createDerSetFromList(List derObjects)
23516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
23616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        ASN1EncodableVector v = new ASN1EncodableVector();
23716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
23816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        for (Iterator it = derObjects.iterator(); it.hasNext();)
23916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
24016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            v.add((ASN1Encodable)it.next());
24116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
24216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
24316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return new DERSet(v);
24416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
24516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
24616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    static OutputStream createBEROctetOutputStream(OutputStream s,
24716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            int tagNo, boolean isExplicit, int bufferSize) throws IOException
24816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
24916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        BEROctetStringGenerator octGen = new BEROctetStringGenerator(s, tagNo, isExplicit);
25016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
25116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (bufferSize != 0)
25216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
25316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return octGen.getOctetOutputStream(new byte[bufferSize]);
25416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
25516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
25616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return octGen.getOctetOutputStream();
25716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
25816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
25916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    private static ContentInfo readContentInfo(
26016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        ASN1InputStream in)
26116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        throws CMSException
26216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
26316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        try
26416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
26516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return ContentInfo.getInstance(in.readObject());
26616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
26716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        catch (IOException e)
26816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
26916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            throw new CMSException("IOException reading content.", e);
27016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
27116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        catch (ClassCastException e)
27216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
27316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            throw new CMSException("Malformed content.", e);
27416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
27516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        catch (IllegalArgumentException e)
27616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
27716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            throw new CMSException("Malformed content.", e);
27816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
27916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
28053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro
28116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static byte[] streamToByteArray(
28216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        InputStream in)
28316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        throws IOException
28416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
28516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return Streams.readAll(in);
28616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
28716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
28816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static byte[] streamToByteArray(
28916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        InputStream in,
29016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        int         limit)
29116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        throws IOException
29216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
29316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return Streams.readAllLimited(in, limit);
29416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
29516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
29616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    static InputStream attachDigestsToInputStream(Collection digests, InputStream s)
29716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
29816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        InputStream result = s;
29916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        Iterator it = digests.iterator();
30016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        while (it.hasNext())
30116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
30216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            DigestCalculator digest = (DigestCalculator)it.next();
30316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            result = new TeeInputStream(result, digest.getOutputStream());
30416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
30516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return result;
30616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
30716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
30816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    static OutputStream attachSignersToOutputStream(Collection signers, OutputStream s)
30916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
31016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        OutputStream result = s;
31116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        Iterator it = signers.iterator();
31216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        while (it.hasNext())
31316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
31416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            SignerInfoGenerator signerGen = (SignerInfoGenerator)it.next();
31516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            result = getSafeTeeOutputStream(result, signerGen.getCalculatingOutputStream());
31616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
31716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return result;
31816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
31916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
32016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    static OutputStream getSafeOutputStream(OutputStream s)
32116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
32216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return s == null ? new NullOutputStream() : s;
32316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
32416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
32516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    static OutputStream getSafeTeeOutputStream(OutputStream s1,
32616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            OutputStream s2)
32716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
32816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return s1 == null ? getSafeOutputStream(s2)
32916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                : s2 == null ? getSafeOutputStream(s1) : new TeeOutputStream(
33016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                        s1, s2);
33116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
33216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro}
333