package org.torproject.jtor.crypto; import java.io.BufferedReader; import java.io.IOException; import java.io.StringReader; import org.bouncycastle.util.encoders.Base64; import org.bouncycastle.util.encoders.Hex; import org.torproject.jtor.TorException; import org.torproject.jtor.TorParsingException; public class TorSignature { private final static String SIGNATURE_BEGIN = "-----BEGIN SIGNATURE-----"; private final static String ID_SIGNATURE_BEGIN = "-----BEGIN ID SIGNATURE-----"; private final static String SIGNATURE_END = "-----END SIGNATURE-----"; private final static String ID_SIGNATURE_END = "-----END ID SIGNATURE-----"; static public TorSignature createFromPEMBuffer(String buffer) { BufferedReader reader = new BufferedReader(new StringReader(buffer)); final String header = nextLine(reader); if(!(SIGNATURE_BEGIN.equals(header) || ID_SIGNATURE_BEGIN.equals(header))) throw new TorParsingException("Did not find expected signature BEGIN header"); return new TorSignature(Base64.decode(parseBase64Data(reader))); } static private String parseBase64Data(BufferedReader reader) { final StringBuilder base64Data = new StringBuilder(); while(true) { final String line = nextLine(reader); if(SIGNATURE_END.equals(line) || ID_SIGNATURE_END.equals(line)) return base64Data.toString(); base64Data.append(line); } } static String nextLine(BufferedReader reader) { try { final String line = reader.readLine(); if(line == null) throw new TorParsingException("Did not find expected signature END header"); return line; } catch (IOException e) { throw new TorException(e); } } private final byte[] signatureBytes; private TorSignature(byte[] signatureBytes) { this.signatureBytes = signatureBytes; } public byte[] getSignatureBytes() { return signatureBytes; } public boolean verify(TorPublicKey publicKey, TorMessageDigest digest) { return publicKey.verifySignature(this, digest); } public String toString() { return "TorSignature: (" + signatureBytes.length + " bytes) " + new String(Hex.encode(signatureBytes)); } }