package io.airlift.airship.coordinator.auth;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import org.apache.commons.codec.binary.Base64;
import java.util.Iterator;
import java.util.NoSuchElementException;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.apache.commons.codec.digest.DigestUtils.md5;
public abstract class PublicKey
{
private final String encodedKey;
private final String comment;
protected final byte[] key;
protected PublicKey(String encodedKey, String comment)
{
this.encodedKey = checkNotNull(encodedKey, "encodedKey is null");
this.comment = checkNotNull(comment, "comment is null");
this.key = Base64.decodeBase64(encodedKey);
}
public abstract String getType();
public abstract boolean verifySignature(byte[] signature, byte[] message);
public Fingerprint getFingerprint()
{
return new Fingerprint(md5(key));
}
@Override
public String toString()
{
return Joiner.on(' ').join(getType(), encodedKey, comment);
}
public static PublicKey valueOf(String key)
{
Iterator<String> iter = Splitter.on(' ').limit(3).split(key).iterator();
try {
String type = iter.next();
String encodedKey = iter.next();
String comment = iter.hasNext() ? iter.next() : "";
if (type.equals("ssh-rsa")) {
return new RsaPublicKey(encodedKey, comment);
}
if (type.equals("ssh-dss")) {
return new DsaPublicKey(encodedKey, comment);
}
throw new IllegalArgumentException("invalid public key type: " + type);
}
catch (NoSuchElementException e) {
throw new IllegalArgumentException("invalid public key");
}
}
}