X-Git-Url: https://www.bearssl.org/gitweb//home/git/?p=BoarSSL;a=blobdiff_plain;f=SSLTLS%2FSSLEngine.cs;h=ac951cfab2e05c55cfb2a54596110e39638eb0c6;hp=e4ebf9516c11fefd9e5ad16dde59170e0129c44c;hb=HEAD;hpb=c16004e3afb8aa2524aeec88aa7c9c67400e93c1 diff --git a/SSLTLS/SSLEngine.cs b/SSLTLS/SSLEngine.cs index e4ebf95..ac951cf 100644 --- a/SSLTLS/SSLEngine.cs +++ b/SSLTLS/SSLEngine.cs @@ -79,6 +79,10 @@ public abstract class SSLEngine : Stream { SSL.ECDHE_RSA_WITH_AES_128_GCM_SHA256, SSL.ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, SSL.ECDHE_RSA_WITH_AES_256_GCM_SHA384, + SSL.ECDHE_ECDSA_WITH_AES_128_CCM, + SSL.ECDHE_ECDSA_WITH_AES_256_CCM, + SSL.ECDHE_ECDSA_WITH_AES_128_CCM_8, + SSL.ECDHE_ECDSA_WITH_AES_256_CCM_8, SSL.ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, SSL.ECDHE_RSA_WITH_AES_128_CBC_SHA256, SSL.ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, @@ -103,6 +107,10 @@ public abstract class SSLEngine : Stream { SSL.RSA_WITH_AES_128_GCM_SHA256, SSL.RSA_WITH_AES_256_GCM_SHA384, + SSL.RSA_WITH_AES_128_CCM, + SSL.RSA_WITH_AES_256_CCM, + SSL.RSA_WITH_AES_128_CCM_8, + SSL.RSA_WITH_AES_256_CCM_8, SSL.RSA_WITH_AES_128_CBC_SHA256, SSL.RSA_WITH_AES_256_CBC_SHA256, SSL.RSA_WITH_AES_128_CBC_SHA, @@ -1347,6 +1355,8 @@ public abstract class SSLEngine : Stream { IBlockCipher block = null; IDigest hash = null; Poly1305 pp = null; + bool isCCM = false; + bool isCCM8 = false; switch (CipherSuite) { case SSL.RSA_WITH_3DES_EDE_CBC_SHA: case SSL.DH_DSS_WITH_3DES_EDE_CBC_SHA: @@ -1475,6 +1485,42 @@ public abstract class SSLEngine : Stream { block = new AES(); break; + case SSL.RSA_WITH_AES_128_CCM: + case SSL.ECDHE_ECDSA_WITH_AES_128_CCM: + macLen = 0; + encLen = 16; + ivLen = 4; + block = new AES(); + isCCM = true; + break; + + case SSL.RSA_WITH_AES_256_CCM: + case SSL.ECDHE_ECDSA_WITH_AES_256_CCM: + macLen = 0; + encLen = 32; + ivLen = 4; + block = new AES(); + isCCM = true; + break; + + case SSL.RSA_WITH_AES_128_CCM_8: + case SSL.ECDHE_ECDSA_WITH_AES_128_CCM_8: + macLen = 0; + encLen = 16; + ivLen = 4; + block = new AES(); + isCCM8 = true; + break; + + case SSL.RSA_WITH_AES_256_CCM_8: + case SSL.ECDHE_ECDSA_WITH_AES_256_CCM_8: + macLen = 0; + encLen = 32; + ivLen = 4; + block = new AES(); + isCCM8 = true; + break; + case SSL.ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256: case SSL.ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256: case SSL.DHE_RSA_WITH_CHACHA20_POLY1305_SHA256: @@ -1539,6 +1585,28 @@ public abstract class SSLEngine : Stream { inRec.SetDecryption( new RecordDecryptCBC(block, hm, iv)); } + } else if (isCCM) { + /* + * CCM cipher suite. + */ + if (write) { + outRec.SetEncryption( + new RecordEncryptCCM(block, iv, false)); + } else { + inRec.SetDecryption( + new RecordDecryptCCM(block, iv, false)); + } + } else if (isCCM8) { + /* + * CCM cipher suite with truncated MAC value. + */ + if (write) { + outRec.SetEncryption( + new RecordEncryptCCM(block, iv, true)); + } else { + inRec.SetDecryption( + new RecordDecryptCCM(block, iv, true)); + } } else if (block != null) { /* * GCM cipher suite.