/* cryptmodule.c - by Steve Majewski */ #include "Python.h" #include #ifdef HAVE_CRYPT_H #include #endif /* Module crypt */ /*[clinic input] module crypt [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=c6252cf4f2f2ae81]*/ #include "clinic/_cryptmodule.c.h" /*[clinic input] crypt.crypt word: str salt: str / Hash a *word* with the given *salt* and return the hashed password. *word* will usually be a user's password. *salt* (either a random 2 or 16 character string, possibly prefixed with $digit$ to indicate the method) will be used to perturb the encryption algorithm and produce distinct results for a given *word*. [clinic start generated code]*/ static PyObject * crypt_crypt_impl(PyObject *module, const char *word, const char *salt) /*[clinic end generated code: output=0512284a03d2803c input=0e8edec9c364352b]*/ { char *crypt_result; #ifdef HAVE_CRYPT_R struct crypt_data data; memset(&data, 0, sizeof(data)); crypt_result = crypt_r(word, salt, &data); #else crypt_result = crypt(word, salt); #endif if (crypt_result == NULL) { return PyErr_SetFromErrno(PyExc_OSError); } return Py_BuildValue("s", crypt_result); } static PyMethodDef crypt_methods[] = { CRYPT_CRYPT_METHODDEF {NULL, NULL} /* sentinel */ }; static PyModuleDef_Slot _crypt_slots[] = { {Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED}, {0, NULL} }; static struct PyModuleDef cryptmodule = { PyModuleDef_HEAD_INIT, "_crypt", NULL, 0, crypt_methods, _crypt_slots, NULL, NULL, NULL }; PyMODINIT_FUNC PyInit__crypt(void) { return PyModuleDef_Init(&cryptmodule); }