Ssl3Utilities
using Org.BouncyCastle.Tls.Crypto;
using Org.BouncyCastle.Utilities;
using Org.BouncyCastle.Utilities.IO;
using System.IO;
namespace Org.BouncyCastle.Tls
{
    internal abstract class Ssl3Utilities
    {
        private static readonly byte[] SSL_CLIENT = new byte[4] {
            67,
            76,
            78,
            84
        };
        private static readonly byte[] SSL_SERVER = new byte[4] {
            83,
            82,
            86,
            82
        };
        private const byte IPAD_BYTE = 54;
        private const byte OPAD_BYTE = 92;
        private static readonly byte[] IPAD = GenPad(54, 48);
        private static readonly byte[] OPAD = GenPad(92, 48);
        internal static byte[] CalculateVerifyData(TlsHandshakeHash handshakeHash, bool isServer)
        {
            TlsHash tlsHash = handshakeHash.ForkPrfHash();
            byte[] array = isServer ? SSL_SERVER : SSL_CLIENT;
            tlsHash.Update(array, 0, array.Length);
            return tlsHash.CalculateHash();
        }
        internal static void CompleteCombinedHash(TlsContext context, TlsHash md5, TlsHash sha1)
        {
            TlsSecret masterSecret = context.SecurityParameters.MasterSecret;
            byte[] master_secret = context.Crypto.AdoptSecret(masterSecret).Extract();
            CompleteHash(master_secret, md5, 48);
            CompleteHash(master_secret, sha1, 40);
        }
        private static void CompleteHash(byte[] master_secret, TlsHash hash, int padLength)
        {
            hash.Update(master_secret, 0, master_secret.Length);
            hash.Update(IPAD, 0, padLength);
            byte[] array = hash.CalculateHash();
            hash.Update(master_secret, 0, master_secret.Length);
            hash.Update(OPAD, 0, padLength);
            hash.Update(array, 0, array.Length);
        }
        private static byte[] GenPad(byte b, int count)
        {
            byte[] obj = new byte[count];
            Arrays.Fill(obj, b);
            return obj;
        }
        internal static byte[] ReadEncryptedPms(Stream input)
        {
            return Streams.ReadAll(input);
        }
        internal static void WriteEncryptedPms(byte[] encryptedPms, Stream output)
        {
            output.Write(encryptedPms, 0, encryptedPms.Length);
        }
    }
}