⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 srtp_driver.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
📖 第 1 页 / 共 3 页
字号:
	   stream->rtcp_cipher->type->description,	   stream->rtcp_auth->type->description,	   serv_descr[stream->rtcp_services]);  }  /* loop over streams in session, printing the policy of each */  stream = srtp->stream_list;  while (stream != NULL) {    if (stream->rtp_services > sec_serv_conf_and_auth)      return err_status_bad_param;        printf("# SSRC:          0x%08x\r\n"	   "# rtp cipher:    %s\r\n"	   "# rtp auth:      %s\r\n"	   "# rtp services:  %s\r\n"            "# rtcp cipher:   %s\r\n"	   "# rtcp auth:     %s\r\n"	   "# rtcp services: %s\r\n",	   stream->ssrc,	   stream->rtp_cipher->type->description,	   stream->rtp_auth->type->description,	   serv_descr[stream->rtp_services],	   stream->rtcp_cipher->type->description,	   stream->rtcp_auth->type->description,	   serv_descr[stream->rtcp_services]);    /* advance to next stream in the list */    stream = stream->next;  }   return err_status_ok;}err_status_tsrtp_print_policy(const srtp_policy_t *policy) {  err_status_t status;  srtp_t session;  status = srtp_create(&session, policy);  if (status)    return status;  status = srtp_session_print_policy(session);  if (status)    return status;  status = srtp_dealloc(session);  if (status)    return status;  return err_status_ok;}/*  * srtp_print_packet(...) is for debugging only  * it prints an RTP packet to the stdout * * note that this function is *not* threadsafe */#include <stdio.h>#define MTU 2048char packet_string[MTU];char *srtp_packet_to_string(srtp_hdr_t *hdr, int pkt_octet_len) {  int octets_in_rtp_header = 12;  uint8_t *data = ((uint8_t *)hdr)+octets_in_rtp_header;  int hex_len = pkt_octet_len-octets_in_rtp_header;  /* sanity checking */  if ((hdr == NULL) || (pkt_octet_len > MTU))    return NULL;  /* write packet into string */  sprintf(packet_string, 	  "(s)rtp packet: {\n"	  "   version:\t%d\n" 	  "   p:\t\t%d\n"     	  "   x:\t\t%d\n"     	  "   cc:\t\t%d\n"    	  "   m:\t\t%d\n"     	  "   pt:\t\t%x\n"    	  "   seq:\t\t%x\n"   	  "   ts:\t\t%x\n"    	  "   ssrc:\t%x\n"    	  "   data:\t%s\n"    	  "} (%d octets in total)\n", 	  hdr->version,  	  hdr->p,	       	  hdr->x,	       	  hdr->cc,       	  hdr->m,	       	  hdr->pt,       	  hdr->seq,      	  hdr->ts,       	  hdr->ssrc,        	  octet_string_hex_string(data, hex_len),	  pkt_octet_len);  return packet_string;}/* * mips_estimate() is a simple function to estimate the number of * instructions per second that the host can perform.  note that this * function can be grossly wrong; you may want to have a manual sanity * check of its output! * * the 'ignore' pointer is there to convince the compiler to not just * optimize away the function */doublemips_estimate(int num_trials, int *ignore) {  clock_t t;  int i, sum;  sum = 0;  t = clock();  for (i=0; i<num_trials; i++)    sum += i;  t = clock() - t;/*   printf("%d\n", sum); */  *ignore = sum;  return (double) num_trials * CLOCKS_PER_SEC / t;}/* * srtp_validate() verifies the correctness of libsrtp by comparing * some computed packets against some pre-computed reference values. * These packets were made with the default SRTP policy. */err_status_tsrtp_validate() {  unsigned char test_key[30] = {    0xe1, 0xf9, 0x7a, 0x0d, 0x3e, 0x01, 0x8b, 0xe0,    0xd6, 0x4f, 0xa3, 0x2c, 0x06, 0xde, 0x41, 0x39,    0x0e, 0xc6, 0x75, 0xad, 0x49, 0x8a, 0xfe, 0xeb,    0xb6, 0x96, 0x0b, 0x3a, 0xab, 0xe6  };  uint8_t srtp_plaintext_ref[28] = {    0x80, 0x0f, 0x12, 0x34, 0xde, 0xca, 0xfb, 0xad,     0xca, 0xfe, 0xba, 0xbe, 0xab, 0xab, 0xab, 0xab,    0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,     0xab, 0xab, 0xab, 0xab  };  uint8_t srtp_plaintext[38] = {    0x80, 0x0f, 0x12, 0x34, 0xde, 0xca, 0xfb, 0xad,     0xca, 0xfe, 0xba, 0xbe, 0xab, 0xab, 0xab, 0xab,    0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab,     0xab, 0xab, 0xab, 0xab, 0x00, 0x00, 0x00, 0x00,     0x00, 0x00, 0x00, 0x00, 0x00, 0x00  };  uint8_t srtp_ciphertext[38] = {    0x80, 0x0f, 0x12, 0x34, 0xde, 0xca, 0xfb, 0xad,     0xca, 0xfe, 0xba, 0xbe, 0x4e, 0x55, 0xdc, 0x4c,    0xe7, 0x99, 0x78, 0xd8, 0x8c, 0xa4, 0xd2, 0x15,     0x94, 0x9d, 0x24, 0x02, 0xb7, 0x8d, 0x6a, 0xcc,    0x99, 0xea, 0x17, 0x9b, 0x8d, 0xbb  };  srtp_t srtp_snd, srtp_recv;  err_status_t status;  int len;  srtp_policy_t policy;    /*   * create a session with a single stream using the default srtp   * policy and with the SSRC value 0xcafebabe   */  crypto_policy_set_rtp_default(&policy.rtp);  crypto_policy_set_rtcp_default(&policy.rtcp);  policy.ssrc.type  = ssrc_specific;  policy.ssrc.value = 0xcafebabe;  policy.key  = test_key;  policy.next = NULL;  status = srtp_create(&srtp_snd, &policy);  if (status)    return status;   /*    * protect plaintext, then compare with ciphertext    */  len = 28;  status = srtp_protect(srtp_snd, srtp_plaintext, &len);  if (status || (len != 38))    return err_status_fail;  debug_print(mod_driver, "ciphertext:\n  %s", 	      	      octet_string_hex_string(srtp_plaintext, len));  debug_print(mod_driver, "ciphertext reference:\n  %s", 	      	      octet_string_hex_string(srtp_ciphertext, len));  if (octet_string_is_eq(srtp_plaintext, srtp_ciphertext, len))    return err_status_fail;    /*   * create a receiver session context comparable to the one created   * above - we need to do this so that the replay checking doesn't   * complain   */  status = srtp_create(&srtp_recv, &policy);  if (status)    return status;  /*   * unprotect ciphertext, then compare with plaintext    */  status = srtp_unprotect(srtp_recv, srtp_ciphertext, &len);  if (status || (len != 28))    return status;    if (octet_string_is_eq(srtp_ciphertext, srtp_plaintext_ref, len))    return err_status_fail;  return err_status_ok;}err_status_tsrtp_create_big_policy(srtp_policy_t **list) {  extern const srtp_policy_t *policy_array[];  srtp_policy_t *p, *tmp;  int i = 0;  uint32_t ssrc = 0;  /* sanity checking */  if ((list == NULL) || (policy_array[0] == NULL))    return err_status_bad_param;  /*    * loop over policy list, mallocing a new list and copying values   * into it (and incrementing the SSRC value as we go along)   */  tmp = NULL;  while (policy_array[i] != NULL) {    p  = (srtp_policy_t*) malloc(sizeof(srtp_policy_t));    if (p == NULL)      return err_status_bad_param;    memcpy(p, policy_array[i], sizeof(srtp_policy_t));    p->ssrc.type = ssrc_specific;    p->ssrc.value = ssrc++;    p->next = tmp;    tmp = p;    i++;  }  *list = p;   return err_status_ok;}err_status_tsrtp_test_remove_stream() {   err_status_t status;  srtp_policy_t *policy_list;  srtp_t session;  srtp_stream_t stream;  /*    * srtp_get_stream() is a libSRTP internal function that we declare   * here so that we can use it to verify the correct operation of the   * library   */   extern srtp_stream_t srtp_get_stream(srtp_t srtp, uint32_t ssrc);    status = srtp_create_big_policy(&policy_list);  if (status)    return status;  status = srtp_create(&session, policy_list);  if (status)    return status;  /*   * check for false positives by trying to remove a stream that's not   * in the session   */  status = srtp_remove_stream(session, htonl(0xaaaaaaaa));  if (status != err_status_no_ctx)    return err_status_fail;    /*    * check for false negatives by removing stream 0x1, then   * searching for streams 0x0 and 0x2   */  status = srtp_remove_stream(session, htonl(0x1));  if (status != err_status_ok)    return err_status_fail;  stream = srtp_get_stream(session, htonl(0x0));  if (stream == NULL)    return err_status_fail;  stream = srtp_get_stream(session, htonl(0x2));  if (stream == NULL)    return err_status_fail;    return err_status_ok;  }/* * srtp policy definitions - these definitions are used above */unsigned char test_key[30] = {    0xe1, 0xf9, 0x7a, 0x0d, 0x3e, 0x01, 0x8b, 0xe0,    0xd6, 0x4f, 0xa3, 0x2c, 0x06, 0xde, 0x41, 0x39,    0x0e, 0xc6, 0x75, 0xad, 0x49, 0x8a, 0xfe, 0xeb,    0xb6, 0x96, 0x0b, 0x3a, 0xab, 0xe6};const srtp_policy_t default_policy = {  { ssrc_any_outbound, 0 },  /* SSRC                           */  {                      /* SRTP policy                    */                      AES_128_ICM,            /* cipher type                 */    30,                     /* cipher key length in octets */    HMAC_SHA1,              /* authentication func type    */    16,                     /* auth key length in octets   */    10,                     /* auth tag length in octets   */    sec_serv_conf_and_auth  /* security services flag      */  },  {                      /* SRTCP policy                   */    AES_128_ICM,            /* cipher type                 */    30,                     /* cipher key length in octets */    HMAC_SHA1,              /* authentication func type    */    16,                     /* auth key length in octets   */    10,                     /* auth tag length in octets   */    sec_serv_conf_and_auth  /* security services flag      */  },  test_key,  NULL};const srtp_policy_t aes_tmmh_policy = {  { ssrc_any_outbound, 0 },     /* SSRC                        */  {     AES_128_ICM,            /* cipher type                 */    30,                     /* cipher key length in octets */    UST_TMMHv2,             /* authentication func type    */    94,                     /* auth key length in octets   */    4,                      /* auth tag length in octets   */    sec_serv_conf_and_auth  /* security services flag      */  },  {     AES_128_ICM,            /* cipher type                 */    30,                     /* cipher key length in octets */    UST_TMMHv2,             /* authentication func type    */    94,                     /* auth key length in octets   */    4,                      /* auth tag length in octets   */    sec_serv_conf_and_auth  /* security services flag      */  },  test_key,  NULL};const srtp_policy_t tmmh_only_policy = {  { ssrc_any_outbound, 0 },     /* SSRC                        */  {    AES_128_ICM,            /* cipher type                 */    30,                     /* cipher key length in octets */    UST_TMMHv2,             /* authentication func type    */    94,                     /* auth key length in octets   */    4,                      /* auth tag length in octets   */    sec_serv_auth           /* security services flag      */  },  {    AES_128_ICM,            /* cipher type                 */    30,                     /* cipher key length in octets */    UST_TMMHv2,             /* authentication func type    */    94,                     /* auth key length in octets   */    4,                      /* auth tag length in octets   */    sec_serv_auth           /* security services flag      */  },  test_key,  NULL};const srtp_policy_t aes_only_policy = {  { ssrc_any_outbound, 0 },     /* SSRC                        */   {    AES_128_ICM,            /* cipher type                 */    30,                     /* cipher key length in octets */    NULL_AUTH,              /* authentication func type    */    0,                      /* auth key length in octets   */    0,                      /* auth tag length in octets   */    sec_serv_conf           /* security services flag      */  },  {    AES_128_ICM,            /* cipher type                 */    30,                     /* cipher key length in octets */    NULL_AUTH,              /* authentication func type    */    0,                      /* auth key length in octets   */    0,                      /* auth tag length in octets   */    sec_serv_conf           /* security services flag      */  },  test_key,  NULL};const srtp_policy_t hmac_only_policy = {  { ssrc_any_outbound, 0 },     /* SSRC                        */  {    NULL_CIPHER,            /* cipher type                 */    0,                      /* cipher key length in octets */    HMAC_SHA1,              /* authentication func type    */    20,                     /* auth key length in octets   */    4,                      /* auth tag length in octets   */    sec_serv_auth           /* security services flag      */  },    {    NULL_CIPHER,            /* cipher type                 */    0,                      /* cipher key length in octets */    HMAC_SHA1,              /* authentication func type    */    20,                     /* auth key length in octets   */    4,                      /* auth tag length in octets   */    sec_serv_auth           /* security services flag      */  },  test_key,  NULL};const srtp_policy_t null_policy = {  { ssrc_any_outbound, 0 },     /* SSRC                        */   {    NULL_CIPHER,            /* cipher type                 */    0,                      /* cipher key length in octets */    NULL_AUTH,              /* authentication func type    */    0,                      /* auth key length in octets   */    0,                      /* auth tag length in octets   */    sec_serv_none           /* security services flag      */    },  {    NULL_CIPHER,            /* cipher type                 */    0,                      /* cipher key length in octets */    NULL_AUTH,              /* authentication func type    */    0,                      /* auth key length in octets   */    0,                      /* auth tag length in octets   */    sec_serv_none           /* security services flag      */    },  test_key,  NULL};/* * an array of pointers to the policies listed above * * This array is used to test various aspects of libSRTP for * different cryptographic policies.  The order of the elements * matters - the timing test generates output that can be used * in a plot (see the gnuplot script file 'timing').  If you  * add to this list, you should do it at the end. */#define USE_TMMH 0const srtp_policy_t *policy_array[] = {  &hmac_only_policy,#if USE_TMMH  &tmmh_only_policy,#endif  &aes_only_policy,#if USE_TMMH  &aes_tmmh_policy,#endif  &default_policy,  &null_policy,  NULL};const srtp_policy_t wildcard_policy = {  { ssrc_any_outbound, 0 }, /* SSRC                        */  {                      /* SRTP policy                    */                      AES_128_ICM,            /* cipher type                 */    30,                     /* cipher key length in octets */    HMAC_SHA1,              /* authentication func type    */    16,                     /* auth key length in octets   */    10,                     /* auth tag length in octets   */    sec_serv_conf_and_auth  /* security services flag      */  },  {                      /* SRTCP policy                   */    AES_128_ICM,            /* cipher type                 */    30,                     /* cipher key length in octets */    HMAC_SHA1,              /* authentication func type    */    16,                     /* auth key length in octets   */    10,                     /* auth tag length in octets   */    sec_serv_conf_and_auth  /* security services flag      */  },  test_key,  NULL};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -