diff options
Diffstat (limited to 'src/XOR.c')
-rw-r--r-- | src/XOR.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/XOR.c b/src/XOR.c new file mode 100644 index 0000000..d994749 --- /dev/null +++ b/src/XOR.c @@ -0,0 +1,76 @@ +/* + * xor.c : Source for the trivial cipher which XORs the message with the key. + * The key can be up to 32 bytes long. + * + * Part of the Python Cryptography Toolkit + * + * Contributed by Barry Warsaw and others. + * + * ======================================================================= + * The contents of this file are dedicated to the public domain. To the + * extent that dedication to the public domain is not available, everyone + * is granted a worldwide, perpetual, royalty-free, non-exclusive license + * to exercise all rights associated with the contents of this file for + * any purpose whatsoever. No rights are reserved. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * ======================================================================= + */ + +#include "pycrypto_common.h" + +#define MODULE_NAME _XOR +#define BLOCK_SIZE 1 +#define KEY_SIZE 0 + +#define MAX_KEY_SIZE 32 + +typedef struct +{ + unsigned char key[MAX_KEY_SIZE]; + int keylen, last_pos; +} stream_state; + +static void +stream_init(stream_state *self, unsigned char *key, int len) +{ + int i; + + if (len > MAX_KEY_SIZE) + { + PyErr_Format(PyExc_ValueError, + "XOR key must be no longer than %d bytes", + MAX_KEY_SIZE); + return; + } + self->keylen = len; + self->last_pos = 0; + + for(i=0; i<len; i++) + { + self->key[i] = key[i]; + } +} + +/* Encryption and decryption are symmetric */ +#define stream_decrypt stream_encrypt + +static void stream_encrypt(stream_state *self, unsigned char *block, + int len) +{ + int i, j = self->last_pos; + for(i=0; i<len; i++, j=(j+1) % self->keylen) + { + block[i] ^= self->key[j]; + } + self->last_pos = j; +} + +#include "stream_template.c" |