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); }
while (serverMessage.getType() == HandshakeType.hello_verify_request) byte[] cookie = processHelloVerifyRequest(state, serverMessage.getBody()); byte[] patched = patchClientHelloWithCookie(clientHelloBody, cookie); if (serverMessage.getType() == HandshakeType.server_hello) processServerHello(state, serverMessage.getBody()); if (serverMessage.getType() == HandshakeType.supplemental_data) processServerSupplementalData(state, serverMessage.getBody()); serverMessage = handshake.receiveMessage(); if (serverMessage.getType() == HandshakeType.certificate) serverCertificate = processServerCertificate(state, serverMessage.getBody()); serverMessage = handshake.receiveMessage(); if (serverMessage.getType() == HandshakeType.certificate_status) processCertificateStatus(state, serverMessage.getBody()); serverMessage = handshake.receiveMessage(); if (serverMessage.getType() == HandshakeType.server_key_exchange) processServerKeyExchange(state, serverMessage.getBody()); serverMessage = handshake.receiveMessage();
while (serverMessage.getType() == HandshakeType.hello_verify_request) byte[] cookie = processHelloVerifyRequest(state, serverMessage.getBody()); byte[] patched = patchClientHelloWithCookie(clientHelloBody, cookie); if (serverMessage.getType() == HandshakeType.server_hello) processServerHello(state, serverMessage.getBody()); if (serverMessage.getType() == HandshakeType.supplemental_data) processServerSupplementalData(state, serverMessage.getBody()); serverMessage = handshake.receiveMessage(); if (serverMessage.getType() == HandshakeType.certificate) serverCertificate = processServerCertificate(state, serverMessage.getBody()); serverMessage = handshake.receiveMessage(); if (serverMessage.getType() == HandshakeType.certificate_status) processCertificateStatus(state, serverMessage.getBody()); serverMessage = handshake.receiveMessage(); if (serverMessage.getType() == HandshakeType.server_key_exchange) processServerKeyExchange(state, serverMessage.getBody()); serverMessage = handshake.receiveMessage();
if (clientMessage.getType() == HandshakeType.client_hello) processClientHello(state, clientMessage.getBody()); if (clientMessage.getType() == HandshakeType.supplemental_data) processClientSupplementalData(state, clientMessage.getBody()); clientMessage = handshake.receiveMessage(); if (clientMessage.getType() == HandshakeType.certificate) processClientCertificate(state, clientMessage.getBody()); clientMessage = handshake.receiveMessage(); if (clientMessage.getType() == HandshakeType.client_key_exchange) processClientKeyExchange(state, clientMessage.getBody());
if (clientMessage.getType() == HandshakeType.client_hello) processClientHello(state, clientMessage.getBody()); if (clientMessage.getType() == HandshakeType.supplemental_data) processClientSupplementalData(state, clientMessage.getBody()); clientMessage = handshake.receiveMessage(); if (clientMessage.getType() == HandshakeType.certificate) processClientCertificate(state, clientMessage.getBody()); clientMessage = handshake.receiveMessage(); if (clientMessage.getType() == HandshakeType.client_key_exchange) processClientKeyExchange(state, clientMessage.getBody());
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 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; }
void sendMessage(short msg_type, byte[] body) throws IOException { TlsUtils.checkUint24(body.length); if (!sending) { checkInboundFlight(); sending = true; outboundFlight.removeAllElements(); } Message message = new Message(message_seq++, msg_type, body); outboundFlight.addElement(message); writeMessage(message); updateHandshakeMessagesDigest(message); }
void sendMessage(short msg_type, byte[] body) throws IOException { TlsUtils.checkUint24(body.length); if (!sending) { checkInboundFlight(); sending = true; outboundFlight.removeAllElements(); } Message message = new Message(message_seq++, msg_type, body); outboundFlight.addElement(message); writeMessage(message); updateHandshakeMessagesDigest(message); }
private Message getPendingMessage() throws IOException { DTLSReassembler next = (DTLSReassembler)currentInboundFlight.get(Integers.valueOf(next_receive_seq)); if (next != null) { byte[] body = next.getBodyIfComplete(); if (body != null) { previousInboundFlight = null; return updateHandshakeMessagesDigest(new Message(next_receive_seq++, next.getMsgType(), body)); } } return null; }
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); }
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); }