Author: Amaury Forgeot d'Arc <[email protected]>
Branch: py3.3
Changeset: r82016:9a47d88b9973
Date: 2016-01-31 22:29 +0100
http://bitbucket.org/pypy/pypy/changeset/9a47d88b9973/
Log: Add _ssl.RAND_bytes
diff --git a/pypy/module/_ssl/__init__.py b/pypy/module/_ssl/__init__.py
--- a/pypy/module/_ssl/__init__.py
+++ b/pypy/module/_ssl/__init__.py
@@ -43,8 +43,8 @@
if HAVE_OPENSSL_RAND:
Module.interpleveldefs['RAND_add'] = "interp_ssl.RAND_add"
- Module.interpleveldefs['RAND_bytes'] = "space.w_None" # so far
- Module.interpleveldefs['RAND_pseudo_bytes'] = "space.w_None" # so
far
+ Module.interpleveldefs['RAND_bytes'] = "interp_ssl.RAND_bytes"
+ Module.interpleveldefs['RAND_pseudo_bytes'] =
"interp_ssl.RAND_pseudo_bytes"
Module.interpleveldefs['RAND_status'] = "interp_ssl.RAND_status"
Module.interpleveldefs['RAND_egd'] = "interp_ssl.RAND_egd"
diff --git a/pypy/module/_ssl/interp_ssl.py b/pypy/module/_ssl/interp_ssl.py
--- a/pypy/module/_ssl/interp_ssl.py
+++ b/pypy/module/_ssl/interp_ssl.py
@@ -237,6 +237,43 @@
with rffi.scoped_str2charp(string) as buf:
libssl_RAND_add(buf, len(string), entropy)
+ def _RAND_bytes(space, n, pseudo):
+ if n < 0:
+ raise OperationError(space.w_ValueError, space.wrap(
+ "num must be positive"))
+
+ with rffi.scoped_alloc_buffer(n) as buf:
+ if pseudo:
+ ok = libssl_RAND_pseudo_bytes(
+ rffi.cast(rffi.UCHARP, buf.raw), n)
+ if ok == 0 or ok == 1:
+ return space.newtuple([
+ space.wrapbytes(buf.str(n)),
+ space.wrap(ok == 1),
+ ])
+ else:
+ ok = libssl_RAND_bytes(
+ rffi.cast(rffi.UCHARP, buf.raw), n)
+ if ok == 1:
+ return space.wrapbytes(buf.str(n))
+
+ raise ssl_error(space, "", errcode=libssl_ERR_get_error())
+
+ @unwrap_spec(n=int)
+ def RAND_bytes(space, n):
+ """RAND_bytes(n) -> bytes
+
+ Generate n cryptographically strong pseudo-random bytes."""
+ return _RAND_bytes(space, n, pseudo=False)
+
+ @unwrap_spec(n=int)
+ def RAND_pseudo_bytes(space, n):
+ """RAND_pseudo_bytes(n) -> (bytes, is_cryptographic)
+
+ Generate n pseudo-random bytes. is_cryptographic is True if the bytes
+ generated are cryptographically strong."""
+ return _RAND_bytes(space, n, pseudo=True)
+
def RAND_status(space):
"""RAND_status() -> 0 or 1
diff --git a/pypy/module/_ssl/test/test_ssl.py
b/pypy/module/_ssl/test/test_ssl.py
--- a/pypy/module/_ssl/test/test_ssl.py
+++ b/pypy/module/_ssl/test/test_ssl.py
@@ -48,6 +48,16 @@
raises(TypeError, _ssl.RAND_add, "xyz", "zyx")
_ssl.RAND_add("xyz", 1.2345)
+ def test_RAND_bytes(self):
+ import _ssl
+ b = _ssl.RAND_bytes(3)
+ assert type(b) is bytes
+ assert len(b) == 3
+ b, ok = _ssl.RAND_pseudo_bytes(3)
+ assert type(b) is bytes
+ assert len(b) == 3
+ assert ok is True or ok is False
+
def test_RAND_status(self):
import _ssl
if not hasattr(_ssl, "RAND_status"):
diff --git a/rpython/rlib/ropenssl.py b/rpython/rlib/ropenssl.py
--- a/rpython/rlib/ropenssl.py
+++ b/rpython/rlib/ropenssl.py
@@ -311,6 +311,8 @@
if HAVE_OPENSSL_RAND:
ssl_external('RAND_add', [rffi.CCHARP, rffi.INT, rffi.DOUBLE], lltype.Void)
+ ssl_external('RAND_bytes', [rffi.UCHARP, rffi.INT], rffi.INT)
+ ssl_external('RAND_pseudo_bytes', [rffi.UCHARP, rffi.INT], rffi.INT)
ssl_external('RAND_status', [], rffi.INT)
if HAVE_OPENSSL_RAND_EGD:
ssl_external('RAND_egd', [rffi.CCHARP], rffi.INT)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit