Home | History | Annotate | Download | only in cms
      1 package org.bouncycastle.asn1.cms;
      2 
      3 import org.bouncycastle.asn1.ASN1Choice;
      4 import org.bouncycastle.asn1.ASN1Encodable;
      5 import org.bouncycastle.asn1.ASN1Object;
      6 import org.bouncycastle.asn1.ASN1OctetString;
      7 import org.bouncycastle.asn1.ASN1Primitive;
      8 import org.bouncycastle.asn1.ASN1TaggedObject;
      9 import 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  */
     26 public 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 &rarr; 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