Merge ~spitap/dkimpy:utf8-support into dkimpy:master

Proposed by Adrien
Status: Needs review
Proposed branch: ~spitap/dkimpy:utf8-support
Merge into: dkimpy:master
Diff against target: 533 lines (+157/-68)
13 files modified
.gitignore (+1/-0)
dkim/asyncsupport.py (+9/-5)
dkim/dkimverify.py (+34/-4)
dkim/dnsplug.py (+2/-3)
dkim/tests/__init__.py (+9/-0)
dkim/tests/data/test_punnycode.message (+9/-0)
dkim/tests/data/test_utf8.message (+9/-0)
dkim/tests/test_arc.py (+3/-4)
dkim/tests/test_dkim.py (+57/-22)
dkim/tests/test_dkim_ed25519.py (+3/-3)
dkim/tests/test_dkim_generate.py (+5/-6)
dkim/tests/test_dkim_rsavariants.py (+3/-3)
dkim/tests/test_dkim_tlsrpt.py (+13/-18)
Reviewer Review Type Date Requested Status
dkimpy developers Pending
Review via email: mp+427826@code.launchpad.net

Commit message

Added UTF-8 support && ability to check message from CLI

To post a comment you must log in.

Unmerged commits

9813d5b... by Adrien

UT8-Support

b446e70... by Scott Kitterman

