Inheritance: System.Security.Cryptography.DeriveBytes, IDisposable
Esempio n. 1
0
 public static byte[] GenerateMasterSecret(byte[] premaster, byte[] clientRandom, byte[] serverRandom)
 {
     Ssl3DeriveBytes prf = new Ssl3DeriveBytes(premaster, clientRandom, serverRandom, true);
     byte[] ret = prf.GetBytes(48);
     prf.Dispose();
     return ret;
 }
Esempio n. 2
0
        public static byte[] GenerateMasterSecret(byte[] premaster, byte[] clientRandom, byte[] serverRandom)
        {
            Ssl3DeriveBytes prf = new Ssl3DeriveBytes(premaster, clientRandom, serverRandom, true);

            byte[] ret = prf.GetBytes(48);
            prf.Dispose();
            return(ret);
        }
Esempio n. 3
0
        public static CipherSuite InitializeCipherSuite(byte[] master, byte[] clientrnd, byte[] serverrnd, CipherDefinition definition, ConnectionEnd entity)
        {
            CipherSuite        ret  = new CipherSuite();
            SymmetricAlgorithm bulk = (SymmetricAlgorithm)Activator.CreateInstance(definition.BulkCipherAlgorithm);

            if (definition.BulkIVSize > 0)
            {
                bulk.Mode = CipherMode.CBC;
            }
            bulk.Padding   = PaddingMode.None;
            bulk.BlockSize = definition.BulkIVSize * 8;
            // get the keys and IVs
            byte[]          client_mac, server_mac, client_key, server_key, client_iv, server_iv;
            Ssl3DeriveBytes prf = new Ssl3DeriveBytes(master, clientrnd, serverrnd, false);

            client_mac = prf.GetBytes(definition.HashSize);
            server_mac = prf.GetBytes(definition.HashSize);
            client_key = prf.GetBytes(definition.BulkKeySize);
            server_key = prf.GetBytes(definition.BulkKeySize);
            client_iv  = prf.GetBytes(definition.BulkIVSize);
            server_iv  = prf.GetBytes(definition.BulkIVSize);
            prf.Dispose();
            if (definition.Exportable)               // make some extra modifications if the keys are exportable
            {
                MD5 md5 = new MD5CryptoServiceProvider();
                md5.TransformBlock(client_key, 0, client_key.Length, client_key, 0);
                md5.TransformBlock(clientrnd, 0, clientrnd.Length, clientrnd, 0);
                md5.TransformFinalBlock(serverrnd, 0, serverrnd.Length);
                client_key = new byte[definition.BulkExpandedSize];
                Buffer.BlockCopy(md5.Hash, 0, client_key, 0, client_key.Length);
                md5.Initialize();
                md5.TransformBlock(server_key, 0, server_key.Length, server_key, 0);
                md5.TransformBlock(serverrnd, 0, serverrnd.Length, serverrnd, 0);
                md5.TransformFinalBlock(clientrnd, 0, clientrnd.Length);
                server_key = new byte[definition.BulkExpandedSize];
                Buffer.BlockCopy(md5.Hash, 0, server_key, 0, server_key.Length);
                md5.Initialize();
                md5.TransformBlock(clientrnd, 0, clientrnd.Length, clientrnd, 0);
                md5.TransformFinalBlock(serverrnd, 0, serverrnd.Length);
                client_iv = new byte[definition.BulkIVSize];
                Buffer.BlockCopy(md5.Hash, 0, client_iv, 0, client_iv.Length);
                md5.Initialize();
                md5.TransformBlock(serverrnd, 0, serverrnd.Length, serverrnd, 0);
                md5.TransformFinalBlock(clientrnd, 0, clientrnd.Length);
                server_iv = new byte[definition.BulkIVSize];
                Buffer.BlockCopy(md5.Hash, 0, server_iv, 0, server_iv.Length);
                md5.Clear();
            }
            // generate the cipher objects
            if (entity == ConnectionEnd.Client)
            {
                ret.Encryptor    = bulk.CreateEncryptor(client_key, client_iv);
                ret.Decryptor    = bulk.CreateDecryptor(server_key, server_iv);
                ret.LocalHasher  = new Ssl3RecordMAC(definition.HashAlgorithmType, client_mac);
                ret.RemoteHasher = new Ssl3RecordMAC(definition.HashAlgorithmType, server_mac);
            }
            else
            {
                ret.Encryptor    = bulk.CreateEncryptor(server_key, server_iv);
                ret.Decryptor    = bulk.CreateDecryptor(client_key, client_iv);
                ret.LocalHasher  = new Ssl3RecordMAC(definition.HashAlgorithmType, server_mac);
                ret.RemoteHasher = new Ssl3RecordMAC(definition.HashAlgorithmType, client_mac);
            }
            // clear sensitive data
            Array.Clear(client_mac, 0, client_mac.Length);
            Array.Clear(server_mac, 0, server_mac.Length);
            Array.Clear(client_key, 0, client_key.Length);
            Array.Clear(server_key, 0, server_key.Length);
            Array.Clear(client_iv, 0, client_iv.Length);
            Array.Clear(server_iv, 0, server_iv.Length);
            return(ret);
        }
