[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