/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package java.security; import java.io.Serializable; import java.util.Arrays; import java.util.Vector; import libcore.util.Objects; /** * {@code Identity} represents an identity like a person or a company. * * @deprecated The functionality of this class has been replace by * {@link Principal}, {@link KeyStore} and the {@code * java.security.cert} package. */ @Deprecated public abstract class Identity implements Principal, Serializable { private static final long serialVersionUID = 3609922007826600659L; private String name; private PublicKey publicKey; private String info = "no additional info"; private IdentityScope scope; private Vector<Certificate> certificates; /** * Constructs a new instance of {@code Identity}. */ protected Identity() { } /** * Creates a new instance of {@code Identity} with the specified name. * * @param name * the name of this {@code Identity}. */ public Identity(String name) { this.name = name; } /** * Creates a new instance of {@code Identity} with the specified name and * the scope of this {@code Identity}. * * @param name * the name of this {@code Identity}. * @param scope * the {@code IdentityScope} of this {@code Identity}. * @throws KeyManagementException * if an {@code Identity} with the same name is already present * in the specified scope. */ public Identity(String name, IdentityScope scope) throws KeyManagementException { this(name); if (scope != null) { scope.addIdentity(this); this.scope = scope; } } /** * Adds a {@code Certificate} to this {@code Identity}. * * @param certificate * the {@code Certificate} to be added to this {@code Identity}. * @throws KeyManagementException * if the certificate is not valid. */ public void addCertificate(Certificate certificate) throws KeyManagementException { PublicKey certPK = certificate.getPublicKey(); if (publicKey != null) { if (!checkKeysEqual(publicKey, certPK)) { throw new KeyManagementException("Cert's public key does not match Identity's public key"); } } else { publicKey = certPK; } if (certificates == null) { certificates = new Vector<Certificate>(); } certificates.add(certificate); } private static boolean checkKeysEqual(PublicKey pk1, PublicKey pk2) { // first, they should have the same format // second, their encoded form must be the same // assert(pk1 != null); // assert(pk2 != null); String format1 = pk1.getFormat(); String format2; if ((pk2 == null) || (((format2 = pk2.getFormat()) != null) ^ (format1 != null)) || ((format1 != null) && !format1.equals(format2))) { return false; } return Arrays.equals(pk1.getEncoded(), pk2.getEncoded()); } /** * Removes the specified {@code Certificate} from this {@code Identity}. * * @param certificate * the {@code Certificate} to be removed. * @throws KeyManagementException * if the certificate is not found. */ public void removeCertificate(Certificate certificate) throws KeyManagementException { if (certificates != null) { if (!certificates.contains(certificate)) { throw new KeyManagementException("Certificate not found"); } certificates.removeElement(certificate); } } /** * Returns the certificates for this {@code Identity}. External * modifications of the returned array has no impact on this {@code * Identity}. * * @return the {@code Certificates} for this {@code Identity} */ public Certificate[] certificates() { if (certificates == null) { return new Certificate[0]; } Certificate[] ret = new Certificate[certificates.size()]; certificates.copyInto(ret); return ret; } /** * Compares the specified {@code Identity} with this {@code Identity} for * equality and returns {@code true} if the specified object is equal, * {@code false} otherwise. * <p> * To be equal, two {@code Identity} objects need to have the same name and * the same public keys. * * @param identity * the identity to check for equality. * @return {@code true} if the {@code Identity} objects are equal, {@code * false} otherwise. */ protected boolean identityEquals(Identity identity) { if (!name.equals(identity.name)) { return false; } if (publicKey == null) { return (identity.publicKey == null); } return checkKeysEqual(publicKey, identity.publicKey); } /** * Returns a string containing a concise, human-readable description of the * this {@code Identity}. * * @param detailed * whether or not this method should return detailed information. * @return a printable representation for this {@code Permission}. */ public String toString(boolean detailed) { String s = toString(); if (detailed) { s += " " + info; } return s; } /** * Returns the {@code IdentityScope} of this {@code Identity}. * * @return the {@code IdentityScope} of this {@code Identity}. */ public final IdentityScope getScope() { return scope; } /** * Sets the specified {@code PublicKey} to this {@code Identity}. * * @param key * the {@code PublicKey} to be set. * @throws KeyManagementException * if another {@code Identity} in the same scope as this {@code * Identity} already has the same {@code PublicKey}. */ public void setPublicKey(PublicKey key) throws KeyManagementException { // this check does not always work if ((scope != null) && (key != null)) { Identity i = scope.getIdentity(key); //System.out.println("###DEBUG## Identity: "+i); if ((i != null) && (i != this)) { throw new KeyManagementException("key already used in scope"); } } this.publicKey = key; certificates = null; } /** * Returns the {@code PublicKey} associated with this {@code Identity}. * * @return the {@code PublicKey} associated with this {@code Identity}. */ public PublicKey getPublicKey() { return publicKey; } /** * Sets an information string for this {@code Identity}. * @param info * the information to be set. */ public void setInfo(String info) { this.info = info; } /** * Returns the information string of this {@code Identity}. * * @return the information string of this {@code Identity}. */ public String getInfo() { return info; } /** * Compares the specified object with this {@code Identity} for equality and * returns {@code true} if the specified object is equal, {@code false} * otherwise. {@code Identity} objects are considered equal, if they have * the same name and are in the same scope. * * @param obj * object to be compared for equality with this {@code * Identity}. * @return {@code true} if the specified object is equal to this {@code * Identity}, otherwise {@code false}. */ @Override public final boolean equals(Object obj) { if (this == obj) { return true; } if (!(obj instanceof Identity)) { return false; } Identity i = (Identity) obj; if (Objects.equal(name, i.name) && (Objects.equal(scope, i.scope))) { return true; } return identityEquals(i); } /** * Returns the name of this {@code Identity}. * * @return the name of this {@code Identity}. */ public final String getName() { return name; } /** * Returns the hash code value for this {@code Identity}. Returns the same * hash code for {@code Identity}s that are equal to each other as required * by the general contract of {@link Object#hashCode}. * * @return the hash code value for this {@code Identity}. * @see Object#equals(Object) * @see Identity#equals(Object) */ @Override public int hashCode() { int hash = 0; if (name != null) { hash += name.hashCode(); } if (scope != null) { hash += scope.hashCode(); } return hash; } /** * Returns a string containing a concise, human-readable description of the * this {@code Identity} including its name and its scope. * * @return a printable representation for this {@code Identity}. */ @Override public String toString() { String s = (this.name == null ? "" : this.name); if (scope != null) { s += " [" + scope.getName() + "]"; } return s; } }