[FFmpeg-devel] [PATCH 4/6] avutil/test/aes_ctr: also check the encrypted buffer

James Almer jamrial at gmail.com
Thu Apr 3 23:59:01 EEST 2025


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.

Signed-off-by: James Almer <jamrial at gmail.com>
---
 libavutil/tests/aes_ctr.c | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/libavutil/tests/aes_ctr.c b/libavutil/tests/aes_ctr.c
index 65b49ee7fe..94b0201c7b 100644
--- a/libavutil/tests/aes_ctr.c
+++ b/libavutil/tests/aes_ctr.c
@@ -26,6 +26,16 @@ static const DECLARE_ALIGNED(8, uint8_t, plain)[] = {
     0x6d, 0x6f, 0x73, 0x74, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x6f,
     0x6d, 0x6f, 0x73, 0x74, 0x20, 0x72, 0x61, 0x6e, 0x64, 0x6f
 };
+
+static const DECLARE_ALIGNED(8, uint8_t, encrypted)[] = {
+    0x95, 0xcd, 0x9a, 0x8a, 0x83, 0xa2, 0x1a, 0x84, 0x92, 0xed,
+    0xd6, 0xf2, 0x57, 0x2f, 0x61, 0x98, 0xbc, 0x20, 0x98, 0xee
+};
+
+static const DECLARE_ALIGNED(8, uint8_t, fixed_iv)[] = {
+    0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef
+};
+
 static DECLARE_ALIGNED(8, uint8_t, tmp)[20];
 
 int main (void)
@@ -34,6 +44,7 @@ int main (void)
     struct AVAESCTR *ae, *ad;
     const uint8_t *iv;
 
+    for (int i = 0; i < 2; i++) {
     ae = av_aes_ctr_alloc();
     ad = av_aes_ctr_alloc();
 
@@ -46,11 +57,18 @@ int main (void)
     if (av_aes_ctr_init(ad, (const uint8_t*)"0123456789abcdef") < 0)
         goto ERROR;
 
+        if (i)
+            av_aes_ctr_set_iv(ae, fixed_iv);
+        else
     av_aes_ctr_set_random_iv(ae);
     iv =   av_aes_ctr_get_iv(ae);
     av_aes_ctr_set_full_iv(ad, iv);
 
     av_aes_ctr_crypt(ae, tmp, plain, sizeof(tmp));
+        if (i && memcmp(tmp, encrypted, sizeof(tmp)) != 0) {
+            av_log(NULL, AV_LOG_ERROR, "test failed\n");
+            goto ERROR;
+        }
     av_aes_ctr_crypt(ad, tmp, tmp,   sizeof(tmp));
 
     if (memcmp(tmp, plain, sizeof(tmp)) != 0){
@@ -58,6 +76,11 @@ int main (void)
         goto ERROR;
     }
 
+        av_aes_ctr_free(ae);
+        av_aes_ctr_free(ad);
+        ae = ad = NULL;
+    }
+
     av_log(NULL, AV_LOG_INFO, "test passed\n");
     ret = 0;
 
-- 
2.49.0



More information about the ffmpeg-devel mailing list