diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-10-04 12:30:25 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-10-04 12:30:25 +0200 |
commit | 741f5b021a0494676de0dab543f8a9591ec2e01e (patch) | |
tree | 51b8243f64192e37c61bf03d18a25f40fd4c0d6d /libavutil/blowfish.c | |
parent | 047dcfabc7e8932490836be94ef3b2ecc8289ab0 (diff) | |
parent | 29abb04e73b0580ebe38703cadb988d26df6a76a (diff) | |
download | ffmpeg-741f5b021a0494676de0dab543f8a9591ec2e01e.tar.gz |
Merge commit '29abb04e73b0580ebe38703cadb988d26df6a76a'
* commit '29abb04e73b0580ebe38703cadb988d26df6a76a':
libspeexdec: If the channel count is not valid, decode as stereo.
libspeexdec: improve setting of Speex mode and sample rate
libspeex: Add a private option for enabling VAD
xtea: Test inplace decryption
xtea: Fix CBC decryption when src==dst
xtea: Factorize testing into a separate function
configure: Refactor HAVE_ options available on the command line
avconv/avprobe: Add missing 'void' to exit_program() definition
Allow use of strncpy()
blowfish: Add more tests
blowfish: Fix CBC decryption with dst==src
blowfish: Factorize testing into a separate function
Conflicts:
configure
libavcodec/libspeexdec.c
libavutil/xtea.c
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavutil/blowfish.c')
-rw-r--r-- | libavutil/blowfish.c | 63 |
1 files changed, 46 insertions, 17 deletions
diff --git a/libavutil/blowfish.c b/libavutil/blowfish.c index 5fe95e8d8a..cdc2952dea 100644 --- a/libavutil/blowfish.c +++ b/libavutil/blowfish.c @@ -380,15 +380,15 @@ void av_blowfish_crypt(AVBlowfish *ctx, uint8_t *dst, const uint8_t *src, av_blowfish_crypt_ecb(ctx, &v0, &v1, decrypt); - AV_WB32(dst, v0); - AV_WB32(dst + 4, v1); - if (iv) { - for (i = 0; i < 8; i++) - dst[i] = dst[i] ^ iv[i]; + v0 ^= AV_RB32(iv); + v1 ^= AV_RB32(iv + 4); memcpy(iv, src, 8); } + AV_WB32(dst, v0); + AV_WB32(dst + 4, v1); + src += 8; dst += 8; } @@ -509,32 +509,61 @@ static const uint32_t ciphertext_r[NUM_VARIABLE_KEY_TESTS] = { /* plaintext bytes */ static const uint8_t plaintext[8] = "BLOWFISH"; +static const uint8_t plaintext2[16] = "BLOWFISHBLOWFISH"; + /* ciphertext bytes */ static const uint8_t ciphertext[8] = { 0x32, 0x4E, 0xD0, 0xFE, 0xF4, 0x13, 0xA2, 0x03 }; +static const uint8_t ciphertext2[16] = { + 0x53, 0x00, 0x40, 0x06, 0x63, 0xf2, 0x1d, 0x99, + 0x3b, 0x9b, 0x27, 0x64, 0x46, 0xfd, 0x20, 0xc1, +}; + +#define IV "blowfish" + +#undef exit +static void test_blowfish(AVBlowfish *ctx, uint8_t *dst, const uint8_t *src, + const uint8_t *ref, int len, uint8_t *iv, int dir, + const char *test) +{ + av_blowfish_crypt(ctx, dst, src, len, iv, dir); + if (memcmp(dst, ref, 8*len)) { + int i; + printf("%s failed\ngot ", test); + for (i = 0; i < 8*len; i++) + printf("%02x ", dst[i]); + printf("\nexpected "); + for (i = 0; i < 8*len; i++) + printf("%02x ", ref[i]); + printf("\n"); + exit(1); + } +} + int main(void) { AVBlowfish ctx; uint32_t tmptext_l[NUM_VARIABLE_KEY_TESTS]; uint32_t tmptext_r[NUM_VARIABLE_KEY_TESTS]; - uint8_t tmp[8]; + uint8_t tmp[16], iv[8]; int i; av_blowfish_init(&ctx, "abcdefghijklmnopqrstuvwxyz", 26); - av_blowfish_crypt(&ctx, tmp, plaintext, 1, NULL, 0); - if (memcmp(tmp, ciphertext, 8)) { - printf("Test encryption failed.\n"); - return 1; - } - - av_blowfish_crypt(&ctx, tmp, ciphertext, 1, NULL, 1); - if (memcmp(tmp, plaintext, 8)) { - printf("Test decryption failed.\n"); - return 1; - } + test_blowfish(&ctx, tmp, plaintext, ciphertext, 1, NULL, 0, "encryption"); + test_blowfish(&ctx, tmp, ciphertext, plaintext, 1, NULL, 1, "decryption"); + test_blowfish(&ctx, tmp, tmp, ciphertext, 1, NULL, 0, "Inplace encryption"); + test_blowfish(&ctx, tmp, tmp, plaintext, 1, NULL, 1, "Inplace decryption"); + memcpy(iv, IV, 8); + test_blowfish(&ctx, tmp, plaintext2, ciphertext2, 2, iv, 0, "CBC encryption"); + memcpy(iv, IV, 8); + test_blowfish(&ctx, tmp, ciphertext2, plaintext2, 2, iv, 1, "CBC decryption"); + memcpy(iv, IV, 8); + test_blowfish(&ctx, tmp, tmp, ciphertext2, 2, iv, 0, "Inplace CBC encryption"); + memcpy(iv, IV, 8); + test_blowfish(&ctx, tmp, tmp, plaintext2, 2, iv, 1, "Inplace CBC decryption"); memcpy(tmptext_l, plaintext_l, sizeof(*plaintext_l) * NUM_VARIABLE_KEY_TESTS); memcpy(tmptext_r, plaintext_r, sizeof(*plaintext_r) * NUM_VARIABLE_KEY_TESTS); |