001package org.apache.commons.ssl.org.bouncycastle.asn1.cms; 002 003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Choice; 004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Encodable; 005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object; 006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1OctetString; 007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive; 008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject; 009import org.apache.commons.ssl.org.bouncycastle.asn1.DERTaggedObject; 010 011/** 012 * <a href="http://tools.ietf.org/html/rfc5652#section-5.3">RFC 5652</a>: 013 * Identify who signed the containing {@link SignerInfo} object. 014 * <p> 015 * The certificates referred to by this are at containing {@link SignedData} structure. 016 * <p> 017 * <pre> 018 * SignerIdentifier ::= CHOICE { 019 * issuerAndSerialNumber IssuerAndSerialNumber, 020 * subjectKeyIdentifier [0] SubjectKeyIdentifier 021 * } 022 * 023 * SubjectKeyIdentifier ::= OCTET STRING 024 * </pre> 025 */ 026public class SignerIdentifier 027 extends ASN1Object 028 implements ASN1Choice 029{ 030 private ASN1Encodable id; 031 032 public SignerIdentifier( 033 IssuerAndSerialNumber id) 034 { 035 this.id = id; 036 } 037 038 public SignerIdentifier( 039 ASN1OctetString id) 040 { 041 this.id = new DERTaggedObject(false, 0, id); 042 } 043 044 public SignerIdentifier( 045 ASN1Primitive id) 046 { 047 this.id = id; 048 } 049 050 /** 051 * Return a SignerIdentifier object from the given object. 052 * <p> 053 * Accepted inputs: 054 * <ul> 055 * <li> null → null 056 * <li> {@link SignerIdentifier} object 057 * <li> {@link IssuerAndSerialNumber} object 058 * <li> {@link org.bouncycastle.asn1.ASN1OctetString#getInstance(java.lang.Object) ASN1OctetString} input formats with SignerIdentifier structure inside 059 * <li> {@link org.bouncycastle.asn1.ASN1Primitive ASN1Primitive} for SignerIdentifier constructor. 060 * </ul> 061 * 062 * @param o the object we want converted. 063 * @exception IllegalArgumentException if the object cannot be converted. 064 */ 065 public static SignerIdentifier getInstance( 066 Object o) 067 { 068 if (o == null || o instanceof SignerIdentifier) 069 { 070 return (SignerIdentifier)o; 071 } 072 073 if (o instanceof IssuerAndSerialNumber) 074 { 075 return new SignerIdentifier((IssuerAndSerialNumber)o); 076 } 077 078 if (o instanceof ASN1OctetString) 079 { 080 return new SignerIdentifier((ASN1OctetString)o); 081 } 082 083 if (o instanceof ASN1Primitive) 084 { 085 return new SignerIdentifier((ASN1Primitive)o); 086 } 087 088 throw new IllegalArgumentException( 089 "Illegal object in SignerIdentifier: " + o.getClass().getName()); 090 } 091 092 public boolean isTagged() 093 { 094 return (id instanceof ASN1TaggedObject); 095 } 096 097 public ASN1Encodable getId() 098 { 099 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}