@@ -58,21 +58,31 @@ _blake3.blake3.__new__ as py_blake3_new
58
58
/
59
59
*
60
60
key: Py_buffer(c_default="NULL", py_default="b''") = None
61
- derive_key_context: Py_buffer (c_default="NULL", py_default="b'' ") = None
62
- max_threads: size_t = 1
61
+ derive_key_context: unicode (c_default="NULL") = None
62
+ max_threads: Py_ssize_t = - 1
63
63
usedforsecurity: bool = True
64
64
65
65
Return a new BLAKE3 hash object.
66
66
[clinic start generated code]*/
67
67
68
68
static PyObject *
69
69
py_blake3_new_impl (PyTypeObject * type , PyObject * data , Py_buffer * key ,
70
- Py_buffer * derive_key_context , size_t max_threads ,
70
+ PyObject * derive_key_context , Py_ssize_t max_threads ,
71
71
int usedforsecurity )
72
- /*[clinic end generated code: output=6e24ea74302a9e97 input=3d50acf8631d64ae ]*/
72
+ /*[clinic end generated code: output=5520c7ccfcc0ea6c input=484a9211624e61a2 ]*/
73
73
{
74
- if ((key -> obj != NULL ) && (derive_key_context -> obj != NULL )) {
75
- PyErr_SetString (PyExc_ValueError , "cannot specify both key and derive_key_context" );
74
+ if ((derive_key_context != NULL ) && !PyUnicode_GetLength (derive_key_context )) {
75
+ PyErr_SetString (PyExc_ValueError , "empty derive_key_context string is invalid" );
76
+ return NULL ;
77
+ }
78
+
79
+ if ((key -> obj != NULL ) && (derive_key_context != NULL )) {
80
+ PyErr_SetString (PyExc_ValueError , "key and derive_key_context can't be used together" );
81
+ return NULL ;
82
+ }
83
+
84
+ if ((max_threads < 1 ) && (max_threads != -1 )) {
85
+ PyErr_SetString (PyExc_ValueError , "invalid value for max_threads" );
76
86
return NULL ;
77
87
}
78
88
@@ -83,19 +93,22 @@ py_blake3_new_impl(PyTypeObject *type, PyObject *data, Py_buffer *key,
83
93
84
94
/* Initialize with key */
85
95
if ((key -> obj != NULL ) && key -> len ) {
86
- if (key -> len > BLAKE3_KEY_LEN ) {
87
- PyErr_Format (PyExc_ValueError ,
88
- "maximum key length is %d bytes" ,
89
- BLAKE3_KEY_LEN );
96
+ if (key -> len != BLAKE3_KEY_LEN ) {
97
+ PyErr_SetString (PyExc_ValueError , "key must be exactly 32 bytes" );
90
98
goto error ;
91
99
}
92
100
93
101
uint8_t key_array [BLAKE3_KEY_LEN ];
94
102
memset (key_array , 0 , sizeof (key_array ));
95
103
memcpy (key_array , key -> buf , key -> len );
96
104
blake3_hasher_init_keyed (& self -> self , key_array );
97
- } else if ((derive_key_context -> obj != NULL ) && derive_key_context -> len ) {
98
- blake3_hasher_init_derive_key_raw (& self -> self , derive_key_context -> buf , derive_key_context -> len );
105
+ } else if (derive_key_context != NULL ) {
106
+ Py_ssize_t length ;
107
+ const char * utf8_key_context = PyUnicode_AsUTF8AndSize (derive_key_context , & length );
108
+ if (!utf8_key_context ) {
109
+ goto error ;
110
+ }
111
+ blake3_hasher_init_derive_key_raw (& self -> self , utf8_key_context , length );
99
112
} else {
100
113
blake3_hasher_init (& self -> self );
101
114
}
@@ -123,6 +136,22 @@ py_blake3_new_impl(PyTypeObject *type, PyObject *data, Py_buffer *key,
123
136
return NULL ;
124
137
}
125
138
139
+ /*[clinic input]
140
+ _blake3.blake3.reset
141
+
142
+ Reset this hash object to its initial state.
143
+ [clinic start generated code]*/
144
+
145
+ static PyObject *
146
+ _blake3_blake3_reset_impl (BLAKE3Object * self )
147
+ /*[clinic end generated code: output=d03fd37d58b87017 input=ba958463850a68df]*/
148
+ {
149
+ ENTER_HASHLIB (self );
150
+ blake3_hasher_reset (& self -> self );
151
+ LEAVE_HASHLIB (self );
152
+ Py_RETURN_NONE ;
153
+ }
154
+
126
155
/*[clinic input]
127
156
_blake3.blake3.copy
128
157
@@ -256,10 +285,11 @@ _blake3_blake3_hexdigest_impl(BLAKE3Object *self, size_t length, size_t seek)
256
285
257
286
258
287
static PyMethodDef py_blake3_methods [] = {
259
- _BLAKE3_BLAKE3_COPY_METHODDEF
260
- _BLAKE3_BLAKE3_DIGEST_METHODDEF
261
- _BLAKE3_BLAKE3_HEXDIGEST_METHODDEF
262
288
_BLAKE3_BLAKE3_UPDATE_METHODDEF
289
+ _BLAKE3_BLAKE3_HEXDIGEST_METHODDEF
290
+ _BLAKE3_BLAKE3_DIGEST_METHODDEF
291
+ _BLAKE3_BLAKE3_COPY_METHODDEF
292
+ _BLAKE3_BLAKE3_RESET_METHODDEF
263
293
{NULL , NULL }
264
294
};
265
295
@@ -327,7 +357,7 @@ py_blake3_dealloc(PyObject *o)
327
357
{
328
358
BLAKE3Object * self = (BLAKE3Object * )o ;
329
359
330
- /* Try not to leave state in memory. */
360
+ /* Don't leave state in memory. */
331
361
secure_zero_memory (& self -> self , sizeof (self -> self ));
332
362
if (self -> lock ) {
333
363
PyThread_free_lock (self -> lock );
0 commit comments