summaryrefslogtreecommitdiff
path: root/pycryptopp/cipher
diff options
context:
space:
mode:
Diffstat (limited to 'pycryptopp/cipher')
-rw-r--r--pycryptopp/cipher/__init__.py3
-rw-r--r--pycryptopp/cipher/aes.py68
-rw-r--r--pycryptopp/cipher/aesmodule.cpp187
-rw-r--r--pycryptopp/cipher/aesmodule.hpp7
4 files changed, 0 insertions, 265 deletions
diff --git a/pycryptopp/cipher/__init__.py b/pycryptopp/cipher/__init__.py
deleted file mode 100644
index 9033868..0000000
--- a/pycryptopp/cipher/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-import aes
-
-quiet_pyflakes=[aes]
diff --git a/pycryptopp/cipher/aes.py b/pycryptopp/cipher/aes.py
deleted file mode 100644
index 7280063..0000000
--- a/pycryptopp/cipher/aes.py
+++ /dev/null
@@ -1,68 +0,0 @@
-
-from pycryptopp import _import_my_names
-
-# These initializations to None are just to pacify pyflakes, which
-# doesn't understand that we have to do some funky import trickery
-# below in _import_my_names() in order to get sensible namespaces.
-AES=None
-Error=None
-
-_import_my_names(globals(), "aes_")
-
-del _import_my_names
-
-def start_up_self_test():
- """
- This is a quick test intended to detect major errors such as the library being
- miscompiled and segfaulting or returning incorrect answers. We've had problems
- of that kind many times, thus justifying running this self-test on import.
- This idea was suggested to me by the second edition of "Practical
- Cryptography" by Ferguson, Schneier, and Kohno.
- These tests were copied from pycryptopp/test/test_aes.py on 2009-10-30.
- """
- enc0 = "dc95c078a2408989ad48a21492842087530f8afbc74536b9a963b4f1c4cb738b"
- from binascii import a2b_hex, b2a_hex
-
- cryptor = AES(key="\x00"*32)
- ct = cryptor.process("\x00"*32)
- if enc0 != b2a_hex(ct):
- raise Error("pycryptopp failed startup self-test. Please run pycryptopp unit tests.")
-
- cryptor = AES(key="\x00"*32)
- ct1 = cryptor.process("\x00"*15)
- ct2 = cryptor.process("\x00"*17)
- if enc0 != b2a_hex(ct1+ct2):
- raise Error("pycryptopp failed startup self-test. Please run pycryptopp unit tests.")
-
- enc0 = "66e94bd4ef8a2c3b884cfa59ca342b2e"
- cryptor = AES(key="\x00"*16)
- ct = cryptor.process("\x00"*16)
- if enc0 != b2a_hex(ct):
- raise Error("pycryptopp failed startup self-test. Please run pycryptopp unit tests.")
-
- cryptor = AES(key="\x00"*16)
- ct1 = cryptor.process("\x00"*8)
- ct2 = cryptor.process("\x00"*8)
- if enc0 != b2a_hex(ct1+ct2):
- raise Error("pycryptopp failed startup self-test. Please run pycryptopp unit tests.")
-
- def _test_from_Niels_AES(keysize, result):
- def fake_ecb_using_ctr(k, p):
- return AES(key=k, iv=p).process('\x00'*16)
-
- E = fake_ecb_using_ctr
- b = 16
- k = keysize
- S = '\x00' * (k+b)
- for i in range(1000):
- K = S[-k:]
- P = S[-k-b:-k]
- S += E(K, E(K, P))
-
- if S[-b:] != a2b_hex(result):
- raise Error("pycryptopp failed startup self-test. Please run pycryptopp unit tests.")
-
- _test_from_Niels_AES(16, 'bd883f01035e58f42f9d812f2dacbcd8')
- _test_from_Niels_AES(32, 'c84b0f3a2c76dd9871900b07f09bdd3e')
-
-start_up_self_test()
diff --git a/pycryptopp/cipher/aesmodule.cpp b/pycryptopp/cipher/aesmodule.cpp
deleted file mode 100644
index cca48f4..0000000
--- a/pycryptopp/cipher/aesmodule.cpp
+++ /dev/null
@@ -1,187 +0,0 @@
-/**
- * aesmodule.cpp -- Python wrappers around Crypto++'s AES-CTR
- */
-
-#define PY_SSIZE_T_CLEAN
-#include <Python.h>
-#if (PY_VERSION_HEX < 0x02050000)
-typedef int Py_ssize_t;
-#endif
-
-#include "aesmodule.hpp"
-
-
-/* from Crypto++ */
-#ifdef DISABLE_EMBEDDED_CRYPTOPP
-#include <cryptopp/modes.h>
-#include <cryptopp/aes.h>
-#else
-#include <embeddedcryptopp/modes.h>
-#include <embeddedcryptopp/aes.h>
-#endif
-
-static const char*const aes___doc__ = "_aes counter mode cipher\n\
-You are advised to run aes.start_up_self_test() after importing this module.";
-
-static PyObject *aes_error;
-
-typedef struct {
- PyObject_HEAD
-
- /* internal */
- CryptoPP::CTR_Mode<CryptoPP::AES>::Encryption * e;
-} AES;
-
-PyDoc_STRVAR(AES__doc__,
-"An AES cipher object.\n\
-\n\
-This object encrypts/decrypts in CTR mode, using a counter that is initialized\n\
-to zero when you instantiate the object. Successive calls to .process() will\n\
-use the current counter value and increment it.\n\
-\n\
-Note that you must never encrypt different data with the same key, or you\n\
-will leak information about your data. Therefore the only safe way to use\n\
-this class is to use a different AES key every time you are going to encrypt\n\
-different data. A good way to generate a different AES key is using AES, like\n\
-this:\n\
-\n\
- onetimekey = AES(key=masterkey).process(nonce)\n\
-\n\
-Where 'masterkey' is a secret key used only for generating onetimekeys this\
-way, and 'nonce' is a value that is guaranteed to never repeat.\
-\n\
-@param key: the symmetric encryption key; a string of exactly 16 bytes\
-");
-
-static PyObject *
-AES_process(AES* self, PyObject* msgobj) {
- if (!PyString_CheckExact(msgobj)) {
- PyStringObject* typerepr = reinterpret_cast<PyStringObject*>(PyObject_Repr(reinterpret_cast<PyObject*>(msgobj->ob_type)));
- if (typerepr) {
- PyErr_Format(aes_error, "Precondition violation: you are required to pass a Python string object (not a unicode, a subclass of string, or anything else), but you passed %s.", PyString_AS_STRING(reinterpret_cast<PyObject*>(typerepr)));
- Py_DECREF(typerepr);
- } else
- PyErr_Format(aes_error, "Precondition violation: you are required to pass a Python string object (not a unicode, a subclass of string, or anything else).");
- return NULL;
- }
-
- const char *msg;
- Py_ssize_t msgsize;
- if (PyString_AsStringAndSize(msgobj, const_cast<char**>(&msg), &msgsize))
- return NULL;
- assert (msgsize >= 0);
-
- PyStringObject* result = reinterpret_cast<PyStringObject*>(PyString_FromStringAndSize(NULL, msgsize));
- if (!result)
- return NULL;
-
- self->e->ProcessData(reinterpret_cast<byte*>(PyString_AS_STRING(result)), reinterpret_cast<const byte*>(msg), msgsize);
- return reinterpret_cast<PyObject*>(result);
-}
-
-PyDoc_STRVAR(AES_process__doc__,
-"Encrypt or decrypt the next bytes, returning the result.");
-
-static PyMethodDef AES_methods[] = {
- {"process", reinterpret_cast<PyCFunction>(AES_process), METH_O, AES_process__doc__},
- {NULL},
-};
-
-static PyObject *
-AES_new(PyTypeObject* type, PyObject *args, PyObject *kwdict) {
- AES* self = reinterpret_cast<AES*>(type->tp_alloc(type, 0));
- if (!self)
- return NULL;
- self->e = NULL;
- return reinterpret_cast<PyObject*>(self);
-}
-
-static void
-AES_dealloc(PyObject* self) {
- if (reinterpret_cast<AES*>(self)->e)
- delete reinterpret_cast<AES*>(self)->e;
- self->ob_type->tp_free(self);
-}
-
-static int
-AES_init(PyObject* self, PyObject *args, PyObject *kwdict) {
- static const char *kwlist[] = { "key", "iv", NULL };
- const char *key = NULL;
- Py_ssize_t keysize = 0;
- const char *iv = NULL;
- const char defaultiv[CryptoPP::AES::BLOCKSIZE] = {0};
- Py_ssize_t ivsize = 0;
- if (!PyArg_ParseTupleAndKeywords(args, kwdict, "t#|t#:AES.__init__", const_cast<char**>(kwlist), &key, &keysize, &iv, &ivsize))
- return -1;
- assert (keysize >= 0);
- assert (ivsize >= 0);
-
- if (!iv)
- iv = defaultiv;
- try {
- reinterpret_cast<AES*>(self)->e = new CryptoPP::CTR_Mode<CryptoPP::AES>::Encryption(reinterpret_cast<const byte*>(key), keysize, reinterpret_cast<const byte*>(iv));
- } catch (CryptoPP::InvalidKeyLength le) {
- PyErr_Format(aes_error, "Precondition violation: you are required to pass a valid key size. Crypto++ gave this exception: %s", le.what());
- return -1;
- }
- if (!reinterpret_cast<AES*>(self)->e) {
- PyErr_NoMemory();
- return -1;
- }
- return 0;
-}
-
-static PyTypeObject AES_type = {
- PyObject_HEAD_INIT(NULL)
- 0, /*ob_size*/
- "_aes.AES", /*tp_name*/
- sizeof(AES), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- AES_dealloc, /*tp_dealloc*/
- 0, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- 0, /*tp_compare*/
- 0, /*tp_repr*/
- 0, /*tp_as_number*/
- 0, /*tp_as_sequence*/
- 0, /*tp_as_mapping*/
- 0, /*tp_hash */
- 0, /*tp_call*/
- 0, /*tp_str*/
- 0, /*tp_getattro*/
- 0, /*tp_setattro*/
- 0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
- AES__doc__, /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- AES_methods, /* tp_methods */
- 0, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- AES_init, /* tp_init */
- 0, /* tp_alloc */
- AES_new, /* tp_new */
-};
-
-void
-init_aes(PyObject*const module) {
- if (PyType_Ready(&AES_type) < 0)
- return;
- Py_INCREF(&AES_type);
- PyModule_AddObject(module, "aes_AES", (PyObject *)&AES_type);
-
- aes_error = PyErr_NewException(const_cast<char*>("_aes.Error"), NULL, NULL);
- PyModule_AddObject(module, "aes_Error", aes_error);
-
- PyModule_AddStringConstant(module, "aes___doc__", const_cast<char*>(aes___doc__));
-}
diff --git a/pycryptopp/cipher/aesmodule.hpp b/pycryptopp/cipher/aesmodule.hpp
deleted file mode 100644
index d10f44f..0000000
--- a/pycryptopp/cipher/aesmodule.hpp
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef __INCL_AESMODULE_HPP
-#define __INCL_AESMODULE_HPP
-
-extern void
-init_aes(PyObject* module);
-
-#endif /* #ifndef __INCL_AESMODULE_HPP */