1   
  2   
  3   
  4   
  5   
  6   
  7   
  8   
  9   
 10   
 11   
 12   
 13   
 14   
 15   
 16   
 17   
 18   
 19  import email 
 20  import os.path 
 21  import unittest 
 22  import time 
 23   
 24  import dkim 
 25   
 26   
 28      """Get the content of the given test data file. 
 29   
 30      The files live in dkim/tests/data. 
 31      """ 
 32      path = os.path.join(os.path.dirname(__file__), 'data', filename) 
 33      with open(path, 'rb') as f: 
 34          return f.read() 
  35   
 36   
 38   
 40          self.assertEqual( 
 41              b"foo", dkim.fold(b"foo")) 
  42   
 44           
 45           
 46          self.assertEqual( 
 47              b"foo" * 24 + b"\r\n foo", dkim.fold(b"foo" * 25)) 
  48   
 50          self.assertEqual( 
 51              b"foo" * 24 + b"\n foo", dkim.fold(b"foo" * 25, linesep=b"\n")) 
   52   
 53   
 54   
 56      """End-to-end signature and verification tests.""" 
 57   
 64   
 65 -    def dnsfunc(self, domain, timeout=5): 
  66          sample_dns = """\ 
 67  k=rsa; s=email;\ 
 68  p=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANmBe10IgY+u7h3enWTukkqtUD5PR52T\ 
 69  b/mPfjC0QJTocVBq6Za/PlzfV+Py92VaCak19F4WrbVTK5Gg5tW220MCAwEAAQ==""" 
 70   
 71          _dns_responses = { 
 72            'example._domainkey.canonical.com.': sample_dns, 
 73            'test._domainkey.example.com.': read_test_data("test.txt"), 
 74            '20120113._domainkey.gmail.com.': """k=rsa; \ 
 75  p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1Kd87/UeJjenpabgbFwh\ 
 76  +eBCsSTrqmwIYYvywlbhbqoo2DymndFkbjOVIPIldNs/m40KF+yzMn1skyoxcTUGCQ\ 
 77  s8g3FgD2Ap3ZB5DekAo5wMmk4wimDO+U8QzI3SD07y2+07wlNWwIt8svnxgdxGkVbb\ 
 78  hzY8i+RQ9DpSVpPbF7ykQxtKXkv/ahW3KjViiAH+ghvvIhkx4xYSIc9oSwVmAl5Oct\ 
 79  MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\ 
 80  Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB""" 
 81          } 
 82          try: 
 83              domain = domain.decode('ascii') 
 84          except UnicodeDecodeError: 
 85              return None 
 86          self.assertTrue(domain in _dns_responses,domain) 
 87          return _dns_responses[domain] 
  88   
 90          sample_dns = """\ 
 91  k=rsa; \ 
 92  p=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANmBe10IgY+u7h3enWTukkqtUD5PR52T\ 
 93  b/mPfjC0QJTocVBq6Za/PlzfV+Py92VaCak19F4WrbVTK5Gg5tW220MCAwEAAQ==""" 
 94   
 95          _dns_responses = { 
 96            'example._domainkey.canonical.com.': sample_dns, 
 97            'test._domainkey.example.com.': read_test_data("test2.txt"), 
 98            '20120113._domainkey.gmail.com.': """\ 
 99  p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1Kd87/UeJjenpabgbFwh\ 
100  +eBCsSTrqmwIYYvywlbhbqoo2DymndFkbjOVIPIldNs/m40KF+yzMn1skyoxcTUGCQ\ 
101  s8g3FgD2Ap3ZB5DekAo5wMmk4wimDO+U8QzI3SD07y2+07wlNWwIt8svnxgdxGkVbb\ 
102  hzY8i+RQ9DpSVpPbF7ykQxtKXkv/ahW3KjViiAH+ghvvIhkx4xYSIc9oSwVmAl5Oct\ 
103  MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\ 
104  Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB""" 
105          } 
106          try: 
107              domain = domain.decode('ascii') 
108          except UnicodeDecodeError: 
109              return None 
110          self.assertTrue(domain in _dns_responses,domain) 
111          return _dns_responses[domain] 
 112   
