package com.limegroup.gnutella.security;
import java.io.IOException;
import java.security.PublicKey;
import org.limewire.security.SignatureVerifier;
import org.limewire.util.Base32;
import org.limewire.util.StringUtils;
/**
* Parses certificate strings of the following format:
* <pre>
* base32(signature)|key version as integer literal|base32(X509 encoded DSA public key)
* </pre>
*/
public class CertificateParserImpl implements CertificateParser {
public Certificate parseCertificate(String contents) throws IOException {
String[] parts = contents.split("\\|");
if (parts.length != 3) {
throw new IOException(parts.length + " invalid data format: " + contents);
}
byte[] signature = Base32.decode(parts[0]);
byte[] signedPayload = extractSignedPayload(contents);
int keyVersion;
try {
keyVersion = Integer.parseInt(parts[1]);
} catch (NumberFormatException nfe) {
throw new IOException("Could not parse key version");
}
PublicKey publicKey = SignatureVerifier.readKey(parts[2], "DSA");
if (publicKey == null) {
throw new IOException("invalid public key");
}
return new CertificateImpl(signature, signedPayload, keyVersion, publicKey, contents);
}
static byte[] extractSignedPayload(String contents) throws IOException {
int pipe = contents.indexOf('|');
if (pipe < 0 || pipe == contents.length() - 1) {
throw new IOException("invalid contents: " + contents);
}
return StringUtils.toUTF8Bytes(contents.substring(pipe + 1));
}
}