I've introduced a bug to i386 RC4 assembler, which would emerge with
authorAndy Polyakov <appro@openssl.org>
Wed, 1 Dec 2004 15:28:18 +0000 (15:28 +0000)
committerAndy Polyakov <appro@openssl.org>
Wed, 1 Dec 2004 15:28:18 +0000 (15:28 +0000)
certain mix of calls to RC4 routine not covered by rc4test.c.
It's fixed now. In addition this patch inadvertently fixes minor
performance problem: in 0.9.7 context P4 was performing 12% slower
than the original implementation...

crypto/rc4/asm/rc4-586.pl

index 07b2bc6fcdb9777ceef4a631ff846e97e4266426..d6e98f08117f1b580751d2c96db583e1eec85423 100644 (file)
@@ -68,13 +68,13 @@ sub RC4_loop
        # &mov( $tx,            &DWP(0,$d,$x,4)) if $p < 0;
 
        &add(   &LB($y),        &LB($tx));
        # &mov( $tx,            &DWP(0,$d,$x,4)) if $p < 0;
 
        &add(   &LB($y),        &LB($tx));
-        &inc(  &LB($x));                       # NEXT ROUND
        &mov(   $ty,            &DWP(0,$d,$y,4));
         # XXX
        &mov(   $ty,            &DWP(0,$d,$y,4));
         # XXX
-       &mov(   &DWP(-4,$d,$x,4),$ty);                  # AGI
+       &mov(   &DWP(0,$d,$x,4),$ty);
         &add(  $ty,            $tx);
        &mov(   &DWP(0,$d,$y,4),$tx);
         &and(  $ty,            0xff);
         &add(  $ty,            $tx);
        &mov(   &DWP(0,$d,$y,4),$tx);
         &and(  $ty,            0xff);
+        &inc(  &LB($x));                       # NEXT ROUND
        &mov(   $tx,            &DWP(0,$d,$x,4)) if $p < 1; # NEXT ROUND
         &mov(  $ty,            &DWP(0,$d,$ty,4));
 
        &mov(   $tx,            &DWP(0,$d,$x,4)) if $p < 1; # NEXT ROUND
         &mov(  $ty,            &DWP(0,$d,$ty,4));