Show More
@@ -25,8 +25,8 b' typedef struct {' | |||
|
25 | 25 | |
|
26 | 26 | static int pysha1ctx_init(pysha1ctx *self, PyObject *args) |
|
27 | 27 | { |
|
28 | const char *data = NULL; | |
|
29 | Py_ssize_t len; | |
|
28 | Py_buffer data; | |
|
29 | data.obj = NULL; | |
|
30 | 30 | |
|
31 | 31 | SHA1DCInit(&(self->ctx)); |
|
32 | 32 | /* We don't want "safe" sha1s, wherein sha1dc can give you a |
@@ -34,11 +34,19 b' static int pysha1ctx_init(pysha1ctx *sel' | |||
|
34 | 34 | collision. We just want to detect collisions. |
|
35 | 35 | */ |
|
36 | 36 | SHA1DCSetSafeHash(&(self->ctx), 0); |
|
37 |
if (!PyArg_ParseTuple(args, PY23("|s |
|
|
37 | if (!PyArg_ParseTuple(args, PY23("|s*", "|y*"), &data)) { | |
|
38 | 38 | return -1; |
|
39 | 39 | } |
|
40 | if (data) { | |
|
41 | SHA1DCUpdate(&(self->ctx), data, len); | |
|
40 | if (data.obj) { | |
|
41 | if (!PyBuffer_IsContiguous(&data, 'C') || data.ndim > 1) { | |
|
42 | PyErr_SetString(PyExc_BufferError, | |
|
43 | "buffer must be contiguous and single dimension"); | |
|
44 | PyBuffer_Release(&data); | |
|
45 | return -1; | |
|
46 | } | |
|
47 | ||
|
48 | SHA1DCUpdate(&(self->ctx), data.buf, data.len); | |
|
49 | PyBuffer_Release(&data); | |
|
42 | 50 | } |
|
43 | 51 | return 0; |
|
44 | 52 | } |
@@ -50,12 +58,18 b' static void pysha1ctx_dealloc(pysha1ctx ' | |||
|
50 | 58 | |
|
51 | 59 | static PyObject *pysha1ctx_update(pysha1ctx *self, PyObject *args) |
|
52 | 60 | { |
|
53 | const char *data; | |
|
54 | Py_ssize_t len; | |
|
55 | if (!PyArg_ParseTuple(args, PY23("s#", "y#"), &data, &len)) { | |
|
61 | Py_buffer data; | |
|
62 | if (!PyArg_ParseTuple(args, PY23("s*", "y*"), &data)) { | |
|
56 | 63 | return NULL; |
|
57 | 64 | } |
|
58 | SHA1DCUpdate(&(self->ctx), data, len); | |
|
65 | if (!PyBuffer_IsContiguous(&data, 'C') || data.ndim > 1) { | |
|
66 | PyErr_SetString(PyExc_BufferError, | |
|
67 | "buffer must be contiguous and single dimension"); | |
|
68 | PyBuffer_Release(&data); | |
|
69 | return NULL; | |
|
70 | } | |
|
71 | SHA1DCUpdate(&(self->ctx), data.buf, data.len); | |
|
72 | PyBuffer_Release(&data); | |
|
59 | 73 | Py_RETURN_NONE; |
|
60 | 74 | } |
|
61 | 75 |
@@ -45,6 +45,26 b' class hashertestsbase(object):' | |||
|
45 | 45 | h.digest(), |
|
46 | 46 | ) |
|
47 | 47 | |
|
48 | def test_bytes_like_types(self): | |
|
49 | h = self.hasher() | |
|
50 | h.update(bytearray(b'foo')) | |
|
51 | h.update(memoryview(b'baz')) | |
|
52 | self.assertEqual( | |
|
53 | '21eb6533733a5e4763acacd1d45a60c2e0e404e1', h.hexdigest() | |
|
54 | ) | |
|
55 | ||
|
56 | h = self.hasher(bytearray(b'foo')) | |
|
57 | h.update(b'baz') | |
|
58 | self.assertEqual( | |
|
59 | '21eb6533733a5e4763acacd1d45a60c2e0e404e1', h.hexdigest() | |
|
60 | ) | |
|
61 | ||
|
62 | h = self.hasher(memoryview(b'foo')) | |
|
63 | h.update(b'baz') | |
|
64 | self.assertEqual( | |
|
65 | '21eb6533733a5e4763acacd1d45a60c2e0e404e1', h.hexdigest() | |
|
66 | ) | |
|
67 | ||
|
48 | 68 | |
|
49 | 69 | class hashlibtests(unittest.TestCase, hashertestsbase): |
|
50 | 70 | hasher = hashlib.sha1 |
General Comments 0
You need to be logged in to leave comments.
Login now