⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hash_template.c

📁 python的加密库
💻 C
字号:
/* *  hash_template.c : Generic framework for hash function extension modules * * Distribute and use freely; there are no restrictions on further  * dissemination and usage except those imposed by the laws of your  * country of residence.  This software is provided "as is" without * warranty of fitness for use or suitability for any purpose, express * or implied. Use at your own risk or not at all.  * */  /* Basic object type */#ifdef HAVE_CONFIG_H#include "config.h"#endif#ifdef _HAVE_STDC_HEADERS#include <string.h>#endif#define _STR(x) #x#define _XSTR(x) _STR(x)#define _PASTE(x,y) x##y#define _PASTE2(x,y) _PASTE(x,y)#define _MODULE_NAME _PASTE2(init,MODULE_NAME)#define _MODULE_STRING _XSTR(MODULE_NAME)typedef struct {	PyObject_HEAD	hash_state st;} ALGobject;staticforward PyTypeObject ALGtype;#define is_ALGobject(v) ((v)->ob_type == &ALGtype)static ALGobject *newALGobject(void){	ALGobject *new;	new = PyObject_New(ALGobject, &ALGtype);	return new;}/* Internal methods for a hashing object */static voidALG_dealloc(PyObject *ptr){	ALGobject *self = (ALGobject *)ptr;	/* Overwrite the contents of the object */	memset((char*)&(self->st), 0, sizeof(hash_state));	PyObject_Del(ptr);}/* External methods for a hashing object */static char ALG_copy__doc__[] = "copy(): Return a copy of the hashing object.";static PyObject *ALG_copy(ALGobject *self, PyObject *args){	ALGobject *newobj;	if (!PyArg_ParseTuple(args, "")) {		return NULL;	}		if ( (newobj = newALGobject())==NULL)		return NULL;	hash_copy(&(self->st), &(newobj->st));	return((PyObject *)newobj); }static char ALG_digest__doc__[] = "digest(): Return the digest value as a string of binary data.";static PyObject *ALG_digest(ALGobject *self, PyObject *args){	if (!PyArg_ParseTuple(args, ""))		return NULL;	return (PyObject *)hash_digest(&(self->st));}static char ALG_hexdigest__doc__[] = "hexdigest(): Return the digest value as a string of hexadecimal digits.";static PyObject *ALG_hexdigest(ALGobject *self, PyObject *args){	PyObject *value, *retval;	unsigned char *raw_digest, *hex_digest;	int i, j, size;	if (!PyArg_ParseTuple(args, ""))		return NULL;	/* Get the raw (binary) digest value */	value = (PyObject *)hash_digest(&(self->st));	size = PyString_Size(value);	raw_digest = PyString_AsString(value);	/* Create a new string */	retval = PyString_FromStringAndSize(NULL, size * 2 );	hex_digest = PyString_AsString(retval);	/* Make hex version of the digest */	for(i=j=0; i<size; i++)		{		char c;		c = raw_digest[i] / 16; c = (c>9) ? c+'a'-10 : c + '0';		hex_digest[j++] = c;		c = raw_digest[i] % 16; c = (c>9) ? c+'a'-10 : c + '0';		hex_digest[j++] = c;	}		Py_DECREF(value);	return retval;}static char ALG_update__doc__[] = "update(string): Update this hashing object's state with the provided string.";static PyObject *ALG_update(ALGobject *self, PyObject *args){	unsigned char *cp;	int len;	if (!PyArg_ParseTuple(args, "s#", &cp, &len))		return NULL;	hash_update(&(self->st), cp, len);	Py_INCREF(Py_None);	return Py_None;}static PyMethodDef ALG_methods[] = {	{"copy", (PyCFunction)ALG_copy, METH_VARARGS, ALG_copy__doc__},	{"digest", (PyCFunction)ALG_digest, METH_VARARGS, ALG_digest__doc__},	{"hexdigest", (PyCFunction)ALG_hexdigest, METH_VARARGS, 	 ALG_hexdigest__doc__},	{"update", (PyCFunction)ALG_update, METH_VARARGS, ALG_update__doc__},	{NULL,			NULL}		/* sentinel */};static PyObject *ALG_getattr(PyObject *self, char *name){	if (strcmp(name, "digest_size")==0)		return PyInt_FromLong(DIGEST_SIZE);		return Py_FindMethod(ALG_methods, self, name);}static PyTypeObject ALGtype = {	PyObject_HEAD_INIT(NULL)	0,			/*ob_size*/	_MODULE_STRING,			/*tp_name*/	sizeof(ALGobject),	/*tp_size*/	0,			/*tp_itemsize*/	/* methods */	ALG_dealloc, /*tp_dealloc*/	0,			/*tp_print*/	ALG_getattr, /*tp_getattr*/	0,			/*tp_setattr*/	0,			/*tp_compare*/	0,			/*tp_repr*/        0,			/*tp_as_number*/};/* The single module-level function: new() */static char ALG_new__doc__[] ="new([string]): Return a new " _MODULE_STRING " hashing object.  An optional string ""argument may be provided; if present, this string will be ""automatically hashed into the initial state of the object."; static PyObject *ALG_new(PyObject *self, PyObject *args){        ALGobject *new;	unsigned char *cp = NULL;	int len;		if ((new = newALGobject()) == NULL)		return NULL;	if (!PyArg_ParseTuple(args, "|s#",			      &cp, &len)) {	        Py_DECREF(new);		return NULL;	}        hash_init(&(new->st));	if (PyErr_Occurred()) {		Py_DECREF(new); 		return NULL;	}	if (cp)		hash_update(&(new->st), cp, len);	return (PyObject *)new;}/* List of functions exported by this module */static struct PyMethodDef ALG_functions[] = {	{"new", (PyCFunction)ALG_new, METH_VARARGS, ALG_new__doc__},	{NULL,			NULL}		 /* Sentinel */};/* Initialize this module. */#if PYTHON_API_VERSION < 1011#define PyModule_AddIntConstant(m,n,v) {PyObject *o=PyInt_FromLong(v); \           if (o!=NULL) \             {PyDict_SetItemString(PyModule_GetDict(m),n,o); Py_DECREF(o);}}#endifvoid_MODULE_NAME (void){	PyObject *m;	ALGtype.ob_type = &PyType_Type;	m = Py_InitModule("Crypto.Hash." _MODULE_STRING, ALG_functions);	/* Add some symbolic constants to the module */	PyModule_AddIntConstant(m, "digest_size", DIGEST_SIZE);	/* Check for errors */	if (PyErr_Occurred())		Py_FatalError("can't initialize module "                               _MODULE_STRING);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -