The test in its current form is just ensuring the plain text output is the same as the plain text input, not bothering to check if anything was done with the latter. av_aes_ctr_crypt() could be a simple memcpy under the hood and this test would still succeed. To check the integrity of the encrypted buffer, both the IV and the key need to be fixed. As such, and in order to not remove the existing randomization of the input IV, do two runs, one with random initialization data, and one with static data.
Unified · Split
| @@ -26,6 +26,16 @@ static const DECLARE_ALIGNED(8, uint8_t, plain)[] = { · 25 unmodified lines | |||
| 26 | 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x6f, | 26 | 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x6f, |
| 27 | 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x6f | 27 | 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x6f |
| 28 | }; | 28 | }; |
| 29 | |||
| 30 | static const DECLARE_ALIGNED(8, uint8_t, encrypted)[] = { | ||
| 31 | 0x95, 0xcd, 0x9a, 0x8a, 0x83, 0xa2, 0x1a, 0x84, 0x92, 0xed, | ||
| 32 | 0xd6, 0xf2, 0x57, 0x2f, 0x61, 0x98, 0xbc, 0x20, 0x98, 0xee | ||
| 33 | }; | ||
| 34 | |||
| 35 | static const DECLARE_ALIGNED(8, uint8_t, fixed_iv)[] = { | ||
| 36 | 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef | ||
| 37 | }; | ||
| 38 | |||
| 29 | static DECLARE_ALIGNED(8, uint8_t, tmp)[20]; | 39 | static DECLARE_ALIGNED(8, uint8_t, tmp)[20]; |
| 30 | 40 | ||
| 31 | int main (void) | 41 | int main (void) |
| @@ -34,6 +44,7 @@ int main (void) · 2 unmodified lines | |||
| 34 | struct AVAESCTR *ae, *ad; | 44 | struct AVAESCTR *ae, *ad; |
| 35 | const uint8_t *iv; | 45 | const uint8_t *iv; |
| 36 | 46 | ||
| 47 | for (int i = 0; i < 2; i++) { | ||
| 37 | ae = av_aes_ctr_alloc(); | 48 | ae = av_aes_ctr_alloc(); |
| 38 | ad = av_aes_ctr_alloc(); | 49 | ad = av_aes_ctr_alloc(); |
| 39 | 50 | ||
| @@ -46,11 +57,18 @@ int main (void) · 6 unmodified lines | |||
| 46 | if (av_aes_ctr_init(ad, (const uint8_t*)"0123456789abcdef") < 0) | 57 | if (av_aes_ctr_init(ad, (const uint8_t*)"0123456789abcdef") < 0) |
| 47 | goto ERROR; | 58 | goto ERROR; |
| 48 | 59 | ||
| 60 | if (i) | ||
| 61 | av_aes_ctr_set_iv(ae, fixed_iv); | ||
| 62 | else | ||
| 49 | av_aes_ctr_set_random_iv(ae); | 63 | av_aes_ctr_set_random_iv(ae); |
| 50 | iv = av_aes_ctr_get_iv(ae); | 64 | iv = av_aes_ctr_get_iv(ae); |
| 51 | av_aes_ctr_set_full_iv(ad, iv); | 65 | av_aes_ctr_set_full_iv(ad, iv); |
| 52 | 66 | ||
| 53 | av_aes_ctr_crypt(ae, tmp, plain, sizeof(tmp)); | 67 | av_aes_ctr_crypt(ae, tmp, plain, sizeof(tmp)); |
| 68 | if (i && memcmp(tmp, encrypted, sizeof(tmp)) != 0) { | ||
| 69 | av_log(NULL, AV_LOG_ERROR, "test failed\n"); | ||
| 70 | goto ERROR; | ||
| 71 | } | ||
| 54 | av_aes_ctr_crypt(ad, tmp, tmp, sizeof(tmp)); | 72 | av_aes_ctr_crypt(ad, tmp, tmp, sizeof(tmp)); |
| 55 | 73 | ||
| 56 | if (memcmp(tmp, plain, sizeof(tmp)) != 0){ | 74 | if (memcmp(tmp, plain, sizeof(tmp)) != 0){ |
| @@ -58,6 +76,11 @@ int main (void) · 1 unmodified line | |||
| 58 | goto ERROR; | 76 | goto ERROR; |
| 59 | } | 77 | } |
| 60 | 78 | ||
| 79 | av_aes_ctr_free(ae); | ||
| 80 | av_aes_ctr_free(ad); | ||
| 81 | ae = ad = NULL; | ||
| 82 | } | ||
| 83 | |||
| 61 | av_log(NULL, AV_LOG_INFO, "test passed\n"); | 84 | av_log(NULL, AV_LOG_INFO, "test passed\n"); |
| 62 | ret = 0; | 85 | ret = 0; |
| 63 | 86 | ||