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]*/ 13581ee3618c756132359d98b6fc149ec7e7ca9ef9Larry Hastings/*[clinic end generated code: output=da39a3ee5e6b4b0d input=c6252cf4f2f2ae81]*/ 14e4c6131baab4d09d31d280fa7dbca76cbe319dbbGuido van Rossum 151009bf18b38a8d36298575191dd8fdf43f8f9097Serhiy Storchaka#include "clinic/_cryptmodule.c.h" 16f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou 17f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou/*[clinic input] 18f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitroucrypt.crypt 19f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou 207e810a6e3d51e512968f6ac276e555ea99d151d8Serhiy Storchaka word: str 217e810a6e3d51e512968f6ac276e555ea99d151d8Serhiy Storchaka salt: str 22f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou / 23f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou 24f5207e617b30495b09280081d4a0347ab516e97eAntoine PitrouHash a *word* with the given *salt* and return the hashed password. 25f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou 26f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou*word* will usually be a user's password. *salt* (either a random 2 or 16 27f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitroucharacter string, possibly prefixed with $digit$ to indicate the method) 28f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrouwill be used to perturb the encryption algorithm and produce distinct 29f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrouresults for a given *word*. 30f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou 31f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou[clinic start generated code]*/ 32f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou 33f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitroustatic PyObject * 341a2b24f02dfd4eb3383f6ae2b59e5a4eb66fd5bbSerhiy Storchakacrypt_crypt_impl(PyObject *module, const char *word, const char *salt) 351a2b24f02dfd4eb3383f6ae2b59e5a4eb66fd5bbSerhiy Storchaka/*[clinic end generated code: output=0512284a03d2803c input=0e8edec9c364352b]*/ 36f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou{ 37f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* On some platforms (AtheOS) crypt returns NULL for an invalid 38f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou salt. Return None in that case. XXX Maybe raise an exception? */ 39f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return Py_BuildValue("s", crypt(word, salt)); 40e4c6131baab4d09d31d280fa7dbca76cbe319dbbGuido van Rossum} 41e4c6131baab4d09d31d280fa7dbca76cbe319dbbGuido van Rossum 42a664dbbff8ad22d0eb4ec48461d3d9a50c5fb693Fred Drake 4356c345b23561c14c6aad48284a984cc629c90f2fRoger E. Massestatic PyMethodDef crypt_methods[] = { 44f5207e617b30495b09280081d4a0347ab516e97eAntoine Pitrou CRYPT_CRYPT_METHODDEF 45f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou {NULL, NULL} /* sentinel */ 46e4c6131baab4d09d31d280fa7dbca76cbe319dbbGuido van Rossum}; 47e4c6131baab4d09d31d280fa7dbca76cbe319dbbGuido van Rossum 481a21451b1d73b65af949193208372e86bf308411Martin v. Löwis 491a21451b1d73b65af949193208372e86bf308411Martin v. Löwisstatic struct PyModuleDef cryptmodule = { 50f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou PyModuleDef_HEAD_INIT, 51e2dfefbe85e0471c35062146a218aea2270ea600Sean Reifscheider "_crypt", 52f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou NULL, 53f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou -1, 54f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou crypt_methods, 55f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou NULL, 56f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou NULL, 57f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou NULL, 58f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou NULL 591a21451b1d73b65af949193208372e86bf308411Martin v. Löwis}; 601a21451b1d73b65af949193208372e86bf308411Martin v. Löwis 61fe51c6d66e0fbf6a142036bee2c448bd7fe8fefcMark HammondPyMODINIT_FUNC 62e2dfefbe85e0471c35062146a218aea2270ea600Sean ReifscheiderPyInit__crypt(void) 63e4c6131baab4d09d31d280fa7dbca76cbe319dbbGuido van Rossum{ 64f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou return PyModule_Create(&cryptmodule); 65e4c6131baab4d09d31d280fa7dbca76cbe319dbbGuido van Rossum} 66