Skip to content

Commit e8da6cf

Browse files
authored
Merge pull request #418 from Stonemason5040/dsa-ciphers
DSA cipher definitions, signatures and certificates
2 parents a8287ba + f223419 commit e8da6cf

File tree

11 files changed

+635
-11
lines changed

11 files changed

+635
-11
lines changed

tlslite/constants.py

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,12 @@ class SignatureScheme(TLSEnum):
237237
rsa_pss_sha384 = (8, 5)
238238
rsa_pss_sha512 = (8, 6)
239239

240+
dsa_sha1 = (2, 2)
241+
dsa_sha224 = (3, 2)
242+
dsa_sha256 = (4, 2)
243+
dsa_sha384 = (5, 2)
244+
dsa_sha512 = (6, 2)
245+
240246
@classmethod
241247
def toRepr(cls, value, blacklist=None):
242248
"""Convert numeric type to name representation"""
@@ -337,6 +343,16 @@ class AlgorithmOID(TLSEnum):
337343
SignatureScheme.rsa_pss_rsae_sha384
338344
oid[bytes(a2b_hex('300b0609608648016503040203'))] = \
339345
SignatureScheme.rsa_pss_rsae_sha512
346+
oid[bytes(a2b_hex('06072A8648CE380403'))] = \
347+
SignatureScheme.dsa_sha1
348+
oid[bytes(a2b_hex('0609608648016503040301'))] = \
349+
SignatureScheme.dsa_sha224
350+
oid[bytes(a2b_hex('0609608648016503040302'))] = \
351+
SignatureScheme.dsa_sha256
352+
oid[bytes(a2b_hex('0609608648016503040303'))] = \
353+
SignatureScheme.dsa_sha384
354+
oid[bytes(a2b_hex('0609608648016503040304'))] = \
355+
SignatureScheme.dsa_sha512
340356

341357

