netwerk/srtp/src/include/srtp_priv.h

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     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-2006 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  */
    45 #ifndef SRTP_PRIV_H
    46 #define SRTP_PRIV_H
    48 #include "srtp.h"
    49 #include "rdbx.h"
    50 #include "rdb.h"
    51 #include "integers.h"
    53 /*
    54  * an srtp_hdr_t represents the srtp header
    55  *
    56  * in this implementation, an srtp_hdr_t is assumed to be 32-bit aligned
    57  * 
    58  * (note that this definition follows that of RFC 1889 Appendix A, but
    59  * is not identical)
    60  */
    62 #ifndef WORDS_BIGENDIAN
    64 /*
    65  * srtp_hdr_t represents an RTP or SRTP header.  The bit-fields in
    66  * this structure should be declared "unsigned int" instead of 
    67  * "unsigned char", but doing so causes the MS compiler to not
    68  * fully pack the bit fields.
    69  */
    71 typedef struct {
    72   unsigned char cc:4;	/* CSRC count             */
    73   unsigned char x:1;	/* header extension flag  */
    74   unsigned char p:1;	/* padding flag           */
    75   unsigned char version:2; /* protocol version    */
    76   unsigned char pt:7;	/* payload type           */
    77   unsigned char m:1;	/* marker bit             */
    78   uint16_t seq;		/* sequence number        */
    79   uint32_t ts;		/* timestamp              */
    80   uint32_t ssrc;	/* synchronization source */
    81 } srtp_hdr_t;
    83 #else /*  BIG_ENDIAN */
    85 typedef struct {
    86   unsigned char version:2; /* protocol version    */
    87   unsigned char p:1;	/* padding flag           */
    88   unsigned char x:1;	/* header extension flag  */
    89   unsigned char cc:4;	/* CSRC count             */
    90   unsigned char m:1;	/* marker bit             */
    91   unsigned pt:7;	/* payload type           */
    92   uint16_t seq;		/* sequence number        */
    93   uint32_t ts;		/* timestamp              */
    94   uint32_t ssrc;	/* synchronization source */
    95 } srtp_hdr_t;
    97 #endif
    99 typedef struct {
   100   uint16_t profile_specific;    /* profile-specific info               */
   101   uint16_t length;              /* number of 32-bit words in extension */
   102 } srtp_hdr_xtnd_t;
   105 /*
   106  * srtcp_hdr_t represents a secure rtcp header 
   107  *
   108  * in this implementation, an srtcp header is assumed to be 32-bit
   109  * alinged
   110  */
   112 #ifndef WORDS_BIGENDIAN
   114 typedef struct {
   115   unsigned char rc:5;		/* reception report count */
   116   unsigned char p:1;		/* padding flag           */
   117   unsigned char version:2;	/* protocol version       */
   118   unsigned char pt:8;		/* payload type           */
   119   uint16_t len;			/* length                 */
   120   uint32_t ssrc;	       	/* synchronization source */
   121 } srtcp_hdr_t;
   123 typedef struct {
   124   unsigned int index:31;    /* srtcp packet index in network order! */
   125   unsigned int e:1;         /* encrypted? 1=yes */
   126   /* optional mikey/etc go here */
   127   /* and then the variable-length auth tag */
   128 } srtcp_trailer_t;
   131 #else /*  BIG_ENDIAN */
   133 typedef struct {
   134   unsigned char version:2;	/* protocol version       */
   135   unsigned char p:1;		/* padding flag           */
   136   unsigned char rc:5;		/* reception report count */
   137   unsigned char pt:8;		/* payload type           */
   138   uint16_t len;			/* length                 */
   139   uint32_t ssrc;	       	/* synchronization source */
   140 } srtcp_hdr_t;
   142 typedef struct {
   143   unsigned int version:2;  /* protocol version                     */
   144   unsigned int p:1;        /* padding flag                         */
   145   unsigned int count:5;    /* varies by packet type                */
   146   unsigned int pt:8;       /* payload type                         */
   147   uint16_t length;         /* len of uint32s of packet less header */
   148 } rtcp_common_t;
   150 typedef struct {
   151   unsigned int e:1;         /* encrypted? 1=yes */
   152   unsigned int index:31;    /* srtcp packet index */
   153   /* optional mikey/etc go here */
   154   /* and then the variable-length auth tag */
   155 } srtcp_trailer_t;
   157 #endif
   160 /*
   161  * the following declarations are libSRTP internal functions 
   162  */
   164 /*
   165  * srtp_get_stream(ssrc) returns a pointer to the stream corresponding
   166  * to ssrc, or NULL if no stream exists for that ssrc
   167  */
   169 srtp_stream_t 
   170 srtp_get_stream(srtp_t srtp, uint32_t ssrc);
   173 /*
   174  * srtp_stream_init_keys(s, k) (re)initializes the srtp_stream_t s by
   175  * deriving all of the needed keys using the KDF and the key k.
   176  */
   179 err_status_t
   180 srtp_stream_init_keys(srtp_stream_t srtp, const void *key);
   182 /*
   183  * srtp_stream_init(s, p) initializes the srtp_stream_t s to 
   184  * use the policy at the location p
   185  */
   186 err_status_t
   187 srtp_stream_init(srtp_stream_t srtp, 
   188 		 const srtp_policy_t *p);
   191 /*
   192  * libsrtp internal datatypes 
   193  */
   195 typedef enum direction_t { 
   196   dir_unknown       = 0,
   197   dir_srtp_sender   = 1, 
   198   dir_srtp_receiver = 2
   199 } direction_t;
   201 /* 
   202  * an srtp_stream_t has its own SSRC, encryption key, authentication
   203  * key, sequence number, and replay database
   204  * 
   205  * note that the keys might not actually be unique, in which case the
   206  * cipher_t and auth_t pointers will point to the same structures
   207  */
   209 typedef struct srtp_stream_ctx_t {
   210   uint32_t   ssrc;
   211   cipher_t  *rtp_cipher;
   212   auth_t    *rtp_auth;
   213   rdbx_t     rtp_rdbx;
   214   sec_serv_t rtp_services;
   215   cipher_t  *rtcp_cipher;
   216   auth_t    *rtcp_auth;
   217   rdb_t      rtcp_rdb;
   218   sec_serv_t rtcp_services;
   219   key_limit_ctx_t *limit;
   220   direction_t direction;
   221   int        allow_repeat_tx;
   222   ekt_stream_t ekt; 
   223   struct srtp_stream_ctx_t *next;   /* linked list of streams */
   224 } srtp_stream_ctx_t;
   227 /*
   228  * an srtp_ctx_t holds a stream list and a service description
   229  */
   231 typedef struct srtp_ctx_t {
   232   srtp_stream_ctx_t *stream_list;     /* linked list of streams            */
   233   srtp_stream_ctx_t *stream_template; /* act as template for other streams */
   234 } srtp_ctx_t;
   238 /*
   239  * srtp_handle_event(srtp, srtm, evnt) calls the event handling
   240  * function, if there is one.
   241  *
   242  * This macro is not included in the documentation as it is 
   243  * an internal-only function.
   244  */
   246 #define srtp_handle_event(srtp, strm, evnt)         \
   247    if(srtp_event_handler) {                         \
   248       srtp_event_data_t data;                       \
   249       data.session = srtp;                          \
   250       data.stream  = strm;                          \
   251       data.event   = evnt;                          \
   252       srtp_event_handler(&data);                    \
   253 }   
   256 #endif /* SRTP_PRIV_H */

mercurial