# Copyright (C) Jean-Paul Calderone # See LICENSE for details. # # Stress tester for thread-related bugs in global_passphrase_callback in # src/ssl/context.c. In 0.7 and earlier, this will somewhat reliably # segfault or abort after a few dozen to a few thousand iterations on an SMP # machine (generally not on a UP machine) due to uses of Python/C API # without holding the GIL. from itertools import count from threading import Thread from OpenSSL.SSL import Context, TLSv1_METHOD from OpenSSL.crypto import TYPE_RSA, FILETYPE_PEM, PKey, dump_privatekey k = PKey() k.generate_key(TYPE_RSA, 128) file("pkey.pem", "w").write( dump_privatekey(FILETYPE_PEM, k, "blowfish", "foobar") ) count = count() def go(): def cb(a, b, c): print count.next() return "foobar" c = Context(TLSv1_METHOD) c.set_passwd_cb(cb) while 1: c.use_privatekey_file("pkey.pem") threads = [Thread(target=go, args=()) for i in xrange(2)] for th in threads: th.start() for th in threads: th.join()