From 72e2d183c1d63a224742e243e4b1fd412f876758 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 17 Jan 2013 17:59:53 -0600 Subject: [PATCH] update to cvs head srtp --- libs/srtp/.update | 1 - libs/srtp/LICENSE | 2 +- libs/srtp/README | 6 +- libs/srtp/VERSION | 2 +- libs/srtp/config.hw | 391 ++++++------- libs/srtp/configure.in | 8 +- libs/srtp/crypto/.cvsignore | 1 + libs/srtp/crypto/Makefile.in | 25 +- libs/srtp/crypto/ae_xfm/xfm.c | 10 +- libs/srtp/crypto/cipher/aes.c | 288 ++++++--- libs/srtp/crypto/cipher/aes_cbc.c | 132 ++++- libs/srtp/crypto/cipher/aes_icm.c | 123 ++-- libs/srtp/crypto/cipher/cipher.c | 34 +- libs/srtp/crypto/cipher/null_cipher.c | 13 +- libs/srtp/crypto/hash/auth.c | 20 +- libs/srtp/crypto/hash/hmac.c | 11 +- libs/srtp/crypto/hash/null_auth.c | 12 +- libs/srtp/crypto/hash/sha1.c | 15 +- libs/srtp/crypto/include/.cvsignore | 1 + libs/srtp/crypto/include/aes.h | 30 +- libs/srtp/crypto/include/aes_cbc.h | 2 +- libs/srtp/crypto/include/aes_icm.h | 5 +- libs/srtp/crypto/include/alloc.h | 2 +- libs/srtp/crypto/include/auth.h | 14 +- libs/srtp/crypto/include/cipher.h | 24 +- libs/srtp/crypto/include/crypto.h | 28 +- libs/srtp/crypto/include/crypto_kernel.h | 56 +- libs/srtp/crypto/include/crypto_math.h | 36 +- libs/srtp/crypto/include/crypto_types.h | 34 +- libs/srtp/crypto/include/cryptoalg.h | 2 +- libs/srtp/crypto/include/datatypes.h | 105 +++- libs/srtp/crypto/include/err.h | 4 +- libs/srtp/crypto/include/gf2_8.h | 2 +- libs/srtp/crypto/include/hmac.h | 2 +- libs/srtp/crypto/include/integers.h | 4 +- libs/srtp/crypto/include/key.h | 2 +- libs/srtp/crypto/include/null_auth.h | 2 +- libs/srtp/crypto/include/null_cipher.h | 6 +- libs/srtp/crypto/include/rand_source.h | 2 +- libs/srtp/crypto/include/rdb.h | 4 +- libs/srtp/crypto/include/rdbx.h | 50 +- libs/srtp/crypto/include/sha1.h | 2 +- libs/srtp/crypto/include/stat.h | 2 +- libs/srtp/crypto/kernel/alloc.c | 2 +- libs/srtp/crypto/kernel/crypto_kernel.c | 112 +++- libs/srtp/crypto/kernel/err.c | 6 +- libs/srtp/crypto/kernel/key.c | 2 +- libs/srtp/crypto/math/datatypes.c | 163 +++++- libs/srtp/crypto/math/gf2_8.c | 4 +- libs/srtp/crypto/math/math.c | 174 +----- libs/srtp/crypto/math/stat.c | 6 +- libs/srtp/crypto/replay/rdb.c | 24 +- libs/srtp/crypto/replay/rdbx.c | 107 +++- libs/srtp/crypto/replay/ut_sim.c | 5 +- libs/srtp/crypto/rng/ctr_prng.c | 8 +- libs/srtp/crypto/rng/prng.c | 22 +- libs/srtp/crypto/rng/rand_source.c | 62 +- libs/srtp/crypto/test/.cvsignore | 8 + libs/srtp/crypto/test/aes_calc | Bin 0 -> 63886 bytes libs/srtp/crypto/test/aes_calc.c | 36 +- libs/srtp/crypto/test/auth_driver.c | 2 +- libs/srtp/crypto/test/cipher_driver.c | 76 ++- libs/srtp/crypto/test/datatypes_driver | Bin 0 -> 31454 bytes libs/srtp/crypto/test/datatypes_driver.c | 2 +- libs/srtp/crypto/test/env.c | 2 +- libs/srtp/crypto/test/kernel_driver.c | 2 +- libs/srtp/crypto/test/rand_gen.c | 2 +- libs/srtp/crypto/test/sha1_driver | Bin 0 -> 190768 bytes libs/srtp/crypto/test/sha1_driver.c | 27 +- libs/srtp/crypto/test/stat_driver | Bin 0 -> 84793 bytes libs/srtp/crypto/test/stat_driver.c | 40 +- libs/srtp/doc/Doxyfile | 2 +- libs/srtp/doc/header.template | 19 +- libs/srtp/doc/intro.txt | 18 +- libs/srtp/doc/libsrtp.pdf | Bin 355874 -> 346251 bytes libs/srtp/include/ekt.h | 201 +++++++ libs/srtp/include/getopt_s.h | 60 ++ libs/srtp/include/rtp.h | 92 +-- libs/srtp/include/rtp_priv.h | 74 +++ libs/srtp/include/srtp.h | 423 +++++++------- libs/srtp/include/srtp_priv.h | 256 ++++++++ libs/srtp/include/ut_sim.h | 2 +- libs/srtp/srtp.def | 182 +++--- libs/srtp/srtp/ekt.c | 278 +++++++++ libs/srtp/srtp/srtp.c | 715 ++++++++++++++++++----- libs/srtp/tables/aes_tables.c | 2 +- libs/srtp/test/dtls_srtp_driver.c | 261 +++++++++ libs/srtp/test/getopt_s.c | 112 ++++ libs/srtp/test/rdbx_driver | Bin 0 -> 43570 bytes libs/srtp/test/rdbx_driver.c | 102 +++- libs/srtp/test/replay_driver | Bin 0 -> 36946 bytes libs/srtp/test/replay_driver.c | 135 ++++- libs/srtp/test/roc_driver | Bin 0 -> 36459 bytes libs/srtp/test/roc_driver.c | 8 +- libs/srtp/test/rtp.c | 70 ++- libs/srtp/test/rtpw.c | 138 ++++- libs/srtp/test/rtpw_test.sh | 80 +++ libs/srtp/test/srtp_driver.c | 599 ++++++++++++++++++- libs/srtp/update.sh | 2 +- src/switch_rtp.c | 1 + 100 files changed, 4732 insertions(+), 1509 deletions(-) create mode 100644 libs/srtp/crypto/.cvsignore create mode 100644 libs/srtp/crypto/include/.cvsignore create mode 100644 libs/srtp/crypto/test/.cvsignore create mode 100755 libs/srtp/crypto/test/aes_calc create mode 100755 libs/srtp/crypto/test/datatypes_driver create mode 100755 libs/srtp/crypto/test/sha1_driver create mode 100755 libs/srtp/crypto/test/stat_driver create mode 100644 libs/srtp/include/ekt.h create mode 100644 libs/srtp/include/getopt_s.h create mode 100644 libs/srtp/include/rtp_priv.h create mode 100644 libs/srtp/include/srtp_priv.h create mode 100644 libs/srtp/srtp/ekt.c create mode 100644 libs/srtp/test/dtls_srtp_driver.c create mode 100644 libs/srtp/test/getopt_s.c create mode 100755 libs/srtp/test/rdbx_driver create mode 100755 libs/srtp/test/replay_driver create mode 100755 libs/srtp/test/roc_driver create mode 100755 libs/srtp/test/rtpw_test.sh diff --git a/libs/srtp/.update b/libs/srtp/.update index 0269e52854..e69de29bb2 100644 --- a/libs/srtp/.update +++ b/libs/srtp/.update @@ -1 +0,0 @@ -Fri Mar 16 17:20:27 EDT 2007 diff --git a/libs/srtp/LICENSE b/libs/srtp/LICENSE index d1ff4e8559..dd43240cae 100644 --- a/libs/srtp/LICENSE +++ b/libs/srtp/LICENSE @@ -1,6 +1,6 @@ /* * - * Copyright (c) 2001-2005 Cisco Systems, Inc. + * Copyright (c) 2001-2006 Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/libs/srtp/README b/libs/srtp/README index 02dc1f8eb5..08fafaedbc 100644 --- a/libs/srtp/README +++ b/libs/srtp/README @@ -1,4 +1,4 @@ -Secure RTP (SRTP) and UST Reference Implementations +Secure RTP (SRTP) Reference Implementation David A. McGrew Cisco Systems, Inc. mcgrew@cisco.com @@ -9,7 +9,9 @@ Transport Protocol (SRTP), the Universal Security Transform (UST), and a supporting cryptographic kernel. These mechanisms are documented in the Internet Drafts in the doc/ subdirectory. The SRTP API is documented in include/srtp.h, and the library is in libsrtp.a (after -compilation). +compilation). An overview and reference manual is available in +doc/libsrtp.pdf. The PDF documentation is more up to date than this +file. Installation: diff --git a/libs/srtp/VERSION b/libs/srtp/VERSION index 9df886c42a..1c99cf0e80 100644 --- a/libs/srtp/VERSION +++ b/libs/srtp/VERSION @@ -1 +1 @@ -1.4.2 +1.4.4 diff --git a/libs/srtp/config.hw b/libs/srtp/config.hw index 32f5ed9196..39d4e07364 100644 --- a/libs/srtp/config.hw +++ b/libs/srtp/config.hw @@ -1,195 +1,196 @@ -/* crypto/include/config.h. Generated by configure. */ -/* config_in.h. Generated from configure.in by autoheader. */ - -/* Define if building for a CISC machine (e.g. Intel). */ -#define CPU_CISC 1 - -/* Define if building for a RISC machine (assume slow byte access). */ -/* #undef CPU_RISC */ - -/* Path to random device */ -/* #define DEV_URANDOM "/dev/urandom" */ - -/* Define to compile in dynamic debugging system. */ -#define ENABLE_DEBUGGING 1 - -/* Report errors to this file. */ -/* #undef ERR_REPORTING_FILE */ - -/* Define to use logging to stdout. */ -#define ERR_REPORTING_STDOUT 1 - -/* Define this to use ISMAcryp code. */ -/* #undef GENERIC_AESICM */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_ARPA_INET_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_BYTESWAP_H */ - -/* Define to 1 if you have the `inet_aton' function. */ -/* #undef HAVE_INET_ATON */ - -/* Define to 1 if the system has the type `int16_t'. */ -#define HAVE_INT16_T 1 - -/* Define to 1 if the system has the type `int32_t'. */ -#define HAVE_INT32_T 1 - -/* Define to 1 if the system has the type `int8_t'. */ -#define HAVE_INT8_T 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_INTTYPES_H */ - -/* Define to 1 if you have the `socket' library (-lsocket). */ -/* #undef HAVE_LIBSOCKET */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_MACHINE_TYPES_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_MEMORY_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_NETINET_IN_H */ - -/* Define to 1 if you have the `socket' function. */ -/* #undef HAVE_SOCKET */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_STDINT_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_STDLIB_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STRINGS_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STRING_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYSLOG_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_INT_TYPES_H */ - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_SOCKET_H */ - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_STAT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_TYPES_H 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_SYS_UIO_H */ - -/* Define to 1 if the system has the type `uint16_t'. */ -#define HAVE_UINT16_T 1 - -/* Define to 1 if the system has the type `uint32_t'. */ -#define HAVE_UINT32_T 1 - -/* Define to 1 if the system has the type `uint64_t'. */ -#define HAVE_UINT64_T 1 - -/* Define to 1 if the system has the type `uint8_t'. */ -#define HAVE_UINT8_T 1 - -/* Define to 1 if you have the header file. */ -/* #undef HAVE_UNISTD_H */ - -/* Define to 1 if you have the `usleep' function. */ -/* #undef HAVE_USLEEP */ - -/* Define to 1 if you have the header file. */ -#define HAVE_WINDOWS_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_WINSOCK2_H 1 - -/* Define to use X86 inlined assembly code */ -/* #undef HAVE_X86 */ - -/* Define to the address where bug reports for this package should be sent. */ -#define PACKAGE_BUGREPORT "" - -/* Define to the full name of this package. */ -#define PACKAGE_NAME "" - -/* Define to the full name and version of this package. */ -#define PACKAGE_STRING "" - -/* Define to the one symbol short name of this package. */ -#define PACKAGE_TARNAME "" - -/* Define to the version of this package. */ -#define PACKAGE_VERSION "" - -/* The size of a `unsigned long', as computed by sizeof. */ -#define SIZEOF_UNSIGNED_LONG 4 - -/* The size of a `unsigned long long', as computed by sizeof. */ -#define SIZEOF_UNSIGNED_LONG_LONG 8 - -/* Define to use GDOI. */ -/* #undef SRTP_GDOI */ - -/* Define to compile for kernel contexts. */ -/* #undef SRTP_KERNEL */ - -/* Define to compile for Linux kernel context. */ -/* #undef SRTP_KERNEL_LINUX */ - -/* Define to 1 if you have the ANSI C header files. */ -#define STDC_HEADERS 1 - -/* Write errors to this file */ -/* #undef USE_ERR_REPORTING_FILE */ - -/* Define to use syslog logging. */ -/* #undef USE_SYSLOG */ - -/* Define to 1 if your processor stores words with the most significant byte - first (like Motorola and SPARC, unlike Intel and VAX). */ -/* #undef WORDS_BIGENDIAN */ - -/* Define to empty if `const' does not conform to ANSI C. */ -/* #undef const */ - -/* Define to `__inline__' or `__inline' if that's what the C compiler - calls it, or to nothing if 'inline' is not supported under any name. */ -#ifndef __cplusplus -#define inline __inline -#endif - -/* Define to `unsigned' if does not define. */ -/* #undef size_t */ - -#if (_MSC_VER >= 1400) // VC8+ -#ifndef _CRT_SECURE_NO_DEPRECATE -#define _CRT_SECURE_NO_DEPRECATE -#endif -#ifndef _CRT_NONSTDC_NO_DEPRECATE -#define _CRT_NONSTDC_NO_DEPRECATE -#endif -#endif // VC8+ - -#ifndef uint32_t -typedef unsigned __int8 uint8_t; -typedef unsigned __int16 uint16_t; -typedef unsigned __int32 uint32_t; -typedef unsigned __int64 uint64_t; -typedef __int8 int8_t; -typedef __int16 int16_t; -typedef __int32 int32_t; -typedef __int64 int64_t; -#endif - -#ifdef _MSC_VER -#pragma warning(disable:4311) -#endif +/* crypto/include/config.h. Generated by configure. */ +/* config_in.h. Generated from configure.in by autoheader. */ + +#if (_MSC_VER >= 1400) +# define HAVE_RAND_S 1 +#endif + +/* Define if building for a CISC machine (e.g. Intel). */ +#define CPU_CISC 1 + +/* Define if building for a RISC machine (assume slow byte access). */ +/* #undef CPU_RISC */ + +/* Path to random device */ +/* #define DEV_URANDOM "/dev/urandom" */ + +/* Define to compile in dynamic debugging system. */ +#define ENABLE_DEBUGGING 1 + +/* Report errors to this file. */ +/* #undef ERR_REPORTING_FILE */ + +/* Define to use logging to stdout. */ +#define ERR_REPORTING_STDOUT 1 + +/* Define this to use ISMAcryp code. */ +/* #undef GENERIC_AESICM */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_ARPA_INET_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_BYTESWAP_H */ + +/* Define to 1 if you have the `inet_aton' function. */ +/* #undef HAVE_INET_ATON */ + +/* Define to 1 if the system has the type `int16_t'. */ +#define HAVE_INT16_T 1 + +/* Define to 1 if the system has the type `int32_t'. */ +#define HAVE_INT32_T 1 + +/* Define to 1 if the system has the type `int8_t'. */ +#define HAVE_INT8_T 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_INTTYPES_H */ + +/* Define to 1 if you have the `socket' library (-lsocket). */ +/* #undef HAVE_LIBSOCKET */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_MACHINE_TYPES_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_NETINET_IN_H */ + +/* Define to 1 if you have the `socket' function. */ +/* #undef HAVE_SOCKET */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_STDINT_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYSLOG_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_INT_TYPES_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_SOCKET_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_UIO_H */ + +/* Define to 1 if the system has the type `uint16_t'. */ +#define HAVE_UINT16_T 1 + +/* Define to 1 if the system has the type `uint32_t'. */ +#define HAVE_UINT32_T 1 + +/* Define to 1 if the system has the type `uint64_t'. */ +#define HAVE_UINT64_T 1 + +/* Define to 1 if the system has the type `uint8_t'. */ +#define HAVE_UINT8_T 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_UNISTD_H */ + +/* Define to 1 if you have the `usleep' function. */ +/* #undef HAVE_USLEEP */ + +/* Define to 1 if you have the header file. */ +#define HAVE_WINDOWS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_WINSOCK2_H 1 + +/* Define to use X86 inlined assembly code */ +/* #undef HAVE_X86 */ + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "" + +/* The size of a `unsigned long', as computed by sizeof. */ +#define SIZEOF_UNSIGNED_LONG 4 + +/* The size of a `unsigned long long', as computed by sizeof. */ +#define SIZEOF_UNSIGNED_LONG_LONG 8 + +/* Define to use GDOI. */ +/* #undef SRTP_GDOI */ + +/* Define to compile for kernel contexts. */ +/* #undef SRTP_KERNEL */ + +/* Define to compile for Linux kernel context. */ +/* #undef SRTP_KERNEL_LINUX */ + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Write errors to this file */ +/* #undef USE_ERR_REPORTING_FILE */ + +/* Define to use syslog logging. */ +/* #undef USE_SYSLOG */ + +/* Define to 1 if your processor stores words with the most significant byte + first (like Motorola and SPARC, unlike Intel and VAX). */ +/* #undef WORDS_BIGENDIAN */ + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ + +/* Define 'inline' to nothing, since the MSVC compiler doesn't support it. */ +#define inline + +/* Define to `unsigned' if does not define. */ +/* #undef size_t */ + +#if (_MSC_VER >= 1400) // VC8+ +#ifndef _CRT_SECURE_NO_DEPRECATE +#define _CRT_SECURE_NO_DEPRECATE +#endif +#ifndef _CRT_NONSTDC_NO_DEPRECATE +#define _CRT_NONSTDC_NO_DEPRECATE +#endif +#endif // VC8+ + +#ifndef uint32_t +typedef unsigned __int8 uint8_t; +typedef unsigned __int16 uint16_t; +typedef unsigned __int32 uint32_t; +typedef unsigned __int64 uint64_t; +typedef __int8 int8_t; +typedef __int16 int16_t; +typedef __int32 int32_t; +typedef __int64 int64_t; +#endif + +#ifdef _MSC_VER +#pragma warning(disable:4311) +#endif diff --git a/libs/srtp/configure.in b/libs/srtp/configure.in index 2495a55f95..dc471c5b14 100644 --- a/libs/srtp/configure.in +++ b/libs/srtp/configure.in @@ -144,10 +144,10 @@ fi AC_MSG_CHECKING(which random device to use) if test "$enable_kernel_linux" = "yes"; then - RNG_OBJS=rand_linux_kernel.c + RNG_OBJS=rand_linux_kernel.o AC_MSG_RESULT([Linux kernel builtin]) else -RNG_OBJS=rand_source.c +RNG_OBJS=rand_source.o if test -n "$DEV_URANDOM"; then AC_DEFINE_UNQUOTED(DEV_URANDOM, "$DEV_URANDOM",[Path to random device]) AC_MSG_RESULT([$DEV_URANDOM]) @@ -197,7 +197,7 @@ AC_C_INLINE AC_TYPE_SIZE_T dnl Checks for library functions. -AC_CHECK_FUNCS(socket inet_aton usleep) +AC_CHECK_FUNCS(socket inet_aton usleep sigaction) dnl Find socket function if not found yet. if test "x$ac_cv_func_socket" = "xno"; then @@ -222,7 +222,7 @@ AC_C_BIGENDIAN dnl check host_cpu type, set defines appropriately case $host_cpu in - i*86 ) + i*86 | x86_64 ) AC_DEFINE(CPU_CISC, 1, [Define if building for a CISC machine (e.g. Intel).]) AC_DEFINE(HAVE_X86, 1, diff --git a/libs/srtp/crypto/.cvsignore b/libs/srtp/crypto/.cvsignore new file mode 100644 index 0000000000..f3c7a7c5da --- /dev/null +++ b/libs/srtp/crypto/.cvsignore @@ -0,0 +1 @@ +Makefile diff --git a/libs/srtp/crypto/Makefile.in b/libs/srtp/crypto/Makefile.in index c14dba50c5..9d52104210 100644 --- a/libs/srtp/crypto/Makefile.in +++ b/libs/srtp/crypto/Makefile.in @@ -41,21 +41,28 @@ dummy : all runtest # test applications -testapp = test/cipher_driver$(EXE) test/datatypes_driver$(EXE) \ - test/stat_driver$(EXE) test/sha1_driver$(EXE) \ - test/kernel_driver$(EXE) test/aes_calc$(EXE) test/rand_gen$(EXE) \ - test/env$(EXE) +testapp = #test/cipher_driver$(EXE) test/datatypes_driver$(EXE) \ + #test/stat_driver$(EXE) test/sha1_driver$(EXE) \ + #test/kernel_driver$(EXE) test/aes_calc$(EXE) test/rand_gen$(EXE) \ + #test/env$(EXE) -# data values used to test the aes_calc application +# data values used to test the aes_calc application for AES-128 +k128=000102030405060708090a0b0c0d0e0f +p128=00112233445566778899aabbccddeeff +c128=69c4e0d86a7b0430d8cdb78070b4c55a + + +# data values used to test the aes_calc application for AES-256 +k256=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f +p256=00112233445566778899aabbccddeeff +c256=8ea2b7ca516745bfeafc49904b496089 -k=000102030405060708090a0b0c0d0e0f -p=00112233445566778899aabbccddeeff -c=69c4e0d86a7b0430d8cdb78070b4c55a runtest: libcryptomodule.a $(testapp) test/env$(EXE) # print out information on the build environment @echo "running libcryptomodule test applications..." - test `test/aes_calc $k $p` = $c + test `test/aes_calc $(k128) $(p128)` = $(c128) + test `test/aes_calc $(k256) $(p256)` = $(c256) test/cipher_driver$(EXE) -v >/dev/null test/datatypes_driver$(EXE) -v >/dev/null test/stat_driver$(EXE) >/dev/null diff --git a/libs/srtp/crypto/ae_xfm/xfm.c b/libs/srtp/crypto/ae_xfm/xfm.c index 05ff710f90..7aa338830f 100644 --- a/libs/srtp/crypto/ae_xfm/xfm.c +++ b/libs/srtp/crypto/ae_xfm/xfm.c @@ -63,7 +63,7 @@ aes_128_cbc_hmac_sha1_96_func(void *key, /* perform encryption and authentication */ /* set aes key */ - status = aes_cbc_context_init(&aes_ctx, key, direction_encrypt); + status = aes_cbc_context_init(&aes_ctx, key, ENC_KEY_LEN, direction_encrypt); if (status) return status; /* set iv */ @@ -139,7 +139,7 @@ aes_128_cbc_hmac_sha1_96_inv(void *key, /* perform encryption and authentication */ /* set aes key */ - status = aes_cbc_context_init(&aes_ctx, key, direction_decrypt); + status = aes_cbc_context_init(&aes_ctx, key, ENC_KEY_LEN, direction_decrypt); if (status) return status; /* set iv */ @@ -227,7 +227,7 @@ aes_128_cbc_hmac_sha1_96_enc(void *key, /* perform encryption and authentication */ /* set aes key */ - status = aes_cbc_context_init(&aes_ctx, key, direction_encrypt); + status = aes_cbc_context_init(&aes_ctx, key, ENC_KEY_LEN, direction_encrypt); if (status) return status; /* set iv */ @@ -397,7 +397,7 @@ aes_128_cbc_hmac_sha1_96_dec(void *key, *opaque_len -= TAG_LEN; /* decrypt the confidential data */ - status = aes_cbc_context_init(&aes_ctx, key, direction_decrypt); + status = aes_cbc_context_init(&aes_ctx, key, ENC_KEY_LEN, direction_decrypt); if (status) return status; status = aes_cbc_set_iv(&aes_ctx, iv); if (status) return status; @@ -564,7 +564,7 @@ cryptoalg_find_by_id(int id) { case 1: return cryptoalg; default: - return 0; + break; } return 0; } diff --git a/libs/srtp/crypto/cipher/aes.c b/libs/srtp/crypto/cipher/aes.c index c736e17102..a17b9e4993 100644 --- a/libs/srtp/crypto/cipher/aes.c +++ b/libs/srtp/crypto/cipher/aes.c @@ -9,7 +9,7 @@ /* * - * Copyright (c) 2001-2005, Cisco Systems, Inc. + * Copyright (c) 2001-2006, Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -1358,51 +1358,50 @@ static uint32_t U4[256] = { extern debug_module_t mod_aes_icm; -void -aes_expand_encryption_key(const v128_t *key, - aes_expanded_key_t expanded_key) { +static void +aes_128_expand_encryption_key(const uint8_t *key, + aes_expanded_key_t *expanded_key) { int i; gf2_8 rc; /* initialize round constant */ rc = 1; - expanded_key[0].v32[0] = key->v32[0]; - expanded_key[0].v32[1] = key->v32[1]; - expanded_key[0].v32[2] = key->v32[2]; - expanded_key[0].v32[3] = key->v32[3]; + expanded_key->num_rounds = 10; + + v128_copy_octet_string(&expanded_key->round[0], key); #if 0 debug_print(mod_aes_icm, - "expanded key[0]: %s", v128_hex_string(&expanded_key[0])); + "expanded key[0]: %s", v128_hex_string(&expanded_key->round[0])); #endif /* loop over round keys */ for (i=1; i < 11; i++) { /* munge first word of round key */ - expanded_key[i].v8[0] = aes_sbox[expanded_key[i-1].v8[13]] ^ rc; - expanded_key[i].v8[1] = aes_sbox[expanded_key[i-1].v8[14]]; - expanded_key[i].v8[2] = aes_sbox[expanded_key[i-1].v8[15]]; - expanded_key[i].v8[3] = aes_sbox[expanded_key[i-1].v8[12]]; + expanded_key->round[i].v8[0] = aes_sbox[expanded_key->round[i-1].v8[13]] ^ rc; + expanded_key->round[i].v8[1] = aes_sbox[expanded_key->round[i-1].v8[14]]; + expanded_key->round[i].v8[2] = aes_sbox[expanded_key->round[i-1].v8[15]]; + expanded_key->round[i].v8[3] = aes_sbox[expanded_key->round[i-1].v8[12]]; - expanded_key[i].v32[0] ^= expanded_key[i-1].v32[0]; + expanded_key->round[i].v32[0] ^= expanded_key->round[i-1].v32[0]; /* set remaining 32 bit words to the exor of the one previous with * the one four words previous */ - expanded_key[i].v32[1] = - expanded_key[i].v32[0] ^ expanded_key[i-1].v32[1]; + expanded_key->round[i].v32[1] = + expanded_key->round[i].v32[0] ^ expanded_key->round[i-1].v32[1]; - expanded_key[i].v32[2] = - expanded_key[i].v32[1] ^ expanded_key[i-1].v32[2]; + expanded_key->round[i].v32[2] = + expanded_key->round[i].v32[1] ^ expanded_key->round[i-1].v32[2]; - expanded_key[i].v32[3] = - expanded_key[i].v32[2] ^ expanded_key[i-1].v32[3]; + expanded_key->round[i].v32[3] = + expanded_key->round[i].v32[2] ^ expanded_key->round[i-1].v32[3]; #if 0 debug_print2(mod_aes_icm, - "expanded key[%d]: %s", i,v128_hex_string(&expanded_key[i])); + "expanded key[%d]: %s", i,v128_hex_string(&expanded_key->round[i])); #endif /* modify round constant */ @@ -1411,19 +1410,107 @@ aes_expand_encryption_key(const v128_t *key, } } -void -aes_expand_decryption_key(const v128_t *key, - aes_expanded_key_t expanded_key) { +static void +aes_256_expand_encryption_key(const unsigned char *key, + aes_expanded_key_t *expanded_key) { int i; + gf2_8 rc; - aes_expand_encryption_key(key, expanded_key); + /* initialize round constant */ + rc = 1; + + expanded_key->num_rounds = 14; + + v128_copy_octet_string(&expanded_key->round[0], key); + v128_copy_octet_string(&expanded_key->round[1], key+16); + +#if 0 + debug_print(mod_aes_icm, + "expanded key[0]: %s", v128_hex_string(&expanded_key->round[0])); + debug_print(mod_aes_icm, + "expanded key[1]: %s", v128_hex_string(&expanded_key->round[1])); +#endif + + /* loop over rest of round keys */ + for (i=2; i < 15; i++) { + + /* munge first word of round key */ + if ((i & 1) == 0) { + expanded_key->round[i].v8[0] = aes_sbox[expanded_key->round[i-1].v8[13]] ^ rc; + expanded_key->round[i].v8[1] = aes_sbox[expanded_key->round[i-1].v8[14]]; + expanded_key->round[i].v8[2] = aes_sbox[expanded_key->round[i-1].v8[15]]; + expanded_key->round[i].v8[3] = aes_sbox[expanded_key->round[i-1].v8[12]]; + + /* modify round constant */ + rc = gf2_8_shift(rc); + } + else { + expanded_key->round[i].v8[0] = aes_sbox[expanded_key->round[i-1].v8[12]]; + expanded_key->round[i].v8[1] = aes_sbox[expanded_key->round[i-1].v8[13]]; + expanded_key->round[i].v8[2] = aes_sbox[expanded_key->round[i-1].v8[14]]; + expanded_key->round[i].v8[3] = aes_sbox[expanded_key->round[i-1].v8[15]]; + } + + expanded_key->round[i].v32[0] ^= expanded_key->round[i-2].v32[0]; + + /* set remaining 32 bit words to the exor of the one previous with + * the one eight words previous */ + + expanded_key->round[i].v32[1] = + expanded_key->round[i].v32[0] ^ expanded_key->round[i-2].v32[1]; + + expanded_key->round[i].v32[2] = + expanded_key->round[i].v32[1] ^ expanded_key->round[i-2].v32[2]; + + expanded_key->round[i].v32[3] = + expanded_key->round[i].v32[2] ^ expanded_key->round[i-2].v32[3]; + +#if 0 + debug_print2(mod_aes_icm, + "expanded key[%d]: %s", i,v128_hex_string(&expanded_key->round[i])); +#endif + + } +} + +err_status_t +aes_expand_encryption_key(const uint8_t *key, + int key_len, + aes_expanded_key_t *expanded_key) { + if (key_len == 16) { + aes_128_expand_encryption_key(key, expanded_key); + return err_status_ok; + } + else if (key_len == 24) { + /* AES-192 not yet supported */ + return err_status_bad_param; + } + else if (key_len == 32) { + aes_256_expand_encryption_key(key, expanded_key); + return err_status_ok; + } + else + return err_status_bad_param; +} + +err_status_t +aes_expand_decryption_key(const uint8_t *key, + int key_len, + aes_expanded_key_t *expanded_key) { + int i; + err_status_t status; + int num_rounds = expanded_key->num_rounds; + + status = aes_expand_encryption_key(key, key_len, expanded_key); + if (status) + return status; /* invert the order of the round keys */ - for (i=0; i < 5; i++) { + for (i=0; i < num_rounds/2; i++) { v128_t tmp; - v128_copy(&tmp, &expanded_key[10-i]); - v128_copy(&expanded_key[10-i], &expanded_key[i]); - v128_copy(&expanded_key[i], &tmp); + v128_copy(&tmp, &expanded_key->round[num_rounds-i]); + v128_copy(&expanded_key->round[num_rounds-i], &expanded_key->round[i]); + v128_copy(&expanded_key->round[i], &tmp); } /* @@ -1434,33 +1521,33 @@ aes_expand_decryption_key(const v128_t *key, * followed by the T4 table (which cancels out the use of the sbox * in the U-tables) */ - for (i=1; i < 10; i++) { + for (i=1; i < num_rounds; i++) { #ifdef CPU_RISC uint32_t tmp; - tmp = expanded_key[i].v32[0]; - expanded_key[i].v32[0] = + tmp = expanded_key->round[i].v32[0]; + expanded_key->round[i].v32[0] = U0[T4[(tmp >> 24) ] & 0xff] ^ U1[T4[(tmp >> 16) & 0xff] & 0xff] ^ U2[T4[(tmp >> 8) & 0xff] & 0xff] ^ U3[T4[(tmp) & 0xff] & 0xff]; - tmp = expanded_key[i].v32[1]; - expanded_key[i].v32[1] = + tmp = expanded_key->round[i].v32[1]; + expanded_key->round[i].v32[1] = U0[T4[(tmp >> 24) ] & 0xff] ^ U1[T4[(tmp >> 16) & 0xff] & 0xff] ^ U2[T4[(tmp >> 8) & 0xff] & 0xff] ^ U3[T4[(tmp) & 0xff] & 0xff]; - tmp = expanded_key[i].v32[2]; - expanded_key[i].v32[2] = + tmp = expanded_key->round[i].v32[2]; + expanded_key->round[i].v32[2] = U0[T4[(tmp >> 24) ] & 0xff] ^ U1[T4[(tmp >> 16) & 0xff] & 0xff] ^ U2[T4[(tmp >> 8) & 0xff] & 0xff] ^ U3[T4[(tmp) & 0xff] & 0xff]; - tmp = expanded_key[i].v32[3]; - expanded_key[i].v32[3] = + tmp = expanded_key->round[i].v32[3]; + expanded_key->round[i].v32[3] = U0[T4[(tmp >> 24) ] & 0xff] ^ U1[T4[(tmp >> 16) & 0xff] & 0xff] ^ U2[T4[(tmp >> 8) & 0xff] & 0xff] ^ @@ -1469,33 +1556,35 @@ aes_expand_decryption_key(const v128_t *key, uint32_t c0, c1, c2, c3; - c0 = U0[aes_sbox[expanded_key[i].v8[0]]] - ^ U1[aes_sbox[expanded_key[i].v8[1]]] - ^ U2[aes_sbox[expanded_key[i].v8[2]]] - ^ U3[aes_sbox[expanded_key[i].v8[3]]]; + c0 = U0[aes_sbox[expanded_key->round[i].v8[0]]] + ^ U1[aes_sbox[expanded_key->round[i].v8[1]]] + ^ U2[aes_sbox[expanded_key->round[i].v8[2]]] + ^ U3[aes_sbox[expanded_key->round[i].v8[3]]]; - c1 = U0[aes_sbox[expanded_key[i].v8[4]]] - ^ U1[aes_sbox[expanded_key[i].v8[5]]] - ^ U2[aes_sbox[expanded_key[i].v8[6]]] - ^ U3[aes_sbox[expanded_key[i].v8[7]]]; + c1 = U0[aes_sbox[expanded_key->round[i].v8[4]]] + ^ U1[aes_sbox[expanded_key->round[i].v8[5]]] + ^ U2[aes_sbox[expanded_key->round[i].v8[6]]] + ^ U3[aes_sbox[expanded_key->round[i].v8[7]]]; - c2 = U0[aes_sbox[expanded_key[i].v8[8]]] - ^ U1[aes_sbox[expanded_key[i].v8[9]]] - ^ U2[aes_sbox[expanded_key[i].v8[10]]] - ^ U3[aes_sbox[expanded_key[i].v8[11]]]; + c2 = U0[aes_sbox[expanded_key->round[i].v8[8]]] + ^ U1[aes_sbox[expanded_key->round[i].v8[9]]] + ^ U2[aes_sbox[expanded_key->round[i].v8[10]]] + ^ U3[aes_sbox[expanded_key->round[i].v8[11]]]; - c3 = U0[aes_sbox[expanded_key[i].v8[12]]] - ^ U1[aes_sbox[expanded_key[i].v8[13]]] - ^ U2[aes_sbox[expanded_key[i].v8[14]]] - ^ U3[aes_sbox[expanded_key[i].v8[15]]]; + c3 = U0[aes_sbox[expanded_key->round[i].v8[12]]] + ^ U1[aes_sbox[expanded_key->round[i].v8[13]]] + ^ U2[aes_sbox[expanded_key->round[i].v8[14]]] + ^ U3[aes_sbox[expanded_key->round[i].v8[15]]]; - expanded_key[i].v32[0] = c0; - expanded_key[i].v32[1] = c1; - expanded_key[i].v32[2] = c2; - expanded_key[i].v32[3] = c3; + expanded_key->round[i].v32[0] = c0; + expanded_key->round[i].v32[1] = c1; + expanded_key->round[i].v32[2] = c2; + expanded_key->round[i].v32[3] = c3; #endif } + + return err_status_ok; } #ifdef CPU_CISC @@ -1910,42 +1999,67 @@ aes_inv_final_round(v128_t *state, const v128_t *round_key) { void -aes_encrypt(v128_t *plaintext, const aes_expanded_key_t exp_key) { +aes_encrypt(v128_t *plaintext, const aes_expanded_key_t *exp_key) { /* add in the subkey */ - v128_xor_eq(plaintext, exp_key + 0); + v128_xor_eq(plaintext, &exp_key->round[0]); - /* now do nine rounds */ - aes_round(plaintext, exp_key + 1); - aes_round(plaintext, exp_key + 2); - aes_round(plaintext, exp_key + 3); - aes_round(plaintext, exp_key + 4); - aes_round(plaintext, exp_key + 5); - aes_round(plaintext, exp_key + 6); - aes_round(plaintext, exp_key + 7); - aes_round(plaintext, exp_key + 8); - aes_round(plaintext, exp_key + 9); - /* the last round is different */ - - aes_final_round(plaintext, exp_key + 10); + /* now do the rounds */ + aes_round(plaintext, &exp_key->round[1]); + aes_round(plaintext, &exp_key->round[2]); + aes_round(plaintext, &exp_key->round[3]); + aes_round(plaintext, &exp_key->round[4]); + aes_round(plaintext, &exp_key->round[5]); + aes_round(plaintext, &exp_key->round[6]); + aes_round(plaintext, &exp_key->round[7]); + aes_round(plaintext, &exp_key->round[8]); + aes_round(plaintext, &exp_key->round[9]); + if (exp_key->num_rounds == 10) { + aes_final_round(plaintext, &exp_key->round[10]); + } + else if (exp_key->num_rounds == 12) { + aes_round(plaintext, &exp_key->round[10]); + aes_round(plaintext, &exp_key->round[11]); + aes_final_round(plaintext, &exp_key->round[12]); + } + else if (exp_key->num_rounds == 14) { + aes_round(plaintext, &exp_key->round[10]); + aes_round(plaintext, &exp_key->round[11]); + aes_round(plaintext, &exp_key->round[12]); + aes_round(plaintext, &exp_key->round[13]); + aes_final_round(plaintext, &exp_key->round[14]); + } } void -aes_decrypt(v128_t *plaintext, const aes_expanded_key_t exp_key) { +aes_decrypt(v128_t *plaintext, const aes_expanded_key_t *exp_key) { /* add in the subkey */ - v128_xor_eq(plaintext, exp_key + 0); + v128_xor_eq(plaintext, &exp_key->round[0]); - /* now do nine rounds */ - aes_inv_round(plaintext, exp_key + 1); - aes_inv_round(plaintext, exp_key + 2); - aes_inv_round(plaintext, exp_key + 3); - aes_inv_round(plaintext, exp_key + 4); - aes_inv_round(plaintext, exp_key + 5); - aes_inv_round(plaintext, exp_key + 6); - aes_inv_round(plaintext, exp_key + 7); - aes_inv_round(plaintext, exp_key + 8); - aes_inv_round(plaintext, exp_key + 9); - /* the last round is different */ - aes_inv_final_round(plaintext, exp_key + 10); + /* now do the rounds */ + aes_inv_round(plaintext, &exp_key->round[1]); + aes_inv_round(plaintext, &exp_key->round[2]); + aes_inv_round(plaintext, &exp_key->round[3]); + aes_inv_round(plaintext, &exp_key->round[4]); + aes_inv_round(plaintext, &exp_key->round[5]); + aes_inv_round(plaintext, &exp_key->round[6]); + aes_inv_round(plaintext, &exp_key->round[7]); + aes_inv_round(plaintext, &exp_key->round[8]); + aes_inv_round(plaintext, &exp_key->round[9]); + if (exp_key->num_rounds == 10) { + aes_inv_final_round(plaintext, &exp_key->round[10]); + } + else if (exp_key->num_rounds == 12) { + aes_inv_round(plaintext, &exp_key->round[10]); + aes_inv_round(plaintext, &exp_key->round[11]); + aes_inv_final_round(plaintext, &exp_key->round[12]); + } + else if (exp_key->num_rounds == 14) { + aes_inv_round(plaintext, &exp_key->round[10]); + aes_inv_round(plaintext, &exp_key->round[11]); + aes_inv_round(plaintext, &exp_key->round[12]); + aes_inv_round(plaintext, &exp_key->round[13]); + aes_inv_final_round(plaintext, &exp_key->round[14]); + } } diff --git a/libs/srtp/crypto/cipher/aes_cbc.c b/libs/srtp/crypto/cipher/aes_cbc.c index fbfce629e6..ed33f5b01c 100644 --- a/libs/srtp/crypto/cipher/aes_cbc.c +++ b/libs/srtp/crypto/cipher/aes_cbc.c @@ -9,7 +9,7 @@ /* * - * Copyright (c) 2001-2005, Cisco Systems, Inc. + * Copyright (c) 2001-2006, Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -63,12 +63,12 @@ aes_cbc_alloc(cipher_t **c, int key_len) { debug_print(mod_aes_cbc, "allocating cipher with key length %d", key_len); - if (key_len != 16) + if (key_len != 16 && key_len != 24 && key_len != 32) return err_status_bad_param; - /* allocate memory a cipher of type aes_icm */ + /* allocate memory a cipher of type aes_cbc */ tmp = (sizeof(aes_cbc_ctx_t) + sizeof(cipher_t)); - pointer = crypto_alloc(tmp); + pointer = (uint8_t*)crypto_alloc(tmp); if (pointer == NULL) return err_status_alloc_fail; @@ -104,23 +104,24 @@ aes_cbc_dealloc(cipher_t *c) { } err_status_t -aes_cbc_context_init(aes_cbc_ctx_t *c, const uint8_t *key, +aes_cbc_context_init(aes_cbc_ctx_t *c, const uint8_t *key, int key_len, cipher_direction_t dir) { - v128_t tmp_key; - - /* set tmp_key (for alignment) */ - v128_copy_octet_string(&tmp_key, key); + err_status_t status; debug_print(mod_aes_cbc, - "key: %s", v128_hex_string(&tmp_key)); + "key: %s", octet_string_hex_string(key, key_len)); /* expand key for the appropriate direction */ switch (dir) { case (direction_encrypt): - aes_expand_encryption_key(&tmp_key, c->expanded_key); + status = aes_expand_encryption_key(key, key_len, &c->expanded_key); + if (status) + return status; break; case (direction_decrypt): - aes_expand_decryption_key(&tmp_key, c->expanded_key); + status = aes_expand_decryption_key(key, key_len, &c->expanded_key); + if (status) + return status; break; default: return err_status_bad_param; @@ -135,7 +136,7 @@ err_status_t aes_cbc_set_iv(aes_cbc_ctx_t *c, void *iv) { int i; /* v128_t *input = iv; */ - uint8_t *input = iv; + uint8_t *input = (uint8_t*) iv; /* set state and 'previous' block to iv */ for (i=0; i < 16; i++) @@ -181,7 +182,7 @@ aes_cbc_encrypt(aes_cbc_ctx_t *c, debug_print(mod_aes_cbc, "inblock: %s", v128_hex_string(&c->state)); - aes_encrypt(&c->state, c->expanded_key); + aes_encrypt(&c->state, &c->expanded_key); debug_print(mod_aes_cbc, "outblock: %s", v128_hex_string(&c->state)); @@ -236,7 +237,7 @@ aes_cbc_decrypt(aes_cbc_ctx_t *c, v128_hex_string(&state)); /* decrypt state */ - aes_decrypt(&state, c->expanded_key); + aes_decrypt(&state, &c->expanded_key); debug_print(mod_aes_cbc, "outblock: %s", v128_hex_string(&state)); @@ -332,7 +333,7 @@ char aes_cbc_description[] = "aes cipher block chaining (cbc) mode"; /* - * Test case 0 is derived from FIPS 197 Appendix A; it uses an + * Test case 0 is derived from FIPS 197 Appendix C; it uses an * all-zero IV, so that the first block encryption matches the test * case in that appendix. This property provides a check of the base * AES encryption and decryption algorithms; if CBC fails on some @@ -428,6 +429,100 @@ cipher_test_case_t aes_cbc_test_case_1 = { &aes_cbc_test_case_0 /* pointer to next testcase */ }; +/* + * Test case 2 is like test case 0, but for 256-bit keys. (FIPS 197 + * appendix C.3). + */ + + +uint8_t aes_cbc_test_case_2_key[32] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f +}; + +uint8_t aes_cbc_test_case_2_plaintext[64] = { + 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, + 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff +}; + +uint8_t aes_cbc_test_case_2_ciphertext[80] = { + 0x8e, 0xa2, 0xb7, 0xca, 0x51, 0x67, 0x45, 0xbf, + 0xea, 0xfc, 0x49, 0x90, 0x4b, 0x49, 0x60, 0x89, + 0x72, 0x72, 0x6e, 0xe7, 0x71, 0x39, 0xbf, 0x11, + 0xe5, 0x40, 0xe2, 0x7c, 0x54, 0x65, 0x1d, 0xee +}; + +uint8_t aes_cbc_test_case_2_iv[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +cipher_test_case_t aes_cbc_test_case_2 = { + 32, /* octets in key */ + aes_cbc_test_case_2_key, /* key */ + aes_cbc_test_case_2_iv, /* initialization vector */ + 16, /* octets in plaintext */ + aes_cbc_test_case_2_plaintext, /* plaintext */ + 32, /* octets in ciphertext */ + aes_cbc_test_case_2_ciphertext, /* ciphertext */ + &aes_cbc_test_case_1 /* pointer to next testcase */ +}; + + +/* + * this test case is taken directly from Appendix F.2 of NIST Special + * Publication SP 800-38A + */ + +uint8_t aes_cbc_test_case_3_key[32] = { + 0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe, + 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81, + 0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61, 0x08, 0xd7, + 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4 +}; + +uint8_t aes_cbc_test_case_3_plaintext[64] = { + 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, + 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, + 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, + 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51, + 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11, + 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef, + 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17, + 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10 +}; + +uint8_t aes_cbc_test_case_3_ciphertext[80] = { + 0xf5, 0x8c, 0x4c, 0x04, 0xd6, 0xe5, 0xf1, 0xba, + 0x77, 0x9e, 0xab, 0xfb, 0x5f, 0x7b, 0xfb, 0xd6, + 0x9c, 0xfc, 0x4e, 0x96, 0x7e, 0xdb, 0x80, 0x8d, + 0x67, 0x9f, 0x77, 0x7b, 0xc6, 0x70, 0x2c, 0x7d, + 0x39, 0xf2, 0x33, 0x69, 0xa9, 0xd9, 0xba, 0xcf, + 0xa5, 0x30, 0xe2, 0x63, 0x04, 0x23, 0x14, 0x61, + 0xb2, 0xeb, 0x05, 0xe2, 0xc3, 0x9b, 0xe9, 0xfc, + 0xda, 0x6c, 0x19, 0x07, 0x8c, 0x6a, 0x9d, 0x1b, + 0xfb, 0x98, 0x20, 0x2c, 0x45, 0xb2, 0xe4, 0xa0, + 0x63, 0xc4, 0x68, 0xba, 0x84, 0x39, 0x16, 0x5a +}; + +uint8_t aes_cbc_test_case_3_iv[16] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f +}; + +cipher_test_case_t aes_cbc_test_case_3 = { + 32, /* octets in key */ + aes_cbc_test_case_3_key, /* key */ + aes_cbc_test_case_3_iv, /* initialization vector */ + 64, /* octets in plaintext */ + aes_cbc_test_case_3_plaintext, /* plaintext */ + 80, /* octets in ciphertext */ + aes_cbc_test_case_3_ciphertext, /* ciphertext */ + &aes_cbc_test_case_2 /* pointer to next testcase */ +}; + cipher_type_t aes_cbc = { (cipher_alloc_func_t) aes_cbc_alloc, (cipher_dealloc_func_t) aes_cbc_dealloc, @@ -437,8 +532,9 @@ cipher_type_t aes_cbc = { (cipher_set_iv_func_t) aes_cbc_set_iv, (char *) aes_cbc_description, (int) 0, /* instance count */ - (cipher_test_case_t *) &aes_cbc_test_case_0, - (debug_module_t *) &mod_aes_cbc + (cipher_test_case_t *) &aes_cbc_test_case_3, + (debug_module_t *) &mod_aes_cbc, + (cipher_type_id_t) AES_CBC }; diff --git a/libs/srtp/crypto/cipher/aes_icm.c b/libs/srtp/crypto/cipher/aes_icm.c index 152e4c93b7..1f9bcbd97c 100644 --- a/libs/srtp/crypto/cipher/aes_icm.c +++ b/libs/srtp/crypto/cipher/aes_icm.c @@ -9,7 +9,7 @@ /* * - * Copyright (c) 2001-2005, Cisco Systems, Inc. + * Copyright (c) 2001-2006, Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -49,9 +49,6 @@ #include "aes_icm.h" #include "alloc.h" -#ifdef _MSC_VER -#pragma warning(disable:4100) -#endif debug_module_t mod_aes_icm = { 0, /* debugging is off by default */ @@ -98,21 +95,24 @@ aes_icm_alloc_ismacryp(cipher_t **c, int key_len, int forIsmacryp) { uint8_t *pointer; int tmp; - debug_print(mod_aes_icm, "allocating cipher with key length %d", key_len); + debug_print(mod_aes_icm, + "allocating cipher with key length %d", key_len); - /* Ismacryp, for example, uses 16 byte key + 8 byte - salt so this function is called with key_len = 24. - The check for key_len = 30 does not apply. Our usage - of aes functions with key_len = values other than 30 - has not broken anything. Don't know what would be the - effect of skipping this check for srtp in general. - */ - if (!forIsmacryp && key_len != 30) + /* + * Ismacryp, for example, uses 16 byte key + 8 byte + * salt so this function is called with key_len = 24. + * The check for key_len = 30/38/46 does not apply. Our usage + * of aes functions with key_len = values other than 30 + * has not broken anything. Don't know what would be the + * effect of skipping this check for srtp in general. + */ + if (!(forIsmacryp && key_len > 16 && key_len < 30) && + key_len != 30 && key_len != 38 && key_len != 46) return err_status_bad_param; /* allocate memory a cipher of type aes_icm */ tmp = (sizeof(aes_icm_ctx_t) + sizeof(cipher_t)); - pointer = crypto_alloc(tmp); + pointer = (uint8_t*)crypto_alloc(tmp); if (pointer == NULL) return err_status_alloc_fail; @@ -163,30 +163,38 @@ aes_icm_dealloc(cipher_t *c) { */ err_status_t -aes_icm_context_init(aes_icm_ctx_t *c, const uint8_t *key) { - v128_t tmp_key; +aes_icm_context_init(aes_icm_ctx_t *c, const uint8_t *key, int key_len) { + err_status_t status; + int base_key_len; + + if (key_len > 16 && key_len < 30) /* Ismacryp */ + base_key_len = 16; + else if (key_len == 30 || key_len == 38 || key_len == 46) + base_key_len = key_len - 14; + else + return err_status_bad_param; /* set counter and initial values to 'offset' value */ - /* FIX!!! this assumes the salt is at key + 16, and thus that the */ - /* FIX!!! cipher key length is 16! Also note this copies past the - end of the 'key' array by 2 bytes! */ - v128_copy_octet_string(&c->counter, key + 16); - v128_copy_octet_string(&c->offset, key + 16); + /* Note this copies past the end of the 'key' array by 2 bytes! */ + v128_copy_octet_string(&c->counter, key + base_key_len); + v128_copy_octet_string(&c->offset, key + base_key_len); /* force last two octets of the offset to zero (for srtp compatibility) */ c->offset.v8[14] = c->offset.v8[15] = 0; c->counter.v8[14] = c->counter.v8[15] = 0; - /* set tmp_key (for alignment) */ - v128_copy_octet_string(&tmp_key, key); - debug_print(mod_aes_icm, - "key: %s", v128_hex_string(&tmp_key)); + "key: %s", octet_string_hex_string(key, base_key_len)); debug_print(mod_aes_icm, "offset: %s", v128_hex_string(&c->offset)); /* expand key */ - aes_expand_encryption_key(&tmp_key, c->expanded_key); + status = aes_expand_encryption_key(key, base_key_len, &c->expanded_key); + if (status) { + v128_set_to_zero(&c->counter); + v128_set_to_zero(&c->offset); + return status; + } /* indicate that the keystream_buffer is empty */ c->bytes_in_buffer = 0; @@ -232,7 +240,7 @@ aes_icm_set_octet(aes_icm_ctx_t *c, /* fill keystream buffer, if needed */ if (tail_num) { v128_copy(&c->keystream_buffer, &c->counter); - aes_encrypt(&c->keystream_buffer, c->expanded_key); + aes_encrypt(&c->keystream_buffer, &c->expanded_key); c->bytes_in_buffer = sizeof(v128_t); debug_print(mod_aes_icm, "counter: %s", @@ -259,7 +267,7 @@ aes_icm_set_octet(aes_icm_ctx_t *c, err_status_t aes_icm_set_iv(aes_icm_ctx_t *c, void *iv) { - v128_t *nonce = iv; + v128_t *nonce = (v128_t *) iv; debug_print(mod_aes_icm, "setting iv: %s", v128_hex_string(nonce)); @@ -284,11 +292,11 @@ aes_icm_set_iv(aes_icm_ctx_t *c, void *iv) { * this is an internal, hopefully inlined function */ -inline void +static inline void aes_icm_advance_ismacryp(aes_icm_ctx_t *c, uint8_t forIsmacryp) { /* fill buffer with new keystream */ v128_copy(&c->keystream_buffer, &c->counter); - aes_encrypt(&c->keystream_buffer, c->expanded_key); + aes_encrypt(&c->keystream_buffer, &c->expanded_key); c->bytes_in_buffer = sizeof(v128_t); debug_print(mod_aes_icm, "counter: %s", @@ -300,7 +308,7 @@ aes_icm_advance_ismacryp(aes_icm_ctx_t *c, uint8_t forIsmacryp) { if (forIsmacryp) { uint32_t temp; - /* alex's clock counter forward */ + //alex's clock counter forward temp = ntohl(c->counter.v32[3]); c->counter.v32[3] = htonl(++temp); } else { @@ -309,7 +317,7 @@ aes_icm_advance_ismacryp(aes_icm_ctx_t *c, uint8_t forIsmacryp) { } } -inline void aes_icm_advance(aes_icm_ctx_t *c) { +static inline void aes_icm_advance(aes_icm_ctx_t *c) { aes_icm_advance_ismacryp(c, 0); } @@ -341,7 +349,7 @@ aes_icm_encrypt_ismacryp(aes_icm_ctx_t *c, debug_print(mod_aes_icm, "block index: %d", htons(c->counter.v16[7])); - if (bytes_to_encr <= c->bytes_in_buffer) { + if (bytes_to_encr <= (unsigned int)c->bytes_in_buffer) { /* deal with odd case of small bytes_to_encr */ for (i = (sizeof(v128_t) - c->bytes_in_buffer); @@ -370,7 +378,7 @@ aes_icm_encrypt_ismacryp(aes_icm_ctx_t *c, for (i=0; i < (bytes_to_encr/sizeof(v128_t)); i++) { /* fill buffer with new keystream */ - aes_icm_advance_ismacryp(c, (uint8_t)forIsmacryp); + aes_icm_advance_ismacryp(c, forIsmacryp); /* * add keystream into the data buffer (this would be a lot faster @@ -418,7 +426,7 @@ aes_icm_encrypt_ismacryp(aes_icm_ctx_t *c, if ((bytes_to_encr & 0xf) != 0) { /* fill buffer with new keystream */ - aes_icm_advance_ismacryp(c, (uint8_t)forIsmacryp); + aes_icm_advance_ismacryp(c, forIsmacryp); for (i=0; i < (bytes_to_encr & 0xf); i++) *buf++ ^= c->keystream_buffer.v8[i]; @@ -492,6 +500,46 @@ cipher_test_case_t aes_icm_test_case_0 = { NULL /* pointer to next testcase */ }; +uint8_t aes_icm_test_case_1_key[46] = { + 0x57, 0xf8, 0x2f, 0xe3, 0x61, 0x3f, 0xd1, 0x70, + 0xa8, 0x5e, 0xc9, 0x3c, 0x40, 0xb1, 0xf0, 0x92, + 0x2e, 0xc4, 0xcb, 0x0d, 0xc0, 0x25, 0xb5, 0x82, + 0x72, 0x14, 0x7c, 0xc4, 0x38, 0x94, 0x4a, 0x98, + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, + 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd +}; + +uint8_t aes_icm_test_case_1_nonce[16] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +uint8_t aes_icm_test_case_1_plaintext[32] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +uint8_t aes_icm_test_case_1_ciphertext[32] = { + 0x92, 0xbd, 0xd2, 0x8a, 0x93, 0xc3, 0xf5, 0x25, + 0x11, 0xc6, 0x77, 0xd0, 0x8b, 0x55, 0x15, 0xa4, + 0x9d, 0xa7, 0x1b, 0x23, 0x78, 0xa8, 0x54, 0xf6, + 0x70, 0x50, 0x75, 0x6d, 0xed, 0x16, 0x5b, 0xac +}; + +cipher_test_case_t aes_icm_test_case_1 = { + 46, /* octets in key */ + aes_icm_test_case_1_key, /* key */ + aes_icm_test_case_1_nonce, /* packet index */ + 32, /* octets in plaintext */ + aes_icm_test_case_1_plaintext, /* plaintext */ + 32, /* octets in ciphertext */ + aes_icm_test_case_1_ciphertext, /* ciphertext */ + &aes_icm_test_case_0 /* pointer to next testcase */ +}; + + /* * note: the encrypt function is identical to the decrypt function @@ -506,7 +554,8 @@ cipher_type_t aes_icm = { (cipher_set_iv_func_t) aes_icm_set_iv, (char *) aes_icm_description, (int) 0, /* instance count */ - (cipher_test_case_t *) &aes_icm_test_case_0, - (debug_module_t *) &mod_aes_icm + (cipher_test_case_t *) &aes_icm_test_case_1, + (debug_module_t *) &mod_aes_icm, + (cipher_type_id_t) AES_ICM }; diff --git a/libs/srtp/crypto/cipher/cipher.c b/libs/srtp/crypto/cipher/cipher.c index 761918bf5b..27da651c72 100644 --- a/libs/srtp/crypto/cipher/cipher.c +++ b/libs/srtp/crypto/cipher/cipher.c @@ -10,7 +10,7 @@ /* * - * Copyright (c) 2001-2005, Cisco Systems, Inc. + * Copyright (c) 2001-2006, Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -71,8 +71,8 @@ cipher_get_key_length(const cipher_t *c) { } /* - * cipher_type_self_test(ct) tests a cipher of type ct against test cases - * provided in an array of values of key, salt, xtd_seq_num_t, + * cipher_type_test(ct, test_data) tests a cipher of type ct against + * test cases provided in a list test_data of values of key, salt, iv, * plaintext, and ciphertext that is known to be good */ @@ -81,8 +81,8 @@ cipher_get_key_length(const cipher_t *c) { #define MAX_KEY_LEN 64 err_status_t -cipher_type_self_test(const cipher_type_t *ct) { - const cipher_test_case_t *test_case = ct->test_data; +cipher_type_test(const cipher_type_t *ct, const cipher_test_case_t *test_data) { + const cipher_test_case_t *test_case = test_data; cipher_t *c; err_status_t status; uint8_t buffer[SELF_TEST_BUF_OCTETS]; @@ -155,7 +155,7 @@ cipher_type_self_test(const cipher_type_t *ct) { test_case->ciphertext_length_octets)); /* compare the resulting ciphertext with that in the test case */ - if ((int)len != test_case->ciphertext_length_octets) + if (len != test_case->ciphertext_length_octets) return err_status_algo_fail; status = err_status_ok; for (i=0; i < test_case->ciphertext_length_octets; i++) @@ -222,7 +222,7 @@ cipher_type_self_test(const cipher_type_t *ct) { test_case->plaintext_length_octets)); /* compare the resulting plaintext with that in the test case */ - if ((int)len != test_case->plaintext_length_octets) + if (len != test_case->plaintext_length_octets) return err_status_algo_fail; status = err_status_ok; for (i=0; i < test_case->plaintext_length_octets; i++) @@ -260,7 +260,7 @@ cipher_type_self_test(const cipher_type_t *ct) { /* now run some random invertibility tests */ /* allocate cipher, using paramaters from the first test case */ - test_case = ct->test_data; + test_case = test_data; status = cipher_type_alloc(ct, &c, test_case->key_length_octets); if (status) return status; @@ -344,7 +344,7 @@ cipher_type_self_test(const cipher_type_t *ct) { octet_string_hex_string(buffer, length)); /* compare the resulting plaintext with the original one */ - if ((int)length != plaintext_len) + if (length != plaintext_len) return err_status_algo_fail; status = err_status_ok; for (i=0; i < plaintext_len; i++) @@ -360,10 +360,24 @@ cipher_type_self_test(const cipher_type_t *ct) { } + status = cipher_dealloc(c); + if (status) + return status; + return err_status_ok; } +/* + * cipher_type_self_test(ct) performs cipher_type_test on ct's internal + * list of test data. + */ + +err_status_t +cipher_type_self_test(const cipher_type_t *ct) { + return cipher_type_test(ct, ct->test_data); +} + /* * cipher_bits_per_second(c, l, t) computes (an estimate of) the * number of bits that a cipher implementation can encrypt in a second @@ -383,7 +397,7 @@ cipher_bits_per_second(cipher_t *c, int octets_in_buffer, int num_trials) { unsigned char *enc_buf; unsigned int len = octets_in_buffer; - enc_buf = crypto_alloc(octets_in_buffer); + enc_buf = (unsigned char*) crypto_alloc(octets_in_buffer); if (enc_buf == NULL) return 0; /* indicate bad parameters by returning null */ diff --git a/libs/srtp/crypto/cipher/null_cipher.c b/libs/srtp/crypto/cipher/null_cipher.c index 988f6a56af..724f4df3a8 100644 --- a/libs/srtp/crypto/cipher/null_cipher.c +++ b/libs/srtp/crypto/cipher/null_cipher.c @@ -10,7 +10,7 @@ /* * - * Copyright (c) 2001-2005, Cisco Systems, Inc. + * Copyright (c) 2001-2006, Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -48,10 +48,6 @@ #include "null_cipher.h" #include "alloc.h" -#ifdef _MSC_VER -#pragma warning(disable:4100) -#endif - /* the null_cipher uses the cipher debug module */ extern debug_module_t mod_cipher; @@ -65,7 +61,7 @@ null_cipher_alloc(cipher_t **c, int key_len) { "allocating cipher with key length %d", key_len); /* allocate memory a cipher of type null_cipher */ - pointer = crypto_alloc(sizeof(null_cipher_ctx_t) + sizeof(cipher_t)); + pointer = (uint8_t*)crypto_alloc(sizeof(null_cipher_ctx_t) + sizeof(cipher_t)); if (pointer == NULL) return err_status_alloc_fail; @@ -103,7 +99,7 @@ null_cipher_dealloc(cipher_t *c) { } err_status_t -null_cipher_init(null_cipher_ctx_t *ctx, const uint8_t *key) { +null_cipher_init(null_cipher_ctx_t *ctx, const uint8_t *key, int key_len) { debug_print(mod_cipher, "initializing null cipher", NULL); @@ -151,6 +147,7 @@ cipher_type_t null_cipher = { (char *) null_cipher_description, (int) 0, (cipher_test_case_t *) &null_cipher_test_0, - (debug_module_t *) NULL + (debug_module_t *) NULL, + (cipher_type_id_t) NULL_CIPHER }; diff --git a/libs/srtp/crypto/hash/auth.c b/libs/srtp/crypto/hash/auth.c index 2773c16cc3..aaf0269c71 100644 --- a/libs/srtp/crypto/hash/auth.c +++ b/libs/srtp/crypto/hash/auth.c @@ -9,7 +9,7 @@ /* * - * Copyright (c) 2001-2005, Cisco Systems, Inc. + * Copyright (c) 2001-2006, Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -74,8 +74,8 @@ auth_type_get_ref_count(const auth_type_t *at) { } /* - * auth_type_self_test() tests an auth function of type ct against - * test cases provided in an array of values of key, data, and tag + * auth_type_test() tests an auth function of type ct against + * test cases provided in a list test_data of values of key, data, and tag * that is known to be good */ @@ -83,8 +83,8 @@ auth_type_get_ref_count(const auth_type_t *at) { #define SELF_TEST_TAG_BUF_OCTETS 32 err_status_t -auth_type_self_test(const auth_type_t *at) { - auth_test_case_t *test_case = at->test_data; +auth_type_test(const auth_type_t *at, const auth_test_case_t *test_data) { + const auth_test_case_t *test_case = test_data; auth_t *a; err_status_t status; uint8_t tag[SELF_TEST_TAG_BUF_OCTETS]; @@ -171,3 +171,13 @@ auth_type_self_test(const auth_type_t *at) { } +/* + * auth_type_self_test(at) performs auth_type_test on at's internal + * list of test data. + */ + +err_status_t +auth_type_self_test(const auth_type_t *at) { + return auth_type_test(at, at->test_data); +} + diff --git a/libs/srtp/crypto/hash/hmac.c b/libs/srtp/crypto/hash/hmac.c index a786523c50..4f389fe18e 100644 --- a/libs/srtp/crypto/hash/hmac.c +++ b/libs/srtp/crypto/hash/hmac.c @@ -8,7 +8,7 @@ */ /* * - * Copyright(c) 2001-2005 Cisco Systems, Inc. + * Copyright(c) 2001-2006 Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -57,7 +57,6 @@ err_status_t hmac_alloc(auth_t **a, int key_len, int out_len) { extern auth_type_t hmac; uint8_t *pointer; - hmac_ctx_t *new_hmac_ctx; debug_print(mod_hmac, "allocating auth func with key length %d", key_len); debug_print(mod_hmac, " tag length %d", out_len); @@ -74,7 +73,7 @@ hmac_alloc(auth_t **a, int key_len, int out_len) { return err_status_bad_param; /* allocate memory for auth and hmac_ctx_t structures */ - pointer = crypto_alloc(sizeof(hmac_ctx_t) + sizeof(auth_t)); + pointer = (uint8_t*)crypto_alloc(sizeof(hmac_ctx_t) + sizeof(auth_t)); if (pointer == NULL) return err_status_alloc_fail; @@ -85,7 +84,6 @@ hmac_alloc(auth_t **a, int key_len, int out_len) { (*a)->out_len = out_len; (*a)->key_len = key_len; (*a)->prefix_len = 0; - new_hmac_ctx = (hmac_ctx_t *)((*a)->state); /* increment global count of all hmac uses */ hmac.ref_count++; @@ -180,7 +178,7 @@ hmac_compute(hmac_ctx_t *state, const void *message, return err_status_bad_param; /* hash message, copy output into H */ - hmac_update(state, message, msg_octets); + hmac_update(state, (const uint8_t*)message, msg_octets); sha1_final(&state->ctx, H); /* @@ -264,6 +262,7 @@ hmac = { (char *) hmac_description, (int) 0, /* instance count */ (auth_test_case_t *) &hmac_test_case_0, - (debug_module_t *) &mod_hmac + (debug_module_t *) &mod_hmac, + (auth_type_id_t) HMAC_SHA1 }; diff --git a/libs/srtp/crypto/hash/null_auth.c b/libs/srtp/crypto/hash/null_auth.c index 1d8c556310..103444bc53 100644 --- a/libs/srtp/crypto/hash/null_auth.c +++ b/libs/srtp/crypto/hash/null_auth.c @@ -10,7 +10,7 @@ /* * - * Copyright (c) 2001-2005, Cisco Systems, Inc. + * Copyright (c) 2001-2006, Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -48,10 +48,6 @@ #include "null_auth.h" #include "alloc.h" -#ifdef _MSC_VER -#pragma warning(disable:4100) -#endif - /* null_auth uses the auth debug module */ extern debug_module_t mod_auth; @@ -65,7 +61,7 @@ null_auth_alloc(auth_t **a, int key_len, int out_len) { debug_print(mod_auth, " tag length %d", out_len); /* allocate memory for auth and null_auth_ctx_t structures */ - pointer = crypto_alloc(sizeof(null_auth_ctx_t) + sizeof(auth_t)); + pointer = (uint8_t*)crypto_alloc(sizeof(null_auth_ctx_t) + sizeof(auth_t)); if (pointer == NULL) return err_status_alloc_fail; @@ -159,6 +155,8 @@ null_auth = { (auth_start_func) null_auth_start, (char *) null_auth_description, (int) 0, /* instance count */ - (auth_test_case_t *) &null_auth_test_case_0 + (auth_test_case_t *) &null_auth_test_case_0, + (debug_module_t *) NULL, + (auth_type_id_t) NULL_AUTH }; diff --git a/libs/srtp/crypto/hash/sha1.c b/libs/srtp/crypto/hash/sha1.c index d4eba3cc26..b9a8d10509 100644 --- a/libs/srtp/crypto/hash/sha1.c +++ b/libs/srtp/crypto/hash/sha1.c @@ -10,7 +10,7 @@ /* * - * Copyright (c) 2001-2005, Cisco Systems, Inc. + * Copyright (c) 2001-2006, Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -114,7 +114,7 @@ sha1_core(const uint32_t M[16], uint32_t hash_value[5]) { H4 = hash_value[4]; /* copy/xor message into array */ - + W[0] = be32_to_cpu(M[0]); W[1] = be32_to_cpu(M[1]); W[2] = be32_to_cpu(M[2]); @@ -184,7 +184,7 @@ sha1_core(const uint32_t M[16], uint32_t hash_value[5]) { void sha1_init(sha1_ctx_t *ctx) { - + /* initialize state vector */ ctx->H[0] = 0x67452301; ctx->H[1] = 0xefcdab89; @@ -210,7 +210,7 @@ sha1_update(sha1_ctx_t *ctx, const uint8_t *msg, int octets_in_msg) { /* loop over 16-word blocks of M */ while (octets_in_msg > 0) { - + if (octets_in_msg + ctx->octets_in_buffer >= 64) { /* @@ -260,7 +260,7 @@ sha1_final(sha1_ctx_t *ctx, uint32_t *output) { */ { int tail = ctx->octets_in_buffer % 4; - + /* copy/xor message into array */ for (i=0; i < (ctx->octets_in_buffer+3)/4; i++) W[i] = be32_to_cpu(ctx->M[i]); @@ -283,7 +283,7 @@ sha1_final(sha1_ctx_t *ctx, uint32_t *output) { W[i] = 0x80000000; break; } - + /* zeroize remaining words */ for (i++ ; i < 15; i++) W[i] = 0x0; @@ -299,7 +299,8 @@ sha1_final(sha1_ctx_t *ctx, uint32_t *output) { else if (ctx->octets_in_buffer < 60) W[15] = 0x0; - /* process the word array */ for (t=16; t < 80; t++) { + /* process the word array */ + for (t=16; t < 80; t++) { TEMP = W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]; W[t] = S1(TEMP); } diff --git a/libs/srtp/crypto/include/.cvsignore b/libs/srtp/crypto/include/.cvsignore new file mode 100644 index 0000000000..0e56cf2f8c --- /dev/null +++ b/libs/srtp/crypto/include/.cvsignore @@ -0,0 +1 @@ +config.h diff --git a/libs/srtp/crypto/include/aes.h b/libs/srtp/crypto/include/aes.h index e59fdadb77..288133743f 100644 --- a/libs/srtp/crypto/include/aes.h +++ b/libs/srtp/crypto/include/aes.h @@ -9,7 +9,7 @@ /* * - * Copyright (c) 2001-2005, Cisco Systems, Inc. + * Copyright (c) 2001-2006, Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -50,24 +50,30 @@ #include "datatypes.h" #include "gf2_8.h" +#include "err.h" /* aes internals */ -typedef v128_t aes_expanded_key_t[11]; +typedef struct { + v128_t round[15]; + int num_rounds; +} aes_expanded_key_t; + +err_status_t +aes_expand_encryption_key(const uint8_t *key, + int key_len, + aes_expanded_key_t *expanded_key); + +err_status_t +aes_expand_decryption_key(const uint8_t *key, + int key_len, + aes_expanded_key_t *expanded_key); void -aes_expand_encryption_key(const v128_t *key, - aes_expanded_key_t expanded_key); +aes_encrypt(v128_t *plaintext, const aes_expanded_key_t *exp_key); void -aes_expand_decryption_key(const v128_t *key, - aes_expanded_key_t expanded_key); - -void -aes_encrypt(v128_t *plaintext, const aes_expanded_key_t exp_key); - -void -aes_decrypt(v128_t *plaintext, const aes_expanded_key_t exp_key); +aes_decrypt(v128_t *plaintext, const aes_expanded_key_t *exp_key); #if 0 /* diff --git a/libs/srtp/crypto/include/aes_cbc.h b/libs/srtp/crypto/include/aes_cbc.h index 9fb6682bd0..bc4e41a4c1 100644 --- a/libs/srtp/crypto/include/aes_cbc.h +++ b/libs/srtp/crypto/include/aes_cbc.h @@ -31,7 +31,7 @@ aes_cbc_encrypt(aes_cbc_ctx_t *c, err_status_t aes_cbc_context_init(aes_cbc_ctx_t *c, const uint8_t *key, - cipher_direction_t dir); + int key_len, cipher_direction_t dir); err_status_t aes_cbc_set_iv(aes_cbc_ctx_t *c, void *iv); diff --git a/libs/srtp/crypto/include/aes_icm.h b/libs/srtp/crypto/include/aes_icm.h index 67f2359315..dac0cdccc6 100644 --- a/libs/srtp/crypto/include/aes_icm.h +++ b/libs/srtp/crypto/include/aes_icm.h @@ -19,13 +19,14 @@ typedef struct { v128_t offset; /* initial offset value */ v128_t keystream_buffer; /* buffers bytes of keystream */ aes_expanded_key_t expanded_key; /* the cipher key */ - unsigned int bytes_in_buffer; /* number of unused bytes in buffer */ + int bytes_in_buffer; /* number of unused bytes in buffer */ } aes_icm_ctx_t; err_status_t aes_icm_context_init(aes_icm_ctx_t *c, - const unsigned char *key); + const unsigned char *key, + int key_len); err_status_t aes_icm_set_iv(aes_icm_ctx_t *c, void *iv); diff --git a/libs/srtp/crypto/include/alloc.h b/libs/srtp/crypto/include/alloc.h index 5eb508c719..5980eed6c1 100644 --- a/libs/srtp/crypto/include/alloc.h +++ b/libs/srtp/crypto/include/alloc.h @@ -8,7 +8,7 @@ */ /* * - * Copyright (c) 2001-2005 Cisco Systems, Inc. + * Copyright (c) 2001-2006 Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/libs/srtp/crypto/include/auth.h b/libs/srtp/crypto/include/auth.h index 6e32480daa..5b5e4b21d4 100644 --- a/libs/srtp/crypto/include/auth.h +++ b/libs/srtp/crypto/include/auth.h @@ -9,7 +9,7 @@ /* * - * Copyright (c) 2001-2005, Cisco Systems, Inc. + * Copyright (c) 2001-2006, Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -48,6 +48,8 @@ #include "datatypes.h" #include "err.h" /* error codes */ +#include "crypto.h" /* for auth_type_id_t */ +#include "crypto_types.h" /* for values of auth_type_id_t */ typedef struct auth_type_t *auth_type_pointer; typedef struct auth_t *auth_pointer_t; @@ -129,6 +131,7 @@ typedef struct auth_type_t { int ref_count; auth_test_case_t *test_data; debug_module_t *debug; + auth_type_id_t id; } auth_type_t; typedef struct auth_t { @@ -148,6 +151,15 @@ typedef struct auth_t { err_status_t auth_type_self_test(const auth_type_t *at); +/* + * auth_type_test() tests an auth_type against external test cases + * provided in an array of values of key/message/tag that is known to + * be good + */ + +err_status_t +auth_type_test(const auth_type_t *at, const auth_test_case_t *test_data); + /* * auth_type_get_ref_count(at) returns the reference count (the number * of instantiations) of the auth_type_t at diff --git a/libs/srtp/crypto/include/cipher.h b/libs/srtp/crypto/include/cipher.h index 5c37c38413..eff6dd154b 100644 --- a/libs/srtp/crypto/include/cipher.h +++ b/libs/srtp/crypto/include/cipher.h @@ -8,7 +8,7 @@ */ /* * - * Copyright (c) 2001-2005, Cisco Systems, Inc. + * Copyright (c) 2001-2006, Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -49,6 +49,8 @@ #include "datatypes.h" #include "rdbx.h" /* for xtd_seq_num_t */ #include "err.h" /* for error codes */ +#include "crypto.h" /* for cipher_type_id_t */ +#include "crypto_types.h" /* for values of cipher_type_id_t */ /** @@ -86,7 +88,7 @@ typedef err_status_t (*cipher_alloc_func_t) */ typedef err_status_t (*cipher_init_func_t) - (void *state, const uint8_t *key, cipher_direction_t dir); +(void *state, const uint8_t *key, int key_len, cipher_direction_t dir); /* a cipher_dealloc_func_t de-allocates a cipher_t */ @@ -108,8 +110,7 @@ typedef err_status_t (*cipher_decrypt_func_t) (void *state, uint8_t *buffer, unsigned int *octets_to_decrypt); /* - * a cipher_set_nonce_seq_func_t function sets both the nonce - * and the extended sequence number + * a cipher_set_iv_func_t function sets the current initialization vector */ typedef err_status_t (*cipher_set_iv_func_t) @@ -147,6 +148,7 @@ typedef struct cipher_type_t { int ref_count; cipher_test_case_t *test_data; debug_module_t *debug; + cipher_type_id_t id; } cipher_type_t; /* @@ -169,7 +171,7 @@ typedef struct cipher_t { #define cipher_dealloc(c) (((c)->type)->dealloc(c)) -#define cipher_init(c, k, dir) (((c)->type)->init(((c)->state), (k), (dir))) +#define cipher_init(c, k, dir) (((c)->type)->init(((c)->state), (k), ((c)->key_len), (dir))) #define cipher_encrypt(c, buf, len) \ (((c)->type)->encrypt(((c)->state), (buf), (len))) @@ -178,7 +180,7 @@ typedef struct cipher_t { (((c)->type)->decrypt(((c)->state), (buf), (len))) #define cipher_set_iv(c, n) \ - ((c) ? (((c)->type)->set_iv(((c)->state), (n))) : \ + ((c) ? (((c)->type)->set_iv(((cipher_pointer_t)(c)->state), (n))) : \ err_status_no_such_op) err_status_t @@ -201,6 +203,16 @@ err_status_t cipher_type_self_test(const cipher_type_t *ct); +/* + * cipher_type_test() tests a cipher against external test cases provided in + * an array of values of key/xtd_seq_num_t/plaintext/ciphertext + * that is known to be good + */ + +err_status_t +cipher_type_test(const cipher_type_t *ct, const cipher_test_case_t *test_data); + + /* * cipher_bits_per_second(c, l, t) computes (and estimate of) the * number of bits that a cipher implementation can encrypt in a second diff --git a/libs/srtp/crypto/include/crypto.h b/libs/srtp/crypto/include/crypto.h index dc52821e43..0e9667da57 100644 --- a/libs/srtp/crypto/include/crypto.h +++ b/libs/srtp/crypto/include/crypto.h @@ -10,7 +10,33 @@ #ifndef CRYPTO_H #define CRYPTO_H -#include "crypto_kernel.h" +/** + * @brief A cipher_type_id_t is an identifier for a particular cipher + * type. + * + * A cipher_type_id_t is an integer that represents a particular + * cipher type, e.g. the Advanced Encryption Standard (AES). A + * NULL_CIPHER is avaliable; this cipher leaves the data unchanged, + * and can be selected to indicate that no encryption is to take + * place. + * + * @ingroup Ciphers + */ +typedef uint32_t cipher_type_id_t; + +/** + * @brief An auth_type_id_t is an identifier for a particular authentication + * function. + * + * An auth_type_id_t is an integer that represents a particular + * authentication function type, e.g. HMAC-SHA1. A NULL_AUTH is + * avaliable; this authentication function performs no computation, + * and can be selected to indicate that no authentication is to take + * place. + * + * @ingroup Authentication + */ +typedef uint32_t auth_type_id_t; #endif /* CRYPTO_H */ diff --git a/libs/srtp/crypto/include/crypto_kernel.h b/libs/srtp/crypto/include/crypto_kernel.h index 029f1c885a..1acf4978d0 100644 --- a/libs/srtp/crypto/include/crypto_kernel.h +++ b/libs/srtp/crypto/include/crypto_kernel.h @@ -8,7 +8,7 @@ */ /* * - * Copyright(c) 2001-2005 Cisco Systems, Inc. + * Copyright(c) 2001-2006 Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -55,7 +55,7 @@ #include "err.h" #include "crypto_types.h" #include "key.h" - +#include "crypto.h" /* * crypto_kernel_state_t defines the possible states: @@ -69,36 +69,6 @@ typedef enum { crypto_kernel_state_secure } crypto_kernel_state_t; - -/** - * @brief A cipher_type_id_t is an identifier for a particular cipher - * type. - * - * A cipher_type_id_t is an integer that represents a particular - * cipher type, e.g. the Advanced Encryption Standard (AES). A - * NULL_CIPHER is avaliable; this cipher leaves the data unchanged, - * and can be selected to indicate that no encryption is to take - * place. - * - * @ingroup Ciphers - */ -typedef uint32_t cipher_type_id_t; - -/** - * @brief An auth_type_id_t is an identifier for a particular authentication - * function. - * - * An auth_type_id_t is an integer that represents a particular - * authentication function type, e.g. HMAC-SHA1. A NULL_AUTH is - * avaliable; this authentication function performs no computation, - * and can be selected to indicate that no authentication is to take - * place. - * - * @ingroup Authentication - */ -typedef uint32_t auth_type_id_t; - - /* * linked list of cipher types */ @@ -212,6 +182,28 @@ crypto_kernel_load_cipher_type(cipher_type_t *ct, cipher_type_id_t id); err_status_t crypto_kernel_load_auth_type(auth_type_t *ct, auth_type_id_t id); +/* + * crypto_kernel_replace_cipher_type(ct, id) + * + * replaces the crypto kernel's existing cipher for the cipher_type id + * with a new one passed in externally. The new cipher must pass all the + * existing cipher_type's self tests as well as its own. + */ +err_status_t +crypto_kernel_replace_cipher_type(cipher_type_t *ct, cipher_type_id_t id); + + +/* + * crypto_kernel_replace_auth_type(ct, id) + * + * replaces the crypto kernel's existing cipher for the auth_type id + * with a new one passed in externally. The new auth type must pass all the + * existing auth_type's self tests as well as its own. + */ +err_status_t +crypto_kernel_replace_auth_type(auth_type_t *ct, auth_type_id_t id); + + err_status_t crypto_kernel_load_debug_module(debug_module_t *new_dm); diff --git a/libs/srtp/crypto/include/crypto_math.h b/libs/srtp/crypto/include/crypto_math.h index be6558f638..52f083721d 100644 --- a/libs/srtp/crypto/include/crypto_math.h +++ b/libs/srtp/crypto/include/crypto_math.h @@ -8,7 +8,7 @@ */ /* * - * Copyright (c) 2001-2005 Cisco Systems, Inc. + * Copyright (c) 2001-2006 Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -233,40 +233,6 @@ void octet_string_set_to_zero(uint8_t *s, int len); -/* - * functions manipulating bit_vector_t - * - * A bitvector_t consists of an array of words and an integer - * representing the number of significant bits stored in the array. - * The bits are packed as follows: the least significant bit is that - * of word[0], while the most significant bit is the nth most - * significant bit of word[m], where length = bits_per_word * m + n. - * - */ - -#define bits_per_word 32 -#define bytes_per_word 4 - -typedef struct { - uint32_t length; - uint32_t *word; -} bitvector_t; - -int -bitvector_alloc(bitvector_t *v, unsigned long length); - -void -bitvector_set_bit(bitvector_t *v, int bit_index); - -int -bitvector_get_bit(const bitvector_t *v, int bit_index); - -int -bitvector_print_hex(const bitvector_t *v, FILE *stream); - -int -bitvector_set_from_hex(bitvector_t *v, char *string); - #endif /* MATH_H */ diff --git a/libs/srtp/crypto/include/crypto_types.h b/libs/srtp/crypto/include/crypto_types.h index e20c7715b0..35317108c3 100644 --- a/libs/srtp/crypto/include/crypto_types.h +++ b/libs/srtp/crypto/include/crypto_types.h @@ -8,7 +8,7 @@ */ /* * - * Copyright(c) 2001-2005 Cisco Systems, Inc. + * Copyright(c) 2001-2006 Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -97,12 +97,19 @@ #define NULL_CIPHER 0 /** - * @brief AES-128 Integer Counter Mode (AES ICM) + * @brief AES Integer Counter Mode (AES ICM) * - * AES-128 ICM is the variant of counter mode that is used by Secure RTP. - * This cipher uses a 16-octet key and a 30-octet offset (or salt) value. + * AES ICM is the variant of counter mode that is used by Secure RTP. + * This cipher uses a 16-, 24-, or 32-octet key concatenated with a + * 14-octet offset (or salt) value. */ -#define AES_128_ICM 1 +#define AES_ICM 1 + +/** + * @brief AES-128 Integer Counter Mode (AES ICM) + * AES-128 ICM is a deprecated alternate name for AES ICM. + */ +#define AES_128_ICM AES_ICM /** * @brief SEAL 3.0 @@ -113,19 +120,26 @@ #define SEAL 2 /** - * @brief AES-128 Integer Counter Mode (AES ICM) + * @brief AES Cipher Block Chaining mode (AES CBC) * - * AES-128 ICM is the variant of counter mode that is used by Secure RTP. - * This cipher uses a 16-octet key and a 30-octet offset (or salt) value. + * AES CBC is the AES Cipher Block Chaining mode. + * This cipher uses a 16-, 24-, or 32-octet key. */ -#define AES_128_CBC 3 +#define AES_CBC 3 + +/** + * @brief AES-128 Cipher Block Chaining mode (AES CBC) + * + * AES-128 CBC is a deprecated alternate name for AES CBC. + */ +#define AES_128_CBC AES_CBC /** * @brief Strongest available cipher. * * This identifier resolves to the strongest cipher type available. */ -#define STRONGHOLD_CIPHER AES_128_ICM +#define STRONGHOLD_CIPHER AES_ICM /** * @} diff --git a/libs/srtp/crypto/include/cryptoalg.h b/libs/srtp/crypto/include/cryptoalg.h index 9024a71117..d9f0441e0e 100644 --- a/libs/srtp/crypto/include/cryptoalg.h +++ b/libs/srtp/crypto/include/cryptoalg.h @@ -8,7 +8,7 @@ */ /* * - * Copyright (c) 2001-2005 Cisco Systems, Inc. + * Copyright (c) 2001-2006 Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/libs/srtp/crypto/include/datatypes.h b/libs/srtp/crypto/include/datatypes.h index 17b531beb6..e16d895bb5 100644 --- a/libs/srtp/crypto/include/datatypes.h +++ b/libs/srtp/crypto/include/datatypes.h @@ -9,7 +9,7 @@ /* * - * Copyright (c) 2001-2005, Cisco Systems, Inc. + * Copyright (c) 2001-2006, Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -63,6 +63,7 @@ # endif #endif + /* if DATATYPES_USE_MACROS is defined, then little functions are macros */ #define DATATYPES_USE_MACROS @@ -154,10 +155,10 @@ void v128_copy_octet_string(v128_t *x, const uint8_t s[16]); void -v128_left_shift(v128_t *x, int index); +v128_left_shift(v128_t *x, int shift_index); void -v128_right_shift(v128_t *x, int index); +v128_right_shift(v128_t *x, int shift_index); /* * the following macros define the data manipulation functions @@ -313,7 +314,7 @@ v128_right_shift(v128_t *x, int index); #ifdef DATATYPES_USE_MACROS /* little functions are really macros */ - + #define v128_set_to_zero(z) _v128_set_to_zero(z) #define v128_copy(z, x) _v128_copy(z, x) #define v128_xor(z, x, y) _v128_xor(z, x, y) @@ -392,22 +393,114 @@ octet_string_set_to_zero(uint8_t *s, int len); # define be64_to_cpu(x) bswap_64((x)) #else +#if defined(__GNUC__) && defined(HAVE_X86) +/* Fall back. */ +static inline uint32_t be32_to_cpu(uint32_t v) { + /* optimized for x86. */ + asm("bswap %0" : "=r" (v) : "0" (v)); + return v; +} +# else /* HAVE_X86 */ # ifdef HAVE_NETINET_IN_H # include # elif defined HAVE_WINSOCK2_H # include # endif # define be32_to_cpu(x) ntohl((x)) +# endif /* HAVE_X86 */ +static inline uint64_t be64_to_cpu(uint64_t v) { # ifdef NO_64BIT_MATH /* use the make64 functions to do 64-bit math */ -# define be64_to_cpu(v) (make64(htonl(low32(v)),htonl(high32(v)))) + v = make64(htonl(low32(v)),htonl(high32(v))); # else -# define be64_to_cpu(v) ((ntohl((uint32_t)(v >> 32))) | (((uint64_t)ntohl((uint32_t)v)) << 32)) + /* use the native 64-bit math */ + v= (uint64_t)((be32_to_cpu((uint32_t)(v >> 32))) | (((uint64_t)be32_to_cpu((uint32_t)v)) << 32)); # endif + return v; +} #endif /* ! SRTP_KERNEL_LINUX */ #endif /* WORDS_BIGENDIAN */ +/* + * functions manipulating bitvector_t + * + * A bitvector_t consists of an array of words and an integer + * representing the number of significant bits stored in the array. + * The bits are packed as follows: the least significant bit is that + * of word[0], while the most significant bit is the nth most + * significant bit of word[m], where length = bits_per_word * m + n. + * + */ + +#define bits_per_word 32 +#define bytes_per_word 4 + +typedef struct { + uint32_t length; + uint32_t *word; +} bitvector_t; + + +#define _bitvector_get_bit(v, bit_index) \ +( \ + ((((v)->word[((bit_index) >> 5)]) >> ((bit_index) & 31)) & 1) \ +) + + +#define _bitvector_set_bit(v, bit_index) \ +( \ + (((v)->word[((bit_index) >> 5)] |= ((uint32_t)1 << ((bit_index) & 31)))) \ +) + +#define _bitvector_clear_bit(v, bit_index) \ +( \ + (((v)->word[((bit_index) >> 5)] &= ~((uint32_t)1 << ((bit_index) & 31)))) \ +) + +#define _bitvector_get_length(v) \ +( \ + ((v)->length) \ +) + +#ifdef DATATYPES_USE_MACROS /* little functions are really macros */ + +#define bitvector_get_bit(v, bit_index) _bitvector_get_bit(v, bit_index) +#define bitvector_set_bit(v, bit_index) _bitvector_set_bit(v, bit_index) +#define bitvector_clear_bit(v, bit_index) _bitvector_clear_bit(v, bit_index) +#define bitvector_get_length(v) _bitvector_get_length(v) + +#else + +int +bitvector_get_bit(const bitvector_t *v, int bit_index); + +void +bitvector_set_bit(bitvector_t *v, int bit_index); + +void +bitvector_clear_bit(bitvector_t *v, int bit_index); + +unsigned long +bitvector_get_length(const bitvector_t *v); + +#endif + +int +bitvector_alloc(bitvector_t *v, unsigned long length); + +void +bitvector_dealloc(bitvector_t *v); + +void +bitvector_set_to_zero(bitvector_t *x); + +void +bitvector_left_shift(bitvector_t *x, int index); + +char * +bitvector_bit_string(bitvector_t *x, char* buf, int len); + #endif /* _DATATYPES_H */ diff --git a/libs/srtp/crypto/include/err.h b/libs/srtp/crypto/include/err.h index 37d3cb93e8..1a6e170182 100644 --- a/libs/srtp/crypto/include/err.h +++ b/libs/srtp/crypto/include/err.h @@ -8,7 +8,7 @@ */ /* * - * Copyright (c) 2001-2005, Cisco Systems, Inc. + * Copyright (c) 2001-2006, Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -90,7 +90,7 @@ typedef enum { err_status_parse_err = 21, /**< error pasring data */ err_status_encode_err = 22, /**< error encoding data */ err_status_semaphore_err = 23,/**< error while using semaphores */ - err_status_pfkey_err = 24 ,/**< error while using pfkey */ + err_status_pfkey_err = 24 /**< error while using pfkey */ } err_status_t; /** diff --git a/libs/srtp/crypto/include/gf2_8.h b/libs/srtp/crypto/include/gf2_8.h index ea40a4412b..098d37c9e2 100644 --- a/libs/srtp/crypto/include/gf2_8.h +++ b/libs/srtp/crypto/include/gf2_8.h @@ -9,7 +9,7 @@ /* * - * Copyright (c) 2001-2005, Cisco Systems, Inc. + * Copyright (c) 2001-2006, Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/libs/srtp/crypto/include/hmac.h b/libs/srtp/crypto/include/hmac.h index 6abfdf8d51..262c0e2d6e 100644 --- a/libs/srtp/crypto/include/hmac.h +++ b/libs/srtp/crypto/include/hmac.h @@ -9,7 +9,7 @@ */ /* * - * Copyright (c) 2001-2005, Cisco Systems, Inc. + * Copyright (c) 2001-2006, Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/libs/srtp/crypto/include/integers.h b/libs/srtp/crypto/include/integers.h index 8b55720a91..7010efdde3 100644 --- a/libs/srtp/crypto/include/integers.h +++ b/libs/srtp/crypto/include/integers.h @@ -9,7 +9,7 @@ /* * - * Copyright (c) 2001-2005, Cisco Systems, Inc. + * Copyright (c) 2001-2006, Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -113,7 +113,7 @@ extern uint32_t low32(uint64_t value); addresses. This is required for processors that do not allow unaligned loads. */ #ifdef ALIGNMENT_32BIT_REQUIRED -// Note that if it's in a variable, you can memcpy it +/* Note that if it's in a variable, you can memcpy it */ #ifdef WORDS_BIGENDIAN #define PUT_32(addr,value) \ { \ diff --git a/libs/srtp/crypto/include/key.h b/libs/srtp/crypto/include/key.h index 6e89697a0d..e7e07448e7 100644 --- a/libs/srtp/crypto/include/key.h +++ b/libs/srtp/crypto/include/key.h @@ -8,7 +8,7 @@ */ /* * - * Copyright (c) 2001-2005 Cisco Systems, Inc. + * Copyright (c) 2001-2006 Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/libs/srtp/crypto/include/null_auth.h b/libs/srtp/crypto/include/null_auth.h index cebb86b1a5..44f9a4a2ba 100644 --- a/libs/srtp/crypto/include/null_auth.h +++ b/libs/srtp/crypto/include/null_auth.h @@ -8,7 +8,7 @@ /* * - * Copyright (c) 2001-2005, Cisco Systems, Inc. + * Copyright (c) 2001-2006, Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/libs/srtp/crypto/include/null_cipher.h b/libs/srtp/crypto/include/null_cipher.h index 7f348be5ff..39da59a812 100644 --- a/libs/srtp/crypto/include/null_cipher.h +++ b/libs/srtp/crypto/include/null_cipher.h @@ -10,7 +10,7 @@ /* * - * Copyright (c) 2001-2005, Cisco Systems, Inc. + * Copyright (c) 2001-2006, Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -62,11 +62,11 @@ typedef struct { */ err_status_t -null_cipher_init(null_cipher_ctx_t *c, const uint8_t *key); +null_cipher_init(null_cipher_ctx_t *c, const uint8_t *key, int key_len); err_status_t null_cipher_set_segment(null_cipher_ctx_t *c, - unsigned long index); + unsigned long segment_index); err_status_t null_cipher_encrypt(null_cipher_ctx_t *c, diff --git a/libs/srtp/crypto/include/rand_source.h b/libs/srtp/crypto/include/rand_source.h index 19a3f94b1b..b4c21103ac 100644 --- a/libs/srtp/crypto/include/rand_source.h +++ b/libs/srtp/crypto/include/rand_source.h @@ -8,7 +8,7 @@ */ /* * - * Copyright(c) 2001-2005 Cisco Systems, Inc. + * Copyright(c) 2001-2006 Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/libs/srtp/crypto/include/rdb.h b/libs/srtp/crypto/include/rdb.h index 5a26c5e303..2ccb1448e2 100644 --- a/libs/srtp/crypto/include/rdb.h +++ b/libs/srtp/crypto/include/rdb.h @@ -49,7 +49,7 @@ rdb_init(rdb_t *rdb); */ err_status_t -rdb_check(const rdb_t *rdb, uint32_t index); +rdb_check(const rdb_t *rdb, uint32_t rdb_index); /* * rdb_add_index @@ -61,7 +61,7 @@ rdb_check(const rdb_t *rdb, uint32_t index); */ err_status_t -rdb_add_index(rdb_t *rdb, uint32_t index); +rdb_add_index(rdb_t *rdb, uint32_t rdb_index); /* * the functions rdb_increment() and rdb_get_value() are for use by diff --git a/libs/srtp/crypto/include/rdbx.h b/libs/srtp/crypto/include/rdbx.h index ce9ecf6f47..146fb42f25 100644 --- a/libs/srtp/crypto/include/rdbx.h +++ b/libs/srtp/crypto/include/rdbx.h @@ -46,19 +46,29 @@ typedef uint64_t xtd_seq_num_t; typedef struct { xtd_seq_num_t index; - v128_t bitmask; + bitvector_t bitmask; } rdbx_t; /* - * rdbx_init(rdbx_ptr) + * rdbx_init(rdbx_ptr, ws) * - * initializes the rdbx pointed to by its argument, setting the - * rollover counter and sequence number to zero + * initializes the rdbx pointed to by its argument with the window size ws, + * setting the rollover counter and sequence number to zero */ err_status_t -rdbx_init(rdbx_t *rdbx); +rdbx_init(rdbx_t *rdbx, unsigned long ws); + + +/* + * rdbx_dealloc(rdbx_ptr) + * + * frees memory associated with the rdbx + */ + +err_status_t +rdbx_dealloc(rdbx_t *rdbx); /* @@ -100,12 +110,42 @@ rdbx_check(const rdbx_t *rdbx, int difference); err_status_t rdbx_add_index(rdbx_t *rdbx, int delta); + +/* + * rdbx_set_roc(rdbx, roc) initalizes the rdbx_t at the location rdbx + * to have the rollover counter value roc. If that value is less than + * the current rollover counter value, then the function returns + * err_status_replay_old; otherwise, err_status_ok is returned. + * + */ + +err_status_t +rdbx_set_roc(rdbx_t *rdbx, uint32_t roc); + +/* + * rdbx_get_roc(rdbx) returns the value of the rollover counter for + * the rdbx_t pointed to by rdbx + * + */ + +xtd_seq_num_t +rdbx_get_packet_index(const rdbx_t *rdbx); + /* * xtd_seq_num_t functions - these are *internal* functions of rdbx, and * shouldn't be used to manipulate rdbx internal values. use the rdbx * api instead! */ +/* + * rdbx_get_ws(rdbx_ptr) + * + * gets the window size which was used to initialize the rdbx + */ + +unsigned long +rdbx_get_window_size(const rdbx_t *rdbx); + /* index_init(&pi) initializes a packet index pi (sets it to zero) */ diff --git a/libs/srtp/crypto/include/sha1.h b/libs/srtp/crypto/include/sha1.h index 1d61c5832c..e3af4d4b4b 100644 --- a/libs/srtp/crypto/include/sha1.h +++ b/libs/srtp/crypto/include/sha1.h @@ -10,7 +10,7 @@ /* * - * Copyright (c) 2001-2005, Cisco Systems, Inc. + * Copyright (c) 2001-2006, Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/libs/srtp/crypto/include/stat.h b/libs/srtp/crypto/include/stat.h index 1fe4f2f481..e28b1314a8 100644 --- a/libs/srtp/crypto/include/stat.h +++ b/libs/srtp/crypto/include/stat.h @@ -9,7 +9,7 @@ /* * - * Copyright(c) 2001-2005, Cisco Systems, Inc. + * Copyright(c) 2001-2006, Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/libs/srtp/crypto/kernel/alloc.c b/libs/srtp/crypto/kernel/alloc.c index 9ff5898f06..5dd0947490 100644 --- a/libs/srtp/crypto/kernel/alloc.c +++ b/libs/srtp/crypto/kernel/alloc.c @@ -8,7 +8,7 @@ */ /* * - * Copyright (c) 2001-2005 Cisco Systems, Inc. + * Copyright (c) 2001-2006 Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/libs/srtp/crypto/kernel/crypto_kernel.c b/libs/srtp/crypto/kernel/crypto_kernel.c index 23131c9c54..0e969bc860 100644 --- a/libs/srtp/crypto/kernel/crypto_kernel.c +++ b/libs/srtp/crypto/kernel/crypto_kernel.c @@ -8,7 +8,7 @@ */ /* * - * Copyright(c) 2001-2005 Cisco Systems, Inc. + * Copyright(c) 2001-2006 Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -151,10 +151,10 @@ crypto_kernel_init() { status = crypto_kernel_load_cipher_type(&null_cipher, NULL_CIPHER); if (status) return status; - status = crypto_kernel_load_cipher_type(&aes_icm, AES_128_ICM); + status = crypto_kernel_load_cipher_type(&aes_icm, AES_ICM); if (status) return status; - status = crypto_kernel_load_cipher_type(&aes_cbc, AES_128_CBC); + status = crypto_kernel_load_cipher_type(&aes_cbc, AES_CBC); if (status) return status; @@ -297,15 +297,19 @@ crypto_kernel_shutdown() { return err_status_ok; } -err_status_t -crypto_kernel_load_cipher_type(cipher_type_t *new_ct, cipher_type_id_t id) { - kernel_cipher_type_t *ctype, *new; +static inline err_status_t +crypto_kernel_do_load_cipher_type(cipher_type_t *new_ct, cipher_type_id_t id, + int replace) { + kernel_cipher_type_t *ctype, *new_ctype; err_status_t status; /* defensive coding */ if (new_ct == NULL) return err_status_bad_param; + if (new_ct->id != id) + return err_status_bad_param; + /* check cipher type by running self-test */ status = cipher_type_self_test(new_ct); if (status) { @@ -315,24 +319,35 @@ crypto_kernel_load_cipher_type(cipher_type_t *new_ct, cipher_type_id_t id) { /* walk down list, checking if this type is in the list already */ ctype = crypto_kernel.cipher_type_list; while (ctype != NULL) { - if ((new_ct == ctype->cipher_type) || (id == ctype->id)) + if (id == ctype->id) { + if (!replace) + return err_status_bad_param; + status = cipher_type_test(new_ct, ctype->cipher_type->test_data); + if (status) + return status; + new_ctype = ctype; + break; + } + else if (new_ct == ctype->cipher_type) return err_status_bad_param; ctype = ctype->next; } - /* put new_ct at the head of the list */ + /* if not found, put new_ct at the head of the list */ + if (ctype == NULL) { /* allocate memory */ - new = (kernel_cipher_type_t *) crypto_alloc(sizeof(kernel_cipher_type_t)); - if (new == NULL) - return err_status_alloc_fail; + new_ctype = (kernel_cipher_type_t *) crypto_alloc(sizeof(kernel_cipher_type_t)); + if (new_ctype == NULL) + return err_status_alloc_fail; + new_ctype->next = crypto_kernel.cipher_type_list; + + /* set head of list to new cipher type */ + crypto_kernel.cipher_type_list = new_ctype; + } /* set fields */ - new->cipher_type = new_ct; - new->id = id; - new->next = crypto_kernel.cipher_type_list; - - /* set head of list to new cipher type */ - crypto_kernel.cipher_type_list = new; + new_ctype->cipher_type = new_ct; + new_ctype->id = id; /* load debug module, if there is one present */ if (new_ct->debug != NULL) @@ -343,14 +358,28 @@ crypto_kernel_load_cipher_type(cipher_type_t *new_ct, cipher_type_id_t id) { } err_status_t -crypto_kernel_load_auth_type(auth_type_t *new_at, auth_type_id_t id) { - kernel_auth_type_t *atype, *new; +crypto_kernel_load_cipher_type(cipher_type_t *new_ct, cipher_type_id_t id) { + return crypto_kernel_do_load_cipher_type(new_ct, id, 0); +} + +err_status_t +crypto_kernel_replace_cipher_type(cipher_type_t *new_ct, cipher_type_id_t id) { + return crypto_kernel_do_load_cipher_type(new_ct, id, 1); +} + +err_status_t +crypto_kernel_do_load_auth_type(auth_type_t *new_at, auth_type_id_t id, + int replace) { + kernel_auth_type_t *atype, *new_atype; err_status_t status; /* defensive coding */ if (new_at == NULL) return err_status_bad_param; + if (new_at->id != id) + return err_status_bad_param; + /* check auth type by running self-test */ status = auth_type_self_test(new_at); if (status) { @@ -360,24 +389,35 @@ crypto_kernel_load_auth_type(auth_type_t *new_at, auth_type_id_t id) { /* walk down list, checking if this type is in the list already */ atype = crypto_kernel.auth_type_list; while (atype != NULL) { - if ((new_at == atype->auth_type) || (id == atype->id)) + if (id == atype->id) { + if (!replace) + return err_status_bad_param; + status = auth_type_test(new_at, atype->auth_type->test_data); + if (status) + return status; + new_atype = atype; + break; + } + else if (new_at == atype->auth_type) return err_status_bad_param; atype = atype->next; } - /* put new_at at the head of the list */ - /* allocate memory */ - new = (kernel_auth_type_t *)crypto_alloc(sizeof(kernel_auth_type_t)); - if (new == NULL) - return err_status_alloc_fail; + /* if not found, put new_at at the head of the list */ + if (atype == NULL) { + /* allocate memory */ + new_atype = (kernel_auth_type_t *)crypto_alloc(sizeof(kernel_auth_type_t)); + if (new_atype == NULL) + return err_status_alloc_fail; + + new_atype->next = crypto_kernel.auth_type_list; + /* set head of list to new auth type */ + crypto_kernel.auth_type_list = new_atype; + } /* set fields */ - new->auth_type = new_at; - new->id = id; - new->next = crypto_kernel.auth_type_list; - - /* set head of list to new auth type */ - crypto_kernel.auth_type_list = new; + new_atype->auth_type = new_at; + new_atype->id = id; /* load debug module, if there is one present */ if (new_at->debug != NULL) @@ -388,6 +428,16 @@ crypto_kernel_load_auth_type(auth_type_t *new_at, auth_type_id_t id) { } +err_status_t +crypto_kernel_load_auth_type(auth_type_t *new_at, auth_type_id_t id) { + return crypto_kernel_do_load_auth_type(new_at, id, 0); +} + +err_status_t +crypto_kernel_replace_auth_type(auth_type_t *new_at, auth_type_id_t id) { + return crypto_kernel_do_load_auth_type(new_at, id, 1); +} + cipher_type_t * crypto_kernel_get_cipher_type(cipher_type_id_t id) { diff --git a/libs/srtp/crypto/kernel/err.c b/libs/srtp/crypto/kernel/err.c index f68a629975..4a3a8589e9 100644 --- a/libs/srtp/crypto/kernel/err.c +++ b/libs/srtp/crypto/kernel/err.c @@ -8,7 +8,7 @@ */ /* * - * Copyright(c) 2001-2005 Cisco Systems, Inc. + * Copyright(c) 2001-2006 Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -42,10 +42,6 @@ * */ -#ifdef _MSC_VER -#pragma warning(disable:4100) -#endif - #include "err.h" #ifdef ERR_REPORTING_SYSLOG diff --git a/libs/srtp/crypto/kernel/key.c b/libs/srtp/crypto/kernel/key.c index 8c86b89f26..9f63b22c21 100644 --- a/libs/srtp/crypto/kernel/key.c +++ b/libs/srtp/crypto/kernel/key.c @@ -8,7 +8,7 @@ */ /* * - * Copyright (c) 2001-2005 Cisco Systems, Inc. + * Copyright (c) 2001-2006 Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/libs/srtp/crypto/math/datatypes.c b/libs/srtp/crypto/math/datatypes.c index 58c7502176..21c0dc0782 100644 --- a/libs/srtp/crypto/math/datatypes.c +++ b/libs/srtp/crypto/math/datatypes.c @@ -9,7 +9,7 @@ */ /* * - * Copyright (c) 2001-2005 Cisco Systems, Inc. + * Copyright (c) 2001-2006 Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -95,7 +95,7 @@ octet_get_weight(uint8_t octet) { /* the value MAX_PRINT_STRING_LEN is defined in datatypes.h */ -static char bit_string[MAX_PRINT_STRING_LEN]; +char bit_string[MAX_PRINT_STRING_LEN]; uint8_t nibble_to_hex_char(uint8_t nibble) { @@ -106,7 +106,7 @@ nibble_to_hex_char(uint8_t nibble) { char * octet_string_hex_string(const void *s, int length) { - const uint8_t *str = s; + const uint8_t *str = (const uint8_t *)s; int i; /* double length, since one octet takes two hex characters */ @@ -124,7 +124,7 @@ octet_string_hex_string(const void *s, int length) { return bit_string; } -inline int +static inline int hex_char_to_nibble(uint8_t c) { switch(c) { case ('0'): return 0x0; @@ -149,9 +149,10 @@ hex_char_to_nibble(uint8_t c) { case ('E'): return 0xe; case ('f'): return 0xf; case ('F'): return 0xf; + default: return -1; /* this flags an error */ } - /* this flags an error */ - return -1; + /* NOTREACHED */ + return -1; /* this keeps compilers from complaining */ } int @@ -178,7 +179,7 @@ hex_string_to_octet_string(char *raw, char *hex, int len) { tmp = hex_char_to_nibble(hex[0]); if (tmp == -1) return hex_len; - x = (uint8_t)(tmp << 4); + x = (tmp << 4); hex_len++; tmp = hex_char_to_nibble(hex[1]); if (tmp == -1) @@ -206,16 +207,16 @@ v128_hex_string(v128_t *x) { char * v128_bit_string(v128_t *x) { - int j, index; + int j, i; uint32_t mask; - for (j=index=0; j < 4; j++) { + for (j=i=0; j < 4; j++) { for (mask=0x80000000; mask > 0; mask >>= 1) { if (x->v32[j] & mask) - bit_string[index] = '1'; + bit_string[i] = '1'; else - bit_string[index] = '0'; - ++index; + bit_string[i] = '0'; + ++i; } } bit_string[128] = 0; /* null terminate string */ @@ -322,13 +323,13 @@ v128_set_bit_to(v128_t *x, int i, int y){ #endif /* DATATYPES_USE_MACROS */ void -v128_right_shift(v128_t *x, int index) { - const int base_index = index >> 5; - const int bit_index = index & 31; +v128_right_shift(v128_t *x, int shift) { + const int base_index = shift >> 5; + const int bit_index = shift & 31; int i, from; uint32_t b; - if (index > 127) { + if (shift > 127) { v128_set_to_zero(x); return; } @@ -360,12 +361,12 @@ v128_right_shift(v128_t *x, int index) { } void -v128_left_shift(v128_t *x, int index) { +v128_left_shift(v128_t *x, int shift) { int i; - const int base_index = index >> 5; - const int bit_index = index & 31; + const int base_index = shift >> 5; + const int bit_index = shift & 31; - if (index > 127) { + if (shift > 127) { v128_set_to_zero(x); return; } @@ -386,6 +387,124 @@ v128_left_shift(v128_t *x, int index) { } +/* functions manipulating bitvector_t */ + +#ifndef DATATYPES_USE_MACROS /* little functions are not macros */ + +int +bitvector_get_bit(const bitvector_t *v, int bit_index) +{ + return _bitvector_get_bit(v, bit_index); +} + +void +bitvector_set_bit(bitvector_t *v, int bit_index) +{ + _bitvector_set_bit(v, bit_index); +} + +void +bitvector_clear_bit(bitvector_t *v, int bit_index) +{ + _bitvector_clear_bit(v, bit_index); +} + + +#endif /* DATATYPES_USE_MACROS */ + +int +bitvector_alloc(bitvector_t *v, unsigned long length) { + unsigned long l; + + /* Round length up to a multiple of bits_per_word */ + length = (length + bits_per_word - 1) & ~(unsigned long)((bits_per_word - 1)); + + l = length / bits_per_word * bytes_per_word; + + /* allocate memory, then set parameters */ + if (l == 0) + v->word = NULL; + else { + v->word = (uint32_t*)crypto_alloc(l); + if (v->word == NULL) { + v->word = NULL; + v->length = 0; + return -1; + } + } + v->length = length; + + /* initialize bitvector to zero */ + bitvector_set_to_zero(v); + + return 0; +} + + +void +bitvector_dealloc(bitvector_t *v) { + if (v->word != NULL) + crypto_free(v->word); + v->word = NULL; + v->length = 0; +} + +void +bitvector_set_to_zero(bitvector_t *x) +{ + /* C99 guarantees that memset(0) will set the value 0 for uint32_t */ + memset(x->word, 0, x->length >> 3); +} + +char * +bitvector_bit_string(bitvector_t *x, char* buf, int len) { + int j, i; + uint32_t mask; + + for (j=i=0; j < (int)(x->length>>5) && i < len-1; j++) { + for (mask=0x80000000; mask > 0; mask >>= 1) { + if (x->word[j] & mask) + buf[i] = '1'; + else + buf[i] = '0'; + ++i; + if (i >= len-1) + break; + } + } + buf[i] = 0; /* null terminate string */ + + return buf; +} + +void +bitvector_left_shift(bitvector_t *x, int shift) { + int i; + const int base_index = shift >> 5; + const int bit_index = shift & 31; + const int word_length = x->length >> 5; + + if (shift >= (int)x->length) { + bitvector_set_to_zero(x); + return; + } + + if (bit_index == 0) { + for (i=0; i < word_length - base_index; i++) + x->word[i] = x->word[i+base_index]; + } else { + for (i=0; i < word_length - base_index - 1; i++) + x->word[i] = (x->word[i+base_index] >> bit_index) ^ + (x->word[i+base_index+1] << (32 - bit_index)); + x->word[word_length - base_index-1] = x->word[word_length-1] >> bit_index; + } + + /* now wrap up the final portion */ + for (i = word_length - base_index; i < word_length; i++) + x->word[i] = 0; + +} + int octet_string_is_eq(uint8_t *a, uint8_t *b, int len) { @@ -563,6 +682,8 @@ base64_char_to_sextet(uint8_t c) { return 63; case '=': return 64; + default: + break; } return -1; } @@ -583,7 +704,7 @@ base64_string_to_octet_string(char *raw, char *base64, int len) { tmp = base64_char_to_sextet(base64[0]); if (tmp == -1) return base64_len; - x = (uint8_t)(tmp << 6); + x = (tmp << 6); base64_len++; tmp = base64_char_to_sextet(base64[1]); if (tmp == -1) diff --git a/libs/srtp/crypto/math/gf2_8.c b/libs/srtp/crypto/math/gf2_8.c index 7bd5a0dea2..f1f45bdd56 100644 --- a/libs/srtp/crypto/math/gf2_8.c +++ b/libs/srtp/crypto/math/gf2_8.c @@ -10,7 +10,7 @@ /* * - * Copyright (c) 2001-2005, Cisco Systems, Inc. + * Copyright (c) 2001-2006, Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -50,7 +50,7 @@ /* gf2_8_shift() moved to gf2_8.h as an inline function */ -inline gf2_8 +gf2_8 gf2_8_multiply(gf2_8 x, gf2_8 y) { gf2_8 z = 0; diff --git a/libs/srtp/crypto/math/math.c b/libs/srtp/crypto/math/math.c index f3aaf65014..9e3e78ed12 100644 --- a/libs/srtp/crypto/math/math.c +++ b/libs/srtp/crypto/math/math.c @@ -8,7 +8,7 @@ */ /* * - * Copyright (c) 2001-2005 Cisco Systems, Inc. + * Copyright (c) 2001-2006 Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -43,7 +43,6 @@ */ #include "crypto_math.h" -#include /* malloc() used in bitvector_alloc */ int octet_weight[256] = { @@ -173,7 +172,7 @@ v32_weight(v32_t a) { return wt; } -inline unsigned char +unsigned char v32_distance(v32_t x, v32_t y) { x.value ^= y.value; return v32_weight(x); @@ -192,7 +191,7 @@ v32_dot_product(v32_t a, v32_t b) { #define MAX_STRING_LENGTH 1024 -static char bit_string[MAX_STRING_LENGTH]; +char bit_string[MAX_STRING_LENGTH]; char * octet_bit_string(uint8_t x) { @@ -524,13 +523,13 @@ A_times_x_plus_b(uint8_t A[8], uint8_t x, uint8_t b) { return b; } -inline void +void v16_copy_octet_string(v16_t *x, const uint8_t s[2]) { x->v8[0] = s[0]; x->v8[1] = s[1]; } -inline void +void v32_copy_octet_string(v32_t *x, const uint8_t s[4]) { x->v8[0] = s[0]; x->v8[1] = s[1]; @@ -538,7 +537,7 @@ v32_copy_octet_string(v32_t *x, const uint8_t s[4]) { x->v8[3] = s[3]; } -inline void +void v64_copy_octet_string(v64_t *x, const uint8_t s[8]) { x->v8[0] = s[0]; x->v8[1] = s[1]; @@ -632,7 +631,7 @@ v128_set_bit_to(v128_t *x, int i, int y){ #endif /* DATATYPES_USE_MACROS */ -inline void +static inline void v128_left_shift2(v128_t *x, int num_bits) { int i; int word_shift = num_bits >> 5; @@ -773,165 +772,6 @@ octet_string_set_to_zero(uint8_t *s, int len) { } -/* functions manipulating bit_vector_t */ - -#define BITVECTOR_MAX_WORDS 5 - -int -bitvector_alloc(bitvector_t *v, unsigned long length) { - unsigned long l = (length + bytes_per_word - 1) / bytes_per_word; - int i; - - /* allocate memory, then set parameters */ - if (l > BITVECTOR_MAX_WORDS) - return -1; - else - l = BITVECTOR_MAX_WORDS; - v->word = malloc(l); - if (v->word == NULL) - return -1; - v->length = length; - - /* initialize bitvector to zero */ - for (i=0; i < (length >> 5); i++) { - v->word = 0; - } - - return 0; -} - -void -bitvector_set_bit(bitvector_t *v, int bit_index) { - - v->word[(bit_index >> 5)] |= (1 << (bit_index & 31)); - -} - -int -bitvector_get_bit(const bitvector_t *v, int bit_index) { - - return ((v->word[(bit_index >> 5)]) >> (bit_index & 31)) & 1; - -} - -#include - -int -bitvector_print_hex(const bitvector_t *v, FILE *stream) { - int i; - int m = v->length >> 5; - int n = v->length & 31; - char string[9]; - uint32_t tmp; - - /* if length isn't a multiple of four, we can't hex_print */ - if (n & 3) - return -1; - - /* if the length is zero, do nothing */ - if (v->length == 0) - return 0; - - /* - * loop over words from most significant to least significant - - */ - - for (i=m; i > 0; i++) { - char *str = string + 7; - tmp = v->word[i]; - - /* null terminate string */ - string[8] = 0; - - /* loop over nibbles */ - *str-- = nibble_to_hex_char(tmp & 0xf); tmp >>= 4; - *str-- = nibble_to_hex_char(tmp & 0xf); tmp >>= 4; - *str-- = nibble_to_hex_char(tmp & 0xf); tmp >>= 4; - *str-- = nibble_to_hex_char(tmp & 0xf); tmp >>= 4; - *str-- = nibble_to_hex_char(tmp & 0xf); tmp >>= 4; - *str-- = nibble_to_hex_char(tmp & 0xf); tmp >>= 4; - *str-- = nibble_to_hex_char(tmp & 0xf); tmp >>= 4; - *str-- = nibble_to_hex_char(tmp & 0xf); - - /* now print stream */ - fprintf(stream, string); - } - - return 0; - -} - - -int -hex_string_length(char *s) { - int count = 0; - - /* ignore leading zeros */ - while ((*s != 0) && *s == '0') - s++; - - /* count remaining characters */ - while (*s != 0) { - if (hex_char_to_nibble(*s++) == -1) - return -1; - count++; - } - - return count; -} - -int -bitvector_set_from_hex(bitvector_t *v, char *string) { - int num_hex_chars, m, n, i, j; - uint32_t tmp; - - num_hex_chars = hex_string_length(string); - if (num_hex_chars == -1) - return -1; - - /* set length */ - v->length = num_hex_chars * 4; - /* - * at this point, we should subtract away a bit if the high - * bit of the first character is zero, but we ignore that - * for now and assume that we're four-bit aligned - DAM - */ - - - m = num_hex_chars / 8; /* number of words */ - n = num_hex_chars % 8; /* number of nibbles in last word */ - - /* if the length is greater than the bitvector, return an error */ - if (m > BITVECTOR_MAX_WORDS) - return -1; - - /* - * loop over words from most significant - first word is a special - * case - */ - - if (n) { - tmp = 0; - for (i=0; i < n; i++) { - tmp = hex_char_to_nibble(*string++); - tmp <<= 4; - } - v->word[m] = tmp; - } - - /* now loop over the rest of the words */ - for (i=m-1; i >= 0; i--) { - tmp = 0; - for (j=0; j < 8; j++) { - tmp = hex_char_to_nibble(*string++); - tmp <<= 4; - } - v->word[i] = tmp; - } - - return 0; -} - /* functions below not yet tested! */ diff --git a/libs/srtp/crypto/math/stat.c b/libs/srtp/crypto/math/stat.c index 6f94a0c6e6..5e46c209e3 100644 --- a/libs/srtp/crypto/math/stat.c +++ b/libs/srtp/crypto/math/stat.c @@ -28,7 +28,7 @@ stat_test_monobit(uint8_t *data) { ones_count = 0; while (data < data_end) { - ones_count = (uint16_t)(ones_count + octet_get_weight(*data)); + ones_count += octet_get_weight(*data); data++; } @@ -83,7 +83,7 @@ stat_test_runs(uint8_t *data) { uint16_t gaps[6] = { 0, 0, 0, 0, 0, 0 }; uint16_t lo_value[6] = { 2315, 1114, 527, 240, 103, 103 }; uint16_t hi_value[6] = { 2685, 1386, 723, 384, 209, 209 }; - int16_t state = 0; + int state = 0; uint16_t mask; int i; @@ -208,7 +208,7 @@ stat_test_rand_source(rand_source_func_t get_rand_bytes) { uint16_t gaps[6] = { 0, 0, 0, 0, 0, 0 }; uint16_t lo_value[6] = { 2315, 1114, 527, 240, 103, 103 }; uint16_t hi_value[6] = { 2685, 1386, 723, 384, 209, 209 }; - int16_t state = 0; + int state = 0; uint16_t mask; /* counters for monobit, poker, and runs tests are initialized above */ diff --git a/libs/srtp/crypto/replay/rdb.c b/libs/srtp/crypto/replay/rdb.c index e2e645be1b..5d204ec0e1 100644 --- a/libs/srtp/crypto/replay/rdb.c +++ b/libs/srtp/crypto/replay/rdb.c @@ -9,7 +9,7 @@ /* * - * Copyright (c) 2001-2005, Cisco Systems, Inc. + * Copyright (c) 2001-2006, Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -70,19 +70,19 @@ rdb_init(rdb_t *rdb) { */ err_status_t -rdb_check(const rdb_t *rdb, uint32_t index) { +rdb_check(const rdb_t *rdb, uint32_t p_index) { /* if the index appears after (or at very end of) the window, its good */ - if (index >= rdb->window_start + rdb_bits_in_bitmask) + if (p_index >= rdb->window_start + rdb_bits_in_bitmask) return err_status_ok; /* if the index appears before the window, its bad */ - if (index < rdb->window_start) - return err_status_fail; + if (p_index < rdb->window_start) + return err_status_replay_old; /* otherwise, the index appears within the window, so check the bitmask */ - if (v128_get_bit(&rdb->bitmask, (index - rdb->window_start)) == 1) - return err_status_fail; + if (v128_get_bit(&rdb->bitmask, (p_index - rdb->window_start)) == 1) + return err_status_replay_fail; /* otherwise, the index is okay */ return err_status_ok; @@ -98,15 +98,15 @@ rdb_check(const rdb_t *rdb, uint32_t index) { */ err_status_t -rdb_add_index(rdb_t *rdb, uint32_t index) { +rdb_add_index(rdb_t *rdb, uint32_t p_index) { int delta; - /* here we *assume* that index > rdb->window_start */ + /* here we *assume* that p_index > rdb->window_start */ - delta = (index - rdb->window_start); + delta = (p_index - rdb->window_start); if (delta < rdb_bits_in_bitmask) { - /* if the index is within the window, set the appropriate bit */ + /* if the p_index is within the window, set the appropriate bit */ v128_set_bit(&rdb->bitmask, delta); } else { @@ -115,7 +115,7 @@ rdb_add_index(rdb_t *rdb, uint32_t index) { /* shift the window forward by delta bits*/ v128_left_shift(&rdb->bitmask, delta); - v128_set_bit(&rdb->bitmask, rdb_bits_in_bitmask-delta); + v128_set_bit(&rdb->bitmask, rdb_bits_in_bitmask-1); rdb->window_start += delta; } diff --git a/libs/srtp/crypto/replay/rdbx.c b/libs/srtp/crypto/replay/rdbx.c index dcdb138510..54671cab0c 100644 --- a/libs/srtp/crypto/replay/rdbx.c +++ b/libs/srtp/crypto/replay/rdbx.c @@ -9,7 +9,7 @@ /* * - * Copyright (c) 2001-2005, Cisco Systems, Inc. + * Copyright (c) 2001-2006, Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -45,18 +45,17 @@ #include "rdbx.h" -#define rdbx_high_bit_in_bitmask 127 /* - * from draft-ietf-avt-srtp-00.txt: + * from RFC 3711: * * A receiver reconstructs the index i of a packet with sequence - * number s using the estimate + * number SEQ using the estimate * - * i = 65,536 * t + s, + * i = 2^16 * v + SEQ, * - * where t is chosen from the set { r-1, r, r+1 } such that i is - * closest to the value 65,536 * r + s_l. If the value r+1 is used, + * where v is chosen from the set { ROC-1, ROC, ROC+1 } such that i is + * closest to the value 2^16 * ROC + s_l. If the value r+1 is used, * then the rollover counter r in the cryptographic context is * incremented by one (if the packet containing s is authentic). */ @@ -146,18 +145,18 @@ index_guess(const xtd_seq_num_t *local, if (local_seq < seq_num_median) { if (s - local_seq > seq_num_median) { guess_roc = local_roc - 1; - difference = seq_num_max - s + local_seq; + difference = s - local_seq - seq_num_max; } else { guess_roc = local_roc; difference = s - local_seq; } } else { if (local_seq - seq_num_median > s) { - guess_roc = local_roc+1; - difference = seq_num_max - local_seq + s; + guess_roc = local_roc + 1; + difference = s - local_seq + seq_num_max; } else { - difference = s - local_seq; guess_roc = local_roc; + difference = s - local_seq; } } guess_seq = s; @@ -180,17 +179,81 @@ index_guess(const xtd_seq_num_t *local, /* - * rdbx_init(&r) initalizes the rdbx_t pointed to by r + * rdbx_init(&r, ws) initializes the rdbx_t pointed to by r with window size ws */ err_status_t -rdbx_init(rdbx_t *rdbx) { - v128_set_to_zero(&rdbx->bitmask); +rdbx_init(rdbx_t *rdbx, unsigned long ws) { + if (ws == 0) + return err_status_bad_param; + + if (bitvector_alloc(&rdbx->bitmask, ws) != 0) + return err_status_alloc_fail; + index_init(&rdbx->index); return err_status_ok; } +/* + * rdbx_dealloc(&r) frees memory for the rdbx_t pointed to by r + */ + +err_status_t +rdbx_dealloc(rdbx_t *rdbx) { + bitvector_dealloc(&rdbx->bitmask); + + return err_status_ok; +} + +/* + * rdbx_set_roc(rdbx, roc) initalizes the rdbx_t at the location rdbx + * to have the rollover counter value roc. If that value is less than + * the current rollover counter value, then the function returns + * err_status_replay_old; otherwise, err_status_ok is returned. + * + */ + +err_status_t +rdbx_set_roc(rdbx_t *rdbx, uint32_t roc) { + bitvector_set_to_zero(&rdbx->bitmask); + +#ifdef NO_64BIT_MATH + #error not yet implemented +#else + + /* make sure that we're not moving backwards */ + if (roc < (rdbx->index >> 16)) + return err_status_replay_old; + + rdbx->index &= 0xffff; /* retain lowest 16 bits */ + rdbx->index |= ((uint64_t)roc) << 16; /* set ROC */ +#endif + + return err_status_ok; +} + +/* + * rdbx_get_packet_index(rdbx) returns the value of the packet index + * for the rdbx_t pointed to by rdbx + * + */ + +xtd_seq_num_t +rdbx_get_packet_index(const rdbx_t *rdbx) { + return rdbx->index; +} + +/* + * rdbx_get_window_size(rdbx) returns the value of the window size + * for the rdbx_t pointed to by rdbx + * + */ + +unsigned long +rdbx_get_window_size(const rdbx_t *rdbx) { + return bitvector_get_length(&rdbx->bitmask); +} /* * rdbx_check(&r, delta) checks to see if the xtd_seq_num_t @@ -202,11 +265,11 @@ rdbx_check(const rdbx_t *rdbx, int delta) { if (delta > 0) { /* if delta is positive, it's good */ return err_status_ok; - } else if (rdbx_high_bit_in_bitmask + delta < 0) { + } else if ((int)(bitvector_get_length(&rdbx->bitmask) - 1) + delta < 0) { /* if delta is lower than the bitmask, it's bad */ return err_status_replay_old; - } else if (v128_get_bit(&rdbx->bitmask, - rdbx_high_bit_in_bitmask + delta) == 1) { + } else if (bitvector_get_bit(&rdbx->bitmask, + (int)(bitvector_get_length(&rdbx->bitmask) - 1) + delta) == 1) { /* delta is within the window, so check the bitmask */ return err_status_replay_fail; } @@ -229,12 +292,12 @@ rdbx_add_index(rdbx_t *rdbx, int delta) { if (delta > 0) { /* shift forward by delta */ - index_advance(&rdbx->index, (sequence_number_t)delta); - v128_left_shift(&rdbx->bitmask, delta); - v128_set_bit(&rdbx->bitmask, 127); + index_advance(&rdbx->index, delta); + bitvector_left_shift(&rdbx->bitmask, delta); + bitvector_set_bit(&rdbx->bitmask, bitvector_get_length(&rdbx->bitmask) - 1); } else { - /* delta is in window, so flip bit in bitmask */ - v128_set_bit(&rdbx->bitmask, -delta); + /* delta is in window */ + bitvector_set_bit(&rdbx->bitmask, bitvector_get_length(&rdbx->bitmask) -1 + delta); } /* note that we need not consider the case that delta == 0 */ diff --git a/libs/srtp/crypto/replay/ut_sim.c b/libs/srtp/crypto/replay/ut_sim.c index 15258c76ab..43c411e46b 100644 --- a/libs/srtp/crypto/replay/ut_sim.c +++ b/libs/srtp/crypto/replay/ut_sim.c @@ -10,7 +10,7 @@ /* * - * Copyright (c) 2001-2005, Cisco Systems, Inc. + * Copyright (c) 2001-2006, Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -47,9 +47,6 @@ #include "ut_sim.h" -#ifdef _MSC_VER -#pragma warning(disable:4100) -#endif int ut_compar(const void *a, const void *b) { diff --git a/libs/srtp/crypto/rng/ctr_prng.c b/libs/srtp/crypto/rng/ctr_prng.c index 91effb96ab..41d46a8f55 100644 --- a/libs/srtp/crypto/rng/ctr_prng.c +++ b/libs/srtp/crypto/rng/ctr_prng.c @@ -8,7 +8,7 @@ */ /* * - * Copyright(c) 2001-2005 Cisco Systems, Inc. + * Copyright(c) 2001-2006 Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -47,7 +47,7 @@ /* single, global prng structure */ -static ctr_prng_t ctr_prng; +ctr_prng_t ctr_prng; err_status_t ctr_prng_init(rand_source_func_t random_source) { @@ -66,7 +66,7 @@ ctr_prng_init(rand_source_func_t random_source) { return status; /* initialize aes ctr context with random key */ - status = aes_icm_context_init(&ctr_prng.state, tmp_key); + status = aes_icm_context_init(&ctr_prng.state, tmp_key, 30); if (status) return status; @@ -92,7 +92,7 @@ ctr_prng_get_octet_string(void *dest, uint32_t len) { /* * write prng output */ - status = aes_icm_output(&ctr_prng.state, dest, len); + status = aes_icm_output(&ctr_prng.state, (uint8_t*)dest, len); if (status) return status; diff --git a/libs/srtp/crypto/rng/prng.c b/libs/srtp/crypto/rng/prng.c index 0cd027eece..62b5e11d4e 100644 --- a/libs/srtp/crypto/rng/prng.c +++ b/libs/srtp/crypto/rng/prng.c @@ -8,7 +8,7 @@ */ /* * - * Copyright(c) 2001-2005 Cisco Systems, Inc. + * Copyright(c) 2001-2006 Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -47,11 +47,11 @@ /* single, global prng structure */ -static x917_prng_t x917_prng; +x917_prng_t x917_prng; err_status_t x917_prng_init(rand_source_func_t random_source) { - v128_t tmp_key; + uint8_t tmp_key[16]; err_status_t status; /* initialize output count to zero */ @@ -61,12 +61,12 @@ x917_prng_init(rand_source_func_t random_source) { x917_prng.rand = random_source; /* initialize secret key from random source */ - status = random_source((uint8_t *)&tmp_key, 16); + status = random_source(tmp_key, 16); if (status) return status; /* expand aes key */ - aes_expand_encryption_key(&tmp_key, x917_prng.key); + aes_expand_encryption_key(tmp_key, 16, &x917_prng.key); /* initialize prng state from random source */ status = x917_prng.rand((uint8_t *)&x917_prng.state, 16); @@ -80,7 +80,7 @@ err_status_t x917_prng_get_octet_string(uint8_t *dest, uint32_t len) { uint32_t t; v128_t buffer; - int i, tail_len; + uint32_t i, tail_len; err_status_t status; /* @@ -99,7 +99,7 @@ x917_prng_get_octet_string(uint8_t *dest, uint32_t len) { t = (uint32_t)time(NULL); /* loop until we have output enough data */ - for (i=0; (uint32_t)i < len/16; i++) { + for (i=0; i < len/16; i++) { /* exor time into state */ x917_prng.state.v32[0] ^= t; @@ -108,7 +108,7 @@ x917_prng_get_octet_string(uint8_t *dest, uint32_t len) { v128_copy(&buffer, &x917_prng.state); /* apply aes to buffer */ - aes_encrypt(&buffer, x917_prng.key); + aes_encrypt(&buffer, &x917_prng.key); /* write data to output */ *dest++ = buffer.v8[0]; @@ -132,7 +132,7 @@ x917_prng_get_octet_string(uint8_t *dest, uint32_t len) { buffer.v32[0] ^= t; /* encrypt buffer */ - aes_encrypt(&buffer, x917_prng.key); + aes_encrypt(&buffer, &x917_prng.key); /* copy buffer into state */ v128_copy(&x917_prng.state, &buffer); @@ -150,7 +150,7 @@ x917_prng_get_octet_string(uint8_t *dest, uint32_t len) { v128_copy(&buffer, &x917_prng.state); /* apply aes to buffer */ - aes_encrypt(&buffer, x917_prng.key); + aes_encrypt(&buffer, &x917_prng.key); /* write data to output */ for (i=0; i < tail_len; i++) { @@ -163,7 +163,7 @@ x917_prng_get_octet_string(uint8_t *dest, uint32_t len) { buffer.v32[0] ^= t; /* encrypt buffer */ - aes_encrypt(&buffer, x917_prng.key); + aes_encrypt(&buffer, &x917_prng.key); /* copy buffer into state */ v128_copy(&x917_prng.state, &buffer); diff --git a/libs/srtp/crypto/rng/rand_source.c b/libs/srtp/crypto/rng/rand_source.c index aee16c03e8..1eb6fbb09c 100644 --- a/libs/srtp/crypto/rng/rand_source.c +++ b/libs/srtp/crypto/rng/rand_source.c @@ -8,7 +8,7 @@ */ /* * - * Copyright(c) 2001-2005 Cisco Systems, Inc. + * Copyright(c) 2001-2006 Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -43,18 +43,36 @@ */ #include "config.h" -#include "rand_source.h" #ifdef DEV_URANDOM # include /* for open() */ # include /* for close() */ +#elif defined(HAVE_RAND_S) +# define _CRT_RAND_S +# include #else # include #endif -/* global dev_rand_fdes is file descriptor for /dev/random */ +#include "rand_source.h" -static int dev_random_fdes = -1; + +/* + * global dev_rand_fdes is file descriptor for /dev/random + * + * This variable is also used to indicate that the random source has + * been initialized. When this variable is set to the value of the + * #define RAND_SOURCE_NOT_READY, it indicates that the random source + * is not ready to be used. The value of the #define + * RAND_SOURCE_READY is for use whenever that variable is used as an + * indicator of the state of the random source, but not as a file + * descriptor. + */ + +#define RAND_SOURCE_NOT_READY (-1) +#define RAND_SOURCE_READY (17) + +static int dev_random_fdes = RAND_SOURCE_NOT_READY; err_status_t @@ -68,10 +86,12 @@ rand_source_init(void) { dev_random_fdes = open(DEV_URANDOM, O_RDONLY); if (dev_random_fdes < 0) return err_status_init_fail; +#elif defined(HAVE_RAND_S) + dev_random_fdes = RAND_SOURCE_READY; #else /* no random source available; let the user know */ fprintf(stderr, "WARNING: no real random source present!\n"); - dev_random_fdes = 17; + dev_random_fdes = RAND_SOURCE_READY; #endif return err_status_ok; } @@ -85,25 +105,45 @@ rand_source_get_octet_string(void *dest, uint32_t len) { * written */ #ifdef DEV_URANDOM - if (read(dev_random_fdes, dest, len) != len) - return err_status_fail; + uint8_t *dst = (uint8_t *)dest; + while (len) + { + ssize_t num_read = read(dev_random_fdes, dst, len); + if (num_read <= 0 || num_read > len) + return err_status_fail; + len -= num_read; + dst += num_read; + } +#elif defined(HAVE_RAND_S) + uint8_t *dst = (uint8_t *)dest; + while (len) + { + unsigned int val; + errno_t err = rand_s(&val); + + if (err != 0) + return err_status_fail; + + *dst++ = val & 0xff; + len--; + } #else /* Generic C-library (rand()) version */ /* This is a random source of last resort */ - uint8_t *dst = dest; + uint8_t *dst = (uint8_t *)dest; while (len) { int val = rand(); /* rand() returns 0-32767 (ugh) */ /* Is this a good enough way to get random bytes? It is if it passes FIPS-140... */ - *dst++ = (uint8_t)(val & 0xff); + *dst++ = val & 0xff; len--; } #endif return err_status_ok; } - + err_status_t rand_source_deinit(void) { if (dev_random_fdes < 0) @@ -112,7 +152,7 @@ rand_source_deinit(void) { #ifdef DEV_URANDOM close(dev_random_fdes); #endif - dev_random_fdes = -1; + dev_random_fdes = RAND_SOURCE_NOT_READY; return err_status_ok; } diff --git a/libs/srtp/crypto/test/.cvsignore b/libs/srtp/crypto/test/.cvsignore new file mode 100644 index 0000000000..888bf597e1 --- /dev/null +++ b/libs/srtp/crypto/test/.cvsignore @@ -0,0 +1,8 @@ +aes_calc +cipher_driver +datatypes_driver +env +kernel_driver +rand_gen +sha1_driver +stat_driver diff --git a/libs/srtp/crypto/test/aes_calc b/libs/srtp/crypto/test/aes_calc new file mode 100755 index 0000000000000000000000000000000000000000..ddefb75bb4aba1e2f92411fe3dd580a11e7ac298 GIT binary patch literal 63886 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 AES_KEY_LEN*2) { + if (strlen(argv[1]) > AES_MAX_KEY_LEN*2) { fprintf(stderr, "error: too many digits in key " - "(should be %d hexadecimal digits, found %u)\n", - AES_KEY_LEN*2, (unsigned)strlen(argv[1])); + "(should be at most %d hexadecimal digits, found %u)\n", + AES_MAX_KEY_LEN*2, (unsigned)strlen(argv[1])); exit(1); } - len = hex_string_to_octet_string((char *)&key, argv[1], AES_KEY_LEN*2); + len = hex_string_to_octet_string((char*)key, argv[1], AES_MAX_KEY_LEN*2); /* check that hex string is the right length */ - if (len < AES_KEY_LEN*2) { + if (len != 32 && len != 48 && len != 64) { fprintf(stderr, - "error: too few digits in key " - "(should be %d hexadecimal digits, found %d)\n", - AES_KEY_LEN*2, len); + "error: bad number of digits in key " + "(should be 32/48/64 hexadecimal digits, found %d)\n", + len); exit(1); } + key_len = len/2; /* read in plaintext, checking length */ if (strlen(argv[2]) > 16*2) { @@ -95,13 +98,18 @@ main (int argc, char *argv[]) { } /* encrypt plaintext */ - aes_expand_encryption_key(&key, exp_key); + status = aes_expand_encryption_key(key, key_len, &exp_key); + if (status) { + fprintf(stderr, + "error: AES key expansion failed.\n"); + exit(1); + } - aes_encrypt(&data, exp_key); + aes_encrypt(&data, &exp_key); /* write ciphertext to output */ if (verbose) { - printf("key:\t\t%s\n", v128_hex_string(&key)); + printf("key:\t\t%s\n", octet_string_hex_string(key, key_len)); printf("ciphertext:\t"); } printf("%s\n", v128_hex_string(&data)); diff --git a/libs/srtp/crypto/test/auth_driver.c b/libs/srtp/crypto/test/auth_driver.c index 3073d49500..cd8a75dd09 100644 --- a/libs/srtp/crypto/test/auth_driver.c +++ b/libs/srtp/crypto/test/auth_driver.c @@ -9,7 +9,7 @@ /* * - * Copyright (c) 2001-2005, Cisco Systems, Inc. + * Copyright (c) 2001-2006, Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/libs/srtp/crypto/test/cipher_driver.c b/libs/srtp/crypto/test/cipher_driver.c index 276e775b83..ea41ff5a4c 100644 --- a/libs/srtp/crypto/test/cipher_driver.c +++ b/libs/srtp/crypto/test/cipher_driver.c @@ -9,7 +9,7 @@ /* * - * Copyright (c) 2001-2005, Cisco Systems, Inc. + * Copyright (c) 2001-2006, Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -120,10 +120,13 @@ int main(int argc, char *argv[]) { cipher_t *c = NULL; err_status_t status; - unsigned char test_key[20] = { + unsigned char test_key[48] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, - 0x10, 0x11, 0x12, 0x13 + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, }; int q; unsigned do_timing_test = 0; @@ -168,9 +171,14 @@ main(int argc, char *argv[]) { for (num_cipher=1; num_cipher < max_num_cipher; num_cipher *=8) cipher_driver_test_array_throughput(&aes_icm, 30, num_cipher); + for (num_cipher=1; num_cipher < max_num_cipher; num_cipher *=8) + cipher_driver_test_array_throughput(&aes_icm, 46, num_cipher); + for (num_cipher=1; num_cipher < max_num_cipher; num_cipher *=8) cipher_driver_test_array_throughput(&aes_cbc, 16, num_cipher); + for (num_cipher=1; num_cipher < max_num_cipher; num_cipher *=8) + cipher_driver_test_array_throughput(&aes_cbc, 32, num_cipher); } if (do_validation) { @@ -196,7 +204,7 @@ main(int argc, char *argv[]) { check_status(status); - /* run the throughput test on the aes_icm cipher */ + /* run the throughput test on the aes_icm cipher (128-bit key) */ status = cipher_type_alloc(&aes_icm, &c, 30); if (status) { fprintf(stderr, "error: can't allocate cipher\n"); @@ -216,6 +224,27 @@ main(int argc, char *argv[]) { status = cipher_dealloc(c); check_status(status); + + /* repeat the tests with 256-bit keys */ + status = cipher_type_alloc(&aes_icm, &c, 46); + if (status) { + fprintf(stderr, "error: can't allocate cipher\n"); + exit(status); + } + + status = cipher_init(c, test_key, direction_encrypt); + check_status(status); + + if (do_timing_test) + cipher_driver_test_throughput(c); + + if (do_validation) { + status = cipher_driver_test_buffering(c); + check_status(status); + } + + status = cipher_dealloc(c); + check_status(status); return 0; } @@ -225,9 +254,9 @@ cipher_driver_test_throughput(cipher_t *c) { int i; int min_enc_len = 32; int max_enc_len = 2048; /* should be a power of two */ - int num_trials = 100000; + int num_trials = 1000000; - printf("timing %s throughput:\n", c->type->description); + printf("timing %s throughput, key length %d:\n", c->type->description, c->key_len); fflush(stdout); for (i=min_enc_len; i <= max_enc_len; i = i * 2) printf("msg len: %d\tgigabits per second: %f\n", @@ -348,6 +377,9 @@ cipher_array_alloc_init(cipher_t ***ca, int num_ciphers, err_status_t status; uint8_t *key; cipher_t **cipher_array; + /* pad klen allocation, to handle aes_icm reading 16 bytes for the + 14-byte salt */ + int klen_pad = ((klen + 15) >> 4) << 4; /* allocate array of pointers to ciphers */ cipher_array = (cipher_t **) malloc(sizeof(cipher_t *) * num_ciphers); @@ -358,7 +390,7 @@ cipher_array_alloc_init(cipher_t ***ca, int num_ciphers, *ca = cipher_array; /* allocate key */ - key = crypto_alloc(klen); + key = crypto_alloc(klen_pad); if (key == NULL) { free(cipher_array); return err_status_alloc_fail; @@ -375,6 +407,8 @@ cipher_array_alloc_init(cipher_t ***ca, int num_ciphers, /* generate random key and initialize cipher */ for (j=0; j < klen; j++) key[j] = (uint8_t) rand(); + for (; j < klen_pad; j++) + key[j] = 0; status = cipher_init(*cipher_array, key, direction_encrypt); if (status) return status; @@ -387,6 +421,8 @@ cipher_array_alloc_init(cipher_t ***ca, int num_ciphers, cipher_array++; } + crypto_free(key); + return err_status_ok; } @@ -423,24 +459,28 @@ cipher_array_bits_per_second(cipher_t *cipher_array[], int num_cipher, v128_t nonce; clock_t timer; unsigned char *enc_buf; - int cipher_index = 0; + int cipher_index = rand() % num_cipher; - - enc_buf = crypto_alloc(octets_in_buffer); + /* Over-alloc, for NIST CBC padding */ + enc_buf = crypto_alloc(octets_in_buffer+17); if (enc_buf == NULL) return 0; /* indicate bad parameters by returning null */ + memset(enc_buf, 0, octets_in_buffer); /* time repeated trials */ v128_set_to_zero(&nonce); timer = clock(); for(i=0; i < num_trials; i++, nonce.v32[3] = i) { - - /* choose a cipher at random from the array*/ - cipher_index = (*((uint32_t *)enc_buf)) % num_cipher; + /* length parameter to cipher_encrypt is in/out -- out is total, padded + * length -- so reset it each time. */ + unsigned octets_to_encrypt = octets_in_buffer; /* encrypt buffer with cipher */ cipher_set_iv(cipher_array[cipher_index], &nonce); - cipher_encrypt(cipher_array[cipher_index], enc_buf, &octets_in_buffer); + cipher_encrypt(cipher_array[cipher_index], enc_buf, &octets_to_encrypt); + + /* choose a cipher at random from the array*/ + cipher_index = (*((uint32_t *)enc_buf)) % num_cipher; } timer = clock() - timer; @@ -451,7 +491,7 @@ cipher_array_bits_per_second(cipher_t *cipher_array[], int num_cipher, return 0; } - return CLOCKS_PER_SEC * num_trials * 8 * octets_in_buffer / timer; + return (uint64_t)CLOCKS_PER_SEC * num_trials * 8 * octets_in_buffer / timer; } void @@ -459,10 +499,10 @@ cipher_array_test_throughput(cipher_t *ca[], int num_cipher) { int i; int min_enc_len = 16; int max_enc_len = 2048; /* should be a power of two */ - int num_trials = 10000; + int num_trials = 1000000; - printf("timing %s throughput with array size %d:\n", - (ca[0])->type->description, num_cipher); + printf("timing %s throughput with key length %d, array size %d:\n", + (ca[0])->type->description, (ca[0])->key_len, num_cipher); fflush(stdout); for (i=min_enc_len; i <= max_enc_len; i = i * 4) printf("msg len: %d\tgigabits per second: %f\n", i, diff --git a/libs/srtp/crypto/test/datatypes_driver b/libs/srtp/crypto/test/datatypes_driver new file mode 100755 index 0000000000000000000000000000000000000000..8f32a62ac2bf8d6d8c69b44d5cdc3d865a77434c GIT binary patch literal 31454 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 Y(X+8%oCsz6y9OeZ6Aon$ehB`*0foHCKmY&$ literal 0 HcmV?d00001 diff --git a/libs/srtp/crypto/test/datatypes_driver.c b/libs/srtp/crypto/test/datatypes_driver.c index f8e34ef942..f1866524c7 100644 --- a/libs/srtp/crypto/test/datatypes_driver.c +++ b/libs/srtp/crypto/test/datatypes_driver.c @@ -9,7 +9,7 @@ /* * - * Copyright (c) 2001-2005, Cisco Systems, Inc. + * Copyright (c) 2001-2006, Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/libs/srtp/crypto/test/env.c b/libs/srtp/crypto/test/env.c index 07b6f51527..37a6e2731b 100644 --- a/libs/srtp/crypto/test/env.c +++ b/libs/srtp/crypto/test/env.c @@ -8,7 +8,7 @@ */ /* * - * Copyright (c) 2001-2005 Cisco Systems, Inc. + * Copyright (c) 2001-2006 Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/libs/srtp/crypto/test/kernel_driver.c b/libs/srtp/crypto/test/kernel_driver.c index 4271f8ee68..8ef8a5f4b3 100644 --- a/libs/srtp/crypto/test/kernel_driver.c +++ b/libs/srtp/crypto/test/kernel_driver.c @@ -8,7 +8,7 @@ */ /* * - * Copyright(c) 2001-2005 Cisco Systems, Inc. + * Copyright(c) 2001-2006 Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/libs/srtp/crypto/test/rand_gen.c b/libs/srtp/crypto/test/rand_gen.c index 8fcf89cd66..ccea097f26 100644 --- a/libs/srtp/crypto/test/rand_gen.c +++ b/libs/srtp/crypto/test/rand_gen.c @@ -8,7 +8,7 @@ */ /* * - * Copyright(c) 2001-2005 Cisco Systems, Inc. + * Copyright(c) 2001-2006 Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/libs/srtp/crypto/test/sha1_driver b/libs/srtp/crypto/test/sha1_driver new file mode 100755 index 0000000000000000000000000000000000000000..2e9b0289723f80345169cc60125c1cac357d58af GIT binary patch literal 190768 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 literal 0 HcmV?d00001 diff --git a/libs/srtp/crypto/test/sha1_driver.c b/libs/srtp/crypto/test/sha1_driver.c index f7cb6ca2a6..6036022e93 100644 --- a/libs/srtp/crypto/test/sha1_driver.c +++ b/libs/srtp/crypto/test/sha1_driver.c @@ -113,17 +113,17 @@ sha1_test_case_validate(const hash_test_case_t *test_case) { if (0 == memcmp(test_case->hash, hash_value, 20)) { #if VERBOSE printf("PASSED: reference value: %s\n", - octet_string_hex_string((uint8_t *)test_case->hash, 20)); + octet_string_hex_string((const uint8_t *)test_case->hash, 20)); printf("PASSED: computed value: %s\n", - octet_string_hex_string((uint8_t *)hash_value, 20)); + octet_string_hex_string((const uint8_t *)hash_value, 20)); #endif return err_status_ok; } printf("reference value: %s\n", - octet_string_hex_string((uint8_t *)test_case->hash, 20)); + octet_string_hex_string((const uint8_t *)test_case->hash, 20)); printf("computed value: %s\n", - octet_string_hex_string((uint8_t *)hash_value, 20)); + octet_string_hex_string((const uint8_t *)hash_value, 20)); return err_status_algo_fail; @@ -136,7 +136,7 @@ struct hex_sha1_test_case_t { }; err_status_t -sha1_add_test_cases() { +sha1_add_test_cases(void) { int i; err_status_t err; @@ -485,6 +485,21 @@ sha1_add_test_cases() { return err_status_ok; } +err_status_t +sha1_dealloc_test_cases(void) { + hash_test_case_t *t, *next; + + for (t = sha1_test_case_list; t != NULL; t = next) { + next = t->next_test_case; + free(t); + } + + sha1_test_case_list = NULL; + + return err_status_ok; +} + + err_status_t sha1_validate(void) { @@ -510,6 +525,8 @@ sha1_validate(void) { test_case = test_case->next_test_case; } + sha1_dealloc_test_cases(); + return err_status_ok; } diff --git a/libs/srtp/crypto/test/stat_driver b/libs/srtp/crypto/test/stat_driver new file mode 100755 index 0000000000000000000000000000000000000000..753df31686cc1a167b3f12eb950fd37410616a96 GIT binary patch literal 84793 zcmeF4cT`hZ`|r<5LP$bMP*4<06jZQ+Sim-k1PF?Xg1w;#iWMc;3mQ>kM6r#|jHBq- zbsWdB7sOu1g1wLESis)KuDRc5pA*RV&ivlH)?Ih4`^U|!Is5FrpWU9l_vd`~A;P5a z=m-hVbM}vfYr#=$jZ(*wge%7t)GD#jaUq<7({a_fs+=5FPWaz$rxWk&VV+pb9x7l< zA1VHq(T#*I_(*iP;3LuD!g1xXS zcox{hL(W3f=qiNva@0L4=N&JkdyD1lVZPWgduSgYjg9`VAdatsM28r~brf(0b}b2+ zFOU{<&(x3Z^EwI!c^!4^#vaZT+p~xEa_v!$jZY}{U$6Fl)*GDMx8C4>bp|I7O&eWj zbV#E*jT+QV9agtKYM{C`_@A1LY%6rg?hh@}DBlzR(_B)1=bm-j4eNT)<#S-_g{0vb z$)i%t?aAH+{}=lo_Z+WbX>=Py?c|rSa?XE|S`YS*qHjFArR_&^VgG0x((P?ip0`6ftvmZi>yU2W6O`xgknY%@ zK!s$to)hF49n#^5;!li2x~e!8_U6Y5qt$6h4=rcR$TK+=c1Nbs zd`NLnFtRo5i!58Uez>YD>u^W$0hC!(V8f?cH;VHV&u8%t6ekxI<*|4xij!-KHnDh1 zijzxkoQ7HygSfuqKCiku zP9N7X);RgGH->uD;3qqT{38ZGj4^AmpA3nJRN--{D#689ii@8NmugP9RF~sY!x}r!;9kQ!ScJ;_EknDoUu0GiXlU)O{Ye;sD$gVNjg^*n+*)<`%rexQQ z?3z0j{`SRYGiDk5bV=&U26T{SA&)nPUP*hsF9jnqW)1e!6=pH3@wj{C!EyWQBExbd zD6cT1IK3%ou&;?deMoV7>C#A#u%~xKI%}tJH|{dS(b!=$b~EkSzD=+xtX5pk`nPr} z7N?)5^x}4$iqqFq`^D`%`E0Z8E1(+Bmpbs)d6fqA2&=6Af_eA8xr!l%tNSf1`82kh&Bi9vUb z=>)-i#nS3ypE1D9^D_$f}=V)s6_>vwmQQa!r>7Q=1&@v>SvV1d=y}9xB9i!52Z?7!bMr+VVPNtp?t(|heVTam z&T`L|-?L~OiWH5+Mc9`awlvABgE5vbL3#URw60w+#(i)mo;0}2?uZ3z`773F`AB57 zI&J8p=IP($DWXx*VOAq=~i+_InqdHArK`O(6ymg7HLK?iZdz?FgeS&kB#? z_DC2OZCE8V{Pake8n^DaeNeaoSys1goiXa;Y4wd+sezO#ho&m&cTk?u+QZMAcBz(@ zvVS!00x_D9gV|)g26Tr5#-I{%zzMdgm47CD)qkgm%KB=zcJXeg5X3LUP4(%PVrzJ9xy~+VCQb zqb#2+7c<_Z`DHvwGnzkE+5wVqrWQtP1wRHL8kz>9@@Dg6^;(NEL3x&|xw=4cMhlmq z?Tja;110_2N8Ky@whZ;{zz%wB(yCq`W%2Yg9+jl`jmNAX@MfFd5~HBd>@*1rn74G% z1m!)N5_GO8N?5E@X^Ehg9+*YyKbuAx!2YK)8iX-;l*W8d4Oi$bkByeb2CJJ56@_Eo zYKCXrO>6b{3Hy&h3Hzb&BOcY5tdl58lU3+2S$P-*YBFuJN~5z9w6qwaEe|YVT5Fih z66R+OQ&__MtzoW~u-b+FutE%0rwOP=XqSK)j-69x2i*k}TG+BL8jiuSeT$h(7n*J_ zG%fCt+>hu%VK|z$Hm`@A44Y{$S}lwfjQzxZs_k=tUF8kqM~j5p3v?k$G@1|8t4^#7L zvh*-_{vVf!Fkf(o`WPPk>SN%+qf6Kiw+a_Q9l^!PsFz$!0|b2t357kqs7bE~WQAj$ zETnEE3+7EkbH|a^g?Z61$Mq5Prby`+*LRMxyw!KocZ{-pW+DnJCF8ikTHg}wr$`G@ zZ;y0O+J8);-k#So%QJ8XoXSo9V6$=DNH1FI!ZSnPOW*sT;7@DCb+MR)>n7|8uhqEK ztGBmt&-I1-llC81uu-VDAIB`r_2f9cHLCzM>O)VD8fmb+wVYs+Z?t>~IA#pE1ny^z z)EGlAjclmjMXLhb)2p||d1>2N^5HXmU|Gw7DDzQXtj2OWD&ToEo)P>PW9Z8f7YqR} zg7Wkh*2I5yR`7o=TWzP!U(}<5Eia=j@5JYb<*fMtkH(_iw1EmzX66r?w1;mmiA|Z0 zXxe0rZ_MihPV0|m&=}}ruskkV3^HlJ_rv#GKCrh z)IWwIcymyy&Pc#2(Obi{LFk(`+%E`Su!j2wp(Sg0?VzwvV!^bdQCSf@8x()kV8!6| z=KJb2t%Fy{^>%f^RtoKB^){2Ag7F*;2IXP#2=jq{#W`v9fu7FfbbaWNQBT;KFa$i; zTbQGR@`|QFV~O(=bi61OvEuTypMkztgur)}O8}q0(efF)$`a@2TDXL^3Y4L%(eejv zom>pE*Mk$7?;NlaCy=Y zm#2+zdDa-0=OMVf2*u@PA6#Db#pQJZE`RmIO51elwnn2|s1gmf_!g1`2$y89E{?4YJn#B?$cte&kpOx0bcGTE#^|s@Bb*_aB&F^id zWIZ-eV4i)w7?k_Xc^KmnNv4{56nbD{G};nc8r2Mi9a}NgQg3U^Qw?Z^7mYk&RMJ4& z&up9q%P|@;hK&(9=n2Tm&#^(*v91)NKMWPQyh53J+q=R7EX2&IKEiw;S(uCyLMqJ$ zrhemRMw!O}9k4nl3Quwu|%|vWyAG(2ljiY-7R+ z^FylH(qML45h|Xv{!u+~Umm5$FLyK&o00;0AAx|5M&&lk3|$X4&5-WdX}V62l$!JBY|`JL>j zY$0_s?I}I1?VMqzLFZts&vGqoOgL_Joo#Vl2(ihB=1+R`XpcDV?mhp9k)yikgac9h z^XSkcskO1RLY&j;8u5&Kn;*sJfh(o6@dS0oLW`4Q;pg!oXVcuHL-W##Xj8HMBXXkH zU&e$tczl=m?}#(z^C(_bd>Qqc=F|MFmYq-SiusfWHi&%siZ`{=-?#f4Z^-mNcyrOt zn|39iWvaI| zC5jaGdvCMxhoeGoq&=}Zb#4pE1?ikL`N`*MNs~XS}2I}pn zay3CEXUkG9P{F4FvJhj|Z1(2C{@TK5e_ug2T3S1F<4-r3Pdu10AC?1vp81X%j7u^b z;xs(21`X!vecFvAb?4*so=2^WRM*v%>yshUGrY5yBtd^#GRX# z9aiVI!644PRQGW6Mm#OxrCQ@u26sv7y8B0}cA&R}%Mh%ax^8l$k9v%AB_&{dy-+qu z?Y}?Q*FHctqc7DSu6~69Dvm>Cu6~a;BxQGu&RR%=4LYZ1VphKsYStDDHyD$S%KXqA zh6*rHfZap^G%p3%@)V#l3LqOPC?y1tvJ}I)f&v^vDJU-lS{Eh7s&QQ2jYG z@$b)qnnDmbK}C7>2Rc#E;5@Tzl+IHu z#xa5i>Y0~?Q9<=apT$Vto?`={Whs>Y3vaN5b%;T-B3XBkWNlax4eh3-mGQ>ZP`&R2 zx>O2Dxg+cy!a=17=zrubjsvIWqE=!VIyyJQ5;R(_;Q4KBo^Q{<8MIKS>@bpo@^X9F zt1DcL%8H8!Hp>K?kYbzBjy5iPPd}4BJxa6gt@$mSngVfE^Wfjd6fUv^RRPxkd4lp zbl8NBn*8_}yl>3f;J2AV%Xl<{PO^W?yG~Lja&q zPzdS^K?5OZBm^Ns&_oDy!e(tLY*vG?StEqaY7};9DDx=*5@+tAU~weI0V{6WBin(&xOly%*8WGy=?+lIPnz@ zVd`yZ9Dk7Qc|2PM;2Pq2%X1CHBPpc*!f9$S~9K*4oH1r)Rd3a*Pr z8l;K_3&dNw!Gfb_+sk~OejldY=70r5oR+wdmK%j19YlpbQD=04fqAfB1zw#|0k?QB zaXON{mr!R^!k{KU`dp1bJNaXE#MIN9QXArNp^g^gIfole(4!*e_r_W%94peT)f z$({&u+^I9>q8fTCaEQ@UVU#;P3qF)W-ZW3-;n_d+68wiv+y)&1nj-2KKkxK=T#!{* z0Z=d6&YYZ%EBK;kZ*z-of(Ow1X%WJ}i%tn~@(%#>6sC0hVHZ6v^y)U3g<_7d3FM0w z6>~;!e#V^tK%HeqB3=`1jv(J$H#J80HsW5d-ghSVbIEoQJ2(z{_)$5)YASV)vsN4n z+l=dJt%ZENt)~rRuoO7FdNEk5#j)D&ny#Yu7<=uz|D*PbRQqn&)VA9^_z#=+aOI)&Brl*FdL&Ka16XFO3)?Swdr9Yq{3u(C^Lp>Q#oHx{zj zAe+4)Ep0a_oPg{sv-BF+>@^wL&DqkKb{Jg7S6}4IlZdw~v>_Btb^vjsfxXh)PMJZ%33X#^6BWqmFX5;A84(YH+&H;1>g1 zP6Z_m7M{myE*c+BuhooGbJa96y%p;fEcKm*8T(Rmh?H=~agz_qq_Q&abCVp(G)5V`^66gG;?3WI6b-)V0Y!+_t%VFUbzfCOMOX& zB;m)0LFf>k7YYrc2wejy8Exaai-(;t!$uKr({6f!r6@dKfN8K-SJHn=^MPoIoG+|@ z^|nYE-hf2%(ReY5m!tR@5543rh{lul9Wo|4(VMa>R@aO?gAUp?2iDLGAl zzQNjnr69pQf-IwjTo*&o3xl;biz82p<7!4;4DzggEJT{ZfIgo@RnAna(1IJY!+k`s zY_HhTB$XjpPF0~{6qB$lp_xhQpoi89_C}mp4r>Hy2x09??V>(|#W}dGjF#b*XuOGh z9*rN4zB2^n8-j}HCr*Wipxg8_ngUBZS#T#s&^21C$h>ChtO$;9H3S_CMqlxM!0~+# zs%QRF{+s{Yiv8Dsbq0raj5Opw{D&0OCHSwIkSn$O4{_wVFu&+T{~<)$-~A`F;Kb~3 z&s-t2RO~;Y8Nq)-Gn1SJ{|Sw#Ss~U4{3kTR{D=DfZ}`vZ%oO-e(1x?f>E|dBGWt16 zgo0jOM7Tck6gXkt&-3T-8c$<>?_x@(mr3ev>3P`GLHU^x8hWcF#xo;4=;cyztQ2B+ z`NV89BT8H4!4VougeEuwEqMk)8_{3FqqwFZH&G74&#pf^E|lL(e8R zARX@w_R%fgh+2dsHfXEs0$Ogt*q3a5M3fP|K`Cs~Bg#6YuqlryS5mFFm}&JC>cQ$2 z>M3t8g%qJ4ABPm7o{ILu*n!juY-m<^VkNP&l)?&6tn84&3QxpDvH@9}?WMvkgPUbh zX&QDZ`yg2&Dxk#De@jFimWdimTTe?TZ%i)Ds^0ugrOw!iCuev2doH}M#ZTw00NF=l zkh9Smp)dwT;)^3AHHEkFxHM*^Y4M~eyeQlQ__qp=3->y@-z(h5(EYE%eLUT-6z)^# z{yTQRH63$J(HTON9tRX1hp2iR-mb>tohq9!^|rY*eVIrLlZk1WbQgvftin2`JN#hK z9>ZN2pBanyXt8+t`nO7`)>ya9Fl?7Fypd%!+sl!0tRyoGZ+OG7eg2*Y<5;}j6}l3O z>{yq~FeHRwYyI6439)zsEL!4yZ>%&k44oGf;M9y98f=ghceLV-L17B^Ed>K!Tm8HL zmkB=9l9v_;_sstm;a*4S6NG!_|KY-YJf$ZJ_ssuY*?qD9TM1FS|C=Hz_@B8hj<(X= zJOm~Fr$~waS*+OqEJpr!%Z!DOg-JxBy%OeQJ~Iq+Lw;s8lmDq4n;TUo%?o+%NyhV&(bK%#h~kj$1juMdtxe2`YGD-Fxv9QV6o|K zo;TRfGeRGwJrqX4`QwG`0i%nh!Mj^ zX#Eq0^-I)N>xb8M_>!q9In|V$&}XpLl$dHt)%F{aJTh?vhi{+`>zizXm5NIlHYjm~ zR?F^3qzz5QExWJQPn*;yd2rf@#8hqaP$UUesL&WbupF8^w7-^`=q=PeY^WCBQmr#I zZSY`i-?XHp#1XZ%iK9~z6HH_%)+LnwxAOE|SN{OVVyS5f35ltx|I(g5Jho0y{g66Q zVQv1YkkHRm)^V+W%HYI4sfpUYiP{vnC2^=Jpoy0AA3Ds`2WdkSn`rxJQ|WuQ+N2SE z&}R&1SW?OO>;r%ghruH#rd1^m?FZkQ61AoQeN4C{YH0w&hGejl3Mgdwae>^sJA4Q5Lys~weW z8lXjIw1X3e_Qx%i_?Hhak;x*Qr}CFsObo zxtmrvbBr)lN)i@3tyiQase~zLQNN*YrS$KU@>L4k9sc#PY{(B(o!w6Rw^U|F zZ3sqMR(bcHCB?L?a>o>V7qtGt|5*LksX|v8{G+X7Ds9hybcB%cl{?s&gdEzgiTxb> zC5$DdPiiWX?aLgsv&|)-hTV!YO5TC*2lpFV!=&w>XktaQeaFBpf*&00{??)$P2@j^ z^+xsm%?=)@hba=9XFV7DOlIPiH;ovh9hx?zF91hC#Nw?JR^ic|MgzZL&1e3mGu|HS zxiOO0z47lc`+!%Zj@t3ZCc!osHWWQg2_UFZJW-tUuX5>o_q31L_wzZ{5Boj>LBuZk z_emWDwrL_U=Mu(`8uxP0u)~3T|5{%zuOE40%JB&wx<)?#`NHyF7OxnQ zxBc_H>W#j6d$PgGdoPAx3G$L1^*!kQt<(3;rPA*_sBe_s5XG_H4UWMPqw) z?v!ik$GsOC${t!hv3b9qxYSBH!60Gu2#3gsx3zfZ<;E%-fNwa(qe0pQToQcPs7eTr|qw} z>jjn>X*qm72Ydq%}+57=rTL}bGi9{44&R$ z+`H}TQ_uU3Xf3((XXV+QlRB=ix%rX5bG@wxq|*+M`~G}m#mYec=`Vfvt=ue;4&3#m z%#m-Z2(MP{ady5uYbYUm^UtKb4Q(?=!&K7ItgL2(N#vFTkec5(QUZTs?&}Ovqn{aM-^LHEH*Y`LYuxv=h zCG}e0*c|xEZCZ!NqxS!qU+cFrgV(0){LW*(@k3-$zp86K%{-Lz{G0NfCe*%CH8}g( z^r*H+uZEo6Kl8-$FN-d?G+Oo7g8U{Jd{P?Iu6ojTt@HZD8+{Kg3Op z==&zC^nvUvI|}QDzU?*T;4gnI?U|mNoIh{;u#0upo~c&qw__W=YpU^{u)1(@!qDqY zcaJ+&eYA3DSMS%4zu(TA+kL<0{(_;2>umQYR@rk#@yx66{;mf#827Ss z-qah}=2BMJvrTPIu4@x__gmSmC1Px`UfLm5A_Vb2fKO{pJU z^mTvhU$NWV>*qQYX*vZDxfEIY`^$Z1HeTjBw(C33S&vFLvz%UAfXe_tIsh;m0Ehwr z`U3!q0D#*7fCK<21pxd602~1T9smFf0DwmTz%>A%4ghc-00;m83;@7D0AMr#FbDv+ z2>@&Z0LlUYNdUkW0Kgjnm;wOA0|4OwKmh0D$QLz;*z@7XY{e z0CWZbY61Yx0Du$#_#OaQ2>`qV05$^vy8wV506;AOU@idg8~|7b0Gt83R0e~3* zz>fex4ggRe07wG>LIHqv0Dv3-Xb%9q2LPG_02={-2moL!0N?}w3^@&0QLd^nE*ft0B{`uhy(zN0D$8F0PTM>0AK_FHUI!^0f3JHKqmm85&%#G0O$t* zQ~?0a0su__fL{RsH2`o909XP5v;zQ^0|3bYKp6l)1pwRw0Kx!(iU5EM0Pr&auoD0{ z1^{FL0MP)zZUEpj0I(DQ*aH9@1^^lW03!i_8vwun03ZPXH~|1?0012TpalRX008d* z01p6Q2msI;0C)ueJO%*r0f4~(z;^(^2LPZd0B{HZC=UQ!0RWx>07n6U{Q$rh0H6^7 za0USI2LP%A04o51y8wV20Pq6<&=&wW000yM0KEW!zW{(-0AM@-uoeLL4FG5g0IUW8 zh5`WN001Qb@EQQ%0f03CKq3Gz5dcsC0QUias{p`h0N?@ua0vkT1po*F00IGkJOH3E z0I&)G*aQH00RXK4fVTjEI{;7*0LTIW+5iA?0KhE(;70Dz|eKtllF2>{Rx0O$$;d;wc0N@V*U@-uY4FL2308#(|69CW> z09XwGBmw{{0DxWqz#sr1902G707wCV4*3d0KioMU=;um z2LRLs0Qv&}4*-B~0f0FGz+nJD3jnkR0LlXZy8wWi06+l%P!<4i0|1T!0BZn%wE#dl z0KgdlxCsEn0|3`i0N?=t_yGXT0f71d zz%l@!9sm#s0CWHV{saKZ0027y03!g<4*-}60DJ=g)CK^u0f4puz*zubIRM}S089n| z{r~`G0RZ~|fFA*Xxd6aP03ZSYC=CGY007Why0H6*4PznI}4gi<{03-ka zy8(dF0Dw0DupI#S9sn2$0Ne)v&Hw;~0Kg9bKqCM^2>^@-05$^vz5u{{03Znf*aHBZ z008mvbE0Kh{4pdkQY0s!;? zKt%xH901S>0Eh$t`Tzi~0Dva|&I{7-=VzX$oh5c0n-AmqO<mj74Dvr7^1mG9|0T$O3*>))$p1}{|IU#A4ja-{2veb|Bm)Q#2l?*``9BZxe+%Tl59EJ3p`J{x^gCF9rGU4*CBQ^1lw`zbE8>XUP9wApf62{{IB|{}%GU2jss2 z^1nOezZLTTcgX*3kpDX%|1U%Sw}kvJ4f#J6@;?Le{~YB1M#%r8kpC4S|8GG4yFvbs zg8Z)q`M(zO-vjbL67qiyiPe{EvhDe*^iS4f$Ue@_!2C|5C{RWXS(vkpE{O|BpfbYass%A^)#K{-1*U z9}4;Z81ml?`F|hse;wq170CZ*kpH_N|64)+KZN`bfcy`F{I3c5e+2TsA>_Xa^8XX$ ze*xrwFy#LW$bUWL|0Kx&vXK8HA^*c5|4%~x--Y~N0{I^e`M)3XKLYaqN63F3^8W+m z|3}FG-yr|zLjD&){ttot{~q$cG30+&$p1%>|ED4Uw?qElhWsB3`M((Qza!+oH{^dR zwA^%T6{_lkR4}ttY0Qp}A@_!HHzdz)^4e~z}@?Qb@e+BZtALRcy z$p4Fw|3=9F{38hoE8mSDKlSOTQQy58H!jQe@}=9QL4)@GF>Khca}FPliw_Kp!S6Sb zp6=g&ZKqnbCOr7^rQFubm;1I^zyAK?kt4sKed0uTZRK`!Hd`^k*MFcx~?5 z_0g=z$m1WMKX=jp{PW}AE?nr}d-?Lu;lKRy(0B3TeX%Q6yuCYO#J4}><#kWnzWu=M z&z~zapEqw~boJ^32RCZeZQ?iI=>K~AR$@MRvfY3N4SKX+x$^bdd-oc=fAK#tl%?Hd#nThq(y8-+~fy5Q*14iUb-i9a4Z*elT6+rRO*-!4-*IjQS?|NT~XXJ@5f zsZx!6($jyqb>~j=Q;!~1Z(E~A@}$k1Pd!XaTUtt~^r>hzFX>Xdwy8n+@^u^e_|&;E zbm-_38~TJ$35BRk5*u z?L2#S0PWrVPoC7)X|?fxe)?2-%&)&5+t$7NlM4d}=4So=dqn@-+^Zu(LtD>p)#{H$ z(a{$+b?H)=app{`-TC>04nKQVv)#IN_nv(GSY}#S*x~Qnw7HxV9Nf_(BV+!I@bEK5 z@84@=5{dlFq)C%=Vq%_;Zr03DZRyfot=Fvib9wvruX_IU)0cFeF3)N9>>1z8o%?f@ zAAj7F5)xv3@z-Cnggtw1joP+t|1a0BrM0Y5B|)pv1m3gR%71?K%6;Ftb3-PdIu-5h z>grj&bm@i%A3v^_+q?Jeh6@)i&omfL)-78$bl#yuoja~x{qobqiBrZlZytH9U%w5z zdiH!!zg)Rm_fu0BAGt)dXBI3l+ zr%wY0?bvbN-_x_%>OcM%v!_?DJ7rv4D*k-^`pD}A1x@?auiwekq)A&(m8#O*sHp3% za=FUr=Qnsqj~;iI9yri*@A>mX!!~SqcBpUPRiSg{tO;7MV8!{ncN@PPGsb%H!GrqN zW5>dVHg4SY+K?gJ`K+v&zh1o9Z*kkU=c3lGEx0mx@RkjoI(>Nc`nB_!hYzcrNKE|Y z_1LkqA~$X<(kK+(!*=bu_q@;D(M&lK^ zROC@*PFDlYbKYcoC zUB`~L7=QoKD{tKzE1fxWcGqRg-YG4X^zv?QWfS-9yLS2h{h+BWTOP?DFkr_Nz5Zap zci(O5R;SLWN@}&oxJ{dWUlSMiX~^!~muiDq5%L;0H7fNP!9mO4FD_$08Rn`p#VT< z0N^D6Fa-dJ1OPSw01p6wS^&TT03ZhdSOfr^1pp=i07(GAL;zqt0AL0HP5=M_0Kj3a3;i~c&0Duz!zykoK0DzwWfZhPWdjKFG0GI;+bO8Wr0027yfDiznGyw1$01ylS z>;?c*000XBuo?i^1^`qA0OkS!S^yvl0I&f7qXB@i0KjYj;2i*v4giz|0ImT5K>)xJ z0AL3Ia1a341OSWz06YMI-vNM60Kg>xpa}qw004{!07d}-;{bq{0KgysU>E>!7yt+a z0C)hPKLAh*0Qdp`Tm}Hv0{|ldfD-_~6ae5j05Aan_y7QO1pp!efad_f&j7#$0AM)) z@CyL27ywuS0E_?t@&JJC0KjJeU>*Qa9RO$q0DJ=gyafPG0ssvFfRzBiJpkYZ05BW? zxB>tK0RUbAfD8aQ3IO;500#j8Zvfz10Kf?V_#Oao1^`L{0OzzhJ?1^~(f06qY~PynDC0FVO!bN~RF0sxl)fZqUs007`m0H7WKFckoZ1pv+h z0JQ&~003G5;1dAwD*(_P02l}W{0;!*0sx@^Kq~+s8UW}50Gt5;@&SNn0Khr`;3EJK z1^~1H0D=L43;-Y;0C*1oNC1FI06+`?& zb^!pR0f1@%KwSW!0sycI0N4Tm9033d0f3tTfC&Jo3;?tS0QLd^RsdiI0FVLzv;Y9M z0su(>fDr(Y0swCS0CxbO4*<{*0O$+=>;wR&0RZ~}fQkUX5&+;f0Pqd~SOfrg007AV zz*PWX7633G0Qdm_s008^2LOryfYSg#M*zSd0JsGJ%me_I0RR>NzzqP{2LRj$09pb7 z0{{R$0Pr0EPzL}|0|1)e*pQv74p9gnve{@;fDZw~n%4f#J9@_!=a|6h>*X2|~mkpJx= z|Ib4HzlZ$41Npxm^1mo_LH_$d z{@;T9KLz>U7V>`*jy?{BH#Le*^M=3*>)y$p00P|05y)w?qC< zfc)qKB{67r&-wyKs3FQAY$p7yl|C1p9Js|&QK>im&{>vc$zd-)yK>m-0 z{I3T2-x~6NIplv&$p3W6e<#TQZy^7xK>nvd{=b0yPk{U%1^NFAVoyFmWWg#14W`9BEq-yiaSHRS&u$p12s|35?i zUx)nf2l;P;{P%?Xp9}f#3i)q@{NDljzZCL+FXVq1_{ue_2w}AZr7V^IjP{9gz89|QTn67pXP`QH`tUkUkN9`ZjC z^8YgA|5V8Te8~SPkpBUY|J@+}D?$E`gZy6u`9B2mzjg=Zz>9&6R)*};{j_BAtIHq9 z{~0>vhkCZ@4Q7QI4*gN|d)&DB^;aG6ZT>WRflJE|2iq#@E=%&i>bH4h_vKMTtY@o@ zc=x8?v;m9CTv*ZLWY5HHa|fpwV?ICGd99aMMCa96KTgfQvYwl{=e+9e-7Zc$ehZi9 z*RC}C#5Zcm{$KV=`O-56HJRg~Z`c3E!-X%;oPNILe(JXyOjRHJ+%V(L`^JS8(ryin zd{KUQ#el<>VcYwm%pJXurRn_hs~{Zm%ofToat>d^G6SQkt$c(jWJZ zZ$D{mxvj0->f9Tty}PoD8#v~Hd_~jn-FFq%-LqM zZ9ZDSihj{-t*a!c9AEws?vo9E~u259|LT#?imPc`fR}jYRL%*C*KSFPW+C0=l;eOPEkULq)y*$9szj6Z0z6(Gz*sF9Lqke>&5XK9O_4ykMJGkUqC+IjDCPLQe0lnI=IO%+g4At)#EY z-8;-(qjy&r$Xe*{NrYOgxqFn*%Iq`~zlKWE#$7i}CK;r1SF|Kc^1*BTPiwOZLaNs+ z>FqAMkB!?CYxW)T*|=MoWz(ds-L*3%!%&CVnlSEWwAQh@>?9zMo8?uwc!!SxTB>%2}oe_J)v7PZq--C1=(syFdkbh@O z!ri@RNn5&Wvt;4!{xhBQ?t#tKMtc@})UjXW-#Da?M!FvNT)0`<7Tu5x5nN2=Ovqn@d{@dBKa@Tb={ZR6 zYEMK+>tF@a3z0sG(lO4NG|p*Kqr28Dle7_5LR)d&P(2r59|Bh3*K-wrDE%?gbx5yU zoGOe%hV|J6>4zQC+4@JiW|z&@jndirGtl~r!1}{Nj$q4=>NUX52)kH^@|4~K>Dfph z_EowG>4ivt>5$$4_cM{6zZ-j=(%CrC-Za`T80R#M6Mew`FuEkO+n(f6YUdEjjRyN7 zsGRtr^czUugmm`B2#567NZ*08E2ZIM!2jc6mjV`#Kz{`Pb|U{8+~cK9B*hzC z?=sZkzPH0Y)f0{X4^ewyb{(*o`scV0TK;_>M7gI+q(LA~h~YohHRDb*RN;wwGLP77 zw8yBvED5&DO!UjnEtHj@BmYS)fiH0=e+=cPQ~9>=l5`pa5N&?iA13679JSf%Q$BcU zmLwJPhvscQ^1C44gYv}>mD_;yc%*Nov`F^?UeXILZS5j4xGSjKN#t{Q_I$k`?;`yj z$~6QpxSq45S+bcRh^1s<_fL$P-krpc1YMOke zQUy zq}V4@qGO@`-xCaEv69~@?k&c>#LylP;^_0dPdp3lYx6ma2^^y@!9?QT#T0z^Tp!-*8}_CE%>^jRpPvE6T>57 zcu5TJi{TqFl*@IjiZWtYT?`wE;n(&5TU_TR)D!P2gefjUs4MmNFi$1gCB$=%pMt(Z zJUu}O9rNhk{_NEy#8Z^h4iG~Y!{w{EHbKa@XBV{iS=sP-uk_nVzYe)ttL>I^4NI4) zCCPtVGi>>nR=pRluQk!DjQ_@StJc5u%2b|d*X;R=m#<#`_2%un_a8of`pgOcP6q!- zr$7EFf%uPYv_tR@t?c#N!;nCo{q{dXS~K)Ntyz0W_q3+Jj@#2IPxil&|Fyln9F?WV z*?+75zm@-Q`CqqZZ;ezxYxhju^OL%ZL;j@#4i ze*ACwU)$Tu+5P{2TK>P)|8;xzc4_YI&luct>GgFK6o1l#b?lyOBE!P)kB{&dSOT;S z>NduoZfS-@TDbNqazuEt7X(Pv$#s+|{Fw-L_xB4OIwYJK&v>B=cKDv9Uj4&IurH&v z+vkYzPNUKM!$+{MhxZ^t{n~OmW;NdaRR5}sU_Ys$-9E=xus`sXojoep_ikdhPw^A% zAJ`4P3I+RT_{UvBf8whN_8=iAQfBCS#pCY+P^CDF^|Bgi= z!2}otm`7BZXnk6~~AdtzN@E2N8z=;mXl1#FjIRsTms=}|*EV@N)2Vm-? zkSo5UC@=qrsN@M14_uEF=OWx*ar!(GJye`Sg435ITqVAoauJf8r2ISRoW-cWayM115Tk+0hUlM@QjCTuJ5jDmjOvtb7>$#w z7&R(?fCHV}#AuAN2Swe*Xcy&GDy!kQpm~XJyz)G?TZ*S&9V+o1pgcv!p1d%k6y-I_ z^%kQhZg<#+JP>1fEQ8SA~&H;-4=CNH+&$@5a*Lp-Na!_sNFa~2Z3oz{>`6d_b*t>7Ij zUK-&#!8r;=DRRz6!8aOCuAtxTBv;U)aG|wA<8qyW8%m|+!BX$rQ%fV2Uf8&?b)|5k z)0|`qX+4%N7N&}(Klk6@&@dn6%O?Xd=>G#*xJ$|Du`r94)_vb0A8 zTJiMAfsL0(Anwa}B)}nMJ?Qt0cyp5V2o$}3LUt*QV(xGhFFkB1rE!gDJr@md8Qe+ z*!GJ0fSNMv9*ZdyL6kS^7Z%efs#4x;Io0OttuUhwWwsF0Dt@56In7y~zhW{-shlhH zFHq5u8W#H=qPT;ODd)dnmO4c|m0R$Z#f+R}0cEy|K!b8cG_KA8aErI{N9vy92(`FG zffCfyu1HcYrTr!GMNi=?Wlj={X*fx5%8Z$Xt6V`ZY&?0I?zOn{Viz(*7CAsdzm`nd zWf!x}E4C$Ccv0Q zUev-gYE0rAf{s#eB-91vbh?!*?z1bcQwc3C<+saml`B4z9nGL}1x;odz6eg^%kz8? z=CEukZfRCH?{bLdsC2mHxP4+s_xx|jC|3iQ5X8!p+3K&%`0^}&D)N1{ig^dHYL~#a z0^d<7r9TTpp9*}O^cCNct7vcF2CQJg2wRE&3H{@%GQ8ULkNuAv=A$$}6xNmfFciLO z65{8u<0@aL(Nv`z7i4J9Vzj)k2~p{s^ugLK7#ilF? zSHP$``HAQK5;(p_1}lDSkRQz>?{8(%fFhdWzZ2Q7p`%*dT{ueeK2QuRF0% zjWjX4BZ~Q0#Rv^(mfd!f-PUJ;m`wv(Eo9UDa6Ugdv~k2%%QvkE}d>~iD-_a~wjO?(RcdIkwj>2*nEoP8=ItUp`Dg6yF`k+e51YFxoRj+xj;uO)A)&|?o^!LGp zk6b~IS*E9m9RV{CJE#PF-LV{4@()O6lBgo*TOWXstsxD_^S%Lqm~5>WaU@YqJ_KcC z19`?no=E9M(yta*n_r1g<%{o3Q(wFYI$Rz8C=y+{vs5jm@U#|K39c?*7Ol86X3t-q z=Gu#%DoCeyzAjCKbaIY8y_FNvn+xf*zlHRAybAWJablP1^0N??y%d@oPiAz%uyb(b zW|zW)hnt4}D1;-}D6~mOusoHH^0_(U8MG!$*zrqxksdMP@$2trD;%*%-s1G+aQtFo zR~9&g3JHfbrg>#S>;NE~+nDr~1=G`BJi;*rENe_nu@jrq%m})zirzV8(XGRY?HEOc z6Ps{MlYjo621Lg+`4^l<>2c4FX>uulfJKF4np`GEg=3oBNsJ1|G`U=i3dc0LvltbQ zX>x@a6^?0gr5F{CX>yeq6^?0gS1~Fa)8uYqR5+%|-NmSIOp|N)E97in;g}{b#s9&g z!ZA(m$qOSAj%jjlF)AF>f06PzO))8rck-_S8_84Ac1XV9Dr zEf5-)>rUKIDlHF|s=`WVsiirWzQ`(XkE=O19JJaZ>dp>YWavJU9khf*cF^j@QrSUk zC~i3yIwMmes}l#UX^2w}i{qfR2=R&bc=17tT9s_Z15yz(AGa=KvBGYp;?y#wAq*Nx z^BAQ$4LgHr*cnX2&R`mL2Gg)Jn1-FfH0%tfVP`N6JA-N18BD{@U>Y5&an-Ohn1-Ff zH0%tfVP`N6JA-N18BDVZmZdf945ndcFbz9{Y1kP|<8TI3_M#4>r~R_1r|Yp#In8Eg z5KeO#1CwYj;9jaZfU8Wi3@J{UU}z(`rV~<}HBE3;a2^`v++R_=6pnDpdE&-pM>ysD z1E>%>T{yxi7f>r|nX1KQYK5v}8v()y#vqwIAVB zS=Fcn9gKi!)vRYMPdLJ2E)l95BZ+#jvg(jfNGR0i1m^LECJOZDkh=R zoGNu5Zt)5ZSD|AYamSiq)rhA#)x=t~T@=sEPPcLeozCP6TC(gkr~38| zZsiIim7vp{Y6Z=!N1=>cW3ZL;OO`FTj;op`n$><{!L7ae7C zN6|liC5o5BY08P+jY50nl1EZB4;GgYEzgcqa(+DwDemJe7C+{JFAE`&jxVW5uPUY& zAbqfq&NqfQQ%dO%fwGT}&Y|p7u`EtZ6}vl>MSWtqW%hFLD7jCrAn#P-3o$}|6&sWN zr<@(dpL)`_Ci$mIoH#M2RW!JDNU6+Dh^uI6(*aPsk1ANrTs=qUvqWtC13F$AMTG&8 ztQ?PFt#!z4F6NTl6mkzaP*iYaLx-}b#Ih6M$QXyRC61)OEh>B}@il2h%wW#5|EPGfSZFSM!}o=F zB znTDird;*o^c%PSIYvfQ@)Lr5jU7(IkkkWzHa7C5)L-a(U`)o|;Ke?hB|Cv0H!TN9S zccf@98KvNV5WAm2-7kyo2;I-1PQ*}@b)Q8oh*r0ks%051yM4JilO@v^B4MH1%7IUE3Evl}Um`hY>Ev8e=Q-pMJ zG1FfI6>9G3Q1*MVEVf?7(GF!xdPIK~RQLq&cWFwrJfALF_E!seK5!}j*-b#3mZ5DN zl4>%iY5Be={|xb3oM^8R!+|JLp5FBEb@^#9YKy6?y$_Ap4V^?oK9G-uZJm7N?Sm0l zm#h?GuF7r|#4`)32END>dr2P5L}}U}Ba1!gEfyjV=7_oE!C*0+Ja|Y*{|^sFI+VR3 zmL;zCbtwB!9<0YNCl7}3e2Qo}N(^a5N4X0Q3}FuZ6N9L3&*o|6p+<4h;-v{5Hkq{8 zS_==Gbg`aL@$^^$_WXBhp~BXz!c9~?eormON3$Fga%)~9=STCT6qFkKjJ08hgqDbx zkD@l(vd7(W!~^lJupNtq!aYHKIX;G8ih61-7297ehOS5q?A;rWwpex|BG@B7+8(cn zIpOLD;?k(tvJaN?IMhM*d`g4SU$U!LY^yWm^z&x1^cf!)CG;zTDUVztNWC_p-T@%<17XLade^EUQo(xg?b~ z2XzFmb;RtIq94V51B3P`ji&*`eks%hHo18yCW-BV9Rz=V{4%(xbrh04|}(xq_OUzvp?<_MK@UB_0NC2nUV(5nceZtlr(4>r8vBqk_OW=)A7xewB*f{tmMs<%<;{X zv%-nJeGuPFDa0=j&}#|hIaKFle>0_8gd}`{;5ZU-c2S96AP}M&l{4i!iMie?@e2e( zu2v;}fk24*tHdu52+=^5_yqzX8lvh%&8ozzbSm)+1VXM+C4PZGh{mYIFAxaPE~=|k zR>R*yZzR6)s`KzYzCb`<*uWPERN@y1Xaz`oQ&jYWKzxBfh?-R57YNp|+|erW3k1x| z_yU1S`~pFDWYe1|%r;7E`A4Xm-b|^)FA#iW@l0MNet}>sv(M&L;ui>xviKriH5F?G zUmy_TIlM~z0)Y@;!>hzE5D4*2yh{860WC?X?+#uy9Sz|N1k`(aGo=#0K)|C~_5}hL zK!|f%t`NUKKrT^+P?@!YcQ_?S<6kE@N1+tHKp;3ngYS2&AzQ^IRN{ID7aEsa9&RX= zmIq7qKx-_uH0PR(tSa_6eFZ??xg(DS1~R5pSmC-4ar%us>~ZnUl)MMEs^On0v2D|tL--9y`CsjQ3w&KwmG?gP zBsVuno7^T%nzm_s+olg_o1_n*(3ajlfWDBlP1>|TZ(cVKn-{tFrY%BS%Uc~x5p|ql zngWU-MJl2qs8bOYAEPMB!)Fx)b8sx zV2-9Cck)I@SfIekPnp%O_oHxkurSQ1sDdY3POrhW;yX{6@#5twa+GwTiN2LV_Pg9rp%Znr3(R0tYnM6+E7HY0XKi+u#?IxY67&PS_F zr{G!75;prJ(MxkP{t=n4feF?7JXJ3m&~h4>PG&vibB}_)R`<-P-a1<}Q>ini8>VkS zLOas)brqw5)kr&A7r^>!0#v6@BCk&O&b20Q+nE94T&GiN7BnO^FXduS5&K1fJ4M6m zK%f>A#q~__GEr;^X#KxPxhBXy363SFkb2WqORLF++DPp}H`?6-EIK&N*$eKbQPOcL zY0h47k4Y@kqrhT43KY7>+gpene|%>eo)(fPQOKZ(F+c`ynuWa`+y?q)iTQBaC_TRPR-eH6x_AOCQ(r^xLKKN~yP3 z>CFh`mC{E+j2WT4QfiXkE2Spsy;5qD-Ycah>Ag~FlHMz&Ch5IWYLeb7r6%dUQfiXk zE2Spsy;5p+qIU#K?gC|biQW+` z(K~`AdPlHC?+BLob_9ca=(!h~c2E~B(K~`AdPlHC?+BLY9l;X4BUqw$1WWXeV2R!l zEHOKRrQzT$lQ86ku_G8v+Yt=jYW$FQ1cM)>QUbRjA`~<)0!J`J^_bw0nP^*}>=YC) zJBlA{Ezz46&Sae@vE%UMDCMcpY-BwNhKVmCb+=glK09CC{iq@+C@6Jp`Kl zNLH?7_L)FWI>-qccB^PVql)%H=+Jt)s+?`XVO4~$ugEG-xqijNS*R5fMf#^0@@FC5 z>BQ8|D726?=$M0P5XQ_!7xWrBP9damwAp-O(xY)LGQ3SJ1&JzEoVTk zo<{8?6@P!GF-0?(V)+70v!9)6l%fh=0*|&WKqtJ@g%-fVR`tYclO)1K8X=wIuCMBk z`)EF#Mngxd8=BXAG>@dw(0S>Griv{^W&J#jhR#bjG#C45Tv)*>P6wpxYtm^Sjm@Xi z%FU&lZ5fz#v*Czo=P{J%Jf@rNWoDknSF z`WpGtbOgkT7lC)aPEFc~}N_TLoUjO?x3CBxZhbrhOUgw|4ciuxn zbnp2N713NPe(_!Qi-X25o?yQ?X#C=PCVA?hag6Vqfq4OpMhc-v<{!Q7;H`P8a@Gt(LS45y88HcJr}r6h?!Ff;F*)o! z6*Dd27t#pnENr?!7&@dv^);dTxvDzhqkk!lo=&&UrvI>yz8X^=+t@GWr2ndqeoGoX zopqfp|1}@|a2oxHttf4QR+rB*{A7~jX_R!{HC?DF?VnX|n-!&`BFb;3QPL6DbP44b zXGJNgDPK*aq_e5%Vl%%mD@rL%NbiVRGte2;`kGY5?o7qnd^(AmE+a@4_W`CYOWiRR zs~OHP$elKP($vKal10c2a%VmA{uihtPZ}!f8ao#wt=}hZb7;=@S)^wo3b*T2#S)}& z1fX&{w8#X~)eS6{dgM2a`dH~#ldjIGvRWF2Sgmp(0T-S{GvpAjYR{q>a)?*8Xa9)Q z8b?DT7J-jmxQx178I7EC@m&pY2h;?R@qGH< z0qTWT)~>B43Q91HBSPpB_)ot3m-DZ)_%E<7gkb&)ECPM+^O0@S-sj7Eqn`}%ecz3vtrSk@E^UY39gzMVvHq zOZ^6o8s)# z6*P0?yy<%B%au8DUdH=;c@gI!$oAgn%d2r7*J*yAFK>}^gp50z=g4_yJGbgI&yn-a z;WW>Y^Okd(=g4{Ia+>GJc^U8X<=ItJ{byHs=R4og<;(kgdHg&?u5F<B zY37-qHuKECm3_{kaA-Z`g&=9F|6JzW(h0$0xA5{VMr zOhxC=3)L`yNqUb4D=zg+E**W&GN`u~yj5DWUefFe;3n?!$!$!NP3P6q#TrZ&QOH+pKs^EZvR(j?;@cqCX6Kx!CY(Q> z2%+2m_4pR}22{$MPYk%67ggXz)neLk%67ggXz)neLRX8Ei5vLYtimJu57gbQ>oUhY2I>odXRbZoPG3`Ya*r-}edr<{8 zsut5;RDq4E#k3byV54d=?L`&Xs9H>WQ3W=t7Smo-!THX5kmjFG7^+MTkFI@_|mXzv6h*G@>QK}aqO7$W{>0O{KFV%|>rFs#fR4+o5>P3iB-y%e4 zPYfDD(+*k#DAkJ)rFs#fR4+o5>P3iBy$DgN7a>aZB1EZPgeWzO5P{X`M4|pdNC-Q# z0pkr7sntP>>m;#1g5<=Ck5amW;(&Yf?t_)9n4g}=Cea@n-F=XzjK3zT4>=8-E3u7~nhMIv zy~Dl8*KbHRsfv9>y|Eq{Sdi^)L0RMnB`AYKH93qIs!d|*GsLt~izswYbs4T|=WL*Z z3El#{2_mPF+-c-B(3J}H(e@}|c+r;r+WIZ*=>O09EidPewSKFuEOS$Q5}=W6EPreAKkK*fbp7y|>u*hh z-rt%8o4vm^3GVX#)+D%l575evwbG(-gkVkkbyj(>Os<>X-S~gT6VXZgueH+L9Xg)cPn%P_u5$ zOXYjW4IXk{s>s7`@nK6nY=gy)mW6B~uOS|mg>Aa&9Hgskdg^i%Yu*zNh7!`7+(Y{7xYCC$@MxnJ z%XKt`du zZ`U=vdj-Y~EL$|@(_+9cC^dw4Hk$Hpf`=_w30#%aKo+|p-x*=4yUsMyQ^n{)veuELlS!N4*RY?JiHzReyvvq;{NU-bkHBFC|0v^kr0w%An)ii2`P5 zN3IN#BhS!oTp6S$j%bx81*tcn=JZCIbD+R!;Tr#VL6kBS{h^7o22U83^fdrbkepY6 zto#C%a-e`@tp@E(GS9D=`x)kT-cvwdOrAyWwZ9icvkn6ICV<(Qlrlpf4?C(_3__LmD(nuAz)z;%NTxmy4Vna> zY0&e04SJrhL03qFt|y+G3!Ky36f((}uon2TB5BZ@b%S09q-oHbb%TBn>6z5(@r6;e z2*MmsQJiB1P9fTn-Xop14!|V|XtJgBEicluLhW z;>(SwIg@<3^tUFyTr}uxU+$IuT+^U+zU+^rXH$c&@MS-go_!kG7x}WEPS2(W-Qmmr zLwYtfs2GH*B;UI&rb zY$SmtlN>9q6#OAkD4gfZnJ^y(Riox*HRygyLY4s^4=2 zuRRtWrI+HSNd{t$zqF0%a%Z4ewlztQEVD@nnTaGTMY*$V5>djEt{%4%&rdZrm)^#~ zLYzph#=th$CP~yhsD~BD#i-hRqbb$$4BZN#KGRbz>+h9Qzym6sF$KV%vsNx%< zC6>O{;w`eSRGGzL^kc|G{?}L8lE3wXmxvt;&!s2`r{LWWq>B;%Zt@BMZ&R1bP z96l%>xUt;&px5!>gMLG0dZYFWbSUkU+_s$jKjD);ugl?+tfcX~S?Mn9^Gnjr=auA! zbG%v=lTYYc6>%S%YaH=|YsZmW&a)0{e3aew3{L_aD9tKovLbAT1;y~IGW=}AyrWj^GzCfQQa^h}?Uq>%>YiuW>a89}2t1Z) ze?S2SagHZUo67XH<$k0=olD*FJP!}682kzk1%3(;Z>OJ8Ob*V4i~*ihqsaC*3>EI2d4Tsk*v0{cbbU>7$JDP5qHD5V8)w> z&p|QX%p^QU0$%~pC9}^F&o=lZjZx&6bNmR51%B1jy5Kx7M>>}%guj&W{2wKr!M5S< zaHe%$s_+7?Fz2R?8EIYC4jsAy({!ozl?a)2KABLU-d82vr5F1V=#w&(EoIfX*{BZrqn;iVEsbo1=PPL*fFNej4|b2J6g9F=fp517NEAOum+)I zrFG6pCLWW&RrzK%lerom9dt4RgM3 zWCuEsrkR~aJ0YYtB)j;#H2R>w`FyQvCzv8r3dh5a*OcIYdyV)1UY8nscF$At%&{-b zHl~OJdrV+w=46>KNuA0J>2~6gDUGHbGLxj%@d*d}B<_SC~NK80I=Abg! zVC}pBj7L&mv2L_V^b;)=lsp?XRp}O9l zwz{tN_PYJc&yJnFY*DIzZ~wr){zbh#{i*$ny82Uf`g`kjJ^k&yDV*t`c{owm){{)6 zVHArOYL!T~CSx5#J;U*#S}bJaW!_{*N4&GPn_lTi9vF-#0Ae)}=$-+9Scif_0ur`A zY0w?55XB65-oe{^zyoOS8SI8|4TB!shMr0`*p+Rmp5El5o_?%d(^VKaUKG`kJJ~6Z z&w3iZ2m2HTnh&hmPSMaK|5^TjJ84*AP0WxkLIls0Hid-BDz^?t!FR+#FhUhnsxG zz2aD49BNH}CK14&>W}Ry#=dE->}&V8;XPTt(i%_1dfNMppR^r-i|%V3L=!?q&uiFK z#3{rfK;m?Hy=0eB?6ni6-~jfHQl+{kMl+Sa`m+cx^B+ zyYhAd-Q>gWu|t97&Uf7dn_Arcn?}}MbN}_{UU%(BzsUI^@*O8Id!oBFu*#`vj9zx* zf_?6WP+91b*2~?(O{tx31-XXfw&^x>+``bvkH5L|vdyVe7wtR$;&S)v>J_)}7(B-< zYIcV=xfPq-T|C+9^2Ek1rGJct3$`2z%_wpB;L4srG|}C_#gy!To$fEx5%-Qmp-npHSTImC@k={*t*Cqdu3I{~&#T`Mnz3i~0{2OkbU$+_ zlmt;A_^|#Z{|+popH=kpdAF_Eof#@y^(pttm3!P>C*1Qw&tH>%xqBYI)Ga;XmXD-T zDYyBAyQ|rKTAgsmpZL_qI`@j_Nls`V{r>Q>mwr_Khi{*`DSGb3m%bV(^}PQX#DcNn zWM6Bt`)$X`9GxdKPFk1EijrOsgzt;L`@$r!mO0Idk)wlMS(E_f{s4>N_qpSmE6xiv zOx$(d(hKIh`;+tQ$TmT0*+B3E+FD)o>n2RgxW&mm)9a@XyH_58Ge%arKXgyHU%ToA znbavCbwA@Caldud%KPf$ZsC!td)<$@Pq{z4>O^R^I|{<*u6nrX0=MYcs`D?ZcT=0( zkGjuO?s0P6Pq+^w|JZGA(MoqP>6TN34E(`r5W0EqaA-ExeJQL3-J%oc)DLa0Te0Mv zC4={(tbL)ylXjuaeV6+kHB$9nwUx4WbLYriOY}g+Ba=6-dd$rxe@_2^zfG9z?`b{H>_H*YDHIv z#_uz8fC+ja57>tO{Nn2lUt9n5r9{+tJ9R0@Xm(2ii=3GU+;eN)-cGlvb9dm3^1zw& zj|c*b#=Dg`t9i9Md@SY8+I0KJ-0er)MYZnsr`+0=?zU$4E2`Fg_|PWz8;Xi`p4MVN zZbGKxKC7BTsiTAoZVI{=2Ie_#X{|fqDYvB7ZF=fsp7IAQ-F)o!rX@Qc z`O)?FU+fN_AUoXuX?Od>_{4VH-TpjG(Cj_{6AX^HFQ^l*xz`*rrgyJ%LS-m1y$u## zi`fD+dn%}H6{NY56AW#pTO4viWquQV`suhkIdtS=qdE0M&{E$7?G>-k-CccbuX|hu zvNQ^vU9AlwJiW#|)RV2CohGTp1u-z<+akyg-C~$BG%N|}Vf4e+zBCbZn95Cso^neA z%S=c-5)90m^zG2-HH+$WBnfi47ZAr9`q}Olo^Vr-2MW-?>D^MiZw;RxtFP~k5B0}; z-}YGNn;XhQK;~FyW>#6IgF>*CU*G4uiSrulk=n;oUztlXc{7xi|ZcYfWS z+Q1DRVju_JQ6PHn>HwO7pufHIqLQBfE!!+x` z;pczBH2wzzl>65{M81W|5l!H;OhdKSj{#6rT<0%Ni@G|O#Fl4`4rCp9zs@~Prg0kF zE1E-VDSj6=KX476`*6Re!9DQ!s#BN+UHcAqxVgc-^2Dn*q%hCF=JL8vU48BS?*5hT z_?7Pd=V|CDS=ktE1h4}0ji$C0Ylpw|Un12#b@1WI3*GU}nC{ed=}E=U;NbzcTF*t? zj?PP8efsHVZd?&v5nb=@uU)U*Uq_gr+oA8SiC}KWN_R$cs4}wpSrS0;#LQHN2%>Hi z2Z@?=>V1j z@p}*bTuDFo(hr5?K+fzCJ?HwF+#xL$A1x+4h5Eo(>Bp_m59(TN{o`Jkbk9HL9&<-7 zJ$Lo}M<3DGuiRU&etsR=@m+X2u6z3FXE(3fFg&_>^@aNf*AO_g`o|Zp-keCSdV2GU z+ua`qLYuBjxow^(LFGfq>mrbyhX(}UJ}Ez=H6Hmkqyfwv^EnP96&(k z#f@0JU&qi`XR5y)R0tI@qD&=X{R6Q?s=YflFsQ{qCWt$PPfKcVO~k=ux@$7NKN-W< zN4k>WX-~$ne$(06n@V&G%isWdReUJDl%aTQN3658r&kxUZ>T33*TtkjyL1U?W1YRN zT?rNIYaN2x38f3B#}dD;1AEnAZ!3w<(gD>?_$uEw&_95+B?|NdskHjS5;$2j1`GHl z8;v{#6RpEWKb#jBS;q$k`i!OtJK}Art{BcKP4$v_h8HhcP8C60w6(VHO%39fi2Dmk z(_^p`FIj3eVx2v(=YXG54{*j_zEay@!@<^});^W!xsr;cvb1G&N&RFMufY^zeY>=Y zHbhUqiV=+q=r7FT z`_TZ#X<~_ZGS)LJrBSPETgCLkT2Fs$Fa5qqm_EIu@JT5_4N> zZp+N=EWbcB7irJy}P!nCt15M-ZqqMr$yLAU1BI{da-s2>c%=wM950M%CxukCt0cw+uGYT zU|fz$KYJNU??8RqlRX3d5SvZ|#dKiY)ZiA|0u; z2UD)n&6w&Z-gt-Bl$u10L@sgR#w`~pkD|T16{bv3?DHw_H8+JA@=&iU8;8>VXoH?{ zeWJDTatKA}WL%s!&4YY}^$+y7$I-jV70{TdpfR(jBiXwTamue@0`VE00Al>u))d01 z(G?Y=9;)Nu5ijRA0ZZAzJ$n_^A=k+mri^X1Wn$De%TS;Hj`B zH9}f9@me^khT@%&o`UYYqG^LktUiVwAnUEBaqDE=vt8+>))=}m#CKxQp&TA@v}(Qa z;W+%FFFw=-^Z|vJvb8+O#P{{$t$o7SrbjWfAM|fa?DrIDA22bW+6{4K5QAR4LyOQ+ z7vHVJa5mJ_-{o;g@lq9b5T80|MYOcu%!uih_T}l&ZmOXRliE;MAVZKdAbwyBR(xKy zSFnk6Ub3}gxE0>wlik`I2OCK+X4%&|)K8jQ44?sHL@Z{E-dtxy@hVNG<NXSZDu?d3X{KhRDKKU&hF)ykdW0B>}|G?{zOR!_{> z5Jfuh6-tBdf(iD;sb&&-Xf?ggu2zftGm+Mugm5tEYfbFcH6=4q(JZ}lXrK=RPi(lg zHx*ZyA(BO@Fue+>eIl(u8YJ-i=o>5SYGDjRaW@5ncoL0>?%-QVlwQ--I+)OF>~J%T z$$H|QTbk~IM4-BRSUrTP1jpq*6Q_7$WY$~iG>){xoY3@O9T&*EOo&2oLA?<;hdT!m zBa>#}w0R~BVIGA7W4%3ibV#;#N&UGHNJ9}MlP0Uwd(jfAYf#2%2p)hFA5fhh3KN+G z#+0s@o}0BI%&P%x;&%29?291}|AC3cutD4|1=}v6dOG4fX|ak@JkZJ_=+Yoq&-cZA zU&8mLqP!ibpgi@!&K{be3}KM#&}o^(*xreWqc*QZdi~6Ax_|$$kJHNN0p2fH=jc&_ zq$b)1co+kjP9O^CT-idFqdWs@Ur1m%oD;Y(txNeY;XBD&(2i;n@IepND4v82Ksp7RE~BfY7I}nC0!oqKH5~R=N~8~p(1q3&Fz5-|E})cQ8d6eLd{!qE@lp#% zZ55D?s5T|;5Ksh?_^qRon&A;{70{NLILBLKAwN*e76i`7vv9=%W52@NX2pAIAy5b?0*$pLWyNPjlnYn} zeZPh-R}DI&lGx-G&>-L?jGCts<8IB{P+t+)P~le3!8a}{0yQ%$%j(aVA5_b$E9-vs zW_e}#Y$wb4MJEvyfFM(}{XNNreAX+!Nx;uB%Gl4c80Zw|KFW9MSpt9E;=%%d!{Vw0 zrcbERMUEoycP(zdz)x6Qy}&=Pxa9)B$vDg3P>MbrOOl| zDXB${hn4I)G>U2qJk=Tnl(uwKOqBSZM->zBO%K&j5j6U&<~tZKU==UoJ5Ywk{)$q+ z_YAvLK&c8Z(vmJfh(J_F&ATw zNoZDyTXQjHcY+aSyp!)VR0>Qdc+v%2y};kIxU7dZkwqWPp$o1o;I}>04gp0{ZcB)) zQID}vz^{9#?E?B`WgACiead6pDxjY++c;rU4^_^0R7k)cM&;IikaLIlPF59|zFABc zaAAR^lLA*I@V5<_o`4AaU5l#{Sk@9qp1?n|bRmIXw73X^-c9syNs3fHvJ?jTv(ze{JDXf$$B7AlDmRIhMY(ZHS zc$BFvS3@ROuCVknv%TsS)+AstKd0w*mN4f|_nzjP1e7(W9A=I(^-0SmV7~Vhl~p(4 z`h>^TD4=k=DtT~J5>`|rSIfKgvxpDzJzwot%W6jdmXmk#JqYxWnmPImr(fs0gLkSk zE>TV-la&P)u>rMs^ez_h6HiowfL8jhH#j%oS))Nfsa39K+`w$Mz@&PRaUwkcXU)8_ z6-_##)z3Xew+ZMI#hF%Mm^GfjcZwbY%lZoSc7dl_x+;O&EG{B&x5ZTn++%TJf!}Fy zSutL8lXBph0t!2x$ORNhV>mvSBLZ?Y#~{S@f{0gIT3(sVHE5eCpKTG|%S73u} z83PH)AtuRJ(akk8Mz7=Kh{w70HU>pitfXZMi}C~gcKcxOfjo<$3O0^9oT~ArJ&gh` zNh2Jqga$5wLhV^|M`NJD(UAe zsRwfPgfy3$kRWQ-TLTFwnu~-?6E$(6y?hU-WuvzDB;WHj$F!GzEkWG_(F>d z3w)8qRSEo078em%mQWzCO5i6fU0C2}EG{Iltb%|y;=w#MCwcf&0)62xz4ZlLSm21o zWyP{6m$j4cc$^XN-xy`Oo}@$=2u(@$cNa5U$#-h;&oKNwzB{Txz+d{vtPlf(jH50UQ1oKTu>?xxxN}NUq@Y#;`URqAWeSvRdD2Hv7H~D&+f}LTMZau5Z?VAg zCCBCyBKWO=zYeNsdmfr3(!vV9KIQp8XZB zDIQ6qfWoaOi;}RSvbx95SiK;NqRHafHKQR;mh)XEiyJt-m+v`798pdrQ->2+#L{H3 zl0|IsL^TL#rSIzF+#yRPpwuc?41b8LWeZFyS%eYkxh9L*iY6V=ijHNY3(HXg`b1?- z77Z~yPMQnBFC;L&O`$Iehyvr2l7gd;L+gvanoJkyA_A{6D8f|8v0QBIE%DfP2q>n@SHo|7OXVmaYxhdZ?qFfmpaM_e=En;2DSS21P|%+i z(nW*<&+-#W0)NZx5eobcKcUICzby=YnD1yS0smxCB5FB{0u^U^w+9(|l<&Fv(%uXj z_`i^gl3qJ`f*Ht^U!;zCqrE)4TaDX9V>%>*E=RQ)!2ULH)>gigaRu(OxUj%`Ev`!7 zkGV!3TI;lu#NCXfekCxSvPKthVS#1ZMgtn$6sB4|y8w7Em8D_20Nlt(Lwf3>t8$hGunrTPoK>hBg%8p@+J7Ph}-Y>z#jUA79?$*6Knoyu^A zc z8VigX@>sozsc0%7usj)I8Y!SOBZ5wL!)^Tp3;BxGLO^LJFiOk3XsHDBT1ah^Hlfp_ z=zpU+5XNLF|0oqO1%9eV((v%y$aK@^~x{dbz^0JfMA_ z^`^Ka@Y5C-7Wi34+@e0g;CDS#gMf>?3SV{(gSIwV z^SenotXs%-`LZ`P-!9;H8I`XRG{2Kt($NldVLmEVl6n9o`is&)iJe8m9241G?LME2 zmnQ`5j|+H+v&z+>>?nORXLft75$j`czeQcm;Cn4fK-r9&$kNlJ?|sZbr-{);;Y#4J zXPTIp#@Zn!cCalJGa~G-)VYr9K*HtWX)EL4gHlClA)rL~FFh3+tXPKlIZ1y&7bpsI z0_RB{rfC9)EUrr6LW_$CJl^8w3*2jQ^#TuA+cTCf1V|49FP; zK9@6riwGRGxRAg%SX_j`tXlVX)o|~jH3rFM-rkU5eobRKcOUk=#$8xcZ)D2 z^A6Ng!0S27s4FRPTM!B;^8a$ZzRlvW@GPL8G5bZ1tC-;xz87L=`D!)qDm8CZP=DsE z87h_M9VfOvs`LpZ}KRW=Iu!QZ{%}M27HAWEuE7`&@pHBWs8UgCQmt2zUR17E4;9Z>U9#hwhm8HDgmW~c_k*wjKL zwSec0^Tb+9{KXP8RsMolm7mIdp1p)oEBT)0*~_9@QkrKA;TC2{^K8qIay+G%ds4)+ zg}0GqqNA57%8MA{*}18ON@|hj*|rw! z*|}w?jO#F~dI#ST>;;_33nes4WC#1>8H_Z|zmIXB^@MGk!a_t?j>VHq6>>}3nk^~o zWsQ0+Y%$+ypcVL!c7Y-+u_FnkIqY`KTeY{o`mlyWia5YR6x+sJgp zG+lINHeEFBjWhg7PqA&Mxo#pX$9^20#!6Q+-}BY(59EDdoFwU}X}Us$-i4fyV5GQW z&S^$wo*+esaW=E*19^fKb+{~3g8db;-?8?$s^kP6^ISP#ZdQ&Em<*3aV|&27WZ76m zz8;(`AB!j&)mkEK&l?r(q%zRbMCQM&r8!YH2aR7#Gi2r<@@r}OaSkHCme#5a$zl)R z$;0K{4EZAl;KBkQ2pT@%ssz5$;=%&I%i^+njN-DUOWCSPKoJSY7f>YS?nEL>Uhzg) z5>QmZ6ODj=S=pUP-jo;WJT-jW8I_dq(n@>dY-D7bQrJcDw_Jy3*bcw*?9m|L>x`P9 z5}D2C?e6C0*a*E z9x1Z^&Xd(Bpr`_m6wog#+avQ?XQ4J8DJkI{(<6ml6o1QgXy$TdEfHQK;JY{r?QPD4 zc26}%bqmartecnwTmpXBa!D)`F3I||{Sl#B{l%?X zeDS6Sc?0?rowad%#17x3jK{h=z$+=kfe-x*wH{EKL*RGfV_PJ>wXdfgMGrtYerk0o zMq*ncp=#R)`ugZIK(*#moA~r)e^(rMlhofaldQJ3q4==m;OLpSz_6Eq^tm*qXGvKG z|LYJ_!A35~lX?JAq;N4}ib;9DneI9pInl%HAuYcu!{Gyh@cf7!=B4sa&_ z&A^dfq#s>_`BA>>o67V*7Hcx`dlUZq`A3*vUe`S7Q5qo3X}RB;!7t-Plofh#Ub+C` z6YSq*@W00Au)ns*Q1GUwkZW6e2>{3OpY)gZRJBp0aMhaIsf_X?2JQXc4am=bswt}T zPBj^l_fe+r%Cz5Sk>}@c*csK-4Lc1}b%D9due6_}PXQ>we;y9d@mi3=)uMmB_BJWo z{*tD}=TiI^{t)wrS`0;Id70^FKt}otf0+5hZ;}6};H9P({wn6LV*V%Ce&U}}zWBil z;PsdP>sG_~>sDmo5_*%eX~F+9GW`56GyluX-z|)M7e2YamcifB)}kp}+6+U7bX=2E z5x&dqPXI`k)ci_UtiOW#y?hQmY*+WUPI5b0mk4O#2;u%J4rX?+Is=FLE}FQGV0&hT+cj%$UJ1*zIHR{}Hcp(REk~Vup;QqUwq7 zFp0kH=au@_42F!Pw!Ihod;%i8!v7Ej7hE;?zXkur?`2%1_?oNyXV#gLS~KETX8B+r z^KwbMKr}1gMYNWAjz80dCNh6X$LC=_67{1r>|!D0#+>*d<`22(3zW1BNLWw}OrM@YG*(;VZ|$ zQ;ANF_M+)fK#f%4jX1}k)xR?S6yqBh z@1S9Fl}qDmE_`?ld?oN?pJ;E3mQ3wO*Nidf=KxRkX_*t%bh0s9r{$EYQ|k?0>a|4h zyhAN`;-mVW+LBIBf7qb$4e9t5z*D)$=Ni0}yHV(urPFT_{PJ}CC4%QwdC_N^;G^mE zO@d#_c%)0I)3cbX|^N1o&~j5m0BA%HepBTVDJwE#Z>{w#4={5h%Vv*R}XT{+1= z&i!2?=1m&!mu%p_7y8*zjktkH?q>W*xxq_he+2ljs#1?}{9$tSDAS*wXXtO|jGt(H z_IUbBp=bGDW%@T5A7=bM##dmHl*`U%XguQE6jSaH(sV6n{K)*MPJe^jYa8S1xqYQx z-5Re+(|&FMegf(nX>ZZ^i2lXrn_13aaa3b|#rQ{nC;McMr;oFoXnTvM6u&yn_~UF( znXdl^_=u)V|M?@)2dY$eTT5C-KH@I5`zdbsyEu0u@Du0>mFF!;>T5RB%V~-&j6X}$ zSEUKZ7a0lbz|6V>U@7_>T*@tN!Siy0qf`-t7vF#d3&MxDBuW?0JD=uuiE6A;KLS3& zu>bZN%Q?+@zQUQbT}S%2u%FLle1*nmKTl0%`jZ@=YnlEGjrW&m;1x_CnH|-LtAvDh zG;lP4KG?xKU8;R3nMmRw8)U>{o7QcMZP~cJF&0xDahzs=;}Pg=v%Xk64lcr8L=IFe z)-e$4>K$mqQ3D;xfuTgKHMJi{6Z8%C#*^`m+OyADLI*|VAfj^wddwaPPKrnl;W!1o ztJ0C`>pK7zUrL|okVZvDk&%)?9o+?1Fc!hbfI+1*TT; zs)9q6*6(`9nu|BC1C=iaZG>ZUVi#?>WbK+Qu}dzzaQg*~vBouPw_HHtaQsz!tUZy^ z7SzW`*kdC|Ncw>!bdUtj9?^%?Q1#@nAUdfg8og-C#sW-D1uNN!Lbq5Pd3+J|)XnYQ}LHZRS{-jKgNQ zeRQpHR9sJgx^ywB|Ja=zr~9NG0)_r#4Vg;-9n(bT8IkI6kS?4EXw0tNuOoreY;cGR z8cCS>;3hgHOP>rHqf@hdr?kkCg8oC2G^~$X5h?yUq#wRy9nzj-l6A}tiIGD|d|s_x z*qr{7ZaQ=HVmdCZVa?$@W1W(fah#Dpo`w#2F{i8$WVFVCYuaO_meOG|()Ro#_5*Vc zPnPS^;a)fzMT^wuq~$nbh(+^JE(m>b+f@G3r$hz6;WN%`;v=|>UHGUVVdDd#GEWYQ zZ5obk<7mIGw>6PKsF&k&(ydMY%mZ8{vTfg8%>k literal 0 HcmV?d00001 diff --git a/libs/srtp/crypto/test/stat_driver.c b/libs/srtp/crypto/test/stat_driver.c index 09cc44a646..f9d75b7656 100644 --- a/libs/srtp/crypto/test/stat_driver.c +++ b/libs/srtp/crypto/test/stat_driver.c @@ -37,7 +37,9 @@ main (int argc, char *argv[]) { int i, j; extern cipher_type_t aes_icm; cipher_t *c; - uint8_t key[30] = { + uint8_t key[46] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, @@ -97,5 +99,41 @@ main (int argc, char *argv[]) { printf("(nota bene: a small fraction of stat_test failures does not \n" "indicate that the random source is invalid)\n"); + err_check(cipher_dealloc(c)); + + printf("running stat_tests on AES-256-ICM, expecting success\n"); + /* set buffer to cipher output */ + for (i=0; i < 2500; i++) + buffer[i] = 0; + err_check(cipher_type_alloc(&aes_icm, &c, 46)); + err_check(cipher_init(c, key, direction_encrypt)); + err_check(cipher_set_iv(c, &nonce)); + err_check(cipher_encrypt(c, buffer, &buf_len)); + /* run tests on cipher outout */ + printf("monobit %d\n", stat_test_monobit(buffer)); + printf("poker %d\n", stat_test_poker(buffer)); + printf("runs %d\n", stat_test_runs(buffer)); + + printf("runs test (please be patient): "); + fflush(stdout); + num_fail = 0; + v128_set_to_zero(&nonce); + for(j=0; j < num_trials; j++) { + for (i=0; i < 2500; i++) + buffer[i] = 0; + nonce.v32[3] = i; + err_check(cipher_set_iv(c, &nonce)); + err_check(cipher_encrypt(c, buffer, &buf_len)); + if (stat_test_runs(buffer)) { + num_fail++; + } + } + + printf("%d failures in %d tests\n", num_fail, num_trials); + printf("(nota bene: a small fraction of stat_test failures does not \n" + "indicate that the random source is invalid)\n"); + + err_check(cipher_dealloc(c)); + return 0; } diff --git a/libs/srtp/doc/Doxyfile b/libs/srtp/doc/Doxyfile index fc6ac95e11..c6e6a6d238 100644 --- a/libs/srtp/doc/Doxyfile +++ b/libs/srtp/doc/Doxyfile @@ -346,7 +346,7 @@ WARN_LOGFILE = # directories like "/usr/src/myproject". Separate the files or directories # with spaces. -INPUT = intro.txt ../include/srtp.h ../crypto/include/crypto_types.h ../crypto/include/err.h ../crypto/include/crypto_kernel.h crypto_kernel.txt +INPUT = intro.txt ../include/srtp.h ../crypto/include/crypto_types.h ../crypto/include/err.h ../crypto/include/crypto.h crypto_kernel.txt # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp diff --git a/libs/srtp/doc/header.template b/libs/srtp/doc/header.template index bb1200e92b..2c0b96d46f 100644 --- a/libs/srtp/doc/header.template +++ b/libs/srtp/doc/header.template @@ -86,14 +86,17 @@ libSRTP LIBSRTPVERSION Overview and Reference Manual\\ The original implementation and documentation of libSRTP was written by David McGrew of Cisco Systems, Inc. in order to promote the use, -understanding, and interoperability of Secure RTP. Randell Jesup -contributed a working SRTCP implementation and other fixes. Alex -Vanzella and Will Clark contributed changes so that the AES ICM -implementation can be used for ISMA media encryption. Steve Underwood -contributed x86\_64 portability changes. We also give thanks to Brian -Weis, Mark Baugher, Jeff Chan, Bill Simon, Douglas Smith, Bill May, -Richard Preistley, Joe Tardo and others for contributions, comments, -and corrections. +understanding, and interoperability of Secure RTP. Michael Jerris +contributed support for building under MSVC. Andris Pavenis +contributed many important fixes. Brian West contributed changes to +enable dynamic linking. Yves Shumann reported documentation bugs. +Randell Jesup contributed a working SRTCP implementation and other +fixes. Alex Vanzella and Will Clark contributed changes so that the +AES ICM implementation can be used for ISMA media encryption. Steve +Underwood contributed x86\_64 portability changes. We also give +thanks to Fredrik Thulin, Brian Weis, Mark Baugher, Jeff Chan, Bill +Simon, Douglas Smith, Bill May, Richard Preistley, Joe Tardo and +others for contributions, comments, and corrections. This reference material in this documenation was generated using the \texttt{doxygen} utility for automatic documentation of source code. diff --git a/libs/srtp/doc/intro.txt b/libs/srtp/doc/intro.txt index f315599255..e8607d1c13 100644 --- a/libs/srtp/doc/intro.txt +++ b/libs/srtp/doc/intro.txt @@ -5,10 +5,10 @@ This document describes libSRTP, the Open Source Secure RTP library from Cisco Systems, Inc. RTP is the Real-time Transport Protocol, an IETF standard for the transport of real-time data such as telephony, -audio, and video, defined by RFC1889. Secure RTP (SRTP) is an RTP +audio, and video, defined by RFC 3550. Secure RTP (SRTP) is an RTP profile for providing confidentiality to RTP data and authentication -to the RTP header and payload. SRTP is an IETF Proposed Standard, and -is defined in RFC 3711, and was developed in the IETF Audio/Video +to the RTP header and payload. SRTP is an IETF Proposed Standard, +defined in RFC 3711, and was developed in the IETF Audio/Video Transport (AVT) Working Group. This library supports all of the mandatory features of SRTP, but not all of the optional features. See the @ref Features section for more detailed information. @@ -110,7 +110,7 @@ the minor release number, and \texttt{tgz} is the file extension\footnote{The extension \texttt{.tgz} is identical to \texttt{tar.gz}, and indicates a compressed tar file.} You probably want to get the most recent release. Unpack the distribution and -extract the source files; the directory into which the soruce files +extract the source files; the directory into which the source files will go is named \texttt{srtp}. libSRTP uses the GNU \texttt{autoconf} and \texttt{make} @@ -135,7 +135,7 @@ The configure script accepts the following options: \end{description} \end{quote} -By default, dynamic debbuging is enabled and stdout is used for +By default, dynamic debugging is enabled and stdout is used for debugging. You can use the configure options to have the debugging output sent to syslog or the system console. Alternatively, you can define ERR\_REPORTING\_FILE in \texttt{include/conf.h} to be any other @@ -181,7 +181,7 @@ using gdoi will be added later. The usage for rtpw is \texttt{rtpw [[-d $<$debug$>$]* [-k $<$key$>$ [-a][-e]] [-s | -r] dest\_ip -dest\_port][-l]} +dest\_port] | [-l]} Either the -s (sender) or -r (receiver) option must be chosen. The values dest\_ip, dest\_port are the IP address and UDP port to which @@ -189,7 +189,7 @@ the dictionary will be sent, respectively. The options are: \begin{center} \begin{tabular}{ll} -s & (S)RTP sender - causes app to send words \\ - -r & (S)RTP receive - causes app to receve words \\ + -r & (S)RTP receive - causes app to receive words \\ -k $<$key$>$ & use SRTP master key $<$key$>$, where the key is a hexadecimal value (without the leading "0x") \\ @@ -197,7 +197,7 @@ the dictionary will be sent, respectively. The options are: (requires use of -k option as well)\\ -a & message authentication (requires use of -k option as well) \\ - -l & list the avaliable debug modules \\ + -l & list the available debug modules \\ -d $<$debug$>$ & turn on debugging for module $<$debug$>$ \\ \end{tabular} \end{center} @@ -359,7 +359,7 @@ length as its second argument. crypto_get_random(key, 30); // allocate and initialize the SRTP session - srtp_create(&session, policy); + srtp_create(&session, &policy); // main loop: get rtp packets, send srtp packets while (1) { diff --git a/libs/srtp/doc/libsrtp.pdf b/libs/srtp/doc/libsrtp.pdf index 0538ab4551f293e0fc497a8b98237731d4f18d5c..6f5e448e89ae34b31c2973641d402f5bf982ee64 100644 GIT binary patch literal 346251 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 <`o*{Hb!EGczqk8U}u!4#%|nN=QCM# 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 kSb0VG*wyAH?!zy;d)3aK`z8s8d0D50G3td;kCd literal 355874 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 z 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⁡GXf2x- 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

