<feed xmlns='http://www.w3.org/2005/Atom'>
<title>delta/python-packages/pycrypto.git/lib/Crypto/SelfTest/Random, branch pyca</title>
<subtitle>github.com: dlitz/pycrypto.git
</subtitle>
<link rel='alternate' type='text/html' href='http://git.baserock.org/cgit/delta/python-packages/pycrypto.git/'/>
<entry>
<title>Do not run multiprocessing test if multiprocessing.synchronize is not working</title>
<updated>2013-10-17T17:56:11+00:00</updated>
<author>
<name>Sebastian Ramacher</name>
<email>sebastian+dev@ramacher.at</email>
</author>
<published>2013-10-17T17:56:11+00:00</published>
<link rel='alternate' type='text/html' href='http://git.baserock.org/cgit/delta/python-packages/pycrypto.git/commit/?id=845055208d8f5fa153faf646f18876c4a1b9cc84'/>
<id>845055208d8f5fa153faf646f18876c4a1b9cc84</id>
<content type='text'>
On platforms that do not have a working sem_open implementation, importing
multiprocessing.synchronize will fail with an ImportError. While creating a
multiprocessing.Pool instance, multiprocessing.synchronize will be imported and
might throw an ImportError.

Signed-off-by: Sebastian Ramacher &lt;sebastian+dev@ramacher.at&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
On platforms that do not have a working sem_open implementation, importing
multiprocessing.synchronize will fail with an ImportError. While creating a
multiprocessing.Pool instance, multiprocessing.synchronize will be imported and
might throw an ImportError.

Signed-off-by: Sebastian Ramacher &lt;sebastian+dev@ramacher.at&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Random: Make Crypto.Random.atfork() set last_reseed=None (CVE-2013-1445)</title>
<updated>2013-10-14T21:37:35+00:00</updated>
<author>
<name>Dwayne Litzenberger</name>
<email>dlitz@dlitz.net</email>
</author>
<published>2013-10-14T21:37:35+00:00</published>
<link rel='alternate' type='text/html' href='http://git.baserock.org/cgit/delta/python-packages/pycrypto.git/commit/?id=19dcf7b15d61b7dc1a125a367151de40df6ef175'/>
<id>19dcf7b15d61b7dc1a125a367151de40df6ef175</id>
<content type='text'>
== Summary ==

In PyCrypto before v2.6.1, the Crypto.Random pseudo-random number
generator (PRNG) exhibits a race condition that may cause it to generate
the same 'random' output in multiple processes that are forked from each
other.  Depending on the application, this could reveal sensitive
information or cryptographic keys to remote attackers.

An application may be affected if, within 100 milliseconds, it performs
the following steps (which may be summarized as "read-fork-read-read"):

1. Read from the Crypto.Random PRNG, causing an internal reseed;
2. Fork the process and invoke Crypto.Random.atfork() in the child;
3. Read from the Crypto.Random PRNG again, in at least two different
   processes (parent and child, or multiple children).

Only applications that invoke Crypto.Random.atfork() and perform the
above steps are affected by this issue.  Other applications are
unaffected.

Note: Some PyCrypto functions, such as key generation and PKCS#1-related
functions, implicitly read from the Crypto.Random PRNG.

== Technical details ==

Crypto.Random uses Fortuna[1] to generate random numbers.  The flow of
entropy looks something like this:

    /dev/urandom  -\
                    +-&gt; "accumulator" --&gt; "generator" --&gt; output
    other sources -/   (entropy pools)     (AES-CTR)

- The "accumulator" maintains several pools that collect entropy from
  the environment.

