Broken with Python 3.7

Bug #1800313 reported by Scott Kitterman
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
dkimpy
Fix Released
High
Scott Kitterman

Bug Description

Reported broken with Python 3.7.0 on MacOS and 3.7.1 on Linux. Works fine with Python 3.6 and Python 2.7 on multiple OS.

$ python3.7 test.py
..........F.FFFFF....FFFFF..............F...E.E............F......E....F........F.
======================================================================
ERROR: test_degenerate_folding (dkim.tests.test_dkim.TestSignAndVerify)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/dkimpy.upstream/dkim/tests/test_dkim.py", line 341, in test_degenerate_folding
    res = dv.verify(dnsfunc=self.dnsfunc)
  File "/home/dkimpy.upstream/dkim/__init__.py", line 808, in verify
    return self.verify_sig(sig, include_headers, sigheaders[idx], dnsfunc)
  File "/home/dkimpy.upstream/dkim/__init__.py", line 637, in verify_sig
    (base64.b64encode(bodyhash), sig[b'bh']))
dkim.ValidationError: body hash mismatch (got b'wm8y8E9SxUZ9nWrbbNn3PwkzdWYQnLKtG8VDOUZFees=', expected b'NRDGmXYX648Rm6cs06aAQIE77gu68nsSHYB4kAMm7QQ=')

======================================================================
ERROR: test_double_previous_verifies (dkim.tests.test_dkim.TestSignAndVerify)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/dkimpy.upstream/dkim/tests/test_dkim.py", line 203, in test_double_previous_verifies
    res = d.verify(dnsfunc=self.dnsfunc5)
  File "/home/dkimpy.upstream/dkim/__init__.py", line 808, in verify
    return self.verify_sig(sig, include_headers, sigheaders[idx], dnsfunc)
  File "/home/dkimpy.upstream/dkim/__init__.py", line 637, in verify_sig
    (base64.b64encode(bodyhash), sig[b'bh']))
dkim.ValidationError: body hash mismatch (got b'7CL0x78oCH048LBhdMvNCncQVOWB/f7S4ARXw140j1s=', expected b'4bLNXImK9drULnmePzZNEBleUanJCX5PIsDIFoH4KTQ=')

======================================================================
ERROR: test_rfc8032_previous_verifies (dkim.tests.test_dkim_ed25519.TestSignAndVerify)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/dkimpy.upstream/dkim/tests/test_dkim_ed25519.py", line 110, in test_rfc8032_previous_verifies
    res = d.verify(dnsfunc=self.dnsfunc)
  File "/home/dkimpy.upstream/dkim/__init__.py", line 808, in verify
    return self.verify_sig(sig, include_headers, sigheaders[idx], dnsfunc)
  File "/home/dkimpy.upstream/dkim/__init__.py", line 637, in verify_sig
    (base64.b64encode(bodyhash), sig[b'bh']))
dkim.ValidationError: body hash mismatch (got b'7CL0x78oCH048LBhdMvNCncQVOWB/f7S4ARXw140j1s=', expected b'4bLNXImK9drULnmePzZNEBleUanJCX5PIsDIFoH4KTQ=')

======================================================================
FAIL: test_adds_crlf (dkim.tests.test_canonicalization.TestRelaxedAlgorithmBody)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/dkimpy.upstream/dkim/tests/test_canonicalization.py", line 124, in test_adds_crlf
    b'Foo bar')
  File "/home/dkimpy.upstream/dkim/tests/test_canonicalization.py", line 32, in assertCanonicalForm
    self.assertEqual(expected, self.func(expected))
AssertionError: b'Foo bar\r\n' != b'Foo bar\r\n\r\n'

======================================================================
FAIL: test_multiple_crlf_body (dkim.tests.test_canonicalization.TestRelaxedAlgorithmBody)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/dkimpy.upstream/dkim/tests/test_canonicalization.py", line 139, in test_multiple_crlf_body
    b'\r\n\r\n')
  File "/home/dkimpy.upstream/dkim/tests/test_canonicalization.py", line 33, in assertCanonicalForm
    self.assertEqual(expected, self.func(input))
AssertionError: b'' != b'\r\n\r\n'

======================================================================
FAIL: test_single_crlf_body (dkim.tests.test_canonicalization.TestRelaxedAlgorithmBody)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/dkimpy.upstream/dkim/tests/test_canonicalization.py", line 134, in test_single_crlf_body
    b'\r\n')
  File "/home/dkimpy.upstream/dkim/tests/test_canonicalization.py", line 33, in assertCanonicalForm
    self.assertEqual(expected, self.func(input))
AssertionError: b'' != b'\r\n\r\n'