Esempio n. 4
0
 public static CipherSuite InitializeCipherSuite(byte[] master, byte[] clientrnd, byte[] serverrnd, CipherDefinition definition, ConnectionEnd entity)
 {
     CipherSuite ret = new CipherSuite();
     SymmetricAlgorithm bulk = (SymmetricAlgorithm)Activator.CreateInstance(definition.BulkCipherAlgorithm);
     if (definition.BulkIVSize > 0)
         bulk.Mode = CipherMode.CBC;
     bulk.Padding = PaddingMode.None;
     bulk.BlockSize = definition.BulkIVSize * 8;
     // get the keys and IVs
     byte[] client_mac, server_mac, client_key, server_key, client_iv, server_iv;
     Ssl3DeriveBytes prf = new Ssl3DeriveBytes(master, clientrnd, serverrnd, false);
     client_mac = prf.GetBytes(definition.HashSize);
     server_mac = prf.GetBytes(definition.HashSize);
     client_key = prf.GetBytes(definition.BulkKeySize);
     server_key = prf.GetBytes(definition.BulkKeySize);
     client_iv = prf.GetBytes(definition.BulkIVSize);
     server_iv = prf.GetBytes(definition.BulkIVSize);
     prf.Dispose();
     if (definition.Exportable) { // make some extra modifications if the keys are exportable
         MD5 md5 = new MD5CryptoServiceProvider();
         md5.TransformBlock(client_key, 0, client_key.Length, client_key, 0);
         md5.TransformBlock(clientrnd, 0, clientrnd.Length, clientrnd, 0);
         md5.TransformFinalBlock(serverrnd, 0, serverrnd.Length);
         client_key = new byte[definition.BulkExpandedSize];
         Buffer.BlockCopy(md5.Hash, 0, client_key, 0, client_key.Length);
         md5.Initialize();
         md5.TransformBlock(server_key, 0, server_key.Length, server_key, 0);
         md5.TransformBlock(serverrnd, 0, serverrnd.Length, serverrnd, 0);
         md5.TransformFinalBlock(clientrnd, 0, clientrnd.Length);
         server_key = new byte[definition.BulkExpandedSize];
         Buffer.BlockCopy(md5.Hash, 0, server_key, 0, server_key.Length);
         md5.Initialize();
         md5.TransformBlock(clientrnd, 0, clientrnd.Length, clientrnd, 0);
         md5.TransformFinalBlock(serverrnd, 0, serverrnd.Length);
         client_iv = new byte[definition.BulkIVSize];
         Buffer.BlockCopy(md5.Hash, 0, client_iv, 0, client_iv.Length);
         md5.Initialize();
         md5.TransformBlock(serverrnd, 0, serverrnd.Length, serverrnd, 0);
         md5.TransformFinalBlock(clientrnd, 0, clientrnd.Length);
         server_iv = new byte[definition.BulkIVSize];
         Buffer.BlockCopy(md5.Hash, 0, server_iv, 0, server_iv.Length);
         md5.Clear();
     }
     // generate the cipher objects
     if (entity == ConnectionEnd.Client) {
         ret.Encryptor = bulk.CreateEncryptor(client_key, client_iv);
         ret.Decryptor = bulk.CreateDecryptor(server_key, server_iv);
         ret.LocalHasher = new Ssl3RecordMAC(definition.HashAlgorithmType, client_mac);
         ret.RemoteHasher = new Ssl3RecordMAC(definition.HashAlgorithmType, server_mac);
     } else {
         ret.Encryptor = bulk.CreateEncryptor(server_key, server_iv);
         ret.Decryptor = bulk.CreateDecryptor(client_key, client_iv);
         ret.LocalHasher = new Ssl3RecordMAC(definition.HashAlgorithmType, server_mac);
         ret.RemoteHasher = new Ssl3RecordMAC(definition.HashAlgorithmType, client_mac);
     }
     // clear sensitive data
     Array.Clear(client_mac, 0, client_mac.Length);
     Array.Clear(server_mac, 0, server_mac.Length);
     Array.Clear(client_key, 0, client_key.Length);
     Array.Clear(server_key, 0, server_key.Length);
     Array.Clear(client_iv, 0, client_iv.Length);
     Array.Clear(server_iv, 0, server_iv.Length);
     return ret;
 }