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