/*
 * ekt.h
 *
 * interface to Encrypted Key Transport for SRTP
 *
 * David McGrew
 * Cisco Systems, Inc.
 */
/*
 *	
 * Copyright (c) 2001-2005 Cisco Systems, Inc.
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 
 *   Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 * 
 *   Redistributions in binary form must reproduce the above
 *   copyright notice, this list of conditions and the following
 *   disclaimer in the documentation and/or other materials provided
 *   with the distribution.
 * 
 *   Neither the name of the Cisco Systems, Inc. nor the names of its
 *   contributors may be used to endorse or promote products derived
 *   from this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */



/*
 * EKT implementation strategy 
 * 
 * use stream_template approach
 *
 * in srtp_unprotect, when a new stream appears, check if template has
 * EKT defined, and if it does, then apply EKT processing 
 *
 * question: will we want to allow key-sharing templates in addition
 * to EKT templates?  could define a new ssrc_type_t that's associated
 * with an EKT, e.g.  ssrc_any_ekt.
 *
 *
 */

#ifndef EKT_H
#define EKT_H

#ifdef __cplusplus
extern "C" {
#endif

#include "srtp_priv.h"

#define EKT_CIPHER_DEFAULT           1
#define EKT_CIPHER_AES_128_ECB       1
#define EKT_CIPHER_AES_192_KEY_WRAP  2
#define EKT_CIPHER_AES_256_KEY_WRAP  3

typedef uint16_t ekt_spi_t;


unsigned
ekt_octets_after_base_tag(ekt_stream_t ekt);

/*
 * an srtp_policy_t structure can contain a pointer to an
 * ekt_policy_t structure
 *
 * this structure holds all of the high level EKT information, and it
 * is passed into libsrtp to indicate what policy should be in effect
 */

typedef struct ekt_policy_ctx_t {
  ekt_spi_t  spi;     /* security parameter index */
  uint8_t    ekt_cipher_type;
  uint8_t   *ekt_key;
  struct ekt_policy_ctx_t *next_ekt_policy;
} ekt_policy_ctx_t;


/*
 * an ekt_data_t structure holds the data corresponding to an ekt key,
 * spi, and so on
 */

typedef struct ekt_data_t {
  ekt_spi_t spi;
  uint8_t ekt_cipher_type;
  aes_expanded_key_t ekt_enc_key;
  aes_expanded_key_t ekt_dec_key;
  struct ekt_data_t *next_ekt_data;
} ekt_data_t;

/*
 * an srtp_stream_ctx_t can contain an ekt_stream_ctx_t
 *
 * an ekt_stream_ctx_t structure holds all of the EKT information for
 * a specific SRTP stream
 */

typedef struct ekt_stream_ctx_t {
  ekt_data_t *data;    
  uint16_t    isn;     /* initial sequence number  */
  uint8_t     encrypted_master_key[SRTP_MAX_KEY_LEN];
} ekt_stream_ctx_t;



err_status_t 
ekt_alloc(ekt_stream_t *stream_data, ekt_policy_t policy);

err_status_t
ekt_stream_init(ekt_stream_t e, 
		ekt_spi_t spi,
		void *ekt_key,
		unsigned ekt_cipher_type);

err_status_t
ekt_stream_init_from_policy(ekt_stream_t e, ekt_policy_t p);
  


err_status_t
srtp_stream_init_from_ekt(srtp_stream_t stream,			  
			  const void *srtcp_hdr,
			  unsigned pkt_octet_len);
		

void
ekt_write_data(ekt_stream_t ekt,
	       void *base_tag, 
	       unsigned base_tag_len, 
	       int *packet_len,
	       xtd_seq_num_t pkt_index);		

/*
 * We handle EKT by performing some additional steps before
 * authentication (copying the auth tag into a temporary location,
 * zeroizing the "base tag" field in the packet)
 *
 * With EKT, the tag_len parameter is actually the base tag
 * length
 */

err_status_t
ekt_tag_verification_preproces(uint8_t *pkt_tag, 
			       uint8_t *pkt_tag_copy, 
			       unsigned tag_len);

err_status_t
ekt_tag_verification_postproces(uint8_t *pkt_tag,
				uint8_t *pkt_tag_copy,
				unsigned tag_len);


/*
 * @brief EKT pre-processing for srtcp tag generation
 *
 * This function does the pre-processing of the SRTCP authentication
 * tag format.  When EKT is used, it consists of writing the Encrypted
 * Master Key, the SRTP ROC, the Initial Sequence Number, and SPI
 * fields.  The Base Authentication Tag field is set to the all-zero
 * value
 * 
 * When EKT is not used, this function is a no-op.
 * 
 */

err_status_t
srtp_stream_srtcp_auth_tag_generation_preprocess(const srtp_stream_t *s,
						 uint8_t *pkt_tag,
						 unsigned pkt_octet_len);

/* it's not clear that a tag_generation_postprocess function is needed */

err_status_t
srtcp_auth_tag_generation_postprocess();


#ifdef __cplusplus
}
#endif

#endif /* EKT_H */
