001package org.apache.commons.ssl.org.bouncycastle.asn1.x509; 002 003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Encodable; 004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector; 005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object; 006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1ObjectIdentifier; 007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive; 008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence; 009import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject; 010import org.apache.commons.ssl.org.bouncycastle.asn1.DERNull; 011import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence; 012 013public class AlgorithmIdentifier 014 extends ASN1Object 015{ 016 private ASN1ObjectIdentifier objectId; 017 private ASN1Encodable parameters; 018 private boolean parametersDefined = false; 019 020 public static AlgorithmIdentifier getInstance( 021 ASN1TaggedObject obj, 022 boolean explicit) 023 { 024 return getInstance(ASN1Sequence.getInstance(obj, explicit)); 025 } 026 027 public static AlgorithmIdentifier getInstance( 028 Object obj) 029 { 030 if (obj== null || obj instanceof AlgorithmIdentifier) 031 { 032 return (AlgorithmIdentifier)obj; 033 } 034 035 // TODO: delete 036 if (obj instanceof ASN1ObjectIdentifier) 037 { 038 return new AlgorithmIdentifier((ASN1ObjectIdentifier)obj); 039 } 040 041 // TODO: delete 042 if (obj instanceof String) 043 { 044 return new AlgorithmIdentifier((String)obj); 045 } 046 047 return new AlgorithmIdentifier(ASN1Sequence.getInstance(obj)); 048 } 049 050 public AlgorithmIdentifier( 051 ASN1ObjectIdentifier objectId) 052 { 053 this.objectId = objectId; 054 } 055 056 /** 057 * @deprecated use ASN1ObjectIdentifier 058 * @param objectId 059 */ 060 public AlgorithmIdentifier( 061 String objectId) 062 { 063 this.objectId = new ASN1ObjectIdentifier(objectId); 064 } 065 066 public AlgorithmIdentifier( 067 ASN1ObjectIdentifier objectId, 068 ASN1Encodable parameters) 069 { 070 parametersDefined = true; 071 this.objectId = objectId; 072 this.parameters = parameters; 073 } 074 075 /** 076 * @deprecated use AlgorithmIdentifier.getInstance() 077 * @param seq 078 */ 079 public AlgorithmIdentifier( 080 ASN1Sequence seq) 081 { 082 if (seq.size() < 1 || seq.size() > 2) 083 { 084 throw new IllegalArgumentException("Bad sequence size: " 085 + seq.size()); 086 } 087 088 objectId = ASN1ObjectIdentifier.getInstance(seq.getObjectAt(0)); 089 090 if (seq.size() == 2) 091 { 092 parametersDefined = true; 093 parameters = seq.getObjectAt(1); 094 } 095 else 096 { 097 parameters = null; 098 } 099 } 100 101 public ASN1ObjectIdentifier getAlgorithm() 102 { 103 return new ASN1ObjectIdentifier(objectId.getId()); 104 } 105 106 /** 107 * @deprecated use getAlgorithm 108 * @return 109 */ 110 public ASN1ObjectIdentifier getObjectId() 111 { 112 return objectId; 113 } 114 115 public ASN1Encodable getParameters() 116 { 117 return parameters; 118 } 119 120 /** 121 * Produce an object suitable for an ASN1OutputStream. 122 * <pre> 123 * AlgorithmIdentifier ::= SEQUENCE { 124 * algorithm OBJECT IDENTIFIER, 125 * parameters ANY DEFINED BY algorithm OPTIONAL } 126 * </pre> 127 */ 128 public ASN1Primitive toASN1Primitive() 129 { 130 ASN1EncodableVector v = new ASN1EncodableVector(); 131 132 v.add(objectId); 133 134 if (parametersDefined) 135 { 136 if (parameters != null) 137 { 138 v.add(parameters); 139 } 140 else 141 { 142 v.add(DERNull.INSTANCE); 143 } 144 } 145 146 return new DERSequence(v); 147 } 148}