1 /*
2  * Written in 2013 by Dmitry Chestnykh <dmitry@codingrobots.com>
3  * Modified for CPython by Christian Heimes <christian@python.org>
4  *
5  * To the extent possible under law, the author have dedicated all
6  * copyright and related and neighboring rights to this software to
7  * the public domain worldwide. This software is distributed without
8  * any warranty. http://creativecommons.org/publicdomain/zero/1.0/
9  */
10 
11 #include "Python.h"
12 
13 #include "impl/blake2.h"
14 
15 extern PyTypeObject PyBlake2_BLAKE2bType;
16 extern PyTypeObject PyBlake2_BLAKE2sType;
17 
18 
19 PyDoc_STRVAR(blake2mod__doc__,
20 "_blake2b provides BLAKE2b for hashlib\n"
21 );
22 
23 
24 static struct PyMethodDef blake2mod_functions[] = {
25     {NULL, NULL}
26 };
27 
28 static struct PyModuleDef blake2_module = {
29     PyModuleDef_HEAD_INIT,
30     "_blake2",
31     blake2mod__doc__,
32     -1,
33     blake2mod_functions,
34     NULL,
35     NULL,
36     NULL,
37     NULL
38 };
39 
40 #define ADD_INT(d, name, value) do { \
41     PyObject *x = PyLong_FromLong(value); \
42     if (!x) { \
43         Py_DECREF(m); \
44         return NULL; \
45     } \
46     if (PyDict_SetItemString(d, name, x) < 0) { \
47         Py_DECREF(m); \
48         return NULL; \
49     } \
50     Py_DECREF(x); \
51 } while(0)
52 
53 
54 PyMODINIT_FUNC
PyInit__blake2(void)55 PyInit__blake2(void)
56 {
57     PyObject *m;
58     PyObject *d;
59 
60     m = PyModule_Create(&blake2_module);
61     if (m == NULL)
62         return NULL;
63 
64     /* BLAKE2b */
65     Py_TYPE(&PyBlake2_BLAKE2bType) = &PyType_Type;
66     if (PyType_Ready(&PyBlake2_BLAKE2bType) < 0) {
67         return NULL;
68     }
69 
70     Py_INCREF(&PyBlake2_BLAKE2bType);
71     PyModule_AddObject(m, "blake2b", (PyObject *)&PyBlake2_BLAKE2bType);
72 
73     d = PyBlake2_BLAKE2bType.tp_dict;
74     ADD_INT(d, "SALT_SIZE", BLAKE2B_SALTBYTES);
75     ADD_INT(d, "PERSON_SIZE", BLAKE2B_PERSONALBYTES);
76     ADD_INT(d, "MAX_KEY_SIZE", BLAKE2B_KEYBYTES);
77     ADD_INT(d, "MAX_DIGEST_SIZE", BLAKE2B_OUTBYTES);
78 
79     PyModule_AddIntConstant(m, "BLAKE2B_SALT_SIZE", BLAKE2B_SALTBYTES);
80     PyModule_AddIntConstant(m, "BLAKE2B_PERSON_SIZE", BLAKE2B_PERSONALBYTES);
81     PyModule_AddIntConstant(m, "BLAKE2B_MAX_KEY_SIZE", BLAKE2B_KEYBYTES);
82     PyModule_AddIntConstant(m, "BLAKE2B_MAX_DIGEST_SIZE", BLAKE2B_OUTBYTES);
83 
84     /* BLAKE2s */
85     Py_TYPE(&PyBlake2_BLAKE2sType) = &PyType_Type;
86     if (PyType_Ready(&PyBlake2_BLAKE2sType) < 0) {
87         return NULL;
88     }
89 
90     Py_INCREF(&PyBlake2_BLAKE2sType);
91     PyModule_AddObject(m, "blake2s", (PyObject *)&PyBlake2_BLAKE2sType);
92 
93     d = PyBlake2_BLAKE2sType.tp_dict;
94     ADD_INT(d, "SALT_SIZE", BLAKE2S_SALTBYTES);
95     ADD_INT(d, "PERSON_SIZE", BLAKE2S_PERSONALBYTES);
96     ADD_INT(d, "MAX_KEY_SIZE", BLAKE2S_KEYBYTES);
97     ADD_INT(d, "MAX_DIGEST_SIZE", BLAKE2S_OUTBYTES);
98 
99     PyModule_AddIntConstant(m, "BLAKE2S_SALT_SIZE", BLAKE2S_SALTBYTES);
100     PyModule_AddIntConstant(m, "BLAKE2S_PERSON_SIZE", BLAKE2S_PERSONALBYTES);
101     PyModule_AddIntConstant(m, "BLAKE2S_MAX_KEY_SIZE", BLAKE2S_KEYBYTES);
102     PyModule_AddIntConstant(m, "BLAKE2S_MAX_DIGEST_SIZE", BLAKE2S_OUTBYTES);
103 
104     return m;
105 }
106