1 package org.bouncycastle.asn1;
2
3 import java.io.*;
4 import java.util.*;
5
6 public abstract class ASN1OctetString
7 extends DERObject
8 {
9 byte[] string;
10
11
20 public static ASN1OctetString getInstance(
21 ASN1TaggedObject obj,
22 boolean explicit)
23 {
24 return getInstance(obj.getObject());
25 }
26
27
33 public static ASN1OctetString getInstance(
34 Object obj)
35 {
36 if (obj == null || obj instanceof ASN1OctetString)
37 {
38 return (ASN1OctetString)obj;
39 }
40
41 if (obj instanceof ASN1TaggedObject)
42 {
43 return getInstance(((ASN1TaggedObject)obj).getObject());
44 }
45
46 if (obj instanceof ASN1Sequence)
47 {
48 Vector v = new Vector();
49 Enumeration e = ((ASN1Sequence)obj).getObjects();
50
51 while (e.hasMoreElements())
52 {
53 v.addElement(e.nextElement());
54 }
55
56 return new BERConstructedOctetString(v);
57 }
58
59 throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
60 }
61
62
65 public ASN1OctetString(
66 byte[] string)
67 {
68 this.string = string;
69 }
70
71 public ASN1OctetString(
72 DEREncodable obj)
73 {
74 try
75 {
76 ByteArrayOutputStream bOut = new ByteArrayOutputStream();
77 DEROutputStream dOut = new DEROutputStream(bOut);
78
79 dOut.writeObject(obj);
80 dOut.close();
81
82 this.string = bOut.toByteArray();
83 }
84 catch (IOException e)
85 {
86 throw new IllegalArgumentException("Error processing object : " + e.toString());
87 }
88 }
89
90 public byte[] getOctets()
91 {
92 return string;
93 }
94
95 public int hashCode()
96 {
97 byte[] b = this.getOctets();
98 int value = 0;
99
100 for (int i = 0; i != b.length; i++)
101 {
102 value ^= (b[i] & 0xff) << (i % 4);
103 }
104
105 return value;
106 }
107
108 public boolean equals(
109 Object o)
110 {
111 if (o == null || !(o instanceof DEROctetString))
112 {
113 return false;
114 }
115
116 DEROctetString other = (DEROctetString)o;
117
118 byte[] b1 = other.getOctets();
119 byte[] b2 = this.getOctets();
120
121 if (b1.length != b2.length)
122 {
123 return false;
124 }
125
126 for (int i = 0; i != b1.length; i++)
127 {
128 if (b1[i] != b2[i])
129 {
130 return false;
131 }
132 }
133
134 return true;
135 }
136
137 abstract void encode(DEROutputStream out)
138 throws IOException;
139 }
140