|
5 | 5 | except ImportError: |
6 | 6 | # but most users really don't require it |
7 | 7 | from distutils.core import setup, Command |
| 8 | +import timeit |
8 | 9 |
|
9 | 10 | import versioneer |
10 | 11 | versioneer.versionfile_source = "ecdsa/_version.py" |
@@ -35,6 +36,44 @@ def run(self): |
35 | 36 | # all tests os.exit(1) upon failure |
36 | 37 | commands["test"] = Test |
37 | 38 |
|
| 39 | +class Speed(Test): |
| 40 | + description = "run benchmark suite" |
| 41 | + def run(self): |
| 42 | + def do(setup_statements, statement): |
| 43 | + # extracted from timeit.py |
| 44 | + t = timeit.Timer(stmt=statement, |
| 45 | + setup="\n".join(setup_statements)) |
| 46 | + # determine number so that 0.2 <= total time < 2.0 |
| 47 | + for i in range(1, 10): |
| 48 | + number = 10**i |
| 49 | + x = t.timeit(number) |
| 50 | + if x >= 0.2: |
| 51 | + break |
| 52 | + return x / number |
| 53 | + |
| 54 | + for curve in ["NIST192p", "NIST224p", "NIST256p", "SECP256k1", |
| 55 | + "NIST384p", "NIST521p"]: |
| 56 | + S1 = "import ecdsa" |
| 57 | + S2 = "sk = ecdsa.SigningKey.generate(ecdsa.%s)" % curve |
| 58 | + S3 = "msg = 'msg'" |
| 59 | + S4 = "sig = sk.sign(msg)" |
| 60 | + S5 = "vk = sk.get_verifying_key()" |
| 61 | + S6 = "vk.verify(sig, msg)" |
| 62 | + # We happen to know that .generate() also calculates the |
| 63 | + # verifying key, which is the time-consuming part. If the code |
| 64 | + # were changed to lazily calculate vk, we'd need to change this |
| 65 | + # benchmark to loop over S5 instead of S2 |
| 66 | + keygen = do([S1], S2) |
| 67 | + sign = do([S1,S2,S3], S4) |
| 68 | + verf = do([S1,S2,S3,S4,S5], S6) |
| 69 | + import ecdsa |
| 70 | + sig = ecdsa.SigningKey.generate(getattr(ecdsa, curve)).sign("msg") |
| 71 | + print "%9s: siglen=%3d, keygen=%.3fs, sign=%.3fs, verify=%.3fs" \ |
| 72 | + % (curve, len(sig), keygen, sign, verf) |
| 73 | + |
| 74 | +commands["speed"] = Speed |
| 75 | + |
| 76 | + |
38 | 77 | setup(name="ecdsa", |
39 | 78 | version=versioneer.get_version(), |
40 | 79 | description="ECDSA cryptographic signature library (pure python)", |
|
0 commit comments