summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog13
-rw-r--r--arcfour-crypt.c1
-rw-r--r--arcfour.c1
-rw-r--r--x86/arcfour-crypt.asm3
4 files changed, 17 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index ad65f733..30f84e2f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2004-02-05 Niels Möller <nisse@lysator.liu.se>
+
+ * testsuite/arcfour-test.c (test_main): Use test_cipher_stream.
+
+ * testsuite/testutils.c (test_cipher_stream): New function, that
+ tries dividing the input into varying size blocks before
+ processing.
+
+ * x86/arcfour-crypt.asm (nettle_arcfour_crypt): Bug fix, half of
+ the S array swap was forgotten.
+ * arcfour.c (arcfour_stream): Likewise.
+ * arcfour-crypt.c (arcfour_crypt): Likewise.
+
2004-02-05 Niels Möller <niels@s3.kth.se>
* x86/arcfour-crypt.asm (nettle_arcfour_crypt): Must store the new
diff --git a/arcfour-crypt.c b/arcfour-crypt.c
index e3d678ff..78f68311 100644
--- a/arcfour-crypt.c
+++ b/arcfour-crypt.c
@@ -46,6 +46,7 @@ arcfour_crypt(struct arcfour_ctx *ctx,
si = ctx->S[i];
j += si; j &= 0xff;
sj = ctx->S[i] = ctx->S[j];
+ ctx->S[j] = si;
*dst++ = *src++ ^ ctx->S[ (si + sj) & 0xff ];
}
ctx->i = i; ctx->j = j;
diff --git a/arcfour.c b/arcfour.c
index da039428..d8334222 100644
--- a/arcfour.c
+++ b/arcfour.c
@@ -70,6 +70,7 @@ arcfour_stream(struct arcfour_ctx *ctx,
si = ctx->S[i];
j += si; j &= 0xff;
sj = ctx->S[i] = ctx->S[j];
+ ctx->S[j] = si;
*dst++ = ctx->S[ (si + sj) & 0xff ];
}
ctx->i = i; ctx->j = j;
diff --git a/x86/arcfour-crypt.asm b/x86/arcfour-crypt.asm
index 007315ae..b997abaf 100644
--- a/x86/arcfour-crypt.asm
+++ b/x86/arcfour-crypt.asm
@@ -54,7 +54,8 @@ nettle_arcfour_crypt:
movzbl (%ebp, %eax), %ecx C si. Clears high bytes
addb %cl, %bl
movb (%ebp, %ebx), %ch C sj
- movb %ch, (%ebp, %eax)
+ movb %ch, (%ebp, %eax) C S[i] = sj
+ movb %cl, (%ebp, %ebx) C C[j] = si
addb %ch, %cl
xorb %ch, %ch C Clear, so it can be used
C for indexing.