342358
class GroupName(TLSEnum):
@@ -656,6 +672,10 @@ class CipherSuite:
656672
ietfNames[0x0005] = 'TLS_RSA_WITH_RC4_128_SHA'
657673
TLS_RSA_WITH_3DES_EDE_CBC_SHA = 0x000A
658674
ietfNames[0x000A] = 'TLS_RSA_WITH_3DES_EDE_CBC_SHA'
675+
TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA = 0x000D
676+
ietfNames[0x000D] = 'TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA'
677+
TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA = 0x0013
678+
ietfNames[0x0013] = 'TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA'
659679
TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA = 0x0016
660680
ietfNames[0x0016] = 'TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA'
661681
TLS_DH_ANON_WITH_RC4_128_MD5 = 0x0018
@@ -664,12 +684,20 @@ class CipherSuite:
664684
ietfNames[0x001B] = 'TLS_DH_ANON_WITH_3DES_EDE_CBC_SHA'
665685
TLS_RSA_WITH_AES_128_CBC_SHA = 0x002F
666686
ietfNames[0x002F] = 'TLS_RSA_WITH_AES_128_CBC_SHA'
687+
TLS_DH_DSS_WITH_AES_128_CBC_SHA = 0x0030
688+
ietfNames[0x0030] = 'TLS_DH_DSS_WITH_AES_128_CBC_SHA'
689+
TLS_DHE_DSS_WITH_AES_128_CBC_SHA = 0x0032
690+
ietfNames[0x0032] = 'TLS_DHE_DSS_WITH_AES_128_CBC_SHA'
667691
TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 0x0033
668692
ietfNames[0x0033] = 'TLS_DHE_RSA_WITH_AES_128_CBC_SHA'
669693
TLS_DH_ANON_WITH_AES_128_CBC_SHA = 0x0034
670694
ietfNames[0x0034] = 'TLS_DH_ANON_WITH_AES_128_CBC_SHA'
671695
TLS_RSA_WITH_AES_256_CBC_SHA = 0x0035
672696
ietfNames[0x0035] = 'TLS_RSA_WITH_AES_256_CBC_SHA'
697+
TLS_DH_DSS_WITH_AES_256_CBC_SHA = 0x0036
698+
ietfNames[0x0036] = 'TLS_DH_DSS_WITH_AES_256_CBC_SHA'
699+
TLS_DHE_DSS_WITH_AES_256_CBC_SHA = 0x0038
700+
ietfNames[0x0038] = 'TLS_DHE_DSS_WITH_AES_256_CBC_SHA'
673701
TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 0x0039
674702
ietfNames[0x0039] = 'TLS_DHE_RSA_WITH_AES_256_CBC_SHA'
675703
TLS_DH_ANON_WITH_AES_256_CBC_SHA = 0x003A
@@ -680,8 +708,16 @@ class CipherSuite:
680708
ietfNames[0x003C] = 'TLS_RSA_WITH_AES_128_CBC_SHA256'
681709
TLS_RSA_WITH_AES_256_CBC_SHA256 = 0x003D
682710
ietfNames[0x003D] = 'TLS_RSA_WITH_AES_256_CBC_SHA256'
711+
TLS_DH_DSS_WITH_AES_128_CBC_SHA256 = 0x003E
712+
ietfNames[0x003E] = 'TLS_DH_DSS_WITH_AES_128_CBC_SHA256'
713+
TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 = 0x0040
714+
ietfNames[0x0040] = 'TLS_DHE_DSS_WITH_AES_128_CBC_SHA256'
683715
TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 = 0x0067
684716
ietfNames[0x0067] = 'TLS_DHE_RSA_WITH_AES_128_CBC_SHA256'
717+
TLS_DH_DSS_WITH_AES_256_CBC_SHA256 = 0x0068
718+
ietfNames[0x0068] = 'TLS_DH_DSS_WITH_AES_256_CBC_SHA256'
719+
TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 = 0x006A
720+
ietfNames[0x006A] = 'TLS_DHE_DSS_WITH_AES_256_CBC_SHA256'
685721
TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 = 0x006B
686722
ietfNames[0x006B] = 'TLS_DHE_RSA_WITH_AES_256_CBC_SHA256'
687723
TLS_DH_ANON_WITH_AES_128_CBC_SHA256 = 0x006C
@@ -698,6 +734,14 @@ class CipherSuite:
698734
ietfNames[0x009E] = 'TLS_DHE_RSA_WITH_AES_128_GCM_SHA256'
699735
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 = 0x009F
700736
ietfNames[0x009F] = 'TLS_DHE_RSA_WITH_AES_256_GCM_SHA384'
737+
TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 = 0x00A2
738+
ietfNames[0x00A2] = 'TLS_DHE_DSS_WITH_AES_128_GCM_SHA256'
739+
TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 = 0x00A3
740+
ietfNames[0x00A3] = 'TLS_DHE_DSS_WITH_AES_256_GCM_SHA384'
741+
TLS_DH_DSS_WITH_AES_128_GCM_SHA256 = 0x00A4
742+
ietfNames[0x00A4] = 'TLS_DH_DSS_WITH_AES_128_GCM_SHA256'
743+
TLS_DH_DSS_WITH_AES_256_GCM_SHA384 = 0x00A5
744+
ietfNames[0x00A5] = 'TLS_DH_DSS_WITH_AES_256_GCM_SHA384'
701745
TLS_DH_ANON_WITH_AES_128_GCM_SHA256 = 0x00A6
702746
ietfNames[0x00A6] = 'TLS_DH_ANON_WITH_AES_128_GCM_SHA256'
703747
TLS_DH_ANON_WITH_AES_256_GCM_SHA384 = 0x00A7
@@ -806,14 +850,20 @@ class CipherSuite:
806850
ietfNames[0xC01A] = 'TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA'
807851
TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA = 0xC01B
808852
ietfNames[0xC01B] = 'TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA'
853+
TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA = 0xC01C
854+
ietfNames[0xC01C] = 'TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA'
809855
TLS_SRP_SHA_WITH_AES_128_CBC_SHA = 0xC01D
810856
ietfNames[0xC01D] = 'TLS_SRP_SHA_WITH_AES_128_CBC_SHA'
811857
TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA = 0xC01E
812858
ietfNames[0xC01E] = 'TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA'
859+
TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA = 0xC01F
860+
ietfNames[0xC01F] = 'TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA'
813861
TLS_SRP_SHA_WITH_AES_256_CBC_SHA = 0xC020
814862
ietfNames[0xC020] = 'TLS_SRP_SHA_WITH_AES_256_CBC_SHA'
815863
TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA = 0xC021
816864
ietfNames[0xC021] = 'TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA'
865+
TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA = 0xC022
866+
ietfNames[0xC022] = 'TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA'
817867

