18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpackage org.bouncycastle.asn1.cms;
28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectimport java.util.Enumeration;
48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectimport org.bouncycastle.asn1.ASN1EncodableVector;
68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectimport org.bouncycastle.asn1.ASN1Integer;
78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectimport org.bouncycastle.asn1.ASN1Object;
88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectimport org.bouncycastle.asn1.ASN1ObjectIdentifier;
98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectimport org.bouncycastle.asn1.ASN1Primitive;
108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectimport org.bouncycastle.asn1.ASN1Sequence;
118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectimport org.bouncycastle.asn1.ASN1Set;
120e0515410009c5bdd4d2d77a4a9131081573f040David 'Digit' Turnerimport org.bouncycastle.asn1.ASN1TaggedObject;
1328a09b6fe8d8f3e92ffee9263609a6da881b8818David 'Digit' Turnerimport org.bouncycastle.asn1.BERSequence;
148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectimport org.bouncycastle.asn1.BERSet;
15b059facee5eb498c78c573617c62cc13eddc8644The Android Open Source Projectimport org.bouncycastle.asn1.BERTaggedObject;
16b059facee5eb498c78c573617c62cc13eddc8644The Android Open Source Projectimport org.bouncycastle.asn1.DERTaggedObject;
178dd31e8e10fc3ca10192368acf19d2345eeddde7Vladimir Chtchetkine
189b3a4b03315af9bcdf282243059e8fd1ce1c5c70David 'Digit' Turner/**
199b3a4b03315af9bcdf282243059e8fd1ce1c5c70David 'Digit' Turner * <a href="http://tools.ietf.org/html/rfc5652#section-5.1">RFC 5652</a>:
200e0515410009c5bdd4d2d77a4a9131081573f040David 'Digit' Turner * <p>
212ec695af7284adbedcdbc08a22d818b6bdd8990cDavid 'Digit' Turner * A signed data object containing multitude of {@link SignerInfo}s.
22d4e803c5e928790b14704ae7f0b048da7ba47fabDavid 'Digit' Turner * <pre>
231c31e3e43ce4cca85a707dfff631e5e102fdecedDavid 'Digit' Turner * SignedData ::= SEQUENCE {
248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *     version CMSVersion,
258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *     digestAlgorithms DigestAlgorithmIdentifiers,
268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *     encapContentInfo EncapsulatedContentInfo,
278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *     certificates [0] IMPLICIT CertificateSet OPTIONAL,
288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *     crls [1] IMPLICIT CertificateRevocationLists OPTIONAL,
298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *     signerInfos SignerInfos
308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *   }
318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * DigestAlgorithmIdentifiers ::= SET OF DigestAlgorithmIdentifier
338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * SignerInfos ::= SET OF SignerInfo
358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * </pre>
368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * <p>
378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * The version calculation uses following ruleset from RFC 3852 section 5.1:
3880bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner * <pre>
3980bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner * IF ((certificates is present) AND
4080bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner *    (any certificates with a type of other are present)) OR
4180bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner *    ((crls is present) AND
4280bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner *    (any crls with a type of other are present))
4380bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner * THEN version MUST be 5
4480bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner * ELSE
4580bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner *    IF (certificates is present) AND
4680bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner *       (any version 2 attribute certificates are present)
4780bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner *    THEN version MUST be 4
4880bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner *    ELSE
49b059facee5eb498c78c573617c62cc13eddc8644The Android Open Source Project *       IF ((certificates is present) AND
50b059facee5eb498c78c573617c62cc13eddc8644The Android Open Source Project *          (any version 1 attribute certificates are present)) OR
51b059facee5eb498c78c573617c62cc13eddc8644The Android Open Source Project *          (any SignerInfo structures are version 3) OR
52b059facee5eb498c78c573617c62cc13eddc8644The Android Open Source Project *          (encapContentInfo eContentType is other than id-data)
538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *       THEN version MUST be 3
548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *       ELSE version MUST be 1
558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * </pre>
568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * <p>
578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * @todo Check possible update for this to RFC 5652 level
588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic class SignedData
608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    extends ASN1Object
618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    private static final ASN1Integer VERSION_1 = new ASN1Integer(1);
6380bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner    private static final ASN1Integer VERSION_3 = new ASN1Integer(3);
648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    private static final ASN1Integer VERSION_4 = new ASN1Integer(4);
658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    private static final ASN1Integer VERSION_5 = new ASN1Integer(5);
66b059facee5eb498c78c573617c62cc13eddc8644The Android Open Source Project
678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    private ASN1Integer version;
68b059facee5eb498c78c573617c62cc13eddc8644The Android Open Source Project    private ASN1Set     digestAlgorithms;
698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    private ContentInfo contentInfo;
708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    private ASN1Set     certificates;
71b059facee5eb498c78c573617c62cc13eddc8644The Android Open Source Project    private ASN1Set     crls;
728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    private ASN1Set     signerInfos;
738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    private boolean certsBer;
748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    private boolean        crlsBer;
758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
768dd31e8e10fc3ca10192368acf19d2345eeddde7Vladimir Chtchetkine    /**
778dd31e8e10fc3ca10192368acf19d2345eeddde7Vladimir Chtchetkine     * Return a SignedData object from the given object.
788dd31e8e10fc3ca10192368acf19d2345eeddde7Vladimir Chtchetkine     * <p>
798dd31e8e10fc3ca10192368acf19d2345eeddde7Vladimir Chtchetkine     * Accepted inputs:
808dd31e8e10fc3ca10192368acf19d2345eeddde7Vladimir Chtchetkine     * <ul>
818dd31e8e10fc3ca10192368acf19d2345eeddde7Vladimir Chtchetkine     * <li> null &rarr; null
828dd31e8e10fc3ca10192368acf19d2345eeddde7Vladimir Chtchetkine     * <li> {@link SignedData} object
838dd31e8e10fc3ca10192368acf19d2345eeddde7Vladimir Chtchetkine     * <li> {@link org.bouncycastle.asn1.ASN1Sequence#getInstance(java.lang.Object) ASN1Sequence} input formats with SignedData structure inside
848dd31e8e10fc3ca10192368acf19d2345eeddde7Vladimir Chtchetkine     * </ul>
858dd31e8e10fc3ca10192368acf19d2345eeddde7Vladimir Chtchetkine     *
868dd31e8e10fc3ca10192368acf19d2345eeddde7Vladimir Chtchetkine     * @param o the object we want converted.
878dd31e8e10fc3ca10192368acf19d2345eeddde7Vladimir Chtchetkine     * @exception IllegalArgumentException if the object cannot be converted.
888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     */
898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    public static SignedData getInstance(
908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        Object  o)
9180bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner    {
928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (o instanceof SignedData)
938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        {
948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return (SignedData)o;
958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        else if (o != null)
978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        {
988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return new SignedData(ASN1Sequence.getInstance(o));
998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return null;
10280bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner    }
1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    public SignedData(
1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        ASN1Set     digestAlgorithms,
1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        ContentInfo contentInfo,
1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        ASN1Set     certificates,
1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        ASN1Set     crls,
1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        ASN1Set     signerInfos)
1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    {
1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        this.version = calculateVersion(contentInfo.getContentType(), certificates, crls, signerInfos);
1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        this.digestAlgorithms = digestAlgorithms;
1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        this.contentInfo = contentInfo;
1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        this.certificates = certificates;
1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        this.crls = crls;
1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        this.signerInfos = signerInfos;
1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        this.crlsBer = crls instanceof BERSet;
1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        this.certsBer = certificates instanceof BERSet;
1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    private ASN1Integer calculateVersion(
1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        ASN1ObjectIdentifier contentOid,
1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        ASN1Set certs,
1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        ASN1Set crls,
1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        ASN1Set signerInfs)
1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    {
1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        boolean otherCert = false;
12980bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner        boolean otherCrl = false;
1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        boolean attrCertV1Found = false;
1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        boolean attrCertV2Found = false;
1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (certs != null)
134055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner        {
13580bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner            for (Enumeration en = certs.getObjects(); en.hasMoreElements();)
13680bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner            {
13780bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner                Object obj = en.nextElement();
13880bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner                if (obj instanceof ASN1TaggedObject)
13980bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner                {
1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    ASN1TaggedObject tagged = ASN1TaggedObject.getInstance(obj);
1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    if (tagged.getTagNo() == 1)
1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    {
1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        attrCertV1Found = true;
1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    }
1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    else if (tagged.getTagNo() == 2)
1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    {
1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        attrCertV2Found = true;
1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    }
1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    else if (tagged.getTagNo() == 3)
1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    {
1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        otherCert = true;
1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    }
1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                }
1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (otherCert)
1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        {
1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return new ASN1Integer(5);
1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (crls != null)         // no need to check if otherCert is true
1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        {
1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            for (Enumeration en = crls.getObjects(); en.hasMoreElements();)
1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
167334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima                Object obj = en.nextElement();
168334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima                if (obj instanceof ASN1TaggedObject)
169334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima                {
170334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima                    otherCrl = true;
171334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima                }
172334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima            }
173334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima        }
174334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima
175334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima        if (otherCrl)
176334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima        {
177334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima            return VERSION_5;
178334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima        }
179334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima
180334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima        if (attrCertV2Found)
181334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima        {
182334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima            return VERSION_4;
183334ab475d2f27dbf6fbf836c2d4fb86dbb02a15cJun Nakajima        }
1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (attrCertV1Found)
1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        {
1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return VERSION_3;
1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1900158ea3220978ecc0fa1738e4a0bdae83fa36175David 'Digit' Turner        if (checkForVersion3(signerInfs))
19172d561178e62b74923cfe3bc0faa59bcb07c57c3Xavier Ducrohet        {
1920158ea3220978ecc0fa1738e4a0bdae83fa36175David 'Digit' Turner            return VERSION_3;
1930158ea3220978ecc0fa1738e4a0bdae83fa36175David 'Digit' Turner        }
1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (!CMSObjectIdentifiers.data.equals(contentOid))
1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        {
1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return VERSION_3;
1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return VERSION_1;
2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    private boolean checkForVersion3(ASN1Set signerInfs)
2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    {
2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        for (Enumeration e = signerInfs.getObjects(); e.hasMoreElements();)
2060158ea3220978ecc0fa1738e4a0bdae83fa36175David 'Digit' Turner        {
20772d561178e62b74923cfe3bc0faa59bcb07c57c3Xavier Ducrohet            SignerInfo s = SignerInfo.getInstance(e.nextElement());
2080158ea3220978ecc0fa1738e4a0bdae83fa36175David 'Digit' Turner
2090158ea3220978ecc0fa1738e4a0bdae83fa36175David 'Digit' Turner            if (s.getVersion().getValue().intValue() == 3)
2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
21180bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner                return true;
2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
21380bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner        }
2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return false;
2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
217bcde1092aca184dbd7860078af020de7d1e4e22fDavid 'Digit' Turner
2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    private SignedData(
2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        ASN1Sequence seq)
2205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    {
22180bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner        Enumeration     e = seq.getObjects();
22280bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner
22380bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner        version = ASN1Integer.getInstance(e.nextElement());
22480bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner        digestAlgorithms = ((ASN1Set)e.nextElement());
22580bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner        contentInfo = ContentInfo.getInstance(e.nextElement());
22680bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner
22780bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner        while (e.hasMoreElements())
22880bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner        {
22980bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner            ASN1Primitive o = (ASN1Primitive)e.nextElement();
23080bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner
23180bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner            //
23280bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner            // an interesting feature of SignedData is that there appear
23380bc5c8c7b9c50e8f302c22c2fba42dd6e8aa2dfDavid 'Digit' Turner            // to be varying implementations...
2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            // for the moment we ignore anything which doesn't fit.
2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            //
2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (o instanceof ASN1TaggedObject)
2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                ASN1TaggedObject tagged = (ASN1TaggedObject)o;
2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                switch (tagged.getTagNo())
2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                {
2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                case 0:
243bcde1092aca184dbd7860078af020de7d1e4e22fDavid 'Digit' Turner                    certsBer = tagged instanceof BERTaggedObject;
2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    certificates = ASN1Set.getInstance(tagged, false);
2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    break;
2465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner                case 1:
2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    crlsBer = tagged instanceof BERTaggedObject;
2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    crls = ASN1Set.getInstance(tagged, false);
2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    break;
2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                default:
2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    throw new IllegalArgumentException("unknown tag value " + tagged.getTagNo());
2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                }
2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            else
2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                signerInfos = (ASN1Set)o;
2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    public ASN1Integer getVersion()
2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    {
2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return version;
2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    public ASN1Set getDigestAlgorithms()
2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    {
2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return digestAlgorithms;
2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    public ContentInfo getEncapContentInfo()
2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    {
273b059facee5eb498c78c573617c62cc13eddc8644The Android Open Source Project        return contentInfo;
274b059facee5eb498c78c573617c62cc13eddc8644The Android Open Source Project    }
275b059facee5eb498c78c573617c62cc13eddc8644The Android Open Source Project
276b059facee5eb498c78c573617c62cc13eddc8644The Android Open Source Project    public ASN1Set getCertificates()
2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    {
278863d1010d9c8fa4342b1b0ea860bcfb096806accVladimir Chtchetkine        return certificates;
2798dd31e8e10fc3ca10192368acf19d2345eeddde7Vladimir Chtchetkine    }
2808dd31e8e10fc3ca10192368acf19d2345eeddde7Vladimir Chtchetkine
2818dd31e8e10fc3ca10192368acf19d2345eeddde7Vladimir Chtchetkine    public ASN1Set getCRLs()
282863d1010d9c8fa4342b1b0ea860bcfb096806accVladimir Chtchetkine    {
2838dd31e8e10fc3ca10192368acf19d2345eeddde7Vladimir Chtchetkine        return crls;
2848dd31e8e10fc3ca10192368acf19d2345eeddde7Vladimir Chtchetkine    }
2858dd31e8e10fc3ca10192368acf19d2345eeddde7Vladimir Chtchetkine
2868dd31e8e10fc3ca10192368acf19d2345eeddde7Vladimir Chtchetkine    public ASN1Set getSignerInfos()
2878dd31e8e10fc3ca10192368acf19d2345eeddde7Vladimir Chtchetkine    {
2888dd31e8e10fc3ca10192368acf19d2345eeddde7Vladimir Chtchetkine        return signerInfos;
2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /**
2928dd31e8e10fc3ca10192368acf19d2345eeddde7Vladimir Chtchetkine     * Produce an object suitable for an ASN1OutputStream.
2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     */
2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    public ASN1Primitive toASN1Primitive()
2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    {
2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        ASN1EncodableVector  v = new ASN1EncodableVector();
2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2988dd31e8e10fc3ca10192368acf19d2345eeddde7Vladimir Chtchetkine        v.add(version);
2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        v.add(digestAlgorithms);
3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        v.add(contentInfo);
3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (certificates != null)
303b059facee5eb498c78c573617c62cc13eddc8644The Android Open Source Project        {
304b059facee5eb498c78c573617c62cc13eddc8644The Android Open Source Project            if (certsBer)
305b059facee5eb498c78c573617c62cc13eddc8644The Android Open Source Project            {
306b059facee5eb498c78c573617c62cc13eddc8644The Android Open Source Project                v.add(new BERTaggedObject(false, 0, certificates));
3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            else
3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                v.add(new DERTaggedObject(false, 0, certificates));
3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
314aa8236dc1b1ea300ab18716db5b8fab42aca3ca7David 'Digit' Turner        if (crls != null)
3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        {
316b059facee5eb498c78c573617c62cc13eddc8644The Android Open Source Project            if (crlsBer)
3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
318aa8236dc1b1ea300ab18716db5b8fab42aca3ca7David 'Digit' Turner                v.add(new BERTaggedObject(false, 1, crls));
3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            else
3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                v.add(new DERTaggedObject(false, 1, crls));
3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        v.add(signerInfos);
3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return new BERSequence(v);
3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project