summaryrefslogtreecommitdiff
path: root/src/ARC4.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ARC4.c')
-rw-r--r--src/ARC4.c90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/ARC4.c b/src/ARC4.c
new file mode 100644
index 0000000..a125fab
--- /dev/null
+++ b/src/ARC4.c
@@ -0,0 +1,90 @@
+
+/*
+ * arc4.c : Implementation for the Alleged-RC4 stream cipher
+ *
+ * Part of the Python Cryptography Toolkit
+ *
+ * Originally written by: A.M. Kuchling
+ *
+ * ===================================================================
+ * 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 _ARC4
+#define BLOCK_SIZE 1
+#define KEY_SIZE 0
+
+typedef struct
+{
+ unsigned char state[256];
+ unsigned char x,y;
+} stream_state;
+
+/* Encryption and decryption are symmetric */
+#define stream_decrypt stream_encrypt
+
+static void stream_encrypt(stream_state *self, unsigned char *block,
+ int len)
+{
+ register int i, x=self->x, y=self->y;
+
+ for (i=0; i<len; i++)
+ {
+ x = (x + 1) % 256;
+ y = (y + self->state[x]) % 256;
+ {
+ register int t; /* Exchange state[x] and state[y] */
+ t = self->state[x];
+ self->state[x] = self->state[y];
+ self->state[y] = t;
+ }
+ {
+ register int xorIndex; /* XOR the data with the stream data */
+ xorIndex=(self->state[x]+self->state[y]) % 256;
+ block[i] ^= self->state[xorIndex];
+ }
+ }
+ self->x=x;
+ self->y=y;
+}
+
+
+static void stream_init(stream_state *self, unsigned char *key, int keylen)
+{
+ register int i, index1, index2;
+
+ for(i=0; i<256; i++) self->state[i]=i;
+ self->x=0; self->y=0;
+ index1=0; index2=0;
+ for(i=0; i<256; i++)
+ {
+ register int t;
+ index2 = ( key[index1] + self->state[i] + index2) % 256;
+ t = self->state[i];
+ self->state[i] = self->state[index2];
+ self->state[index2] = t;
+ index1 = (index1 + 1) % keylen;
+ }
+}
+
+#include "stream_template.c"
+
+