001 /*
002 * Copyright (c) 2000 - 2006 The Legion Of The Bouncy Castle (http://www.bouncycastle.org)
003 *
004 * Permission is hereby granted, free of charge, to any person obtaining a copy of this
005 * software and associated documentation files (the "Software"), to deal in the Software
006 * without restriction, including without limitation the rights to use, copy, modify,
007 * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
008 * permit persons to whom the Software is furnished to do so, subject to the following
009 * conditions:
010 *
011 * The above copyright notice and this permission notice shall be included in all copies
012 * or substantial portions of the Software.
013 *
014 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
015 * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
016 * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
017 * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
018 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
019 * DEALINGS IN THE SOFTWARE.
020 *
021 */
022
023 package org.apache.directory.shared.asn1.der;
024
025
026 import java.io.IOException;
027 import java.util.Arrays;
028
029
030 /**
031 * DER object.
032 */
033 public abstract class DERObject implements DEREncodable
034 {
035 static final int TERMINATOR = 0x00;
036
037 static final int BOOLEAN = 0x01;
038
039 static final int INTEGER = 0x02;
040
041 static final int BIT_STRING = 0x03;
042
043 static final int OCTET_STRING = 0x04;
044
045 static final int NULL = 0x05;
046
047 static final int OBJECT_IDENTIFIER = 0x06;
048
049 static final int EXTERNAL = 0x08;
050
051 static final int ENUMERATED = 0x0a;
052
053 static final int SEQUENCE = 0x10;
054
055 static final int SET = 0x11;
056
057 static final int NUMERIC_STRING = 0x12;
058
059 static final int PRINTABLE_STRING = 0x13;
060
061 static final int T61_STRING = 0x14;
062
063 static final int VIDEOTEX_STRING = 0x15;
064
065 static final int IA5_STRING = 0x16;
066
067 static final int UTC_TIME = 0x17;
068
069 static final int GENERALIZED_TIME = 0x18;
070
071 static final int GRAPHIC_STRING = 0x19;
072
073 static final int VISIBLE_STRING = 0x1a;
074
075 static final int GENERAL_STRING = 0x1b;
076
077 static final int UNIVERSAL_STRING = 0x1c;
078
079 static final int BMP_STRING = 0x1e;
080
081 static final int UTF8_STRING = 0x0c;
082
083 static final int CONSTRUCTED = 0x20;
084
085 static final int APPLICATION = 0x40;
086
087 static final int TAGGED = 0x80;
088
089 protected int tag;
090
091 protected byte[] value;
092
093
094 /**
095 * Basic DERObject constructor.
096 */
097 protected DERObject(int tag, byte[] value)
098 {
099 this.tag = tag;
100 this.value = value;
101 }
102
103
104 public void encode( ASN1OutputStream out ) throws IOException
105 {
106 out.writeEncoded( tag, value );
107 }
108
109
110 byte[] getOctets()
111 {
112 return value;
113 }
114
115
116 /**
117 * Fast rotate left and XOR hashcode generator.
118 *
119 * @return a hash code for the byte array backing this object.
120 */
121 public int hashCode()
122 {
123 int hash = 0;
124 int len = value.length;
125
126 for ( int i = 0; i < len; i++ )
127 {
128 // rotate left and xor
129 hash <<= 1;
130 if ( hash < 0 )
131 {
132 hash |= 1;
133 }
134 hash ^= value[i];
135 }
136
137 return hash;
138 }
139
140
141 /**
142 * Two DERObjects are equal if their underlying byte arrays are equal.
143 *
144 * @return true if the two DERObject underlying byte arrays are equal.
145 */
146 public boolean equals( Object o )
147 {
148 if ( this == o )
149 {
150 return true;
151 }
152
153 if ( !( o instanceof DERObject ) )
154 {
155 return false;
156 }
157
158 DERObject that = ( DERObject ) o;
159
160 return Arrays.equals( this.value, that.value );
161 }
162 }