FFmpeg
encryption_info.c
Go to the documentation of this file.
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 
20 
21 #include <stdio.h>
22 #include <string.h>
23 
24 #include "libavutil/avassert.h"
25 #include "libavutil/mem.h"
26 
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};
34 
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)
39  return 1;
40 
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])))
44  return 1;
45 
46  return 0;
47 }
48 
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)
53  return 1;
54 
55  if (memcmp(a->system_id, b->system_id, a->system_id_size) != 0 ||
56  memcmp(a->data, b->data, a->data_size) != 0)
57  return 1;
58 
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)
61  return 1;
62  }
63 
64  if (a->next || b->next) {
65  if (!a->next || !b->next)
66  return 1;
67  if (compare_encryption_init_info(a->next, b->next) != 0)
68  return 1;
69  }
70 
71  return 0;
72 }
73 
74 static void run_encryption_info_test(void)
75 {
77  uint8_t *side_data;
78  size_t side_data_size;
79 
82  av_assert0(info->key_id);
83  av_assert0(info->key_id_size == sizeof(test_key_id));
84  av_assert0(info->iv);
85  av_assert0(info->iv_size == sizeof(test_iv));
86  av_assert0(info->subsamples);
87  av_assert0(info->subsample_count == test_subsample_count);
88 
89  info->scheme = 1234;
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));
95 
98  av_assert0(copy != info);
101 
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);
105 
106  copy = av_encryption_info_get_side_data(side_data, side_data_size);
107  av_assert0(copy);
108  av_assert0(copy != info);
111  av_free(side_data);
112 
114 }
115 
117 {
119 
121  av_assert0(info);
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);
132 
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));
137 
138  return info;
139 }
140 
142 {
144  uint8_t *side_data;
145  size_t side_data_size;
146 
148 
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);
153  av_assert0(copy);
156  av_free(side_data);
157 
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);
164  av_assert0(copy);
167  av_free(side_data);
168 
170 }
171 
172 int main(int argc, char **argv)
173 {
176  return 0;
177 }
av_encryption_info_get_side_data
AVEncryptionInfo * av_encryption_info_get_side_data(const uint8_t *buffer, size_t size)
Creates a copy of the AVEncryptionInfo that is contained in the given side data.
Definition: encryption_info.c:90
av_encryption_init_info_free
void av_encryption_init_info_free(AVEncryptionInitInfo *info)
Frees the given encryption init info object.
Definition: encryption_info.c:214
compare_encryption_init_info
static int compare_encryption_init_info(const AVEncryptionInitInfo *a, const AVEncryptionInitInfo *b)
Definition: encryption_info.c:49
b
#define b
Definition: input.c:34
test_subsamples
static const AVSubsampleEncryptionInfo test_subsamples[]
Definition: encryption_info.c:27
av_encryption_init_info_get_side_data
AVEncryptionInitInfo * av_encryption_init_info_get_side_data(const uint8_t *side_data, size_t side_data_size)
Creates a copy of the AVEncryptionInitInfo that is contained in the given side data.
Definition: encryption_info.c:229
run_encryption_info_test
static void run_encryption_info_test(void)
Definition: encryption_info.c:74
test_data
static const uint8_t test_data[]
Definition: encryption_info.c:33
test_key_id
static const uint8_t test_key_id[]
Definition: encryption_info.c:30
test_key_id_2
static const uint8_t test_key_id_2[]
Definition: encryption_info.c:31
av_encryption_info_clone
AVEncryptionInfo * av_encryption_info_clone(const AVEncryptionInfo *info)
Allocates an AVEncryptionInfo structure with a copy of the given data.
Definition: encryption_info.c:63
avassert.h
run_encryption_init_info_test
static void run_encryption_init_info_test(void)
Definition: encryption_info.c:141
info
MIPS optimizations info
Definition: mips.txt:2
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
AVEncryptionInitInfo
This describes info used to initialize an encryption key system.
Definition: encryption_info.h:88
test_system_id
static const uint8_t test_system_id[]
Definition: encryption_info.c:32
av_encryption_info_add_side_data
uint8_t * av_encryption_info_add_side_data(const AVEncryptionInfo *info, size_t *size)
Allocates and initializes side data that holds a copy of the given encryption info.
Definition: encryption_info.c:125
test_subsample_count
static const size_t test_subsample_count
Definition: encryption_info.c:28
copy
static void copy(const float *p1, float *p2, const int length)
Definition: vf_vaguedenoiser.c:187
a
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:41
av_encryption_info_free
void av_encryption_info_free(AVEncryptionInfo *info)
Frees the given encryption info object.
Definition: encryption_info.c:80
AVSubsampleEncryptionInfo
This file is part of FFmpeg.
Definition: encryption_info.h:25
av_encryption_init_info_alloc
AVEncryptionInitInfo * av_encryption_init_info_alloc(uint32_t system_id_size, uint32_t num_key_ids, uint32_t key_id_size, uint32_t data_size)
Allocates an AVEncryptionInitInfo structure and sub-pointers to hold the given sizes.
Definition: encryption_info.c:176
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:269
AVEncryptionInfo
This describes encryption info for a packet.
Definition: encryption_info.h:43
create_init_info
static AVEncryptionInitInfo * create_init_info(void)
Definition: encryption_info.c:116
compare_encryption_info
static int compare_encryption_info(const AVEncryptionInfo *a, const AVEncryptionInfo *b)
Definition: encryption_info.c:35
encryption_info.h
mem.h
av_free
#define av_free(p)
Definition: tableprint_vlc.h:33
test_iv
static const uint8_t test_iv[]
Definition: encryption_info.c:29
av_encryption_info_alloc
AVEncryptionInfo * av_encryption_info_alloc(uint32_t subsample_count, uint32_t key_id_size, uint32_t iv_size)
Allocates an AVEncryptionInfo structure and sub-pointers to hold the given number of subsamples.
Definition: encryption_info.c:39
main
int main(int argc, char **argv)
Definition: encryption_info.c:172
av_encryption_init_info_add_side_data
uint8_t * av_encryption_init_info_add_side_data(const AVEncryptionInitInfo *info, size_t *side_data_size)
Allocates and initializes side data that holds a copy of the given encryption init info.
Definition: encryption_info.c:290