| /* cryptmodule.c - by Steve Majewski | |
| */ | |
| #include "Python.h" | |
| #include <sys/types.h> | |
| #ifdef HAVE_CRYPT_H | |
| #include <crypt.h> | |
| #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[] = { | |
| {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); | |
| } |