&8+NAu1n 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

kVfjr?lXZq2q*72lhuT61q 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 ar4YV2o}H_{?*ZiC)D?Q@p$4rQ7W#ijmF~O% diff --git a/libs/srtp/include/ekt.h b/libs/srtp/include/ekt.h new file mode 100644 index 0000000000..b0d888bac9 --- /dev/null +++ b/libs/srtp/include/ekt.h @@ -0,0 +1,201 @@ +/* + * ekt.h + * + * interface to Encrypted Key Transport for SRTP + * + * David McGrew + * Cisco Systems, Inc. + */ +/* + * + * Copyright (c) 2001-2005 Cisco Systems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * Neither the name of the Cisco Systems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + + + +/* + * EKT implementation strategy + * + * use stream_template approach + * + * in srtp_unprotect, when a new stream appears, check if template has + * EKT defined, and if it does, then apply EKT processing + * + * question: will we want to allow key-sharing templates in addition + * to EKT templates? could define a new ssrc_type_t that's associated + * with an EKT, e.g. ssrc_any_ekt. + * + * + */ + +#ifndef EKT_H +#define EKT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "srtp_priv.h" + +#define EKT_CIPHER_DEFAULT 1 +#define EKT_CIPHER_AES_128_ECB 1 +#define EKT_CIPHER_AES_192_KEY_WRAP 2 +#define EKT_CIPHER_AES_256_KEY_WRAP 3 + +typedef uint16_t ekt_spi_t; + + +unsigned +ekt_octets_after_base_tag(ekt_stream_t ekt); + +/* + * an srtp_policy_t structure can contain a pointer to an + * ekt_policy_t structure + * + * this structure holds all of the high level EKT information, and it + * is passed into libsrtp to indicate what policy should be in effect + */ + +typedef struct ekt_policy_ctx_t { + ekt_spi_t spi; /* security parameter index */ + uint8_t ekt_cipher_type; + uint8_t *ekt_key; + struct ekt_policy_ctx_t *next_ekt_policy; +} ekt_policy_ctx_t; + + +/* + * an ekt_data_t structure holds the data corresponding to an ekt key, + * spi, and so on + */ + +typedef struct ekt_data_t { + ekt_spi_t spi; + uint8_t ekt_cipher_type; + aes_expanded_key_t ekt_enc_key; + aes_expanded_key_t ekt_dec_key; + struct ekt_data_t *next_ekt_data; +} ekt_data_t; + +/* + * an srtp_stream_ctx_t can contain an ekt_stream_ctx_t + * + * an ekt_stream_ctx_t structure holds all of the EKT information for + * a specific SRTP stream + */ + +typedef struct ekt_stream_ctx_t { + ekt_data_t *data; + uint16_t isn; /* initial sequence number */ + uint8_t encrypted_master_key[SRTP_MAX_KEY_LEN]; +} ekt_stream_ctx_t; + + + +err_status_t +ekt_alloc(ekt_stream_t *stream_data, ekt_policy_t policy); + +err_status_t +ekt_stream_init(ekt_stream_t e, + ekt_spi_t spi, + void *ekt_key, + unsigned ekt_cipher_type); + +err_status_t +ekt_stream_init_from_policy(ekt_stream_t e, ekt_policy_t p); + + + +err_status_t +srtp_stream_init_from_ekt(srtp_stream_t stream, + const void *srtcp_hdr, + unsigned pkt_octet_len); + + +void +ekt_write_data(ekt_stream_t ekt, + uint8_t *base_tag, + unsigned base_tag_len, + int *packet_len, + xtd_seq_num_t pkt_index); + +/* + * We handle EKT by performing some additional steps before + * authentication (copying the auth tag into a temporary location, + * zeroizing the "base tag" field in the packet) + * + * With EKT, the tag_len parameter is actually the base tag + * length + */ + +err_status_t +ekt_tag_verification_preproces(uint8_t *pkt_tag, + uint8_t *pkt_tag_copy, + unsigned tag_len); + +err_status_t +ekt_tag_verification_postproces(uint8_t *pkt_tag, + uint8_t *pkt_tag_copy, + unsigned tag_len); + + +/* + * @brief EKT pre-processing for srtcp tag generation + * + * This function does the pre-processing of the SRTCP authentication + * tag format. When EKT is used, it consists of writing the Encrypted + * Master Key, the SRTP ROC, the Initial Sequence Number, and SPI + * fields. The Base Authentication Tag field is set to the all-zero + * value + * + * When EKT is not used, this function is a no-op. + * + */ + +err_status_t +srtp_stream_srtcp_auth_tag_generation_preprocess(const srtp_stream_t *s, + uint8_t *pkt_tag, + unsigned pkt_octet_len); + +/* it's not clear that a tag_generation_postprocess function is needed */ + +err_status_t +srtcp_auth_tag_generation_postprocess(void); + + +#ifdef __cplusplus +} +#endif + +#endif /* EKT_H */ diff --git a/libs/srtp/include/getopt_s.h b/libs/srtp/include/getopt_s.h new file mode 100644 index 0000000000..2a6ece34eb --- /dev/null +++ b/libs/srtp/include/getopt_s.h @@ -0,0 +1,60 @@ +/* + * getopt.h + * + * interface to a minimal implementation of the getopt() function, + * written so that test applications that use that function can run on + * non-POSIX platforms + * + */ +/* + * + * Copyright (c) 2001-2006 Cisco Systems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * Neither the name of the Cisco Systems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef GETOPT_S_H +#define GETOPT_S_H + +/* + * getopt_s(), optarg_s, and optind_s are small, locally defined + * versions of the POSIX standard getopt() interface. + */ + +int +getopt_s(int argc, char * const argv[], const char *optstring); + +extern char *optarg_s; /* defined in getopt.c */ + +extern int optind_s; /* defined in getopt.c */ + +#endif /* GETOPT_S_H */ diff --git a/libs/srtp/include/rtp.h b/libs/srtp/include/rtp.h index 65975ff35b..0e0119cf7b 100644 --- a/libs/srtp/include/rtp.h +++ b/libs/srtp/include/rtp.h @@ -16,7 +16,7 @@ /* * - * Copyright (c) 2001-2005, Cisco Systems, Inc. + * Copyright (c) 2001-2006, Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -54,72 +54,86 @@ #ifndef RTP_H #define RTP_H -#include "srtp.h" - #ifdef HAVE_NETINET_IN_H # include #elif defined HAVE_WINSOCK2_H # include #endif -#define rtp_header_len 12 +#include "srtp.h" -typedef srtp_hdr_t rtp_hdr_t; +typedef struct rtp_sender_ctx_t *rtp_sender_t; -#define RTP_MAX_BUF_LEN 16384 - -typedef struct { - srtp_hdr_t header; - char body[RTP_MAX_BUF_LEN]; -} rtp_msg_t; - -typedef struct { - rtp_msg_t message; - int socket; - srtp_ctx_t *srtp_ctx; - struct sockaddr_in addr; /* reciever's address */ -} rtp_sender_t; - -typedef struct { - rtp_msg_t message; - int socket; - srtp_ctx_t *srtp_ctx; - struct sockaddr_in addr; /* receiver's address */ -} rtp_receiver_t; - - -ssize_t -rtp_sendto(rtp_sender_t *sender, const void* msg, int len); - -ssize_t -rtp_recvfrom(rtp_receiver_t *receiver, void *msg, int *len); +typedef struct rtp_receiver_ctx_t *rtp_receiver_t; int -rtp_receiver_init(rtp_receiver_t *rcvr, int socket, - struct sockaddr_in addr, uint32_t ssrc); +rtp_sendto(rtp_sender_t sender, const void* msg, int len); int -rtp_sender_init(rtp_sender_t *sender, int socket, - struct sockaddr_in addr, uint32_t ssrc); +rtp_recvfrom(rtp_receiver_t receiver, void *msg, int *len); + +int +rtp_receiver_init(rtp_receiver_t rcvr, int sock, + struct sockaddr_in addr, unsigned int ssrc); + +int +rtp_sender_init(rtp_sender_t sender, int sock, + struct sockaddr_in addr, unsigned int ssrc); /* * srtp_sender_init(...) initializes an rtp_sender_t - * */ int -srtp_sender_init(rtp_sender_t *rtp_ctx, /* structure to be init'ed */ +srtp_sender_init(rtp_sender_t rtp_ctx, /* structure to be init'ed */ struct sockaddr_in name, /* socket name */ sec_serv_t security_services, /* sec. servs. to be used */ unsigned char *input_key /* master key/salt in hex */ ); int -srtp_receiver_init(rtp_receiver_t *rtp_ctx, /* structure to be init'ed */ +srtp_receiver_init(rtp_receiver_t rtp_ctx, /* structure to be init'ed */ struct sockaddr_in name, /* socket name */ sec_serv_t security_services, /* sec. servs. to be used */ unsigned char *input_key /* master key/salt in hex */ ); +int +rtp_sender_init_srtp(rtp_sender_t sender, const srtp_policy_t *policy); + +int +rtp_sender_deinit_srtp(rtp_sender_t sender); + +int +rtp_receiver_init_srtp(rtp_receiver_t sender, const srtp_policy_t *policy); + +int +rtp_receiver_deinit_srtp(rtp_receiver_t sender); + + +rtp_sender_t +rtp_sender_alloc(void); + +void +rtp_sender_dealloc(rtp_sender_t rtp_ctx); + +rtp_receiver_t +rtp_receiver_alloc(void); + +void +rtp_receiver_dealloc(rtp_receiver_t rtp_ctx); + + +/* + * RTP_HEADER_LEN indicates the size of an RTP header + */ +#define RTP_HEADER_LEN 12 + +/* + * RTP_MAX_BUF_LEN defines the largest RTP packet in the rtp.c implementation + */ +#define RTP_MAX_BUF_LEN 16384 + + #endif /* RTP_H */ diff --git a/libs/srtp/include/rtp_priv.h b/libs/srtp/include/rtp_priv.h new file mode 100644 index 0000000000..1421386673 --- /dev/null +++ b/libs/srtp/include/rtp_priv.h @@ -0,0 +1,74 @@ +/* + * rtp_priv.h + * + * private, internal header file for RTP + * + * David A. McGrew + * Cisco Systems, Inc. + */ +/* + * + * Copyright (c) 2001-2006 Cisco Systems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * Neither the name of the Cisco Systems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + + +#ifndef RTP_PRIV_H +#define RTP_PRIV_H + +#include "srtp_priv.h" +#include "rtp.h" + +typedef srtp_hdr_t rtp_hdr_t; + +typedef struct { + srtp_hdr_t header; + char body[RTP_MAX_BUF_LEN]; +} rtp_msg_t; + +typedef struct rtp_sender_ctx_t { + rtp_msg_t message; + int socket; + srtp_ctx_t *srtp_ctx; + struct sockaddr_in addr; /* reciever's address */ +} rtp_sender_ctx_t; + +typedef struct rtp_receiver_ctx_t { + rtp_msg_t message; + int socket; + srtp_ctx_t *srtp_ctx; + struct sockaddr_in addr; /* receiver's address */ +} rtp_receiver_ctx_t; + + +#endif /* RTP_PRIV_H */ diff --git a/libs/srtp/include/srtp.h b/libs/srtp/include/srtp.h index cb78f7e9c9..eb95e7d477 100644 --- a/libs/srtp/include/srtp.h +++ b/libs/srtp/include/srtp.h @@ -8,7 +8,7 @@ */ /* * - * Copyright (c) 2001-2005, Cisco Systems, Inc. + * Copyright (c) 2001-2006, Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -50,14 +50,7 @@ extern "C" { #endif -#ifdef _MSC_VER -#pragma warning(disable:4214) -#endif - -#include "crypto_kernel.h" -#include "rdbx.h" -#include "rdb.h" -#include "integers.h" +#include "crypto_kernel.h" /** * @defgroup SRTP Secure RTP @@ -171,10 +164,22 @@ typedef enum { typedef struct { ssrc_type_t type; /**< The type of this particular SSRC */ - uint32_t value; /**< The value of this SSRC, if it is not a wildcard */ + unsigned int value; /**< The value of this SSRC, if it is not a wildcard */ } ssrc_t; +/** + * @brief points to an EKT policy + */ +typedef struct ekt_policy_ctx_t *ekt_policy_t; + + +/** + * @brief points to EKT stream data + */ +typedef struct ekt_stream_ctx_t *ekt_stream_t; + + /** * @brief represents the policy for an SRTP session. * @@ -210,8 +215,18 @@ typedef struct srtp_policy_t { */ crypto_policy_t rtp; /**< SRTP crypto policy. */ crypto_policy_t rtcp; /**< SRTCP crypto policy. */ - uint8_t *key; /**< Pointer to the SRTP master key for + unsigned char *key; /**< Pointer to the SRTP master key for * this stream. */ + ekt_policy_t ekt; /**< Pointer to the EKT policy structure + * for this stream (if any) */ + unsigned long window_size; /**< The window size to use for replay + * protection. */ + int allow_repeat_tx; /**< Whether retransmissions of + * packets with the same sequence number + * are allowed. (Note that such repeated + * transmissions must have the same RTP + * payload, or a severe security weakness + * is introduced!) */ struct srtp_policy_t *next; /**< Pointer to next stream policy. */ } srtp_policy_t; @@ -260,6 +275,15 @@ typedef struct srtp_stream_ctx_t *srtp_stream_t; err_status_t srtp_init(void); +/** + * @brief srtp_shutdown() de-initializes the srtp library. + * + * @warning No srtp functions may be called after calling this function. + */ + +err_status_t +srtp_shutdown(void); + /** * @brief srtp_protect() is the Secure RTP sender-side packet processing * function. @@ -413,14 +437,13 @@ srtp_add_stream(srtp_t session, */ err_status_t -srtp_remove_stream(srtp_t session, uint32_t ssrc); +srtp_remove_stream(srtp_t session, unsigned int ssrc); /** * @brief crypto_policy_set_rtp_default() sets a crypto policy * structure to the SRTP default policy for RTP protection. * - * @param p is a pointer to the policy strucutre to be set to the - * default policy. + * @param p is a pointer to the policy structure to be set * * The function call crypto_policy_set_rtp_default(&p) sets the * crypto_policy_t at location p to the SRTP default policy for RTP @@ -442,8 +465,7 @@ crypto_policy_set_rtp_default(crypto_policy_t *p); * @brief crypto_policy_set_rtcp_default() sets a crypto policy * structure to the SRTP default policy for RTCP protection. * - * @param p is a pointer to the policy strucutre to be set to the - * default policy. + * @param p is a pointer to the policy structure to be set * * The function call crypto_policy_set_rtcp_default(&p) sets the * crypto_policy_t at location p to the SRTP default policy for RTCP @@ -465,13 +487,12 @@ crypto_policy_set_rtcp_default(crypto_policy_t *p); * @brief crypto_policy_set_aes_cm_128_hmac_sha1_80() sets a crypto * policy structure to the SRTP default policy for RTP protection. * - * @param p is a pointer to the policy strucutre to be set to the - * default policy. + * @param p is a pointer to the policy structure to be set * * The function crypto_policy_set_aes_cm_128_hmac_sha1_80() is a * synonym for crypto_policy_set_rtp_default(). It conforms to the - * naming convention used in - * http://www.ietf.org/internet-drafts/draft-ietf-mmusic-sdescriptions-12.txt + * naming convention used in RFC 4568 (SDP Security Descriptions for + * Media Streams). * * @return void. * @@ -484,13 +505,12 @@ crypto_policy_set_rtcp_default(crypto_policy_t *p); * @brief crypto_policy_set_aes_cm_128_hmac_sha1_32() sets a crypto * policy structure to a short-authentication tag policy * - * @param p is a pointer to the policy strucutre to be set to the - * default policy. + * @param p is a pointer to the policy structure to be set * * The function call crypto_policy_set_aes_cm_128_hmac_sha1_32(&p) * sets the crypto_policy_t at location p to use policy - * AES_CM_128_HMAC_SHA1_32 as defined in - * draft-ietf-mmusic-sdescriptions-12.txt. This policy uses AES-128 + * AES_CM_128_HMAC_SHA1_32 as defined in RFC 4568. + * This policy uses AES-128 * Counter Mode encryption and HMAC-SHA1 authentication, with an * authentication tag that is only 32 bits long. This length is * considered adequate only for protecting audio and video media that @@ -521,8 +541,7 @@ crypto_policy_set_aes_cm_128_hmac_sha1_32(crypto_policy_t *p); * @brief crypto_policy_set_aes_cm_128_null_auth() sets a crypto * policy structure to an encryption-only policy * - * @param p is a pointer to the policy strucutre to be set to the - * default policy. + * @param p is a pointer to the policy structure to be set * * The function call crypto_policy_set_aes_cm_128_null_auth(&p) sets * the crypto_policy_t at location p to use the SRTP default cipher @@ -552,8 +571,7 @@ crypto_policy_set_aes_cm_128_null_auth(crypto_policy_t *p); * @brief crypto_policy_set_null_cipher_hmac_sha1_80() sets a crypto * policy structure to an authentication-only policy * - * @param p is a pointer to the policy strucutre to be set to the - * default policy. + * @param p is a pointer to the policy structure to be set * * The function call crypto_policy_set_null_cipher_hmac_sha1_80(&p) * sets the crypto_policy_t at location p to use HMAC-SHA1 with an 80 @@ -577,6 +595,70 @@ crypto_policy_set_aes_cm_128_null_auth(crypto_policy_t *p); void crypto_policy_set_null_cipher_hmac_sha1_80(crypto_policy_t *p); + +/** + * @brief crypto_policy_set_aes_cm_256_hmac_sha1_80() sets a crypto + * policy structure to a encryption and authentication policy using AES-256 + * for RTP protection. + * + * @param p is a pointer to the policy structure to be set + * + * The function call crypto_policy_set_aes_cm_256_hmac_sha1_80(&p) + * sets the crypto_policy_t at location p to use policy + * AES_CM_256_HMAC_SHA1_80 as defined in + * draft-ietf-avt-srtp-big-aes-03.txt. This policy uses AES-256 + * Counter Mode encryption and HMAC-SHA1 authentication, with an 80 bit + * authentication tag. + * + * This function is a convenience that helps to avoid dealing directly + * with the policy data structure. You are encouraged to initialize + * policy elements with this function call. Doing so may allow your + * code to be forward compatible with later versions of libSRTP that + * include more elements in the crypto_policy_t datatype. + * + * @return void. + * + */ + +void crypto_policy_set_aes_cm_256_hmac_sha1_80(crypto_policy_t *p); + + +/** + * @brief crypto_policy_set_aes_cm_256_hmac_sha1_32() sets a crypto + * policy structure to a short-authentication tag policy using AES-256 + * encryption. + * + * @param p is a pointer to the policy structure to be set + * + * The function call crypto_policy_set_aes_cm_256_hmac_sha1_32(&p) + * sets the crypto_policy_t at location p to use policy + * AES_CM_256_HMAC_SHA1_32 as defined in + * draft-ietf-avt-srtp-big-aes-03.txt. This policy uses AES-256 + * Counter Mode encryption and HMAC-SHA1 authentication, with an + * authentication tag that is only 32 bits long. This length is + * considered adequate only for protecting audio and video media that + * use a stateless playback function. See Section 7.5 of RFC 3711 + * (http://www.ietf.org/rfc/rfc3711.txt). + * + * This function is a convenience that helps to avoid dealing directly + * with the policy data structure. You are encouraged to initialize + * policy elements with this function call. Doing so may allow your + * code to be forward compatible with later versions of libSRTP that + * include more elements in the crypto_policy_t datatype. + * + * @warning This crypto policy is intended for use in SRTP, but not in + * SRTCP. It is recommended that a policy that uses longer + * authentication tags be used for SRTCP. See Section 7.5 of RFC 3711 + * (http://www.ietf.org/rfc/rfc3711.txt). + * + * @return void. + * + */ + +void +crypto_policy_set_aes_cm_256_hmac_sha1_32(crypto_policy_t *p); + + /** * @brief srtp_dealloc() deallocates storage for an SRTP session * context. @@ -597,70 +679,114 @@ err_status_t srtp_dealloc(srtp_t s); +/* + * @brief identifies a particular SRTP profile + * + * An srtp_profile_t enumeration is used to identify a particular SRTP + * profile (that is, a set of algorithms and parameters). These + * profiles are defined in the DTLS-SRTP draft. + */ + +typedef enum { + srtp_profile_reserved = 0, + srtp_profile_aes128_cm_sha1_80 = 1, + srtp_profile_aes128_cm_sha1_32 = 2, + srtp_profile_aes256_cm_sha1_80 = 3, + srtp_profile_aes256_cm_sha1_32 = 4, + srtp_profile_null_sha1_80 = 5, + srtp_profile_null_sha1_32 = 6, +} srtp_profile_t; + + +/** + * @brief crypto_policy_set_from_profile_for_rtp() sets a crypto policy + * structure to the appropriate value for RTP based on an srtp_profile_t + * + * @param p is a pointer to the policy structure to be set + * + * The function call crypto_policy_set_rtp_default(&policy, profile) + * sets the crypto_policy_t at location policy to the policy for RTP + * protection, as defined by the srtp_profile_t profile. + * + * This function is a convenience that helps to avoid dealing directly + * with the policy data structure. You are encouraged to initialize + * policy elements with this function call. Doing so may allow your + * code to be forward compatible with later versions of libSRTP that + * include more elements in the crypto_policy_t datatype. + * + * @return values + * - err_status_ok no problems were encountered + * - err_status_bad_param the profile is not supported + * + */ +err_status_t +crypto_policy_set_from_profile_for_rtp(crypto_policy_t *policy, + srtp_profile_t profile); + + + + +/** + * @brief crypto_policy_set_from_profile_for_rtcp() sets a crypto policy + * structure to the appropriate value for RTCP based on an srtp_profile_t + * + * @param p is a pointer to the policy structure to be set + * + * The function call crypto_policy_set_rtcp_default(&policy, profile) + * sets the crypto_policy_t at location policy to the policy for RTCP + * protection, as defined by the srtp_profile_t profile. + * + * This function is a convenience that helps to avoid dealing directly + * with the policy data structure. You are encouraged to initialize + * policy elements with this function call. Doing so may allow your + * code to be forward compatible with later versions of libSRTP that + * include more elements in the crypto_policy_t datatype. + * + * @return values + * - err_status_ok no problems were encountered + * - err_status_bad_param the profile is not supported + * + */ +err_status_t +crypto_policy_set_from_profile_for_rtcp(crypto_policy_t *policy, + srtp_profile_t profile); + +/** + * @brief returns the master key length for a given SRTP profile + */ +unsigned int +srtp_profile_get_master_key_length(srtp_profile_t profile); + + +/** + * @brief returns the master salt length for a given SRTP profile + */ +unsigned int +srtp_profile_get_master_salt_length(srtp_profile_t profile); + +/** + * @brief appends the salt to the key + * + * The function call append_salt_to_key(k, klen, s, slen) + * copies the string s to the location at klen bytes following + * the location k. + * + * @warning There must be at least bytes_in_salt + bytes_in_key bytes + * available at the location pointed to by key. + * + */ + +void +append_salt_to_key(unsigned char *key, unsigned int bytes_in_key, + unsigned char *salt, unsigned int bytes_in_salt); + + /** * @} */ -/* - * the following declarations are libSRTP internal functions - */ - -/* - * srtp_get_stream(ssrc) returns a pointer to the stream corresponding - * to ssrc, or NULL if no stream exists for that ssrc - */ - -srtp_stream_t -srtp_get_stream(srtp_t srtp, uint32_t ssrc); - - - -/* - * libsrtp internal datatypes - */ - -typedef enum direction_t { - dir_unknown = 0, - dir_srtp_sender = 1, - dir_srtp_receiver = 2 -} direction_t; - -/* - * an srtp_stream_t has its own SSRC, encryption key, authentication - * key, sequence number, and replay database - * - * note that the keys might not actually be unique, in which case the - * cipher_t and auth_t pointers will point to the same structures - */ - -typedef struct srtp_stream_ctx_t { - uint32_t ssrc; - cipher_t *rtp_cipher; - auth_t *rtp_auth; - rdbx_t rtp_rdbx; - sec_serv_t rtp_services; - cipher_t *rtcp_cipher; - auth_t *rtcp_auth; - rdb_t rtcp_rdb; - sec_serv_t rtcp_services; - key_limit_ctx_t *limit; - direction_t direction; - struct srtp_stream_ctx_t *next; /* linked list of streams */ -} srtp_stream_ctx_t; - - -/* - * an srtp_ctx_t holds a stream list and a service description - */ - -typedef struct srtp_ctx_t { - srtp_stream_ctx_t *stream_list; /* linked list of streams */ - srtp_stream_ctx_t *stream_template; /* act as template for other streams */ -} srtp_ctx_t; - - /** * @defgroup SRTCP Secure RTCP @@ -867,137 +993,12 @@ srtp_install_event_handler(srtp_event_handler_func_t func); /** * @} */ - -/* - * srtp_handle_event(srtp, srtm, evnt) calls the event handling - * function, if there is one. - * - * This macro is not included in the documentation as it is - * an internal-only function. - */ - -#define srtp_handle_event(srtp, strm, evnt) \ - if(srtp_event_handler) { \ - srtp_event_data_t data; \ - data.session = srtp; \ - data.stream = strm; \ - data.event = evnt; \ - srtp_event_handler(&data); \ -} - -/* - * an srtp_hdr_t represents the srtp header - * - * in this implementation, an srtp_hdr_t is assumed to be 32-bit aligned - * - * (note that this definition follows that of RFC 1889 Appendix A, but - * is not identical) - */ - -#ifdef _MSC_VER -#pragma pack(push, r1, 1) -#endif - -#ifndef WORDS_BIGENDIAN - -typedef struct { - unsigned cc:4; /* CSRC count */ - unsigned x:1; /* header extension flag */ - unsigned p:1; /* padding flag */ - unsigned version:2; /* protocol version */ - unsigned pt:7; /* payload type */ - unsigned m:1; /* marker bit */ - unsigned seq:16; /* sequence number */ - unsigned ts:32; /* timestamp */ - unsigned ssrc:32; /* synchronization source */ -} srtp_hdr_t; - -#else /* BIG_ENDIAN */ - -typedef struct { - unsigned version:2; /* protocol version */ - unsigned p:1; /* padding flag */ - unsigned x:1; /* header extension flag */ - unsigned cc:4; /* CSRC count */ - unsigned m:1; /* marker bit */ - unsigned pt:7; /* payload type */ - unsigned seq:16; /* sequence number */ - unsigned ts:32; /* timestamp */ - unsigned ssrc:32; /* synchronization source */ -} srtp_hdr_t; - -#endif - -typedef struct { - uint16_t profile_specific; /* profile-specific info */ - uint16_t length; /* number of 32-bit words in extension */ -} srtp_hdr_xtnd_t; - - -/* - * srtcp_hdr_t represents a secure rtcp header - * - * in this implementation, an srtcp header is assumed to be 32-bit - * alinged - */ - -#ifndef WORDS_BIGENDIAN - -typedef struct { - unsigned rc:5; /* reception report count */ - unsigned p:1; /* padding flag */ - unsigned version:2; /* protocol version */ - unsigned pt:8; /* payload type */ - unsigned len:16; /* length */ - unsigned ssrc:32; /* synchronization source */ -} srtcp_hdr_t; - -typedef struct { - unsigned int index:31; /* srtcp packet index in network order! */ - unsigned int e:1; /* encrypted? 1=yes */ - /* optional mikey/etc go here */ - /* and then the variable-length auth tag */ -} srtcp_trailer_t; - - -#else /* BIG_ENDIAN */ - -typedef struct { - unsigned version:2; /* protocol version */ - unsigned p:1; /* padding flag */ - unsigned rc:5; /* reception report count */ - unsigned pt:8; /* payload type */ - unsigned len:16; /* length */ - unsigned ssrc:32; /* synchronization source */ -} srtcp_hdr_t; - -typedef struct { - unsigned int version:2; /* protocol version */ - unsigned int p:1; /* padding flag */ - unsigned int count:5; /* varies by packet type */ - unsigned int pt:8; /* payload type */ - unsigned length:16; /* len of uint32s of packet less header */ -} rtcp_common_t; - -typedef struct { - unsigned int e:1; /* encrypted? 1=yes */ - unsigned int index:31; /* srtcp packet index */ - /* optional mikey/etc go here */ - /* and then the variable-length auth tag */ -} srtcp_trailer_t; - -#endif - /* in host order, so outside the #if */ #define SRTCP_E_BIT 0x80000000 /* for byte-access */ #define SRTCP_E_BYTE_BIT 0x80 #define SRTCP_INDEX_MASK 0x7fffffff -#ifdef _MSC_VER -#pragma pack(pop, r1) -#endif - #ifdef __cplusplus } #endif diff --git a/libs/srtp/include/srtp_priv.h b/libs/srtp/include/srtp_priv.h new file mode 100644 index 0000000000..180a51b9e8 --- /dev/null +++ b/libs/srtp/include/srtp_priv.h @@ -0,0 +1,256 @@ +/* + * srtp_priv.h + * + * private internal data structures and functions for libSRTP + * + * David A. McGrew + * Cisco Systems, Inc. + */ +/* + * + * Copyright (c) 2001-2006 Cisco Systems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * Neither the name of the Cisco Systems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef SRTP_PRIV_H +#define SRTP_PRIV_H + +#include "srtp.h" +#include "rdbx.h" +#include "rdb.h" +#include "integers.h" + +/* + * an srtp_hdr_t represents the srtp header + * + * in this implementation, an srtp_hdr_t is assumed to be 32-bit aligned + * + * (note that this definition follows that of RFC 1889 Appendix A, but + * is not identical) + */ + +#ifndef WORDS_BIGENDIAN + +/* + * srtp_hdr_t represents an RTP or SRTP header. The bit-fields in + * this structure should be declared "unsigned int" instead of + * "unsigned char", but doing so causes the MS compiler to not + * fully pack the bit fields. + */ + +typedef struct { + unsigned cc:4; /* CSRC count */ + unsigned x:1; /* header extension flag */ + unsigned p:1; /* padding flag */ + unsigned version:2; /* protocol version */ + unsigned pt:7; /* payload type */ + unsigned m:1; /* marker bit */ + unsigned seq:16; /* sequence number */ + unsigned ts:32; /* timestamp */ + unsigned ssrc:32; /* synchronization source */ +} srtp_hdr_t; + +#else /* BIG_ENDIAN */ + +typedef struct { + unsigned char version:2; /* protocol version */ + unsigned char p:1; /* padding flag */ + unsigned char x:1; /* header extension flag */ + unsigned char cc:4; /* CSRC count */ + unsigned char m:1; /* marker bit */ + unsigned pt:7; /* payload type */ + unsigned seq:16; /* sequence number */ + unsigned ts:32; /* timestamp */ + unsigned ssrc:32; /* synchronization source */ +} srtp_hdr_t; + +#endif + +typedef struct { + uint16_t profile_specific; /* profile-specific info */ + uint16_t length; /* number of 32-bit words in extension */ +} srtp_hdr_xtnd_t; + + +/* + * srtcp_hdr_t represents a secure rtcp header + * + * in this implementation, an srtcp header is assumed to be 32-bit + * alinged + */ + +#ifndef WORDS_BIGENDIAN + +typedef struct { + unsigned rc:5; /* reception report count */ + unsigned p:1; /* padding flag */ + unsigned version:2; /* protocol version */ + unsigned pt:8; /* payload type */ + unsigned len:16; /* length */ + unsigned ssrc:32; /* synchronization source */ +} srtcp_hdr_t; + +typedef struct { + unsigned int index:31; /* srtcp packet index in network order! */ + unsigned int e:1; /* encrypted? 1=yes */ + /* optional mikey/etc go here */ + /* and then the variable-length auth tag */ +} srtcp_trailer_t; + + +#else /* BIG_ENDIAN */ + +typedef struct { + unsigned char version:2; /* protocol version */ + unsigned char p:1; /* padding flag */ + unsigned char rc:5; /* reception report count */ + unsigned char pt:8; /* payload type */ + uint16_t len; /* length */ + uint32_t ssrc; /* synchronization source */ +} srtcp_hdr_t; + +typedef struct { + unsigned int version:2; /* protocol version */ + unsigned int p:1; /* padding flag */ + unsigned int count:5; /* varies by packet type */ + unsigned int pt:8; /* payload type */ + uint16_t length; /* len of uint32s of packet less header */ +} rtcp_common_t; + +typedef struct { + unsigned int e:1; /* encrypted? 1=yes */ + unsigned int index:31; /* srtcp packet index */ + /* optional mikey/etc go here */ + /* and then the variable-length auth tag */ +} srtcp_trailer_t; + +#endif + + +/* + * the following declarations are libSRTP internal functions + */ + +/* + * srtp_get_stream(ssrc) returns a pointer to the stream corresponding + * to ssrc, or NULL if no stream exists for that ssrc + */ + +srtp_stream_t +srtp_get_stream(srtp_t srtp, uint32_t ssrc); + + +/* + * srtp_stream_init_keys(s, k) (re)initializes the srtp_stream_t s by + * deriving all of the needed keys using the KDF and the key k. + */ + + +err_status_t +srtp_stream_init_keys(srtp_stream_t srtp, const void *key); + +/* + * srtp_stream_init(s, p) initializes the srtp_stream_t s to + * use the policy at the location p + */ +err_status_t +srtp_stream_init(srtp_stream_t srtp, + const srtp_policy_t *p); + + +/* + * libsrtp internal datatypes + */ + +typedef enum direction_t { + dir_unknown = 0, + dir_srtp_sender = 1, + dir_srtp_receiver = 2 +} direction_t; + +/* + * an srtp_stream_t has its own SSRC, encryption key, authentication + * key, sequence number, and replay database + * + * note that the keys might not actually be unique, in which case the + * cipher_t and auth_t pointers will point to the same structures + */ + +typedef struct srtp_stream_ctx_t { + uint32_t ssrc; + cipher_t *rtp_cipher; + auth_t *rtp_auth; + rdbx_t rtp_rdbx; + sec_serv_t rtp_services; + cipher_t *rtcp_cipher; + auth_t *rtcp_auth; + rdb_t rtcp_rdb; + sec_serv_t rtcp_services; + key_limit_ctx_t *limit; + direction_t direction; + int allow_repeat_tx; + ekt_stream_t ekt; + struct srtp_stream_ctx_t *next; /* linked list of streams */ +} srtp_stream_ctx_t; + + +/* + * an srtp_ctx_t holds a stream list and a service description + */ + +typedef struct srtp_ctx_t { + srtp_stream_ctx_t *stream_list; /* linked list of streams */ + srtp_stream_ctx_t *stream_template; /* act as template for other streams */ +} srtp_ctx_t; + + + +/* + * srtp_handle_event(srtp, srtm, evnt) calls the event handling + * function, if there is one. + * + * This macro is not included in the documentation as it is + * an internal-only function. + */ + +#define srtp_handle_event(srtp, strm, evnt) \ + if(srtp_event_handler) { \ + srtp_event_data_t data; \ + data.session = srtp; \ + data.stream = strm; \ + data.event = evnt; \ + srtp_event_handler(&data); \ +} + + +#endif /* SRTP_PRIV_H */ diff --git a/libs/srtp/include/ut_sim.h b/libs/srtp/include/ut_sim.h index deed553b54..c25feeb654 100644 --- a/libs/srtp/include/ut_sim.h +++ b/libs/srtp/include/ut_sim.h @@ -10,7 +10,7 @@ /* * - * Copyright (c) 2001-2005, Cisco Systems, Inc. + * Copyright (c) 2001-2006, Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/libs/srtp/srtp.def b/libs/srtp/srtp.def index ea6908aba6..6fc94da0be 100644 --- a/libs/srtp/srtp.def +++ b/libs/srtp/srtp.def @@ -1,91 +1,91 @@ -EXPORTS -srtp_init -srtp_protect -srtp_unprotect -srtp_create -srtp_add_stream -srtp_remove_stream -crypto_policy_set_rtp_default -crypto_policy_set_rtcp_default -crypto_policy_set_aes_cm_128_hmac_sha1_32 -crypto_policy_set_aes_cm_128_null_auth -crypto_policy_set_null_cipher_hmac_sha1_80 -srtp_dealloc -srtp_get_stream -srtp_protect_rtcp -srtp_unprotect_rtcp -srtp_install_event_handler -crypto_kernel_init -crypto_kernel_shutdown -crypto_kernel_status -crypto_kernel_list_debug_modules -crypto_kernel_load_cipher_type -crypto_kernel_load_auth_type -crypto_kernel_load_debug_module -crypto_kernel_alloc_cipher -crypto_kernel_alloc_auth -crypto_kernel_set_debug_module -crypto_get_random -rand_source_init -rand_source_get_octet_string -rand_source_deinit -x917_prng_init -x917_prng_get_octet_string -ctr_prng_init -ctr_prng_get_octet_string -cipher_output -cipher_get_key_length -cipher_type_self_test -cipher_bits_per_second -auth_get_key_length -auth_get_tag_length -auth_get_prefix_length -auth_type_self_test -auth_type_get_ref_count -stat_test_monobit -stat_test_poker -stat_test_runs -stat_test_rand_source -stat_test_rand_source_with_repetition -err_reporting_init -err_report -key_limit_set -key_limit_clone -key_limit_check -key_limit_update -rdbx_init -rdbx_estimate_index -rdbx_check -rdbx_add_index -index_init -index_advance -index_guess -octet_get_weight -octet_string_hex_string -v128_bit_string -v128_hex_string -nibble_to_hex_char -hex_string_to_octet_string -v128_copy_octet_string -v128_left_shift -v128_right_shift -octet_string_is_eq -octet_string_set_to_zero -rdb_init -rdb_check -rdb_add_index -rdb_increment -rdb_get_value -aes_expand_encryption_key -aes_expand_decryption_key -aes_encrypt -aes_decrypt -aes_icm_context_init -aes_icm_set_iv -aes_icm_encrypt -aes_icm_output -aes_icm_dealloc -aes_icm_encrypt_ismacryp -aes_icm_alloc_ismacryp -crypto_alloc -crypto_free +EXPORTS +srtp_init +srtp_protect +srtp_unprotect +srtp_create +srtp_add_stream +srtp_remove_stream +crypto_policy_set_rtp_default +crypto_policy_set_rtcp_default +crypto_policy_set_aes_cm_128_hmac_sha1_32 +crypto_policy_set_aes_cm_128_null_auth +crypto_policy_set_null_cipher_hmac_sha1_80 +srtp_dealloc +srtp_get_stream +srtp_protect_rtcp +srtp_unprotect_rtcp +srtp_install_event_handler +crypto_kernel_init +crypto_kernel_shutdown +crypto_kernel_status +crypto_kernel_list_debug_modules +crypto_kernel_load_cipher_type +crypto_kernel_load_auth_type +crypto_kernel_load_debug_module +crypto_kernel_alloc_cipher +crypto_kernel_alloc_auth +crypto_kernel_set_debug_module +crypto_get_random +rand_source_init +rand_source_get_octet_string +rand_source_deinit +x917_prng_init +x917_prng_get_octet_string +ctr_prng_init +ctr_prng_get_octet_string +cipher_output +cipher_get_key_length +cipher_type_self_test +cipher_bits_per_second +auth_get_key_length +auth_get_tag_length +auth_get_prefix_length +auth_type_self_test +auth_type_get_ref_count +stat_test_monobit +stat_test_poker +stat_test_runs +stat_test_rand_source +stat_test_rand_source_with_repetition +err_reporting_init +err_report +key_limit_set +key_limit_clone +key_limit_check +key_limit_update +rdbx_init +rdbx_estimate_index +rdbx_check +rdbx_add_index +index_init +index_advance +index_guess +octet_get_weight +octet_string_hex_string +v128_bit_string +v128_hex_string +nibble_to_hex_char +hex_string_to_octet_string +v128_copy_octet_string +v128_left_shift +v128_right_shift +octet_string_is_eq +octet_string_set_to_zero +rdb_init +rdb_check +rdb_add_index +rdb_increment +rdb_get_value +aes_expand_encryption_key +aes_expand_decryption_key +aes_encrypt +aes_decrypt +aes_icm_context_init +aes_icm_set_iv +aes_icm_encrypt +aes_icm_output +aes_icm_dealloc +aes_icm_encrypt_ismacryp +aes_icm_alloc_ismacryp +crypto_alloc +crypto_free diff --git a/libs/srtp/srtp/ekt.c b/libs/srtp/srtp/ekt.c new file mode 100644 index 0000000000..9ae7f7e5c8 --- /dev/null +++ b/libs/srtp/srtp/ekt.c @@ -0,0 +1,278 @@ +/* + * ekt.c + * + * Encrypted Key Transport for SRTP + * + * David McGrew + * Cisco Systems, Inc. + */ +/* + * + * Copyright (c) 2001-2006 Cisco Systems, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * Neither the name of the Cisco Systems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + + +#include "err.h" +#include "srtp_priv.h" +#include "ekt.h" + +extern debug_module_t mod_srtp; + +/* + * The EKT Authentication Tag format. + * + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * : Base Authentication Tag : + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * : Encrypted Master Key : + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Rollover Counter | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Initial Sequence Number | Security Parameter Index | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + */ + +#define EKT_OCTETS_AFTER_BASE_TAG 24 +#define EKT_OCTETS_AFTER_EMK 8 +#define EKT_OCTETS_AFTER_ROC 4 +#define EKT_SPI_LEN 2 + +unsigned +ekt_octets_after_base_tag(ekt_stream_t ekt) { + /* + * if the pointer ekt is NULL, then EKT is not in effect, so we + * indicate this by returning zero + */ + if (!ekt) + return 0; + + switch(ekt->data->ekt_cipher_type) { + case EKT_CIPHER_AES_128_ECB: + return 16 + EKT_OCTETS_AFTER_EMK; + break; + default: + break; + } + return 0; +} + +static inline ekt_spi_t +srtcp_packet_get_ekt_spi(const uint8_t *packet_start, unsigned pkt_octet_len) { + const uint8_t *spi_location; + + spi_location = packet_start + (pkt_octet_len - EKT_SPI_LEN); + + return *((const ekt_spi_t *)spi_location); +} + +static inline uint32_t +srtcp_packet_get_ekt_roc(const uint8_t *packet_start, unsigned pkt_octet_len) { + const uint8_t *roc_location; + + roc_location = packet_start + (pkt_octet_len - EKT_OCTETS_AFTER_ROC); + + return *((const uint32_t *)roc_location); +} + +static inline const uint8_t * +srtcp_packet_get_emk_location(const uint8_t *packet_start, + unsigned pkt_octet_len) { + const uint8_t *location; + + location = packet_start + (pkt_octet_len - EKT_OCTETS_AFTER_BASE_TAG); + + return location; +} + + +err_status_t +ekt_alloc(ekt_stream_t *stream_data, ekt_policy_t policy) { + + /* + * if the policy pointer is NULL, then EKT is not in use + * so we just set the EKT stream data pointer to NULL + */ + if (!policy) { + *stream_data = NULL; + return err_status_ok; + } + + /* TODO */ + *stream_data = NULL; + + return err_status_ok; +} + +err_status_t +ekt_stream_init_from_policy(ekt_stream_t stream_data, ekt_policy_t policy) { + if (!stream_data) + return err_status_ok; + + return err_status_ok; +} + + +void +aes_decrypt_with_raw_key(void *ciphertext, const void *key, int key_len) { + aes_expanded_key_t expanded_key; + + aes_expand_decryption_key(key, key_len, &expanded_key); + aes_decrypt(ciphertext, &expanded_key); +} + +/* + * The function srtp_stream_init_from_ekt() initializes a stream using + * the EKT data from an SRTCP trailer. + */ + +err_status_t +srtp_stream_init_from_ekt(srtp_stream_t stream, + const void *srtcp_hdr, + unsigned pkt_octet_len) { + err_status_t err; + const uint8_t *master_key; + srtp_policy_t srtp_policy; + unsigned master_key_len; + uint32_t roc; + + /* + * NOTE: at present, we only support a single ekt_policy at a time. + */ + if (stream->ekt->data->spi != + srtcp_packet_get_ekt_spi(srtcp_hdr, pkt_octet_len)) + return err_status_no_ctx; + + if (stream->ekt->data->ekt_cipher_type != EKT_CIPHER_AES_128_ECB) + return err_status_bad_param; + master_key_len = 16; + + /* decrypt the Encrypted Master Key field */ + master_key = srtcp_packet_get_emk_location(srtcp_hdr, pkt_octet_len); + /* FIX!? This decrypts the master key in-place, and never uses it */ + /* FIX!? It's also passing to ekt_dec_key (which is an aes_expanded_key_t) + * to a function which expects a raw (unexpanded) key */ + aes_decrypt_with_raw_key((void*)master_key, &stream->ekt->data->ekt_dec_key, 16); + + /* set the SRTP ROC */ + roc = srtcp_packet_get_ekt_roc(srtcp_hdr, pkt_octet_len); + err = rdbx_set_roc(&stream->rtp_rdbx, roc); + if (err) return err; + + err = srtp_stream_init(stream, &srtp_policy); + if (err) return err; + + return err_status_ok; +} + +void +ekt_write_data(ekt_stream_t ekt, + uint8_t *base_tag, + unsigned base_tag_len, + int *packet_len, + xtd_seq_num_t pkt_index) { + uint32_t roc; + uint16_t isn; + unsigned emk_len; + uint8_t *packet; + + /* if the pointer ekt is NULL, then EKT is not in effect */ + if (!ekt) { + debug_print(mod_srtp, "EKT not in use", NULL); + return; + } + + /* write zeros into the location of the base tag */ + octet_string_set_to_zero(base_tag, base_tag_len); + packet = base_tag + base_tag_len; + + /* copy encrypted master key into packet */ + emk_len = ekt_octets_after_base_tag(ekt); + memcpy(packet, ekt->encrypted_master_key, emk_len); + debug_print(mod_srtp, "writing EKT EMK: %s,", + octet_string_hex_string(packet, emk_len)); + packet += emk_len; + + /* copy ROC into packet */ + roc = (uint32_t)(pkt_index >> 16); + *((uint32_t *)packet) = be32_to_cpu(roc); + debug_print(mod_srtp, "writing EKT ROC: %s,", + octet_string_hex_string(packet, sizeof(roc))); + packet += sizeof(roc); + + /* copy ISN into packet */ + isn = (uint16_t)pkt_index; + *((uint16_t *)packet) = htons(isn); + debug_print(mod_srtp, "writing EKT ISN: %s,", + octet_string_hex_string(packet, sizeof(isn))); + packet += sizeof(isn); + + /* copy SPI into packet */ + *((uint16_t *)packet) = htons(ekt->data->spi); + debug_print(mod_srtp, "writing EKT SPI: %s,", + octet_string_hex_string(packet, sizeof(ekt->data->spi))); + + /* increase packet length appropriately */ + *packet_len += EKT_OCTETS_AFTER_EMK + emk_len; +} + + +/* + * The function call srtcp_ekt_trailer(ekt, auth_len, auth_tag ) + * + * If the pointer ekt is NULL, then the other inputs are unaffected. + * + * auth_tag is a pointer to the pointer to the location of the + * authentication tag in the packet. If EKT is in effect, then the + * auth_tag pointer is set to the location + */ + +void +srtcp_ekt_trailer(ekt_stream_t ekt, + unsigned *auth_len, + void **auth_tag, + void *tag_copy) { + + /* + * if there is no EKT policy, then the other inputs are unaffected + */ + if (!ekt) + return; + + /* copy auth_tag into temporary location */ + +} + diff --git a/libs/srtp/srtp/srtp.c b/libs/srtp/srtp/srtp.c index 2db745d2bb..163d0d1f3f 100644 --- a/libs/srtp/srtp/srtp.c +++ b/libs/srtp/srtp/srtp.c @@ -8,7 +8,7 @@ */ /* * - * Copyright (c) 2001-2005, Cisco Systems, Inc. + * Copyright (c) 2001-2006, Cisco Systems, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -44,7 +44,7 @@ #include "srtp.h" -#include "aes_icm.h" /* aes_icm is used in the KDF */ +#include "ekt.h" /* for SRTP Encrypted Key Transport */ #include "alloc.h" /* for crypto_alloc() */ #ifndef SRTP_KERNEL @@ -57,9 +57,6 @@ #endif /* ! SRTP_KERNEL */ -extern cipher_type_t aes_icm; -extern auth_type_t tmmhv2; - /* the debug module for srtp */ debug_module_t mod_srtp = { @@ -114,7 +111,7 @@ srtp_stream_alloc(srtp_stream_ctx_t **str_ptr, } /* allocate key limit structure */ - str->limit = crypto_alloc(sizeof(key_limit_ctx_t)); + str->limit = (key_limit_ctx_t*) crypto_alloc(sizeof(key_limit_ctx_t)); if (str->limit == NULL) { auth_dealloc(str->rtp_auth); cipher_dealloc(str->rtp_cipher); @@ -151,6 +148,18 @@ srtp_stream_alloc(srtp_stream_ctx_t **str_ptr, return stat; } + /* allocate ekt data associated with stream */ + stat = ekt_alloc(&str->ekt, p->ekt); + if (stat) { + auth_dealloc(str->rtcp_auth); + cipher_dealloc(str->rtcp_cipher); + auth_dealloc(str->rtp_auth); + cipher_dealloc(str->rtp_cipher); + crypto_free(str->limit); + crypto_free(str); + return stat; + } + return err_status_ok; } @@ -217,6 +226,12 @@ srtp_stream_dealloc(srtp_t session, srtp_stream_ctx_t *stream) { if (status) return status; } + + status = rdbx_dealloc(&stream->rtp_rdbx); + if (status) + return status; + + /* DAM - need to deallocate EKT here */ /* deallocate srtp stream context */ crypto_free(stream); @@ -260,8 +275,12 @@ srtp_stream_clone(const srtp_stream_ctx_t *stream_template, return status; /* initialize replay databases */ - rdbx_init(&str->rtp_rdbx); + status = rdbx_init(&str->rtp_rdbx, + rdbx_get_window_size(&stream_template->rtp_rdbx)); + if (status) + return status; rdb_init(&str->rtcp_rdb); + str->allow_repeat_tx = stream_template->allow_repeat_tx; /* set ssrc to that provided */ str->ssrc = ssrc; @@ -271,6 +290,9 @@ srtp_stream_clone(const srtp_stream_ctx_t *stream_template, str->rtp_services = stream_template->rtp_services; str->rtcp_services = stream_template->rtcp_services; + /* set pointer to EKT data associated with stream */ + str->ekt = stream_template->ekt; + /* defensive coding */ str->next = NULL; @@ -283,14 +305,15 @@ srtp_stream_clone(const srtp_stream_ctx_t *stream_template, * * srtp_kdf_t is a key derivation context * - * srtp_kdf_init(&kdf, k) initializes kdf with the key k + * srtp_kdf_init(&kdf, cipher_id, k, keylen) initializes kdf to use cipher + * described by cipher_id, with the master key k with length in octets keylen. * * srtp_kdf_generate(&kdf, l, kl, keylen) derives the key * corresponding to label l and puts it into kl; the length * of the key in octets is provided as keylen. this function * should be called once for each subkey that is derived. * - * srtp_kdf_clear(&kdf) zeroizes the kdf state + * srtp_kdf_clear(&kdf) zeroizes and deallocates the kdf state */ typedef enum { @@ -309,40 +332,57 @@ typedef enum { */ typedef struct { - aes_icm_ctx_t c; /* cipher used for key derivation */ + cipher_t *cipher; /* cipher used for key derivation */ } srtp_kdf_t; err_status_t -srtp_kdf_init(srtp_kdf_t *kdf, const uint8_t key[30]) { +srtp_kdf_init(srtp_kdf_t *kdf, cipher_type_id_t cipher_id, const uint8_t *key, int length) { - aes_icm_context_init(&kdf->c, key); + err_status_t stat; + stat = crypto_kernel_alloc_cipher(cipher_id, &kdf->cipher, length); + if (stat) + return stat; + + stat = cipher_init(kdf->cipher, key, direction_encrypt); + if (stat) { + cipher_dealloc(kdf->cipher); + return stat; + } return err_status_ok; } err_status_t srtp_kdf_generate(srtp_kdf_t *kdf, srtp_prf_label label, - uint8_t *key, int length) { + uint8_t *key, unsigned length) { v128_t nonce; + err_status_t status; /* set eigth octet of nonce to