1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.security;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.Serializable;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Arrays;
227365de1056414750d0a7d1fdd26025fd247f0d04Jesse Wilsonimport java.util.Vector;
236186821cb13f4ac7ff50950c813394367e021eaeJesse Wilsonimport libcore.util.Objects;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Identity} represents an identity like a person or a company.
272f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes *
2899b4489d0555c6e0e5df941cbfad4cf250c8f0b8Elliott Hughes * @deprecated Use {@link Principal}, {@link KeyStore} and the {@code java.security.cert} package
2999b4489d0555c6e0e5df941cbfad4cf250c8f0b8Elliott Hughes * instead.
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project@Deprecated
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class Identity implements Principal, Serializable {
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final long serialVersionUID = 3609922007826600659L;
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private String name;
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private PublicKey publicKey;
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
39f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    private String info = "no additional info";
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private IdentityScope scope;
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private Vector<Certificate> certificates;
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new instance of {@code Identity}.
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected Identity() {
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new instance of {@code Identity} with the specified name.
532f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of this {@code Identity}.
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Identity(String name) {
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.name = name;
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new instance of {@code Identity} with the specified name and
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the scope of this {@code Identity}.
642f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of this {@code Identity}.
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param scope
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code IdentityScope} of this {@code Identity}.
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws KeyManagementException
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an {@code Identity} with the same name is already present
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             in the specified scope.
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Identity(String name, IdentityScope scope)
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws KeyManagementException {
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(name);
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (scope != null) {
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            scope.addIdentity(this);
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            this.scope = scope;
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Adds a {@code Certificate} to this {@code Identity}.
842f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param certificate
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code Certificate} to be added to this {@code Identity}.
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws KeyManagementException
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the certificate is not valid.
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
90ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes    public void addCertificate(Certificate certificate) throws KeyManagementException {
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        PublicKey certPK = certificate.getPublicKey();
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (publicKey != null) {
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (!checkKeysEqual(publicKey, certPK)) {
94897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes                throw new KeyManagementException("Cert's public key does not match Identity's public key");
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            publicKey = certPK;
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (certificates == null) {
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            certificates = new Vector<Certificate>();
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        certificates.add(certificate);
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
106f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static boolean checkKeysEqual(PublicKey pk1, PublicKey pk2) {
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // first, they should have the same format
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // second, their encoded form must be the same
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // assert(pk1 != null);
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // assert(pk2 != null);
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String format1 = pk1.getFormat();
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String format2;
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if ((pk2 == null)
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                || (((format2 = pk2.getFormat()) != null) ^ (format1 != null))
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                || ((format1 != null) && !format1.equals(format2))) {
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return Arrays.equals(pk1.getEncoded(), pk2.getEncoded());
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
127f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Removes the specified {@code Certificate} from this {@code Identity}.
1312f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param certificate
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code Certificate} to be removed.
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws KeyManagementException
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the certificate is not found.
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
137ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes    public void removeCertificate(Certificate certificate) throws KeyManagementException {
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (certificates != null) {
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (!certificates.contains(certificate)) {
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new KeyManagementException("Certificate not found");
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            certificates.removeElement(certificate);
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
147f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the certificates for this {@code Identity}. External
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * modifications of the returned array has no impact on this {@code
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Identity}.
1532f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code Certificates} for this {@code Identity}
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Certificate[] certificates() {
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (certificates == null) {
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return new Certificate[0];
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Certificate[] ret = new Certificate[certificates.size()];
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        certificates.copyInto(ret);
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return ret;
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
166f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares the specified {@code Identity} with this {@code Identity} for
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * equality and returns {@code true} if the specified object is equal,
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code false} otherwise.
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * To be equal, two {@code Identity} objects need to have the same name and
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the same public keys.
1752f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param identity
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the identity to check for equality.
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the {@code Identity} objects are equal, {@code
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         false} otherwise.
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected boolean identityEquals(Identity identity) {
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!name.equals(identity.name)) {
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (publicKey == null) {
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return (identity.publicKey == null);
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return checkKeysEqual(publicKey, identity.publicKey);
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
194f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a string containing a concise, human-readable description of the
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * this {@code Identity}.
1992f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param detailed
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            whether or not this method should return detailed information.
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a printable representation for this {@code Permission}.
2032f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     */
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toString(boolean detailed) {
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String s = toString();
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (detailed) {
207f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            s += " " + info;
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return s;
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
213f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code IdentityScope} of this {@code Identity}.
2172f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code IdentityScope} of this {@code Identity}.
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final IdentityScope getScope() {
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return scope;
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
225f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the specified {@code PublicKey} to this {@code Identity}.
2292f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param key
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code PublicKey} to be set.
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws KeyManagementException
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if another {@code Identity} in the same scope as this {@code
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             Identity} already has the same {@code PublicKey}.
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setPublicKey(PublicKey key) throws KeyManagementException {
237f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        // this check does not always work
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if ((scope != null) && (key != null)) {
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Identity i = scope.getIdentity(key);
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //System.out.println("###DEBUG## Identity: "+i);
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if ((i != null) && (i != this)) {
242897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes                throw new KeyManagementException("key already used in scope");
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.publicKey = key;
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        certificates = null;
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
250f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code PublicKey} associated with this {@code Identity}.
2542f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code PublicKey} associated with this {@code Identity}.
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public PublicKey getPublicKey() {
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return publicKey;
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
262f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets an information string for this {@code Identity}.
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param info
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the information to be set.
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setInfo(String info) {
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.info = info;
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the information string of this {@code Identity}.
2752f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the information string of this {@code Identity}.
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getInfo() {
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return info;
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares the specified object with this {@code Identity} for equality and
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * returns {@code true} if the specified object is equal, {@code false}
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * otherwise. {@code Identity} objects are considered equal, if they have
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the same name and are in the same scope.
2872f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            object to be compared for equality with this {@code
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            Identity}.
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the specified object is equal to this {@code
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         Identity}, otherwise {@code false}.
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2942f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes    @Override
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final boolean equals(Object obj) {
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (this == obj) {
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!(obj instanceof Identity)) {
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Identity i = (Identity) obj;
303e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson        if (Objects.equal(name, i.name) && (Objects.equal(scope, i.scope))) {
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return identityEquals(i);
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the name of this {@code Identity}.
3112f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the name of this {@code Identity}.
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final String getName() {
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return name;
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the hash code value for this {@code Identity}. Returns the same
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * hash code for {@code Identity}s that are equal to each other as required
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * by the general contract of {@link Object#hashCode}.
3222f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the hash code value for this {@code Identity}.
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see Object#equals(Object)
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see Identity#equals(Object)
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
3272f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes    @Override
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int hashCode() {
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int hash = 0;
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (name != null) {
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            hash += name.hashCode();
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (scope != null) {
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            hash += scope.hashCode();
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return hash;
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a string containing a concise, human-readable description of the
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * this {@code Identity} including its name and its scope.
3422f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a printable representation for this {@code Identity}.
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
3452f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes    @Override
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toString() {
3472f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes        String s = (this.name == null ? "" : this.name);
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (scope != null) {
3492f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes            s += " [" + scope.getName() + "]";
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return s;
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
354