001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 018 package org.apache.geronimo.util.asn1; 019 020 import java.io.ByteArrayOutputStream; 021 import java.io.IOException; 022 import java.util.Enumeration; 023 import java.util.Vector; 024 025 public abstract class ASN1OctetString 026 extends DERObject 027 { 028 byte[] string; 029 030 /** 031 * return an Octet String from a tagged object. 032 * 033 * @param obj the tagged object holding the object we want. 034 * @param explicit true if the object is meant to be explicitly 035 * tagged false otherwise. 036 * @exception IllegalArgumentException if the tagged object cannot 037 * be converted. 038 */ 039 public static ASN1OctetString getInstance( 040 ASN1TaggedObject obj, 041 boolean explicit) 042 { 043 return getInstance(obj.getObject()); 044 } 045 046 /** 047 * return an Octet String from the given object. 048 * 049 * @param obj the object we want converted. 050 * @exception IllegalArgumentException if the object cannot be converted. 051 */ 052 public static ASN1OctetString getInstance( 053 Object obj) 054 { 055 if (obj == null || obj instanceof ASN1OctetString) 056 { 057 return (ASN1OctetString)obj; 058 } 059 060 if (obj instanceof ASN1TaggedObject) 061 { 062 return getInstance(((ASN1TaggedObject)obj).getObject()); 063 } 064 065 if (obj instanceof ASN1Sequence) 066 { 067 Vector v = new Vector(); 068 Enumeration e = ((ASN1Sequence)obj).getObjects(); 069 070 while (e.hasMoreElements()) 071 { 072 v.addElement(e.nextElement()); 073 } 074 075 return new BERConstructedOctetString(v); 076 } 077 078 throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); 079 } 080 081 /** 082 * @param string the octets making up the octet string. 083 */ 084 public ASN1OctetString( 085 byte[] string) 086 { 087 this.string = string; 088 } 089 090 public ASN1OctetString( 091 DEREncodable obj) 092 { 093 try 094 { 095 ByteArrayOutputStream bOut = new ByteArrayOutputStream(); 096 DEROutputStream dOut = new DEROutputStream(bOut); 097 098 dOut.writeObject(obj); 099 dOut.close(); 100 101 this.string = bOut.toByteArray(); 102 } 103 catch (IOException e) 104 { 105 throw new IllegalArgumentException("Error processing object : " + e.getMessage(), e); 106 } 107 } 108 109 public byte[] getOctets() 110 { 111 return string; 112 } 113 114 public int hashCode() 115 { 116 byte[] b = this.getOctets(); 117 int value = 0; 118 119 for (int i = 0; i != b.length; i++) 120 { 121 value ^= (b[i] & 0xff) << (i % 4); 122 } 123 124 return value; 125 } 126 127 public boolean equals( 128 Object o) 129 { 130 if (o == null || !(o instanceof DEROctetString)) 131 { 132 return false; 133 } 134 135 DEROctetString other = (DEROctetString)o; 136 137 byte[] b1 = other.getOctets(); 138 byte[] b2 = this.getOctets(); 139 140 if (b1.length != b2.length) 141 { 142 return false; 143 } 144 145 for (int i = 0; i != b1.length; i++) 146 { 147 if (b1[i] != b2[i]) 148 { 149 return false; 150 } 151 } 152 153 return true; 154 } 155 156 abstract void encode(DEROutputStream out) 157 throws IOException; 158 }