SignerIdentifier.java revision 5db505e1f6a68c8d5dfdb0fed0b8607dea7bed96
1package org.bouncycastle.asn1.cms; 2 3import org.bouncycastle.asn1.ASN1Choice; 4import org.bouncycastle.asn1.ASN1Encodable; 5import org.bouncycastle.asn1.ASN1Object; 6import org.bouncycastle.asn1.ASN1OctetString; 7import org.bouncycastle.asn1.ASN1Primitive; 8import org.bouncycastle.asn1.ASN1TaggedObject; 9import org.bouncycastle.asn1.DERTaggedObject; 10 11/** 12 * <a href="http://tools.ietf.org/html/rfc5652#section-5.3">RFC 5652</a>: 13 * Identify who signed the containing {@link SignerInfo} object. 14 * <p> 15 * The certificates referred to by this are at containing {@link SignedData} structure. 16 * <p> 17 * <pre> 18 * SignerIdentifier ::= CHOICE { 19 * issuerAndSerialNumber IssuerAndSerialNumber, 20 * subjectKeyIdentifier [0] SubjectKeyIdentifier 21 * } 22 * 23 * SubjectKeyIdentifier ::= OCTET STRING 24 * </pre> 25 */ 26public class SignerIdentifier 27 extends ASN1Object 28 implements ASN1Choice 29{ 30 private ASN1Encodable id; 31 32 public SignerIdentifier( 33 IssuerAndSerialNumber id) 34 { 35 this.id = id; 36 } 37 38 public SignerIdentifier( 39 ASN1OctetString id) 40 { 41 this.id = new DERTaggedObject(false, 0, id); 42 } 43 44 public SignerIdentifier( 45 ASN1Primitive id) 46 { 47 this.id = id; 48 } 49 50 /** 51 * Return a SignerIdentifier object from the given object. 52 * <p> 53 * Accepted inputs: 54 * <ul> 55 * <li> null → null 56 * <li> {@link SignerIdentifier} object 57 * <li> {@link IssuerAndSerialNumber} object 58 * <li> {@link org.bouncycastle.asn1.ASN1OctetString#getInstance(java.lang.Object) ASN1OctetString} input formats with SignerIdentifier structure inside 59 * <li> {@link org.bouncycastle.asn1.ASN1Primitive ASN1Primitive} for SignerIdentifier constructor. 60 * </ul> 61 * 62 * @param o the object we want converted. 63 * @exception IllegalArgumentException if the object cannot be converted. 64 */ 65 public static SignerIdentifier getInstance( 66 Object o) 67 { 68 if (o == null || o instanceof SignerIdentifier) 69 { 70 return (SignerIdentifier)o; 71 } 72 73 if (o instanceof IssuerAndSerialNumber) 74 { 75 return new SignerIdentifier((IssuerAndSerialNumber)o); 76 } 77 78 if (o instanceof ASN1OctetString) 79 { 80 return new SignerIdentifier((ASN1OctetString)o); 81 } 82 83 if (o instanceof ASN1Primitive) 84 { 85 return new SignerIdentifier((ASN1Primitive)o); 86 } 87 88 throw new IllegalArgumentException( 89 "Illegal object in SignerIdentifier: " + o.getClass().getName()); 90 } 91 92 public boolean isTagged() 93 { 94 return (id instanceof ASN1TaggedObject); 95 } 96 97 public ASN1Encodable getId() 98 { 99 if (id instanceof ASN1TaggedObject) 100 { 101 return ASN1OctetString.getInstance((ASN1TaggedObject)id, false); 102 } 103 104 return id; 105 } 106 107 /** 108 * Produce an object suitable for an ASN1OutputStream. 109 */ 110 public ASN1Primitive toASN1Primitive() 111 { 112 return id.toASN1Primitive(); 113 } 114} 115