1/* cryptmodule.c - by Steve Majewski 2 */ 3 4#include "Python.h" 5 6#include <sys/types.h> 7#ifdef HAVE_CRYPT_H 8#include <crypt.h> 9#endif 10 11/* Module crypt */ 12 13/*[clinic input] 14module crypt 15[clinic start generated code]*/ 16/*[clinic end generated code: output=da39a3ee5e6b4b0d input=c6252cf4f2f2ae81]*/ 17 18#include "clinic/_cryptmodule.c.h" 19 20/*[clinic input] 21crypt.crypt 22 23 word: str 24 salt: str 25 / 26 27Hash a *word* with the given *salt* and return the hashed password. 28 29*word* will usually be a user's password. *salt* (either a random 2 or 16 30character string, possibly prefixed with $digit$ to indicate the method) 31will be used to perturb the encryption algorithm and produce distinct 32results for a given *word*. 33 34[clinic start generated code]*/ 35 36static PyObject * 37crypt_crypt_impl(PyObject *module, const char *word, const char *salt) 38/*[clinic end generated code: output=0512284a03d2803c input=0e8edec9c364352b]*/ 39{ 40 char *crypt_result; 41#ifdef HAVE_CRYPT_R 42 struct crypt_data data; 43 memset(&data, 0, sizeof(data)); 44 crypt_result = crypt_r(word, salt, &data); 45#else 46 crypt_result = crypt(word, salt); 47#endif 48 if (crypt_result == NULL) { 49 return PyErr_SetFromErrno(PyExc_OSError); 50 } 51 return Py_BuildValue("s", crypt_result); 52} 53 54 55static PyMethodDef crypt_methods[] = { 56 CRYPT_CRYPT_METHODDEF 57 {NULL, NULL} /* sentinel */ 58}; 59 60static PyModuleDef_Slot _crypt_slots[] = { 61 {0, NULL} 62}; 63 64static struct PyModuleDef cryptmodule = { 65 PyModuleDef_HEAD_INIT, 66 "_crypt", 67 NULL, 68 0, 69 crypt_methods, 70 _crypt_slots, 71 NULL, 72 NULL, 73 NULL 74}; 75 76PyMODINIT_FUNC 77PyInit__crypt(void) 78{ 79 return PyModuleDef_Init(&cryptmodule); 80} 81