/* cryptmodule.c - by Steve Majewski */ #include "Python.h" #include /* Module crypt */ /*[clinic input] module crypt [clinic start generated code]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=c6252cf4f2f2ae81]*/ /*[clinic input] crypt.crypt word: 's' salt: 's' / 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]*/ PyDoc_STRVAR(crypt_crypt__doc__, "crypt($module, word, salt, /)\n" "--\n" "\n" "Hash a *word* with the given *salt* and return the hashed password.\n" "\n" "*word* will usually be a user\'s password. *salt* (either a random 2 or 16\n" "character string, possibly prefixed with $digit$ to indicate the method)\n" "will be used to perturb the encryption algorithm and produce distinct\n" "results for a given *word*."); #define CRYPT_CRYPT_METHODDEF \ {"crypt", (PyCFunction)crypt_crypt, METH_VARARGS, crypt_crypt__doc__}, static PyObject * crypt_crypt_impl(PyModuleDef *module, const char *word, const char *salt); static PyObject * crypt_crypt(PyModuleDef *module, PyObject *args) { PyObject *return_value = NULL; const char *word; const char *salt; if (!PyArg_ParseTuple(args, "ss:crypt", &word, &salt)) goto exit; return_value = crypt_crypt_impl(module, word, salt); exit: return return_value; } static PyObject * crypt_crypt_impl(PyModuleDef *module, const char *word, const char *salt) /*[clinic end generated code: output=3eaacdf994a6ff23 input=4d93b6d0f41fbf58]*/ { /* On some platforms (AtheOS) crypt returns NULL for an invalid salt. Return None in that case. XXX Maybe raise an exception? */ return Py_BuildValue("s", crypt(word, salt)); } static PyMethodDef crypt_methods[] = { CRYPT_CRYPT_METHODDEF {NULL, NULL} /* sentinel */ }; static struct PyModuleDef cryptmodule = { PyModuleDef_HEAD_INIT, "_crypt", NULL, -1, crypt_methods, NULL, NULL, NULL, NULL }; PyMODINIT_FUNC PyInit__crypt(void) { return PyModule_Create(&cryptmodule); }