001 /**
002 *
003 * Licensed to the Apache Software Foundation (ASF) under one or more
004 * contributor license agreements. See the NOTICE file distributed with
005 * this work for additional information regarding copyright ownership.
006 * The ASF licenses this file to You under the Apache License, Version 2.0
007 * (the "License"); you may not use this file except in compliance with
008 * the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018
019 package org.apache.geronimo.util.asn1;
020
021 import java.io.ByteArrayInputStream;
022 import java.io.ByteArrayOutputStream;
023 import java.io.IOException;
024
025 /**
026 * Base class for an application specific object
027 */
028 public class DERApplicationSpecific
029 extends DERObject
030 {
031 private int tag;
032 private byte[] octets;
033
034 public DERApplicationSpecific(
035 int tag,
036 byte[] octets)
037 {
038 this.tag = tag;
039 this.octets = octets;
040 }
041
042 public DERApplicationSpecific(
043 int tag,
044 DEREncodable object)
045 throws IOException
046 {
047 this.tag = tag | DERTags.CONSTRUCTED;
048
049 ByteArrayOutputStream baos = new ByteArrayOutputStream();
050 DEROutputStream dos = new DEROutputStream(baos);
051
052 dos.writeObject(object);
053
054 this.octets = baos.toByteArray();
055 }
056
057 public boolean isConstructed()
058 {
059 return (tag & DERTags.CONSTRUCTED) != 0;
060 }
061
062 public byte[] getContents()
063 {
064 return octets;
065 }
066
067 public int getApplicationTag()
068 {
069 return tag & 0x1F;
070 }
071
072 public DERObject getObject()
073 throws IOException
074 {
075 return new ASN1InputStream(new ByteArrayInputStream(getContents())).readObject();
076 }
077
078 /* (non-Javadoc)
079 * @see org.apache.geronimo.util.asn1.DERObject#encode(org.apache.geronimo.util.asn1.DEROutputStream)
080 */
081 void encode(DEROutputStream out) throws IOException
082 {
083 out.writeEncoded(DERTags.APPLICATION | tag, octets);
084 }
085
086 public boolean equals(
087 Object o)
088 {
089 if ((o == null) || !(o instanceof DERApplicationSpecific))
090 {
091 return false;
092 }
093
094 DERApplicationSpecific other = (DERApplicationSpecific)o;
095
096 if (tag != other.tag)
097 {
098 return false;
099 }
100
101 if (octets.length != other.octets.length)
102 {
103 return false;
104 }
105
106 for (int i = 0; i < octets.length; i++)
107 {
108 if (octets[i] != other.octets[i])
109 {
110 return false;
111 }
112 }
113
114 return true;
115 }
116
117 public int hashCode()
118 {
119 byte[] b = this.getContents();
120 int value = 0;
121
122 for (int i = 0; i != b.length; i++)
123 {
124 value ^= (b[i] & 0xff) << (i % 4);
125 }
126
127 return value ^ this.getApplicationTag();
128 }
129 }