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 → 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