_cryptmodule.c revision f5207e617b30495b09280081d4a0347ab516e97e
1e4c6131baab4d09d31d280fa7dbca76cbe319dbbGuido van Rossum/* cryptmodule.c - by Steve Majewski 2e4c6131baab4d09d31d280fa7dbca76cbe319dbbGuido van Rossum */ 3e4c6131baab4d09d31d280fa7dbca76cbe319dbbGuido van Rossum 456c345b23561c14c6aad48284a984cc629c90f2fRoger E. Masse#include "Python.h" 5e4c6131baab4d09d31d280fa7dbca76cbe319dbbGuido van Rossum 6e4c6131baab4d09d31d280fa7dbca76cbe319dbbGuido van Rossum#include <sys/types.h> 7e4c6131baab4d09d31d280fa7dbca76cbe319dbbGuido van Rossum 8e4c6131baab4d09d31d280fa7dbca76cbe319dbbGuido van Rossum/* Module crypt */ 9e4c6131baab4d09d31d280fa7dbca76cbe319dbbGuido van Rossum 10f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou/*[clinic input] 11f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitroumodule crypt 12f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou[clinic start generated code]*/ 13f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou/*[clinic end generated code: checksum=da39a3ee5e6b4b0d3255bfef95601890afd80709]*/ 14e4c6131baab4d09d31d280fa7dbca76cbe319dbbGuido van Rossum 15f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou 16f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou/*[clinic input] 17f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitroucrypt.crypt 18f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou 19f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou word: 's' 20f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou salt: 's' 21f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou / 22f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou 23f5207e617b30495b09280081d4a0347ab516e97eAntoine PitrouHash a *word* with the given *salt* and return the hashed password. 24f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou 25f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou*word* will usually be a user's password. *salt* (either a random 2 or 16 26f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitroucharacter string, possibly prefixed with $digit$ to indicate the method) 27f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrouwill be used to perturb the encryption algorithm and produce distinct 28f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrouresults for a given *word*. 29f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou 30f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou[clinic start generated code]*/ 31f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou 32f5207e617b30495b09280081d4a0347ab516e97eAntoine PitrouPyDoc_STRVAR(crypt_crypt__doc__, 33f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou"crypt(word, salt)\n" 34f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou"Hash a *word* with the given *salt* and return the hashed password.\n" 35f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou"\n" 36f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou"*word* will usually be a user\'s password. *salt* (either a random 2 or 16\n" 37f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou"character string, possibly prefixed with $digit$ to indicate the method)\n" 38f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou"will be used to perturb the encryption algorithm and produce distinct\n" 39f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou"results for a given *word*."); 40f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou 41f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou#define CRYPT_CRYPT_METHODDEF \ 42f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou {"crypt", (PyCFunction)crypt_crypt, METH_VARARGS, crypt_crypt__doc__}, 43f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou 44f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitroustatic PyObject * 45f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitroucrypt_crypt_impl(PyModuleDef *module, const char *word, const char *salt); 46f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou 47f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitroustatic PyObject * 48f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitroucrypt_crypt(PyModuleDef *module, PyObject *args) 49e4c6131baab4d09d31d280fa7dbca76cbe319dbbGuido van Rossum{ 50f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou PyObject *return_value = NULL; 51f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou const char *word; 52f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou const char *salt; 53f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou 54f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou if (!PyArg_ParseTuple(args, 55f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou "ss:crypt", 56f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou &word, &salt)) 57f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou goto exit; 58f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou return_value = crypt_crypt_impl(module, word, salt); 59f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou 60f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrouexit: 61f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou return return_value; 62f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou} 63e4c6131baab4d09d31d280fa7dbca76cbe319dbbGuido van Rossum 64f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitroustatic PyObject * 65f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitroucrypt_crypt_impl(PyModuleDef *module, const char *word, const char *salt) 66f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou/*[clinic end generated code: checksum=a137540bf6862f9935fc112b8bb1d62d6dd1ad02]*/ 67f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou{ 68f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* On some platforms (AtheOS) crypt returns NULL for an invalid 69f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou salt. Return None in that case. XXX Maybe raise an exception? */ 70f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return Py_BuildValue("s", crypt(word, salt)); 71e4c6131baab4d09d31d280fa7dbca76cbe319dbbGuido van Rossum} 72e4c6131baab4d09d31d280fa7dbca76cbe319dbbGuido van Rossum 73a664dbbff8ad22d0eb4ec48461d3d9a50c5fb693Fred Drake 7456c345b23561c14c6aad48284a984cc629c90f2fRoger E. Massestatic PyMethodDef crypt_methods[] = { 75f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou CRYPT_CRYPT_METHODDEF 76f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou {NULL, NULL} /* sentinel */ 77e4c6131baab4d09d31d280fa7dbca76cbe319dbbGuido van Rossum}; 78e4c6131baab4d09d31d280fa7dbca76cbe319dbbGuido van Rossum 791a21451b1d73b65af949193208372e86bf308411Martin v. Löwis 801a21451b1d73b65af949193208372e86bf308411Martin v. Löwisstatic struct PyModuleDef cryptmodule = { 81f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyModuleDef_HEAD_INIT, 82e2dfefbe85e0471c35062146a218aea2270ea600Sean Reifscheider "_crypt", 83f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou NULL, 84f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou -1, 85f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou crypt_methods, 86f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou NULL, 87f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou NULL, 88f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou NULL, 89f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou NULL 901a21451b1d73b65af949193208372e86bf308411Martin v. Löwis}; 911a21451b1d73b65af949193208372e86bf308411Martin v. Löwis 92fe51c6d66e0fbf6a142036bee2c448bd7fe8fefcMark HammondPyMODINIT_FUNC 93e2dfefbe85e0471c35062146a218aea2270ea600Sean ReifscheiderPyInit__crypt(void) 94e4c6131baab4d09d31d280fa7dbca76cbe319dbbGuido van Rossum{ 95f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return PyModule_Create(&cryptmodule); 96e4c6131baab4d09d31d280fa7dbca76cbe319dbbGuido van Rossum} 97