📄 block_template.c
字号:
break; default: PyErr_Format(PyExc_SystemError, "Unknown ciphertext feedback mode %i; " "this shouldn't happen", self->mode); free(buffer); return NULL; } result=PyString_FromStringAndSize(buffer, len); free(buffer); return(result);}static char ALG_Decrypt__doc__[] ="decrypt(string): Decrypt the provided string of binary data.";static PyObject *ALG_Decrypt(ALGobject *self, PyObject *args){ unsigned char *buffer, *str; unsigned char temp[BLOCK_SIZE]; int i, j, len; PyObject *result; if (!PyArg_Parse(args, "s#", &str, &len)) return NULL; if (len==0) /* Handle empty string */ { return PyString_FromStringAndSize(NULL, 0); } if ( (len % BLOCK_SIZE) !=0 && (self->mode!=MODE_CFB && self->mode!=MODE_PGP)) { PyErr_Format(PyExc_ValueError, "Input strings must be " "a multiple of %i in length", BLOCK_SIZE); return NULL; } if (self->mode == MODE_CFB && (len % (self->segment_size/8) !=0)) { PyErr_Format(PyExc_ValueError, "Input strings must be a multiple of " "the segment size %i in length", self->segment_size/8); return NULL; } buffer=malloc(len); if (buffer==NULL) { PyErr_SetString(PyExc_MemoryError, "No memory available in " _MODULE_STRING " decrypt"); return NULL; } switch(self->mode) { case(MODE_ECB): for(i=0; i<len; i+=BLOCK_SIZE) { block_decrypt(&(self->st), str+i, buffer+i); } break; case(MODE_CBC): for(i=0; i<len; i+=BLOCK_SIZE) { memcpy(self->oldCipher, self->IV, BLOCK_SIZE); block_decrypt(&(self->st), str+i, temp); for(j=0; j<BLOCK_SIZE; j++) { buffer[i+j]=temp[j]^self->IV[j]; self->IV[j]=str[i+j]; } } break; case(MODE_CFB): for(i=0; i<len; i+=self->segment_size/8) { block_encrypt(&(self->st), self->IV, temp); for (j=0; j<self->segment_size/8; j++) { buffer[i+j] = str[i+j]^temp[j]; } if (self->segment_size == BLOCK_SIZE * 8) { /* s == b: segment size is identical to the algorithm block size */ memcpy(self->IV, str + i, BLOCK_SIZE); } else if ((self->segment_size % 8) == 0) { int sz = self->segment_size/8; memmove(self->IV, self->IV + sz, BLOCK_SIZE-sz); memcpy(self->IV + BLOCK_SIZE - sz, str + i, sz); } else { /* segment_size is not a multiple of 8; currently this can't happen */ } } break; case(MODE_PGP): if (len<=BLOCK_SIZE-self->count) { /* If less than one block, XOR it in */ unsigned char t; for(i=0; i<len; i++) { t=self->IV[self->count+i]; buffer[i] = t ^ (self->IV[self->count+i] = str[i]); } self->count += len; } else { int j; unsigned char t; for(i=0; i<BLOCK_SIZE-self->count; i++) { t=self->IV[self->count+i]; buffer[i] = t ^ (self->IV[self->count+i] = str[i]); } self->count=0; for(; i<len-BLOCK_SIZE; i+=BLOCK_SIZE) { block_encrypt(&(self->st), self->oldCipher, self->IV); for(j=0; j<BLOCK_SIZE; j++) { t=self->IV[j]; buffer[i+j] = t ^ (self->IV[j] = str[i+j]); } } /* Do the remaining 1 to BLOCK_SIZE bytes */ block_encrypt(&(self->st), self->oldCipher, self->IV); self->count=len-i; for(j=0; j<len-i; j++) { t=self->IV[j]; buffer[i+j] = t ^ (self->IV[j] = str[i+j]); } } break; case (MODE_OFB): for(i=0; i<len; i+=BLOCK_SIZE) { block_encrypt(&(self->st), self->IV, temp); memcpy(self->IV, temp, BLOCK_SIZE); for(j=0; j<BLOCK_SIZE; j++) { buffer[i+j] = str[i+j] ^ self->IV[j]; } } break; case (MODE_CTR): for(i=0; i<len; i+=BLOCK_SIZE) { PyObject *ctr = PyObject_CallObject(self->counter, NULL); if (ctr == NULL) { free(buffer); return NULL; } if (!PyString_Check(ctr)) { PyErr_SetString(PyExc_TypeError, "CTR counter function didn't return a string"); Py_DECREF(ctr); free(buffer); return NULL; } if (PyString_Size(ctr) != BLOCK_SIZE) { PyErr_SetString(PyExc_TypeError, "CTR counter function returned string of incorrect length"); Py_DECREF(ctr); free(buffer); return NULL; } block_encrypt(&(self->st), PyString_AsString(ctr), temp); Py_DECREF(ctr); for(j=0; j<BLOCK_SIZE; j++) { buffer[i+j] = str[i+j]^temp[j]; } } break; default: PyErr_Format(PyExc_SystemError, "Unknown ciphertext feedback mode %i; " "this shouldn't happen", self->mode); free(buffer); return NULL; } result=PyString_FromStringAndSize(buffer, len); free(buffer); return(result);}static char ALG_Sync__doc__[] ="sync(): For objects using the PGP feedback mode, this method modifies ""the IV, synchronizing it with the preceding ciphertext.";static PyObject *ALG_Sync(ALGobject *self, PyObject *args){ if (!PyArg_ParseTuple(args, "")) { return NULL; } if (self->mode!=MODE_PGP) { PyErr_SetString(PyExc_SystemError, "sync() operation not defined for " "this feedback mode"); return NULL; } if (self->count!=8) { memmove(self->IV+BLOCK_SIZE-self->count, self->IV, self->count); memcpy(self->IV, self->oldCipher+self->count, BLOCK_SIZE-self->count); self->count=8; } Py_INCREF(Py_None); return Py_None;}#if 0void PrintState(self, msg) ALGobject *self; char * msg;{ int count; printf("%sing: %i IV ", msg, (int)self->count); for(count=0; count<8; count++) printf("%i ", self->IV[count]); printf("\noldCipher:"); for(count=0; count<8; count++) printf("%i ", self->oldCipher[count]); printf("\n");}#endif/* ALG object methods */static PyMethodDef ALGmethods[] ={ {"encrypt", (PyCFunction) ALG_Encrypt, 0, ALG_Encrypt__doc__}, {"decrypt", (PyCFunction) ALG_Decrypt, 0, ALG_Decrypt__doc__}, {"sync", (PyCFunction) ALG_Sync, METH_VARARGS, ALG_Sync__doc__}, {NULL, NULL} /* sentinel */};static intALGsetattr(PyObject *ptr, char *name, PyObject *v){ ALGobject *self=(ALGobject *)ptr; if (strcmp(name, "IV") != 0) { PyErr_Format(PyExc_AttributeError, "non-existent block cipher object attribute '%s'", name); return -1; } if (v==NULL) { PyErr_SetString(PyExc_AttributeError, "Can't delete IV attribute of block cipher object"); return -1; } if (!PyString_Check(v)) { PyErr_SetString(PyExc_TypeError, "IV attribute of block cipher object must be string"); return -1; } if (PyString_Size(v)!=BLOCK_SIZE) { PyErr_Format(PyExc_ValueError, _MODULE_STRING " IV must be %i bytes long", BLOCK_SIZE); return -1; } memcpy(self->IV, PyString_AsString(v), BLOCK_SIZE); return 0;}static PyObject *ALGgetattr(PyObject *s, char *name){ ALGobject *self = (ALGobject*)s; if (strcmp(name, "IV") == 0) { return(PyString_FromStringAndSize(self->IV, BLOCK_SIZE)); } if (strcmp(name, "mode") == 0) { return(PyInt_FromLong((long)(self->mode))); } if (strcmp(name, "block_size") == 0) { return PyInt_FromLong(BLOCK_SIZE); } if (strcmp(name, "key_size") == 0) { return PyInt_FromLong(KEY_SIZE); } return Py_FindMethod(ALGmethods, (PyObject *) self, name);}/* List of functions defined in the module */static struct PyMethodDef modulemethods[] ={ {"new", (PyCFunction) ALGnew, METH_VARARGS|METH_KEYWORDS, ALGnew__doc__}, {NULL, NULL} /* sentinel */};static PyTypeObject ALGtype ={ PyObject_HEAD_INIT(NULL) 0, /*ob_size*/ _MODULE_STRING, /*tp_name*/ sizeof(ALGobject), /*tp_size*/ 0, /*tp_itemsize*/ /* methods */ ALGdealloc, /*tp_dealloc*/ 0, /*tp_print*/ ALGgetattr, /*tp_getattr*/ ALGsetattr, /*tp_setattr*/ 0, /*tp_compare*/ (reprfunc) 0, /*tp_repr*/ 0, /*tp_as_number*/};/* Initialization function for the 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; /* Create the module and add the functions */ m = Py_InitModule("Crypto.Cipher." _MODULE_STRING, modulemethods); PyModule_AddIntConstant(m, "MODE_ECB", MODE_ECB); PyModule_AddIntConstant(m, "MODE_CBC", MODE_CBC); PyModule_AddIntConstant(m, "MODE_CFB", MODE_CFB); PyModule_AddIntConstant(m, "MODE_PGP", MODE_PGP); PyModule_AddIntConstant(m, "MODE_OFB", MODE_OFB); PyModule_AddIntConstant(m, "MODE_CTR", MODE_CTR); PyModule_AddIntConstant(m, "block_size", BLOCK_SIZE); PyModule_AddIntConstant(m, "key_size", KEY_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 + -