Spaces:
Runtime error
Runtime error
# SPDX-License-Identifier: MIT | |
from __future__ import annotations | |
import argparse | |
import sys | |
import timeit | |
from . import ( | |
DEFAULT_HASH_LENGTH, | |
DEFAULT_MEMORY_COST, | |
DEFAULT_PARALLELISM, | |
DEFAULT_TIME_COST, | |
PasswordHasher, | |
profiles, | |
) | |
def main(argv: list[str]) -> None: | |
parser = argparse.ArgumentParser(description="Benchmark Argon2.") | |
parser.add_argument( | |
"-n", type=int, default=100, help="Number of iterations to measure." | |
) | |
parser.add_argument( | |
"-t", type=int, help="`time_cost`", default=DEFAULT_TIME_COST | |
) | |
parser.add_argument( | |
"-m", type=int, help="`memory_cost`", default=DEFAULT_MEMORY_COST | |
) | |
parser.add_argument( | |
"-p", type=int, help="`parallelism`", default=DEFAULT_PARALLELISM | |
) | |
parser.add_argument( | |
"-l", type=int, help="`hash_length`", default=DEFAULT_HASH_LENGTH | |
) | |
parser.add_argument( | |
"--profile", | |
type=str, | |
help="A profile from `argon2.profiles. Takes precedence.", | |
default=None, | |
) | |
args = parser.parse_args(argv[1:]) | |
password = b"secret" | |
if args.profile: | |
ph = PasswordHasher.from_parameters( | |
getattr(profiles, args.profile.upper()) | |
) | |
else: | |
ph = PasswordHasher( | |
time_cost=args.t, | |
memory_cost=args.m, | |
parallelism=args.p, | |
hash_len=args.l, | |
) | |
hash = ph.hash(password) | |
params = { | |
"time_cost": (ph.time_cost, "iterations"), | |
"memory_cost": (ph.memory_cost, "KiB"), | |
"parallelism": (ph.parallelism, "threads"), | |
"hash_len": (ph.hash_len, "bytes"), | |
} | |
print("Running Argon2id %d times with:" % (args.n,)) | |
for k, v in sorted(params.items()): | |
print("%s: %d %s" % (k, v[0], v[1])) | |
print("\nMeasuring...") | |
duration = timeit.timeit( | |
f"ph.verify({hash!r}, {password!r})", | |
setup=f"""\ | |
from argon2 import PasswordHasher, Type | |
ph = PasswordHasher( | |
time_cost={args.t!r}, | |
memory_cost={args.m!r}, | |
parallelism={args.p!r}, | |
hash_len={args.l!r}, | |
) | |
gc.enable()""", | |
number=args.n, | |
) | |
print(f"\n{duration / args.n * 1000:.1f}ms per password verification") | |
if __name__ == "__main__": # pragma: no cover | |
main(sys.argv) | |