private void writeMessage(Message message) throws IOException { int sendLimit = recordLayer.getSendLimit(); int fragmentLimit = sendLimit - 12; // TODO Support a higher minimum fragment size? if (fragmentLimit < 1) { // TODO Should we be throwing an exception here? throw new TlsFatalAlert(AlertDescription.internal_error); } int length = message.getBody().length; // NOTE: Must still send a fragment if body is empty int fragment_offset = 0; do { int fragment_length = Math.min(length - fragment_offset, fragmentLimit); writeHandshakeFragment(message, fragment_offset, fragment_length); fragment_offset += fragment_length; } while (fragment_offset < length); }
private void writeMessage(Message message) throws IOException { int sendLimit = recordLayer.getSendLimit(); int fragmentLimit = sendLimit - MESSAGE_HEADER_LENGTH; // TODO Support a higher minimum fragment size? if (fragmentLimit < 1) { // TODO Should we be throwing an exception here? throw new TlsFatalAlert(AlertDescription.internal_error); } int length = message.getBody().length; // NOTE: Must still send a fragment if body is empty int fragment_offset = 0; do { int fragment_length = Math.min(length - fragment_offset, fragmentLimit); writeHandshakeFragment(message, fragment_offset, fragment_length); fragment_offset += fragment_length; } while (fragment_offset < length); }
byte[] cookie = processHelloVerifyRequest(state, serverMessage.getBody()); byte[] patched = patchClientHelloWithCookie(clientHelloBody, cookie); processServerHello(state, serverMessage.getBody()); processServerSupplementalData(state, serverMessage.getBody()); serverMessage = handshake.receiveMessage(); serverCertificate = processServerCertificate(state, serverMessage.getBody()); serverMessage = handshake.receiveMessage(); processCertificateStatus(state, serverMessage.getBody()); serverMessage = handshake.receiveMessage(); processServerKeyExchange(state, serverMessage.getBody()); serverMessage = handshake.receiveMessage(); processCertificateRequest(state, serverMessage.getBody()); if (serverMessage.getBody().length != 0) if (serverMessage.getType() == HandshakeType.session_ticket) processNewSessionTicket(state, serverMessage.getBody());
byte[] cookie = processHelloVerifyRequest(state, serverMessage.getBody()); byte[] patched = patchClientHelloWithCookie(clientHelloBody, cookie); recordLayer.setWriteVersion(recordLayerVersion); processServerHello(state, serverMessage.getBody()); processServerSupplementalData(state, serverMessage.getBody()); serverMessage = handshake.receiveMessage(); serverCertificate = processServerCertificate(state, serverMessage.getBody()); serverMessage = handshake.receiveMessage(); processCertificateStatus(state, serverMessage.getBody()); serverMessage = handshake.receiveMessage(); processServerKeyExchange(state, serverMessage.getBody()); serverMessage = handshake.receiveMessage(); processCertificateRequest(state, serverMessage.getBody()); if (serverMessage.getBody().length != 0) if (serverMessage.getType() == HandshakeType.session_ticket) processNewSessionTicket(state, serverMessage.getBody());
processClientHello(state, clientMessage.getBody()); processClientSupplementalData(state, clientMessage.getBody()); clientMessage = handshake.receiveMessage(); processClientCertificate(state, clientMessage.getBody()); clientMessage = handshake.receiveMessage(); processClientKeyExchange(state, clientMessage.getBody());
processClientHello(state, clientMessage.getBody()); processClientSupplementalData(state, clientMessage.getBody()); clientMessage = handshake.receiveMessage(); processClientCertificate(state, clientMessage.getBody()); clientMessage = handshake.receiveMessage(); processClientKeyExchange(state, clientMessage.getBody());
private Message updateHandshakeMessagesDigest(Message message) throws IOException { if (message.getType() != HandshakeType.hello_request) { byte[] body = message.getBody(); byte[] buf = new byte[12]; TlsUtils.writeUint8(message.getType(), buf, 0); TlsUtils.writeUint24(body.length, buf, 1); TlsUtils.writeUint16(message.getSeq(), buf, 4); TlsUtils.writeUint24(0, buf, 6); TlsUtils.writeUint24(body.length, buf, 9); handshakeHash.update(buf, 0, buf.length); handshakeHash.update(body, 0, body.length); } return message; }
private Message updateHandshakeMessagesDigest(Message message) throws IOException { if (message.getType() != HandshakeType.hello_request) { byte[] body = message.getBody(); byte[] buf = new byte[MESSAGE_HEADER_LENGTH]; TlsUtils.writeUint8(message.getType(), buf, 0); TlsUtils.writeUint24(body.length, buf, 1); TlsUtils.writeUint16(message.getSeq(), buf, 4); TlsUtils.writeUint24(0, buf, 6); TlsUtils.writeUint24(body.length, buf, 9); handshakeHash.update(buf, 0, buf.length); handshakeHash.update(body, 0, body.length); } return message; }
byte[] receiveMessageBody(short msg_type) throws IOException { Message message = receiveMessage(); if (message.getType() != msg_type) { throw new TlsFatalAlert(AlertDescription.unexpected_message); } return message.getBody(); }
private void writeHandshakeFragment(Message message, int fragment_offset, int fragment_length) throws IOException { RecordLayerBuffer fragment = new RecordLayerBuffer(12 + fragment_length); TlsUtils.writeUint8(message.getType(), fragment); TlsUtils.writeUint24(message.getBody().length, fragment); TlsUtils.writeUint16(message.getSeq(), fragment); TlsUtils.writeUint24(fragment_offset, fragment); TlsUtils.writeUint24(fragment_length, fragment); fragment.write(message.getBody(), fragment_offset, fragment_length); fragment.sendToRecordLayer(recordLayer); }
byte[] receiveMessageBody(short msg_type) throws IOException { Message message = receiveMessage(); if (message.getType() != msg_type) { throw new TlsFatalAlert(AlertDescription.unexpected_message); } return message.getBody(); }
private void writeHandshakeFragment(Message message, int fragment_offset, int fragment_length) throws IOException { RecordLayerBuffer fragment = new RecordLayerBuffer(MESSAGE_HEADER_LENGTH + fragment_length); TlsUtils.writeUint8(message.getType(), fragment); TlsUtils.writeUint24(message.getBody().length, fragment); TlsUtils.writeUint16(message.getSeq(), fragment); TlsUtils.writeUint24(fragment_offset, fragment); TlsUtils.writeUint24(fragment_length, fragment); fragment.write(message.getBody(), fragment_offset, fragment_length); fragment.sendToRecordLayer(recordLayer); }