Пример #1
0
        public void SetVersion(ProtocolVersion version)
        {
            _ver = version;
            switch (version)
            {
            case ProtocolVersion.SSL30:
                _prfType = PRFAlgorithm.SSL3;
                break;

            case ProtocolVersion.TLS10:
            case ProtocolVersion.TLS11:
                _prfType = PRFAlgorithm.MD5_AND_SHA1;
                break;

            case ProtocolVersion.TLS12:
                _prfType = PRFAlgorithm.SHA256;
                break;
            }
        }
Пример #2
0
        public static byte[] PRF(PRFAlgorithm prfAlgorithm, byte[] key, string label, byte[] seed, int bytesNeeded)
        {
            switch (prfAlgorithm)
            {
            case PRFAlgorithm.TLSPrfSHA256:
                using (var hmac = new HMACSHA256(key))
                    return(PRF(hmac, label, seed, bytesNeeded));

            case PRFAlgorithm.TLSPrfSHA384:
                using (var hmac = new HMACSHA384(key))
                    return(PRF(hmac, label, seed, bytesNeeded));

            case PRFAlgorithm.TLSPrfMD5SHA1:
                var halfKeyLen = (key.Length + 1) / 2;
                var key1       = new byte[halfKeyLen];
                var key2       = new byte[halfKeyLen];
                Buffer.BlockCopy(key, 0, key1, 0, halfKeyLen);
                Buffer.BlockCopy(key, key.Length - halfKeyLen, key2, 0, halfKeyLen);
                using (var hmac1 = new HMACMD5(key1))
                {
                    using (var hmac2 = new HMACSHA1(key2))
                    {
                        var prf1 = PRF(hmac1, label, seed, bytesNeeded);
                        var prf2 = PRF(hmac2, label, seed, bytesNeeded);
                        for (var i = 0; i < bytesNeeded; i++)
                        {
                            prf1[i] ^= prf2[i];
                        }
                        ClearArray(key1);
                        ClearArray(key2);
                        ClearArray(prf2);
                        return(prf1);
                    }
                }

            default:
                throw new NotSupportedException();
            }
        }
Пример #3
0
 public CipherSuiteInfo()
 {
     PRFAlgorithm = PRFAlgorithm.TLSPrfSHA256;
     AesMode      = AesMode.CBC;
 }
Пример #4
0
 public void SetVersion(ProtocolVersion version)
 {
     _ver = version;
     switch (version) {
         case ProtocolVersion.SSL30:
             _prfType = PRFAlgorithm.SSL3;
             break;
         case ProtocolVersion.TLS10:
         case ProtocolVersion.TLS11:
             _prfType = PRFAlgorithm.MD5_AND_SHA1;
             break;
         case ProtocolVersion.TLS12:
             _prfType = PRFAlgorithm.SHA256;
             break;
     }
 }
Пример #5
0
 public static byte[] PRF(PRFAlgorithm prfAlgorithm, byte[] key, string label, byte[] seed, int bytesNeeded)
 {
     switch (prfAlgorithm)
     {
         case PRFAlgorithm.TLSPrfSHA256:
             using (var hmac = new HMACSHA256(key))
                 return PRF(hmac, label, seed, bytesNeeded);
         case PRFAlgorithm.TLSPrfSHA384:
             using (var hmac = new HMACSHA384(key))
                 return PRF(hmac, label, seed, bytesNeeded);
         case PRFAlgorithm.TLSPrfMD5SHA1:
             var halfKeyLen = (key.Length + 1) / 2;
             var key1 = new byte[halfKeyLen];
             var key2 = new byte[halfKeyLen];
             Buffer.BlockCopy(key, 0, key1, 0, halfKeyLen);
             Buffer.BlockCopy(key, key.Length - halfKeyLen, key2, 0, halfKeyLen);
             using (var hmac1 = new HMACMD5(key1))
             {
                 using (var hmac2 = new HMACSHA1(key2))
                 {
                     var prf1 = PRF(hmac1, label, seed, bytesNeeded);
                     var prf2 = PRF(hmac2, label, seed, bytesNeeded);
                     for (var i = 0; i < bytesNeeded; i++)
                     {
                         prf1[i] ^= prf2[i];
                     }
                     ClearArray(key1);
                     ClearArray(key2);
                     ClearArray(prf2);
                     return prf1;
                 }
             }
         default:
             throw new NotSupportedException();
     }
 }
Пример #6
0
 public CipherSuiteInfo()
 {
     PRFAlgorithm = PRFAlgorithm.TLSPrfSHA256;
     AesMode = AesMode.CBC;
 }