1package org.bouncycastle.asn1.cms; 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.DERSequence; 11import org.bouncycastle.asn1.x500.X500Name; 12import org.bouncycastle.asn1.x509.Certificate; 13import org.bouncycastle.asn1.x509.X509CertificateStructure; 14import org.bouncycastle.asn1.x509.X509Name; 15 16/** 17 * <a href="http://tools.ietf.org/html/rfc5652#section-10.2.4">RFC 5652</a>: IssuerAndSerialNumber object. 18 * <p> 19 * <pre> 20 * IssuerAndSerialNumber ::= SEQUENCE { 21 * issuer Name, 22 * serialNumber CertificateSerialNumber 23 * } 24 * 25 * CertificateSerialNumber ::= INTEGER -- See RFC 5280 26 * </pre> 27 */ 28public class IssuerAndSerialNumber 29 extends ASN1Object 30{ 31 private X500Name name; 32 private ASN1Integer serialNumber; 33 34 /** 35 * Return an IssuerAndSerialNumber object from the given object. 36 * <p> 37 * Accepted inputs: 38 * <ul> 39 * <li> null → null 40 * <li> {@link IssuerAndSerialNumber} object 41 * <li> {@link org.bouncycastle.asn1.ASN1Sequence#getInstance(java.lang.Object) ASN1Sequence} input formats with IssuerAndSerialNumber structure inside 42 * </ul> 43 * 44 * @param obj the object we want converted. 45 * @exception IllegalArgumentException if the object cannot be converted. 46 */ 47 public static IssuerAndSerialNumber getInstance( 48 Object obj) 49 { 50 if (obj instanceof IssuerAndSerialNumber) 51 { 52 return (IssuerAndSerialNumber)obj; 53 } 54 else if (obj != null) 55 { 56 return new IssuerAndSerialNumber(ASN1Sequence.getInstance(obj)); 57 } 58 59 return null; 60 } 61 62 /** 63 * @deprecated use getInstance() method. 64 */ 65 public IssuerAndSerialNumber( 66 ASN1Sequence seq) 67 { 68 this.name = X500Name.getInstance(seq.getObjectAt(0)); 69 this.serialNumber = (ASN1Integer)seq.getObjectAt(1); 70 } 71 72 public IssuerAndSerialNumber( 73 Certificate certificate) 74 { 75 this.name = certificate.getIssuer(); 76 this.serialNumber = certificate.getSerialNumber(); 77 } 78 79 /** 80 * @deprecated use constructor taking Certificate 81 */ 82 public IssuerAndSerialNumber( 83 X509CertificateStructure certificate) 84 { 85 this.name = certificate.getIssuer(); 86 this.serialNumber = certificate.getSerialNumber(); 87 } 88 89 public IssuerAndSerialNumber( 90 X500Name name, 91 BigInteger serialNumber) 92 { 93 this.name = name; 94 this.serialNumber = new ASN1Integer(serialNumber); 95 } 96 97 /** 98 * @deprecated use X500Name constructor 99 */ 100 public IssuerAndSerialNumber( 101 X509Name name, 102 BigInteger serialNumber) 103 { 104 this.name = X500Name.getInstance(name); 105 this.serialNumber = new ASN1Integer(serialNumber); 106 } 107 108 /** 109 * @deprecated use X500Name constructor 110 */ 111 public IssuerAndSerialNumber( 112 X509Name name, 113 ASN1Integer serialNumber) 114 { 115 this.name = X500Name.getInstance(name); 116 this.serialNumber = serialNumber; 117 } 118 119 public X500Name getName() 120 { 121 return name; 122 } 123 124 public ASN1Integer getSerialNumber() 125 { 126 return serialNumber; 127 } 128 129 public ASN1Primitive toASN1Primitive() 130 { 131 ASN1EncodableVector v = new ASN1EncodableVector(); 132 133 v.add(name); 134 v.add(serialNumber); 135 136 return new DERSequence(v); 137 } 138} 139