ASN1OctetString.java revision e6bf3e8dfa2804891a82075cb469b736321b4827
1f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangpackage org.bouncycastle.asn1; 2f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 3f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangimport java.io.ByteArrayInputStream; 4f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangimport java.io.IOException; 5f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangimport java.io.InputStream; 6f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 7f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangimport org.bouncycastle.util.Arrays; 8f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tangimport org.bouncycastle.util.encoders.Hex; 9f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 101fdb08e5fc427b54b54214e3b3fbdda73d369f4dDavid Mosberger-Tangpublic abstract class ASN1OctetString 11f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang extends ASN1Primitive 123842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz implements ASN1OctetStringParser 133842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{ 143842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz byte[] string; 153842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 163842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz /** 173842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz * return an Octet String from a tagged object. 186a5da54b8ac724fc68001a1e07430d910d9e8141Tommi Rantala * 196a5da54b8ac724fc68001a1e07430d910d9e8141Tommi Rantala * @param obj the tagged object holding the object we want. 20ee8df2628891435ebb95eee04668d5bbd6995723Tommi Rantala * @param explicit true if the object is meant to be explicitly 211fdb08e5fc427b54b54214e3b3fbdda73d369f4dDavid Mosberger-Tang * tagged false otherwise. 226a5da54b8ac724fc68001a1e07430d910d9e8141Tommi Rantala * @exception IllegalArgumentException if the tagged object cannot 231fdb08e5fc427b54b54214e3b3fbdda73d369f4dDavid Mosberger-Tang * be converted. 246a5da54b8ac724fc68001a1e07430d910d9e8141Tommi Rantala */ 25f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang public static ASN1OctetString getInstance( 26f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang ASN1TaggedObject obj, 27f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang boolean explicit) 28f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang { 29f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang ASN1Primitive o = obj.getObject(); 30f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 313842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz if (explicit || o instanceof ASN1OctetString) 32f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang { 33f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang return getInstance(o); 34f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang } 35f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang else 36f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang { 37f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang return BEROctetString.fromSequence(ASN1Sequence.getInstance(o)); 38f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang } 39f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang } 40f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 41f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang /** 42f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang * return an Octet String from the given object. 433842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz * 44f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang * @param obj the object we want converted. 45f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang * @exception IllegalArgumentException if the object cannot be converted. 46f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang */ 47f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang public static ASN1OctetString getInstance( 48f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang Object obj) 493842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz { 50f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang if (obj == null || obj instanceof ASN1OctetString) 51f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang { 52f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang return (ASN1OctetString)obj; 53f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang } 54f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang else if (obj instanceof byte[]) 55f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang { 56f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang try 57f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang { 58f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang return ASN1OctetString.getInstance(ASN1Primitive.fromByteArray((byte[])obj)); 59f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang } 603842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz catch (IOException e) 61f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang { 62f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang throw new IllegalArgumentException("failed to construct OCTET STRING from byte[]: " + e.getMessage()); 63f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang } 64f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang } 65f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang else if (obj instanceof ASN1Encodable) 66f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang { 67f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang ASN1Primitive primitive = ((ASN1Encodable)obj).toASN1Primitive(); 68f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 69f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang if (primitive instanceof ASN1OctetString) 70f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang { 713842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz return (ASN1OctetString)primitive; 72f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang } 73f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang } 74f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 75f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); 76f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang } 77f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 78f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang /** 79f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang * @param string the octets making up the octet string. 80f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang */ 81f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang public ASN1OctetString( 823842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz byte[] string) 83f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang { 84f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang if (string == null) 85f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang { 86f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang throw new NullPointerException("string cannot be null"); 87f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang } 88f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang this.string = string; 89f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang } 90f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 91f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang public InputStream getOctetStream() 92f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang { 933842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz return new ByteArrayInputStream(string); 94f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang } 95f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 96f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang public ASN1OctetStringParser parser() 97f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang { 98f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang return this; 99f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang } 100f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 101f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang public byte[] getOctets() 102f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang { 103f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang return string; 1043842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz } 105f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 106f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang public int hashCode() 107f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang { 108f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang return Arrays.hashCode(this.getOctets()); 109f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang } 110f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 111f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang boolean asn1Equals( 112f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang ASN1Primitive o) 113f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang { 114f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang if (!(o instanceof ASN1OctetString)) 1153842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz { 116f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang return false; 117f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang } 118f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 119f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang ASN1OctetString other = (ASN1OctetString)o; 120f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 121f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang return Arrays.areEqual(string, other.string); 122f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang } 123f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 124f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang public ASN1Primitive getLoadedObject() 125f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang { 1263842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz return this.toASN1Primitive(); 127f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang } 128f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 129f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang ASN1Primitive toDERObject() 130f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang { 131f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang return new DEROctetString(string); 132f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang } 133f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 134f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang ASN1Primitive toDLObject() 135f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang { 136f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang return new DEROctetString(string); 137f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang } 138f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 139f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang abstract void encode(ASN1OutputStream out) 140f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang throws IOException; 141f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang 142f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang public String toString() 143f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang { 144f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang return "#"+new String(Hex.encode(string)); 145f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang } 146f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang} 147f176ad6fc6d4982e92c330265b00419e93b79f27David Mosberger-Tang