mirror of
				https://github.com/ossrs/srs.git
				synced 2025-03-09 15:49:59 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			248 lines
		
	
	
	
		
			9.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			248 lines
		
	
	
	
		
			9.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * cipher.h
 | |
|  *
 | |
|  * common interface to ciphers
 | |
|  *
 | |
|  * David A. McGrew
 | |
|  * Cisco Systems, Inc.
 | |
|  */
 | |
| /*
 | |
|  *
 | |
|  * Copyright (c) 2001-2017 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.
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #ifndef SRTP_CIPHER_H
 | |
| #define SRTP_CIPHER_H
 | |
| 
 | |
| #include "srtp.h"
 | |
| #include "crypto_types.h" /* for values of cipher_type_id_t */
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| /*
 | |
|  * srtp_cipher_direction_t defines a particular cipher operation.
 | |
|  *
 | |
|  * A srtp_cipher_direction_t is an enum that describes a particular cipher
 | |
|  * operation, i.e. encryption or decryption.  For some ciphers, this
 | |
|  * distinction does not matter, but for others, it is essential.
 | |
|  */
 | |
| typedef enum {
 | |
|     srtp_direction_encrypt, /**< encryption (convert plaintext to ciphertext) */
 | |
|     srtp_direction_decrypt, /**< decryption (convert ciphertext to plaintext) */
 | |
|     srtp_direction_any      /**< encryption or decryption                     */
 | |
| } srtp_cipher_direction_t;
 | |
| 
 | |
| /*
 | |
|  * the srtp_cipher_pointer_t definition is needed
 | |
|  * as srtp_cipher_t is not yet defined
 | |
|  */
 | |
| typedef struct srtp_cipher_t *srtp_cipher_pointer_t;
 | |
| 
 | |
| /*
 | |
|  *  a srtp_cipher_alloc_func_t allocates (but does not initialize) a
 | |
|  * srtp_cipher_t
 | |
|  */
 | |
| typedef srtp_err_status_t (*srtp_cipher_alloc_func_t)(srtp_cipher_pointer_t *cp,
 | |
|                                                       int key_len,
 | |
|                                                       int tag_len);
 | |
| 
 | |
| /*
 | |
|  * a srtp_cipher_init_func_t [re-]initializes a cipher_t with a given key
 | |
|  */
 | |
| typedef srtp_err_status_t (*srtp_cipher_init_func_t)(void *state,
 | |
|                                                      const uint8_t *key);
 | |
| 
 | |
| /* a srtp_cipher_dealloc_func_t de-allocates a cipher_t */
 | |
| typedef srtp_err_status_t (*srtp_cipher_dealloc_func_t)(
 | |
|     srtp_cipher_pointer_t cp);
 | |
| 
 | |
| /*
 | |
|  * a srtp_cipher_set_aad_func_t processes the AAD data for AEAD ciphers
 | |
|  */
 | |
| typedef srtp_err_status_t (*srtp_cipher_set_aad_func_t)(void *state,
 | |
|                                                         const uint8_t *aad,
 | |
|                                                         uint32_t aad_len);
 | |
| 
 | |
| /* a srtp_cipher_encrypt_func_t encrypts data in-place */
 | |
| typedef srtp_err_status_t (*srtp_cipher_encrypt_func_t)(
 | |
|     void *state,
 | |
|     uint8_t *buffer,
 | |
|     unsigned int *octets_to_encrypt);
 | |
| 
 | |
| /* a srtp_cipher_decrypt_func_t decrypts data in-place */
 | |
| typedef srtp_err_status_t (*srtp_cipher_decrypt_func_t)(
 | |
|     void *state,
 | |
|     uint8_t *buffer,
 | |
|     unsigned int *octets_to_decrypt);
 | |
| 
 | |
| /*
 | |
|  * a srtp_cipher_set_iv_func_t function sets the current initialization vector
 | |
|  */
 | |
| typedef srtp_err_status_t (*srtp_cipher_set_iv_func_t)(
 | |
|     void *state,
 | |
|     uint8_t *iv,
 | |
|     srtp_cipher_direction_t direction);
 | |
| 
 | |
| /*
 | |
|  * a cipher_get_tag_func_t function is used to get the authentication
 | |
|  * tag that was calculated by an AEAD cipher.
 | |
|  */
 | |
| typedef srtp_err_status_t (*srtp_cipher_get_tag_func_t)(void *state,
 | |
|                                                         uint8_t *tag,
 | |
|                                                         uint32_t *len);
 | |
| 
 | |
| /*
 | |
|  * srtp_cipher_test_case_t is a (list of) key, salt, plaintext, ciphertext,
 | |
|  * and aad values that are known to be correct for a
 | |
|  * particular cipher.  this data can be used to test an implementation
 | |
|  * in an on-the-fly self test of the correctness of the implementation.
 | |
|  * (see the srtp_cipher_type_self_test() function below)
 | |
|  */
 | |
| typedef struct srtp_cipher_test_case_t {
 | |
|     int key_length_octets;                 /* octets in key            */
 | |
|     const uint8_t *key;                    /* key                      */
 | |
|     uint8_t *idx;                          /* packet index             */
 | |
|     unsigned int plaintext_length_octets;  /* octets in plaintext      */
 | |
|     const uint8_t *plaintext;              /* plaintext                */
 | |
|     unsigned int ciphertext_length_octets; /* octets in plaintext      */
 | |
|     const uint8_t *ciphertext;             /* ciphertext               */
 | |
|     int aad_length_octets;                 /* octets in AAD            */
 | |
|     const uint8_t *aad;                    /* AAD                      */
 | |
|     int tag_length_octets;                 /* Length of AEAD tag       */
 | |
|     const struct srtp_cipher_test_case_t
 | |
|         *next_test_case; /* pointer to next testcase */
 | |
| } srtp_cipher_test_case_t;
 | |
