/*
  Copyright (C) 2012 Werner Dittmann

  This library 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.

  This library 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 this library; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
*/

#include <stdint.h>

class CryptoContext;
class CryptoContextCtrl;

/**
 * @brief SRTP and SRTCP protect and unprotect functions.
 *
 * The static methods take SRTP or SRTCP crypto contexts, a pointer uint8_t buffer
 * that must contain an RTP/SRTP packet and perform the actions necessary to protect
 * the RTP/RTCP packet or to unprotect the SRTP/SRTCP packet.
 * 
 * The methods assume that the buffer contains all protocol relevant fields (SSRC,
 * sequence number etc.) in network order.
 *
 * When encrypting the buffer must be big enough to store additional data, usually
 * 4 - 14 bytes, depending on how the application configured the authentication parameters.
 *
 * @author Werner Dittmann <Werner.Dittmann@t-online.de>
 */
class SrtpHandler
{
public:
    /**
     * @brief Protect an RTP packet.
     *
     * @param pcc the SRTP CryptoContext instance
     *
     * @param buffer the RTP packet to protect
     *
     * @param length the length of the RTP packet data in bytes
     *
     * @param newLength the length of the resulting SRTP packet data in bytes
     *
     * @return @c true if protection was successful, @c false otherwise
     */
    static bool protect(CryptoContext* pcc, uint8_t* buffer, size_t length, size_t* newLength);

    /**
     * @brief Unprotect a SRTP packet.
     *
     * @param pcc the SRTP CryptoContext instance
     *
     * @param buffer the SRTP packet to unprotect
     *
     * @param length the length of the SRTP packet data in bytes
     *
     * @param newLength the length of the resulting RTP packet data in bytes
     *
     * @return an integer value
     *         - 1 - success
     *         - -1 - SRTP authentication failed
     *         - -2 - SRTP replay check failed
     */
    static int32_t unprotect(CryptoContext* pcc, uint8_t* buffer, size_t length, size_t* newLength);

    /**
     * @brief Protect an RTCP packet.
     *
     * @param pcc the SRTCP CryptoContextCtrl instance
     *
     * @param buffer the RTCP packet to protect
     *
     * @param length the length of the RTCP packet data in bytes
     *
     * @param newLength the length of the resulting SRTCP packet data in bytes
     *
     * @return @c true if protection was successful, @c false otherwise
     */
    static bool protectCtrl(CryptoContextCtrl* pcc, uint8_t* buffer, size_t length, size_t* newLength);

    /**
     * @brief Unprotect a SRTCP packet.
     *
     * @param pcc the SRTCP CryptoContextCtrl instance
     *
     * @param buffer the SRTCP packet to unprotect
     *
     * @param length the length of the SRTCP packet data in bytes
     *
     * @param newLength the length of the resulting RTCP packet data in bytes
     *
     * @return an integer value
     *         - 0 - illegal packet (too short, not a valid RTP header byte), dismiss it
     *         - 1 - success
     *         - -1 - SRTCP authentication failed
     *         - -2 - SRTCP replay check failed
     */
    static int32_t unprotectCtrl(CryptoContextCtrl* pcc, uint8_t* buffer, size_t length, size_t* newLength);

private:
    static bool decodeRtp(uint8_t* buffer, int32_t length, uint32_t *ssrc, uint16_t *seq, uint8_t** payload, int32_t *payloadlen);

};