1b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampackage org.bouncycastle.asn1.pkcs; 2b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 3b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport java.util.Enumeration; 4b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 5b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1EncodableVector; 64c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Integer; 74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Object; 84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Primitive; 9b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1Sequence; 10b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1Set; 11b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.BERSequence; 12b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.DERTaggedObject; 13b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 14b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam/** 15b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * a PKCS#7 signed data object. 16b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 17b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampublic class SignedData 184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom extends ASN1Object 19b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam implements PKCSObjectIdentifiers 20b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam{ 214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom private ASN1Integer version; 22b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam private ASN1Set digestAlgorithms; 23b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam private ContentInfo contentInfo; 24b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam private ASN1Set certificates; 25b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam private ASN1Set crls; 26b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam private ASN1Set signerInfos; 27b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 28b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public static SignedData getInstance( 29b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam Object o) 30b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 31b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam if (o instanceof SignedData) 32b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 33b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return (SignedData)o; 34b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom else if (o != null) 36b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return new SignedData(ASN1Sequence.getInstance(o)); 38b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 39b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return null; 41b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 42b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 43b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public SignedData( 444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Integer _version, 45b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam ASN1Set _digestAlgorithms, 46b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam ContentInfo _contentInfo, 47b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam ASN1Set _certificates, 48b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam ASN1Set _crls, 49b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam ASN1Set _signerInfos) 50b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 51b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam version = _version; 52b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam digestAlgorithms = _digestAlgorithms; 53b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam contentInfo = _contentInfo; 54b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam certificates = _certificates; 55b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam crls = _crls; 56b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam signerInfos = _signerInfos; 57b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 58b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 59b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public SignedData( 60b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam ASN1Sequence seq) 61b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 62b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam Enumeration e = seq.getObjects(); 63b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom version = (ASN1Integer)e.nextElement(); 65b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam digestAlgorithms = ((ASN1Set)e.nextElement()); 66b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam contentInfo = ContentInfo.getInstance(e.nextElement()); 67b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 68b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam while (e.hasMoreElements()) 69b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Primitive o = (ASN1Primitive)e.nextElement(); 71b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 72b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam // 73b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam // an interesting feature of SignedData is that there appear to be varying implementations... 74b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam // for the moment we ignore anything which doesn't fit. 75b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam // 76b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam if (o instanceof DERTaggedObject) 77b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 78b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam DERTaggedObject tagged = (DERTaggedObject)o; 79b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 80b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam switch (tagged.getTagNo()) 81b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 82b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam case 0: 83b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam certificates = ASN1Set.getInstance(tagged, false); 84b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam break; 85b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam case 1: 86b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam crls = ASN1Set.getInstance(tagged, false); 87b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam break; 88b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam default: 89b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam throw new IllegalArgumentException("unknown tag value " + tagged.getTagNo()); 90b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 91b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 92b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam else 93b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 94b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam signerInfos = (ASN1Set)o; 95b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 96b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 97b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 98b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 994c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public ASN1Integer getVersion() 100b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 101b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return version; 102b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 103b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 104b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public ASN1Set getDigestAlgorithms() 105b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 106b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return digestAlgorithms; 107b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 108b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 109b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public ContentInfo getContentInfo() 110b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 111b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return contentInfo; 112b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 113b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 114b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public ASN1Set getCertificates() 115b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 116b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return certificates; 117b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 118b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 119b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public ASN1Set getCRLs() 120b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 121b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return crls; 122b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 123b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 124b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public ASN1Set getSignerInfos() 125b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 126b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return signerInfos; 127b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 128b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 129b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 130b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * Produce an object suitable for an ASN1OutputStream. 131b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * <pre> 132b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * SignedData ::= SEQUENCE { 133b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * version Version, 134b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * digestAlgorithms DigestAlgorithmIdentifiers, 135b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * contentInfo ContentInfo, 136b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * certificates 137b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * [0] IMPLICIT ExtendedCertificatesAndCertificates 138b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * OPTIONAL, 139b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * crls 140b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * [1] IMPLICIT CertificateRevocationLists OPTIONAL, 141b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * signerInfos SignerInfos } 142b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * </pre> 143b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 1444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public ASN1Primitive toASN1Primitive() 145b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 146b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam ASN1EncodableVector v = new ASN1EncodableVector(); 147b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 148b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam v.add(version); 149b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam v.add(digestAlgorithms); 150b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam v.add(contentInfo); 151b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 152b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam if (certificates != null) 153b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 154b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam v.add(new DERTaggedObject(false, 0, certificates)); 155b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 156b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 157b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam if (crls != null) 158b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 159b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam v.add(new DERTaggedObject(false, 1, crls)); 160b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 161b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 162b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam v.add(signerInfos); 163b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 164b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return new BERSequence(v); 165b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 166b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam} 167