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