123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- /* 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[] = {
- {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);
- }
|