| package org.bouncycastle.crypto.tls; |
| |
| import java.security.SecureRandom; |
| |
| abstract class AbstractTlsContext |
| implements TlsContext |
| { |
| private SecureRandom secureRandom; |
| private SecurityParameters securityParameters; |
| |
| private ProtocolVersion clientVersion = null; |
| private ProtocolVersion serverVersion = null; |
| private TlsSession session = null; |
| private Object userObject = null; |
| |
| AbstractTlsContext(SecureRandom secureRandom, SecurityParameters securityParameters) |
| { |
| this.secureRandom = secureRandom; |
| this.securityParameters = securityParameters; |
| } |
| |
| public SecureRandom getSecureRandom() |
| { |
| return secureRandom; |
| } |
| |
| public SecurityParameters getSecurityParameters() |
| { |
| return securityParameters; |
| } |
| |
| public ProtocolVersion getClientVersion() |
| { |
| return clientVersion; |
| } |
| |
| void setClientVersion(ProtocolVersion clientVersion) |
| { |
| this.clientVersion = clientVersion; |
| } |
| |
| public ProtocolVersion getServerVersion() |
| { |
| return serverVersion; |
| } |
| |
| void setServerVersion(ProtocolVersion serverVersion) |
| { |
| this.serverVersion = serverVersion; |
| } |
| |
| public TlsSession getResumableSession() |
| { |
| return session; |
| } |
| |
| void setResumableSession(TlsSession session) |
| { |
| this.session = session; |
| } |
| |
| public Object getUserObject() |
| { |
| return userObject; |
| } |
| |
| public void setUserObject(Object userObject) |
| { |
| this.userObject = userObject; |
| } |
| |
| public byte[] exportKeyingMaterial(String asciiLabel, byte[] context_value, int length) |
| { |
| if (context_value != null && !TlsUtils.isValidUint16(context_value.length)) |
| { |
| throw new IllegalArgumentException("'context_value' must have length less than 2^16 (or be null)"); |
| } |
| |
| SecurityParameters sp = getSecurityParameters(); |
| byte[] cr = sp.getClientRandom(), sr = sp.getServerRandom(); |
| |
| int seedLength = cr.length + sr.length; |
| if (context_value != null) |
| { |
| seedLength += (2 + context_value.length); |
| } |
| |
| byte[] seed = new byte[seedLength]; |
| int seedPos = 0; |
| |
| System.arraycopy(cr, 0, seed, seedPos, cr.length); |
| seedPos += cr.length; |
| System.arraycopy(sr, 0, seed, seedPos, sr.length); |
| seedPos += sr.length; |
| if (context_value != null) |
| { |
| TlsUtils.writeUint16(context_value.length, seed, seedPos); |
| seedPos += 2; |
| System.arraycopy(context_value, 0, seed, seedPos, context_value.length); |
| seedPos += context_value.length; |
| } |
| |
| if (seedPos != seedLength) |
| { |
| throw new IllegalStateException("error in calculation of seed for export"); |
| } |
| |
| return TlsUtils.PRF(this, sp.getMasterSecret(), asciiLabel, seed, length); |
| } |
| } |