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; } }
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(); } }
public CipherSuiteInfo() { PRFAlgorithm = PRFAlgorithm.TLSPrfSHA256; AesMode = AesMode.CBC; }
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(); } }