818868
# RFC 5289 - ECC Ciphers with SHA-256/SHA-384 HMAC and AES-GCM
819869
# unsupported! - no support for ECDSA certificates
@@ -904,6 +954,9 @@ class CipherSuite:
904954
tripleDESSuites.append(TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA)
905955
tripleDESSuites.append(TLS_DH_ANON_WITH_3DES_EDE_CBC_SHA)
906956
tripleDESSuites.append(TLS_ECDH_ANON_WITH_3DES_EDE_CBC_SHA)
957+
tripleDESSuites.append(TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA) # unsupported
958+
tripleDESSuites.append(TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA) # unsupported
959+
tripleDESSuites.append(TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA) # unsupp
907960

908961
#: AES-128 CBC ciphers
909962
aes128Suites = []
@@ -924,6 +977,11 @@ class CipherSuite:
924977
aes128Suites.append(TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA)
925978
aes128Suites.append(TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256)
926979
aes128Suites.append(TLS_ECDH_ANON_WITH_AES_128_CBC_SHA)
980+
aes128Suites.append(TLS_DH_DSS_WITH_AES_128_CBC_SHA) # unsupported
981+
aes128Suites.append(TLS_DHE_DSS_WITH_AES_128_CBC_SHA) # unsupported
982+
aes128Suites.append(TLS_DH_DSS_WITH_AES_128_CBC_SHA256) # unsupported
983+
aes128Suites.append(TLS_DHE_DSS_WITH_AES_128_CBC_SHA256) # unsupported
984+
aes128Suites.append(TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA) # unsupported
927985

928986
#: AES-256 CBC ciphers
929987
aes256Suites = []
@@ -944,6 +1002,11 @@ class CipherSuite:
9441002
aes256Suites.append(TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA)
9451003
aes256Suites.append(TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384)
9461004
aes256Suites.append(TLS_ECDH_ANON_WITH_AES_256_CBC_SHA)
1005+
aes256Suites.append(TLS_DH_DSS_WITH_AES_256_CBC_SHA) # unsupported
1006+
aes256Suites.append(TLS_DHE_DSS_WITH_AES_256_CBC_SHA) # unsupported
1007+
aes256Suites.append(TLS_DH_DSS_WITH_AES_256_CBC_SHA256) # unsupported
1008+
aes256Suites.append(TLS_DHE_DSS_WITH_AES_256_CBC_SHA256) # unsupported
1009+
aes256Suites.append(TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA) # unsupported
9471010

9481011
#: AES-128 GCM ciphers
9491012
aes128GcmSuites = []
@@ -955,6 +1018,8 @@ class CipherSuite:
9551018
aes128GcmSuites.append(TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256) # unsupp
9561019
aes128GcmSuites.append(TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256)
9571020
aes128GcmSuites.append(TLS_AES_128_GCM_SHA256)
1021+
aes128GcmSuites.append(TLS_DHE_DSS_WITH_AES_128_GCM_SHA256) # unsupported
1022+
aes128GcmSuites.append(TLS_DH_DSS_WITH_AES_128_GCM_SHA256) # unsupported
9581023

9591024
#: AES-256-GCM ciphers (implicit SHA384, see sha384PrfSuites)
9601025
aes256GcmSuites = []
@@ -966,6 +1031,8 @@ class CipherSuite:
9661031
aes256GcmSuites.append(TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384) # unsupported
9671032
aes256GcmSuites.append(TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384)
9681033
aes256GcmSuites.append(TLS_AES_256_GCM_SHA384)
1034+
aes256GcmSuites.append(TLS_DHE_DSS_WITH_AES_256_GCM_SHA384) # unsupported
1035+
aes256GcmSuites.append(TLS_DH_DSS_WITH_AES_256_GCM_SHA384) # unsupported
9691036

