| @@ -21,6 +21,7 @@ | |||||
| #include <stdlib.h> | #include <stdlib.h> | ||||
| #include <string.h> | #include <string.h> | ||||
| #include "libavutil/mem.h" | |||||
| #include "libavutil/blowfish.h" | #include "libavutil/blowfish.h" | ||||
| #define NUM_VARIABLE_KEY_TESTS 34 | #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) | int main(void) | ||||
| { | { | ||||
| AVBlowfish ctx; | |||||
| uint32_t tmptext_l[NUM_VARIABLE_KEY_TESTS]; | uint32_t tmptext_l[NUM_VARIABLE_KEY_TESTS]; | ||||
| uint32_t tmptext_r[NUM_VARIABLE_KEY_TESTS]; | uint32_t tmptext_r[NUM_VARIABLE_KEY_TESTS]; | ||||
| uint8_t tmp[16], iv[8]; | uint8_t tmp[16], iv[8]; | ||||
| int i; | 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); | 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); | 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); | 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); | 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_l, plaintext_l, sizeof(*plaintext_l) * NUM_VARIABLE_KEY_TESTS); | ||||
| memcpy(tmptext_r, plaintext_r, sizeof(*plaintext_r) * 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++) { | 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]) { | if (tmptext_l[i] != ciphertext_l[i] || tmptext_r[i] != ciphertext_r[i]) { | ||||
| printf("Test encryption failed.\n"); | printf("Test encryption failed.\n"); | ||||
| return 2; | 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]) { | if (tmptext_l[i] != plaintext_l[i] || tmptext_r[i] != plaintext_r[i]) { | ||||
| printf("Test decryption failed.\n"); | printf("Test decryption failed.\n"); | ||||
| return 3; | return 3; | ||||
| } | } | ||||
| } | } | ||||
| printf("Test encryption/decryption success.\n"); | printf("Test encryption/decryption success.\n"); | ||||
| av_free(ctx); | |||||
| return 0; | return 0; | ||||
| } | } | ||||