1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage org.bouncycastle.asn1; 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.ByteArrayOutputStream; 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.IOException; 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Enumeration; 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Vector; 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.bouncycastle.util.encoders.Hex; 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic abstract class ASN1OctetString 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project extends DERObject 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{ 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte[] string; 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * return an Octet String from a tagged object. 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param obj the tagged object holding the object we want. 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param explicit true if the object is meant to be explicitly 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * tagged false otherwise. 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @exception IllegalArgumentException if the tagged object cannot 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * be converted. 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static ASN1OctetString getInstance( 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ASN1TaggedObject obj, 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project boolean explicit) 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return getInstance(obj.getObject()); 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * return an Octet String from the given object. 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param obj the object we want converted. 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @exception IllegalArgumentException if the object cannot be converted. 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static ASN1OctetString getInstance( 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object obj) 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (obj == null || obj instanceof ASN1OctetString) 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return (ASN1OctetString)obj; 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (obj instanceof ASN1TaggedObject) 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return getInstance(((ASN1TaggedObject)obj).getObject()); 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (obj instanceof ASN1Sequence) 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Vector v = new Vector(); 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Enumeration e = ((ASN1Sequence)obj).getObjects(); 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project while (e.hasMoreElements()) 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project v.addElement(e.nextElement()); 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return new BERConstructedOctetString(v); 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param string the octets making up the octet string. 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public ASN1OctetString( 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte[] string) 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.string = string; 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public ASN1OctetString( 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project DEREncodable obj) 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project try 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ByteArrayOutputStream bOut = new ByteArrayOutputStream(); 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project DEROutputStream dOut = new DEROutputStream(bOut); 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dOut.writeObject(obj); 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project dOut.close(); 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.string = bOut.toByteArray(); 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project catch (IOException e) 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new IllegalArgumentException("Error processing object : " + e.toString()); 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public byte[] getOctets() 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return string; 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int hashCode() 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte[] b = this.getOctets(); 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int value = 0; 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = 0; i != b.length; i++) 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project value ^= (b[i] & 0xff) << (i % 4); 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return value; 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public boolean equals( 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Object o) 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (!(o instanceof DEROctetString)) 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return false; 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project DEROctetString other = (DEROctetString)o; 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte[] b1 = other.getOctets(); 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project byte[] b2 = this.getOctets(); 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (b1.length != b2.length) 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return false; 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = 0; i != b1.length; i++) 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (b1[i] != b2[i]) 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return false; 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return true; 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project abstract void encode(DEROutputStream out) 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throws IOException; 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public String toString() 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project { 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return "#"+new String(Hex.encode(string)); 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 148