1package org.bouncycastle.asn1.x509; 2 3import org.bouncycastle.asn1.ASN1Encodable; 4import org.bouncycastle.asn1.ASN1EncodableVector; 5import org.bouncycastle.asn1.ASN1Object; 6import org.bouncycastle.asn1.ASN1ObjectIdentifier; 7import org.bouncycastle.asn1.ASN1Primitive; 8import org.bouncycastle.asn1.ASN1Sequence; 9import org.bouncycastle.asn1.ASN1TaggedObject; 10import org.bouncycastle.asn1.DERNull; 11import org.bouncycastle.asn1.DERObjectIdentifier; 12import org.bouncycastle.asn1.DERSequence; 13 14public class AlgorithmIdentifier 15 extends ASN1Object 16{ 17 private ASN1ObjectIdentifier objectId; 18 private ASN1Encodable 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 // TODO: delete 37 if (obj instanceof ASN1ObjectIdentifier) 38 { 39 return new AlgorithmIdentifier((ASN1ObjectIdentifier)obj); 40 } 41 42 // TODO: delete 43 if (obj instanceof String) 44 { 45 return new AlgorithmIdentifier((String)obj); 46 } 47 48 return new AlgorithmIdentifier(ASN1Sequence.getInstance(obj)); 49 } 50 51 public AlgorithmIdentifier( 52 ASN1ObjectIdentifier objectId) 53 { 54 this.objectId = objectId; 55 } 56 57 /** 58 * @deprecated use ASN1ObjectIdentifier 59 * @param objectId 60 */ 61 public AlgorithmIdentifier( 62 String objectId) 63 { 64 this.objectId = new ASN1ObjectIdentifier(objectId); 65 } 66 67 /** 68 * @deprecated use ASN1ObjectIdentifier 69 * @param objectId 70 */ 71 public AlgorithmIdentifier( 72 DERObjectIdentifier objectId) 73 { 74 this.objectId = new ASN1ObjectIdentifier(objectId.getId()); 75 } 76 77 /** 78 * @deprecated use ASN1ObjectIdentifier 79 * @param objectId 80 * @param parameters 81 */ 82 public AlgorithmIdentifier( 83 DERObjectIdentifier objectId, 84 ASN1Encodable parameters) 85 { 86 parametersDefined = true; 87 this.objectId = new ASN1ObjectIdentifier(objectId.getId()); 88 this.parameters = parameters; 89 } 90 91 public AlgorithmIdentifier( 92 ASN1ObjectIdentifier objectId, 93 ASN1Encodable parameters) 94 { 95 parametersDefined = true; 96 this.objectId = objectId; 97 this.parameters = parameters; 98 } 99 100 /** 101 * @deprecated use AlgorithmIdentifier.getInstance() 102 * @param seq 103 */ 104 public AlgorithmIdentifier( 105 ASN1Sequence seq) 106 { 107 if (seq.size() < 1 || seq.size() > 2) 108 { 109 throw new IllegalArgumentException("Bad sequence size: " 110 + seq.size()); 111 } 112 113 objectId = ASN1ObjectIdentifier.getInstance(seq.getObjectAt(0)); 114 115 if (seq.size() == 2) 116 { 117 parametersDefined = true; 118 parameters = seq.getObjectAt(1); 119 } 120 else 121 { 122 parameters = null; 123 } 124 } 125 126 public ASN1ObjectIdentifier getAlgorithm() 127 { 128 return new ASN1ObjectIdentifier(objectId.getId()); 129 } 130 131 /** 132 * @deprecated use getAlgorithm 133 * @return 134 */ 135 public ASN1ObjectIdentifier getObjectId() 136 { 137 return objectId; 138 } 139 140 public ASN1Encodable getParameters() 141 { 142 return parameters; 143 } 144 145 /** 146 * Produce an object suitable for an ASN1OutputStream. 147 * <pre> 148 * AlgorithmIdentifier ::= SEQUENCE { 149 * algorithm OBJECT IDENTIFIER, 150 * parameters ANY DEFINED BY algorithm OPTIONAL } 151 * </pre> 152 */ 153 public ASN1Primitive toASN1Primitive() 154 { 155 ASN1EncodableVector v = new ASN1EncodableVector(); 156 157 v.add(objectId); 158 159 if (parametersDefined) 160 { 161 if (parameters != null) 162 { 163 v.add(parameters); 164 } 165 else 166 { 167 v.add(DERNull.INSTANCE); 168 } 169 } 170 171 return new DERSequence(v); 172 } 173} 174