/*
* 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 org.apache.harmony.javax.security.auth.kerberos;
import javax.crypto.SecretKey;
import javax.security.auth.DestroyFailedException;
import javax.security.auth.Destroyable;
import org.apache.harmony.auth.internal.nls.Messages;
/**
* See <a href="http://www.ietf.org/rfc/rfc3961.txt">RFC3961</a>
*/
public class KerberosKey implements SecretKey, Destroyable {
private static final long serialVersionUID = -4625402278148246993L;
// principal
private KerberosPrincipal principal;
// key version number
private int versionNum;
// raw bytes for the secret key
private final KeyImpl key;
// indicates the ticket state
private transient boolean destroyed;
public KerberosKey(KerberosPrincipal principal, byte[] keyBytes,
int keyType, int versionNumber) {
if (keyBytes == null) {
throw new NullPointerException(Messages.getString("auth.47")); //$NON-NLS-1$
}
this.principal = principal;
versionNum = versionNumber;
key = new KeyImpl(keyBytes, keyType);
}
public KerberosKey(KerberosPrincipal principal, char[] password,
String algorithm) {
this.principal = principal;
key = new KeyImpl(principal, password, algorithm);
}
// if a key is destroyed then IllegalStateException must be thrown
private void checkState() {
if (destroyed) {
throw new IllegalStateException(Messages.getString("auth.48")); //$NON-NLS-1$
}
}
@Override
public void destroy() throws DestroyFailedException {
if (!destroyed) {
principal = null;
key.destroy();
destroyed = true;
}
}
@Override
public boolean equals(Object other) {
if ((other instanceof KerberosKey) && (!isDestroyed())) {
final KerberosKey that = (KerberosKey) other;
if ((!that.isDestroyed()) && (versionNum == that.versionNum)) {
if (key.equals(((KerberosKey) other).key)) {
if (principal != null) {
return principal.equals(that.principal);
} else {
return that.principal == null;
}
}
}
}
return false;
}
@Override
public final String getAlgorithm() {
return key.getAlgorithm();
}
@Override
public final byte[] getEncoded() {
return key.getEncoded();
}
@Override
public final String getFormat() {
return key.getFormat();
}
public final int getKeyType() {
return key.getKeyType();
}
public final KerberosPrincipal getPrincipal() {
checkState();
return principal;
}
public final int getVersionNumber() {
checkState();
return versionNum;
}
@Override
public int hashCode() {
int hashcode = 0;
if (principal != null) {
hashcode += principal.hashCode();
}
hashcode += versionNum;
hashcode += key.hashCode();
return hashcode;
}
@Override
public boolean isDestroyed() {
return destroyed;
}
@Override
public String toString() {
checkState();
final StringBuilder sb = new StringBuilder();
sb.append("KerberosPrincipal ").append(principal.getName()).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
sb.append("KeyVersion ").append(versionNum).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
sb.append(key.toString());
return sb.toString();
}
}