1b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampackage org.bouncycastle.jce;
2b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
3b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport java.io.IOException;
4b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport java.security.Principal;
5b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport java.util.Hashtable;
6b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport java.util.Vector;
7b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Encoding;
96e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.asn1.ASN1InputStream;
106e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.asn1.ASN1Sequence;
114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.x500.X500Name;
126e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.asn1.x509.X509Name;
136e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
14c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom/**
15c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom * a general extension of X509Name with a couple of extra methods and
16c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom * constructors.
17c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom * <p>
18c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom * Objects of this type can be created from certificates and CRLs using the
19c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom * PrincipalUtil class.
20c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom * </p>
21c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom * @see org.bouncycastle.jce.PrincipalUtil
225db505e1f6a68c8d5dfdb0fed0b8607dea7bed96Kenny Root * @deprecated use the X500Name class.
23c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom */
24b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampublic class X509Principal
25b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    extends X509Name
26b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    implements Principal
27b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam{
28b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private static ASN1Sequence readSequence(
29b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ASN1InputStream aIn)
30b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        throws IOException
31b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
32b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        try
33b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
34b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            return ASN1Sequence.getInstance(aIn.readObject());
35b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
36b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        catch (IllegalArgumentException e)
37b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
38b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            throw new IOException("not an ASN.1 Sequence: " + e);
39b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
40b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
41b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
42b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
43b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * Constructor from an encoded byte array.
44b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
45b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public X509Principal(
46b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        byte[]  bytes)
47b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        throws IOException
48b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
49b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        super(readSequence(new ASN1InputStream(bytes)));
50b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
51b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
52b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
53b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * Constructor from an X509Name object.
54b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
55b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public X509Principal(
56b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        X509Name  name)
57b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        super((ASN1Sequence)name.toASN1Primitive());
594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     /**
624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     * Constructor from an X509Name object.
634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom     */
644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public X509Principal(
654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        X500Name name)
664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        super((ASN1Sequence)name.toASN1Primitive());
68b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
69b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
70b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
71b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * constructor from a table of attributes.
72b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * <p>
73b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * it's is assumed the table contains OID/String pairs.
74b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
75b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public X509Principal(
76b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        Hashtable  attributes)
77b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
78b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        super(attributes);
79b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
80b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
81b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
82b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * constructor from a table of attributes and a vector giving the
83b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * specific ordering required for encoding or conversion to a string.
84b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * <p>
85b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * it's is assumed the table contains OID/String pairs.
86b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
87b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public X509Principal(
88b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        Vector      ordering,
89b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        Hashtable   attributes)
90b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
91b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        super(ordering, attributes);
92b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
93b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
94b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
95b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * constructor from a vector of attribute values and a vector of OIDs.
96b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
97b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public X509Principal(
98b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        Vector      oids,
99b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        Vector      values)
100b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
101b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        super(oids, values);
102b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
103b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
104b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
105b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * takes an X509 dir name as a string of the format "C=AU,ST=Victoria", or
106b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * some such, converting it into an ordered set of name attributes.
107b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
108b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public X509Principal(
109b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        String  dirName)
110b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
111b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        super(dirName);
112b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
113b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
114b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
115b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * Takes an X509 dir name as a string of the format "C=AU,ST=Victoria", or
116b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * some such, converting it into an ordered set of name attributes. If reverse
117b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * is false the dir name will be encoded in the order of the (name, value) pairs
118b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * presented, otherwise the encoding will start with the last (name, value) pair
119b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * and work back.
120b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
121b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public X509Principal(
122b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        boolean reverse,
123b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        String  dirName)
124b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
125b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        super(reverse, dirName);
126b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
127b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
128b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
129b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * Takes an X509 dir name as a string of the format "C=AU, ST=Victoria", or
130b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * some such, converting it into an ordered set of name attributes. lookUp
131b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * should provide a table of lookups, indexed by lowercase only strings and
132d001700a15b8bd733ae344c1fc315b97c43c6590Kenny Root     * yielding a ASN1ObjectIdentifier, other than that OID. and numeric oids
133b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * will be processed automatically.
134b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * <p>
135b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * If reverse is true, create the encoded version of the sequence starting
136b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * from the last element in the string.
137b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
138b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public X509Principal(
139b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        boolean     reverse,
140b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        Hashtable   lookUp,
141b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        String      dirName)
142b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
143b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        super(reverse, lookUp, dirName);
144b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
145b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
146b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public String getName()
147b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
148b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return this.toString();
149b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
150b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
151b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
152b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * return a DER encoded byte array representing this object
153b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
154b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public byte[] getEncoded()
155b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
156b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        try
157b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
1584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return this.getEncoded(ASN1Encoding.DER);
159b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
160b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        catch (IOException e)
161b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
162b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            throw new RuntimeException(e.toString());
163b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
164b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
165b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam}
166