/* * 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; ikey[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; ikeylen) { block[i] ^= self->key[j]; } self->last_pos = j; } #include "stream_template.c"