#!/usr/bin/env python3 import time import random import string import gpg import subprocess from pgpy import PGPMessage, PGPKey, constants from pysequoia import Cert, Context from multiprocessing import Pool from tqdm import tqdm N = 5000 K = 16 SIGN = True SIGN_WITH = ('4A3E34DF1E4569E72A197950BAFB02D14732B480', 'sign.asc') ENCRYPT_TO = ('5C0EF910C3F5FDB51BCE5630C96DCF4E534983F4', 'encrypt.asc') def gpg_worker(i): with gpg.Context(armor=True) as ctx: ctx.set_engine_info(gpg.constants.protocol.OpenPGP, home_dir='gpg' + str(i%8)) for _ in tqdm(range(N)): msg = ''.join([random.choice(string.ascii_lowercase) for _ in range(100)]).encode() rkey = list(ctx.keylist(pattern=ENCRYPT_TO[0], secret=False)) if SIGN: skey = list(ctx.keylist(pattern=SIGN_WITH[0], secret=False)) else: skey = None ciphertext, result, sign_result = ctx.encrypt(msg, recipients=rkey, sign=skey, always_trust=True, compress=False) def gpg_singlehome_worker(i): gpg_worker(0) def pgpy_worker(i): for _ in tqdm(range(N)): msg = PGPMessage.new(''.join([random.choice(string.ascii_lowercase) for _ in range(100)]), compression=constants.CompressionAlgorithm.Uncompressed) if SIGN: skey, _ = PGPKey.from_file(SIGN_WITH[1]) msg |= skey.sign(msg) rkey, _ = PGPKey.from_file(ENCRYPT_TO[1]) enc = rkey.encrypt(msg) x = str(enc) def sqop_worker(i): for _ in tqdm(range(N)): msg = ''.join([random.choice(string.ascii_lowercase) for _ in range(100)]) if SIGN: cmdline = ['/usr/bin/sqop', 'encrypt', '--sign-with', SIGN_WITH[1], ENCRYPT_TO[1]] else: cmdline = ['/usr/bin/sqop', 'encrypt', ENCRYPT_TO[1]] p = subprocess.Popen(cmdline, stdin=subprocess.PIPE, stdout=subprocess.PIPE) out, _ = p.communicate(msg.encode()) def pysq_worker(i): ctx = Context.standard() for _ in tqdm(range(N)): msg = ''.join([random.choice(string.ascii_lowercase) for _ in range(100)]) if SIGN: skey = Cert.from_file(SIGN_WITH[1]) else: skey = None rkey = Cert.from_file(ENCRYPT_TO[1]) enc = ctx.encrypt(skey, rkey, msg) if __name__ == '__main__': gpg_start = time.monotonic() with Pool(K) as p: p.map(gpg_worker, range(K)) gpg_end = time.monotonic() gpg_single_start = time.monotonic() with Pool(K) as p: p.map(gpg_singlehome_worker, range(K)) gpg_single_end = time.monotonic() pgpy_start = time.monotonic() with Pool(K) as p: p.map(pgpy_worker, range(K)) pgpy_end = time.monotonic() sqop_start = time.monotonic() with Pool(K) as p: p.map(sqop_worker, range(K)) sqop_end = time.monotonic() pysq_start = time.monotonic() with Pool(K) as p: p.map(pysq_worker, range(K)) pysq_end = time.monotonic() print(f'GnuPG MH : {gpg_end - gpg_start}s') print(f'GnuPG SH : {gpg_single_end - gpg_single_start}s') print(f'PGPy : {pgpy_end - pgpy_start}s') print(f'sqop : {sqop_end - sqop_start}s') print(f'pysequoia: {pysq_end - pysq_start}s')