コード例 #1
0
ファイル: interp_hashlib.py プロジェクト: xen0n/pypy
    def __init__(self, space, name, copy_from=NULL_CTX):
        self.name = name
        digest_type = self.digest_type_by_name(space)
        self.digest_size = ropenssl.EVP_MD_size(digest_type)

        # Allocate a lock for each HASH object.
        # An optimization would be to not release the GIL on small requests,
        # and use a custom lock only when needed.
        self.lock = Lock(space)

        ctx = ropenssl.EVP_MD_CTX_new()
        if ctx is None:
            raise MemoryError
        rgc.add_memory_pressure(ropenssl.HASH_MALLOC_SIZE + self.digest_size,
                                self)
        try:
            if copy_from:
                if not ropenssl.EVP_MD_CTX_copy(ctx, copy_from):
                    raise ValueError
            else:
                ropenssl.EVP_DigestInit(ctx, digest_type)
            self.ctx = ctx
        except:
            ropenssl.EVP_MD_CTX_free(ctx)
            raise
        self.register_finalizer(space)
コード例 #2
0
 def _digest(self, space):
     with lltype.scoped_alloc(ropenssl.EVP_MD_CTX.TO) as ctx:
         with self.lock:
             ropenssl.EVP_MD_CTX_copy(ctx, self.ctx)
         digest_size = self.digest_size
         with rffi.scoped_alloc_buffer(digest_size) as buf:
             ropenssl.EVP_DigestFinal(ctx, buf.raw, None)
             ropenssl.EVP_MD_CTX_cleanup(ctx)
             return buf.str(digest_size)
コード例 #3
0
ファイル: interp_hashlib.py プロジェクト: weijiwei/pypy
 def _digest(self, space):
     with lltype.scoped_alloc(ropenssl.EVP_MD_CTX.TO) as ctx:
         with self.lock:
             ropenssl.EVP_MD_CTX_copy(ctx, self.ctx)
         digest_size = self.digest_size
         with lltype.scoped_alloc(rffi.CCHARP.TO, digest_size) as digest:
             ropenssl.EVP_DigestFinal(ctx, digest, None)
             ropenssl.EVP_MD_CTX_cleanup(ctx)
             return rffi.charpsize2str(digest, digest_size)
コード例 #4
0
ファイル: interp_hashlib.py プロジェクト: xen0n/pypy
 def _digest(self, space):
     ctx = ropenssl.EVP_MD_CTX_new()
     if ctx is None:
         raise MemoryError
     try:
         with self.lock:
             if not ropenssl.EVP_MD_CTX_copy(ctx, self.ctx):
                 raise ValueError
         digest_size = self.digest_size
         with rffi.scoped_alloc_buffer(digest_size) as buf:
             ropenssl.EVP_DigestFinal(ctx, buf.raw, None)
             return buf.str(digest_size)
     finally:
         ropenssl.EVP_MD_CTX_free(ctx)
コード例 #5
0
    def __init__(self, space, name, copy_from=NULL_CTX):
        self.name = name
        digest_type = self.digest_type_by_name(space)
        self.digest_size = rffi.getintfield(digest_type, 'c_md_size')

        # Allocate a lock for each HASH object.
        # An optimization would be to not release the GIL on small requests,
        # and use a custom lock only when needed.
        self.lock = Lock(space)

        ctx = lltype.malloc(ropenssl.EVP_MD_CTX.TO, flavor='raw')
        rgc.add_memory_pressure(ropenssl.HASH_MALLOC_SIZE + self.digest_size)
        try:
            if copy_from:
                ropenssl.EVP_MD_CTX_copy(ctx, copy_from)
            else:
                ropenssl.EVP_DigestInit(ctx, digest_type)
            self.ctx = ctx
        except:
            lltype.free(ctx, flavor='raw')
            raise