test-recv.c
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:4k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*
  2.  * Secure RTP with libgcrypt
  3.  * Copyright (C) 2007  Rémi Denis-Courmont <rdenis # simphalempin , com>
  4.  *
  5.  * This library is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU Lesser General Public
  7.  * License as published by the Free Software Foundation; either
  8.  * version 2.1 of the License, or (at your option) any later version.
  9.  *
  10.  * This library is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  * Lesser General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU Lesser General Public
  16.  * License along with this library; if not, write to the Free Software
  17.  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  18.  */
  19. #ifdef HAVE_CONFIG_H
  20. # include <config.h>
  21. #endif
  22. #include <stdint.h>
  23. #include <stddef.h>
  24. #include "srtp.h"
  25. #include <stdio.h>
  26. #include <string.h>
  27. #include <errno.h>
  28. #undef NDEBUG
  29. #include <assert.h>
  30. int main (void)
  31. {
  32.     static const char key[] =
  33.         "123456789ABCDEF0" "123456789ABCDEF0";
  34.     static const char salt[] =
  35.         "1234567890" "1234567890" "12345678";
  36.     int val;
  37.     srtp_session_t *sd, *se;
  38.     /* Too big tag length */
  39.     se = srtp_create (SRTP_ENCR_AES_CM, SRTP_AUTH_HMAC_SHA1, 21,
  40.                       SRTP_PRF_AES_CM, 0);
  41.     assert (se == NULL);
  42.     /* Too short tag length */
  43.     se = srtp_create (SRTP_ENCR_AES_CM, SRTP_AUTH_HMAC_SHA1, 3,
  44.                       SRTP_PRF_AES_CM, SRTP_RCC_MODE1);
  45.     assert (se == NULL);
  46.     /* Initializes encryption and decryption contexts */
  47.     se = srtp_create (SRTP_ENCR_AES_CM, SRTP_AUTH_HMAC_SHA1, 20,
  48.                       SRTP_PRF_AES_CM, SRTP_RCC_MODE1);
  49.     assert (se != NULL);
  50.     sd = srtp_create (SRTP_ENCR_AES_CM, SRTP_AUTH_HMAC_SHA1, 20,
  51.                       SRTP_PRF_AES_CM, SRTP_RCC_MODE1);
  52.     assert (sd != NULL);
  53.     srtp_setrcc_rate (se, 1);
  54.     srtp_setrcc_rate (sd, 1);
  55.     val = srtp_setkeystring (se, key, salt);
  56.     assert (val == 0);
  57.     val = srtp_setkeystring (sd, key, salt);
  58.     assert (val == 0);
  59.     uint8_t buf[1500], buf2[1500];
  60.     size_t len;
  61.     /* Invalid SRTP packet */
  62.     len = 12;
  63.     memset (buf, 0, len);
  64.     val = srtp_send (se, buf, &len, sizeof (buf));
  65.     assert (val == EINVAL);
  66.     len = 32;
  67.     memset (buf, 0, len);
  68.     srtp_recv (sd, buf, &len);
  69.     assert (val == EINVAL);
  70.     /* Too short packet */
  71.     len = 11;
  72.     buf[0] = 0x80;
  73.     val = srtp_send (se, buf, &len, sizeof (buf));
  74.     assert (val == EINVAL);
  75.     len = 11;
  76.     val = srtp_recv (sd, buf, &len);
  77.     assert (val == EINVAL);
  78.     /* Too short when taking tag into account */
  79.     len = 31;
  80.     val = srtp_recv (sd, buf, &len);
  81.     assert (val == EINVAL);
  82.     /* Too short when taking RTP extensions into account */
  83.     len = 15;
  84.     buf[0] = 0x90;
  85.     val = srtp_send (se, buf, &len, sizeof (buf));
  86.     assert (val == EINVAL);
  87.     len = 16;
  88.     buf[0] = 0x90;
  89.     buf[15] = 1;
  90.     val = srtp_send (se, buf, &len, sizeof (buf));
  91.     assert (val == EINVAL);
  92.     /* Too small buffer (seq=1) */
  93.     len = 20;
  94.     memset (buf, 0, len);
  95.     buf[0] = 0x80;
  96.     buf[3] = 1;
  97.     val = srtp_send (se, buf, &len, 39);
  98.     assert (val == ENOSPC);
  99.     assert (len == 40);
  100.     len = 31;
  101.     val = srtp_recv (sd, buf, &len);
  102.     assert (val == EINVAL);
  103.     /* OK (seq=3) */
  104.     buf[0] = 0x80;
  105.     buf[3] = 3;
  106.     for (unsigned i = 0; i < 256; i++)
  107.         buf[i + 12] = i;
  108.     len = 0x10c;
  109.     val = srtp_send (se, buf, &len, 0x120);
  110.     assert (val == 0);
  111.     assert (len == 0x120);
  112.     memcpy (buf2, buf, len);
  113.     val = srtp_recv (sd, buf2, &len);
  114.     assert (val == 0);
  115.     assert (len == 0x10c);
  116.     assert (!memcmp (buf2, "x80x00x00x03" "x00x00x00x00"
  117.                            "x00x00x00x00", 12));
  118.     for (unsigned i = 0; i < 256; i++)
  119.         assert (buf2[i + 12] == i); // test actual decryption
  120.     /* Replay attack (seq=3) */
  121.     len = 0x120;
  122.     val = srtp_recv (sd, buf, &len);
  123.     assert (val == EACCES);
  124.     assert (len == 0x10c);
  125.     /* OK but late (seq=2) */
  126.     buf[0] = 0x80;
  127.     buf[3] = 2;
  128.     val = srtp_send (se, buf, &len, 0x120);
  129.     assert (val == 0);
  130.     assert (len == 0x120);
  131.     memcpy (buf2, buf, len);
  132.     val = srtp_recv (sd, buf2, &len);
  133.     assert (val == 0);
  134.     assert (len == 0x10c);
  135.     /* Late replay attack (seq=3) */
  136.     len = 0x120;
  137.     val = srtp_recv (sd, buf, &len);
  138.     assert (val == EACCES);
  139.     assert (len == 0x10c);
  140.     srtp_destroy (se);
  141.     srtp_destroy (sd);
  142.     return 0;
  143. }