xref: /third_party/ffmpeg/libavformat/rtmpdh.h (revision cabdff1a)
1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * RTMP Diffie-Hellmann utilities
3cabdff1aSopenharmony_ci * Copyright (c) 2012 Samuel Pitoiset
4cabdff1aSopenharmony_ci *
5cabdff1aSopenharmony_ci * This file is part of FFmpeg.
6cabdff1aSopenharmony_ci *
7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
11cabdff1aSopenharmony_ci *
12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15cabdff1aSopenharmony_ci * Lesser General Public License for more details.
16cabdff1aSopenharmony_ci *
17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20cabdff1aSopenharmony_ci */
21cabdff1aSopenharmony_ci
22cabdff1aSopenharmony_ci#ifndef AVFORMAT_RTMPDH_H
23cabdff1aSopenharmony_ci#define AVFORMAT_RTMPDH_H
24cabdff1aSopenharmony_ci
25cabdff1aSopenharmony_ci#include <stdint.h>
26cabdff1aSopenharmony_ci
27cabdff1aSopenharmony_ci#include "config.h"
28cabdff1aSopenharmony_ci
29cabdff1aSopenharmony_ci#if CONFIG_GMP
30cabdff1aSopenharmony_ci#include <gmp.h>
31cabdff1aSopenharmony_ci
32cabdff1aSopenharmony_citypedef mpz_ptr FFBigNum;
33cabdff1aSopenharmony_ci#elif CONFIG_GCRYPT
34cabdff1aSopenharmony_ci#include <gcrypt.h>
35cabdff1aSopenharmony_ci
36cabdff1aSopenharmony_citypedef gcry_mpi_t FFBigNum;
37cabdff1aSopenharmony_ci
38cabdff1aSopenharmony_ci#elif CONFIG_OPENSSL
39cabdff1aSopenharmony_ci#include <openssl/bn.h>
40cabdff1aSopenharmony_ci#include <openssl/dh.h>
41cabdff1aSopenharmony_ci
42cabdff1aSopenharmony_citypedef BIGNUM *FFBigNum;
43cabdff1aSopenharmony_ci#elif CONFIG_MBEDTLS
44cabdff1aSopenharmony_ci#include <mbedtls/bignum.h>
45cabdff1aSopenharmony_ci
46cabdff1aSopenharmony_citypedef mbedtls_mpi *FFBigNum;
47cabdff1aSopenharmony_ci
48cabdff1aSopenharmony_ci#endif
49cabdff1aSopenharmony_ci
50cabdff1aSopenharmony_citypedef struct FF_DH {
51cabdff1aSopenharmony_ci    FFBigNum p;
52cabdff1aSopenharmony_ci    FFBigNum g;
53cabdff1aSopenharmony_ci    FFBigNum pub_key;
54cabdff1aSopenharmony_ci    FFBigNum priv_key;
55cabdff1aSopenharmony_ci    long length;
56cabdff1aSopenharmony_ci} FF_DH;
57cabdff1aSopenharmony_ci
58cabdff1aSopenharmony_ci
59cabdff1aSopenharmony_ci/**
60cabdff1aSopenharmony_ci * Initialize a Diffie-Hellmann context.
61cabdff1aSopenharmony_ci *
62cabdff1aSopenharmony_ci * @param key_len length of the key
63cabdff1aSopenharmony_ci * @return a new Diffie-Hellmann context on success, NULL otherwise
64cabdff1aSopenharmony_ci */
65cabdff1aSopenharmony_ciFF_DH *ff_dh_init(int key_len);
66cabdff1aSopenharmony_ci
67cabdff1aSopenharmony_ci/**
68cabdff1aSopenharmony_ci * Free a Diffie-Hellmann context.
69cabdff1aSopenharmony_ci *
70cabdff1aSopenharmony_ci * @param dh a Diffie-Hellmann context to free
71cabdff1aSopenharmony_ci */
72cabdff1aSopenharmony_civoid ff_dh_free(FF_DH *dh);
73cabdff1aSopenharmony_ci
74cabdff1aSopenharmony_ci/**
75cabdff1aSopenharmony_ci * Generate a public key.
76cabdff1aSopenharmony_ci *
77cabdff1aSopenharmony_ci * @param dh a Diffie-Hellmann context
78cabdff1aSopenharmony_ci * @return zero on success, negative value otherwise
79cabdff1aSopenharmony_ci */
80cabdff1aSopenharmony_ciint ff_dh_generate_public_key(FF_DH *dh);
81cabdff1aSopenharmony_ci
82cabdff1aSopenharmony_ci/**
83cabdff1aSopenharmony_ci * Write the public key into the given buffer.
84cabdff1aSopenharmony_ci *
85cabdff1aSopenharmony_ci * @param dh            a Diffie-Hellmann context, containing the public key to write
86cabdff1aSopenharmony_ci * @param pub_key       the buffer where the public key is written
87cabdff1aSopenharmony_ci * @param pub_key_len   the length of the buffer
88cabdff1aSopenharmony_ci * @return zero on success, negative value otherwise
89cabdff1aSopenharmony_ci */
90cabdff1aSopenharmony_ciint ff_dh_write_public_key(FF_DH *dh, uint8_t *pub_key, int pub_key_len);
91cabdff1aSopenharmony_ci
92cabdff1aSopenharmony_ci/**
93cabdff1aSopenharmony_ci * Compute the shared secret key from the private FF_DH value and the
94cabdff1aSopenharmony_ci * other party's public value.
95cabdff1aSopenharmony_ci *
96cabdff1aSopenharmony_ci * @param dh            a Diffie-Hellmann context, containing the private key
97cabdff1aSopenharmony_ci * @param pub_key       the buffer containing the public key
98cabdff1aSopenharmony_ci * @param pub_key_len   the length of the public key buffer
99cabdff1aSopenharmony_ci * @param secret_key    the buffer where the secret key is written
100cabdff1aSopenharmony_ci * @param secret_key_len the length of the secret key buffer
101cabdff1aSopenharmony_ci * @return length of the shared secret key on success, negative value otherwise
102cabdff1aSopenharmony_ci */
103cabdff1aSopenharmony_ciint ff_dh_compute_shared_secret_key(FF_DH *dh, const uint8_t *pub_key,
104cabdff1aSopenharmony_ci                                    int pub_key_len, uint8_t *secret_key,
105cabdff1aSopenharmony_ci                                    int secret_key_len);
106cabdff1aSopenharmony_ci
107cabdff1aSopenharmony_ci#endif /* AVFORMAT_RTMPDH_H */
108