_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