Issue9951: update _hashopenssl and md5module to use _Py_strhex().
Also update _posixsubprocess to use Py_hexdigits instead of its own constant.
This commit is contained in:
parent
8cb6569fe1
commit
4dff6f6fa6
|
@ -16,6 +16,7 @@
|
|||
#include "Python.h"
|
||||
#include "structmember.h"
|
||||
#include "hashlib.h"
|
||||
#include "pystrhex.h"
|
||||
|
||||
|
||||
/* EVP is the preferred interface to hashing in OpenSSL */
|
||||
|
@ -157,9 +158,7 @@ EVP_hexdigest(EVPobject *self, PyObject *unused)
|
|||
{
|
||||
unsigned char digest[EVP_MAX_MD_SIZE];
|
||||
EVP_MD_CTX temp_ctx;
|
||||
PyObject *retval;
|
||||
char *hex_digest;
|
||||
unsigned int i, j, digest_size;
|
||||
unsigned int digest_size;
|
||||
|
||||
/* Get the raw (binary) digest value */
|
||||
locked_EVP_MD_CTX_copy(&temp_ctx, self);
|
||||
|
@ -168,22 +167,7 @@ EVP_hexdigest(EVPobject *self, PyObject *unused)
|
|||
|
||||
EVP_MD_CTX_cleanup(&temp_ctx);
|
||||
|
||||
/* Allocate a new buffer */
|
||||
hex_digest = PyMem_Malloc(digest_size * 2 + 1);
|
||||
if (!hex_digest)
|
||||
return PyErr_NoMemory();
|
||||
|
||||
/* Make hex version of the digest */
|
||||
for(i=j=0; i<digest_size; i++) {
|
||||
unsigned char c;
|
||||
c = (digest[i] >> 4) & 0xf;
|
||||
hex_digest[j++] = Py_hexdigits[c];
|
||||
c = (digest[i] & 0xf);
|
||||
hex_digest[j++] = Py_hexdigits[c];
|
||||
}
|
||||
retval = PyUnicode_FromStringAndSize(hex_digest, digest_size * 2);
|
||||
PyMem_Free(hex_digest);
|
||||
return retval;
|
||||
return _Py_strhex((const char *)digest, digest_size);
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(EVP_update__doc__,
|
||||
|
|
|
@ -504,7 +504,7 @@ error:
|
|||
_Py_write_noraise(errpipe_write, "OSError:", 8);
|
||||
cur = hex_errno + sizeof(hex_errno);
|
||||
while (saved_errno != 0 && cur > hex_errno) {
|
||||
*--cur = "0123456789ABCDEF"[saved_errno % 16];
|
||||
*--cur = Py_hexdigits[saved_errno % 16];
|
||||
saved_errno /= 16;
|
||||
}
|
||||
_Py_write_noraise(errpipe_write, cur, hex_errno + sizeof(hex_errno) - cur);
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
|
||||
#include "Python.h"
|
||||
#include "hashlib.h"
|
||||
#include "pystrhex.h"
|
||||
|
||||
/*[clinic input]
|
||||
module _md5
|
||||
|
@ -387,32 +388,12 @@ MD5Type_hexdigest_impl(MD5object *self)
|
|||
{
|
||||
unsigned char digest[MD5_DIGESTSIZE];
|
||||
struct md5_state temp;
|
||||
PyObject *retval;
|
||||
Py_UCS1 *hex_digest;
|
||||
int i, j;
|
||||
|
||||
/* Get the raw (binary) digest value */
|
||||
temp = self->hash_state;
|
||||
md5_done(&temp, digest);
|
||||
|
||||
/* Create a new string */
|
||||
retval = PyUnicode_New(MD5_DIGESTSIZE * 2, 127);
|
||||
if (!retval)
|
||||
return NULL;
|
||||
hex_digest = PyUnicode_1BYTE_DATA(retval);
|
||||
|
||||
/* Make hex version of the digest */
|
||||
for(i=j=0; i<MD5_DIGESTSIZE; i++) {
|
||||
unsigned char c;
|
||||
c = (digest[i] >> 4) & 0xf;
|
||||
hex_digest[j++] = Py_hexdigits[c];
|
||||
c = (digest[i] & 0xf);
|
||||
hex_digest[j++] = Py_hexdigits[c];
|
||||
}
|
||||
#ifdef Py_DEBUG
|
||||
assert(_PyUnicode_CheckConsistency(retval, 1));
|
||||
#endif
|
||||
return retval;
|
||||
return _Py_strhex((const char*)digest, MD5_DIGESTSIZE);
|
||||
}
|
||||
|
||||
/*[clinic input]
|
||||
|
|
Loading…
Reference in New Issue