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