Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>Mapping C structures from header files (openssl/evp.h and _hashopenssl.c in your case) is straightforward, but is not always portable across different versions. Here it is for my environment:</p> <pre><code>from ctypes import * PyObject_HEAD = [ ('ob_refcnt', c_size_t), ('ob_type', c_void_p), ] class EVP_MD(Structure): _fields_ = [ ('type', c_int), ('pkey_type', c_int), ('md_size', c_int), ('flags', c_ulong), ('init', c_void_p), ('update', c_void_p), ('final', c_void_p), ('copy', c_void_p), ('cleanup', c_void_p), ('sign', c_void_p), ('verify', c_void_p), ('required_pkey_type', c_int*5), ('block_size', c_int), ('ctx_size', c_int), ] class EVP_MD_CTX(Structure): _fields_ = [ ('digest', POINTER(EVP_MD)), ('engine', c_void_p), ('flags', c_ulong), ('md_data', POINTER(c_char)), ] class EVPobject(Structure): _fields_ = PyObject_HEAD + [ ('name', py_object), ('ctx', EVP_MD_CTX), ] </code></pre> <p>Below is an example on how to use it to <a href="https://stackoverflow.com/questions/5865824/hash-algorithm-for-dynamic-growing-streaming-data">save and restore state of hash object</a>:</p> <pre><code>import hashlib hash = hashlib.md5('test') print hash.hexdigest() c_evp_obj = cast(c_void_p(id(hash)), POINTER(EVPobject)).contents ctx = c_evp_obj.ctx digest = ctx.digest.contents state = ctx.md_data[:digest.ctx_size] hash2 = hashlib.md5() c_evp_obj = cast(c_void_p(id(hash2)), POINTER(EVPobject)).contents ctx = c_evp_obj.ctx digest = ctx.digest.contents memmove(ctx.md_data, state, digest.ctx_size) print hash2.hexdigest() </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload