1b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampackage org.bouncycastle.asn1.cms; 2b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 3b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1Encodable; 4b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1EncodableVector; 54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Object; 66e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.asn1.ASN1ObjectIdentifier; 74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Primitive; 8b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1Sequence; 9b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1TaggedObject; 10b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.BERSequence; 11b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.BERTaggedObject; 12b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 135db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root/** 145db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * <a href="http://tools.ietf.org/html/rfc5652#section-3">RFC 5652</a> ContentInfo, and 155db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * <a href="http://tools.ietf.org/html/rfc5652#section-5.2">RFC 5652</a> EncapsulatedContentInfo objects. 165db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * 175db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * <pre> 185db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * ContentInfo ::= SEQUENCE { 195db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * contentType ContentType, 205db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * content [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL 215db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * } 225db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * 235db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * EncapsulatedContentInfo ::= SEQUENCE { 245db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * eContentType ContentType, 255db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * eContent [0] EXPLICIT OCTET STRING OPTIONAL 265db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * } 275db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * </pre> 285db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root */ 29b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampublic class ContentInfo 304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom extends ASN1Object 316e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom // BEGIN android-removed 326e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom // implements CMSObjectIdentifiers 336e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom // END android-removed 34b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam{ 356e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom private ASN1ObjectIdentifier contentType; 364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom private ASN1Encodable content; 37b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 385db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root /** 395db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * Return an ContentInfo object from the given object. 405db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * <p> 415db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * Accepted inputs: 425db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * <ul> 435db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * <li> null → null 445db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * <li> {@link ContentInfo} object 455db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * <li> {@link org.bouncycastle.asn1.ASN1Sequence#getInstance(java.lang.Object) ASN1Sequence} input formats with ContentInfo structure inside 465db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * </ul> 475db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * 485db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * @param obj the object we want converted. 495db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * @exception IllegalArgumentException if the object cannot be converted. 505db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root */ 51b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public static ContentInfo getInstance( 52b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam Object obj) 53b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (obj instanceof ContentInfo) 55b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 56b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return (ContentInfo)obj; 57b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom else if (obj != null) 59b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return new ContentInfo(ASN1Sequence.getInstance(obj)); 61b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 62b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return null; 64b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 65b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 66a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom public static ContentInfo getInstance( 67a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom ASN1TaggedObject obj, 68a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom boolean explicit) 69a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom { 70a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom return getInstance(ASN1Sequence.getInstance(obj, explicit)); 71a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom } 72a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom 73a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom /** 74a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom * @deprecated use getInstance() 75a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom */ 76b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public ContentInfo( 77b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam ASN1Sequence seq) 78b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 796e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom if (seq.size() < 1 || seq.size() > 2) 806e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom { 816e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom throw new IllegalArgumentException("Bad sequence size: " + seq.size()); 826e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom } 83b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 846e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom contentType = (ASN1ObjectIdentifier)seq.getObjectAt(0); 85b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 866e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom if (seq.size() > 1) 87b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 886e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom ASN1TaggedObject tagged = (ASN1TaggedObject)seq.getObjectAt(1); 896e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom if (!tagged.isExplicit() || tagged.getTagNo() != 0) 906e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom { 916e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom throw new IllegalArgumentException("Bad tag for 'content'"); 926e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom } 936e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom 946e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom content = tagged.getObject(); 95b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 96b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 97b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 98b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public ContentInfo( 996e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom ASN1ObjectIdentifier contentType, 1004c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Encodable content) 101b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 102b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam this.contentType = contentType; 103b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam this.content = content; 104b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 105b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 1066e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom public ASN1ObjectIdentifier getContentType() 107b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 108b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return contentType; 109b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 110b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 1114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public ASN1Encodable getContent() 112b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 113b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return content; 114b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 115b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 116b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 117b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * Produce an object suitable for an ASN1OutputStream. 118b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 1194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public ASN1Primitive toASN1Primitive() 120b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 121b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam ASN1EncodableVector v = new ASN1EncodableVector(); 122b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 123b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam v.add(contentType); 124b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 125b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam if (content != null) 126b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 127b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam v.add(new BERTaggedObject(0, content)); 128b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 129b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 130b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return new BERSequence(v); 131b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 132b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam} 133