Ticket #8079: timing.py

File timing.py, 1.5 KB (added by mark williams, 3 years ago)
Line 
1import argparse
2import sys
3import time
4
5from cryptography.hazmat.backends.openssl import backend
6from cryptography.hazmat.bindings.openssl import binding
7
8from twisted.python import randbytes
9from twisted.conch.ssh.transport import _getRandomNumber
10from twisted.conch.ssh import _kex
11
12
13def ygp():
14    y = _getRandomNumber(randbytes.secureRandom, 512)
15    g, p = _kex.getDHGeneratorAndPrime(
16        b"diffie-hellman-group14-sha1")
17    return y, g, p
18
19
20_binding = binding.Binding()
21_lib = _binding.lib
22bn_ctx = _lib.BN_CTX_new()
23_lib.BN_CTX_start(bn_ctx)
24
25
26def python(g, y, p):
27    pow(g, y, p)
28
29
30def openssl(g, y, p):
31    _y = backend._int_to_bn(y)
32    _g = backend._int_to_bn(g)
33    _p = backend._int_to_bn(p)
34
35    _r = _lib.BN_CTX_get(bn_ctx)
36
37    _lib.BN_mod_exp(_r, _g, _y, _p, bn_ctx)
38
39
40def test(func, iterations):
41    for _ in range(iterations):
42        y, g, p = ygp()
43        start = time.time()
44        func(g, y, p)
45        yield time.time() - start
46
47
48def main():
49    a = argparse.ArgumentParser(
50        description="Compare pow to OpenSSL's bignums")
51    a.add_argument("implementation", choices=("python", "openssl"))
52    a.add_argument("--iterations", "-i",
53                   type=int,
54                   default=10000,
55                   help="how many iterations to run")
56    a.add_argument('--output', '-o',
57                   type=argparse.FileType('w'),
58                   default=sys.stdout)
59    args = a.parse_args()
60    func = globals()[args.implementation]
61    for t in test(func, args.iterations):
62        args.output.write("{}\n".format(t))
63
64
65main()