summaryrefslogtreecommitdiff
path: root/src/XOR.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/XOR.c')
-rw-r--r--src/XOR.c76
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"