1package org.bouncycastle.asn1.x509; 2 3import org.bouncycastle.asn1.ASN1Encodable; 4import org.bouncycastle.asn1.ASN1EncodableVector; 5import org.bouncycastle.asn1.ASN1ObjectIdentifier; 6import org.bouncycastle.asn1.ASN1Sequence; 7import org.bouncycastle.asn1.ASN1TaggedObject; 8import org.bouncycastle.asn1.DEREncodable; 9import org.bouncycastle.asn1.DERNull; 10import org.bouncycastle.asn1.DERObject; 11import org.bouncycastle.asn1.DERObjectIdentifier; 12import org.bouncycastle.asn1.DERSequence; 13 14public class AlgorithmIdentifier 15 extends ASN1Encodable 16{ 17 private DERObjectIdentifier objectId; 18 private DEREncodable parameters; 19 private boolean parametersDefined = false; 20 21 public static AlgorithmIdentifier getInstance( 22 ASN1TaggedObject obj, 23 boolean explicit) 24 { 25 return getInstance(ASN1Sequence.getInstance(obj, explicit)); 26 } 27 28 public static AlgorithmIdentifier getInstance( 29 Object obj) 30 { 31 if (obj== null || obj instanceof AlgorithmIdentifier) 32 { 33 return (AlgorithmIdentifier)obj; 34 } 35 36 if (obj instanceof DERObjectIdentifier) 37 { 38 return new AlgorithmIdentifier((DERObjectIdentifier)obj); 39 } 40 41 if (obj instanceof String) 42 { 43 return new AlgorithmIdentifier((String)obj); 44 } 45 46 if (obj instanceof ASN1Sequence) 47 { 48 return new AlgorithmIdentifier((ASN1Sequence)obj); 49 } 50 51 throw new IllegalArgumentException("unknown object in factory: " + obj.getClass().getName()); 52 } 53 54 public AlgorithmIdentifier( 55 DERObjectIdentifier objectId) 56 { 57 this.objectId = objectId; 58 } 59 60 public AlgorithmIdentifier( 61 String objectId) 62 { 63 this.objectId = new DERObjectIdentifier(objectId); 64 } 65 66 public AlgorithmIdentifier( 67 DERObjectIdentifier objectId, 68 DEREncodable parameters) 69 { 70 parametersDefined = true; 71 this.objectId = objectId; 72 this.parameters = parameters; 73 } 74 75 public AlgorithmIdentifier( 76 ASN1Sequence seq) 77 { 78 if (seq.size() < 1 || seq.size() > 2) 79 { 80 throw new IllegalArgumentException("Bad sequence size: " 81 + seq.size()); 82 } 83 84 objectId = DERObjectIdentifier.getInstance(seq.getObjectAt(0)); 85 86 if (seq.size() == 2) 87 { 88 parametersDefined = true; 89 parameters = seq.getObjectAt(1); 90 } 91 else 92 { 93 parameters = null; 94 } 95 } 96 97 public ASN1ObjectIdentifier getAlgorithm() 98 { 99 return new ASN1ObjectIdentifier(objectId.getId()); 100 } 101 102 /** 103 * @deprecated use getAlgorithm 104 * @return 105 */ 106 public DERObjectIdentifier getObjectId() 107 { 108 return objectId; 109 } 110 111 public DEREncodable getParameters() 112 { 113 return parameters; 114 } 115 116 /** 117 * Produce an object suitable for an ASN1OutputStream. 118 * <pre> 119 * AlgorithmIdentifier ::= SEQUENCE { 120 * algorithm OBJECT IDENTIFIER, 121 * parameters ANY DEFINED BY algorithm OPTIONAL } 122 * </pre> 123 */ 124 public DERObject toASN1Object() 125 { 126 ASN1EncodableVector v = new ASN1EncodableVector(); 127 128 v.add(objectId); 129 130 if (parametersDefined) 131 { 132 if (parameters != null) 133 { 134 v.add(parameters); 135 } 136 else 137 { 138 v.add(DERNull.INSTANCE); 139 } 140 } 141 142 return new DERSequence(v); 143 } 144} 145