/* This code is part of Freenet. It is distributed under the GNU General
* Public License, version 2 (or at your option any later version). See
* http://www.gnu.org/ for further details of the GPL. */
package freenet.crypt;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.lang.reflect.Method;
import java.math.BigInteger;
import freenet.support.HexUtil;
public abstract class CryptoKey implements CryptoElement, Serializable {
protected static final Digest shactx = SHA1.getInstance();
CryptoKey() {
}
public static CryptoKey read(InputStream i) throws IOException, CryptFormatException {
DataInputStream dis = new DataInputStream(i);
String type = dis.readUTF();
try {
Class keyClass = Class.forName(type);
Method m =
keyClass.getMethod("read", new Class[] { InputStream.class });
return (CryptoKey) m.invoke(null, new Object[] { dis });
} catch (Exception e) {
e.printStackTrace();
if (e instanceof CryptFormatException)
throw (CryptFormatException) e;
if (e instanceof IOException)
throw (IOException) e;
return null;
}
}
// public abstract void write(OutputStream o) throws IOException;
public abstract String keyType();
public abstract byte[] fingerprint();
public abstract byte[] asBytes();
protected byte[] fingerprint(BigInteger[] quantities) {
synchronized (shactx) {
for (int i = 0; i < quantities.length; i++) {
byte[] mpi = Util.MPIbytes(quantities[i]);
shactx.update(mpi, 0, mpi.length);
}
return shactx.digest();
}
}
public String verboseToString() {
StringBuffer b = new StringBuffer();
b.append(toString()).append('\t').append(fingerprintToString());
return b.toString();
}
public String toString() {
StringBuffer b = new StringBuffer(keyType().length() + 1 + 4);
b.append(keyType()).append('/');
HexUtil.bytesToHexAppend(fingerprint(), 16, 4, b);
return b.toString();
}
// protected void write(OutputStream o, String clazz) throws IOException {
// UTF8.writeWithLength(o, clazz);
// }
//
public String fingerprintToString() {
String fphex = HexUtil.bytesToHex(fingerprint());
StringBuffer b = new StringBuffer(40 + 10);
b
.append(fphex.substring(0, 4))
.append(' ')
.append(fphex.substring(4, 8))
.append(' ')
.append(fphex.substring(8, 12))
.append(' ')
.append(fphex.substring(12, 16))
.append(' ')
.append(fphex.substring(16, 20))
.append(" ")
.append(fphex.substring(20, 24))
.append(' ')
.append(fphex.substring(24, 28))
.append(' ')
.append(fphex.substring(28, 32))
.append(' ')
.append(fphex.substring(32, 36))
.append(' ')
.append(fphex.substring(36, 40));
return b.toString();
}
public static void main(String[] args) throws Exception {
for (;;) {
CryptoKey kp = CryptoKey.read(System.in);
System.err.println("-+ " + kp.verboseToString());
}
}
}