114          sample_dns = """\ 
115  k=rsa; \ 
116  p=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANmBe10IgY+u7h3enWTukkqtUD5PR52T\ 
117  b/mPfjC0QJTocVBq6Za/PlzfV+Py92VaCak19F4WrbVTK5Gg5tW220MCAwEAAQ==""" 
118   
119          _dns_responses = { 
120            'example._domainkey.canonical.com.': sample_dns, 
121            'test._domainkey.example.com.': read_test_data("badversion.txt"), 
122            '20120113._domainkey.gmail.com.': """\ 
123  p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1Kd87/UeJjenpabgbFwh\ 
124  +eBCsSTrqmwIYYvywlbhbqoo2DymndFkbjOVIPIldNs/m40KF+yzMn1skyoxcTUGCQ\ 
125  s8g3FgD2Ap3ZB5DekAo5wMmk4wimDO+U8QzI3SD07y2+07wlNWwIt8svnxgdxGkVbb\ 
126  hzY8i+RQ9DpSVpPbF7ykQxtKXkv/ahW3KjViiAH+ghvvIhkx4xYSIc9oSwVmAl5Oct\ 
127  MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\ 
128  Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB""" 
129          } 
130          try: 
131              domain = domain.decode('ascii') 
132          except UnicodeDecodeError: 
133              return None 
134          self.assertTrue(domain in _dns_responses,domain) 
135          return _dns_responses[domain] 
 136   
138          sample_dns = """\ 
139  k=rsa; \ 
140  p=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANmBe10IgY+u7h3enWTukkqtUD5PR52T\ 
141  b/mPfjC0QJTocVBq6Za/PlzfV+Py92VaCak19F4WrbVTK5Gg5tW220MCAwEAAQ==""" 
142   
143          _dns_responses = { 
144            'example._domainkey.canonical.com.': sample_dns, 
145            'test._domainkey.example.com.': read_test_data("badk.txt"), 
146            '20120113._domainkey.gmail.com.': """\ 
147  p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1Kd87/UeJjenpabgbFwh\ 
148  +eBCsSTrqmwIYYvywlbhbqoo2DymndFkbjOVIPIldNs/m40KF+yzMn1skyoxcTUGCQ\ 
149  s8g3FgD2Ap3ZB5DekAo5wMmk4wimDO+U8QzI3SD07y2+07wlNWwIt8svnxgdxGkVbb\ 
150  hzY8i+RQ9DpSVpPbF7ykQxtKXkv/ahW3KjViiAH+ghvvIhkx4xYSIc9oSwVmAl5Oct\ 
151  MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\ 
152  Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB""" 
153          } 
154          try: 
155              domain = domain.decode('ascii') 
156          except UnicodeDecodeError: 
157              return None 
158          self.assertTrue(domain in _dns_responses,domain) 
159          return _dns_responses[domain] 
 160   
162          sample_dns = """\ 
163  k=rsa; \ 
164  p=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANmBe10IgY+u7h3enWTukkqtUD5PR52T\ 
165  b/mPfjC0QJTocVBq6Za/PlzfV+Py92VaCak19F4WrbVTK5Gg5tW220MCAwEAAQ==""" 
166   
167          _dns_responses = { 
168            'example._domainkey.canonical.com.': sample_dns, 
169            'test._domainkey.football.example.com.': read_test_data("test.txt"), 
170            'brisbane._domainkey.football.example.com.': """v=DKIM1; k=ed25519; \ 
171  p=11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo=""" 
172          } 
173          try: 
174              domain = domain.decode('ascii') 
175          except UnicodeDecodeError: 
176              return None 
177          self.assertTrue(domain in _dns_responses,domain) 
178          return _dns_responses[domain] 
 179   
