blob: d99474985fd47ee533eefbdc0242d8bc69c84fe7 [file] [log] [blame]
/*
* 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"