/* * RTMP Diffie-Hellmann utilities * Copyright (c) 2012 Samuel Pitoiset * * This file is part of Libav. * * Libav is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * Libav is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Libav; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef AVFORMAT_RTMPDH_H #define AVFORMAT_RTMPDH_H #include "avformat.h" #include "config.h" #if CONFIG_NETTLE || CONFIG_GCRYPT #if CONFIG_NETTLE #include <gmp.h> #include <nettle/bignum.h> typedef mpz_ptr FFBigNum; #elif CONFIG_GCRYPT #include <gcrypt.h> typedef gcry_mpi_t FFBigNum; #endif typedef struct FF_DH { FFBigNum p; FFBigNum g; FFBigNum pub_key; FFBigNum priv_key; long length; } FF_DH; #elif CONFIG_OPENSSL #include <openssl/bn.h> #include <openssl/dh.h> typedef BIGNUM *FFBigNum; typedef DH FF_DH; #endif /** * Initialize a Diffie-Hellmann context. * * @param key_len length of the key * @return a new Diffie-Hellmann context on success, NULL otherwise */ FF_DH *ff_dh_init(int key_len); /** * Free a Diffie-Hellmann context. * * @param dh a Diffie-Hellmann context to free */ void ff_dh_free(FF_DH *dh); /** * Generate a public key. * * @param dh a Diffie-Hellmann context * @return zero on success, negative value otherwise */ int ff_dh_generate_public_key(FF_DH *dh); /** * Write the public key into the given buffer. * * @param dh a Diffie-Hellmann context, containing the public key to write * @param pub_key the buffer where the public key is written * @param pub_key_len the length of the buffer * @return zero on success, negative value otherwise */ int ff_dh_write_public_key(FF_DH *dh, uint8_t *pub_key, int pub_key_len); /** * Compute the shared secret key from the private FF_DH value and the * other party's public value. * * @param dh a Diffie-Hellmann context, containing the private key * @param pub_key the buffer containing the public key * @param pub_key_len the length of the buffer * @param secret_key the buffer where the secret key is written * @return length of the shared secret key on success, negative value otherwise */ int ff_dh_compute_shared_secret_key(FF_DH *dh, const uint8_t *pub_key, int pub_key_len, uint8_t *secret_key); #endif /* AVFORMAT_RTMPDH_H */