WIP to support DNS data via text file and support for non-UTF-8 email addresses

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/.gitignore b/.gitignore
index debba34..589aff8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,4 @@ dkim/*.pyc
4dkim/tests/*.pyc4dkim/tests/*.pyc
5dkimpy.egg-info5dkimpy.egg-info
6dist6dist
7build/
diff --git a/dkim/asyncsupport.py b/dkim/asyncsupport.py
index 226cc42..e326827 100644
--- a/dkim/asyncsupport.py
+++ b/dkim/asyncsupport.py
@@ -50,13 +50,17 @@ async def get_txt_async(name, timeout=5):
50 # Note: This will use the existing loop or create one if needed50 # Note: This will use the existing loop or create one if needed
51 loop = asyncio.get_event_loop()51 loop = asyncio.get_event_loop()
52 resolver = aiodns.DNSResolver(loop=loop, timeout=timeout)52 resolver = aiodns.DNSResolver(loop=loop, timeout=timeout)
5353
54 async def query(name, qtype):54 try:
55 return await resolver.query(name, qtype)55 unicode_name = name.decode('utf-8')
56 except UnicodeDecodeError:
57 return None
58 async def query(unicode_name, qtype):
59 return await resolver.query(unicode_name, qtype)
5660
57 #q = query(name, 'TXT')61 #q = query(name, 'TXT')
58 try:62 try:
59 result = await query(name, 'TXT')63 result = await query(unicode_name, 'TXT')
60 except aiodns.error.DNSError:64 except aiodns.error.DNSError:
61 result = None65 result = None
6266
@@ -86,7 +90,7 @@ class DKIM(dkim.DKIM):
86 name = sig[b's'] + b"._domainkey." + sig[b'd'] + b"."90 name = sig[b's'] + b"._domainkey." + sig[b'd'] + b"."
87 try:91 try:
88 self.pk, self.keysize, self.ktag, self.seqtlsrpt = await load_pk_from_dns_async(name,92 self.pk, self.keysize, self.ktag, self.seqtlsrpt = await load_pk_from_dns_async(name,
89 dnsfunc, timeout=self.timeout)93 dnsfunc, timeout=self.timeout)
90 except dkim.KeyFormatError as e:94 except dkim.KeyFormatError as e:
91 self.logger.error("%s" % e)95 self.logger.error("%s" % e)
92 return False96 return False
diff --git a/dkim/dkimverify.py b/dkim/dkimverify.py
index 2ca90d5..e1d6243 100644
--- a/dkim/dkimverify.py
+++ b/dkim/dkimverify.py
@@ -28,24 +28,54 @@ import argparse
2828
29import dkim29import dkim
3030
31def filedns(datafile, tgtdomain, selector):
32
33 def dnsf(self, domain, timeout=5):
34 target = "{0}._domainkey.{1}.".format(selector, tgtdomain)
35 _dns_responses = {
36 target : read_test_data(datafile),
37 }
38 try:
39 domain = domain.decode('ascii')
40 except UnicodeDecodeError:
41 return None
42 self.assertTrue(domain in _dns_responses,domain)
43 return _dns_responses[domain]
44
45 return dnsf
46
31def main():47def main():
32 parser = argparse.ArgumentParser(48 parser = argparse.ArgumentParser(
33 description='Verify DKIM signature for email messages.',49 description='Verify DKIM signature for email messages.',
34 epilog="message to be verified follows commands on stdin")50 epilog="message to be verified follows commands on stdin")
51 parser.add_argument('-v', '--verbose', action='store_true', default=False,
52 help='turn verbose mode on')
35 parser.add_argument('--index', metavar='N', type=int, default=0,53 parser.add_argument('--index', metavar='N', type=int, default=0,
36 help='Index of DKIM signature header to verify: default=0')54 help='Index of DKIM signature header to verify: default=0')
55 parser.add_argument('-f', '--dnsfile', action="store", default=None,
56 help='File containing DKIM public key records' )
57 parser.add_argument('-d', '--domain', action="store", default=None,
58 help='Domain for DNS record in dnsfile. Mandatory with -f.' )
59 parser.add_argument('-s', '--selector', action="store", default=None,
60 help='Selector for DNS record in dnsfile. Mandatory with -f.' )
37 args=parser.parse_args()61 args=parser.parse_args()
38 if sys.version_info[0] >= 3:62 if sys.version_info[0] >= 3:
39 # Make sys.stdin a binary stream.63 # Make sys.stdin a binary stream.
40 sys.stdin = sys.stdin.detach()64 sys.stdin = sys.stdin.detach()
4165
42 message = sys.stdin.read()66 message = sys.stdin.read()
43 verbose = '-v' in sys.argv67 if args.verbose:
44 if verbose:
45 import logging68 import logging
46 d = dkim.DKIM(message, logger=logging)69 log=logging
70 else:
71 log=None
72 if args.dnsfile:
73 if not args.domain or not args.selector:
74 raise SyntaxError('Both --domain and --selector are required with --dnsfile')
75 dnsfc=filedns(args.dnsfile, args.domain, args.selector)
76 d = dkim.DKIM(message, logger=log, dnsfunc=dnsfc)
47 else:77 else:
48 d = dkim.DKIM(message)78 d = dkim.DKIM(message, logger=log)
49 res = d.verify(args.index)79 res = d.verify(args.index)
50 if not res:80 if not res:
51 print("signature verification failed")81 print("signature verification failed")
diff --git a/dkim/dnsplug.py b/dkim/dnsplug.py
index 5ccf97c..4c75d34 100644
--- a/dkim/dnsplug.py
+++ b/dkim/dnsplug.py
@@ -24,7 +24,6 @@ __all__ = [
24 'get_txt'24 'get_txt'
25 ]25 ]
2626
27
28def get_txt_dnspython(name, timeout=5):27def get_txt_dnspython(name, timeout=5):
29 """Return a TXT record associated with a DNS name."""28 """Return a TXT record associated with a DNS name."""
30 try:29 try:
@@ -78,11 +77,11 @@ except ImportError:
78def get_txt(name, timeout=5):77def get_txt(name, timeout=5):
79 """Return a TXT record associated with a DNS name.78 """Return a TXT record associated with a DNS name.
8079
81 @param name: The bytestring domain name to look up.80 @param name: The string domain name to look up.
82 """81 """
83 # pydns needs Unicode, but DKIM's d= is ASCII (already punycoded).82 # pydns needs Unicode, but DKIM's d= is ASCII (already punycoded).
84 try:83 try:
85 unicode_name = name.decode('UTF-8')84 unicode_name = name.decode('utf-8')
86 except UnicodeDecodeError:85 except UnicodeDecodeError:
87 return None86 return None
88 txt = _get_txt(unicode_name, timeout)87 txt = _get_txt(unicode_name, timeout)
diff --git a/dkim/tests/__init__.py b/dkim/tests/__init__.py
index 4fb2926..50fe90f 100644
--- a/dkim/tests/__init__.py
+++ b/dkim/tests/__init__.py
@@ -24,6 +24,15 @@
24import unittest24import unittest
2525
2626
27def utf8_decode(data):
28 """To decode utf-8 bytestring"""
29 try:
30 data = data.decode('utf-8')
31 except UnicodeDecodeError:
32 return None
33 return data
34
35
27def test_suite():36def test_suite():
28 from dkim.tests import (37 from dkim.tests import (
29 test_canonicalization,38 test_canonicalization,
diff --git a/dkim/tests/data/test_punnycode.message b/dkim/tests/data/test_punnycode.message
30new file mode 10064439new file mode 100644
index 0000000..bece5cc
--- /dev/null
+++ b/dkim/tests/data/test_punnycode.message
@@ -0,0 +1,9 @@
1Authentication-Results: lists.example.org; arc=none; spf=pass smtp.mfrom=jqd@d1.example; dkim=pass (1024-bit key) header.i=@d1.example; dmarc=pass
2Received: from localhost
3Message-ID: <example@example.com>
4Date: Mon, 01 Jan 2011 01:02:03 +0400
5From: UTF8 user <test@xn----ylba7abgd9bnh0e.xn--qxa6a>
6To: somebody@example.com
7Subject: Testing
8
9This is a test message.
diff --git a/dkim/tests/data/test_utf8.message b/dkim/tests/data/test_utf8.message
0new file mode 10064410new file mode 100644
index 0000000..80b6543
--- /dev/null
+++ b/dkim/tests/data/test_utf8.message
@@ -0,0 +1,9 @@
1Authentication-Results: lists.example.org; arc=none; spf=pass smtp.mfrom=jqd@d1.example; dkim=pass (1024-bit key) header.i=@d1.example; dmarc=pass
2Received: from localhost
3Message-ID: <example@example.com>
4Date: Mon, 01 Jan 2011 01:02:03 +0400
5From: UTF8 user <test@κλαρα-σωλις.ευ>
6To: somebody@example.com
7Subject: Testing
8
9This is a test message.
diff --git a/dkim/tests/test_arc.py b/dkim/tests/test_arc.py
index a65c7c3..c07b9ce 100644
--- a/dkim/tests/test_arc.py
+++ b/dkim/tests/test_arc.py
@@ -23,7 +23,7 @@
23import os.path23import os.path
24import unittest24import unittest
25import time25import time
2626from . import utf8_decode
27import dkim27import dkim
2828
2929
@@ -61,9 +61,8 @@ hzY8i+RQ9DpSVpPbF7ykQxtKXkv/ahW3KjViiAH+ghvvIhkx4xYSIc9oSwVmAl5Oct\
61MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\61MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\
62Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB"""62Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB"""
63 }63 }
64 try:64 domain = utf8_decode(domain)
65 domain = domain.decode('ascii')65 if not domain:
66 except UnicodeDecodeError:
67 return None66 return None
68 self.assertTrue(domain in _dns_responses,domain)67 self.assertTrue(domain in _dns_responses,domain)
69 return _dns_responses[domain]68 return _dns_responses[domain]
diff --git a/dkim/tests/test_dkim.py b/dkim/tests/test_dkim.py
index dc589d6..3ce5379 100644
--- a/dkim/tests/test_dkim.py
+++ b/dkim/tests/test_dkim.py
@@ -22,7 +22,7 @@ import unittest
22import time22import time
2323
24import dkim24import dkim
2525from . import utf8_decode
2626
27def read_test_data(filename):27def read_test_data(filename):
28 """Get the content of the given test data file.28 """Get the content of the given test data file.
@@ -61,6 +61,8 @@ class TestSignAndVerify(unittest.TestCase):
61 self.message4 = read_test_data("rfc6376.signed.msg")61 self.message4 = read_test_data("rfc6376.signed.msg")
62 self.message5 = read_test_data("rfc6376.signed.rsa.msg")62 self.message5 = read_test_data("rfc6376.signed.rsa.msg")
63 self.message6 = read_test_data("test.message.baddomain")63 self.message6 = read_test_data("test.message.baddomain")
64 self.messageutf8 = read_test_data("test_utf8.message")
65 self.messagepunycode = read_test_data("test_punnycode.message")
64 self.key = read_test_data("test.private")66 self.key = read_test_data("test.private")
65 self.rfckey = read_test_data("rfc8032_7_1.key")67 self.rfckey = read_test_data("rfc8032_7_1.key")
6668
@@ -81,9 +83,8 @@ hzY8i+RQ9DpSVpPbF7ykQxtKXkv/ahW3KjViiAH+ghvvIhkx4xYSIc9oSwVmAl5Oct\
81MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\83MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\
82Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB"""84Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB"""
83 }85 }
84 try:86 domain = utf8_decode(domain)
85 domain = domain.decode('ascii')87 if not domain:
86 except UnicodeDecodeError:
87 return None88 return None
88 self.assertTrue(domain in _dns_responses,domain)89 self.assertTrue(domain in _dns_responses,domain)
89 return _dns_responses[domain]90 return _dns_responses[domain]
@@ -105,9 +106,8 @@ hzY8i+RQ9DpSVpPbF7ykQxtKXkv/ahW3KjViiAH+ghvvIhkx4xYSIc9oSwVmAl5Oct\
105MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\106MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\
106Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB"""107Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB"""
107 }108 }
108 try:109 domain = utf8_decode(domain)
109 domain = domain.decode('ascii')110 if not domain:
110 except UnicodeDecodeError:
111 return None111 return None
112 self.assertTrue(domain in _dns_responses,domain)112 self.assertTrue(domain in _dns_responses,domain)
113 return _dns_responses[domain]113 return _dns_responses[domain]
@@ -129,9 +129,8 @@ hzY8i+RQ9DpSVpPbF7ykQxtKXkv/ahW3KjViiAH+ghvvIhkx4xYSIc9oSwVmAl5Oct\
129MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\129MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\
130Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB"""130Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB"""
131 }131 }
132 try:132 domain = utf8_decode(domain)
133 domain = domain.decode('ascii')133 if not domain:
134 except UnicodeDecodeError:
135 return None134 return None
136 self.assertTrue(domain in _dns_responses,domain)135 self.assertTrue(domain in _dns_responses,domain)
137 return _dns_responses[domain]136 return _dns_responses[domain]
@@ -153,9 +152,8 @@ hzY8i+RQ9DpSVpPbF7ykQxtKXkv/ahW3KjViiAH+ghvvIhkx4xYSIc9oSwVmAl5Oct\
153MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\152MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\
154Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB"""153Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB"""
155 }154 }
156 try:155 domain = utf8_decode(domain)
157 domain = domain.decode('ascii')156 if not domain:
158 except UnicodeDecodeError:
159 return None157 return None
160 self.assertTrue(domain in _dns_responses,domain)158 self.assertTrue(domain in _dns_responses,domain)
161 return _dns_responses[domain]159 return _dns_responses[domain]
@@ -172,9 +170,8 @@ b/mPfjC0QJTocVBq6Za/PlzfV+Py92VaCak19F4WrbVTK5Gg5tW220MCAwEAAQ=="""
172 'brisbane._domainkey.football.example.com.': """v=DKIM1; k=ed25519; \170 'brisbane._domainkey.football.example.com.': """v=DKIM1; k=ed25519; \
173p=11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo="""171p=11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo="""
174 }172 }
175 try:173 domain = utf8_decode(domain)
176 domain = domain.decode('ascii')174 if not domain:
177 except UnicodeDecodeError:
178 return None175 return None
179 self.assertTrue(domain in _dns_responses,domain)176 self.assertTrue(domain in _dns_responses,domain)
180 return _dns_responses[domain]177 return _dns_responses[domain]
@@ -190,9 +187,8 @@ b/mPfjC0QJTocVBq6Za/PlzfV+Py92VaCak19F4WrbVTK5Gg5tW220MCAwEAAQ=="""
190 'brisbane._domainkey.football.example.com.': """v=DKIM1; k=ed25519; \187 'brisbane._domainkey.football.example.com.': """v=DKIM1; k=ed25519; \
191p=11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo="""188p=11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo="""
192 }189 }
193 try:190 domain = utf8_decode(domain)
194 domain = domain.decode('ascii')191 if not domain:
195 except UnicodeDecodeError:
196 return None192 return None
197 self.assertTrue(domain in _dns_responses,domain)193 self.assertTrue(domain in _dns_responses,domain)
198 return _dns_responses[domain]194 return _dns_responses[domain]
@@ -206,13 +202,32 @@ b/mPfjC0QJTocVBq6Za/PlzfV+Py92VaCak19F4WrbVTK5Gg5tW220MCAwEAAQ=="""
206 _dns_responses = {202 _dns_responses = {
207 'test._domainkey.legitimate.com(.attacker.com.': read_test_data("test.txt"),203 'test._domainkey.legitimate.com(.attacker.com.': read_test_data("test.txt"),
208 }204 }
209 try:205 domain = utf8_decode(domain)
210 domain = domain.decode('ascii')206 if not domain:
211 except UnicodeDecodeError:
212 return None207 return None
213 self.assertTrue(domain in _dns_responses,domain)208 self.assertTrue(domain in _dns_responses,domain)
214 return _dns_responses[domain]209 return _dns_responses[domain]
215210
211 def dnsfuncutf8(self, domain, timeout=5):
212 _dns_responses = {
213 '2022._domainkey.κλαρα-σωλις.ευ.': read_test_data("2048_testkey_PKCS8.key.pub.txt"),
214 'test._domainkey.legitimate.com(.attacker.com.': read_test_data("test.txt"),
215 }
216 domain = utf8_decode(domain)
217 if not domain:
218 return None
219 self.assertTrue(domain in _dns_responses)
220 return _dns_responses[domain]
221
222 def dnsfuncpunycode(self, domain, timeout=5):
223 _dns_response = {
224 '2022._domainkey.xn----ylba7abgd9bnh0e.xn--qxa6a.' : read_test_data("2048_testkey_PKCS8.key.pub.txt")
225 }
226 domain = utf8_decode(domain)
227 if not domain:
228 return None
229 self.assertTrue(domain in _dns_response)
230 return _dns_response[domain]
216231
217 def test_verifies(self):232 def test_verifies(self):
218 # A message verifies after being signed.233 # A message verifies after being signed.
@@ -499,6 +514,26 @@ b/mPfjC0QJTocVBq6Za/PlzfV+Py92VaCak19F4WrbVTK5Gg5tW220MCAwEAAQ==
499 sigerror = True514 sigerror = True
500 self.assertTrue(sigerror)515 self.assertTrue(sigerror)
501516
517 def test_utf_8_verifies(self):
518 # Attempt to verify message with UTF-8 domain.
519 key = read_test_data("2048_testkey_PKCS8.key")
520 for header_algo in (b"simple", b"relaxed"):
521 for body_algo in (b"simple", b"relaxed"):
522 sig = dkim.sign(self.messageutf8, b'2022', "κλαρα-σωλις.ευ".encode('utf-8'), key,
523 canonicalize=(header_algo, body_algo))
524 res = dkim.verify(sig + self.messageutf8, dnsfunc=self.dnsfuncutf8)
525 self.assertTrue(res)
526
527 def test_punnycode_verifies(self):
528 # Attempt to verify message with UTF-8 domain.
529 key = read_test_data("2048_testkey_PKCS8.key")
530 for header_algo in (b"simple", b"relaxed"):
531 for body_algo in (b"simple", b"relaxed"):
532 sig = dkim.sign(self.messagepunycode, b'2022', "xn----ylba7abgd9bnh0e.xn--qxa6a".encode('utf-8'), key,
533 canonicalize=(header_algo, body_algo))
534 res = dkim.verify(sig + self.messagepunycode, dnsfunc=self.dnsfuncpunycode)
535 self.assertTrue(res)
536
502 def test_validate_signature_fields(self):537 def test_validate_signature_fields(self):
503 sig = {b'v': b'1',538 sig = {b'v': b'1',
504 b'a': b'rsa-sha256',539 b'a': b'rsa-sha256',
diff --git a/dkim/tests/test_dkim_ed25519.py b/dkim/tests/test_dkim_ed25519.py
index 5cf89e4..adeea99 100644
--- a/dkim/tests/test_dkim_ed25519.py
+++ b/dkim/tests/test_dkim_ed25519.py
@@ -22,6 +22,7 @@ import os.path
22import unittest22import unittest
23import time23import time
2424
25from . import utf8_decode
25import dkim26import dkim
2627
2728
@@ -72,9 +73,8 @@ p=yi50DjK5O9pqbFpNHklsv9lqaS0ArSYu02qp1S0DW1Y=""",
72 'brisbane._domainkey.football.example.com.': """v=DKIM1; k=ed25519; \73 'brisbane._domainkey.football.example.com.': """v=DKIM1; k=ed25519; \
73p=11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo="""74p=11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo="""
74 }75 }
75 try:76 domain = utf8_decode(domain)
76 domain = domain.decode('ascii')77 if not domain:
77 except UnicodeDecodeError:
78 return None78 return None
79 self.assertTrue(domain in _dns_responses,domain)79 self.assertTrue(domain in _dns_responses,domain)
80 return _dns_responses[domain]80 return _dns_responses[domain]
diff --git a/dkim/tests/test_dkim_generate.py b/dkim/tests/test_dkim_generate.py
index 1649ab5..7063c5b 100644
--- a/dkim/tests/test_dkim_generate.py
+++ b/dkim/tests/test_dkim_generate.py
@@ -23,6 +23,7 @@ import unittest
2323
24import dkim24import dkim
25import dknewkey25import dknewkey
26from . import utf8_decode
2627
27def read_data(path):28def read_data(path):
28 """Get the content of the given test data file."""29 """Get the content of the given test data file."""
@@ -88,9 +89,8 @@ class TestSignAndVerify(unittest.TestCase):
88 _dns_responses = {89 _dns_responses = {
89 'test._domainkey.example.com.': read_data(self.rsa_dns_key_file),90 'test._domainkey.example.com.': read_data(self.rsa_dns_key_file),
90 }91 }
91 try:92 domain = utf8_decode(domain)
92 domain = domain.decode('ascii')93 if not domain:
93 except UnicodeDecodeError:
94 return None94 return None
95 self.assertTrue(domain in _dns_responses,domain)95 self.assertTrue(domain in _dns_responses,domain)
96 return _dns_responses[domain]96 return _dns_responses[domain]
@@ -99,9 +99,8 @@ class TestSignAndVerify(unittest.TestCase):
99 _dns_responses = {99 _dns_responses = {
100 'test1._domainkey.example.com.': read_data(self.ed25519_dns_key_file),100 'test1._domainkey.example.com.': read_data(self.ed25519_dns_key_file),
101 }101 }
102 try:102 domain = utf8_decode(domain)
103 domain = domain.decode('ascii')103 if not domain:
104 except UnicodeDecodeError:
105 return None104 return None
106 self.assertTrue(domain in _dns_responses,domain)105 self.assertTrue(domain in _dns_responses,domain)
107 return _dns_responses[domain]106 return _dns_responses[domain]
diff --git a/dkim/tests/test_dkim_rsavariants.py b/dkim/tests/test_dkim_rsavariants.py
index 992d466..a230b3a 100644
--- a/dkim/tests/test_dkim_rsavariants.py
+++ b/dkim/tests/test_dkim_rsavariants.py
@@ -22,6 +22,7 @@ import unittest
22import time22import time
2323
24import dkim24import dkim
25from . import utf8_decode
2526
2627
27def read_test_data(filename):28def read_test_data(filename):
@@ -51,9 +52,8 @@ class TestSignAndVerify(unittest.TestCase):
51 'test4._domainkey.example.com.': read_test_data("2048_testkey_wo_markers.pub.rsa.txt"),52 'test4._domainkey.example.com.': read_test_data("2048_testkey_wo_markers.pub.rsa.txt"),
52 'test5._domainkey.example.com.': read_test_data("2048_testkey_PKCS8.key.pub.txt")53 'test5._domainkey.example.com.': read_test_data("2048_testkey_PKCS8.key.pub.txt")
53 }54 }
54 try:55 domain = utf8_decode(domain)
55 domain = domain.decode('ascii')56 if not domain:
56 except UnicodeDecodeError:
57 return None57 return None
58 self.assertTrue(domain in _dns_responses,domain)58 self.assertTrue(domain in _dns_responses,domain)
59 return _dns_responses[domain]59 return _dns_responses[domain]
diff --git a/dkim/tests/test_dkim_tlsrpt.py b/dkim/tests/test_dkim_tlsrpt.py
index 83b31b6..2684885 100644
--- a/dkim/tests/test_dkim_tlsrpt.py
+++ b/dkim/tests/test_dkim_tlsrpt.py
@@ -22,6 +22,7 @@ import unittest
22import time22import time
2323
24import dkim24import dkim
25from . import utf8_decode
2526
2627
27def read_test_data(filename):28def read_test_data(filename):
@@ -79,9 +80,8 @@ hzY8i+RQ9DpSVpPbF7ykQxtKXkv/ahW3KjViiAH+ghvvIhkx4xYSIc9oSwVmAl5Oct\
79MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\80MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\
80Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB"""81Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB"""
81 }82 }
82 try:83 domain = utf8_decode(domain)
83 domain = domain.decode('ascii')84 if not domain:
84 except UnicodeDecodeError:
85 return None85 return None
86 self.assertTrue(domain in _dns_responses,domain)86 self.assertTrue(domain in _dns_responses,domain)
87 return _dns_responses[domain]87 return _dns_responses[domain]
@@ -103,9 +103,8 @@ hzY8i+RQ9DpSVpPbF7ykQxtKXkv/ahW3KjViiAH+ghvvIhkx4xYSIc9oSwVmAl5Oct\
103MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\103MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\
104Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB"""104Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB"""
105 }105 }
106 try:106 domain = utf8_decode(domain)
107 domain = domain.decode('ascii')107 if not domain:
108 except UnicodeDecodeError:
109 return None108 return None
110 self.assertTrue(domain in _dns_responses,domain)109 self.assertTrue(domain in _dns_responses,domain)
111 return _dns_responses[domain]110 return _dns_responses[domain]
@@ -127,9 +126,8 @@ hzY8i+RQ9DpSVpPbF7ykQxtKXkv/ahW3KjViiAH+ghvvIhkx4xYSIc9oSwVmAl5Oct\
127MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\126MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\
128Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB"""127Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB"""
129 }128 }
130 try:129 domain = utf8_decode(domain)
131 domain = domain.decode('ascii')130 if not domain:
132 except UnicodeDecodeError:
133 return None131 return None
134 self.assertTrue(domain in _dns_responses,domain)132 self.assertTrue(domain in _dns_responses,domain)
135 return _dns_responses[domain]133 return _dns_responses[domain]
@@ -151,9 +149,8 @@ hzY8i+RQ9DpSVpPbF7ykQxtKXkv/ahW3KjViiAH+ghvvIhkx4xYSIc9oSwVmAl5Oct\
151MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\149MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\
152Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB"""150Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB"""
153 }151 }
154 try:152 domain = utf8_decode(domain)
155 domain = domain.decode('ascii')153 if not domain:
156 except UnicodeDecodeError:
157 return None154 return None
158 self.assertTrue(domain in _dns_responses,domain)155 self.assertTrue(domain in _dns_responses,domain)
159 return _dns_responses[domain]156 return _dns_responses[domain]
@@ -170,9 +167,8 @@ b/mPfjC0QJTocVBq6Za/PlzfV+Py92VaCak19F4WrbVTK5Gg5tW220MCAwEAAQ=="""
170 'brisbane._domainkey.football.example.com.': """v=DKIM1; k=ed25519; \167 'brisbane._domainkey.football.example.com.': """v=DKIM1; k=ed25519; \
171p=11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo="""168p=11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo="""
172 }169 }
173 try:170 domain = utf8_decode(domain)
174 domain = domain.decode('ascii')171 if not domain:
175 except UnicodeDecodeError:
176 return None172 return None
177 self.assertTrue(domain in _dns_responses,domain)173 self.assertTrue(domain in _dns_responses,domain)
178 return _dns_responses[domain]174 return _dns_responses[domain]
@@ -194,9 +190,8 @@ hzY8i+RQ9DpSVpPbF7ykQxtKXkv/ahW3KjViiAH+ghvvIhkx4xYSIc9oSwVmAl5Oct\
194MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\190MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\
195Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB"""191Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB"""
196 }192 }
197 try:193 domain = utf8_decode(domain)
198 domain = domain.decode('ascii')194 if not domain:
199 except UnicodeDecodeError:
200 return None195 return None
201 self.assertTrue(domain in _dns_responses,domain)196 self.assertTrue(domain in _dns_responses,domain)
202 return _dns_responses[domain]197 return _dns_responses[domain]

Subscribers

People subscribed via source and target branches

to all changes: