summaryrefslogtreecommitdiff
path: root/libavutil/blowfish.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2012-07-06 01:37:44 +0200
committerMichael Niedermayer <michaelni@gmx.at>2012-07-06 02:25:29 +0200
commitec086762322cccacb68cc1b41dc2b42cbd94a3f7 (patch)
tree9050fce8066cd51d025cd575b9df38370983dbe7 /libavutil/blowfish.c
parent9862cbd7a450de3e56cdf85d25a04413d7c65f88 (diff)
downloadffmpeg-ec086762322cccacb68cc1b41dc2b42cbd94a3f7.tar.gz
Blowfish: restructure/simplify code a bit.
Very slightly faster (2% or so) Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavutil/blowfish.c')
-rw-r--r--libavutil/blowfish.c44
1 files changed, 18 insertions, 26 deletions
diff --git a/libavutil/blowfish.c b/libavutil/blowfish.c
index fd894cdb80..5fe95e8d8a 100644
--- a/libavutil/blowfish.c
+++ b/libavutil/blowfish.c
@@ -294,24 +294,12 @@ static const uint32_t orig_s[4][256] = {
0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6 }
};
-static void F(AVBlowfish *ctx, uint32_t *xl, uint32_t *xr, int i)
-{
- uint32_t Xl, Xr;
- uint32_t y;
-
- Xl = *xl;
- Xr = *xr;
-
- Xl ^= ctx->p[i];
- y = ctx->s[0][(Xl >> 24) & 0xFF];
- y += ctx->s[1][(Xl >> 16) & 0xFF];
- y ^= ctx->s[2][(Xl >> 8) & 0xFF];
- y += ctx->s[3][ Xl & 0xFF];
- Xr ^= y;
-
- *xl = Xr;
- *xr = Xl;
-}
+#define F(Xl, Xr, P) \
+ Xr ^=((( ctx->s[0][ Xl >> 24 ] \
+ + ctx->s[1][(Xl >> 16) & 0xFF])\
+ ^ ctx->s[2][(Xl >> 8) & 0xFF])\
+ + ctx->s[3][ Xl & 0xFF])\
+ ^ P;
av_cold void av_blowfish_init(AVBlowfish *ctx, const uint8_t *key, int key_len)
{
@@ -358,17 +346,21 @@ void av_blowfish_crypt_ecb(AVBlowfish *ctx, uint32_t *xl, uint32_t *xr,
Xr = *xr;
if (decrypt) {
- for (i = AV_BF_ROUNDS + 1; i > 1; --i)
- F(ctx, &Xl, &Xr, i);
+ Xl ^= ctx->p[AV_BF_ROUNDS + 1];
+ for (i = AV_BF_ROUNDS; i > 0; i-=2) {
+ F(Xl, Xr, ctx->p[i ]);
+ F(Xr, Xl, ctx->p[i-1]);
+ }
- Xl = Xl ^ ctx->p[1];
- Xr = Xr ^ ctx->p[0];
+ Xr ^= ctx->p[0];
} else {
- for (i = 0; i < AV_BF_ROUNDS; ++i)
- F(ctx, &Xl, &Xr, i);
+ Xl ^= ctx->p[0];
+ for (i = 1; i < AV_BF_ROUNDS+1; i+=2){
+ F(Xl, Xr, ctx->p[i ]);
+ F(Xr, Xl, ctx->p[i+1]);
+ }
- Xl = Xl ^ ctx->p[AV_BF_ROUNDS];
- Xr = Xr ^ ctx->p[AV_BF_ROUNDS + 1];
+ Xr ^= ctx->p[AV_BF_ROUNDS + 1];
}
*xl = Xr;