FFmpeg
Loading...
Searching...
No Matches
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
27static const AVSubsampleEncryptionInfo test_subsamples[] = {{1, 2}, {3, 4}, {5, 6}, {7, 8}};
28static const size_t test_subsample_count = sizeof(test_subsamples) / sizeof(test_subsamples[0]);
29static const uint8_t test_iv[] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18};
30static const uint8_t test_key_id[] = {0x21, 0x22, 0x23, 0x24};
31static const uint8_t test_key_id_2[] = {0x31, 0x32, 0x33, 0x34};
32static const uint8_t test_system_id[] = {0x41, 0x42, 0x43};
33static 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
74static void run_encryption_info_test(void)
75{
76 AVEncryptionInfo *info, *copy;
77 uint8_t *side_data;
78 size_t side_data_size;
79
81 av_assert0(info);
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));
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);
108 av_assert0(copy != info);
111 av_free(side_data);
112
114}
115
117{
119
120 info = av_encryption_init_info_alloc(sizeof(test_system_id), 2, sizeof(test_key_id), sizeof(test_data));
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
147 info = create_init_info();
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);
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);
167 av_free(side_data);
168
170}
171
172int main(int argc, char **argv)
173{
176 return 0;
177}
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition avassert.h:42
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
int main
Definition dovi_rpuenc.c:38
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.
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.
AVEncryptionInfo * av_encryption_info_clone(const AVEncryptionInfo *info)
Allocates an AVEncryptionInfo structure with a copy of the given 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.
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.
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.
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.
void av_encryption_init_info_free(AVEncryptionInitInfo *info)
Frees the given encryption init info object.
void av_encryption_info_free(AVEncryptionInfo *info)
Frees the given encryption info object.
int a
#define b
Definition input.c:43
Memory handling functions.
This describes encryption info for a packet.
uint32_t skip_byte_block
Only used for pattern encryption.
uint8_t * iv
The initialization vector.
uint32_t crypt_byte_block
Only used for pattern encryption.
uint8_t * key_id
The ID of the key used to encrypt the packet.
AVSubsampleEncryptionInfo * subsamples
An array of subsample encryption info specifying how parts of the sample are encrypted.
uint32_t scheme
The fourcc encryption scheme, in big-endian byte order.
This describes info used to initialize an encryption key system.
uint8_t * data
Key-system specific initialization data.
struct AVEncryptionInitInfo * next
An optional pointer to the next initialization info in the list.
uint8_t ** key_ids
An array of key IDs this initialization data is for.
uint8_t * system_id
A unique identifier for the key system this is for, can be NULL if it is not known.
uint32_t key_id_size
The number of bytes in each key ID.
uint32_t num_key_ids
The number of key IDs.
This file is part of FFmpeg.
#define av_free(p)
static const uint8_t test_data[]
static const AVSubsampleEncryptionInfo test_subsamples[]
static int compare_encryption_info(const AVEncryptionInfo *a, const AVEncryptionInfo *b)
static AVEncryptionInitInfo * create_init_info(void)
static const size_t test_subsample_count
static const uint8_t test_key_id_2[]
static void run_encryption_init_info_test(void)
static const uint8_t test_iv[]
static const uint8_t test_key_id[]
static int compare_encryption_init_info(const AVEncryptionInitInfo *a, const AVEncryptionInitInfo *b)
static void run_encryption_info_test(void)
static const uint8_t test_system_id[]
static void copy(const float *p1, float *p2, const int length)