The method AbstractTlsContext#exportKeyingMaterial() checks securityParametersConnection
for null and throws IllegalStateException. However securityParametersConnection is always set to null in method handshakeComplete().
May be should consider to use getSecurityParameters() instead.
public byte[] exportKeyingMaterial(String asciiLabel, byte[] context_value, int length)
{
SecurityParameters sp = getSecurityParametersConnection();
if (null == sp)
{
throw new IllegalStateException("Export of key material unavailable before handshake completion");
}
if (!sp.isExtendedMasterSecret())
{
/*
* RFC 7627 5.4. If a client or server chooses to continue with a full handshake without
* the extended master secret extension, [..] the client or server MUST NOT export any
* key material based on the new master secret for any subsequent application-level
* authentication. In particular, it MUST disable [RFC5705] [..].
*/
throw new IllegalStateException("cannot export keying material without extended_master_secret");
}
if (TlsUtils.isTLSv13(sp.getNegotiatedVersion()))
{
// TODO[tls13]
TlsSecret exporter_secret = null; // exporter_master_secret
return exportKeyingMaterial13(exporter_secret, asciiLabel, context_value, length);
}
byte[] seed = TlsUtils.calculateExporterSeed(sp, context_value);
return TlsUtils.PRF(sp, sp.getMasterSecret(), asciiLabel, seed, length).extract();
}
synchronized void handshakeComplete(TlsPeer peer, TlsSession session) throws IOException
{
if (null == securityParametersHandshake)
{
throw new TlsFatalAlert(AlertDescription.internal_error);
}
this.session = session;
securityParametersConnection = securityParametersHandshake;
peer.notifyHandshakeComplete();
securityParametersHandshake = null;
}
The method AbstractTlsContext#exportKeyingMaterial() checks securityParametersConnection
for null and throws IllegalStateException. However securityParametersConnection is always set to null in method handshakeComplete().
May be should consider to use getSecurityParameters() instead.