public virtual byte[] ExportKeyingMaterial(string asciiLabel, byte[] context_value, int length) { if ((context_value != null) && !TlsUtilities.IsValidUint16(context_value.Length)) { throw new ArgumentException("must have length less than 2^16 (or be null)", "context_value"); } Org.BouncyCastle.Crypto.Tls.SecurityParameters securityParameters = this.SecurityParameters; byte[] clientRandom = securityParameters.ClientRandom; byte[] serverRandom = securityParameters.ServerRandom; int num = clientRandom.Length + serverRandom.Length; if (context_value != null) { num += 2 + context_value.Length; } byte[] destinationArray = new byte[num]; int destinationIndex = 0; Array.Copy(clientRandom, 0, destinationArray, destinationIndex, clientRandom.Length); destinationIndex += clientRandom.Length; Array.Copy(serverRandom, 0, destinationArray, destinationIndex, serverRandom.Length); destinationIndex += serverRandom.Length; if (context_value != null) { TlsUtilities.WriteUint16(context_value.Length, destinationArray, destinationIndex); destinationIndex += 2; Array.Copy(context_value, 0, destinationArray, destinationIndex, context_value.Length); destinationIndex += context_value.Length; } if (destinationIndex != num) { throw new InvalidOperationException("error in calculation of seed for export"); } return(TlsUtilities.PRF(this, securityParameters.MasterSecret, asciiLabel, destinationArray, length)); }
internal AbstractTlsContext(Org.BouncyCastle.Security.SecureRandom secureRandom, Org.BouncyCastle.Crypto.Tls.SecurityParameters securityParameters) { IDigest digest = TlsUtilities.CreateHash((byte)4); byte[] buffer = new byte[digest.GetDigestSize()]; secureRandom.NextBytes(buffer); this.mNonceRandom = new DigestRandomGenerator(digest); this.mNonceRandom.AddSeedMaterial(NextCounterValue()); this.mNonceRandom.AddSeedMaterial(Times.NanoTime()); this.mNonceRandom.AddSeedMaterial(buffer); this.mSecureRandom = secureRandom; this.mSecurityParameters = securityParameters; }