[pypy-svn] r77861 - in pypy/branch/fast-forward/pypy/module/_hashlib: . test

afa at codespeak.net afa at codespeak.net
Wed Oct 13 14:03:21 CEST 2010


Author: afa
Date: Wed Oct 13 14:03:19 2010
New Revision: 77861

Added:
   pypy/branch/fast-forward/pypy/module/_hashlib/   (props changed)
   pypy/branch/fast-forward/pypy/module/_hashlib/__init__.py   (contents, props changed)
   pypy/branch/fast-forward/pypy/module/_hashlib/interp_hashlib.py   (contents, props changed)
   pypy/branch/fast-forward/pypy/module/_hashlib/test/   (props changed)
   pypy/branch/fast-forward/pypy/module/_hashlib/test/test_hashlib.py   (contents, props changed)
Log:
Start a _hashlib module.


Added: pypy/branch/fast-forward/pypy/module/_hashlib/__init__.py
==============================================================================
--- (empty file)
+++ pypy/branch/fast-forward/pypy/module/_hashlib/__init__.py	Wed Oct 13 14:03:19 2010
@@ -0,0 +1,15 @@
+from pypy.interpreter.mixedmodule import MixedModule
+from pypy.module._hashlib import interp_hashlib
+
+
+class Module(MixedModule):
+    interpleveldefs = {
+        'new' : 'interp_hashlib.new',
+        'HASH': 'interp_hashlib.W_Hash',
+        }
+
+    appleveldefs = {
+        }
+
+    for name in interp_hashlib.algorithms:
+        interpleveldefs[name] = getattr(interp_hashlib, 'new_' + name)

Added: pypy/branch/fast-forward/pypy/module/_hashlib/interp_hashlib.py
==============================================================================
--- (empty file)
+++ pypy/branch/fast-forward/pypy/module/_hashlib/interp_hashlib.py	Wed Oct 13 14:03:19 2010
@@ -0,0 +1,60 @@
+from pypy.interpreter.gateway import unwrap_spec, interp2app
+from pypy.interpreter.typedef import TypeDef
+from pypy.tool.sourcetools import func_renamer
+from pypy.interpreter.baseobjspace import Wrappable, W_Root, ObjSpace
+from pypy.rpython.lltypesystem import lltype, rffi
+from pypy.rlib import ropenssl
+
+algorithms = ('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')
+
+class W_Hash(Wrappable):
+    def __init__(self, name):
+        self.name = name
+        self.ctx = lltype.malloc(ropenssl.EVP_MD_CTX.TO, flavor='raw')
+
+    @unwrap_spec('self', ObjSpace, str, str)
+    def descr_init(self, space, name, buffer):
+        digest = ropenssl.EVT_get_digestbyname(name)
+        if not digest:
+            raise OperationError(space.w_ValueError,
+                                 space.wrap("unknown hash function"))
+        ropenssl.EVP_DigestInit(self.ctx, digest)
+
+        if buffer:
+            self._hash(buffer)
+
+    @unwrap_spec('self', ObjSpace)
+    def descr_repr(self, space):
+        return space.wrap("<%s HASH object @ 0x%x>" % (self.name, id(self)))
+
+    @unwrap_spec('self', ObjSpace, str)
+    def update(self, space, buffer):
+        self._hash(buffer)
+
+    def _hash(self, buffer):
+        buf = rffi.str2charp(buffer)
+        try:
+            ropenssl.EVP_DigestUpdate(self.ctx, buf, len(buffer))
+        finally:
+            rffi.free_charp(buf)
+
+W_Hash.typedef = TypeDef(
+    'HASH',
+    __init__=interp2app(W_Hash.descr_init),
+    __repr__=interp2app(W_Hash.descr_repr),
+    update=interp2app(W_Hash.update),
+    )
+
+ at unwrap_spec(ObjSpace, str, str)
+def new(space, method, string=''):
+    w_hash = W_Hash(method)
+    w_hash.update(space, string)
+    return space.wrap(w_hash)
+
+# shortcut functions
+for name in algorithms:
+    newname = 'new_%s' % (name,)
+    @func_renamer(newname)
+    def new_hash(w_string=''):
+        return _new(name, w_string)
+    globals()[newname] = new_hash

Added: pypy/branch/fast-forward/pypy/module/_hashlib/test/test_hashlib.py
==============================================================================
--- (empty file)
+++ pypy/branch/fast-forward/pypy/module/_hashlib/test/test_hashlib.py	Wed Oct 13 14:03:19 2010
@@ -0,0 +1,53 @@
+import py
+from pypy.conftest import gettestobjspace
+
+class AppTestHashlib:
+    def setup_class(cls):
+        cls.space = gettestobjspace(usemodules=['_hashlib'])
+
+    def test_simple(self):
+        import _hashlib
+        assert isinstance(_hashlib.new('md5'), _hashlib.HASH)
+
+    def test_attributes(self):
+        import _hashlib
+        for name, expected_size in {'md5': 16,
+                                    'sha1': 20,
+                                    'sha224': 28,
+                                    'sha256': 32,
+                                    'sha384': 48,
+                                    'sha512': 64,
+                                    }.items():
+            h = hashlib.new(name)
+            assert h.digest_size == expected_size
+            assert h.digestsize == expected_size
+            #
+            h.update('abc')
+            h2 = h.copy()
+            h.update('def')
+            digest = h.digest()
+            hexdigest = h.hexdigest()
+            h2.update('d')
+            h2.update('ef')
+            assert digest == h.digest()
+            assert hexdigest == h.hexdigest()
+
+            # also test the pure Python implementation
+            h = hashlib.__get_builtin_constructor(name)('')
+            assert h.digest_size == expected_size
+            assert h.digestsize == expected_size
+            #
+            h.update('abc')
+            h2 = h.copy()
+            h.update('def')
+            digest = h.digest()
+            hexdigest = h.hexdigest()
+            h2.update('d')
+            h2.update('ef')
+            assert digest == h.digest()
+            assert hexdigest == h.hexdigest()
+
+    def test_unicode(self):
+        import _hashlib
+        assert isinstance(hashlib.new('sha1', u'xxx'), _hashlib.HASH)
+



More information about the Pypy-commit mailing list