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); }
prepareInboundFlight(new Hashtable()); Message pending = getPendingMessage(); if (pending != null) boolean resentOutbound = processRecord(MAX_RECEIVE_AHEAD, recordLayer.getReadEpoch(), buf, 0, received); if (resentOutbound) readTimeoutMillis = backOff(readTimeoutMillis); resendOutboundFlight(); readTimeoutMillis = backOff(readTimeoutMillis);
void finish() { DTLSHandshakeRetransmit retransmit = null; if (!sending) { checkInboundFlight(); } else { prepareInboundFlight(null); if (previousInboundFlight != null) { /* * RFC 6347 4.2.4. In addition, for at least twice the default MSL defined for [TCP], * when in the FINISHED state, the node that transmits the last flight (the server in an * ordinary handshake or the client in a resumed handshake) MUST respond to a retransmit * of the peer's last flight with a retransmit of the last flight. */ retransmit = new DTLSHandshakeRetransmit() { public void receivedHandshakeRecord(int epoch, byte[] buf, int off, int len) throws IOException { processRecord(0, epoch, buf, off, len); } }; } } recordLayer.handshakeSuccessful(retransmit); }
DTLSReliableHandshake handshake = new DTLSReliableHandshake(state.serverContext, recordLayer); DTLSReliableHandshake.Message clientMessage = handshake.receiveMessage(); handshake.sendMessage(HandshakeType.server_hello, serverHelloBody); handshake.notifyHelloComplete(); handshake.sendMessage(HandshakeType.supplemental_data, supplementalDataBody); handshake.sendMessage(HandshakeType.certificate, certificateBody); handshake.sendMessage(HandshakeType.certificate_status, certificateStatusBody); handshake.sendMessage(HandshakeType.server_key_exchange, serverKeyExchange); handshake.sendMessage(HandshakeType.certificate_request, certificateRequestBody); TlsUtils.trackHashAlgorithms(handshake.getHandshakeHash(), state.certificateRequest.getSupportedSignatureAlgorithms()); handshake.sendMessage(HandshakeType.server_hello_done, TlsUtils.EMPTY_BYTES); handshake.getHandshakeHash().sealHashAlgorithms(); clientMessage = handshake.receiveMessage(); clientMessage = handshake.receiveMessage();
prepareInboundFlight(); return updateHandshakeMessagesDigest(new Message(next_receive_seq++, next.getMsgType(), body)); fragment_length); if (checkAll(previousInboundFlight)) resendOutboundFlight(); resetAll(previousInboundFlight); return updateHandshakeMessagesDigest(new Message(next_receive_seq++, reassembler.getMsgType(), body)); resendOutboundFlight();
boolean result = checkPreviousFlight && checkAll(previousInboundFlight); if (result) resendOutboundFlight(); resetAll(previousInboundFlight);
byte[] receiveMessageBody(short msg_type) throws IOException { Message message = receiveMessage(); if (message.getType() != msg_type) { throw new TlsFatalAlert(AlertDescription.unexpected_message); } return message.getBody(); }
if (!sending) checkInboundFlight();
DTLSReliableHandshake handshake = new DTLSReliableHandshake(state.serverContext, recordLayer); DTLSReliableHandshake.Message clientMessage = handshake.receiveMessage(); handshake.sendMessage(HandshakeType.server_hello, serverHelloBody); handshake.notifyHelloComplete(); handshake.sendMessage(HandshakeType.supplemental_data, supplementalDataBody); handshake.sendMessage(HandshakeType.certificate, certificateBody); handshake.sendMessage(HandshakeType.certificate_status, certificateStatusBody); handshake.sendMessage(HandshakeType.server_key_exchange, serverKeyExchange); handshake.sendMessage(HandshakeType.certificate_request, certificateRequestBody); TlsUtils.trackHashAlgorithms(handshake.getHandshakeHash(), state.certificateRequest.getSupportedSignatureAlgorithms()); handshake.sendMessage(HandshakeType.server_hello_done, TlsUtils.EMPTY_BYTES); handshake.getHandshakeHash().sealHashAlgorithms(); clientMessage = handshake.receiveMessage(); clientMessage = handshake.receiveMessage();
byte[] receiveMessageBody(short msg_type) throws IOException { Message message = receiveMessage(); if (message.getType() != msg_type) { throw new TlsFatalAlert(AlertDescription.unexpected_message); } return message.getBody(); }
DTLSReliableHandshake handshake = new DTLSReliableHandshake(state.clientContext, recordLayer); handshake.sendMessage(HandshakeType.client_hello, clientHelloBody); DTLSReliableHandshake.Message serverMessage = handshake.receiveMessage(); handshake.resetHandshakeMessagesDigest(); handshake.sendMessage(HandshakeType.client_hello, patched); serverMessage = handshake.receiveMessage(); handshake.notifyHelloComplete(); TlsProtocol.getCurrentPRFHash(state.clientContext, handshake.getHandshakeHash(), null)); processFinished(handshake.receiveMessageBody(HandshakeType.finished), expectedServerVerifyData); TlsProtocol.getCurrentPRFHash(state.clientContext, handshake.getHandshakeHash(), null)); handshake.sendMessage(HandshakeType.finished, clientVerifyData); handshake.finish(); serverMessage = handshake.receiveMessage(); serverMessage = handshake.receiveMessage(); serverMessage = handshake.receiveMessage(); serverMessage = handshake.receiveMessage();
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); }
DTLSReliableHandshake handshake = new DTLSReliableHandshake(state.clientContext, recordLayer); handshake.sendMessage(HandshakeType.client_hello, clientHelloBody); DTLSReliableHandshake.Message serverMessage = handshake.receiveMessage(); handshake.resetHandshakeMessagesDigest(); handshake.sendMessage(HandshakeType.client_hello, patched); serverMessage = handshake.receiveMessage(); handshake.notifyHelloComplete(); TlsProtocol.getCurrentPRFHash(state.clientContext, handshake.getHandshakeHash(), null)); processFinished(handshake.receiveMessageBody(HandshakeType.finished), expectedServerVerifyData); TlsProtocol.getCurrentPRFHash(state.clientContext, handshake.getHandshakeHash(), null)); handshake.sendMessage(HandshakeType.finished, clientVerifyData); handshake.finish(); serverMessage = handshake.receiveMessage(); serverMessage = handshake.receiveMessage(); serverMessage = handshake.receiveMessage(); serverMessage = handshake.receiveMessage();