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)
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)
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)
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)
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