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
19 #include "libavutil/encryption_info.h"
24 #include "libavutil/avassert.h"
25 #include "libavutil/mem.h"
27 static const AVSubsampleEncryptionInfo test_subsamples
[] = {{1, 2}, {3, 4}, {5, 6}, {7, 8}};
28 static const size_t test_subsample_count
= sizeof(test_subsamples
) / sizeof(test_subsamples
[0]);
29 static const uint8_t test_iv
[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
30 static const uint8_t test_key_id
[] = {0x21, 0x22, 0x23, 0x24};
31 static const uint8_t test_key_id_2
[] = {0x31, 0x32, 0x33, 0x34};
32 static const uint8_t test_system_id
[] = {0x41, 0x42, 0x43};
33 static const uint8_t test_data
[] = {0x51, 0x52};
35 static int compare_encryption_info(const AVEncryptionInfo
*a
, const AVEncryptionInfo
*b
) {
36 if (!a
|| !b
|| a
->scheme
!= b
->scheme
|| a
->crypt_byte_block
!= b
->crypt_byte_block
||
37 a
->skip_byte_block
!= b
->skip_byte_block
|| a
->key_id_size
!= b
->key_id_size
||
38 a
->iv_size
!= b
->iv_size
|| a
->subsample_count
!= b
->subsample_count
)
41 if (memcmp(a
->key_id
, b
->key_id
, a
->key_id_size
) != 0 ||
42 memcmp(a
->iv
, b
->iv
, a
->iv_size
) != 0 ||
43 memcmp(a
->subsamples
, b
->subsamples
, a
->subsample_count
* sizeof(a
->subsamples
[0])))
49 static int compare_encryption_init_info(const AVEncryptionInitInfo
*a
, const AVEncryptionInitInfo
*b
) {
50 if (!a
|| !b
|| a
->system_id_size
!= b
->system_id_size
||
51 a
->num_key_ids
!= b
->num_key_ids
|| a
->key_id_size
!= b
->key_id_size
||
52 a
->data_size
!= b
->data_size
)
55 if (memcmp(a
->system_id
, b
->system_id
, a
->system_id_size
) != 0 ||
56 memcmp(a
->data
, b
->data
, a
->data_size
) != 0)
59 for (uint32_t i
= 0; i
< a
->num_key_ids
; i
++) {
60 if (memcmp(a
->key_ids
[i
], b
->key_ids
[i
], a
->key_id_size
) != 0)
64 if (a
->next
|| b
->next
) {
65 if (!a
->next
|| !b
->next
)
67 if (compare_encryption_init_info(a
->next
, b
->next
) != 0)
74 static void run_encryption_info_test(void)
76 AVEncryptionInfo
*info
, *copy
;
78 size_t side_data_size
;
80 info
= av_encryption_info_alloc(test_subsample_count
, sizeof(test_key_id
), sizeof(test_iv
));
82 av_assert0(info
->key_id
);
83 av_assert0(info
->key_id_size
== sizeof(test_key_id
));
85 av_assert0(info
->iv_size
== sizeof(test_iv
));
86 av_assert0(info
->subsamples
);
87 av_assert0(info
->subsample_count
== test_subsample_count
);
90 info
->crypt_byte_block
= 333;
91 info
->skip_byte_block
= 444;
92 memcpy(info
->key_id
, test_key_id
, sizeof(test_key_id
));
93 memcpy(info
->iv
, test_iv
, sizeof(test_iv
));
94 memcpy(info
->subsamples
, test_subsamples
, sizeof(test_subsamples
));
96 copy
= av_encryption_info_clone(info
);
98 av_assert0(copy
!= info
);
99 av_assert0(compare_encryption_info(info
, copy
) == 0);
100 av_encryption_info_free(copy
);
102 side_data
= av_encryption_info_add_side_data(info
, &side_data_size
);
103 av_assert0(side_data
);
104 av_assert0(side_data_size
> 0);
106 copy
= av_encryption_info_get_side_data(side_data
, side_data_size
);
108 av_assert0(copy
!= info
);
109 av_assert0(compare_encryption_info(info
, copy
) == 0);
110 av_encryption_info_free(copy
);
113 av_encryption_info_free(info
);
116 static AVEncryptionInitInfo
*create_init_info(void)
118 AVEncryptionInitInfo
*info
;
120 info
= av_encryption_init_info_alloc(sizeof(test_system_id
), 2, sizeof(test_key_id
), sizeof(test_data
));
122 av_assert0(info
->system_id
);
123 av_assert0(info
->system_id_size
== sizeof(test_system_id
));
124 av_assert0(info
->key_ids
);
125 av_assert0(info
->num_key_ids
== 2);
126 av_assert0(info
->key_id_size
== sizeof(test_key_id
));
127 av_assert0(info
->key_ids
[0]);
128 av_assert0(info
->key_ids
[1]);
129 av_assert0(info
->data
);
130 av_assert0(info
->data_size
== sizeof(test_data
));
131 av_assert0(!info
->next
);
133 memcpy(info
->system_id
, test_system_id
, sizeof(test_system_id
));
134 memcpy(info
->key_ids
[0], test_key_id
, sizeof(test_key_id
));
135 memcpy(info
->key_ids
[1], test_key_id_2
, sizeof(test_key_id_2
));
136 memcpy(info
->data
, test_data
, sizeof(test_data
));
141 static void run_encryption_init_info_test(void)
143 AVEncryptionInitInfo
*info
, *copy
;
145 size_t side_data_size
;
147 info
= create_init_info();
149 side_data
= av_encryption_init_info_add_side_data(info
, &side_data_size
);
150 av_assert0(side_data
);
151 av_assert0(side_data_size
> 0);
152 copy
= av_encryption_init_info_get_side_data(side_data
, side_data_size
);
154 av_assert0(compare_encryption_init_info(info
, copy
) == 0);
155 av_encryption_init_info_free(copy
);
158 // Make the first init info different from the second to test the correct order.
159 memset(info
->system_id
, 0, info
->system_id_size
);
160 info
->next
= create_init_info();
161 side_data
= av_encryption_init_info_add_side_data(info
, &side_data_size
);
162 av_assert0(side_data
);
163 copy
= av_encryption_init_info_get_side_data(side_data
, side_data_size
);
165 av_assert0(compare_encryption_init_info(info
, copy
) == 0);
166 av_encryption_init_info_free(copy
);
169 av_encryption_init_info_free(info
);
172 int main(int argc
, char **argv
)
174 run_encryption_info_test();
175 run_encryption_init_info_test();