diff options
author | Dwayne Litzenberger <dlitz@dlitz.net> | 2014-06-09 05:14:13 -0700 |
---|---|---|
committer | Dwayne Litzenberger <dlitz@dlitz.net> | 2014-06-09 05:14:15 -0700 |
commit | 460a33f6f7949320e3df5c9f5f12b70bf1310412 (patch) | |
tree | 68549842dbc48d5a1b14984f24f3bc2ba4697062 | |
parent | 2d1aecd731f91f7367ef2a4069d305e2a1b488c0 (diff) | |
download | pycrypto-select-modes.tar.gz |
Allow block ciphers to specify which modes they supportselect-modes
-rw-r--r-- | src/AES.c | 6 | ||||
-rw-r--r-- | src/AESNI.c | 6 | ||||
-rw-r--r-- | src/ARC2.c | 6 | ||||
-rw-r--r-- | src/Blowfish.c | 6 | ||||
-rw-r--r-- | src/CAST.c | 6 | ||||
-rw-r--r-- | src/DES.c | 6 | ||||
-rw-r--r-- | src/block_template.c | 31 | ||||
-rw-r--r-- | src/pycrypto_common.h | 5 |
8 files changed, 64 insertions, 8 deletions
@@ -32,6 +32,12 @@ #define BLOCK_SIZE 16 #define KEY_SIZE 0 +#define HAS_ENCRYPT 1 +#define HAS_MODE_CBC 1 +#define HAS_MODE_CFB 1 +#define HAS_MODE_OFB 1 +#define HAS_MODE_CTR 1 + #define MAXKC (256/32) #define MAXKB (256/8) #define MAXNR 14 diff --git a/src/AESNI.c b/src/AESNI.c index 50f0cd6..b8e0030 100644 --- a/src/AESNI.c +++ b/src/AESNI.c @@ -33,6 +33,12 @@ #define BLOCK_SIZE 16 #define KEY_SIZE 0 +#define HAS_ENCRYPT 1 +#define HAS_MODE_CBC 1 +#define HAS_MODE_CFB 1 +#define HAS_MODE_OFB 1 +#define HAS_MODE_CTR 1 + #define MAXKC (256/32) #define MAXKB (256/8) #define MAXNR 14 @@ -49,6 +49,12 @@ #define KEY_SIZE 0 #define PCT_ARC2_MODULE /* Defined to get ARC2's additional keyword arguments */ +#define HAS_ENCRYPT 1 +#define HAS_MODE_CBC 1 +#define HAS_MODE_CFB 1 +#define HAS_MODE_OFB 1 +#define HAS_MODE_CTR 1 + typedef uint32_t U32; typedef uint16_t U16; typedef uint8_t U8; diff --git a/src/Blowfish.c b/src/Blowfish.c index f1ab55a..cd0a54a 100644 --- a/src/Blowfish.c +++ b/src/Blowfish.c @@ -35,6 +35,12 @@ #define BLOCK_SIZE 8 /* 64-bit block size */ #define KEY_SIZE 0 /* variable key size */ +#define HAS_ENCRYPT 1 +#define HAS_MODE_CBC 1 +#define HAS_MODE_CFB 1 +#define HAS_MODE_OFB 1 +#define HAS_MODE_CTR 1 + #define BLOWFISH_MAGIC 0xf9d565deu typedef struct { uint32_t magic; @@ -48,6 +48,12 @@ #define BLOCK_SIZE 8 #define KEY_SIZE 0 +#define HAS_ENCRYPT 1 +#define HAS_MODE_CBC 1 +#define HAS_MODE_CFB 1 +#define HAS_MODE_OFB 1 +#define HAS_MODE_CTR 1 + /* adjust these according to your compiler/platform. On some machines uint32 will have to be a long. It's OK if uint32 is more than 32 bits. */ typedef uint32_t uint32; @@ -37,6 +37,12 @@ #include <assert.h> +#define HAS_ENCRYPT 1 +#define HAS_MODE_CBC 1 +#define HAS_MODE_CFB 1 +#define HAS_MODE_OFB 1 +#define HAS_MODE_CTR 1 + typedef struct { symmetric_key sk; } block_state; diff --git a/src/block_template.c b/src/block_template.c index 99aee43..fcd5265 100644 --- a/src/block_template.c +++ b/src/block_template.c @@ -134,17 +134,30 @@ ALGnew(PyObject *self, PyObject *args, PyObject *kwdict) return NULL; } - if (mode<MODE_ECB || mode>MODE_CTR) - { - PyErr_Format(PyExc_ValueError, - "Unknown cipher feedback mode %i", - mode); - return NULL; - } - if (mode == MODE_PGP) { + switch (mode) { + case MODE_ECB: +#ifdef HAS_MODE_CBC + case MODE_CBC: +#endif +#ifdef HAS_MODE_CFB + case MODE_CFB: +#endif +#ifdef HAS_MODE_OFB + case MODE_OFB: +#endif +#ifdef HAS_MODE_CTR + case MODE_CTR: +#endif + break; + case MODE_PGP: PyErr_Format(PyExc_ValueError, "MODE_PGP is not supported anymore"); return NULL; + default: + PyErr_Format(PyExc_ValueError, + "Unknown or unsupported cipher feedback mode %i", + mode); + return NULL; } if (KEY_SIZE!=0 && keylen!=KEY_SIZE) { @@ -611,7 +624,9 @@ ALG_Decrypt(ALGobject *self, PyObject *args) /* ALG object methods */ static PyMethodDef ALGmethods[] = { +#ifdef HAS_ENCRYPT {"encrypt", (PyCFunction) ALG_Encrypt, METH_O, ALG_Encrypt__doc__}, +#endif {"decrypt", (PyCFunction) ALG_Decrypt, METH_O, ALG_Decrypt__doc__}, {NULL, NULL} /* sentinel */ }; diff --git a/src/pycrypto_common.h b/src/pycrypto_common.h index 3182ec1..626543e 100644 --- a/src/pycrypto_common.h +++ b/src/pycrypto_common.h @@ -37,5 +37,10 @@ # error "stdint.h and inttypes.h not found" #endif +#undef HAS_ENCRYPT +#undef HAS_MODE_CBC +#undef HAS_MODE_CFB +#undef HAS_MODE_OFB +#undef HAS_MODE_CTR #endif /* PYCRYPTO_COMMON_H */ |