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.jce;
020
021 import java.io.ByteArrayInputStream;
022 import java.io.ByteArrayOutputStream;
023 import java.io.IOException;
024 import java.security.Principal;
025 import java.util.Hashtable;
026 import java.util.Vector;
027
028 import org.apache.geronimo.util.asn1.ASN1InputStream;
029 import org.apache.geronimo.util.asn1.ASN1Sequence;
030 import org.apache.geronimo.util.asn1.DEROutputStream;
031 import org.apache.geronimo.util.asn1.x509.X509Name;
032
033 public class X509Principal
034 extends X509Name
035 implements Principal
036 {
037 /**
038 * Constructor from an encoded byte array.
039 */
040 public X509Principal(
041 byte[] bytes)
042 throws IOException
043 {
044 super((ASN1Sequence)(new ASN1InputStream(new ByteArrayInputStream(bytes)).readObject()));
045 }
046
047 /**
048 * Constructor from an X509Name object.
049 */
050 public X509Principal(
051 X509Name name)
052 {
053 super((ASN1Sequence)name.getDERObject());
054 }
055
056 /**
057 * constructor from a table of attributes.
058 * <p>
059 * it's is assumed the table contains OID/String pairs.
060 */
061 public X509Principal(
062 Hashtable attributes)
063 {
064 super(attributes);
065 }
066
067 /**
068 * constructor from a table of attributes and a vector giving the
069 * specific ordering required for encoding or conversion to a string.
070 * <p>
071 * it's is assumed the table contains OID/String pairs.
072 */
073 public X509Principal(
074 Vector ordering,
075 Hashtable attributes)
076 {
077 super(ordering, attributes);
078 }
079
080 /**
081 * constructor from a vector of attribute values and a vector of OIDs.
082 */
083 public X509Principal(
084 Vector oids,
085 Vector values)
086 {
087 super(oids, values);
088 }
089
090 /**
091 * takes an X509 dir name as a string of the format "C=AU,ST=Victoria", or
092 * some such, converting it into an ordered set of name attributes.
093 */
094 public X509Principal(
095 String dirName)
096 {
097 super(dirName);
098 }
099
100 /**
101 * Takes an X509 dir name as a string of the format "C=AU,ST=Victoria", or
102 * some such, converting it into an ordered set of name attributes. If reverse
103 * is false the dir name will be encoded in the order of the (name, value) pairs
104 * presented, otherwise the encoding will start with the last (name, value) pair
105 * and work back.
106 */
107 public X509Principal(
108 boolean reverse,
109 String dirName)
110 {
111 super(reverse, dirName);
112 }
113
114 /**
115 * Takes an X509 dir name as a string of the format "C=AU, ST=Victoria", or
116 * some such, converting it into an ordered set of name attributes. lookUp
117 * should provide a table of lookups, indexed by lowercase only strings and
118 * yielding a DERObjectIdentifier, other than that OID. and numeric oids
119 * will be processed automatically.
120 * <p>
121 * If reverse is true, create the encoded version of the sequence starting
122 * from the last element in the string.
123 */
124 public X509Principal(
125 boolean reverse,
126 Hashtable lookUp,
127 String dirName)
128 {
129 super(reverse, lookUp, dirName);
130 }
131
132 public String getName()
133 {
134 return this.toString();
135 }
136
137 /**
138 * return a DER encoded byte array representing this object
139 */
140 public byte[] getEncoded()
141 {
142 ByteArrayOutputStream bOut = new ByteArrayOutputStream();
143 DEROutputStream dOut = new DEROutputStream(bOut);
144
145 try
146 {
147 dOut.writeObject(this);
148 }
149 catch (IOException e)
150 {
151 throw new RuntimeException(e.toString());
152 }
153
154 return bOut.toByteArray();
155 }
156 }