| 
 | |
| /* srtp_cipher_type_t defines the 'metadata' for a particular cipher type */
 | |
| typedef struct srtp_cipher_type_t {
 | |
|     srtp_cipher_alloc_func_t alloc;
 | |
|     srtp_cipher_dealloc_func_t dealloc;
 | |
|     srtp_cipher_init_func_t init;
 | |
|     srtp_cipher_set_aad_func_t set_aad;
 | |
|     srtp_cipher_encrypt_func_t encrypt;
 | |
|     srtp_cipher_encrypt_func_t decrypt;
 | |
|     srtp_cipher_set_iv_func_t set_iv;
 | |
|     srtp_cipher_get_tag_func_t get_tag;
 | |
|     const char *description;
 | |
|     const srtp_cipher_test_case_t *test_data;
 | |
|     srtp_cipher_type_id_t id;
 | |
| } srtp_cipher_type_t;
 | |
| 
 | |
| /*
 | |
|  * srtp_cipher_t defines an instantiation of a particular cipher, with fixed
 | |
|  * key length, key and salt values
 | |
|  */
 | |
| typedef struct srtp_cipher_t {
 | |
|     const srtp_cipher_type_t *type;
 | |
|     void *state;
 | |
|     int key_len;
 | |
|     int algorithm;
 | |
| } srtp_cipher_t;
 | |
| 
 | |
| /* some bookkeeping functions */
 | |
| int srtp_cipher_get_key_length(const srtp_cipher_t *c);
 | |
| 
 | |
| /*
 | |
|  * srtp_cipher_type_self_test() tests a cipher against test cases provided in
 | |
|  * an array of values of key/srtp_xtd_seq_num_t/plaintext/ciphertext
 | |
|  * that is known to be good
 | |
|  */
 | |
| srtp_err_status_t srtp_cipher_type_self_test(const srtp_cipher_type_t *ct);
 | |
| 
 | |
| /*
 | |
|  * srtp_cipher_type_test() tests a cipher against external test cases provided
 | |
|  * in
 | |
|  * an array of values of key/srtp_xtd_seq_num_t/plaintext/ciphertext
 | |
|  * that is known to be good
 | |
|  */
 | |
| srtp_err_status_t srtp_cipher_type_test(
 | |
|     const srtp_cipher_type_t *ct,
 | |
|     const srtp_cipher_test_case_t *test_data);
 | |
| 
 | |
| /*
 | |
|  * srtp_cipher_bits_per_second(c, l, t) computes (an estimate of) the
 | |
|  * number of bits that a cipher implementation can encrypt in a second
 | |
|  *
 | |
|  * c is a cipher (which MUST be allocated and initialized already), l
 | |
|  * is the length in octets of the test data to be encrypted, and t is
 | |
|  * the number of trials
 | |
|  *
 | |
|  * if an error is encountered, then the value 0 is returned
 | |
|  */
 | |
| uint64_t srtp_cipher_bits_per_second(srtp_cipher_t *c,
 | |
|                                      int octets_in_buffer,
 | |
|                                      int num_trials);
 | |
| 
 | |
| srtp_err_status_t srtp_cipher_type_alloc(const srtp_cipher_type_t *ct,
 | |
|                                          srtp_cipher_t **c,
 | |
|                                          int key_len,
 | |
|                                          int tlen);
 | |
| srtp_err_status_t srtp_cipher_dealloc(srtp_cipher_t *c);
 | |
| srtp_err_status_t srtp_cipher_init(srtp_cipher_t *c, const uint8_t *key);
 | |
| srtp_err_status_t srtp_cipher_set_iv(srtp_cipher_t *c,
 | |
|                                      uint8_t *iv,
 | |
|                                      int direction);
 | |
| srtp_err_status_t srtp_cipher_output(srtp_cipher_t *c,
 | |
|                                      uint8_t *buffer,
 | |
|                                      uint32_t *num_octets_to_output);
 | |
| srtp_err_status_t srtp_cipher_encrypt(srtp_cipher_t *c,
 | |
|                                       uint8_t *buffer,
 | |
|                                       uint32_t *num_octets_to_output);
 | |
| srtp_err_status_t srtp_cipher_decrypt(srtp_cipher_t *c,
 | |
|                                       uint8_t *buffer,
 | |
|                                       uint32_t *num_octets_to_output);
 | |
| srtp_err_status_t srtp_cipher_get_tag(srtp_cipher_t *c,
 | |
|                                       uint8_t *buffer,
 | |
|                                       uint32_t *tag_len);
 | |
| srtp_err_status_t srtp_cipher_set_aad(srtp_cipher_t *c,
 | |
|                                       const uint8_t *aad,
 | |
|                                       uint32_t aad_len);
 | |
| 
 | |
| /*
 | |
|  * srtp_replace_cipher_type(ct, id)
 | |
|  *
 | |
|  * replaces srtp's existing cipher implementation for the cipher_type id
 | |
|  * with a new one passed in externally.  The new cipher must pass all the
 | |
|  * existing cipher_type's self tests as well as its own.
 | |
|  */
 | |
| srtp_err_status_t srtp_replace_cipher_type(const srtp_cipher_type_t *ct,
 | |
|                                            srtp_cipher_type_id_t id);
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif /* SRTP_CIPHER_H */
 |