181          sample_dns = """\ 
182  k=rsa; s=email;\ 
183  p=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANmBe10IgY+u7h3enWTukkqtUD5PR52T\ 
184  b/mPfjC0QJTocVBq6Za/PlzfV+Py92VaCak19F4WrbVTK5Gg5tW220MCAwEAAQ==""" 
185   
186          _dns_responses = { 
187            'example._domainkey.canonical.com.': sample_dns, 
188            'test._domainkey.example.com.': read_test_data("test_tlsrpt.txt"), 
189            '20120113._domainkey.gmail.com.': """k=rsa; \ 
190  p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1Kd87/UeJjenpabgbFwh\ 
191  +eBCsSTrqmwIYYvywlbhbqoo2DymndFkbjOVIPIldNs/m40KF+yzMn1skyoxcTUGCQ\ 
192  s8g3FgD2Ap3ZB5DekAo5wMmk4wimDO+U8QzI3SD07y2+07wlNWwIt8svnxgdxGkVbb\ 
193  hzY8i+RQ9DpSVpPbF7ykQxtKXkv/ahW3KjViiAH+ghvvIhkx4xYSIc9oSwVmAl5Oct\ 
194  MEeWUwg8Istjqz8BZeTWbf41fbNhte7Y+YqZOwq1Sd0DbvYAD9NOZK9vlfuac0598H\ 
195  Y+vtSBczUiKERHv1yRbcaQtZFh5wtiRrN04BLUTD21MycBX5jYchHjPY/wIDAQAB""" 
196          } 
197          try: 
198              domain = domain.decode('ascii') 
199          except UnicodeDecodeError: 
200              return None 
201          self.assertTrue(domain in _dns_responses,domain) 
202          return _dns_responses[domain] 
 203   
204   
205   
206   
208           
209          for header_algo in (b"simple", b"relaxed"): 
210              for body_algo in (b"simple", b"relaxed"): 
211                  sig = dkim.sign( 
212                      self.message, b"test", b"example.com", self.key, 
213                      canonicalize=(header_algo, body_algo)) 
214                  res = dkim.verify(sig + self.message, dnsfunc=self.dnsfunc6) 
215                  self.assertFalse(res) 
 216   
218           
219          for header_algo in (b"simple", b"relaxed"): 
220              for body_algo in (b"simple", b"relaxed"): 
221                  sig = dkim.sign( 
222                      self.message, b"test", b"example.com", self.key, 
223                      canonicalize=(header_algo, body_algo)) 
224                  res = dkim.verify(sig + self.message, dnsfunc=self.dnsfunc6, tlsrpt='strict') 
225                  self.assertTrue(res) 
 226   
228           
229          for header_algo in (b"simple", b"relaxed"): 
230              for body_algo in (b"simple", b"relaxed"): 
231                  sig = dkim.sign( 
232                      self.message, b"test", b"example.com", self.key, 
233                      canonicalize=(header_algo, body_algo)) 
234                  res = dkim.verify(sig + self.message, dnsfunc=self.dnsfunc6, tlsrpt=True) 
235                  self.assertTrue(res) 
 236   
238           
239          for header_algo in (b"simple", b"relaxed"): 
240              for body_algo in (b"simple", b"relaxed"): 
241                  sig = dkim.sign( 
242                      self.message, b"test", b"example.com", self.key, 
243                      canonicalize=(header_algo, body_algo)) 
244                  res = dkim.verify(sig + self.message, dnsfunc=self.dnsfunc, tlsrpt='strict') 
245                  self.assertFalse(res) 
 246   
248           
249          for header_algo in (b"simple", b"relaxed"): 
250              for body_algo in (b"simple", b"relaxed"): 
251                  sig = dkim.sign( 
252                      self.message, b"test", b"example.com", self.key, 
253                      canonicalize=(header_algo, body_algo)) 
254                  res = dkim.verify(sig + self.message, dnsfunc=self.dnsfunc, tlsrpt=True) 
255                  self.assertTrue(res) 
 256   
258           
259          for header_algo in (b"simple", b"relaxed"): 
260              for body_algo in (b"simple", b"relaxed"): 
261                  sig = dkim.sign( 
262                      self.message, b"test", b"example.com", self.key, 
263                      canonicalize=(header_algo, body_algo), length=True) 
264                  self.message += b'added more text' 
265                  res = dkim.verify(sig + self.message, dnsfunc=self.dnsfunc, tlsrpt=True) 
266                  self.assertFalse(res) 
 267   
269           
270          for header_algo in (b"simple", b"relaxed"): 
271              for body_algo in (b"simple", b"relaxed"): 
272                  sig = dkim.sign( 
273                      self.message, b"test", b"example.com", self.key, 
274                      canonicalize=(header_algo, body_algo), length=True, tlsrpt=True) 
275                  self.message += b'added more text' 
276                  res = dkim.verify(sig + self.message, dnsfunc=self.dnsfunc) 
277                  self.assertFalse(res) 
  278   
279   
281      from unittest import TestLoader 
282      return TestLoader().loadTestsFromName(__name__) 
 283