private byte[] computeControlValue(WorkflowTrace trace, TlsContext tlsContext) throws CryptoException {
tlsContext.getDigest().reset();
for (MessageAction messageAction : trace.getMessageActions()) {
for (ProtocolMessage message : messageAction.getMessages()) {
if (message instanceof ChangeCipherSpecMessage) {
break;
}
if (message.isHandshakeMessage()) {
HandshakeMessage handshakeMessage = (HandshakeMessage) message;
if (handshakeMessage.getIncludeInDigest()) {
tlsContext.getDigest().append(message.getCompleteResultingMessage().getValue());
}
}
}
}
byte[] handshakeMessageHash = tlsContext.getDigest().digest(tlsContext.getSelectedProtocolVersion(),
tlsContext.getSelectedCipherSuite());
PRFAlgorithm prfAlgorithm = tlsContext.getChooser().getPRFAlgorithm();
byte[] control = PseudoRandomFunction.compute(prfAlgorithm, tlsContext.getMasterSecret(),
PseudoRandomFunction.CLIENT_FINISHED_LABEL, handshakeMessageHash, HandshakeByteLength.VERIFY_DATA);
byte[] compare = ArrayConverter.concatenate(HandshakeMessageType.FINISHED.getArrayValue(),
ArrayConverter.intToBytes(control.length, HandshakeByteLength.MESSAGE_LENGTH_FIELD), control);
return compare;
}
}