2 * This file is part of FFmpeg.
4 * FFmpeg is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * FFmpeg is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with FFmpeg; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 #include "libavutil/blowfish.h"
26 #define NUM_VARIABLE_KEY_TESTS 34
28 /* plaintext bytes -- left halves */
29 static const uint32_t plaintext_l[NUM_VARIABLE_KEY_TESTS] = {
30 0x00000000, 0xFFFFFFFF, 0x10000000, 0x11111111, 0x11111111,
31 0x01234567, 0x00000000, 0x01234567, 0x01A1D6D0, 0x5CD54CA8,
32 0x0248D438, 0x51454B58, 0x42FD4430, 0x059B5E08, 0x0756D8E0,
33 0x762514B8, 0x3BDD1190, 0x26955F68, 0x164D5E40, 0x6B056E18,
34 0x004BD6EF, 0x480D3900, 0x437540C8, 0x072D43A0, 0x02FE5577,
35 0x1D9D5C50, 0x30553228, 0x01234567, 0x01234567, 0x01234567,
36 0xFFFFFFFF, 0x00000000, 0x00000000, 0xFFFFFFFF
39 /* plaintext bytes -- right halves */
40 static const uint32_t plaintext_r[NUM_VARIABLE_KEY_TESTS] = {
41 0x00000000, 0xFFFFFFFF, 0x00000001, 0x11111111, 0x11111111,
42 0x89ABCDEF, 0x00000000, 0x89ABCDEF, 0x39776742, 0x3DEF57DA,
43 0x06F67172, 0x2DDF440A, 0x59577FA2, 0x51CF143A, 0x774761D2,
44 0x29BF486A, 0x49372802, 0x35AF609A, 0x4F275232, 0x759F5CCA,
45 0x09176062, 0x6EE762F2, 0x698F3CFA, 0x77075292, 0x8117F12A,
46 0x18F728C2, 0x6D6F295A, 0x89ABCDEF, 0x89ABCDEF, 0x89ABCDEF,
47 0xFFFFFFFF, 0x00000000, 0x00000000, 0xFFFFFFFF
50 /* key bytes for variable key tests */
51 static const uint8_t variable_key[NUM_VARIABLE_KEY_TESTS][8] = {
52 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
53 { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
54 { 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
55 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 },
56 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF },
57 { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 },
58 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
59 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 },
60 { 0x7C, 0xA1, 0x10, 0x45, 0x4A, 0x1A, 0x6E, 0x57 },
61 { 0x01, 0x31, 0xD9, 0x61, 0x9D, 0xC1, 0x37, 0x6E },
62 { 0x07, 0xA1, 0x13, 0x3E, 0x4A, 0x0B, 0x26, 0x86 },
63 { 0x38, 0x49, 0x67, 0x4C, 0x26, 0x02, 0x31, 0x9E },
64 { 0x04, 0xB9, 0x15, 0xBA, 0x43, 0xFE, 0xB5, 0xB6 },
65 { 0x01, 0x13, 0xB9, 0x70, 0xFD, 0x34, 0xF2, 0xCE },
66 { 0x01, 0x70, 0xF1, 0x75, 0x46, 0x8F, 0xB5, 0xE6 },
67 { 0x43, 0x29, 0x7F, 0xAD, 0x38, 0xE3, 0x73, 0xFE },
68 { 0x07, 0xA7, 0x13, 0x70, 0x45, 0xDA, 0x2A, 0x16 },
69 { 0x04, 0x68, 0x91, 0x04, 0xC2, 0xFD, 0x3B, 0x2F },
70 { 0x37, 0xD0, 0x6B, 0xB5, 0x16, 0xCB, 0x75, 0x46 },
71 { 0x1F, 0x08, 0x26, 0x0D, 0x1A, 0xC2, 0x46, 0x5E },
72 { 0x58, 0x40, 0x23, 0x64, 0x1A, 0xBA, 0x61, 0x76 },
73 { 0x02, 0x58, 0x16, 0x16, 0x46, 0x29, 0xB0, 0x07 },
74 { 0x49, 0x79, 0x3E, 0xBC, 0x79, 0xB3, 0x25, 0x8F },
75 { 0x4F, 0xB0, 0x5E, 0x15, 0x15, 0xAB, 0x73, 0xA7 },
76 { 0x49, 0xE9, 0x5D, 0x6D, 0x4C, 0xA2, 0x29, 0xBF },
77 { 0x01, 0x83, 0x10, 0xDC, 0x40, 0x9B, 0x26, 0xD6 },
78 { 0x1C, 0x58, 0x7F, 0x1C, 0x13, 0x92, 0x4F, 0xEF },
79 { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
80 { 0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E },
81 { 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE },
82 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
83 { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
84 { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF },
85 { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }
88 /* ciphertext bytes -- left halves */
89 static const uint32_t ciphertext_l[NUM_VARIABLE_KEY_TESTS] = {
90 0x4EF99745, 0x51866FD5, 0x7D856F9A, 0x2466DD87, 0x61F9C380,
91 0x7D0CC630, 0x4EF99745, 0x0ACEAB0F, 0x59C68245, 0xB1B8CC0B,
92 0x1730E577, 0xA25E7856, 0x353882B1, 0x48F4D088, 0x432193B7,
93 0x13F04154, 0x2EEDDA93, 0xD887E039, 0x5F99D04F, 0x4A057A3B,
94 0x452031C1, 0x7555AE39, 0x53C55F9C, 0x7A8E7BFA, 0xCF9C5D7A,
95 0xD1ABB290, 0x55CB3774, 0xFA34EC48, 0xA7907951, 0xC39E072D,
96 0x014933E0, 0xF21E9A77, 0x24594688, 0x6B5C5A9C
99 /* ciphertext bytes -- right halves */
100 static const uint32_t ciphertext_r[NUM_VARIABLE_KEY_TESTS] = {
101 0x6198DD78, 0xB85ECB8A, 0x613063F2, 0x8B963C9D, 0x2281B096,
102 0xAFDA1EC7, 0x6198DD78, 0xC6A0A28D, 0xEB05282B, 0x250F09A0,
103 0x8BEA1DA4, 0xCF2651EB, 0x09CE8F1A, 0x4C379918, 0x8951FC98,
104 0xD69D1AE5, 0xFFD39C79, 0x3C2DA6E3, 0x5B163969, 0x24D3977B,
105 0xE4FADA8E, 0xF59B87BD, 0xB49FC019, 0x937E89A3, 0x4986ADB5,
106 0x658BC778, 0xD13EF201, 0x47B268B2, 0x08EA3CAE, 0x9FAC631D,
107 0xCDAFF6E4, 0xB71C49BC, 0x5754369A, 0x5D9E0A5A
110 /* plaintext bytes */
111 static const uint8_t plaintext[8] = "BLOWFISH";
113 static const uint8_t plaintext2[16] = "BLOWFISHBLOWFISH";
115 /* ciphertext bytes */
116 static const uint8_t ciphertext[8] = {
117 0x32, 0x4E, 0xD0, 0xFE, 0xF4, 0x13, 0xA2, 0x03
120 static const uint8_t ciphertext2[16] = {
121 0x53, 0x00, 0x40, 0x06, 0x63, 0xf2, 0x1d, 0x99,
122 0x3b, 0x9b, 0x27, 0x64, 0x46, 0xfd, 0x20, 0xc1,
125 #define IV "blowfish"
127 static void test_blowfish(AVBlowfish *ctx, uint8_t *dst, const uint8_t *src,
128 const uint8_t *ref, int len, uint8_t *iv, int dir,
131 av_blowfish_crypt(ctx, dst, src, len, iv, dir);
132 if (memcmp(dst, ref, 8*len)) {
134 printf("%s failed\ngot ", test);
135 for (i = 0; i < 8*len; i++)
136 printf("%02x ", dst[i]);
137 printf("\nexpected ");
138 for (i = 0; i < 8*len; i++)
139 printf("%02x ", ref[i]);
148 uint32_t tmptext_l[NUM_VARIABLE_KEY_TESTS];
149 uint32_t tmptext_r[NUM_VARIABLE_KEY_TESTS];
150 uint8_t tmp[16], iv[8];
153 av_blowfish_init(&ctx, "abcdefghijklmnopqrstuvwxyz", 26);
155 test_blowfish(&ctx, tmp, plaintext, ciphertext, 1, NULL, 0, "encryption");
156 test_blowfish(&ctx, tmp, ciphertext, plaintext, 1, NULL, 1, "decryption");
157 test_blowfish(&ctx, tmp, tmp, ciphertext, 1, NULL, 0, "Inplace encryption");
158 test_blowfish(&ctx, tmp, tmp, plaintext, 1, NULL, 1, "Inplace decryption");
160 test_blowfish(&ctx, tmp, plaintext2, ciphertext2, 2, iv, 0, "CBC encryption");
162 test_blowfish(&ctx, tmp, ciphertext2, plaintext2, 2, iv, 1, "CBC decryption");
164 test_blowfish(&ctx, tmp, tmp, ciphertext2, 2, iv, 0, "Inplace CBC encryption");
166 test_blowfish(&ctx, tmp, tmp, plaintext2, 2, iv, 1, "Inplace CBC decryption");
168 memcpy(tmptext_l, plaintext_l, sizeof(*plaintext_l) * NUM_VARIABLE_KEY_TESTS);
169 memcpy(tmptext_r, plaintext_r, sizeof(*plaintext_r) * NUM_VARIABLE_KEY_TESTS);
171 for (i = 0; i < NUM_VARIABLE_KEY_TESTS; i++) {
172 av_blowfish_init(&ctx, variable_key[i], 8);
174 av_blowfish_crypt_ecb(&ctx, &tmptext_l[i], &tmptext_r[i], 0);
175 if (tmptext_l[i] != ciphertext_l[i] || tmptext_r[i] != ciphertext_r[i]) {
176 printf("Test encryption failed.\n");
180 av_blowfish_crypt_ecb(&ctx, &tmptext_l[i], &tmptext_r[i], 1);
181 if (tmptext_l[i] != plaintext_l[i] || tmptext_r[i] != plaintext_r[i]) {
182 printf("Test decryption failed.\n");
186 printf("Test encryption/decryption success.\n");