diff --git a/arcfour.c b/arcfour.c index 03c9cd8801e0a9bb8c9a2f678abe596c46871ff2..d5424348eecde3420f8ff76d734152098b4e4f0e 100644 --- a/arcfour.c +++ b/arcfour.c @@ -63,14 +63,16 @@ arcfour_crypt(struct arcfour_ctx *ctx, const uint8_t *src) { register uint8_t i, j; + register int si, sj; i = ctx->i; j = ctx->j; while(length--) { i++; i &= 0xff; - j += ctx->S[i]; j &= 0xff; - SWAP(ctx->S[i], ctx->S[j]); - *dst++ = *src++ ^ ctx->S[ (ctx->S[i] + ctx->S[j]) & 0xff ]; + si = ctx->S[i]; + j += si; j &= 0xff; + sj = ctx->S[i] = ctx->S[j]; + *dst++ = *src++ ^ ctx->S[ (si + sj) & 0xff ]; } ctx->i = i; ctx->j = j; } @@ -80,14 +82,16 @@ arcfour_stream(struct arcfour_ctx *ctx, unsigned length, uint8_t *dst) { register uint8_t i, j; + register int si, sj; i = ctx->i; j = ctx->j; while(length--) { i++; i &= 0xff; - j += ctx->S[i]; j &= 0xff; - SWAP(ctx->S[i], ctx->S[j]); - *dst++ = ctx->S[ (ctx->S[i] + ctx->S[j]) & 0xff ]; + si = ctx->S[i]; + j += si; j &= 0xff; + sj = ctx->S[i] = ctx->S[j]; + *dst++ = ctx->S[ (si + sj) & 0xff ]; } ctx->i = i; ctx->j = j; }