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