• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * This file is part of FFmpeg.
3  *
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.
8  *
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.
13  *
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
17  */
18 
19 #include "libavutil/encryption_info.h"
20 
21 #include <stdio.h>
22 #include <string.h>
23 
24 #include "libavutil/avassert.h"
25 
26 static const AVSubsampleEncryptionInfo test_subsamples[] = {{1, 2}, {3, 4}, {5, 6}, {7, 8}};
27 static const size_t test_subsample_count = sizeof(test_subsamples) / sizeof(test_subsamples[0]);
28 static const uint8_t test_iv[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
29 static const uint8_t test_key_id[] = {0x21, 0x22, 0x23, 0x24};
30 static const uint8_t test_key_id_2[] = {0x31, 0x32, 0x33, 0x34};
31 static const uint8_t test_system_id[] = {0x41, 0x42, 0x43};
32 static const uint8_t test_data[] = {0x51, 0x52};
33 
compare_encryption_info(const AVEncryptionInfo * a,const AVEncryptionInfo * b)34 static int compare_encryption_info(const AVEncryptionInfo *a, const AVEncryptionInfo *b) {
35     if (!a || !b || a->scheme != b->scheme || a->crypt_byte_block != b->crypt_byte_block ||
36         a->skip_byte_block != b->skip_byte_block || a->key_id_size != b->key_id_size ||
37         a->iv_size != b->iv_size || a->subsample_count != b->subsample_count)
38         return 1;
39 
40     if (memcmp(a->key_id, b->key_id, a->key_id_size) != 0 ||
41         memcmp(a->iv, b->iv, a->iv_size) != 0 ||
42         memcmp(a->subsamples, b->subsamples, a->subsample_count * sizeof(a->subsamples[0])))
43         return 1;
44 
45     return 0;
46 }
47 
compare_encryption_init_info(const AVEncryptionInitInfo * a,const AVEncryptionInitInfo * b)48 static int compare_encryption_init_info(const AVEncryptionInitInfo *a, const AVEncryptionInitInfo *b) {
49     if (!a || !b || a->system_id_size != b->system_id_size ||
50         a->num_key_ids != b->num_key_ids || a->key_id_size != b->key_id_size ||
51         a->data_size != b->data_size)
52         return 1;
53 
54     if (memcmp(a->system_id, b->system_id, a->system_id_size) != 0 ||
55         memcmp(a->data, b->data, a->data_size) != 0)
56         return 1;
57 
58     for (uint32_t i = 0; i < a->num_key_ids; i++) {
59         if (memcmp(a->key_ids[i], b->key_ids[i], a->key_id_size) != 0)
60             return 1;
61     }
62 
63     if (a->next || b->next) {
64         if (!a->next || !b->next)
65             return 1;
66         if (compare_encryption_init_info(a->next, b->next) != 0)
67             return 1;
68     }
69 
70     return 0;
71 }
72 
run_encryption_info_test(void)73 static void run_encryption_info_test(void)
74 {
75     AVEncryptionInfo *info, *copy;
76     uint8_t *side_data;
77     size_t side_data_size;
78 
79     info = av_encryption_info_alloc(test_subsample_count, sizeof(test_key_id), sizeof(test_iv));
80     av_assert0(info);
81     av_assert0(info->key_id);
82     av_assert0(info->key_id_size == sizeof(test_key_id));
83     av_assert0(info->iv);
84     av_assert0(info->iv_size == sizeof(test_iv));
85     av_assert0(info->subsamples);
86     av_assert0(info->subsample_count == test_subsample_count);
87 
88     info->scheme = 1234;
89     info->crypt_byte_block = 333;
90     info->skip_byte_block = 444;
91     memcpy(info->key_id, test_key_id, sizeof(test_key_id));
92     memcpy(info->iv, test_iv, sizeof(test_iv));
93     memcpy(info->subsamples, test_subsamples, sizeof(test_subsamples));
94 
95     copy = av_encryption_info_clone(info);
96     av_assert0(copy);
97     av_assert0(copy != info);
98     av_assert0(compare_encryption_info(info, copy) == 0);
99     av_encryption_info_free(copy);
100 
101     side_data = av_encryption_info_add_side_data(info, &side_data_size);
102     av_assert0(side_data);
103     av_assert0(side_data_size > 0);
104 
105     copy = av_encryption_info_get_side_data(side_data, side_data_size);
106     av_assert0(copy);
107     av_assert0(copy != info);
108     av_assert0(compare_encryption_info(info, copy) == 0);
109     av_encryption_info_free(copy);
110     av_free(side_data);
111 
112     av_encryption_info_free(info);
113 }
114 
create_init_info(void)115 static AVEncryptionInitInfo *create_init_info(void)
116 {
117     AVEncryptionInitInfo *info;
118 
119     info = av_encryption_init_info_alloc(sizeof(test_system_id), 2, sizeof(test_key_id), sizeof(test_data));
120     av_assert0(info);
121     av_assert0(info->system_id);
122     av_assert0(info->system_id_size == sizeof(test_system_id));
123     av_assert0(info->key_ids);
124     av_assert0(info->num_key_ids == 2);
125     av_assert0(info->key_id_size == sizeof(test_key_id));
126     av_assert0(info->key_ids[0]);
127     av_assert0(info->key_ids[1]);
128     av_assert0(info->data);
129     av_assert0(info->data_size == sizeof(test_data));
130     av_assert0(!info->next);
131 
132     memcpy(info->system_id, test_system_id, sizeof(test_system_id));
133     memcpy(info->key_ids[0], test_key_id, sizeof(test_key_id));
134     memcpy(info->key_ids[1], test_key_id_2, sizeof(test_key_id_2));
135     memcpy(info->data, test_data, sizeof(test_data));
136 
137     return info;
138 }
139 
run_encryption_init_info_test(void)140 static void run_encryption_init_info_test(void)
141 {
142     AVEncryptionInitInfo *info, *copy;
143     uint8_t *side_data;
144     size_t side_data_size;
145 
146     info = create_init_info();
147 
148     side_data = av_encryption_init_info_add_side_data(info, &side_data_size);
149     av_assert0(side_data);
150     av_assert0(side_data_size > 0);
151     copy = av_encryption_init_info_get_side_data(side_data, side_data_size);
152     av_assert0(copy);
153     av_assert0(compare_encryption_init_info(info, copy) == 0);
154     av_encryption_init_info_free(copy);
155     av_free(side_data);
156 
157     // Make the first init info different from the second to test the correct order.
158     memset(info->system_id, 0, info->system_id_size);
159     info->next = create_init_info();
160     side_data = av_encryption_init_info_add_side_data(info, &side_data_size);
161     av_assert0(side_data);
162     copy = av_encryption_init_info_get_side_data(side_data, side_data_size);
163     av_assert0(copy);
164     av_assert0(compare_encryption_init_info(info, copy) == 0);
165     av_encryption_init_info_free(copy);
166     av_free(side_data);
167 
168     av_encryption_init_info_free(info);
169 }
170 
main(int argc,char ** argv)171 int main(int argc, char **argv)
172 {
173     run_encryption_info_test();
174     run_encryption_init_info_test();
175     return 0;
176 }
177