diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2016-04-11 20:31:14 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2016-04-11 20:31:14 +0200 |
commit | 4e04698ab6fddc1efe41b97be54fcf120810bf5d (patch) | |
tree | 38da146ade3ab5dfb26fa6ce1e986952a5b4a18d /sys/src/cmd/python/Modules | |
parent | 8f4db30e7865232f9179f5850fe0e1ca759302cc (diff) |
python: remove openssl support, use ape/libsec for cryptographics hash functions
Diffstat (limited to 'sys/src/cmd/python/Modules')
-rw-r--r-- | sys/src/cmd/python/Modules/config | 12 | ||||
-rw-r--r-- | sys/src/cmd/python/Modules/mkfile | 13 | ||||
-rw-r--r-- | sys/src/cmd/python/Modules/sechashmodule.c | 367 |
3 files changed, 381 insertions, 11 deletions
diff --git a/sys/src/cmd/python/Modules/config b/sys/src/cmd/python/Modules/config index ef3eb55bc..804fa79b7 100644 --- a/sys/src/cmd/python/Modules/config +++ b/sys/src/cmd/python/Modules/config @@ -4,15 +4,17 @@ _csv #_curses_panel _elementtree _functools -_hashlib +#_hashlib _locale _lsprof -_md5 +#_md5 _random -_sha -_sha256 +_sechash +#_sha +#_sha256 +#_sha512 _sre -_ssl +#_ssl _struct _symtable _testcapi diff --git a/sys/src/cmd/python/Modules/mkfile b/sys/src/cmd/python/Modules/mkfile index ff1bd7198..880fda8a6 100644 --- a/sys/src/cmd/python/Modules/mkfile +++ b/sys/src/cmd/python/Modules/mkfile @@ -12,14 +12,14 @@ OFILES=\ # _cursesmodule.$O\ _elementtree.$O\ _functoolsmodule.$O\ - _hashopenssl.$O\ +# _hashopenssl.$O\ _heapqmodule.$O\ # _hotshot.$O\ _localemodule.$O\ _lsprof.$O\ _randommodule.$O\ _sre.$O\ - _ssl.$O\ +# _ssl.$O\ _struct.$O\ _testcapimodule.$O\ # _tkinter.$O\ @@ -60,8 +60,8 @@ OFILES=\ # linuxaudiodev.$O\ main.$O\ mathmodule.$O\ - md5.$O\ - md5module.$O\ +# md5.$O\ +# md5module.$O\ # mmapmodule.$O\ # nismodule.$O\ operator.$O\ @@ -77,9 +77,10 @@ OFILES=\ rotatingtree.$O\ selectmodule.$O\ # sgimodule.$O\ - sha256module.$O\ +# sha256module.$O\ # sha512module.$O\ - shamodule.$O\ +# shamodule.$O\ + sechashmodule.$O\ signalmodule.$O\ socketmodule.$O\ # spwdmodule.$O\ diff --git a/sys/src/cmd/python/Modules/sechashmodule.c b/sys/src/cmd/python/Modules/sechashmodule.c new file mode 100644 index 000000000..283537244 --- /dev/null +++ b/sys/src/cmd/python/Modules/sechashmodule.c @@ -0,0 +1,367 @@ +/* Plan 9 sechash(2) module */ + +#include "Python.h" +#include "structmember.h" + +#define _PLAN9_SOURCE +#include <libsec.h> + +typedef struct { + PyObject_HEAD + + char *t; + int n, b; + DigestState *(*f)(uchar *, ulong, uchar *, DigestState *); + DigestState s; +} SHobject; + +static PyTypeObject MD5type; +static PyTypeObject SHA1type; +static PyTypeObject SHA224type; +static PyTypeObject SHA256type; +static PyTypeObject SHA384type; +static PyTypeObject SHA512type; + +static void +sh_copy(SHobject *src, SHobject *dest) +{ + dest->t = src->t; + dest->n = src->n; + dest->b = src->b; + dest->f = src->f; + dest->s = src->s; +} + +static void +sh_update(SHobject *s, uchar *buffer, int count) +{ + (*s->f)(buffer, count, NULL, &s->s); +} + +static void +sh_final(SHobject *s, uchar digest[]) +{ + (*s->f)(NULL, 0, (uchar*)digest, &s->s); +} + +static void +sh_dealloc(PyObject *ptr) +{ + PyObject_Del(ptr); +} + +PyDoc_STRVAR(SH_copy__doc__, "Return a copy of the hash object."); + +static PyObject * +SH_copy(SHobject *self, PyObject *unused) +{ + SHobject *newobj; + + newobj = PyObject_New(SHobject, ((PyObject*)self)->ob_type); + if(newobj != NULL) + sh_copy(self, newobj); + return (PyObject *)newobj; +} + +PyDoc_STRVAR(SH_digest__doc__, +"Return the digest value as a string of binary data."); + +static PyObject * +SH_digest(SHobject *self, PyObject *unused) +{ + uchar digest[64]; + SHobject temp; + + sh_copy(self, &temp); + sh_final(&temp, digest); + return PyString_FromStringAndSize((const char *)digest, self->n); +} + +PyDoc_STRVAR(SH_hexdigest__doc__, +"Return the digest value as a string of hexadecimal digits."); + +static PyObject * +SH_hexdigest(SHobject *self, PyObject *unused) +{ + uchar digest[64]; + SHobject temp; + PyObject *retval; + char *hex_digest; + int i, j; + + /* Get the raw (binary) digest value */ + sh_copy(self, &temp); + sh_final(&temp, digest); + + /* Create a new string */ + retval = PyString_FromStringAndSize(NULL, self->n * 2); + if (!retval) + return NULL; + hex_digest = PyString_AsString(retval); + if (!hex_digest) { + Py_DECREF(retval); + return NULL; + } + + /* Make hex version of the digest */ + for (i=j=0; i<self->n; i++) { + char c; + c = (digest[i] >> 4) & 0xf; + c = (c>9) ? c+'a'-10 : c + '0'; + hex_digest[j++] = c; + c = (digest[i] & 0xf); + c = (c>9) ? c+'a'-10 : c + '0'; + hex_digest[j++] = c; + } + return retval; +} + +PyDoc_STRVAR(SH_update__doc__, +"Update this hash object's state with the provided string."); + +static PyObject * +SH_update(SHobject *self, PyObject *args) +{ + uchar *cp; + int len; + + if (!PyArg_ParseTuple(args, "s#:update", &cp, &len)) + return NULL; + sh_update(self, cp, len); + Py_INCREF(Py_None); + return Py_None; +} + +static PyMethodDef SH_methods[] = { + {"copy", (PyCFunction)SH_copy, METH_NOARGS, SH_copy__doc__}, + {"digest", (PyCFunction)SH_digest, METH_NOARGS, SH_digest__doc__}, + {"hexdigest", (PyCFunction)SH_hexdigest, METH_NOARGS, SH_hexdigest__doc__}, + {"update", (PyCFunction)SH_update, METH_VARARGS, SH_update__doc__}, + {NULL, NULL} +}; + +static PyObject * +SH_get_block_size(PyObject *self, void *closure) +{ + return PyInt_FromLong(((SHobject*)self)->b); +} + +static PyObject * +SH_get_name(PyObject *self, void *closure) +{ + char *s = ((SHobject*)self)->t; + return PyString_FromStringAndSize(s, strlen(s)); +} + +static PyGetSetDef SH_getseters[] = { + {"block_size", (getter)SH_get_block_size, NULL, NULL, NULL}, + {"name", (getter)SH_get_name, NULL, NULL, NULL}, + {NULL} +}; + +static PyMemberDef SH_members[] = { + {"digest_size", T_INT, offsetof(SHobject, n), READONLY, NULL}, + {"digestsize", T_INT, offsetof(SHobject, n), READONLY, NULL}, + {NULL} +}; + +static PyTypeObject MD5type = {PyObject_HEAD_INIT(NULL)0,"_sechash.md5",sizeof(SHobject),0,sh_dealloc, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,Py_TPFLAGS_DEFAULT,0,0,0,0,0,0,0,SH_methods,SH_members,SH_getseters}; +static PyTypeObject SHA1type = {PyObject_HEAD_INIT(NULL)0,"_sechash.sha1",sizeof(SHobject),0,sh_dealloc, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,Py_TPFLAGS_DEFAULT,0,0,0,0,0,0,0,SH_methods,SH_members,SH_getseters}; +static PyTypeObject SHA224type = {PyObject_HEAD_INIT(NULL)0,"_sechash.sha224",sizeof(SHobject),0,sh_dealloc, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,Py_TPFLAGS_DEFAULT,0,0,0,0,0,0,0,SH_methods,SH_members,SH_getseters}; +static PyTypeObject SHA256type = {PyObject_HEAD_INIT(NULL)0,"_sechash.sha256",sizeof(SHobject),0,sh_dealloc, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,Py_TPFLAGS_DEFAULT,0,0,0,0,0,0,0,SH_methods,SH_members,SH_getseters}; +static PyTypeObject SHA384type = {PyObject_HEAD_INIT(NULL)0,"_sechash.sha384",sizeof(SHobject),0,sh_dealloc, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,Py_TPFLAGS_DEFAULT,0,0,0,0,0,0,0,SH_methods,SH_members,SH_getseters}; +static PyTypeObject SHA512type = {PyObject_HEAD_INIT(NULL)0,"_sechash.sha512",sizeof(SHobject),0,sh_dealloc, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,Py_TPFLAGS_DEFAULT,0,0,0,0,0,0,0,SH_methods,SH_members,SH_getseters}; + + +PyDoc_STRVAR(SHA512_new__doc__, +"Return a new SHA-512 hash object; optionally initialized with a string."); + +static PyObject * +SHA512_new(PyObject *self, PyObject *args, PyObject *kwdict) +{ + static char *kwlist[] = {"string", NULL}; + SHobject *new; + uchar *cp = NULL; + int len; + + if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|s#:new", kwlist, &cp, &len)) + return NULL; + if ((new = (SHobject *)PyObject_New(SHobject, &SHA512type)) == NULL) + return NULL; + memset(&new->s, 0, sizeof(new->s)); + new->t = "SHA512"; + new->b = 128; + new->n = SHA2_512dlen; + new->f = sha2_512; + if (cp) + sh_update(new, cp, len); + return (PyObject *)new; +} + +PyDoc_STRVAR(SHA384_new__doc__, +"Return a new SHA-384 hash object; optionally initialized with a string."); + +static PyObject * +SHA384_new(PyObject *self, PyObject *args, PyObject *kwdict) +{ + static char *kwlist[] = {"string", NULL}; + SHobject *new; + uchar *cp = NULL; + int len; + + if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|s#:new", kwlist, &cp, &len)) + return NULL; + if ((new = (SHobject *)PyObject_New(SHobject, &SHA384type)) == NULL) + return NULL; + memset(&new->s, 0, sizeof(new->s)); + new->t = "SHA384"; + new->b = 128; + new->n = SHA2_384dlen; + new->f = sha2_384; + if (cp) + sh_update(new, cp, len); + return (PyObject *)new; +} + +PyDoc_STRVAR(SHA256_new__doc__, +"Return a new SHA-256 hash object; optionally initialized with a string."); + +static PyObject * +SHA256_new(PyObject *self, PyObject *args, PyObject *kwdict) +{ + static char *kwlist[] = {"string", NULL}; + SHobject *new; + uchar *cp = NULL; + int len; + + if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|s#:new", kwlist, &cp, &len)) + return NULL; + if ((new = (SHobject *)PyObject_New(SHobject, &SHA256type)) == NULL) + return NULL; + memset(&new->s, 0, sizeof(new->s)); + new->t = "SHA256"; + new->b = 64; + new->n = SHA2_256dlen; + new->f = sha2_256; + if (cp) + sh_update(new, cp, len); + return (PyObject *)new; +} + +PyDoc_STRVAR(SHA224_new__doc__, +"Return a new SHA-224 hash object; optionally initialized with a string."); + +static PyObject * +SHA224_new(PyObject *self, PyObject *args, PyObject *kwdict) +{ + static char *kwlist[] = {"string", NULL}; + SHobject *new; + uchar *cp = NULL; + int len; + + if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|s#:new", kwlist, &cp, &len)) + return NULL; + if ((new = (SHobject *)PyObject_New(SHobject, &SHA224type)) == NULL) + return NULL; + memset(&new->s, 0, sizeof(new->s)); + new->t = "SHA224"; + new->b = 64; + new->n = SHA2_224dlen; + new->f = sha2_224; + if (cp) + sh_update(new, cp, len); + return (PyObject *)new; +} + +PyDoc_STRVAR(SHA1_new__doc__, +"Return a new SHA1 hash object; optionally initialized with a string."); + +static PyObject * +SHA1_new(PyObject *self, PyObject *args, PyObject *kwdict) +{ + static char *kwlist[] = {"string", NULL}; + SHobject *new; + uchar *cp = NULL; + int len; + + if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|s#:new", kwlist, &cp, &len)) + return NULL; + if ((new = (SHobject *)PyObject_New(SHobject, &SHA1type)) == NULL) + return NULL; + memset(&new->s, 0, sizeof(new->s)); + new->t = "SHA1"; + new->b = 64; + new->n = SHA1dlen; + new->f = sha1; + if (cp) + sh_update(new, cp, len); + return (PyObject *)new; +} + +PyDoc_STRVAR(MD5_new__doc__, +"Return a new MD5 hash object; optionally initialized with a string."); + +static PyObject * +MD5_new(PyObject *self, PyObject *args, PyObject *kwdict) +{ + static char *kwlist[] = {"string", NULL}; + SHobject *new; + uchar *cp = NULL; + int len; + + if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|s#:new", kwlist, &cp, &len)) + return NULL; + if ((new = (SHobject *)PyObject_New(SHobject, &MD5type)) == NULL) + return NULL; + memset(&new->s, 0, sizeof(new->s)); + new->t = "MD5"; + new->b = 16; + new->n = MD5dlen; + new->f = md5; + if (cp) + sh_update(new, cp, len); + return (PyObject *)new; +} + + +/* List of functions exported by this module */ + +static struct PyMethodDef SH_functions[] = { + {"sha512", (PyCFunction)SHA512_new, METH_VARARGS|METH_KEYWORDS, SHA512_new__doc__}, + {"sha384", (PyCFunction)SHA384_new, METH_VARARGS|METH_KEYWORDS, SHA384_new__doc__}, + {"sha256", (PyCFunction)SHA256_new, METH_VARARGS|METH_KEYWORDS, SHA256_new__doc__}, + {"sha224", (PyCFunction)SHA224_new, METH_VARARGS|METH_KEYWORDS, SHA224_new__doc__}, + {"sha1", (PyCFunction)SHA1_new, METH_VARARGS|METH_KEYWORDS, SHA1_new__doc__}, + {"md5", (PyCFunction)MD5_new, METH_VARARGS|METH_KEYWORDS, MD5_new__doc__}, + {NULL, NULL} /* Sentinel */ +}; + +PyMODINIT_FUNC +init_sechash(void) +{ + MD5type.ob_type = &PyType_Type; + if (PyType_Ready(&MD5type) < 0) + return; + SHA1type.ob_type = &PyType_Type; + if (PyType_Ready(&SHA1type) < 0) + return; + SHA224type.ob_type = &PyType_Type; + if (PyType_Ready(&SHA224type) < 0) + return; + SHA256type.ob_type = &PyType_Type; + if (PyType_Ready(&SHA256type) < 0) + return; + SHA384type.ob_type = &PyType_Type; + if (PyType_Ready(&SHA384type) < 0) + return; + SHA512type.ob_type = &PyType_Type; + if (PyType_Ready(&SHA512type) < 0) + return; + Py_InitModule("_sechash", SH_functions); +} |