/*
 * RTMP Diffie-Hellmann utilities
 * Copyright (c) 2012 Samuel Pitoiset
 *
 * This file is part of FFmpeg.
 *
 * FFmpeg 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.
 *
 * FFmpeg 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 FFmpeg; 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 */