======================================================================
FAIL: test_strips_trailing_empty_lines (dkim.tests.test_canonicalization.TestRelaxedAlgorithmBody)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/dkimpy.upstream/dkim/tests/test_canonicalization.py", line 119, in test_strips_trailing_empty_lines
    b'Foo\r\nbar\r\n\r\n\r\n')
  File "/home/dkimpy.upstream/dkim/tests/test_canonicalization.py", line 32, in assertCanonicalForm
    self.assertEqual(expected, self.func(expected))
AssertionError: b'Foo\r\nbar\r\n' != b'Foo\r\nbar\r\n\r\n'

======================================================================
FAIL: test_strips_trailing_wsp (dkim.tests.test_canonicalization.TestRelaxedAlgorithmBody)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/dkimpy.upstream/dkim/tests/test_canonicalization.py", line 109, in test_strips_trailing_wsp
    b'Foo \t\r\nbar\r\n')
  File "/home/dkimpy.upstream/dkim/tests/test_canonicalization.py", line 32, in assertCanonicalForm
    self.assertEqual(expected, self.func(expected))
AssertionError: b'Foo\r\nbar\r\n' != b'Foo\r\nbar\r\n\r\n'

======================================================================
FAIL: test_wsp_compresses (dkim.tests.test_canonicalization.TestRelaxedAlgorithmBody)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/dkimpy.upstream/dkim/tests/test_canonicalization.py", line 114, in test_wsp_compresses
    b'Foo \t bar\r\n')
  File "/home/dkimpy.upstream/dkim/tests/test_canonicalization.py", line 32, in assertCanonicalForm
    self.assertEqual(expected, self.func(expected))
AssertionError: b'Foo bar\r\n' != b'Foo bar\r\n\r\n'

======================================================================
FAIL: test_adds_crlf (dkim.tests.test_canonicalization.TestSimpleAlgorithmBody)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/dkimpy.upstream/dkim/tests/test_canonicalization.py", line 59, in test_adds_crlf
    b'Foo bar')
  File "/home/dkimpy.upstream/dkim/tests/test_canonicalization.py", line 32, in assertCanonicalForm
    self.assertEqual(expected, self.func(expected))
AssertionError: b'Foo bar\r\n' != b'Foo bar\r\n\r\n'

======================================================================
FAIL: test_empty_body (dkim.tests.test_canonicalization.TestSimpleAlgorithmBody)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/dkimpy.upstream/dkim/tests/test_canonicalization.py", line 64, in test_empty_body
    b'')
  File "/home/dkimpy.upstream/dkim/tests/test_canonicalization.py", line 32, in assertCanonicalForm
    self.assertEqual(expected, self.func(expected))
AssertionError: b'\r\n' != b'\r\n\r\n'

======================================================================
FAIL: test_multiple_crlf_body (dkim.tests.test_canonicalization.TestSimpleAlgorithmBody)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/dkimpy.upstream/dkim/tests/test_canonicalization.py", line 74, in test_multiple_crlf_body
    b'\r\n\r\n')
  File "/home/dkimpy.upstream/dkim/tests/test_canonicalization.py", line 32, in assertCanonicalForm
    self.assertEqual(expected, self.func(expected))
AssertionError: b'\r\n' != b'\r\n\r\n'

======================================================================
FAIL: test_single_crlf_body (dkim.tests.test_canonicalization.TestSimpleAlgorithmBody)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/dkimpy.upstream/dkim/tests/test_canonicalization.py", line 69, in test_single_crlf_body
    b'\r\n')
  File "/home/dkimpy.upstream/dkim/tests/test_canonicalization.py", line 32, in assertCanonicalForm
    self.assertEqual(expected, self.func(expected))
AssertionError: b'\r\n' != b'\r\n\r\n'

======================================================================
FAIL: test_strips_trailing_empty_lines_from_body (dkim.tests.test_canonicalization.TestSimpleAlgorithmBody)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/dkimpy.upstream/dkim/tests/test_canonicalization.py", line 54, in test_strips_trailing_empty_lines_from_body
    b'Foo \tbar \r\n\r\n')
  File "/home/dkimpy.upstream/dkim/tests/test_canonicalization.py", line 32, in assertCanonicalForm
    self.assertEqual(expected, self.func(expected))
AssertionError: b'Foo \tbar \r\n' != b'Foo \tbar \r\n\r\n'

======================================================================
FAIL: test_add_body_length (dkim.tests.test_dkim.TestSignAndVerify)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/dkimpy.upstream/dkim/tests/test_dkim.py", line 262, in test_add_body_length
    self.assertIn('; l=%s' % len(msg.get_payload() + '\n'), sig.decode('utf-8'))