- The "generator" is a deterministic PRNG that is reseeded by the
  accumulator.  Reseeding normally occurs during each request for random
  numbers, but never more than once every 100 ms (the "minimum reseed
  interval").

When a process is forked, the parent's state is duplicated in the child.
In order to continue using the PRNG, the child process must invoke
Crypto.Random.atfork(), which collects new entropy from /dev/urandom and
adds it to the accumulator.  When new PRNG output is subsequently
requested, some of the new entropy in the accumulator is used to reseed
the generator, causing the output of the child to diverge from its
parent.

However, in previous versions of PyCrypto, Crypto.Random.atfork() did
not explicitly reset the child's rate-limiter, so if the child requested
PRNG output before the minimum reseed interval of 100 ms had elapsed, it
would generate its output using state inherited from its parent.

This created a race condition between the parent process and its forked
children that could cause them to produce identical PRNG output for the
duration of the 100 ms minimum reseed interval.

== Demonstration ==

Here is some sample code that illustrates the problem:

    from binascii import hexlify
    import multiprocessing, pprint, time
    import Crypto.Random

    def task_main(arg):
        a = Crypto.Random.get_random_bytes(8)
        time.sleep(0.1)
        b = Crypto.Random.get_random_bytes(8)
        rdy, ack = arg
        rdy.set()
        ack.wait()
        return "%s,%s" % (hexlify(a).decode(),
                          hexlify(b).decode())

    n_procs = 4
    manager = multiprocessing.Manager()
    rdys = [manager.Event() for i in range(n_procs)]
    acks = [manager.Event() for i in range(n_procs)]
    Crypto.Random.get_random_bytes(1)
    pool = multiprocessing.Pool(processes=n_procs,
                                initializer=Crypto.Random.atfork)
    res_async = pool.map_async(task_main, zip(rdys, acks))
    pool.close()
    [rdy.wait() for rdy in rdys]
    [ack.set() for ack in acks]
    res = res_async.get()
    pprint.pprint(sorted(res))
    pool.join()

The output should be random, but it looked like this:

    ['c607803ae01aa8c0,2e4de6457a304b34',
     'c607803ae01aa8c0,af80d08942b4c987',
     'c607803ae01aa8c0,b0e4c0853de927c4',
     'c607803ae01aa8c0,f0362585b3fceba4']

== Solution ==

The solution is to upgrade to PyCrypto v2.6.1 or later, which properly
resets the rate-limiter when Crypto.Random.atfork() is invoked in the
child.

== References ==

[1] N. Ferguson and B. Schneier, _Practical Cryptography_,
    Indianapolis: Wiley, 2003, pp. 155-184.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
== Summary ==

In PyCrypto before v2.6.1, the Crypto.Random pseudo-random number
generator (PRNG) exhibits a race condition that may cause it to generate
the same 'random' output in multiple processes that are forked from each
other.  Depending on the application, this could reveal sensitive
information or cryptographic keys to remote attackers.

An application may be affected if, within 100 milliseconds, it performs
the following steps (which may be summarized as "read-fork-read-read"):

1. Read from the Crypto.Random PRNG, causing an internal reseed;
2. Fork the process and invoke Crypto.Random.atfork() in the child;
3. Read from the Crypto.Random PRNG again, in at least two different
   processes (parent and child, or multiple children).

Only applications that invoke Crypto.Random.atfork() and perform the
above steps are affected by this issue.  Other applications are
unaffected.

Note: Some PyCrypto functions, such as key generation and PKCS#1-related
functions, implicitly read from the Crypto.Random PRNG.

== Technical details ==

Crypto.Random uses Fortuna[1] to generate random numbers.  The flow of
entropy looks something like this:

    /dev/urandom  -\
                    +-&gt; "accumulator" --&gt; "generator" --&gt; output
    other sources -/   (entropy pools)     (AES-CTR)

- The "accumulator" maintains several pools that collect entropy from
  the environment.

- The "generator" is a deterministic PRNG that is reseeded by the
  accumulator.  Reseeding normally occurs during each request for random
  numbers, but never more than once every 100 ms (the "minimum reseed
  interval").

When a process is forked, the parent's state is duplicated in the child.
In order to continue using the PRNG, the child process must invoke
Crypto.Random.atfork(), which collects new entropy from /dev/urandom and
adds it to the accumulator.  When new PRNG output is subsequently
requested, some of the new entropy in the accumulator is used to reseed
the generator, causing the output of the child to diverge from its
parent.

However, in previous versions of PyCrypto, Crypto.Random.atfork() did
not explicitly reset the child's rate-limiter, so if the child requested
PRNG output before the minimum reseed interval of 100 ms had elapsed, it
would generate its output using state inherited from its parent.

This created a race condition between the parent process and its forked
children that could cause them to produce identical PRNG output for the
duration of the 100 ms minimum reseed interval.

== Demonstration ==

Here is some sample code that illustrates the problem:

    from binascii import hexlify
    import multiprocessing, pprint, time
    import Crypto.Random

    def task_main(arg):
        a = Crypto.Random.get_random_bytes(8)
        time.sleep(0.1)
        b = Crypto.Random.get_random_bytes(8)
        rdy, ack = arg
        rdy.set()
        ack.wait()
        return "%s,%s" % (hexlify(a).decode(),
                          hexlify(b).decode())

    n_procs = 4
    manager = multiprocessing.Manager()
    rdys = [manager.Event() for i in range(n_procs)]
    acks = [manager.Event() for i in range(n_procs)]
    Crypto.Random.get_random_bytes(1)
    pool = multiprocessing.Pool(processes=n_procs,
                                initializer=Crypto.Random.atfork)
    res_async = pool.map_async(task_main, zip(rdys, acks))
    pool.close()
    [rdy.wait() for rdy in rdys]
    [ack.set() for ack in acks]
    res = res_async.get()
    pprint.pprint(sorted(res))
    pool.join()

The output should be random, but it looked like this:

    ['c607803ae01aa8c0,2e4de6457a304b34',
     'c607803ae01aa8c0,af80d08942b4c987',
     'c607803ae01aa8c0,b0e4c0853de927c4',
     'c607803ae01aa8c0,f0362585b3fceba4']

== Solution ==

The solution is to upgrade to PyCrypto v2.6.1 or later, which properly
resets the rate-limiter when Crypto.Random.atfork() is invoked in the
child.

== References ==

[1] N. Ferguson and B. Schneier, _Practical Cryptography_,
    Indianapolis: Wiley, 2003, pp. 155-184.
</pre>
</div>
</content>
</entry>
<entry>
<title>Merge from upstream</title>
<updated>2011-12-22T13:55:40+00:00</updated>
<author>
<name>Legrandin</name>
<email>gooksankoo@hoiptorrow.mailexpire.com</email>
</author>
<published>2011-12-22T13:55:40+00:00</published>
<link rel='alternate' type='text/html' href='http://git.baserock.org/cgit/delta/python-packages/pycrypto.git/commit/?id=114ca5b4d467617489817eee77ed0621665ee362'/>
<id>114ca5b4d467617489817eee77ed0621665ee362</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Python 3.x fixes:</title>
<updated>2011-10-22T19:07:47+00:00</updated>
<author>
<name>Dwayne C. Litzenberger</name>
<email>dlitz@dlitz.net</email>
</author>
<published>2011-10-22T19:07:47+00:00</published>
<link rel='alternate' type='text/html' href='http://git.baserock.org/cgit/delta/python-packages/pycrypto.git/commit/?id=094d70b64d6b575841c6d340f2391b977bc61694'/>
<id>094d70b64d6b575841c6d340f2391b977bc61694</id>
<content type='text'>
- Use absolute imports
- Fix StringIO import so that 2to3 can translate it
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- Use absolute imports
- Fix StringIO import so that 2to3 can translate it
</pre>
</div>
</content>
</entry>
<entry>
<title>Merged from upstream (py3k support) and modified so that all unit tests pass.</title>
<updated>2011-10-18T21:20:26+00:00</updated>
<author>
<name>Legrandin</name>
<email>gooksankoo@hoiptorrow.mailexpire.com</email>
</author>
<published>2011-10-18T21:20:26+00:00</published>
<link rel='alternate' type='text/html' href='http://git.baserock.org/cgit/delta/python-packages/pycrypto.git/commit/?id=c22fa18c0dedb43a8b19dcb9b29512ba59e1764b'/>
<id>c22fa18c0dedb43a8b19dcb9b29512ba59e1764b</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>Added Lorenz Quack's native C implementation of all SHA-2 algorithm</title>
<updated>2011-10-16T20:41:21+00:00</updated>
<author>
<name>Legrandin</name>
<email>gooksankoo@hoiptorrow.mailexpire.com</email>
</author>
<published>2011-10-16T20:41:21+00:00</published>
<link rel='alternate' type='text/html' href='http://git.baserock.org/cgit/delta/python-packages/pycrypto.git/commit/?id=897b75983c31a9e2630af92161e6206c2480685e'/>
<id>897b75983c31a9e2630af92161e6206c2480685e</id>
<content type='text'>
(as submitted here https://bugs.launchpad.net/pycrypto/+bug/544792)
so that they are available also in Python 2.1, 2.2, 2.3 and 2.4.

Regardless where the implementation comes from (Python standard
library or our native modules, depending on the Python version),
all Crypto.Hash objects are always used as front-ends.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
(as submitted here https://bugs.launchpad.net/pycrypto/+bug/544792)
so that they are available also in Python 2.1, 2.2, 2.3 and 2.4.

Regardless where the implementation comes from (Python standard
library or our native modules, depending on the Python version),
all Crypto.Hash objects are always used as front-ends.
</pre>
</div>
</content>
</entry>
<entry>
<title>Unwraping byte conversion on test vectors.</title>
<updated>2011-04-24T15:35:12+00:00</updated>
<author>
<name>Anders Sundman</name>
<email>anders@4zm.org</email>
</author>
<published>2011-04-21T16:47:23+00:00</published>
<link rel='alternate' type='text/html' href='http://git.baserock.org/cgit/delta/python-packages/pycrypto.git/commit/?id=28f8bd25da5174b8a214ea832a88c72a8d7bba9c'/>
<id>28f8bd25da5174b8a214ea832a88c72a8d7bba9c</id>
<content type='text'>
Doing the wraping later, at the point of use instead.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Doing the wraping later, at the point of use instead.
</pre>
</div>
</content>
</entry>
<entry>
<title>Improve random selftest</title>
<updated>2011-01-05T12:54:04+00:00</updated>
<author>
<name>Thorsten Behrens</name>
<email>sbehrens@gmx.li</email>
</author>
<published>2011-01-05T12:54:04+00:00</published>
<link rel='alternate' type='text/html' href='http://git.baserock.org/cgit/delta/python-packages/pycrypto.git/commit/?id=b27696462b1e7c6c53ce2ac6760567eb6ff744b6'/>
<id>b27696462b1e7c6c53ce2ac6760567eb6ff744b6</id>
<content type='text'>
o Random selftest is improved, less likely to collide
o random.shuffle() is more pythonic
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
o Random selftest is improved, less likely to collide
o random.shuffle() is more pythonic
</pre>
</div>
</content>
</entry>
<entry>
<title>Additional random unit tests; fix a random unit test</title>
<updated>2011-01-04T20:33:15+00:00</updated>
<author>
<name>Thorsten Behrens</name>
<email>sbehrens@gmx.li</email>
</author>
<published>2011-01-04T20:33:15+00:00</published>
<link rel='alternate' type='text/html' href='http://git.baserock.org/cgit/delta/python-packages/pycrypto.git/commit/?id=ff0e5ad4093ccbb3f1935dd7753515c42c0484e5'/>
<id>ff0e5ad4093ccbb3f1935dd7753515c42c0484e5</id>
<content type='text'>
Patch as per Lorenz on the mailing list.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Patch as per Lorenz on the mailing list.
</pre>
</div>
</content>
</entry>
<entry>
<title>Add unit tests for Crypto.Random.random</title>
<updated>2010-12-31T05:15:34+00:00</updated>
<author>
<name>Thorsten Behrens</name>
<email>sbehrens@gmx.li</email>
</author>
<published>2010-12-31T05:15:34+00:00</published>
<link rel='alternate' type='text/html' href='http://git.baserock.org/cgit/delta/python-packages/pycrypto.git/commit/?id=5dc2f8f216a49ff2254dc1edc451904e188e5e9b'/>
<id>5dc2f8f216a49ff2254dc1edc451904e188e5e9b</id>
<content type='text'>
o Add unit tests
o Fix random.shuffle()
o random.sample() does not work on 2.1. This has not been fixed.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
o Add unit tests
o Fix random.shuffle()
o random.sample() does not work on 2.1. This has not been fixed.
</pre>
</div>
</content>
</entry>
</feed>