9701037
#: AES-128 CCM_8 ciphers
9711038
aes128Ccm_8Suites = []
@@ -1037,16 +1104,25 @@ class CipherSuite:
10371104
shaSuites.append(TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA)
10381105
shaSuites.append(TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA)
10391106
shaSuites.append(TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA)
1107+
shaSuites.append(TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA) # unsupported
1108+
shaSuites.append(TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA) # unsupported
1109+
shaSuites.append(TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA) # unsupported
10401110
shaSuites.append(TLS_RSA_WITH_3DES_EDE_CBC_SHA)
10411111
shaSuites.append(TLS_RSA_WITH_AES_128_CBC_SHA)
10421112
shaSuites.append(TLS_RSA_WITH_AES_256_CBC_SHA)
10431113
shaSuites.append(TLS_RSA_WITH_RC4_128_SHA)
10441114
shaSuites.append(TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA)
10451115
shaSuites.append(TLS_DHE_RSA_WITH_AES_128_CBC_SHA)
10461116
shaSuites.append(TLS_DHE_RSA_WITH_AES_256_CBC_SHA)
1117+
shaSuites.append(TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA) # unsupported
1118+
shaSuites.append(TLS_DHE_DSS_WITH_AES_128_CBC_SHA) # unsupported
1119+
shaSuites.append(TLS_DHE_DSS_WITH_AES_256_CBC_SHA) # unsupported
10471120
shaSuites.append(TLS_DH_ANON_WITH_AES_128_CBC_SHA)
10481121
shaSuites.append(TLS_DH_ANON_WITH_AES_256_CBC_SHA)
10491122
shaSuites.append(TLS_DH_ANON_WITH_3DES_EDE_CBC_SHA)
1123+
shaSuites.append(TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA) # unsupported
1124+
shaSuites.append(TLS_DH_DSS_WITH_AES_128_CBC_SHA) # unsupported
1125+
shaSuites.append(TLS_DH_DSS_WITH_AES_256_CBC_SHA) # unsupported
10501126
shaSuites.append(TLS_RSA_WITH_NULL_SHA)
10511127
shaSuites.append(TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA)
10521128
shaSuites.append(TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA)
@@ -1094,6 +1170,8 @@ class CipherSuite:
10941170
sha384Suites.append(TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384) # unsupported
10951171
sha384Suites.append(TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384) # unsupported
10961172
sha384Suites.append(TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384)
1173+
sha384Suites.append(TLS_DHE_DSS_WITH_AES_256_GCM_SHA384) # unsupported
1174+
sha384Suites.append(TLS_DH_DSS_WITH_AES_256_GCM_SHA384) # unsupported
10971175

10981176
#: stream cipher construction
10991177
streamSuites = []

tlslite/utils/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
"python_aes",
2323
"python_rc4",
2424
"python_rsakey",
25+
"python_dsakey",
2526
"rc4",
2627
"rijndael",
2728
"rsakey",

