Skip to content

Commit 71125fd

Browse files
author
Ivan Nikolchev
committed
Test coverage for AES-CCM and integration with the rest of tlslite
1 parent a406e79 commit 71125fd

File tree

9 files changed

+591
-10
lines changed

9 files changed

+591
-10
lines changed

tests/tlstest.py

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

847847
print("Test {0} - throughput test".format(test_no))
848848
for implementation in implementations:
849-
for cipher in ["aes128gcm", "aes256gcm", "aes128", "aes256", "3des",
849+
for cipher in ["aes128ccm", "aes128ccm_8", "aes256ccm", "aes256ccm_8",
850+
"aes128gcm", "aes256gcm", "aes128", "aes256", "3des",
850851
"rc4", "chacha20-poly1305_draft00",
851852
"chacha20-poly1305"]:
852853
# skip tests with implementations that don't support them
@@ -857,7 +858,8 @@ def connect():
857858
implementation not in ("pycrypto",
858859
"python"):
859860
continue
860-
if cipher in ("chacha20-poly1305_draft00", "chacha20-poly1305") \
861+
if cipher in ("chacha20-poly1305_draft00", "chacha20-poly1305",
862+
"aes128ccm", "aes128ccm_8", "aes256ccm", "aes256ccm_8") \
861863
and implementation not in ("python", ):
862864
continue
863865

@@ -870,7 +872,8 @@ def connect():
870872
settings = HandshakeSettings()
871873
settings.cipherNames = [cipher]
872874
settings.cipherImplementations = [implementation, "python"]
873-
if cipher not in ("aes128gcm", "aes256gcm", "chacha20-poly1305"):
875+
if cipher not in ("aes128ccm", "aes128ccm_8", "aes128gcm",
876+
"aes256gcm", "chacha20-poly1305"):
874877
settings.maxVersion = (3, 3)
875878
connection.handshakeClientCert(settings=settings)
876879
print("%s %s:" % (connection.getCipherName(), connection.getCipherImplementation()), end=' ')
@@ -1165,6 +1168,36 @@ def connect():
11651168

11661169
test_no += 1
11671170

1171+
print("Test {0} - resumption in TLSv1.3 with AES-CCM tickets".format(test_no))
1172+
synchro.recv(1)
1173+
connection = connect()
1174+
settings = HandshakeSettings()
1175+
settings.minVersion = (3, 4)
1176+
# force HRR
1177+
settings.keyShares = []
1178+
connection.handshakeClientCert(serverName=address[0], settings=settings)
1179+
testConnClient(connection)
1180+
assert isinstance(connection.session.serverCertChain, X509CertChain)
1181+
assert connection.session.serverName == address[0]
1182+
assert not connection.resumed
1183+
assert connection.session.tickets
1184+
connection.close()
1185+
session = connection.session
1186+
1187+
# resume
1188+
synchro.recv(1)
1189+
settings = HandshakeSettings()
1190+
settings.minVersion = (3, 4)
1191+
settings.keyShares = []
1192+
connection = connect()
1193+
connection.handshakeClientCert(serverName=address[0], session=session,
1194+
settings=settings)
1195+
testConnClient(connection)
1196+
assert connection.resumed
1197+
connection.close()
1198+
1199+
test_no += 1
1200+
11681201
print("Test {0} - Heartbeat extension response callback in TLSv1.2".format(test_no))
11691202
heartbeat_payload = os.urandom(50)
11701203
def heartbeat_response_check(message):
@@ -1986,7 +2019,8 @@ def server_bind(self):
19862019

19872020
print("Test {0} - throughput test".format(test_no))
19882021
for implementation in implementations:
1989-
for cipher in ["aes128gcm", "aes256gcm", "aes128", "aes256", "3des",
2022+
for cipher in ["aes128ccm", "aes128ccm_8", "aes256ccm", "aes256ccm_8",
2023+
"aes128gcm", "aes256gcm", "aes128", "aes256", "3des",
19902024
"rc4", "chacha20-poly1305_draft00",
19912025
"chacha20-poly1305"]:
19922026
# skip tests with implementations that don't support them
@@ -1997,7 +2031,9 @@ def server_bind(self):
19972031
implementation not in ("pycrypto",
19982032
"python"):
19992033
continue
2000-
if cipher in ("chacha20-poly1305_draft00", "chacha20-poly1305") \
2034+
if cipher in ("chacha20-poly1305_draft00", "chacha20-poly1305",
2035+
"aes128ccm", "aes128ccm_8",
2036+
"aes256ccm", "aes256ccm_8") \
20012037
and implementation not in ("python", ):
20022038
continue
20032039

@@ -2234,6 +2270,28 @@ def server_bind(self):
22342270

22352271
test_no += 1
22362272

2273+
print("Test {0} - resumption in TLSv1.3 with AES-CCM tickets".format(test_no))
2274+
synchro.send(b'R')
2275+
connection = connect()
2276+
settings = HandshakeSettings()
2277+
settings.minVersion = (3, 4)
2278+
settings.ticketKeys = [getRandomBytes(32)]
2279+
settings.ticketCipher = "aes128ccm"
2280+
connection.handshakeServer(certChain=x509Chain, privateKey=x509Key,
2281+
settings=settings)
2282+
testConnServer(connection)
2283+
connection.close()
2284+
2285+
# resume
2286+
synchro.send(b'R')
2287+
connection = connect()
2288+
connection.handshakeServer(certChain=x509Chain, privateKey=x509Key,
2289+
settings=settings)
2290+
testConnServer(connection)
2291+
connection.close()
2292+
2293+
test_no += 1
2294+
22372295
print("Test {0} - Heartbeat extension response callback in TLSv1.2".format(test_no))
22382296
heartbeat_payload = os.urandom(50)
22392297
def heartbeat_response_check(message):

tlslite/constants.py

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -643,6 +643,25 @@ class CipherSuite:
643643
TLS_DH_ANON_WITH_AES_256_GCM_SHA384 = 0x00A7
644644
ietfNames[0x00A7] = 'TLS_DH_ANON_WITH_AES_256_GCM_SHA384'
645645

646+
# RFC 6655 - AES-CCM ciphers for TLSv1.2
647+
TLS_RSA_WITH_AES_128_CCM = 0xC09C
648+
ietfNames[0xC09C] = 'TLS_RSA_WITH_AES_128_CCM'
649+
TLS_RSA_WITH_AES_256_CCM = 0xC09D
650+
ietfNames[0xC09D] = 'TLS_RSA_WITH_AES_256_CCM'
651+
TLS_DHE_RSA_WITH_AES_128_CCM = 0xC09E
652+
ietfNames[0xC09E] = 'TLS_DHE_RSA_WITH_AES_128_CCM'
653+
TLS_DHE_RSA_WITH_AES_256_CCM = 0xC09F
654+
ietfNames[0xC09F] = 'TLS_DHE_RSA_WITH_AES_256_CCM'
655+
TLS_RSA_WITH_AES_128_CCM_8 = 0xC0A0
656+
ietfNames[0xC0A0] = 'TLS_RSA_WITH_AES_128_CCM_8'
657+
TLS_RSA_WITH_AES_256_CCM_8 = 0xC0A1
658+
ietfNames[0xC0A1] = 'TLS_RSA_WITH_AES_256_CCM_8'
659+
TLS_DHE_RSA_WITH_AES_128_CCM_8 = 0xC0A2
660+
ietfNames[0xC0A2] = 'TLS_DHE_RSA_WITH_AES_128_CCM_8'
661+
TLS_DHE_RSA_WITH_AES_256_CCM_8 = 0xC0A3
662+
ietfNames[0xC0A3] = 'TLS_DHE_RSA_WITH_AES_256_CCM_8'
663+
664+
646665
# Weird pseudo-ciphersuite from RFC 5746
647666
# Signals that "secure renegotiation" is supported
648667
# We actually don't do any renegotiation, but this
@@ -657,6 +676,10 @@ class CipherSuite:
657676
ietfNames[0x1302] = 'TLS_AES_256_GCM_SHA384'
658677
TLS_CHACHA20_POLY1305_SHA256 = 0x1303
659678
ietfNames[0x1303] = 'TLS_CHACHA20_POLY1305_SHA256'
679+
TLS_AES_128_CCM_SHA256 = 0x1304
680+
ietfNames[0x1304] = 'TLS_AES_128_CCM_SHA256'
681+
TLS_AES_128_CCM_8_SHA256 = 0x1305
682+
ietfNames[0x1305] = 'TLS_AES_128_CCM_8_SHA256'
660683

661684
# RFC 7507 - Fallback Signaling Cipher Suite Value for Preventing Protocol
662685
# Downgrade Attacks
@@ -794,6 +817,16 @@ class CipherSuite:
794817
TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 = 0xCCAA
795818
ietfNames[0xCCAA] = 'TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256'
796819

820+
# RFC 7251 - AES-CCM ECC Ciphers for TLS
821+
TLS_ECDHE_ECDSA_WITH_AES_128_CCM = 0xC0AC
822+
ietfNames[0xC0AC] = 'TLS_ECDHE_ECDSA_WITH_AES_128_CCM'
823+
TLS_ECDHE_ECDSA_WITH_AES_256_CCM = 0xC0AD
824+
ietfNames[0xC0AD] = 'TLS_ECDHE_ECDSA_WITH_AES_256_CCM'
825+
TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 = 0xC0AE
826+
ietfNames[0xC0AE] = 'TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8'
827+
TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 = 0xC0AF
828+
ietfNames[0xC0AF] = 'TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8'
829+
797830
#pylint: enable = invalid-name
798831
#
799832
# Define cipher suite families below
@@ -874,6 +907,32 @@ class CipherSuite:
874907
aes256GcmSuites.append(TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384)
875908
aes256GcmSuites.append(TLS_AES_256_GCM_SHA384)
876909

910+
#: AES-128 CCM_8 ciphers
911+
aes128Ccm_8Suites = []
912+
aes128Ccm_8Suites.append(TLS_RSA_WITH_AES_128_CCM_8)
913+
aes128Ccm_8Suites.append(TLS_DHE_RSA_WITH_AES_128_CCM_8)
914+
aes128Ccm_8Suites.append(TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8)
915+
aes128Ccm_8Suites.append(TLS_AES_128_CCM_8_SHA256)
916+
917+
#: AES-128 CCM ciphers
918+
aes128CcmSuites = []
919+
aes128CcmSuites.append(TLS_RSA_WITH_AES_128_CCM)
920+
aes128CcmSuites.append(TLS_DHE_RSA_WITH_AES_128_CCM)
921+
aes128CcmSuites.append(TLS_ECDHE_ECDSA_WITH_AES_128_CCM)
922+
aes128CcmSuites.append(TLS_AES_128_CCM_SHA256)
923+
924+
#: AES-256 CCM_8 ciphers
925+
aes256Ccm_8Suites = []
926+
aes256Ccm_8Suites.append(TLS_RSA_WITH_AES_256_CCM_8)
927+
aes256Ccm_8Suites.append(TLS_DHE_RSA_WITH_AES_256_CCM_8)
928+
aes256Ccm_8Suites.append(TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8)
929+
930+
# AES-256 CCM ciphers
931+
aes256CcmSuites = []
932+
aes256CcmSuites.append(TLS_RSA_WITH_AES_256_CCM)
933+
aes256CcmSuites.append(TLS_DHE_RSA_WITH_AES_256_CCM)
934+
aes256CcmSuites.append(TLS_ECDHE_ECDSA_WITH_AES_256_CCM)
935+
877936
#: CHACHA20 cipher, 00'th IETF draft (implicit POLY1305 authenticator)
878937
chacha20draft00Suites = []
879938
chacha20draft00Suites.append(TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_draft_00)
@@ -985,6 +1044,10 @@ class CipherSuite:
9851044
aeadSuites = []
9861045
aeadSuites.extend(aes128GcmSuites)
9871046
aeadSuites.extend(aes256GcmSuites)
1047+
aeadSuites.extend(aes128CcmSuites)
1048+
aeadSuites.extend(aes128Ccm_8Suites)
1049+
aeadSuites.extend(aes256CcmSuites)
1050+
aeadSuites.extend(aes256Ccm_8Suites)
9881051
aeadSuites.extend(chacha20Suites)
9891052
aeadSuites.extend(chacha20draft00Suites)
9901053

@@ -1022,6 +1085,10 @@ class CipherSuite:
10221085
tls12Suites.remove(TLS_AES_128_GCM_SHA256)
10231086
tls13Suites.append(TLS_CHACHA20_POLY1305_SHA256)
10241087
tls12Suites.remove(TLS_CHACHA20_POLY1305_SHA256)
1088+
tls13Suites.append(TLS_AES_128_CCM_SHA256)
1089+
tls12Suites.remove(TLS_AES_128_CCM_SHA256)
1090+
tls13Suites.append(TLS_AES_128_CCM_8_SHA256)
1091+
tls12Suites.remove(TLS_AES_128_CCM_8_SHA256)
10251092

10261093
@staticmethod
10271094
def filterForVersion(suites, minVersion, maxVersion):
@@ -1085,6 +1152,14 @@ def _filterSuites(suites, settings, version=None):
10851152
cipherSuites += CipherSuite.aes128GcmSuites
10861153
if "aes256gcm" in cipherNames and version >= (3, 3):
10871154
cipherSuites += CipherSuite.aes256GcmSuites
1155+
if "aes128ccm" in cipherNames and version >= (3, 3):
1156+
cipherSuites += CipherSuite.aes128CcmSuites
1157+
if "aes128ccm_8" in cipherNames and version >= (3, 3):
1158+
cipherSuites += CipherSuite.aes128Ccm_8Suites
1159+
if "aes256ccm" in cipherNames and version >= (3, 3):
1160+
cipherSuites += CipherSuite.aes256CcmSuites
1161+
if "aes256ccm_8" in cipherNames and version >= (3, 3):
1162+
cipherSuites += CipherSuite.aes256Ccm_8Suites
10881163
if "aes128" in cipherNames:
10891164
cipherSuites += CipherSuite.aes128Suites
10901165
if "aes256" in cipherNames:
@@ -1158,10 +1233,14 @@ def getSrpAllSuites(cls, settings, version=None):
11581233
certSuites = []
11591234
certSuites.append(TLS_RSA_WITH_AES_256_GCM_SHA384)
11601235
certSuites.append(TLS_RSA_WITH_AES_128_GCM_SHA256)
1236+
certSuites.append(TLS_RSA_WITH_AES_256_CCM)
1237+
certSuites.append(TLS_RSA_WITH_AES_128_CCM)
11611238
certSuites.append(TLS_RSA_WITH_AES_256_CBC_SHA256)
11621239
certSuites.append(TLS_RSA_WITH_AES_128_CBC_SHA256)
11631240
certSuites.append(TLS_RSA_WITH_AES_256_CBC_SHA)
11641241
certSuites.append(TLS_RSA_WITH_AES_128_CBC_SHA)
1242+
certSuites.append(TLS_RSA_WITH_AES_256_CCM_8)
1243+
certSuites.append(TLS_RSA_WITH_AES_128_CCM_8)
11651244
certSuites.append(TLS_RSA_WITH_3DES_EDE_CBC_SHA)
11661245
certSuites.append(TLS_RSA_WITH_RC4_128_SHA)
11671246
certSuites.append(TLS_RSA_WITH_RC4_128_MD5)
@@ -1180,10 +1259,14 @@ def getCertSuites(cls, settings, version=None):
11801259
dheCertSuites.append(TLS_DHE_RSA_WITH_CHACHA20_POLY1305_draft_00)
11811260
dheCertSuites.append(TLS_DHE_RSA_WITH_AES_256_GCM_SHA384)
11821261
dheCertSuites.append(TLS_DHE_RSA_WITH_AES_128_GCM_SHA256)
1262+
dheCertSuites.append(TLS_DHE_RSA_WITH_AES_256_CCM)
1263+
dheCertSuites.append(TLS_DHE_RSA_WITH_AES_128_CCM)
11831264
dheCertSuites.append(TLS_DHE_RSA_WITH_AES_256_CBC_SHA256)
11841265
dheCertSuites.append(TLS_DHE_RSA_WITH_AES_128_CBC_SHA256)
11851266
dheCertSuites.append(TLS_DHE_RSA_WITH_AES_256_CBC_SHA)
11861267
dheCertSuites.append(TLS_DHE_RSA_WITH_AES_128_CBC_SHA)
1268+
dheCertSuites.append(TLS_DHE_RSA_WITH_AES_256_CCM_8)
1269+
dheCertSuites.append(TLS_DHE_RSA_WITH_AES_128_CCM_8)
11871270
dheCertSuites.append(TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA)
11881271

11891272
@classmethod
@@ -1219,11 +1302,15 @@ def getEcdheCertSuites(cls, settings, version=None):
12191302
ecdheEcdsaSuites.append(TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_draft_00)
12201303
ecdheEcdsaSuites.append(TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384)
12211304
ecdheEcdsaSuites.append(TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256)
1305+
ecdheEcdsaSuites.append(TLS_ECDHE_ECDSA_WITH_AES_256_CCM)
1306+
ecdheEcdsaSuites.append(TLS_ECDHE_ECDSA_WITH_AES_128_CCM)
12221307
ecdheEcdsaSuites.append(TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384)
12231308
ecdheEcdsaSuites.append(TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256)
12241309
ecdheEcdsaSuites.append(TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA)
12251310
ecdheEcdsaSuites.append(TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA)
12261311
ecdheEcdsaSuites.append(TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA)
1312+
ecdheEcdsaSuites.append(TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8)
1313+
ecdheEcdsaSuites.append(TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8)
12271314
ecdheEcdsaSuites.append(TLS_ECDHE_ECDSA_WITH_RC4_128_SHA)
12281315
ecdheEcdsaSuites.append(TLS_ECDHE_ECDSA_WITH_NULL_SHA)
12291316

@@ -1274,6 +1361,14 @@ def canonicalCipherName(ciphersuite):
12741361
return "aes128gcm"
12751362
elif ciphersuite in CipherSuite.aes256GcmSuites:
12761363
return "aes256gcm"
1364+
elif ciphersuite in CipherSuite.aes128Ccm_8Suites:
1365+
return "aes128ccm_8"
1366+
elif ciphersuite in CipherSuite.aes128CcmSuites:
1367+
return "aes128ccm"
1368+
elif ciphersuite in CipherSuite.aes256CcmSuites:
1369+
return "aes256ccm"
1370+
elif ciphersuite in CipherSuite.aes256Ccm_8Suites:
1371+
return "aes256ccm_8"
12771372
elif ciphersuite in CipherSuite.aes128Suites:
12781373
return "aes128"
12791374
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)