| /* |
| * Written in 2013 by Dmitry Chestnykh <dmitry@codingrobots.com> |
| * Modified for CPython by Christian Heimes <christian@python.org> |
| * |
| * To the extent possible under law, the author have dedicated all |
| * copyright and related and neighboring rights to this software to |
| * the public domain worldwide. This software is distributed without |
| * any warranty. http://creativecommons.org/publicdomain/zero/1.0/ |
| */ |
| |
| #include "Python.h" |
| |
| #include "impl/blake2.h" |
| |
| extern PyTypeObject PyBlake2_BLAKE2bType; |
| extern PyTypeObject PyBlake2_BLAKE2sType; |
| |
| |
| PyDoc_STRVAR(blake2mod__doc__, |
| "_blake2b provides BLAKE2b for hashlib\n" |
| ); |
| |
| |
| static struct PyMethodDef blake2mod_functions[] = { |
| {NULL, NULL} |
| }; |
| |
| static struct PyModuleDef blake2_module = { |
| PyModuleDef_HEAD_INIT, |
| "_blake2", |
| blake2mod__doc__, |
| -1, |
| blake2mod_functions, |
| NULL, |
| NULL, |
| NULL, |
| NULL |
| }; |
| |
| #define ADD_INT(d, name, value) do { \ |
| PyObject *x = PyLong_FromLong(value); \ |
| if (!x) { \ |
| Py_DECREF(m); \ |
| return NULL; \ |
| } \ |
| if (PyDict_SetItemString(d, name, x) < 0) { \ |
| Py_DECREF(m); \ |
| return NULL; \ |
| } \ |
| Py_DECREF(x); \ |
| } while(0) |
| |
| |
| PyMODINIT_FUNC |
| PyInit__blake2(void) |
| { |
| PyObject *m; |
| PyObject *d; |
| |
| m = PyModule_Create(&blake2_module); |
| if (m == NULL) |
| return NULL; |
| |
| /* BLAKE2b */ |
| Py_TYPE(&PyBlake2_BLAKE2bType) = &PyType_Type; |
| if (PyType_Ready(&PyBlake2_BLAKE2bType) < 0) { |
| return NULL; |
| } |
| |
| Py_INCREF(&PyBlake2_BLAKE2bType); |
| PyModule_AddObject(m, "blake2b", (PyObject *)&PyBlake2_BLAKE2bType); |
| |
| d = PyBlake2_BLAKE2bType.tp_dict; |
| ADD_INT(d, "SALT_SIZE", BLAKE2B_SALTBYTES); |
| ADD_INT(d, "PERSON_SIZE", BLAKE2B_PERSONALBYTES); |
| ADD_INT(d, "MAX_KEY_SIZE", BLAKE2B_KEYBYTES); |
| ADD_INT(d, "MAX_DIGEST_SIZE", BLAKE2B_OUTBYTES); |
| |
| PyModule_AddIntConstant(m, "BLAKE2B_SALT_SIZE", BLAKE2B_SALTBYTES); |
| PyModule_AddIntConstant(m, "BLAKE2B_PERSON_SIZE", BLAKE2B_PERSONALBYTES); |
| PyModule_AddIntConstant(m, "BLAKE2B_MAX_KEY_SIZE", BLAKE2B_KEYBYTES); |
| PyModule_AddIntConstant(m, "BLAKE2B_MAX_DIGEST_SIZE", BLAKE2B_OUTBYTES); |
| |
| /* BLAKE2s */ |
| Py_TYPE(&PyBlake2_BLAKE2sType) = &PyType_Type; |
| if (PyType_Ready(&PyBlake2_BLAKE2sType) < 0) { |
| return NULL; |
| } |
| |
| Py_INCREF(&PyBlake2_BLAKE2sType); |
| PyModule_AddObject(m, "blake2s", (PyObject *)&PyBlake2_BLAKE2sType); |
| |
| d = PyBlake2_BLAKE2sType.tp_dict; |
| ADD_INT(d, "SALT_SIZE", BLAKE2S_SALTBYTES); |
| ADD_INT(d, "PERSON_SIZE", BLAKE2S_PERSONALBYTES); |
| ADD_INT(d, "MAX_KEY_SIZE", BLAKE2S_KEYBYTES); |
| ADD_INT(d, "MAX_DIGEST_SIZE", BLAKE2S_OUTBYTES); |
| |
| PyModule_AddIntConstant(m, "BLAKE2S_SALT_SIZE", BLAKE2S_SALTBYTES); |
| PyModule_AddIntConstant(m, "BLAKE2S_PERSON_SIZE", BLAKE2S_PERSONALBYTES); |
| PyModule_AddIntConstant(m, "BLAKE2S_MAX_KEY_SIZE", BLAKE2S_KEYBYTES); |
| PyModule_AddIntConstant(m, "BLAKE2S_MAX_DIGEST_SIZE", BLAKE2S_OUTBYTES); |
| |
| return m; |
| } |