Beispiel #1
0
        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));
        }
Beispiel #2
0
        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;
        }