| @@ -21,6 +21,7 @@ | |||
| #include <stdlib.h> | |||
| #include <string.h> | |||
| #include "libavutil/mem.h" | |||
| #include "libavutil/blowfish.h" | |||
| #define NUM_VARIABLE_KEY_TESTS 34 | |||
| @@ -144,46 +145,49 @@ static void test_blowfish(AVBlowfish *ctx, uint8_t *dst, const uint8_t *src, | |||
| int main(void) | |||
| { | |||
| AVBlowfish ctx; | |||
| uint32_t tmptext_l[NUM_VARIABLE_KEY_TESTS]; | |||
| uint32_t tmptext_r[NUM_VARIABLE_KEY_TESTS]; | |||
| uint8_t tmp[16], iv[8]; | |||
| int i; | |||
| AVBlowfish *ctx = av_blowfish_alloc(); | |||
| if (!ctx) | |||
| return 1; | |||
| av_blowfish_init(&ctx, "abcdefghijklmnopqrstuvwxyz", 26); | |||
| av_blowfish_init(ctx, "abcdefghijklmnopqrstuvwxyz", 26); | |||
| 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"); | |||
| 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"); | |||
| 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"); | |||
| 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"); | |||
| 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"); | |||
| 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); | |||
| for (i = 0; i < NUM_VARIABLE_KEY_TESTS; i++) { | |||
| av_blowfish_init(&ctx, variable_key[i], 8); | |||
| av_blowfish_init(ctx, variable_key[i], 8); | |||
| av_blowfish_crypt_ecb(&ctx, &tmptext_l[i], &tmptext_r[i], 0); | |||
| av_blowfish_crypt_ecb(ctx, &tmptext_l[i], &tmptext_r[i], 0); | |||
| if (tmptext_l[i] != ciphertext_l[i] || tmptext_r[i] != ciphertext_r[i]) { | |||
| printf("Test encryption failed.\n"); | |||
| return 2; | |||
| } | |||
| av_blowfish_crypt_ecb(&ctx, &tmptext_l[i], &tmptext_r[i], 1); | |||
| av_blowfish_crypt_ecb(ctx, &tmptext_l[i], &tmptext_r[i], 1); | |||
| if (tmptext_l[i] != plaintext_l[i] || tmptext_r[i] != plaintext_r[i]) { | |||
| printf("Test decryption failed.\n"); | |||
| return 3; | |||
| } | |||
| } | |||
| printf("Test encryption/decryption success.\n"); | |||
| av_free(ctx); | |||
| return 0; | |||
| } | |||