Skip to content

Commit 45d0a0c

Browse files
authored
Merge pull request #365 from inikolcev/aes-ccm-support
Add support for AES-CCM TLS1.2 and 1.3 ciphers, both with full and tr…
2 parents 970d33f + 71125fd commit 45d0a0c

File tree

10 files changed

+773
-10
lines changed

10 files changed

+773
-10
lines changed

tests/tlstest.py

Lines changed: 63 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -855,7 +855,8 @@ def connect():
855855

856856
print("Test {0} - throughput test".format(test_no))
857857
for implementation in implementations:
858-
for cipher in ["aes128gcm", "aes256gcm", "aes128", "aes256", "3des",
858+
for cipher in ["aes128ccm", "aes128ccm_8", "aes256ccm", "aes256ccm_8",
859+
"aes128gcm", "aes256gcm", "aes128", "aes256", "3des",
859860
"rc4", "chacha20-poly1305_draft00",
860861
"chacha20-poly1305"]:
861862
# skip tests with implementations that don't support them
@@ -866,7 +867,8 @@ def connect():
866867
implementation not in ("pycrypto",
867868
"python"):
868869
continue
869-
if cipher in ("chacha20-poly1305_draft00", "chacha20-poly1305") \
870+
if cipher in ("chacha20-poly1305_draft00", "chacha20-poly1305",
871+
"aes128ccm", "aes128ccm_8", "aes256ccm", "aes256ccm_8") \
870872
and implementation not in ("python", ):
871873
continue
872874

@@ -879,7 +881,8 @@ def connect():
879881
settings = HandshakeSettings()
880882
settings.cipherNames = [cipher]
881883
settings.cipherImplementations = [implementation, "python"]
882-
if cipher not in ("aes128gcm", "aes256gcm", "chacha20-poly1305"):
884+
if cipher not in ("aes128ccm", "aes128ccm_8", "aes128gcm",
885+
"aes256gcm", "chacha20-poly1305"):
883886
settings.maxVersion = (3, 3)
884887
connection.handshakeClientCert(settings=settings)
885888
print("%s %s:" % (connection.getCipherName(), connection.getCipherImplementation()), end=' ')
@@ -1174,6 +1177,36 @@ def connect():
11741177

11751178
test_no += 1
11761179

1180+
print("Test {0} - resumption in TLSv1.3 with AES-CCM tickets".format(test_no))
1181+
synchro.recv(1)
1182+
connection = connect()
1183+
settings = HandshakeSettings()
1184+
settings.minVersion = (3, 4)
1185+
# force HRR
1186+
settings.keyShares = []
1187+
connection.handshakeClientCert(serverName=address[0], settings=settings)
1188+
testConnClient(connection)
1189+
assert isinstance(connection.session.serverCertChain, X509CertChain)
1190+
assert connection.session.serverName == address[0]
1191+
assert not connection.resumed
1192+
assert connection.session.tickets
1193+
connection.close()
1194+
session = connection.session
1195+
1196+
# resume
1197+
synchro.recv(1)
1198+
settings = HandshakeSettings()
1199+
settings.minVersion = (3, 4)
1200+
settings.keyShares = []
1201+
connection = connect()
1202+
connection.handshakeClientCert(serverName=address[0], session=session,
1203+
settings=settings)
1204+
testConnClient(connection)
1205+
assert connection.resumed
1206+
connection.close()
1207+
1208+
test_no += 1
1209+
11771210
print("Test {0} - Heartbeat extension response callback in TLSv1.2".format(test_no))
11781211
heartbeat_payload = os.urandom(50)
11791212
def heartbeat_response_check(message):
@@ -2040,7 +2073,8 @@ def server_bind(self):
20402073

20412074
print("Test {0} - throughput test".format(test_no))
20422075
for implementation in implementations:
2043-
for cipher in ["aes128gcm", "aes256gcm", "aes128", "aes256", "3des",
2076+
for cipher in ["aes128ccm", "aes128ccm_8", "aes256ccm", "aes256ccm_8",
2077+
"aes128gcm", "aes256gcm", "aes128", "aes256", "3des",
20442078
"rc4", "chacha20-poly1305_draft00",
20452079
"chacha20-poly1305"]:
20462080
# skip tests with implementations that don't support them
@@ -2051,7 +2085,9 @@ def server_bind(self):
20512085
implementation not in ("pycrypto",
20522086
"python"):
20532087
continue
2054-
if cipher in ("chacha20-poly1305_draft00", "chacha20-poly1305") \
2088+
if cipher in ("chacha20-poly1305_draft00", "chacha20-poly1305",
2089+
"aes128ccm", "aes128ccm_8",
2090+
"aes256ccm", "aes256ccm_8") \
20552091
and implementation not in ("python", ):
20562092
continue
20572093

@@ -2288,6 +2324,28 @@ def server_bind(self):
22882324

22892325
test_no += 1
22902326

2327+
print("Test {0} - resumption in TLSv1.3 with AES-CCM tickets".format(test_no))
2328+
synchro.send(b'R')
2329+
connection = connect()
2330+
settings = HandshakeSettings()
2331+
settings.minVersion = (3, 4)
2332+
settings.ticketKeys = [getRandomBytes(32)]
2333+
settings.ticketCipher = "aes128ccm"
2334+
connection.handshakeServer(certChain=x509Chain, privateKey=x509Key,
2335+
settings=settings)
2336+
testConnServer(connection)
2337+
connection.close()
2338+
2339+
# resume
2340+
synchro.send(b'R')
2341+
connection = connect()
2342+
connection.handshakeServer(certChain=x509Chain, privateKey=x509Key,
2343+
settings=settings)
2344+
testConnServer(connection)
2345+
connection.close()
2346+
2347+
test_no += 1
2348+
22912349
print("Test {0} - Heartbeat extension response callback in TLSv1.2".format(test_no))
22922350
heartbeat_payload = os.urandom(50)
22932351
def heartbeat_response_check(message):

tlslite/constants.py

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -651,6 +651,25 @@ class CipherSuite:
651651
TLS_DH_ANON_WITH_AES_256_GCM_SHA384 = 0x00A7
652652
ietfNames[0x00A7] = 'TLS_DH_ANON_WITH_AES_256_GCM_SHA384'
653653

654+
# RFC 6655 - AES-CCM ciphers for TLSv1.2
655+
TLS_RSA_WITH_AES_128_CCM = 0xC09C
656+
ietfNames[0xC09C] = 'TLS_RSA_WITH_AES_128_CCM'
657+
TLS_RSA_WITH_AES_256_CCM = 0xC09D
658+
ietfNames[0xC09D] = 'TLS_RSA_WITH_AES_256_CCM'
659+
TLS_DHE_RSA_WITH_AES_128_CCM = 0xC09E
660+
ietfNames[0xC09E] = 'TLS_DHE_RSA_WITH_AES_128_CCM'
661+
TLS_DHE_RSA_WITH_AES_256_CCM = 0xC09F
662+
ietfNames[0xC09F] = 'TLS_DHE_RSA_WITH_AES_256_CCM'
663+
TLS_RSA_WITH_AES_128_CCM_8 = 0xC0A0
664+
ietfNames[0xC0A0] = 'TLS_RSA_WITH_AES_128_CCM_8'
665+
TLS_RSA_WITH_AES_256_CCM_8 = 0xC0A1
666+
ietfNames[0xC0A1] = 'TLS_RSA_WITH_AES_256_CCM_8'
667+
TLS_DHE_RSA_WITH_AES_128_CCM_8 = 0xC0A2
668+
ietfNames[0xC0A2] = 'TLS_DHE_RSA_WITH_AES_128_CCM_8'
669+
TLS_DHE_RSA_WITH_AES_256_CCM_8 = 0xC0A3
670+
ietfNames[0xC0A3] = 'TLS_DHE_RSA_WITH_AES_256_CCM_8'
671+
672+
654673
# Weird pseudo-ciphersuite from RFC 5746
655674
# Signals that "secure renegotiation" is supported
656675
# We actually don't do any renegotiation, but this
@@ -665,6 +684,10 @@ class CipherSuite:
665684
ietfNames[0x1302] = 'TLS_AES_256_GCM_SHA384'
666685
TLS_CHACHA20_POLY1305_SHA256 = 0x1303
667686
ietfNames[0x1303] = 'TLS_CHACHA20_POLY1305_SHA256'
687+
TLS_AES_128_CCM_SHA256 = 0x1304
688+
ietfNames[0x1304] = 'TLS_AES_128_CCM_SHA256'
689+
TLS_AES_128_CCM_8_SHA256 = 0x1305
690+
ietfNames[0x1305] = 'TLS_AES_128_CCM_8_SHA256'
668691

669692
# RFC 7507 - Fallback Signaling Cipher Suite Value for Preventing Protocol
670693
# Downgrade Attacks
@@ -802,6 +825,16 @@ class CipherSuite:
802825
TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 = 0xCCAA
803826
ietfNames[0xCCAA] = 'TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256'
804827

828+
# RFC 7251 - AES-CCM ECC Ciphers for TLS
829+
TLS_ECDHE_ECDSA_WITH_AES_128_CCM = 0xC0AC
830+
ietfNames[0xC0AC] = 'TLS_ECDHE_ECDSA_WITH_AES_128_CCM'
831+
TLS_ECDHE_ECDSA_WITH_AES_256_CCM = 0xC0AD
832+
ietfNames[0xC0AD] = 'TLS_ECDHE_ECDSA_WITH_AES_256_CCM'
833+
TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 = 0xC0AE
834+
ietfNames[0xC0AE] = 'TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8'
835+
TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 = 0xC0AF
836+
ietfNames[0xC0AF] = 'TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8'
837+
805838
#pylint: enable = invalid-name
806839
#
807840
# Define cipher suite families below
@@ -882,6 +915,32 @@ class CipherSuite:
882915
aes256GcmSuites.append(TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384)
883916
aes256GcmSuites.append(TLS_AES_256_GCM_SHA384)
884917

918+
#: AES-128 CCM_8 ciphers
919+
aes128Ccm_8Suites = []
920+
aes128Ccm_8Suites.append(TLS_RSA_WITH_AES_128_CCM_8)
921+
aes128Ccm_8Suites.append(TLS_DHE_RSA_WITH_AES_128_CCM_8)
922+
aes128Ccm_8Suites.append(TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8)
923+
aes128Ccm_8Suites.append(TLS_AES_128_CCM_8_SHA256)
924+
925+
#: AES-128 CCM ciphers
926+
aes128CcmSuites = []
927+
aes128CcmSuites.append(TLS_RSA_WITH_AES_128_CCM)
928+
aes128CcmSuites.append(TLS_DHE_RSA_WITH_AES_128_CCM)
929+
aes128CcmSuites.append(TLS_ECDHE_ECDSA_WITH_AES_128_CCM)
930+
aes128CcmSuites.append(TLS_AES_128_CCM_SHA256)
931+
932+
#: AES-256 CCM_8 ciphers
933+
aes256Ccm_8Suites = []
934+
aes256Ccm_8Suites.append(TLS_RSA_WITH_AES_256_CCM_8)
935+
aes256Ccm_8Suites.append(TLS_DHE_RSA_WITH_AES_256_CCM_8)
936+
aes256Ccm_8Suites.append(TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8)
937+
938+
# AES-256 CCM ciphers
939+
aes256CcmSuites = []
940+
aes256CcmSuites.append(TLS_RSA_WITH_AES_256_CCM)
941+
aes256CcmSuites.append(TLS_DHE_RSA_WITH_AES_256_CCM)
942+
aes256CcmSuites.append(TLS_ECDHE_ECDSA_WITH_AES_256_CCM)
943+
885944
#: CHACHA20 cipher, 00'th IETF draft (implicit POLY1305 authenticator)
886945
chacha20draft00Suites = []
887946
chacha20draft00Suites.append(TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_draft_00)
@@ -993,6 +1052,10 @@ class CipherSuite:
9931052
aeadSuites = []
9941053
aeadSuites.extend(aes128GcmSuites)
9951054
aeadSuites.extend(aes256GcmSuites)
1055+
aeadSuites.extend(aes128CcmSuites)
1056+
aeadSuites.extend(aes128Ccm_8Suites)
1057+
aeadSuites.extend(aes256CcmSuites)
1058+
aeadSuites.extend(aes256Ccm_8Suites)
9961059
aeadSuites.extend(chacha20Suites)
9971060
aeadSuites.extend(chacha20draft00Suites)
9981061

@@ -1030,6 +1093,10 @@ class CipherSuite:
10301093
tls12Suites.remove(TLS_AES_128_GCM_SHA256)
10311094
tls13Suites.append(TLS_CHACHA20_POLY1305_SHA256)
10321095
tls12Suites.remove(TLS_CHACHA20_POLY1305_SHA256)
1096+
tls13Suites.append(TLS_AES_128_CCM_SHA256)
1097+
tls12Suites.remove(TLS_AES_128_CCM_SHA256)
1098+
tls13Suites.append(TLS_AES_128_CCM_8_SHA256)
1099+
tls12Suites.remove(TLS_AES_128_CCM_8_SHA256)
10331100

10341101
@staticmethod
10351102
def filterForVersion(suites, minVersion, maxVersion):
@@ -1093,6 +1160,14 @@ def _filterSuites(suites, settings, version=None):
10931160
cipherSuites += CipherSuite.aes128GcmSuites
10941161
if "aes256gcm" in cipherNames and version >= (3, 3):
10951162
cipherSuites += CipherSuite.aes256GcmSuites
1163+
if "aes128ccm" in cipherNames and version >= (3, 3):
1164+
cipherSuites += CipherSuite.aes128CcmSuites
1165+
if "aes128ccm_8" in cipherNames and version >= (3, 3):
1166+
cipherSuites += CipherSuite.aes128Ccm_8Suites
1167+
if "aes256ccm" in cipherNames and version >= (3, 3):
1168+
cipherSuites += CipherSuite.aes256CcmSuites
1169+
if "aes256ccm_8" in cipherNames and version >= (3, 3):
1170+
cipherSuites += CipherSuite.aes256Ccm_8Suites
10961171
if "aes128" in cipherNames:
10971172
cipherSuites += CipherSuite.aes128Suites
10981173
if "aes256" in cipherNames:
@@ -1166,10 +1241,14 @@ def getSrpAllSuites(cls, settings, version=None):
11661241
certSuites = []
11671242
certSuites.append(TLS_RSA_WITH_AES_256_GCM_SHA384)
11681243
certSuites.append(TLS_RSA_WITH_AES_128_GCM_SHA256)
1244+
certSuites.append(TLS_RSA_WITH_AES_256_CCM)
1245+
certSuites.append(TLS_RSA_WITH_AES_128_CCM)
11691246
certSuites.append(TLS_RSA_WITH_AES_256_CBC_SHA256)
11701247
certSuites.append(TLS_RSA_WITH_AES_128_CBC_SHA256)
11711248
certSuites.append(TLS_RSA_WITH_AES_256_CBC_SHA)
11721249
certSuites.append(TLS_RSA_WITH_AES_128_CBC_SHA)
1250+
certSuites.append(TLS_RSA_WITH_AES_256_CCM_8)
1251+
certSuites.append(TLS_RSA_WITH_AES_128_CCM_8)
11731252
certSuites.append(TLS_RSA_WITH_3DES_EDE_CBC_SHA)
11741253
certSuites.append(TLS_RSA_WITH_RC4_128_SHA)
11751254
certSuites.append(TLS_RSA_WITH_RC4_128_MD5)
@@ -1188,10 +1267,14 @@ def getCertSuites(cls, settings, version=None):
11881267
dheCertSuites.append(TLS_DHE_RSA_WITH_CHACHA20_POLY1305_draft_00)
11891268
dheCertSuites.append(TLS_DHE_RSA_WITH_AES_256_GCM_SHA384)
11901269
dheCertSuites.append(TLS_DHE_RSA_WITH_AES_128_GCM_SHA256)
1270+
dheCertSuites.append(TLS_DHE_RSA_WITH_AES_256_CCM)
1271+
dheCertSuites.append(TLS_DHE_RSA_WITH_AES_128_CCM)
11911272
dheCertSuites.append(TLS_DHE_RSA_WITH_AES_256_CBC_SHA256)
11921273
dheCertSuites.append(TLS_DHE_RSA_WITH_AES_128_CBC_SHA256)
11931274
dheCertSuites.append(TLS_DHE_RSA_WITH_AES_256_CBC_SHA)
11941275
dheCertSuites.append(TLS_DHE_RSA_WITH_AES_128_CBC_SHA)
1276+
dheCertSuites.append(TLS_DHE_RSA_WITH_AES_256_CCM_8)
1277+
dheCertSuites.append(TLS_DHE_RSA_WITH_AES_128_CCM_8)
11951278
dheCertSuites.append(TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA)
11961279

11971280
@classmethod
@@ -1227,11 +1310,15 @@ def getEcdheCertSuites(cls, settings, version=None):
12271310
ecdheEcdsaSuites.append(TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_draft_00)
12281311
ecdheEcdsaSuites.append(TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384)
12291312
ecdheEcdsaSuites.append(TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256)
1313+
ecdheEcdsaSuites.append(TLS_ECDHE_ECDSA_WITH_AES_256_CCM)
1314+
ecdheEcdsaSuites.append(TLS_ECDHE_ECDSA_WITH_AES_128_CCM)
12301315
ecdheEcdsaSuites.append(TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384)
12311316
ecdheEcdsaSuites.append(TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256)
12321317
ecdheEcdsaSuites.append(TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA)
12331318
ecdheEcdsaSuites.append(TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA)
12341319
ecdheEcdsaSuites.append(TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA)
1320+
ecdheEcdsaSuites.append(TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8)
1321+
ecdheEcdsaSuites.append(TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8)
12351322
ecdheEcdsaSuites.append(TLS_ECDHE_ECDSA_WITH_RC4_128_SHA)
12361323
ecdheEcdsaSuites.append(TLS_ECDHE_ECDSA_WITH_NULL_SHA)
12371324

@@ -1282,6 +1369,14 @@ def canonicalCipherName(ciphersuite):
12821369
return "aes128gcm"
12831370
elif ciphersuite in CipherSuite.aes256GcmSuites:
12841371
return "aes256gcm"
1372+
elif ciphersuite in CipherSuite.aes128Ccm_8Suites:
1373+
return "aes128ccm_8"
1374+
elif ciphersuite in CipherSuite.aes128CcmSuites:
1375+
return "aes128ccm"
1376+
elif ciphersuite in CipherSuite.aes256CcmSuites:
1377+
return "aes256ccm"
1378+
elif ciphersuite in CipherSuite.aes256Ccm_8Suites:
1379+
return "aes256ccm_8"
12851380
elif ciphersuite in CipherSuite.aes128Suites:
12861381
return "aes128"
12871382
elif ciphersuite in CipherSuite.aes256Suites:

tlslite/handshakesettings.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,11 @@
1414

1515
CIPHER_NAMES = ["chacha20-poly1305",
1616
"aes256gcm", "aes128gcm",
17+
"aes256ccm", "aes128ccm",
1718
"aes256", "aes128",
1819
"3des"]
1920
ALL_CIPHER_NAMES = CIPHER_NAMES + ["chacha20-poly1305_draft00",
21+
"aes128ccm_8", "aes256ccm_8",
2022
"rc4", "null"]
2123
# Don't allow "md5" by default
2224
MAC_NAMES = ["sha", "sha256", "sha384", "aead"]
@@ -45,7 +47,8 @@
4547
"secp192r1": ('NIST192p', 'P-192'),
4648
"secp224r1": ('NIST224p', 'P-224')}
4749
KNOWN_VERSIONS = ((3, 0), (3, 1), (3, 2), (3, 3), (3, 4))
48-
TICKET_CIPHERS = ["chacha20-poly1305", "aes256gcm", "aes128gcm"]
50+
TICKET_CIPHERS = ["chacha20-poly1305", "aes256gcm", "aes128gcm", "aes128ccm",
51+
"aes128ccm_8", "aes256ccm", "aes256ccm_8"]
4952
PSK_MODES = ["psk_dhe_ke", "psk_ke"]
5053

5154

tlslite/recordlayer.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121
from .utils import tlshashlib as hashlib
2222
from .constants import ContentType, CipherSuite
2323
from .messages import RecordHeader3, RecordHeader2, Message
24-
from .utils.cipherfactory import createAESGCM, createAES, createRC4, \
25-
createTripleDES, createCHACHA20
24+
from .utils.cipherfactory import createAESCCM, createAESCCM_8, createAESGCM,\
25+
createAES, createRC4, createTripleDES, createCHACHA20
2626
from .utils.codec import Parser, Writer
2727
from .utils.compat import compatHMAC
2828
from .utils.cryptomath import getRandomBytes, MD5, HKDF_expand_label
@@ -1014,6 +1014,22 @@ def _getCipherSettings(cipherSuite):
10141014
keyLength = 16
10151015
ivLength = 4
10161016
createCipherFunc = createAESGCM
1017+
elif cipherSuite in CipherSuite.aes256Ccm_8Suites:
1018+
keyLength = 32
1019+
ivLength = 4
1020+
createCipherFunc = createAESCCM_8
1021+
elif cipherSuite in CipherSuite.aes256CcmSuites:
1022+
keyLength = 32
1023+
ivLength = 4
1024+
createCipherFunc = createAESCCM
1025+
elif cipherSuite in CipherSuite.aes128Ccm_8Suites:
1026+
keyLength = 16
1027+
ivLength = 4
1028+
createCipherFunc = createAESCCM_8
1029+
elif cipherSuite in CipherSuite.aes128CcmSuites:
1030+
keyLength = 16
1031+
ivLength = 4
1032+
createCipherFunc = createAESCCM
10171033
elif cipherSuite in CipherSuite.chacha20Suites:
10181034
keyLength = 32
10191035
ivLength = 12

tlslite/tlsconnection.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@
3737
ECDHE_RSAKeyExchange, SRPKeyExchange, ADHKeyExchange, \
3838
AECDHKeyExchange, FFDHKeyExchange, ECDHKeyExchange
3939
from .handshakehelpers import HandshakeHelpers
40-
from .utils.cipherfactory import createAESGCM, createCHACHA20
40+
from .utils.cipherfactory import createAESCCM, createAESCCM_8, \
41+
createAESGCM, createCHACHA20
4142

4243
class TLSConnection(TLSRecordLayer):
4344
"""
@@ -2367,6 +2368,10 @@ def _serverSendTickets(self, settings):
23672368
if settings.ticketCipher in ("aes128gcm", "aes256gcm"):
23682369
cipher = createAESGCM(key,
23692370
settings.cipherImplementations)
2371+
elif settings.ticketCipher in ("aes128ccm", "aes256ccm"):
2372+
cipher = createAESCCM(key, settings.cipherImplementations)
2373+
elif settings.ticketCipher in ("aes128ccm_8", "aes256ccm_8"):
2374+
cipher = createAESCCM_8(key, settings.cipherImplementations)
23702375
else:
23712376
assert settings.ticketCipher == "chacha20-poly1305"
23722377
cipher = createCHACHA20(key,
@@ -2401,6 +2406,10 @@ def _tryDecrypt(self, settings, identity):
24012406
key, iv = self._derive_key_iv(nonce, user_key, settings)
24022407
if settings.ticketCipher in ("aes128gcm", "aes256gcm"):
24032408
cipher = createAESGCM(key, settings.cipherImplementations)
2409+
elif settings.ticketCipher in ("aes128ccm", "aes256ccm"):
2410+
cipher = createAESCCM(key, settings.cipherImplementations)
2411+
elif settings.ticketCipher in ("aes128ccm_8", "aes256ccm_8"):
2412+
cipher = createAESCCM_8(key, settings.cipherImplementations)
24042413
else:
24052414
assert settings.ticketCipher == "chacha20-poly1305"
24062415
cipher = createCHACHA20(key, settings.cipherImplementations)

0 commit comments

Comments
 (0)