Skip to content

Commit 8004236

Browse files
committed
Client side support for ECDSA ciphersuites
1 parent a3405d8 commit 8004236

File tree

3 files changed

+17
-2
lines changed

3 files changed

+17
-2
lines changed

tlslite/constants.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -994,6 +994,8 @@ def _filterSuites(suites, settings, version=None):
994994
keyExchangeSuites += CipherSuite.dheCertSuites
995995
if "ecdhe_rsa" in keyExchangeNames:
996996
keyExchangeSuites += CipherSuite.ecdheCertSuites
997+
if "ecdhe_ecdsa" in keyExchangeNames:
998+
keyExchangeSuites += CipherSuite.ecdheEcdsaSuites
997999
if "srp_sha" in keyExchangeNames:
9981000
keyExchangeSuites += CipherSuite.srpSuites
9991001
if "srp_sha_rsa" in keyExchangeNames:
@@ -1112,6 +1114,12 @@ def getEcdheCertSuites(cls, settings, version=None):
11121114
ecdheEcdsaSuites.append(TLS_ECDHE_ECDSA_WITH_RC4_128_SHA)
11131115
ecdheEcdsaSuites.append(TLS_ECDHE_ECDSA_WITH_NULL_SHA)
11141116

1117+
@classmethod
1118+
def getEcdsaSuites(cls, settings, version=None):
1119+
"""Provide ECDSA authenticated ciphersuites matching settings"""
1120+
return cls._filterSuites(CipherSuite.ecdheEcdsaSuites,
1121+
settings, version)
1122+
11151123
#: anon FFDHE key exchange
11161124
anonSuites = []
11171125
anonSuites.append(TLS_DH_ANON_WITH_AES_256_GCM_SHA384)

tlslite/handshakesettings.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
"rc4", "null"]
2121
MAC_NAMES = ["sha", "sha256", "sha384", "aead"] # Don't allow "md5" by default.
2222
ALL_MAC_NAMES = MAC_NAMES + ["md5"]
23-
KEY_EXCHANGE_NAMES = ["rsa", "dhe_rsa", "ecdhe_rsa", "srp_sha", "srp_sha_rsa",
23+
KEY_EXCHANGE_NAMES = ["ecdhe_ecdsa", "rsa", "dhe_rsa", "ecdhe_rsa", "srp_sha", "srp_sha_rsa",
2424
"ecdh_anon", "dh_anon"]
2525
CIPHER_IMPLEMENTATIONS = ["openssl", "pycrypto", "python"]
2626
CERTIFICATE_TYPES = ["x509"]

tlslite/tlsconnection.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -602,6 +602,7 @@ def _clientSendClientHello(self, settings, session, srpUsername,
602602
if srpParams:
603603
cipherSuites += CipherSuite.getSrpAllSuites(settings)
604604
elif certParams:
605+
cipherSuites += CipherSuite.getEcdsaSuites(settings)
605606
cipherSuites += CipherSuite.getEcdheCertSuites(settings)
606607
cipherSuites += CipherSuite.getDheCertSuites(settings)
607608
cipherSuites += CipherSuite.getCertSuites(settings)
@@ -842,7 +843,8 @@ def _clientKeyExchange(self, settings, cipherSuite,
842843
keyExchange):
843844
"""Perform the client side of key exchange"""
844845
# if server chose cipher suite with authentication, get the certificate
845-
if cipherSuite in CipherSuite.certAllSuites:
846+
if cipherSuite in CipherSuite.certAllSuites or \
847+
cipherSuite in CipherSuite.ecdheEcdsaSuites:
846848
for result in self._getMsg(ContentType.handshake,
847849
HandshakeType.certificate,
848850
certificateType):
@@ -2271,6 +2273,11 @@ def _sigHashesToList(settings, privateKey=None, certList=None):
22712273
certType = certList.x509List[0].certAlg
22722274

22732275
sigAlgs = []
2276+
2277+
for hashName in settings.ecdsaSigHashes:
2278+
sigAlgs.append((getattr(HashAlgorithm, hashName),
2279+
SignatureAlgorithm.ecdsa))
2280+
22742281
for schemeName in settings.rsaSchemes:
22752282
for hashName in settings.rsaSigHashes:
22762283
# rsa-pss certificates can't be used to make PKCS#1 v1.5

0 commit comments

Comments
 (0)