tlslite/utils/dsakey.py

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
"""Abstract class for DSA."""
2+
3+
class DSAKey(object):
4+
"""This is an abstract base class for DSA keys.
5+
6+
Particular implementations of DSA keys, such as
7+
:py:class:`~.python_dsakey.Python_DSAKey`
8+
... more coming
9+
inherit from this.
10+
11+
To create or parse an DSA key, don't use one of these classes
12+
directly. Instead, use the factory functions in
13+
:py:class:`~tlslite.utils.keyfactory`.
14+
"""
15+
16+
def __init__(self, p, q, g, x, y):
17+
"""Create a new DSA key.
18+
:type p: int
19+
:param p: domain parameter, prime num defining Gaolis Field
20+
:type q: int
21+
:param q: domain parameter, prime factor of p-1
22+
:type g: int
23+
:param g: domain parameter, generator of q-order cyclic group GP(p)
24+
:type x: int
25+
:param x: private key
26+
:type y: int
27+
:param y: public key
28+
"""
29+
raise NotImplementedError()
30+
31+
def __len__(self):
32+
"""Return the size of the order of the curve of this key, in bits.
33+
34+
:rtype: int
35+
"""
36+
raise NotImplementedError()
37+
38+
def hasPrivateKey(self):
39+
"""Return whether or not this key has a private component.
40+
41+
:rtype: bool
42+
"""
43+
raise NotImplementedError()
44+
45+
def hashAndSign(self, data, hAlg):
46+
"""Hash and sign the passed-in bytes.
47+
48+
This requires the key to have a private component and
49+
global parameters. It performs a signature on the passed-in data
50+
with selected hash algorithm.
51+
52+
:type data: str
53+
:param data: The data which will be hashed and signed.
54+
55+
:type hAlg: str
56+
:param hAlg: The hash algorithm that will be used to hash data
57+
58+
:rtype: bytearray
59+
:returns: An DSA signature on the passed-in data.
60+
"""
61+
raise NotImplementedError()
62+
63+
def hashAndVerify(self, signature, data, hAlg="sha1"):
64+
"""Hash and verify the passed-in bytes with signature.
65+
66+
:type signature: ASN1 bytearray
67+
:param signature: the r, s dsa signature
68+
69+
:type data: str
70+
:param data: The data which will be hashed and verified.
71+
72+
:type hAlg: str
73+
:param hAlg: The hash algorithm that will be used to hash data
74+
75+
:rtype: bool
76+
:returns: return True if verification is OK.
77+
"""
78+
raise NotImplementedError()
79+
80+
@staticmethod
81+
def generate(L, N):
82+
"""Generate new key given by bit lengths L, N.
83+
84+
:type L: int
85+
:param L: length of parameter p in bits
86+
87+
:type N: int
88+
:param N: length of parameter q in bits
89+
90+
:rtype: DSAkey
91+
:returns: DSAkey(domain parameters, private key, public key)
92+
"""
93+
raise NotImplementedError()
94+
95+
@staticmethod
96+
def generate_qp(L, N):
97+
"""Generate new (p, q) given by bit lengths L, N.
98+
99+
:type L: int
100+
:param L: length of parameter p in bits
101+
102+
:type N: int
103+
:param N: length of parameter q in bits
104+
105+
:rtype: (int, int)
106+
:returns: new p and q key parameters
107+
"""
108+
raise NotImplementedError()

tlslite/utils/keyfactory.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from .rsakey import RSAKey
99
from .python_rsakey import Python_RSAKey
1010
from .python_ecdsakey import Python_ECDSAKey
11+
from .python_dsakey import Python_DSAKey
1112
from tlslite.utils import cryptomath
1213

1314
if cryptomath.m2cryptoLoaded:
@@ -233,3 +234,28 @@ def _create_public_ecdsa_key(point_x, point_y, curve_name,
233234
if impl == "python":
234235
return Python_ECDSAKey(point_x, point_y, curve_name)
235236
raise ValueError("No acceptable implementation")
237+
238+
def _create_public_dsa_key(p, q, g, y,
239+
implementations=("python",)):
240+
"""
241+
Convert public key parameters into concrete implementation of verifier.
242+
243+
The public key in DSA consists of four integers.
244+
245+
:type p: int
246+
:param p: domain parameter, prime num defining Gaolis Field
247+
:type q: int
248+
:param q: domain parameter, prime factor of p-1
249+
:type g: int
250+
:param g: domain parameter, generator of q-order cyclic group GP(p)
251+
:type y: int
252+
:param y: public key
253+
:type implementations: iterable of str
254+
:param implementations: list of implementations that can be used as the
255+
concrete implementation of the verifying key (only 'python' is
256+
supported currently)
257+
"""
258+
for impl in implementations:
259+
if impl == "python":
260+
return Python_DSAKey(p=p, q=q, g=g, y=y)
261+
raise ValueError("No acceptable implementation")

0 commit comments

Comments
 (0)