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