package com.google.bitcoin.bouncycastle.crypto.tls;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* An implementation of the TLS 1.0 record layer.
*/
public class RecordStream
{
private TlsProtocolHandler handler;
private InputStream is;
private OutputStream os;
protected CombinedHash hash1;
protected CombinedHash hash2;
protected TlsCipherSuite readSuite = null;
protected TlsCipherSuite writeSuite = null;
protected RecordStream(TlsProtocolHandler handler, InputStream is, OutputStream os)
{
this.handler = handler;
this.is = is;
this.os = os;
hash1 = new CombinedHash();
hash2 = new CombinedHash();
this.readSuite = new TlsNullCipherSuite();
this.writeSuite = this.readSuite;
}
public void readData() throws IOException
{
short type = TlsUtils.readUint8(is);
TlsUtils.checkVersion(is, handler);
int size = TlsUtils.readUint16(is);
byte[] buf = decodeAndVerify(type, is, size);
handler.processData(type, buf, 0, buf.length);
}
protected byte[] decodeAndVerify(short type, InputStream is, int len) throws IOException
{
byte[] buf = new byte[len];
TlsUtils.readFully(buf, is);
byte[] result = readSuite.decodeCiphertext(type, buf, 0, buf.length, handler);
return result;
}
protected void writeMessage(short type, byte[] message, int offset, int len) throws IOException
{
if (type == 22) // TlsProtocolHandler.RL_HANDSHAKE
{
hash1.update(message, offset, len);
hash2.update(message, offset, len);
}
byte[] ciphertext = writeSuite.encodePlaintext(type, message, offset, len);
byte[] writeMessage = new byte[ciphertext.length + 5];
TlsUtils.writeUint8(type, writeMessage, 0);
TlsUtils.writeUint8((short)3, writeMessage, 1);
TlsUtils.writeUint8((short)1, writeMessage, 2);
TlsUtils.writeUint16(ciphertext.length, writeMessage, 3);
System.arraycopy(ciphertext, 0, writeMessage, 5, ciphertext.length);
os.write(writeMessage);
os.flush();
}
protected void close() throws IOException
{
IOException e = null;
try
{
is.close();
}
catch (IOException ex)
{
e = ex;
}
try
{
os.close();
}
catch (IOException ex)
{
e = ex;
}
if (e != null)
{
throw e;
}
}
protected void flush() throws IOException
{
os.flush();
}
}