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

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. #include <stdio.h>
  20. #include "srtp.c"
  21. static void printhex (const void *buf, size_t len)
  22. {
  23.     for (size_t i = 0; i < len; i++)
  24.         printf ("%02X", ((uint8_t *)buf)[i]);
  25.     fputc ('n', stdout);
  26. }
  27. static void fatal (const char *msg)
  28. {
  29.     puts (msg);
  30.     exit (1);
  31. }
  32. /** AES-CM key derivation test vectors */
  33. static void test_derivation (void)
  34. {
  35.     static const uint8_t key[16] =
  36.         "xE1xF9x7Ax0Dx3Ex01x8BxE0xD6x4FxA3x2Cx06xDEx41x39";
  37.     static const uint8_t salt[14] =
  38.         "x0ExC6x75xADx49x8AxFExEBxB6x96x0Bx3AxABxE6";
  39.     static const uint8_t good_cipher[16] =
  40.         "xC6x1Ex7Ax93x74x4Fx39xEEx10x73x4AxFEx3FxF7xA0x87";
  41.     static const uint8_t good_salt[14] =
  42.         "x30xCBxBCx08x86x3Dx8Cx85xD4x9DxB3x4Ax9AxE1";
  43.     static const uint8_t good_auth[94] =
  44.         "xCExBEx32x1Fx6FxF7x71x6Bx6FxD4xABx49xAFx25x6Ax15"
  45.         "x6Dx38xBAxA4x8Fx0Ax0AxCFx3Cx34xE2x35x9Ex6CxDBxCE"
  46.         "xE0x49x64x6Cx43xD9x32x7AxD1x75x57x8ExF7x22x70x98"
  47.         "x63x71xC1x0Cx9Ax36x9AxC2xF9x4Ax8Cx5FxBCxDDxDCx25"
  48.         "x6Dx6Ex91x9Ax48xB6x10xEFx17xC2x04x1Ex47x40x35x76"
  49.         "x6Bx68x64x2Cx59xBBxFCx2Fx34xDBx60xDBxDFxB2";
  50.     static const uint8_t r[6] = { 0, 0, 0, 0, 0, 0 };
  51.     gcry_cipher_hd_t prf;
  52.     uint8_t out[94];
  53.     puts ("AES-CM key derivation test...");
  54.     printf (" master key:  ");
  55.     printhex (key, sizeof (key));
  56.     printf (" master salt: ");
  57.     printhex (salt, sizeof (salt));
  58.     if (gcry_cipher_open (&prf, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_CTR, 0)
  59.      || gcry_cipher_setkey (prf, key, sizeof (key)))
  60.         fatal ("Internal PRF error");
  61.     if (derive (prf, salt, r, sizeof (r), SRTP_CRYPT, out, 16))
  62.         fatal ("Internal cipher derivation error");
  63.     printf (" cipher key:  ");
  64.     printhex (out, 16);
  65.     if (memcmp (out, good_cipher, 16))
  66.         fatal ("Test failed");
  67.     if (derive (prf, salt, r, sizeof (r), SRTP_SALT, out, 14))
  68.         fatal ("Internal salt derivation error");
  69.     printf (" cipher salt: ");
  70.     printhex (out, 14);
  71.     if (memcmp (out, good_salt, 14))
  72.         fatal ("Test failed");
  73.     if (derive (prf, salt, r, sizeof (r), SRTP_AUTH, out, 94))
  74.         fatal ("Internal auth key derivation error");
  75.     printf (" auth key:    ");
  76.     printhex (out, 94);
  77.     if (memcmp (out, good_auth, 94))
  78.         fatal ("Test failed");
  79.     gcry_cipher_close (prf);
  80. }
  81. /** AES-CM key derivation test vectors */
  82. static void test_keystream (void)
  83. {
  84.     static const uint8_t key[16] =
  85.         "x2Bx7Ex15x16x28xAExD2xA6xABxF7x15x88x09xCFx4Fx3C";
  86.     const uint32_t salt[4]=
  87.         { htonl (0xf0f1f2f3), htonl (0xf4f5f6f7),
  88.           htonl (0xf8f9fafb), htonl (0xfcfd0000) };
  89.     puts ("AES-CM key stream test...");
  90.     uint8_t *buf = calloc (0xff02, 16);
  91.     if (buf == NULL)
  92.     {
  93.         fputs ("Not enough memory for testn", stderr);
  94.         return;
  95.     }
  96.     printf (" session key: ");
  97.     printhex (key, sizeof (key));
  98.     gcry_cipher_hd_t hd;
  99.     if (gcry_cipher_open (&hd, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_CTR, 0))
  100.         fatal ("Cipher initialization error");
  101.     if (gcry_cipher_setkey (hd, key, sizeof (key)))
  102.         fatal ("Cipher key error");
  103.     if (rtp_crypt (hd, 0, 0, 0, salt, buf, 0xff020))
  104.         fatal ("Encryption failure");
  105.     gcry_cipher_close (hd);
  106.     static const uint8_t good_start[48] =
  107.         "xE0x3ExADx09x35xC9x5Ex80xE1x66xB1x6DxD9x2Bx4ExB4"
  108.         "xD2x35x13x16x2Bx02xD0xF7x2Ax43xA2xFEx4Ax5Fx97xAB"
  109.         "x41xE9x5Bx3BxB0xA2xE8xDDx47x79x01xE4xFCxA8x94xC0";
  110.     static const uint8_t good_end[48] =
  111.         "xECx8CxDFx73x98x60x7CxB0xF2xD2x16x75xEAx9ExA1xE4"
  112.         "x36x2Bx7Cx3Cx67x73x51x63x18xA0x77xD7xFCx50x73xAE"
  113.         "x6Ax2CxC3x78x78x89x37x4FxBExB4xC8x1Bx17xBAx6Cx44";
  114.     printf (" key stream:  ");
  115.     printhex (buf, sizeof (good_start));
  116.     printf (" ... cont'd : ");
  117.     printhex (buf + 0xff020 - sizeof (good_end), sizeof (good_end));
  118.     if (memcmp (buf, good_start, sizeof (good_start))
  119.      || memcmp (buf + 0xff020 - sizeof (good_end), good_end,
  120.                 sizeof (good_end)))
  121.         fatal ("Key stream test failed");
  122.     free (buf);
  123. }
  124. static void srtp_test (void)
  125. {
  126.     if (init_libgcrypt ())
  127.         fatal ("Libgcrypt initialization error");
  128.     test_derivation ();
  129.     test_keystream ();
  130. }
  131. int main (void)
  132. {
  133.     srtp_test ();
  134.     return 0;
  135. }