1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 from __future__ import print_function
26
27 import sys
28 import argparse
29
30 import dkim
31
32
34
35
36 arguments=['--'+arg if arg[:8] == 'identity' else arg for arg in sys.argv[1:]]
37 parser = argparse.ArgumentParser(
38 description='Produce DKIM signature for email messages.',
39 epilog="message to be signed follows commands on stdin")
40 parser.add_argument('selector', action="store")
41 parser.add_argument('domain', action="store")
42 parser.add_argument('privatekeyfile', action="store")
43 parser.add_argument('--hcanon', choices=['simple', 'relaxed'],
44 default='relaxed',
45 help='Header canonicalization algorithm: default=relaxed')
46 parser.add_argument('--bcanon', choices=['simple', 'relaxed'],
47 default='simple',
48 help='Body canonicalization algorithm: default=simple')
49 parser.add_argument('--signalg', choices=['rsa-sha256', 'ed25519-sha256', 'rsa-sha1'],
50 default='rsa-sha256',
51 help='Signature algorithm: default=rsa-sha256')
52 parser.add_argument('--identity', help='Optional value for i= tag.')
53 args=parser.parse_args(arguments)
54 include_headers = None
55 length = None
56 logger = None
57
58 if sys.version_info[0] >= 3:
59 args.selector = bytes(args.selector, encoding='UTF-8')
60 args.domain = bytes(args.domain, encoding='UTF-8')
61 if args.identity is not None:
62 args.identity = bytes(args.identity, encoding='UTF-8')
63 args.hcanon = bytes(args.hcanon, encoding='UTF-8')
64 args.bcanon = bytes(args.bcanon, encoding='UTF-8')
65 args.signalg = bytes(args.signalg, encoding='UTF-8')
66
67 sys.stdin = sys.stdin.detach()
68 sys.stdout = sys.stdout.detach()
69 canonicalize = (args.hcanon, args.bcanon)
70
71 message = sys.stdin.read()
72 try:
73 d = dkim.DKIM(message,logger=logger, signature_algorithm=args.signalg,
74 linesep=dkim.util.get_linesep(message))
75 sig = d.sign(args.selector, args.domain, open(
76 args.privatekeyfile, "rb").read(), identity = args.identity,
77 canonicalize=canonicalize, include_headers=include_headers,
78 length=length)
79 sys.stdout.write(sig)
80 sys.stdout.write(message)
81 except Exception as e:
82 print(e, file=sys.stderr)
83 sys.stdout.write(message)
84
85
86 if __name__ == "__main__":
87 main()
88