1package org.bouncycastle.asn1.x509; 2 3import java.math.BigInteger; 4 5import org.bouncycastle.asn1.ASN1EncodableVector; 6import org.bouncycastle.asn1.ASN1Integer; 7import org.bouncycastle.asn1.ASN1Object; 8import org.bouncycastle.asn1.ASN1Primitive; 9import org.bouncycastle.asn1.ASN1Sequence; 10import org.bouncycastle.asn1.ASN1TaggedObject; 11import org.bouncycastle.asn1.DERBitString; 12import org.bouncycastle.asn1.DERSequence; 13import org.bouncycastle.asn1.x500.X500Name; 14 15public class IssuerSerial 16 extends ASN1Object 17{ 18 GeneralNames issuer; 19 ASN1Integer serial; 20 DERBitString issuerUID; 21 22 public static IssuerSerial getInstance( 23 Object obj) 24 { 25 if (obj instanceof IssuerSerial) 26 { 27 return (IssuerSerial)obj; 28 } 29 30 if (obj != null) 31 { 32 return new IssuerSerial(ASN1Sequence.getInstance(obj)); 33 } 34 35 return null; 36 } 37 38 public static IssuerSerial getInstance( 39 ASN1TaggedObject obj, 40 boolean explicit) 41 { 42 return getInstance(ASN1Sequence.getInstance(obj, explicit)); 43 } 44 45 private IssuerSerial( 46 ASN1Sequence seq) 47 { 48 if (seq.size() != 2 && seq.size() != 3) 49 { 50 throw new IllegalArgumentException("Bad sequence size: " + seq.size()); 51 } 52 53 issuer = GeneralNames.getInstance(seq.getObjectAt(0)); 54 serial = ASN1Integer.getInstance(seq.getObjectAt(1)); 55 56 if (seq.size() == 3) 57 { 58 issuerUID = DERBitString.getInstance(seq.getObjectAt(2)); 59 } 60 } 61 62 public IssuerSerial( 63 X500Name issuer, 64 BigInteger serial) 65 { 66 this(new GeneralNames(new GeneralName(issuer)), new ASN1Integer(serial)); 67 } 68 69 public IssuerSerial( 70 GeneralNames issuer, 71 BigInteger serial) 72 { 73 this(issuer, new ASN1Integer(serial)); 74 } 75 76 public IssuerSerial( 77 GeneralNames issuer, 78 ASN1Integer serial) 79 { 80 this.issuer = issuer; 81 this.serial = serial; 82 } 83 84 public GeneralNames getIssuer() 85 { 86 return issuer; 87 } 88 89 public ASN1Integer getSerial() 90 { 91 return serial; 92 } 93 94 public DERBitString getIssuerUID() 95 { 96 return issuerUID; 97 } 98 99 /** 100 * Produce an object suitable for an ASN1OutputStream. 101 * <pre> 102 * IssuerSerial ::= SEQUENCE { 103 * issuer GeneralNames, 104 * serial CertificateSerialNumber, 105 * issuerUID UniqueIdentifier OPTIONAL 106 * } 107 * </pre> 108 */ 109 public ASN1Primitive toASN1Primitive() 110 { 111 ASN1EncodableVector v = new ASN1EncodableVector(); 112 113 v.add(issuer); 114 v.add(serial); 115 116 if (issuerUID != null) 117 { 118 v.add(issuerUID); 119 } 120 121 return new DERSequence(v); 122 } 123} 124