2
0

srtp_priv.h 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. /*
  2. * srtp_priv.h
  3. *
  4. * private internal data structures and functions for libSRTP
  5. *
  6. * David A. McGrew
  7. * Cisco Systems, Inc.
  8. */
  9. /*
  10. *
  11. * Copyright (c) 2001-2017 Cisco Systems, Inc.
  12. * All rights reserved.
  13. *
  14. * Redistribution and use in source and binary forms, with or without
  15. * modification, are permitted provided that the following conditions
  16. * are met:
  17. *
  18. * Redistributions of source code must retain the above copyright
  19. * notice, this list of conditions and the following disclaimer.
  20. *
  21. * Redistributions in binary form must reproduce the above
  22. * copyright notice, this list of conditions and the following
  23. * disclaimer in the documentation and/or other materials provided
  24. * with the distribution.
  25. *
  26. * Neither the name of the Cisco Systems, Inc. nor the names of its
  27. * contributors may be used to endorse or promote products derived
  28. * from this software without specific prior written permission.
  29. *
  30. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  31. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  32. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  33. * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  34. * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
  35. * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  36. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  37. * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  38. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  39. * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  40. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  41. * OF THE POSSIBILITY OF SUCH DAMAGE.
  42. *
  43. */
  44. #ifndef SRTP_PRIV_H
  45. #define SRTP_PRIV_H
  46. // Leave this as the top level import. Ensures the existence of defines
  47. #include "config.h"
  48. #include "srtp.h"
  49. #include "rdbx.h"
  50. #include "rdb.h"
  51. #include "integers.h"
  52. #include "cipher.h"
  53. #include "auth.h"
  54. #include "aes.h"
  55. #include "key.h"
  56. #include "crypto_kernel.h"
  57. #ifdef __cplusplus
  58. extern "C" {
  59. #endif
  60. #define SRTP_VER_STRING PACKAGE_STRING
  61. #define SRTP_VERSION PACKAGE_VERSION
  62. typedef struct srtp_stream_ctx_t_ srtp_stream_ctx_t;
  63. typedef srtp_stream_ctx_t *srtp_stream_t;
  64. /*
  65. * the following declarations are libSRTP internal functions
  66. */
  67. /*
  68. * srtp_get_stream(ssrc) returns a pointer to the stream corresponding
  69. * to ssrc, or NULL if no stream exists for that ssrc
  70. */
  71. srtp_stream_t srtp_get_stream(srtp_t srtp, uint32_t ssrc);
  72. /*
  73. * srtp_stream_init_keys(s, k) (re)initializes the srtp_stream_t s by
  74. * deriving all of the needed keys using the KDF and the key k.
  75. */
  76. srtp_err_status_t srtp_stream_init_keys(srtp_stream_ctx_t *srtp,
  77. srtp_master_key_t *master_key,
  78. const unsigned int current_mki_index);
  79. /*
  80. * srtp_stream_init_all_master_keys(s, k, m) (re)initializes the srtp_stream_t s
  81. * by deriving all of the needed keys for all the master keys using the KDF and
  82. * the keys from k.
  83. */
  84. srtp_err_status_t srtp_steam_init_all_master_keys(
  85. srtp_stream_ctx_t *srtp,
  86. unsigned char *key,
  87. srtp_master_key_t **keys,
  88. const unsigned int max_master_keys);
  89. /*
  90. * srtp_stream_init(s, p) initializes the srtp_stream_t s to
  91. * use the policy at the location p
  92. */
  93. srtp_err_status_t srtp_stream_init(srtp_stream_t srtp, const srtp_policy_t *p);
  94. /*
  95. * libsrtp internal datatypes
  96. */
  97. typedef enum direction_t {
  98. dir_unknown = 0,
  99. dir_srtp_sender = 1,
  100. dir_srtp_receiver = 2
  101. } direction_t;
  102. /*
  103. * srtp_session_keys_t will contain the encryption, hmac, salt keys
  104. * for both SRTP and SRTCP. The session keys will also contain the
  105. * MKI ID which is used to identify the session keys.
  106. */
  107. typedef struct srtp_session_keys_t {
  108. srtp_cipher_t *rtp_cipher;
  109. srtp_cipher_t *rtp_xtn_hdr_cipher;
  110. srtp_auth_t *rtp_auth;
  111. srtp_cipher_t *rtcp_cipher;
  112. srtp_auth_t *rtcp_auth;
  113. uint8_t salt[SRTP_AEAD_SALT_LEN];
  114. uint8_t c_salt[SRTP_AEAD_SALT_LEN];
  115. uint8_t *mki_id;
  116. unsigned int mki_size;
  117. srtp_key_limit_ctx_t *limit;
  118. } srtp_session_keys_t;
  119. /*
  120. * an srtp_stream_t has its own SSRC, encryption key, authentication
  121. * key, sequence number, and replay database
  122. *
  123. * note that the keys might not actually be unique, in which case the
  124. * srtp_cipher_t and srtp_auth_t pointers will point to the same structures
  125. */
  126. typedef struct srtp_stream_ctx_t_ {
  127. uint32_t ssrc;
  128. srtp_session_keys_t *session_keys;
  129. unsigned int num_master_keys;
  130. srtp_rdbx_t rtp_rdbx;
  131. srtp_sec_serv_t rtp_services;
  132. srtp_rdb_t rtcp_rdb;
  133. srtp_sec_serv_t rtcp_services;
  134. direction_t direction;
  135. int allow_repeat_tx;
  136. srtp_ekt_stream_t ekt;
  137. int *enc_xtn_hdr;
  138. int enc_xtn_hdr_count;
  139. uint32_t pending_roc;
  140. struct srtp_stream_ctx_t_ *next; /* linked list of streams */
  141. } strp_stream_ctx_t_;
  142. /*
  143. * an srtp_ctx_t holds a stream list and a service description
  144. */
  145. typedef struct srtp_ctx_t_ {
  146. struct srtp_stream_ctx_t_ *stream_list; /* linked list of streams */
  147. struct srtp_stream_ctx_t_ *stream_template; /* act as template for other */
  148. /* streams */
  149. void *user_data; /* user custom data */
  150. } srtp_ctx_t_;
  151. /*
  152. * srtp_hdr_t represents an RTP or SRTP header. The bit-fields in
  153. * this structure should be declared "unsigned int" instead of
  154. * "unsigned char", but doing so causes the MS compiler to not
  155. * fully pack the bit fields.
  156. *
  157. * In this implementation, an srtp_hdr_t is assumed to be 32-bit aligned
  158. *
  159. * (note that this definition follows that of RFC 1889 Appendix A, but
  160. * is not identical)
  161. */
  162. #ifndef WORDS_BIGENDIAN
  163. typedef struct {
  164. unsigned char cc : 4; /* CSRC count */
  165. unsigned char x : 1; /* header extension flag */
  166. unsigned char p : 1; /* padding flag */
  167. unsigned char version : 2; /* protocol version */
  168. unsigned char pt : 7; /* payload type */
  169. unsigned char m : 1; /* marker bit */
  170. uint16_t seq; /* sequence number */
  171. uint32_t ts; /* timestamp */
  172. uint32_t ssrc; /* synchronization source */
  173. } srtp_hdr_t;
  174. #else /* BIG_ENDIAN */
  175. typedef struct {
  176. unsigned char version : 2; /* protocol version */
  177. unsigned char p : 1; /* padding flag */
  178. unsigned char x : 1; /* header extension flag */
  179. unsigned char cc : 4; /* CSRC count */
  180. unsigned char m : 1; /* marker bit */
  181. unsigned char pt : 7; /* payload type */
  182. uint16_t seq; /* sequence number */
  183. uint32_t ts; /* timestamp */
  184. uint32_t ssrc; /* synchronization source */
  185. } srtp_hdr_t;
  186. #endif
  187. typedef struct {
  188. uint16_t profile_specific; /* profile-specific info */
  189. uint16_t length; /* number of 32-bit words in extension */
  190. } srtp_hdr_xtnd_t;
  191. /*
  192. * srtcp_hdr_t represents a secure rtcp header
  193. *
  194. * in this implementation, an srtcp header is assumed to be 32-bit
  195. * aligned
  196. */
  197. #ifndef WORDS_BIGENDIAN
  198. typedef struct {
  199. unsigned char rc : 5; /* reception report count */
  200. unsigned char p : 1; /* padding flag */
  201. unsigned char version : 2; /* protocol version */
  202. unsigned char pt : 8; /* payload type */
  203. uint16_t len; /* length */
  204. uint32_t ssrc; /* synchronization source */
  205. } srtcp_hdr_t;
  206. typedef struct {
  207. unsigned int index : 31; /* srtcp packet index in network order! */
  208. unsigned int e : 1; /* encrypted? 1=yes */
  209. /* optional mikey/etc go here */
  210. /* and then the variable-length auth tag */
  211. } srtcp_trailer_t;
  212. #else /* BIG_ENDIAN */
  213. typedef struct {
  214. unsigned char version : 2; /* protocol version */
  215. unsigned char p : 1; /* padding flag */
  216. unsigned char rc : 5; /* reception report count */
  217. unsigned char pt : 8; /* payload type */
  218. uint16_t len; /* length */
  219. uint32_t ssrc; /* synchronization source */
  220. } srtcp_hdr_t;
  221. typedef struct {
  222. unsigned int e : 1; /* encrypted? 1=yes */
  223. unsigned int index : 31; /* srtcp packet index */
  224. /* optional mikey/etc go here */
  225. /* and then the variable-length auth tag */
  226. } srtcp_trailer_t;
  227. #endif
  228. /*
  229. * srtp_handle_event(srtp, srtm, evnt) calls the event handling
  230. * function, if there is one.
  231. *
  232. * This macro is not included in the documentation as it is
  233. * an internal-only function.
  234. */
  235. #define srtp_handle_event(srtp, strm, evnt) \
  236. if (srtp_event_handler) { \
  237. srtp_event_data_t data; \
  238. data.session = srtp; \
  239. data.ssrc = ntohl(strm->ssrc); \
  240. data.event = evnt; \
  241. srtp_event_handler(&data); \
  242. }
  243. #ifdef __cplusplus
  244. }
  245. #endif
  246. #endif /* SRTP_PRIV_H */