app/src/main/java/net/java/otr4j/io/SerializationUtils.java
changeset 1047 9b965359eaea
parent 1046 6ca974ea549b
child 1048 cd41ebc93e78
--- a/app/src/main/java/net/java/otr4j/io/SerializationUtils.java	Sun Mar 15 18:57:24 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,341 +0,0 @@
-/*
- * otr4j, the open source java otr library.
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package net.java.otr4j.io;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.math.BigInteger;
-import java.security.PublicKey;
-import java.util.List;
-import java.util.Vector;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.crypto.interfaces.DHPublicKey;
-
-import org.bouncycastle2.util.encoders.Base64;
-
-import net.java.otr4j.io.messages.AbstractEncodedMessage;
-import net.java.otr4j.io.messages.AbstractMessage;
-import net.java.otr4j.io.messages.DHCommitMessage;
-import net.java.otr4j.io.messages.DHKeyMessage;
-import net.java.otr4j.io.messages.DataMessage;
-import net.java.otr4j.io.messages.ErrorMessage;
-import net.java.otr4j.io.messages.MysteriousT;
-import net.java.otr4j.io.messages.PlainTextMessage;
-import net.java.otr4j.io.messages.QueryMessage;
-import net.java.otr4j.io.messages.RevealSignatureMessage;
-import net.java.otr4j.io.messages.SignatureM;
-import net.java.otr4j.io.messages.SignatureMessage;
-import net.java.otr4j.io.messages.SignatureX;
-
-/**
- * 
- * @author George Politis
- */
-public class SerializationUtils {
-	// Mysterious X IO.
-	public static SignatureX toMysteriousX(byte[] b) throws IOException {
-		ByteArrayInputStream in = new ByteArrayInputStream(b);
-		OtrInputStream ois = new OtrInputStream(in);
-		SignatureX x = ois.readMysteriousX();
-		ois.close();
-		return x;
-	}
-
-	public static byte[] toByteArray(SignatureX x) throws IOException {
-		ByteArrayOutputStream out = new ByteArrayOutputStream();
-		OtrOutputStream oos = new OtrOutputStream(out);
-		oos.writeMysteriousX(x);
-		byte[] b = out.toByteArray();
-		oos.close();
-		return b;
-	}
-
-	// Mysterious M IO.
-	public static byte[] toByteArray(SignatureM m) throws IOException {
-		ByteArrayOutputStream out = new ByteArrayOutputStream();
-		OtrOutputStream oos = new OtrOutputStream(out);
-		oos.writeMysteriousX(m);
-		byte[] b = out.toByteArray();
-		oos.close();
-		return b;
-	}
-
-	// Mysterious T IO.
-	public static byte[] toByteArray(MysteriousT t) throws IOException {
-		ByteArrayOutputStream out = new ByteArrayOutputStream();
-		OtrOutputStream oos = new OtrOutputStream(out);
-		oos.writeMysteriousT(t);
-		byte[] b = out.toByteArray();
-		oos.close();
-		return b;
-	}
-
-	// Basic IO.
-	public static byte[] writeData(byte[] b) throws IOException {
-		ByteArrayOutputStream out = new ByteArrayOutputStream();
-		OtrOutputStream oos = new OtrOutputStream(out);
-		oos.writeData(b);
-		byte[] otrb = out.toByteArray();
-		oos.close();
-		return otrb;
-	}
-
-	// BigInteger IO.
-	public static byte[] writeMpi(BigInteger bigInt) throws IOException {
-		ByteArrayOutputStream out = new ByteArrayOutputStream();
-		OtrOutputStream oos = new OtrOutputStream(out);
-		oos.writeBigInt(bigInt);
-		byte[] b = out.toByteArray();
-		oos.close();
-		return b;
-	}
-
-	public static BigInteger readMpi(byte[] b) throws IOException {
-		ByteArrayInputStream in = new ByteArrayInputStream(b);
-		OtrInputStream ois = new OtrInputStream(in);
-		BigInteger bigint = ois.readBigInt();
-		ois.close();
-		return bigint;
-	}
-
-	// Public Key IO.
-	public static byte[] writePublicKey(PublicKey pubKey) throws IOException {
-		ByteArrayOutputStream out = new ByteArrayOutputStream();
-		OtrOutputStream oos = new OtrOutputStream(out);
-		oos.writePublicKey(pubKey);
-		byte[] b = out.toByteArray();
-		oos.close();
-		return b;
-	}
-
-	// Message IO.
-	public static String toString(AbstractMessage m) throws IOException {
-		StringWriter writer = new StringWriter();
-		writer.write(SerializationConstants.HEAD);
-
-		switch (m.messageType) {
-		case AbstractMessage.MESSAGE_ERROR:
-			ErrorMessage error = (ErrorMessage) m;
-			writer.write(SerializationConstants.HEAD_ERROR);
-			writer.write(error.error);
-			break;
-		case AbstractMessage.MESSAGE_PLAINTEXT:
-			PlainTextMessage plaintxt = (PlainTextMessage) m;
-			writer.write(plaintxt.cleanText);
-			if (plaintxt.versions != null && plaintxt.versions.size() > 0) {
-				writer.write(" \\t  \\t\\t\\t\\t \\t \\t \\t  ");
-				for (int version : plaintxt.versions) {
-					if (version == 1)
-						writer.write("  \\t\\t  \\t ");
-
-					if (version == 2)
-						writer.write(" \\t \\t  \\t ");
-				}
-			}
-			break;
-		case AbstractMessage.MESSAGE_QUERY:
-			QueryMessage query = (QueryMessage) m;
-			if (query.versions.size() == 1 && query.versions.get(0) == 1) {
-				writer.write(SerializationConstants.HEAD_QUERY_Q);
-			} else {
-				writer.write(SerializationConstants.HEAD_QUERY_V);
-				for (int version : query.versions)
-					writer.write(String.valueOf(version));
-
-				writer.write(SerializationConstants.HEAD_QUERY_Q);
-			}
-			break;
-		case AbstractEncodedMessage.MESSAGE_DHKEY:
-		case AbstractEncodedMessage.MESSAGE_REVEALSIG:
-		case AbstractEncodedMessage.MESSAGE_SIGNATURE:
-		case AbstractEncodedMessage.MESSAGE_DH_COMMIT:
-		case AbstractEncodedMessage.MESSAGE_DATA:
-			ByteArrayOutputStream o = new ByteArrayOutputStream();
-			OtrOutputStream s = new OtrOutputStream(o);
-
-			switch (m.messageType) {
-			case AbstractEncodedMessage.MESSAGE_DHKEY:
-				DHKeyMessage dhkey = (DHKeyMessage) m;
-				s.writeShort(dhkey.protocolVersion);
-				s.writeByte(dhkey.messageType);
-				s.writeDHPublicKey(dhkey.dhPublicKey);
-				break;
-			case AbstractEncodedMessage.MESSAGE_REVEALSIG:
-				RevealSignatureMessage revealsig = (RevealSignatureMessage) m;
-				s.writeShort(revealsig.protocolVersion);
-				s.writeByte(revealsig.messageType);
-				s.writeData(revealsig.revealedKey);
-				s.writeData(revealsig.xEncrypted);
-				s.writeMac(revealsig.xEncryptedMAC);
-				break;
-			case AbstractEncodedMessage.MESSAGE_SIGNATURE:
-				SignatureMessage sig = (SignatureMessage) m;
-				s.writeShort(sig.protocolVersion);
-				s.writeByte(sig.messageType);
-				s.writeData(sig.xEncrypted);
-				s.writeMac(sig.xEncryptedMAC);
-				break;
-			case AbstractEncodedMessage.MESSAGE_DH_COMMIT:
-				DHCommitMessage dhcommit = (DHCommitMessage) m;
-				s.writeShort(dhcommit.protocolVersion);
-				s.writeByte(dhcommit.messageType);
-				s.writeData(dhcommit.dhPublicKeyEncrypted);
-				s.writeData(dhcommit.dhPublicKeyHash);
-				break;
-			case AbstractEncodedMessage.MESSAGE_DATA:
-				DataMessage data = (DataMessage) m;
-				s.writeShort(data.protocolVersion);
-				s.writeByte(data.messageType);
-				s.writeByte(data.flags);
-				s.writeInt(data.senderKeyID);
-				s.writeInt(data.recipientKeyID);
-				s.writeDHPublicKey(data.nextDH);
-				s.writeCtr(data.ctr);
-				s.writeData(data.encryptedMessage);
-				s.writeMac(data.mac);
-				s.writeData(data.oldMACKeys);
-				break;
-			}
-
-			writer.write(SerializationConstants.HEAD_ENCODED);
-			writer.write(new String(Base64.encode(o.toByteArray())));
-			writer.write(".");
-			break;
-		default:
-			throw new IOException("Illegal message type.");
-		}
-
-		return writer.toString();
-	}
-
-	static final Pattern patternWhitespace = Pattern
-			.compile("( \\t  \\t\\t\\t\\t \\t \\t \\t  )(  \\t\\t  \\t )?( \\t \\t  \\t )?");
-
-	public static AbstractMessage toMessage(String s) throws IOException {
-		if (s == null || s.length() <= 1)
-			return null;
-
-		if (s.indexOf(SerializationConstants.HEAD) != 0
-				|| s.length() <= SerializationConstants.HEAD.length()) {
-			// Try to detect whitespace tag.
-			final Matcher matcher = patternWhitespace.matcher(s);
-
-			boolean v1 = false;
-			boolean v2 = false;
-			while (matcher.find()) {
-				if (!v1 && matcher.start(2) > -1)
-					v1 = true;
-
-				if (!v2 && matcher.start(3) > -1)
-					v2 = true;
-
-				if (v1 && v2)
-					break;
-			}
-
-			String cleanText = matcher.replaceAll("");
-			List<Integer> versions;
-			if (v1 && v2) {
-				versions = new Vector<Integer>(2);
-				versions.add(0, 1);
-				versions.add(0, 2);
-			} else if (v1) {
-				versions = new Vector<Integer>(1);
-				versions.add(0, 1);
-			} else if (v2) {
-				versions = new Vector<Integer>(1);
-				versions.add(2);
-			} else
-				versions = null;
-
-			return new PlainTextMessage(versions, cleanText);
-		} else {
-			char contentType = s.charAt(SerializationConstants.HEAD.length());
-			String content = s
-					.substring(SerializationConstants.HEAD.length() + 1);
-			switch (contentType) {
-			case SerializationConstants.HEAD_ENCODED:
-				ByteArrayInputStream bin = new ByteArrayInputStream(Base64
-						.decode(content.getBytes()));
-				OtrInputStream otr = new OtrInputStream(bin);
-				// We have an encoded message.
-				int protocolVersion = otr.readShort();
-				int messageType = otr.readByte();
-				switch (messageType) {
-				case AbstractEncodedMessage.MESSAGE_DATA:
-					int flags = otr.readByte();
-					int senderKeyID = otr.readInt();
-					int recipientKeyID = otr.readInt();
-					DHPublicKey nextDH = otr.readDHPublicKey();
-					byte[] ctr = otr.readCtr();
-					byte[] encryptedMessage = otr.readData();
-					byte[] mac = otr.readMac();
-					byte[] oldMacKeys = otr.readMac();
-					return new DataMessage(protocolVersion, flags, senderKeyID,
-							recipientKeyID, nextDH, ctr, encryptedMessage, mac,
-							oldMacKeys);
-				case AbstractEncodedMessage.MESSAGE_DH_COMMIT:
-					byte[] dhPublicKeyEncrypted = otr.readData();
-					byte[] dhPublicKeyHash = otr.readData();
-					return new DHCommitMessage(protocolVersion,
-							dhPublicKeyHash, dhPublicKeyEncrypted);
-				case AbstractEncodedMessage.MESSAGE_DHKEY:
-					DHPublicKey dhPublicKey = otr.readDHPublicKey();
-					return new DHKeyMessage(protocolVersion, dhPublicKey);
-				case AbstractEncodedMessage.MESSAGE_REVEALSIG: {
-					byte[] revealedKey = otr.readData();
-					byte[] xEncrypted = otr.readData();
-					byte[] xEncryptedMac = otr.readMac();
-					return new RevealSignatureMessage(protocolVersion,
-							xEncrypted, xEncryptedMac, revealedKey);
-				}
-				case AbstractEncodedMessage.MESSAGE_SIGNATURE: {
-					byte[] xEncryted = otr.readData();
-					byte[] xEncryptedMac = otr.readMac();
-					return new SignatureMessage(protocolVersion, xEncryted,
-							xEncryptedMac);
-				}
-				default:
-					throw new IOException("Illegal message type.");
-				}
-			case SerializationConstants.HEAD_ERROR:
-				return new ErrorMessage(AbstractMessage.MESSAGE_ERROR, content);
-			case SerializationConstants.HEAD_QUERY_V:
-			case SerializationConstants.HEAD_QUERY_Q:
-				List<Integer> versions = new Vector<Integer>();
-				String versionString = null;
-				if (SerializationConstants.HEAD_QUERY_Q == contentType) {
-					versions.add(1);
-					if (content.charAt(0) == 'v') {
-						versionString = content.substring(1, content
-								.indexOf('?'));
-					}
-				} else if (SerializationConstants.HEAD_QUERY_V == contentType) {
-					versionString = content.substring(0, content.indexOf('?'));
-				}
-
-				if (versionString != null) {
-					StringReader sr = new StringReader(versionString);
-					int c;
-					while ((c = sr.read()) != -1)
-						if (!versions.contains(c))
-							versions.add(Integer.parseInt(String
-									.valueOf((char) c)));
-				}
-				QueryMessage query = new QueryMessage(versions);
-				return query;
-			default:
-				throw new IOException("Uknown message type.");
-			}
-		}
-	}
-}