AssertionError: '; l=25' not found in 'DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=example.com; \r\n <email address hidden>; l=27; q=dns/txt; s=test; t=1540686427; \r\n h=message-id : date : from : to : subject : date : from : \r\n subject; bh=xrKtCJzR7O8EgNdBiUe+b1zc0Z2b1/DIBEsDAd75jzE=; \r\n b=a5BnGcImqfAY8VSC7W2FiUANgrbGnUQ+XHhdCd0ldN65Kjd0aVPyYQhb\r\n NlgMGk31FKU1VwjrisfJRD8CICHbmjg3YoHczmerxvUS63Wd78VldrMsSx\r\n 63T1sUBTYzTc540AX7cek/Oi0luJEefk3++BZifz7MjCyKqnIp2Vl456I=\r\n \r\n'

======================================================================
FAIL: test_add_body_length (dkim.tests.test_dkim_ed25519.TestSignAndVerify)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/dkimpy.upstream/dkim/tests/test_dkim_ed25519.py", line 135, in test_add_body_length
    self.assertIn('; l=%s' % len(msg.get_payload() + '\n'), sig.decode('utf-8'))
AssertionError: '; l=25' not found in 'DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/simple; d=example.net; \r\n <email address hidden>; l=27; q=dns/txt; s=test; t=1540686427; \r\n h=message-id : date : from : to : subject : date : from : \r\n subject; bh=xrKtCJzR7O8EgNdBiUe+b1zc0Z2b1/DIBEsDAd75jzE=; \r\n b=gr7D3BQhk9v3qPuUEm+rxXSyYM82JPY9WJlu47WBEXX4HdX1Emd9RrNQ\r\n YxMfyH/b3zSdjqAxLxUaftSmyQc7Aw==\r\n'

======================================================================
FAIL: test_verify_third_party (dkim.tests.test_dkim_ed25519.TestSignAndVerify)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/dkimpy.upstream/dkim/tests/test_dkim_ed25519.py", line 128, in test_verify_third_party
    self.assertTrue(res)
AssertionError: False is not true

======================================================================
FAIL: test_signs_and_verifies (dkim.tests.test_arc.TestSignAndVerify)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/dkimpy.upstream/dkim/tests/test_arc.py", line 78, in test_signs_and_verifies
    self.assertEqual(expected_sig, sig_lines)
AssertionError: Lists differ: [b'AR[70 chars]\n b=3jOfBfTKcq+3r3Xv158DybT4mWFxrGcop+cgyLUX2[753 chars]r\n'] != [b'AR[70 chars]\n b=RQjyYJ5GWtrJkRQ0JHe8D8z+AH8iCzyGckywzrDo5[753 chars]r\n']

First differing element 0:
b'ARC[69 chars]\n b=3jOfBfTKcq+3r3Xv158DybT4mWFxrGcop+cgyLUX2[141 chars]\r\n'
b'ARC[69 chars]\n b=RQjyYJ5GWtrJkRQ0JHe8D8z+AH8iCzyGckywzrDo5[141 chars]\r\n'

Diff is 1477 characters long. Set self.maxDiff to None to see it.

----------------------------------------------------------------------
Ran 82 tests in 0.196s

FAILED (failures=15, errors=3)
F
======================================================================
FAIL: test_signs_and_verifies (dkim.tests.test_arc.TestSignAndVerify)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/dkimpy.upstream/dkim/tests/test_arc.py", line 78, in test_signs_and_verifies
    self.assertEqual(expected_sig, sig_lines)
AssertionError: Lists differ: [b'AR[70 chars]\n b=3jOfBfTKcq+3r3Xv158DybT4mWFxrGcop+cgyLUX2[753 chars]r\n'] != [b'AR[70 chars]\n b=RQjyYJ5GWtrJkRQ0JHe8D8z+AH8iCzyGckywzrDo5[753 chars]r\n']

First differing element 0:
b'ARC[69 chars]\n b=3jOfBfTKcq+3r3Xv158DybT4mWFxrGcop+cgyLUX2[141 chars]\r\n'
b'ARC[69 chars]\n b=RQjyYJ5GWtrJkRQ0JHe8D8z+AH8iCzyGckywzrDo5[141 chars]\r\n'

Diff is 1477 characters long. Set self.maxDiff to None to see it.

----------------------------------------------------------------------
Ran 1 test in 0.008s

FAILED (failures=1)

Changed in dkimpy:
status: New → Triaged
importance: Undecided → High
Revision history for this message
Scott Kitterman (kitterman) wrote :

commit 3c2beaf70ecd39b28e1d6ea64870ed2343bfb4ba
Author: Scott Kitterman <email address hidden>
Date: Mon Oct 29 19:53:12 2018 -0400

        - Python 3.7 compatibility fixup for dkim.canonicalization.
          strip_trailing_lines due to changed RE.sub() processing (LP: #1800313)

Changed in dkimpy:
assignee: nobody → Scott Kitterman (kitterman)
status: Triaged → Fix Committed
Revision history for this message
Scott Kitterman (kitterman) wrote :

Fixed in 0.9.0.

Changed in dkimpy:
status: Fix Committed → Fix Released
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.