diff -ruN asdcplib.old/configure.ac asdcplib/configure.ac --- asdcplib.old/configure.ac 2017-01-17 22:38:59.494475028 +0100 +++ asdcplib/configure.ac 2017-01-17 22:40:43.762470383 +0100 @@ -65,7 +65,7 @@ CXX=$CXX$ac_cv_sys_largefile_CC fi -AX_LIB_OPENSSL([0.9.7]) +AX_LIB_NETTLE([0.9.7]) AX_LIB_EXPAT AX_LIB_XERCES #AM_PATH_PYTHON([2.3], , [:]) diff -ruN asdcplib.old/m4/ax_lib_nettle.m4 asdcplib/m4/ax_lib_nettle.m4 --- asdcplib.old/m4/ax_lib_nettle.m4 1970-01-01 01:00:00.000000000 +0100 +++ asdcplib/m4/ax_lib_nettle.m4 2017-01-17 22:40:43.762470383 +0100 @@ -0,0 +1,277 @@ +# =========================================================================== +# ax_lib_nettle.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_LIB_NETTLE([MINIMUM-VERSION]) +# +# DESCRIPTION +# +# This macro provides tests of availability of Nettle of a +# particular version or newer. This macros checks for Nettle +# headers and libraries and defines compilation flags. +# +# Macro supports following options and their values: +# +# 1) Single-option usage: +# +# --with-nettle - yes, no or path to Nettle installation prefix +# +# This macro calls: +# +# AC_SUBST(NETTLE_CFLAGS) +# AC_SUBST(NETTLE_LDFLAGS) +# AC_SUBST(NETTLE_VERSION) - only if version requirement is used +# +# And sets: +# +# HAVE_NETTLE +# +# Copyright (c) 2008-2009 CineCert, LLC +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# 3. The name of the author may not be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. +# + +AC_DEFUN([AX_LIB_NETTLE], +[ + AC_ARG_WITH([nettle], + AC_HELP_STRING([--with-nettle=@<:@ARG@:>@], + [use Nettle from given prefix (ARG=path); check standard prefixes (ARG=yes); disable (ARG=no)] + ), + [ + if test "$withval" = "yes"; then + if test -d /var/local/include/nettle ; then + nettle_prefix=/var/local + elif test -d /usr/include/nettle ; then + nettle_prefix=/usr + else + nettle_prefix="" + fi + nettle_requested="yes" + elif test -d "$withval"; then + nettle_prefix="$withval" + nettle_requested="yes" + else + nettle_prefix="" + nettle_requested="no" + fi + ], + [ + dnl Default behavior is implicit yes + if test -d /var/local/include/nettle ; then + nettle_prefix=/var/local + elif test -d /usr/include/nettle ; then + nettle_prefix=/usr + elif test -d /usr/local/include/nettle ; then + nettle_prefix=/usr/local + else + nettle_prefix="" + fi + ] + ) + + NETTLE_CPPFLAGS="" + NETTLE_LDFLAGS="" + NETTLE_VERSION="" + + dnl + dnl Collect include/lib paths and flags + dnl + run_nettle_test="no" + + if test -n "$nettle_prefix"; then + nettle_include_dir="$nettle_prefix/include" + nettle_ldflags="-L$nettle_prefix/lib64 -L$nettle_prefix/lib" + run_nettle_test="yes" + elif test "$nettle_requested" = "yes"; then + if test -n "$nettle_include_dir" -a -n "$nettle_lib_flags"; then + run_nettle_test="yes" + fi + else + run_nettle_test="no" + fi + + nettle_libs="-lnettle -lgmp" + + dnl + dnl Check Nettle files + dnl + if test "$run_nettle_test" = "yes"; then + + saved_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS -I$nettle_include_dir" + + saved_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $nettle_ldflags" + + saved_LIBS="$LIBS" + LIBS="$nettle_libs $LIBS" + + dnl + dnl Check Nettle headers + dnl + AC_MSG_CHECKING([for Nettle headers in $nettle_include_dir]) + + AC_LANG_PUSH([C]) + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM( + [[ +@%:@include +@%:@include + ]], + [[]] + )], + [ + NETTLE_CPPFLAGS="-I$nettle_include_dir" + nettle_header_found="yes" + AC_MSG_RESULT([found]) + ], + [ + nettle_header_found="no" + AC_MSG_RESULT([not found]) + ] + ) + AC_LANG_POP([C]) + + dnl + dnl Check Nettle libraries + dnl + if test "$nettle_header_found" = "yes"; then + + AC_MSG_CHECKING([for Nettle libraries]) + + AC_LANG_PUSH([C]) + AC_LINK_IFELSE([ + AC_LANG_PROGRAM( + [[ +@%:@include +@%:@include +#if (NETTLE_VERSION_NUMBER < 0x0090700f) +#endif + ]], + [[ + + ]] + )], + [ + NETTLE_LDFLAGS="$nettle_ldflags" + NETTLE_LIBS="$nettle_libs" + nettle_lib_found="yes" + AC_MSG_RESULT([found]) + ], + [ + nettle_lib_found="no" + AC_MSG_RESULT([not found]) + ] + ) + AC_LANG_POP([C]) + fi + + CPPFLAGS="$saved_CPPFLAGS" + LDFLAGS="$saved_LDFLAGS" + LIBS="$saved_LIBS" + fi + + AC_MSG_CHECKING([for Nettle]) + + if test "$run_nettle_test" = "yes"; then + if test "$nettle_header_found" = "yes" -a "$nettle_lib_found" = "yes"; then + + AC_SUBST([NETTLE_CPPFLAGS]) + AC_SUBST([NETTLE_LDFLAGS]) + AC_SUBST([NETTLE_LIBS]) + + HAVE_NETTLE="yes" + else + HAVE_NETTLE="no" + fi + + AC_MSG_RESULT([$HAVE_NETTLE]) + + dnl + dnl Check Nettle version + dnl + if test "$HAVE_NETTLE" = "yes"; then + + nettle_version_req=ifelse([$1], [], [], [$1]) + + if test -n "$nettle_version_req"; then + + AC_MSG_CHECKING([if Nettle version is >= $nettle_version_req]) + + if test -f "$nettle_include_dir/nettle/nettlev.h"; then + + NETTLE_VERSION=`grep NETTLE_VERSION_TEXT $nettle_include_dir/nettle/nettlev.h \ + | grep -v fips | grep -v PTEXT | cut -f 2 | tr -d \"` + AC_SUBST([NETTLE_VERSION]) + + dnl Decompose required version string and calculate numerical representation + nettle_version_req_major=`expr $nettle_version_req : '\([[0-9]]*\)'` + nettle_version_req_minor=`expr $nettle_version_req : '[[0-9]]*\.\([[0-9]]*\)'` + nettle_version_req_revision=`expr $nettle_version_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'` + nettle_version_req_patch=`expr $nettle_version_req : '[[0-9]]*\.[[0-9]]*\.[[0-9]]*\([[a-z]]*\)'` + if test "x$nettle_version_req_revision" = "x"; then + nettle_version_req_revision="0" + fi + if test "x$nettle_version_req_patch" = "x"; then + nettle_version_req_patch="\`" + fi + + nettle_version_req_number=`expr $nettle_version_req_major \* $((0x10000000)) \ + \+ $nettle_version_req_minor \* $((0x100000)) \ + \+ $nettle_version_req_revision \* $((0x1000)) \ + \+ $((1 + $(printf "%d" \'$nettle_version_req_patch) - $(printf "%d" \'a))) \* $((0x10)) \ + \+ $((0xf))` + + dnl Calculate numerical representation of detected version + nettle_version_number=`expr $(($(grep NETTLE_VERSION_NUMBER $nettle_include_dir/nettle/nettlev.h | cut -f 2 | tr -d L)))` + + nettle_version_check=`expr $nettle_version_number \>\= $nettle_version_req_number` + if test "$nettle_version_check" = "1"; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + AC_MSG_WARN([Found $NETTLE_VERSION, which is older than required. Possible compilation failure.]) + fi + else + AC_MSG_RESULT([no]) + AC_MSG_WARN([Missing header nettle/nettlev.h. Unable to determine Nettle version.]) + fi + fi + fi + + else + HAVE_NETTLE="no" + AC_MSG_RESULT([$HAVE_NETTLE]) + + if test "$nettle_requested" = "yes"; then + AC_MSG_WARN([Nettle support requested but headers or library not found. Specify valid prefix of Nettle using --with-nettle=@<:@DIR@:>@]) + fi + fi + if test "$HAVE_NETTLE" = "yes"; then + CPPFLAGS="$CPPFLAGS $NETTLE_CPPFLAGS -DHAVE_SSL=1" + LDFLAGS="$LDFLAGS $NETTLE_LDFLAGS $NETTLE_LIBS" + fi +]) diff -ruN asdcplib.old/m4/ax_lib_openssl.m4 asdcplib/m4/ax_lib_openssl.m4 --- asdcplib.old/m4/ax_lib_openssl.m4 2017-01-17 22:38:59.494475028 +0100 +++ asdcplib/m4/ax_lib_openssl.m4 1970-01-01 01:00:00.000000000 +0100 @@ -1,290 +0,0 @@ -# =========================================================================== -# ax_lib_openssl.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_LIB_OPENSSL([MINIMUM-VERSION]) -# -# DESCRIPTION -# -# This macro provides tests of availability of OpenSSL of a -# particular version or newer. This macros checks for OpenSSL -# headers and libraries and defines compilation flags. -# -# Macro supports following options and their values: -# -# 1) Single-option usage: -# -# --with-openssl - yes, no or path to OpenSSL installation prefix -# -# This macro calls: -# -# AC_SUBST(OPENSSL_CFLAGS) -# AC_SUBST(OPENSSL_LDFLAGS) -# AC_SUBST(OPENSSL_VERSION) - only if version requirement is used -# -# And sets: -# -# HAVE_OPENSSL -# -# Copyright (c) 2008-2009 CineCert, LLC -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. 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. -# 3. The name of the author may not be used to endorse or promote products -# derived from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -# - -AC_DEFUN([AX_LIB_OPENSSL], -[ - AC_ARG_WITH([openssl], - AC_HELP_STRING([--with-openssl=@<:@ARG@:>@], - [use OpenSSL from given prefix (ARG=path); check standard prefixes (ARG=yes); disable (ARG=no)] - ), - [ - if test "$withval" = "yes"; then - if test -d /var/local/ssl/include ; then - openssl_prefix=/var/local/ssl - elif test -d /var/local/include/openssl ; then - openssl_prefix=/var/local - elif test -d /usr/local/ssl/include ; then - openssl_prefix=/usr/local/ssl - elif test -d /usr/lib/ssl/include ; then - openssl_prefix=/usr/lib/ssl - elif test -d /usr/include/openssl ; then - openssl_prefix=/usr - else - openssl_prefix="" - fi - openssl_requested="yes" - elif test -d "$withval"; then - openssl_prefix="$withval" - openssl_requested="yes" - else - openssl_prefix="" - openssl_requested="no" - fi - ], - [ - dnl Default behavior is implicit yes - if test -d /var/local/ssl/include ; then - openssl_prefix=/var/local/ssl - elif test -d /var/local/include/openssl ; then - openssl_prefix=/var/local - elif test -d /usr/local/ssl/include ; then - openssl_prefix=/usr/local/ssl - elif test -d /usr/lib/ssl/include ; then - openssl_prefix=/usr/lib/ssl - elif test -d /usr/include/openssl ; then - openssl_prefix=/usr - else - openssl_prefix="" - fi - ] - ) - - OPENSSL_CPPFLAGS="" - OPENSSL_LDFLAGS="" - OPENSSL_VERSION="" - - dnl - dnl Collect include/lib paths and flags - dnl - run_openssl_test="no" - - if test -n "$openssl_prefix"; then - openssl_include_dir="$openssl_prefix/include" - openssl_ldflags="-L$openssl_prefix/lib64 -L$openssl_prefix/lib" - run_openssl_test="yes" - elif test "$openssl_requested" = "yes"; then - if test -n "$openssl_include_dir" -a -n "$openssl_lib_flags"; then - run_openssl_test="yes" - fi - else - run_openssl_test="no" - fi - - openssl_libs="-lssl -lcrypto" - - dnl - dnl Check OpenSSL files - dnl - if test "$run_openssl_test" = "yes"; then - - saved_CPPFLAGS="$CPPFLAGS" - CPPFLAGS="$CPPFLAGS -I$openssl_include_dir" - - saved_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS $openssl_ldflags" - - saved_LIBS="$LIBS" - LIBS="$openssl_libs $LIBS" - - dnl - dnl Check OpenSSL headers - dnl - AC_MSG_CHECKING([for OpenSSL headers in $openssl_include_dir]) - - AC_LANG_PUSH([C]) - AC_COMPILE_IFELSE([ - AC_LANG_PROGRAM( - [[ -@%:@include -@%:@include -@%:@include - ]], - [[]] - )], - [ - OPENSSL_CPPFLAGS="-I$openssl_include_dir" - openssl_header_found="yes" - AC_MSG_RESULT([found]) - ], - [ - openssl_header_found="no" - AC_MSG_RESULT([not found]) - ] - ) - AC_LANG_POP([C]) - - dnl - dnl Check OpenSSL libraries - dnl - if test "$openssl_header_found" = "yes"; then - - AC_MSG_CHECKING([for OpenSSL libraries]) - - AC_LANG_PUSH([C]) - AC_LINK_IFELSE([ - AC_LANG_PROGRAM( - [[ -@%:@include -@%:@include -@%:@include -#if (OPENSSL_VERSION_NUMBER < 0x0090700f) -#endif - ]], - [[ -SSL_library_init(); -SSLeay(); - ]] - )], - [ - OPENSSL_LDFLAGS="$openssl_ldflags" - OPENSSL_LIBS="$openssl_libs" - openssl_lib_found="yes" - AC_MSG_RESULT([found]) - ], - [ - openssl_lib_found="no" - AC_MSG_RESULT([not found]) - ] - ) - AC_LANG_POP([C]) - fi - - CPPFLAGS="$saved_CPPFLAGS" - LDFLAGS="$saved_LDFLAGS" - LIBS="$saved_LIBS" - fi - - AC_MSG_CHECKING([for OpenSSL]) - - if test "$run_openssl_test" = "yes"; then - if test "$openssl_header_found" = "yes" -a "$openssl_lib_found" = "yes"; then - - AC_SUBST([OPENSSL_CPPFLAGS]) - AC_SUBST([OPENSSL_LDFLAGS]) - AC_SUBST([OPENSSL_LIBS]) - - HAVE_OPENSSL="yes" - else - HAVE_OPENSSL="no" - fi - - AC_MSG_RESULT([$HAVE_OPENSSL]) - - dnl - dnl Check OpenSSL version - dnl - if test "$HAVE_OPENSSL" = "yes"; then - - openssl_version_req=ifelse([$1], [], [], [$1]) - - if test -n "$openssl_version_req"; then - - AC_MSG_CHECKING([if OpenSSL version is >= $openssl_version_req]) - - if test -f "$openssl_include_dir/openssl/opensslv.h"; then - - OPENSSL_VERSION=`grep OPENSSL_VERSION_TEXT $openssl_include_dir/openssl/opensslv.h \ - | grep -v fips | grep -v PTEXT | cut -f 2 | tr -d \"` - AC_SUBST([OPENSSL_VERSION]) - - dnl Decompose required version string and calculate numerical representation - openssl_version_req_major=`expr $openssl_version_req : '\([[0-9]]*\)'` - openssl_version_req_minor=`expr $openssl_version_req : '[[0-9]]*\.\([[0-9]]*\)'` - openssl_version_req_revision=`expr $openssl_version_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'` - openssl_version_req_patch=`expr $openssl_version_req : '[[0-9]]*\.[[0-9]]*\.[[0-9]]*\([[a-z]]*\)'` - if test "x$openssl_version_req_revision" = "x"; then - openssl_version_req_revision="0" - fi - if test "x$openssl_version_req_patch" = "x"; then - openssl_version_req_patch="\`" - fi - - openssl_version_req_number=`expr $openssl_version_req_major \* $((0x10000000)) \ - \+ $openssl_version_req_minor \* $((0x100000)) \ - \+ $openssl_version_req_revision \* $((0x1000)) \ - \+ $((1 + $(printf "%d" \'$openssl_version_req_patch) - $(printf "%d" \'a))) \* $((0x10)) \ - \+ $((0xf))` - - dnl Calculate numerical representation of detected version - openssl_version_number=`expr $(($(grep OPENSSL_VERSION_NUMBER $openssl_include_dir/openssl/opensslv.h | cut -f 2 | tr -d L)))` - - openssl_version_check=`expr $openssl_version_number \>\= $openssl_version_req_number` - if test "$openssl_version_check" = "1"; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - AC_MSG_WARN([Found $OPENSSL_VERSION, which is older than required. Possible compilation failure.]) - fi - else - AC_MSG_RESULT([no]) - AC_MSG_WARN([Missing header openssl/opensslv.h. Unable to determine OpenSSL version.]) - fi - fi - fi - - else - HAVE_OPENSSL="no" - AC_MSG_RESULT([$HAVE_OPENSSL]) - - if test "$openssl_requested" = "yes"; then - AC_MSG_WARN([OpenSSL support requested but headers or library not found. Specify valid prefix of OpenSSL using --with-openssl=@<:@DIR@:>@]) - fi - fi - if test "$HAVE_OPENSSL" = "yes"; then - CPPFLAGS="$CPPFLAGS $OPENSSL_CPPFLAGS -DHAVE_SSL=1" - LDFLAGS="$LDFLAGS $OPENSSL_LDFLAGS $OPENSSL_LIBS" - fi -]) diff -ruN asdcplib.old/README asdcplib/README --- asdcplib.old/README 2017-01-17 22:38:59.494475028 +0100 +++ asdcplib/README 2017-01-17 22:40:43.762470383 +0100 @@ -56,7 +56,7 @@ The author strives mightily to provide an API that is completely independent of operating system and other library dependencies, and which allows selective replacement of some modules for -local needs. Specifically, the essence parsers and OpenSSL +local needs. Specifically, the essence parsers and Nettle crypto functions can be replaced by linking to alternative implementations of the ASDCP:: objects which provide those services. @@ -81,8 +81,8 @@ this natively, an "nmake" build file and instructions can be found in the win32 subdirectory. -OpenSSL is also required, any recent version should be fine. See -http://www.openssl.org/ for more information and download instructions. +Nettle is also required, any recent version should be fine. See +http://www.nettle.org/ for more information and download instructions. Optional support for writing Timed Text Track Files is supported by either Xerces-C or Expat. See http://xerces.apache.org/xerces-c/ or @@ -817,7 +817,7 @@ Macros are now used in any module that includes KM_log.h. o MPEG2 VES with run of zero values at the head is now OK. o Increased VESHeaderBufSize to 16K. - o Added makefile support for local OpenSSL in ../openssl, if + o Added makefile support for local Nettle in ../nettle, if present. o The Kumu::PathIs*() functions now return false if a null or empty string is given (used to be an assert). @@ -938,7 +938,7 @@ 2006.03.09 - full read-write - o Removed ASDCP_WITHOUT_OPENSSL compile-time option. + o Removed ASDCP_WITHOUT_NETTLE compile-time option. o Full read/write now working on new MXF library @@ -1104,8 +1104,8 @@ 2004.06.14 - plaintext read/write w/key generator v0.4.5 - o Project now uses OpenSSL (tested with 0.9.7d on win32, Linux, Darwin) - Use `make ASDCP_WITHOUT_OPENSSL=1` to make plaintext-only version + o Project now uses Nettle (tested with 0.9.7d on win32, Linux, Darwin) + Use `make ASDCP_WITHOUT_NETTLE=1` to make plaintext-only version o Accepts interior I frames when parsing MPEG2 VES o Improved error reporting on format errors o Added support for encryption to asdcp-test diff -ruN asdcplib.old/README.orig asdcplib/README.orig --- asdcplib.old/README.orig 1970-01-01 01:00:00.000000000 +0100 +++ asdcplib/README.orig 2017-01-17 22:40:39.146470588 +0100 @@ -0,0 +1,1159 @@ + +$Id: README,v 1.111 2016/12/11 04:42:35 jhurst Exp $ + +The asdcplib library is a set of objects that offer +simplified access to files conforming to the sound and +picture track file formats developed by the SMPTE Working +Group DC28.20 (now TC 21DC). + +Recently, support has also been added for SMPTE draft ST +2067-5 "IMF Essence Component", AKA "AS-02". This code was +donated by Fraunhofer IIS. It carries additional copyright +information which should be listed whenever you link the +AS-02 elements of the library. Please look at the top of +the AS-02 files to see this copyright information. + +AS-02 support is carried in separate object modules, so +unless you #include and link libas-02.so you are +still using plain old asdcp. + +This work was originally funded by Digital Cinema Initiatives, +LLC (DCI). Subsequent efforts have been funded by Deluxe +Laboratories, Doremi Labs, CineCert LLC, Avica Technology +and others. + +**The asdcplib project was originally housed on SourceForge. +The project has moved to http://www.cinecert.com/asdcplib/ + +The project formerly depended upon the mxflib project. Because +of its focus on covering the whole of the MXF specifications, +mxflib is considerably larger and more complex that what I +require for this application. For this reason I have created +a dedicated MXF implementation that is now part of this +library. Special thanks to Matt Beard and Oliver Morgan for +their great work and support. + +Thanks also to the members of the SMPTE DC28.20 packaging +ad-hoc group and the members of the MXF Interop Initiative +for their encouragement and support. Special thanks to +Jim Whittlesey and Howard Lukk at DCI for proposing and +supporting this project. + + +Design Notes + +This library is intended (but of course not limited) for +use by developers of commercial D-Cinema products (and now +IMF!). It is designed to be easily integrated into a wide +variety of development environments. Commercial users are +strongly urged to use static linking (at least where you use +this library) to prevent malicious in-field replacement of +critical system modules. This recommendation should be +considered wherever Open Source or Free software is being +used in conjunction with critical security parameters, such +as cryptographic keys. + +The author strives mightily to provide an API that is completely +independent of operating system and other library dependencies, +and which allows selective replacement of some modules for +local needs. Specifically, the essence parsers and OpenSSL +crypto functions can be replaced by linking to alternative +implementations of the ASDCP:: objects which provide those +services. + +AS_DCP.h contains the entire AS-DCP API. You do not need to +read any of the other files, except maybe asdcp-test.cpp which +contains detailed usage examples of each of the API's services. +The KM_* files may be of interest for general development +support, but may be ignored if all you want is simple AS-DCP +support. + +Likewise, draft 2067-5 "IMF Essence Component" (AS-02) support +is entirely contained in AS-02.h + + +Build Instructions + +On more-or-less POSIX systems (OS X, Linux, and BSD), GNU make and +autotools are required to build asdcplib. The same configure script +will also build this package on Windows machines with Cygwin and +MinGW installed. For those Windows users who would prefer to build +this natively, an "nmake" build file and instructions can be found +in the win32 subdirectory. + +OpenSSL is also required, any recent version should be fine. See +http://www.openssl.org/ for more information and download instructions. + +Optional support for writing Timed Text Track Files is supported by +either Xerces-C or Expat. See http://xerces.apache.org/xerces-c/ or +http://expat.sourceforge.net/ for source and build instructions. + +To configure and build, type './configure' followed by 'make'. There +are several test targets on the POSIX side, but you need to assemble +a set of test files to use them. AS-02 support can be enabled with + --enable-as-02. + +I have tested this build on win32, Linux, OpenBSD, and Darwin +platforms. Others may work as well. + + + + +Utilities + +asdcp-test - Writes, reads and verifies AS-DCP (MXF) track files. + +asdcp-wrap - Writes AS-DCP (MXF) track files. + +asdcp-unwrap - Extracts essence from AS-DCP (MXF) track files. + +asdcp-info - Displays information about AS-DCP (MXF) track files. + +asdcp-util - Calculates digests and generates random numbers and UUIDs. + +as-02-wrap - Writes AS-02 Essence Component files. + +as-02-unwrap - Extracts essence from AS-02 Essence Component files. + +kmfilegen - Writes and verifies large files using a platform- +independent format. Use it to test issues related to large files. + +kmuuidgen, kmrandgen - generate UUID values and random numbers. + +wavesplit - Splits a WAVE file into two or more output files. Used + to untangle incorrectly-paired DCDM sound files. + +blackwave - Write a WAVE file of zeros. + +pinkwave - Write a WAVE file of SMPTE ST 2095 pink noise. + +j2c-test - Displays information about JP2K codestreams. + +Experimental feature: Prototype for High Dynamic Range is a wrapper +for the IMF application that allows JPEG-2000 codestreams to be paired +with opaque blobs of metadata. AS-02 support must be enabled to +build this feature, so --enable-as-02 must be enabled if +--enable-phdr is to be used. The following executable programs will be +built: + +phdr-wrap - Writes AS-02 PHDR Essence Component files. + +phdr-unwrap - Extracts essence from AS-02 PHDR Essence Component files. + + +Documentation + +The API documentation is mostly in AS_DCP.h. and AS_02.h Read those +files for a detailed description of the library's capabilities. Read +asdcp-*.cpp and as-02-*.cpp files for library usage examples. The +command-line utilities all respond to -h. + + +Change History + +2016-12-10 - MDD bug fix 2.7.19 + o The previous version (2.7.18) contained incorrect MDD.cpp and MDD.h + files which affect the PIMF and JP2KEssenceCompression labels. + + +2016-12-10 - bug fixes 2.7.18 + o Fixed *all* Partiton version numbers in AS-02 files (the previous attempt + only affected the header partition) + o Improved IMSC-1 profile detection. May not yet be perfect, experimentation + encouraged! + o Added IMF App2e UL values and new MXF data types ColorPrimary and + ThreeColorPrimaries (contributed by Schleich) + o Added picture descriptor elements MasteringDisplayPrimaries, + MasteringDisplayWhitePointChromaticity, MasteringDisplayMaximumLuminance, + and MasteringDisplayMinimumLuminance + o Added -o and -O options to as-02-wrap + o Fixed as-02-wrap option -p when making 4:4:4 files + o Simplified as-02-wrap syntax description + + +2016-12-01 - bug fixes 2.6.17 + o Fixed Partiton and Preface version numbers in AS-02 files + o Replaced WIN32 directory scanner with dirent_win.h + o The NamespaceURI property of AS-02 timed text files has been exposed in the API + and via as-02-wrap -P. This behavior replaces previous bad behavior, but puts + responsibility for selecting the correct value on the operator. + o Exposed CreatePNGNameId and CreateFontNameId subroutines in AS_02::TimedText + o Adjusted UUID generation based on PNG and font names to exclude paths by + inserting a call to PathBasename at each Id generation site + o Fixed AS-02 timed text index partition + o Fixed contents of generic partiton EssenceContainers property in AS-DCP timed + text files + o Added PixelLayout to RGBAEssenceDescriptor (contributed by Schleich) + o Cleared up MXFGCP1FrameWrappedPictureElement / MXFGCP1FrameWrappedPictureElement + ambiguity. PHDR continues to use MXFGCP1FrameWrappedPictureElement. + MXFGCI1FrameWrappedPictureElement is supported for interlace. + o Added support for 192, 200 and 240 fps images, includes 96, 100 and 120 fpe stereo + o Added missing MCA properties to MCALabelSubDescriptor (contributed by Ruppel) + o New MXF data type: LineMapPair + o Added default 0,0 VideoLineMap value when wrapping CDCI with as-02-wrap + o Added VideoLineMap property to GenericPictureEssenceDescriptor + o Added timed text unwrap support to as-02-unwrap (contributed by Ruppel) + o Added prototype PIDM dynamic metadata wrapping, config with --enable-phdr + (Not for production use, caveat emptor, not the droids, etc.) + + +2016-08-11 - bug fixes, 2.5.15 + + o Modified as-02-wrap to pass WhiteRefLev, BlackRefLev and ColorRange + (contributed by Elmer Musser / Rod Bogart) + o Fixed a bug in the index reader that allowed an out-of-bounds vector index + to be used. + o Modified the IndexEntry parser to ignore additional bytes belonging to slice + values. + + +2016-05-06 - bug fixes, 2.5.14 + + o Release 2.5.12 caused two problems with Atoms and DTS-X wrapping that are + addressed by this release. The UL values that were changed to correct the + DCData (ST 429-14) implementation had two unintended side-effects: + 1. v2.5.12 cannot read old DCData (and thus DTS-X) track files + 2. v2.5.12 creates broken Atmos track files (incorrect ULs) + The fix for this involved the following changes: + 1. ASDCP::DCData::(MXFReader|MXFWriter) are no longer base classes of + ASDCP::ATMOS::(MXFReader|MXFWriter). + 2. New UL values have been added to carry the original Atoms UL values: + a. DolbyAtmosDCDataWrappingFrame + b. DolbyAtmosDCDataEssence + c. DolbyAtmosDCDataDescriptor + 3. ASDCP::ATMOS::(MXFReader|MXFWriter) have been modified to use the + DolbyAtmosDCData* UL values. + 4. ASDCP::DCData::MXFReader will parse files having either DCData* or + DolbyAtmosDCData* UL values. + 5. ASDCP::DCData:: MXFWriter continues to use DCData* UL values from ST + 429-14 + o Some optional parameters of the MXF metadata packs were being erroneously + initialized with a value of zero (0), such as GenericPictureEssenceDescriptor + ::SignalStandard, GenericPictureEssenceDescriptor::SampledXOffset(0), etc. + o Added higher edit rates (96, 100, 120) to the cinema TimedText_Parser + + o Defined bool ASDCP::UL::operator<(const UL& rhs) const, which is needed to + carry out the version-insensitive lookup policy when searching for ULs in a + std::map<> of UL entries. + o New files: src/info.in src/CMakeLists.txt + o Removed filess: AS_DCP_DCData_internal.h + + +2016-03-17 - bug fixes, 2.5.12 + o Changed default UNIX file permissions to "666" + o Changed default UNIX file permissions to "777" + o Added missing initializer for caltime::offset + o Fixed UL values for Aux Data files (per ST 429-14) + o Added support for default TTML fonts (ST2052_TextParser) + o Added Solaris patch to KM_fileio (Thanks Mikey!) + o Fixed the version byte in UL DataEssenceCoding + o Fixed duplicate linkage error for symbol MIME2str + o Big patch from Wolfgang Ruppel: + o Corrected erroneous fixed-tag values in ActiveHeight, ActiveWidth, + ActiveXOffset, ActiveYOffset UL definitions. + o Provided a stub implementation for Kumu::DirScannerEx (A real + implementation will follow soon.) + o Added as-02-info program + o Added Seek() method to PCM parsers + o Added CMakeLists.txt + + +2015-11-10 - bug fixes, IMF text, pink noise, 2.5.11 + o I moved personal dev environment from older gcc to newer clang. Many + small changes were made to satisfy the new compiler: + - Altered many printf format codes to use the correct format for the + given integer type. + - Parenthesized some expressions to clarify previously ambiguous + expectation about precedence. + - Created macro KM_MACOSX for use in OS-specific code selection. + - Removed last uses of the old C-language abs(), now using Kumu::xabs(). + - Removed last uses of the old C-language atoi(), not using strtol(). + o Added platform-independent call Kumu::GetExecutablePath() (to be tested + on win32). + o Added new capabilities to Result_t. + o Added imlementation of SMPTE ST 2092-1 pink noise generator. + o Added pinkwave CLI utility. + o Added font support to the IMF timed-text wrapper. + o Fixed a bug that was causing Array properties to be written without + the (count, length) header (from PAL). + o General review of Batch/Array distinction throughout the project. + o Cleaned up definitions of optional properties in all MXF metadata packs. + o Fixed Win32 build (from Crowe). + o Fixed a bug that caused incorrect failure when parsing JPEG 2000 + codestreams having fewer than five decomposition levels. (from Korneder). + o Fixed missing UUID generation in some instances of the MCALinkID property. + o Added -w option to asdcp-wrap to support use of WTF label with MCA. + o Altered asdcp-wrap to recognize "-C
    " when MCA is being used. + o Fixed broken -A / option in as-02-wrap and phdr-wrap. + o asdcp-wrap and as-02-wrap now allow split channel groups in MCA labels. + + +2015-02-23 - bug fixes, 2.4.10 + o Fixed a new bug introduced by the fix to large numbers of subtitle ancillary + resources. + o Added support for generic Aux Data (ST 429-14) to asdcp-wrap. + + +2015-02-19 - PHDR feature, bug fixes, 2.4.9 + o Modified PCMParser and PCMParserList to return partial frame buffers at the + end of a WAV input file. This was needed to allow wrapping all samples into + an AS-02 audio file (which is clip-wrapped) in the case where the input file + has an odd number of samples with respect to the frame buffer size being + used. If there is more than one input file the length of the last buffer + will be determined by PCMParserList to be the shortest of the input files. + Prior to this change, partial samples in an input WAV file have been + abandoned (i.e., not written out to the MXF file). As a result, AS-DCP + applications will have to decide whether to abandon the partial last frame + (usually detected by testing frame_buffer.Size() != frame_buffer.Capacity()) + or write it to the MXF file. Programs written to the old API will write the + partial frame (i.e., new behavior.) This should not be harmful since the + remainder of the buffer is zeroed and the output file will contain one + additional edit unit compared to the previous version. + o asdcp-wrap has been modified to test for the partial buffer and by default + will complain and abandon the buffer (i.e., same behavior but with a warning + message.) A new command line switch (-g) alters this behavior and writes + the buffer to the MXF file (it still warns the user that this condition is + present.) + o as-02-wrap now wraps all samples from the input file to the MXF file. There + is no padding, the clip is exactly the set of samples from the input. + o as-02 unwrap is temporarily restricted to creating wav files that are + aligned with the frame buffer size. This means that the output file will + be longer than the original WAV input in the case where the input file has + an odd number of samples with respect to the frame buffer size being used. + The pad samples are zero (silence). + o Modified CalcFramesFromDurationInSamples() to increment the count by one for + the case where the input file has an odd number of samples with respect to + the frame buffer size being used (previously it truncated the odd samples.) + o Fixed ST 429-5 / ST 2067-5 wrapping to increase header space when ancillary + resources are present (fixes a bug that cause the header to overflow the + allotted space when large numbers of PNG files were present.) + o Refactored GetXMLDocType() to use the XML parser. + o Added ParseFirstFromString() method to Kumu::XMLElement + o Removed Kumu::StringIsXML from the API. + o Added ASDCP::MXF::RGBALayout type + o Added J2CLayout property to JPEG2000PictureSubDescriptor + o Changed km_token_split() to retain empty elements in the output list + o Added PHDR wrapping for AS-02. + o Added J2CLayout property to the JPEG2000PictureSubDescriptor. This + support is preliminary: the Raw data type is being used instead of + RGBALayout type, which will be in the next release. + + +2014-10-2 - Bug fixes and enhancements, 2.2.6 + o Fixed erroneous 377-4 MCA identifier in AS_DCP_PCM dump routine + o Fixed erroneous byte 13 in + WaveAudioDescriptor_ReferenceAudioAlignmentLevel label + o Added missing implementation of -W option to as-02.unwrap + o Fixed erroneous use of d-cinema ChannelAssignment label in as-02-wrap + + +2014-10-01 - Bug fixes and enhancements, 2.2.5 + o Finished AS-02 text wrap/unwrap + o Fixed fractional seconds parsing for Timestamp objects + o Updated KLVPacket to use 64-bit length; allows huge packets + in AS-02 PCM files + o cleaned up use of atoi() in the library + + +2014-07-09 - Additional IMF/AS-02 support, bug fixes and enhancements, 2.1.4 + o Added IMF App 2 edit rates in AS_02 namespace: EditRate_29_97, + EditRate_59_94. + o Revised AEC CBC context objects to copy the key rather than + keep the reference passed in to it. + o Addressed a bug that would allow unimpeded iteration of component + values in a JP2K::PictureDescriptor object. + o Addressed a bug that was incorrectly recording the sequence Duration + in MXF Track objects. + o Added ASDCP::AtmosSyncChannelMixer::AppendSilenceChannels() + o Added a QCD decoder to the j2c parser. + o Altered ASDCP::KLVPacket::HasUL() to use version-blind matching. + o Fixed an uninitialized variable in MemIOReader::ReadString() that + caused unbounded reads. + o Fixed broken ByteString::ArchiveLength() method + o Fixed broken version numbers on SoundfieldGroupLinkID and + GroupOfSoundfieldGroupsLinkID UL values. + o Added DBOXMotionCodePrimaryStream and DBOXMotionCodeSecondaryStream UL + values to the internal dictionary. + o Added optional prefix handling to MCA label generator. + o Re-factored MCA label generator to include additional + metadata (Thanks to Mike Radford). + o Added new options to as-02-wrap. + + +2014-01-06 – Additional IMF/AS-02 support, bug fixes 2.1.1 + o Fixed missing-index-partion bugs for AS-02 files. + o Moved LocalFilenameResolver into the AS_DCP public API so that it + can be used by other modules including AS-02. + o Did further refactoring of AS-02 Writer classes to separate CBR + and VBR indexing implementations. + o Fixed wave wrapping UL in clip-wrapped AS-02 files. Renamed some + UL constants to reflect "clip" or "frame" wrapping. + o Re-factored JP2K_PDesc_to_MD() and MD_to_JP2K_PDesc() to work + with GenericPictureEssenceDescriptor objects. + o Fixed a bug that was suppressing PictureComponentSizing, + CodingStyleDefault and QuantizationDefault when writing the + essence descriptor in a JP2K file (AS-DCP and AS-02). + o Fixed the version byte on the following UL values: + StereoscopicPictureSubDescriptor + GenericPictureEssenceDescriptor_ColorPrimaries + GenericPictureEssenceDescriptor_ActiveHeight + GenericPictureEssenceDescriptor_ActiveWidth + GenericPictureEssenceDescriptor_ActiveXOffset + GenericPictureEssenceDescriptor_ActiveYOffset + o Added some essence descriptor options to as-02-wrap. + o Changed bit rate display in asdcp-info from mebi-bits/s to + mega-bits/s. + o Added "SMPTE" / "Interop" format type display to asdcp-info. + o Improved integration of ST 377-4 MCA concepts with ST 429-2 static + labels. + o Modified asdcp-wrap to assume -L when wrapping timed-text (since + there is no MXF text wrapping for Interop.) + o Added new EssenceType_t values for IMF/AS-02 track files. + o Added detection for AS-02 track files to ASDCP::EssenceType() + o Changed lots of "const char*" to "const std::string&" in the + APIs defined by KM_fileio.h and AS_DCP.h. + o Fixed VBR Delta Segment entries to correctly flag progressive + material. + o Fixed PCM unwrapping bugs in as-02-unwrap. + o Fixed missing return statement in ArchivableString::ArchiveLength + (thanks to both Kristof Provost and Franck Chopin) + o Fixed broken sample alignment in RF64Writer (thanks to Wolfgang + Woehl and Dolby) + o Fixed win32 build (thanks to Dolby) + o fixed a bug that caused blackwave to only produce 96kHz WAV files. + (thanks to Stephane W) + + +2013-07-02 – IMF/AS-02 support, bug fixes 2.0.0 + o Massive refactoring of internals to allow easier implementation + of AS-02. Some API changes were made as well (note that + OPAtomHeader is now OP1aHeader and RIP is no longer part of the + OP1aHeader.) If you are using this project as a library (and + especially if you are keeping patches against it) PLEASE TAKE + TIME TO EVALUATE THIS RELEASE THOUROUGHLY BEFORE ADDING IT TO + YOUR RELEASE PATH. + o Final integration of Fraunhoffer IIS code contribution. AS-02 + files are now fully supported with some TODOs and two major + exceptions: LEAD indexes are not supported by the MXF writers + and interlace images are not yet supported. + o Added support for MCA labels (ST 428-12) to asdcp-wrap. Note + that this project is still in the early stages of interop testing + so errors are likely present and don't expect any server to + make use of this feature. + + +2013-07-01 - Bug fixes, enhancements 1.12.50 + o Fixed missing return statement in ArchivableString::ArchiveLength + (thanks to both Kristof Provost and Franck Chopin) + o Fixed broken sample alignment in RF64Writer (thanks to Dolby) + o Fixed win32 build (thanks to Dolby) + + +2013-04-12 - Dolby Atmos support and more audio labels 1.11.49 + o Significant code contribution from Dolby Laboratories to add + support for generic data track files as proposed in ST 21DC + and also Dolby Atmos track file support as a specialization. + o Added Dolby-contributed code to support generating the external + sync signal for d-cinema as proposed in ST 21DC. + o Added Dolby-contributed code to support RF64 WAVE files. + o Fixed UL error in ST 429-5 DM encoding (contributed by Dolby). + o Added ULs for ST 428-12 and Amd. 429-2 2013. Please check! + + +2013-02-20 - bug fixes, enhancements 1.10.48 + o Refactored internals of the AS-DCP file readers. While no + changes in behavior are intended, users are cautioned to test + thouroughly before use in production. + o Fixed a bug in ReadAncillaryResource that was causing bogus HMAC + failures when reading resources from a file. + o Fixed premature-release bug in the Expat version of the XML parser. + Thanks to Carsten Feldheim (IIS) for the tip. + o Fixed -W option in asdcp-unwrap. Thanks to RGB. + o Added P-HFR support to asdcp-wrap (see URL for details: + http://isdcf.com/papers/ISDCF-HighFrameRate-DCP.pdf). + o Added support for SMPTE ST 428-21 "Archival Frame Rates". + o Added -P option to asdcp-wrap (inserts arbitrary UL into the + PictureEssenceCoding property when wrapping JP2K files.) + o Added support for 96 kHz files to blackwave. + o Added new path and string manglers to Kumu. + o Updated MCA ULs (I warned you...). Again please take some + time to proof this work against ST 477-4 including the latest + drafts of the registries. + Changed the version byte (8 0f 16) to 0x0e: + MCALabelSubDescriptor + AudioChannelLabelSubDescriptor + SoundfieldGroupLabelSubDescriptor + GroupOfSoundfieldGroupsLabelSubDescriptor + GroupOfSoundfieldGroupsLinkID + Changed bytes 8 and and 13 of SoundfieldGroupLinkID + Added items to the UL dictionary: + MCAPartitionKind + MCAPartitionNumber + MCATitle + MCATitleVersion + MCATitleSubVersion + MCAEpisode + MCAAudioContentKind + MCAAudioElementKind + + +2012-08-07 - bug fix, 1.10.46 + o Added missing zero-initializers to time values when parsing a + timestamp string (in the case where the optional [Thh:mm.[:ss]] + syntax is not present in an encoded string). + +2012-03-06 - bug fixes, enhancements 1.9.45 + o Removed ASDCP::Timestamp, all items that were of that class are now + of class Kumu::Timestamp + o Refactored Kumu::Timestamp to use KM_tai for internal representation + (replaced public Y M D, h, m, s variables) + o Refactored Kumu::Timestamp to use KM_tai for WIN32 builds + o Added UTC offset awareness to Kumu::Timestamp + o Replaced "long GetSecondsSinceEpoch(void) const" with + "ui64_t GetCTime() const" + o Corrected UL version segment in "7.1 DS" and "WTF" audio format + labels (corresponds with publication of ST 429-2:2011). + o Exposed MXF object interface (MXF.h, Metadata.h) via ASDCP MXFReader + and MXFWriter classes. + o Added UL values from ST 377-4:2012. >>>>NOTE: These are preliminary + values, subject to change upon final publication of not only ST 377-4 + but also the relevant registries. This is a good time to compare them + to the standard and complain if you think they are wrong! + o Added MCALabelSubDescriptor, AudioChannelLabelSubDescriptor, + SoundfieldGroupLabelSubDescriptor, and + GroupOfSoundfieldGroupsLabelSubDescriptor (from ST 377-4:2012) to + Metadata.h + o Changed some internals to make MXFWriter::OPAtomHeader() work correctly. + o Split asdcp-test into several different programs to help relieve + the impenetrable-list-of-arguments problem. asdcp-wrap, asdcp-unwrap + and asdcp-info take the place of asdcp-test's -c, -x and -i options, + respectively. asdcp-util contains the remaining functions. Note that + asdcp-test is now DEPRECATED, new functionality and bug fixes will be + aimed at the new tools. Also note that some options and calling + conventions are different for the new tools as compared to asdcp-test. + Please read the synopses and make sure you understand the new idioms. + o asdcp-wrap has a new argument, -C
      , that writes the given UL to the + ChannelAssignment item in the WaveAudioDescriptor (only useful when + writing PCM essence). + + +2011-11-30 - bug fixes v1.8.44 + o Corrected a wrong decryption UL selection when unwrapping MXF. + + +2011-10-27 - bug fixes v1.8.43 + o Corrected broken Essence UL matching. (Thanks to Michael Loder). + + +2011-08-31 - bug fixes v1.8.42 + o Added missing HFR support for PCM essence reader/writer. + + +2011-08-30 - bug fixes, enhancements v1.8.41 + o UL version byte now ignored when comparing UL values. + o Changed the version byte in the TimedTextEssence UL to 0x01. There + is no published Essence Keys registry so it can't have a maintained + version number. + o JP2K Sequence Parser modified to skip directory entries that + are not files in the case where the parser is initialized with + a directory path. When initialized with a list of file names + this check is not performed. Based on a hint by Steve Quartly. + o Increased the size of the MPEG header parser buffer. + o Added missing FrameType() implementation to ASDCP::MPEG2::MXFReader. + o Added missing Close() implementations to MXF reader classes. + o Added missing Timestamp::Timestamp(const char* datestr) implementation. + (Thanks to Matt Sheby for this and the previous three items.) + o Fixed error in Kumu::FortunaRNG::FillRandom() that was returning the + end of the random buffer instead of the front (Thanks to Mike Radford). + o Added support for proposed sound channel format identifiers + '7.1DS' and 'WTF'. Optimistically chose version '0x0c'. + o Added support for stereoscopic images in JP2K files at edit + rates of 48, 50 and 60 eups (96, 100 and 120 fps). + + +2010.11.15 - bug fixes, enhancements v1.7.40 + o Fixed bug in long KLV packet support (Thanks to Jim Radford). + o Fixed AvgBps in PCM files, *again*. Sorry for the crazy. + o More fixes and changes in support of 25, 30, 50, 60 fps. + (Thanks to Hans K. for the TC rate bug). + o Updated KLVFill UL version element to 0x02. + o Type change to support Xerces-C 3.x. (Thanks to Matt Sheby). + o Some internal API changes to KLV types. Does not affect + operation. + o Added NetworkLocator type to MXF metadata types. + o Added file offset display to klvwalk. + + +2010.09.09 - bug fixes, enhancements, v1.7.39 + o Fixed bug in JP2K PictureDescriptor initialization in + JP2K::MXFReader::OpenRead() and JP2K::MXFSReader::OpenRead() + o Once again fiddling with AvgBbs. How can something so simple + be such a constant cause of trouble? Tested with 1-, 2- and + 6-channel input Wav files. + o asdcp-test now accepts a directory name when making PCM + files (-c). The directory name should be the only filename + argument. All files in the directory must be Wav files + (mixed channel sizes OK). Files are sorted alphabetically by + filename. Hint: use numeric name infix to define order: + my_movie_00_L.wav + my_movie_01_R.wav + my_movie_02_C.wav + my_movie_03_LFE.wav + my_movie_04_LS.wav + my_movie_05_RS.wav + + +2010.07.20 - bug fixes, v1.6.37 + o Fixed TimedTextResourceSubDescriptor UL value. + + +2010.06.16 - bug fixes, v1.6.36 + o Added support for new Edit Rates to asdcp-test.cpp. + o Expanded timed-text file reader in asdcp-test.cpp. + o Fixed large BER value encoding (plaintext) and decoding + (plaintext and ciphertext). This feature was introduced in + v1.5.31). + o Fixed AvgBps value for multi-channel Wave input. + + +2010.05.13 - bug fixes, enhancements, v1.6.34 + o ST 429-5 files have corrected ULs for DCTimedTextDescriptor and + GenericStream DataElement. Files made with previous versions of + the library are incompatible with this and future versions. + o Fixed File Package TrackNumber values. Th +anks to Sankar. + o Added edit rate constants to AS_DCP.h (25, 30, 50, 60). + o Changed AudioDescriptor "SampleRate" element name to "EditRate" + to make it consistent with the other types. + o Now builds with XercesC 3.x. + o KM_memio.h has better const behavior. + o Fixed a bug in KM_memio.h string archiving. + + +2010.01.05 - bug fixes, enhancements, v1.5.32 + o Re-fixed swapped Interop and SMPTE OP Atom UL values. The swap + introduced in v1.5.31 was done in error. + o Added -z,-Z options to asdcp-test (j2c parameter checking) + o Reformed jp2k-test as j2c-test, added help and list processing, + added to standard install target. + + +2009.12.31 - bug fixes, enhancements, v1.5.31 + o Fixed swapped Interop and SMPTE OP Atom UL values. + o Added get_BER_length_for_value() subroutine. + o Modified ASDCP::h__Writer::WriteEKLVPacket() to allow larger BER + lengths for KLV packets larger than 16 MB. This was required to + support large font files in the SMPTE 429-5 implementation. + + +2009.11.06 - bug fixes, enhancements, v1.5.29 + o Fixed a bug that could cause HMAC values to be incorrectly + stored in MXF files. Files created with versions of asdcplib + prior to this version may have incorrect HMAC values. + o Improved handing of XML files for MXF wrapping. + o Jpeg2000 codestream EditRate and SampleRate mismatches + now warns instead of returning an error. + o Improved error handling in Jpeg2000 sequence parsing routines. + o Added two methods to Kumu::Timestamp, AddSeconds(), to add (or + subtract) seconds to a time value, and GetSecondsSinceEpoch() + to get the number of seconds since the unix epoch. + o Added new option to asdcp-test, '-a', to specify a UUID when + creating MXF files. + o Added support for specifying the intrinsic duration of MXF files + containing timed text. + o Added new option to wavesplit, '-i', to display WAV file metadata. + + +2009.05.21 - bug fixes, v.1.4.24 + o Fixed a bug that caused incorrect SubDescriptors UL values to be + written into interop format MXF track files. Note that this involved + a substantial reorganization of MXF internals. Please test thoroughly + in your application before using in production. Note that this is a + significant bug fix and track files created with 1.4.22 may be incompatible + with other systems. + + +2009.04.09 - SMPTE format fixes, enhancements and bug fixes, v.1.4.22 + o asdcplib now uses GNU autotools on POSIX systems to configure + and build. See "./configure" for details. Note that two options, + --enable-freedist and --with-python are not enabled in the free + version of asdcplib and should not be used. + o Added build option (CONFIG_RANDOM_UUID) to enable mixed case UUID + generation when environment variable KM_USE_RANDOM_UUID is defined. + o Fixed a condition that could cause an error to occur when wrapping + SMPTE format timed text track files that do not define a starting + frame. + o Updated ULs for SMPTE format track files. + o SampleRate added to JP2K metadata + o Support for wrapping 96kHz WAV files added. + o Updated ULs for audio channel formats (ChannelFormat) + o Updated font subdescriptor MIME Types for TimedText Trackfiles. + o Changed time implementation to support dates beyond Jan 19th, 2038. + o Xerces-C XML parser support added. + o New build method for Windows (see win32/README.txt for details). + o Added new functionality in Kumu to recursively create and delete files + and directories, and get free disk space for a given volume path. + o Added a method to Kumu::Timestamp, AddMinutes(), to add (or subtract) + minutes to a time value. + o Improved how Kumu::Timestamp parses timestamps with offsets. + o Fixed a bug that caused incorrect HMAC values to be calculated. + + +2008.02.16 - SMPTE format fixes, bug fixes v.1.3.18 + o Added correct SMPTE UL for StereoscopicPictureSubDescriptor. + o Exposed JP2K metadata parser as ParseMetadataIntoDesc(). + o Added simple stereoscopic framebuffer to support paired ReadFrame() + and WriteFrame() methods (allows simpler integration with other + single-buffer code). + o Improved detection of JPEG Interop stereoscopic files. + o Win32 build fixes (Thanks to Mike Crowe at DTS). + o Added the WITH_MD macro to the makefile. Set this value to one + to build Win32 with /MD[d] instead of /MT[d]. + o The Generic Container UL has been added to the EssenceContainers + set in the header partition pack for encrypted files. It has always + been there in plaintext files. + - Below this point the changes are internal and should not affect you + unless you use Kumu directly. + o Major refactoring of KM_log.[h|cpp]. + o Fixed buffer re-sizing issue in Kumu::ByteString. + o Replaced type IdentifierList with ArchivableList. + o Added COPYING file to the release bundle. + + +2007.12.13 - Bug fixes v.1.2.17 + o Changed Result_t implementation to use int instead of long, which + was causing trouble on some 64 bit platforms. + o Fixed EKLV HMAC. NOTE: Breaks backward compatibility with older + Interop files. To validate these files, use asdcplib-1.1.14. This + should not cause too much trouble since files with broken and + non-broken HMAC have been in the wild for years without issue. + o Fixed HMAC sequence numbering in encrypted stereoscopic files. + o Finished stereoscopic test targets in the makefile. + o Fixed the win32 build, now expects VS2005 compiler by default, + use WITH_VC6=1 top get VC6 flags. + o Stereoscopic and Timed Text modes now have SMPTE UL values. + NOTE: SMPTE 429-5 and 429-10 are not yet published. It is possible + that these UL values may change before publication. Please use + caution when using these features for production work. + o Changed a bunch of symbol names in the 429-5 implementation to + better match the spec. + o Added -U option to asdcp-test to dump the UL library to stdout. + o Fixed erroneous placement of the PictureEssenceCoding UL in JP2K + files (Interop and SMPTE modes). + + +2007.10.22 - Timed Text, Stereoscopic Picture and Bug fixes v.1.2.16 + o Significant API changes have been made. Please read all entries + in this changelog to be sure you understand the changes. Also + note that some changes have been made to LS_MXF_SMPTE files that + are incompatible with earlier releases (e.g., EKLV HMAC). If + you are looking for a stable interop release, use v.1.1.14. + o Fixed RFC 2104 HMAC implementation for LS_MXF_SMPTE only. The + broken implementation has been maintained for Interop mode. + o Added support for draft SMPTE 429-5 Timed Text Track File. This + is still waiting for official SMPTE ULs, so do not use it for + shipping products. An XML parser is needed to create a Timed + Text Track File; Expat is now an optional part of the build. + Make with WITH_XML_PARSER=1 to link with Expat. If you do not + link with expat, you will get an error when using the TimedText:: + DCSubtitleParser class. See also S429-5-cgi.cpp for an example + that shows how to serve plaintext MXF file elements directly via + HTTP. + o Added support for draft SMPTE 429-10 Stereoscopic Picture Track + File, including the JPEG Interop version. This is still waiting + for official SMPTE ULs, so do not use it with LS_MXF_SMPTE for + shipping products. + o Refactored the following files as a side-effect of the above + work: AS_DCP_JP2K.cpp AS_DCP_MPEG2.cpp AS_DCP_PCM.cpp + AS_DCP_MXF.cpp AS_DCP_internal.h MXF.[h|cpp] MXFTypes.[h|cpp] + Metadata.[h|cpp] h__Reader.cpp h__Writer.cpp klvwalk.cpp. + WARNING: While significant effort has been extended to make sure + that these changes do not affect existing stable file support, + users are cautioned to test this release thouroughly. + o Added a large set of filesystem path manglers to KM_fileio.h. See + path-test.cpp for example usage. The path manglers have not yet + been tested on win32 platforms (they are currently used only by + the Timed Text module. + o The PathIsFile(), PathIsDirectory() and FileSize() subroutines + have been modified to accept const std::string& instead of + const char*. + o Added namespace and parsing support (Expat) to Kumu::XMLElement + (currently used only for Timed Text support). Also added some + new accessors. + o Altered MXF::UTF16String to use mbtowc() and wctomb(). + + +2007.03.31 - Bug fixes v.1.1.14 + o Fixed KeyFrameOffset value in MPEG wrapping to have negative + value. This is probably not yet complete for handling all + types of GOPs. Please send chunks of MPEG-2 VES that you + find which break this. Thanks to Doremi. + ** no other file format changes in this release ** + o Fixed error in RIP interpretation when reading arbitrary (i.e., + non-MXF) files. + o Fixed a memory leak in ASDCP::MXF::OPAtomHeader when used + in read mode. Thanks to Mahesh Bajaj for pointing out this + bug and the one above. + o Removed asserts from KM_fileio, replaced with RESULT_WRITEFAIL + return value statements. + o Added -s and -p to the makefile install target. + o Altered ByteString behavior to use target Length() in copy + operations (instead of Capacity()). + o Added new Set() method to ByteString. + o Fixed a bug in ByteString::Unarchive() that caused the operation + to fail when the buffer was smaller than the read (i.e., when + Capacity() was called). + o Added IdentifierList class to KM_util.h. + o Changed some Error() messages to Debug() in Wav.cpp + o Revived jp2k-test.cpp and asdcp-mem-test.cpp (they both had + stale #includes). + + +2007.02.15 - Bug fixes v1.1.13 + o Removed 'VDescObj->SampleRate.Numerator = VDesc.FrameRate;' + from MPEG2_VDesc_to_MD() in AS_DCP_MPEG2.cpp, was line 76. + o Added KM_TEST_NULL_STR_L() and KM_TEST_NULL_L() macros to + KM_log.h. These versions log the location of the null value. + Macros are now used in any module that includes KM_log.h. + o MPEG2 VES with run of zero values at the head is now OK. + o Increased VESHeaderBufSize to 16K. + o Added makefile support for local OpenSSL in ../openssl, if + present. + o The Kumu::PathIs*() functions now return false if a null or + empty string is given (used to be an assert). + o Cleaned up the install target in the makefile. + o Fixed SMPTE 429-6 HMAC -- FIPS 186-2 implementation was + laughably incorrect. Thanks to Doremi for pointing this out. + o Removed default parameter to HMACContext::InitKey(). + o Cleaned up messages and CLI arg handling in asdcp-test. + + +2006.11.19 - Mo better stuff v1.1.12 + o Changed read-only Result_t accessor methods to const. + o Added Base64 (-B) option to kmrandgen. + o Removed 16-bit alignment restriction from kmrandgen. + o Improved WAV file extraction speed (Thanks to Jim Radford + for pointing this out). + o Added single-channel split for WAV extraction (asdcp-test -1). + o Fixed remainder bug in h__RNG::fill_rand(). + + +2006.11.03 - Bug fixes v1.1.11 + o Increased index table entry list size to 5000. + o Added length checking to TLV writer (returns error if TLV + payload exceeds 64kB). + o Fixed partition header and RIP errors related to 2-partition + files (MXF Interop mode). + o Added -t option to asdcp-test (SHA-1 digest with Base64 output + on stdout). + o Fixed Sub Descriptor reference bug (Thanks to Denis Leconte + for dogged determination). + o Added directory-of-wav detection to RawEssenceType() + o Modified MXF::Partition::AddChildObject() to only generate + a UUID if the InstanceID is unset. + o Added ComponentMaxRef & ComponentMinRef to RGBAEssenceDescriptor. + More to follow. + o Added detection of 2K/4K jp2c, writing correct 4K metadata. + + +2006.10.05 - Bug fixes v1.1.10 + o Changed RM_RELEASE to RL_RELEASE in MXFTypes.h. + o Changed the MXF writer to use RL_RELEASE (was RL_DEVELOPMENT). + o Really fixed source reference chain. + o Updated JP2K file package label. + o Changed location of JPEG2000PictureSubDescriptor in the + header (was erroneously before Preface). + o Altered LS_MXF_INTEROP to produce 2-partition files. + + +2006.09.25 - Bug fixes v1.1.9 + o Fixed SourcePackageID value. All files will be 'original', + i.e. SourcePackageID will be all zeros. Let me know if you + want to set SourcePackageID. + o Fixed compiler warnings on some Linux platforms + o Fixed the build so that BUILD_DIR is no longer created + as a dependency. + o Added duration detection to the raw essence parsers. The + MPEG parser uses a nasty approximation so don't use it + without paying close attention to the result. + o Modified PCMParserList to make it more useful as a base + class. + o Fixed bugs and re-organized command-line help in asdcp-test + and klvwalk. + o Fixed two-partition file reads. + o Fixed Win32 PRNG initialization. + o Renamed asdcp-lf-test as kmfilegen. + o Added kmrandgen and kmuuidgen. + o Added string retrieval mechanism to Result_t. + o Refactored Kumu::Identifier and its sub-classes. + o Altered Kumu::PathIsFile to return true when the path + is a symbolic link (unix only). + o Altered Kumu::FileWriter::OpenWrite to use file creation + mode 0664 (was 0644) (unix only). + o Added Kumu::WriteStringIntoFile() subroutine. + + +2006.04.05 - Bug fixes and new stuff v1.1.7 + o Fixed a bug in the MPEG parser that caused it to fail when + handling start codes spanning buffer boundaries + o Added wavesplit and blackwave utility programs + o Added support for revised SMPTE HMAC key derivation when + using LS_MXF_SMPTE + o Refactored platform compatibility and general utilities + into a new sub-library "Kumu". There are no new build + steps or dependencies, but some important things have + changed: + + Result_t is no longer an enum, it is now a class. + Library result codes are now declared as const objects + like this: + + const Kumu::Result_t RESULT_FORMAT (-101, "The file..."); + + The macros ASDCP_SUCCESS and ASDCP_FAILURE still work + the same way thanks to an operator overload for type long. + See KM_error.h for more information. + + The logging interface has been moved out of AS_DCP.h + and into KM_log.h + o Some of the command line utilities that were using headers + other than AS_DCP.h have been changed to use the Kumu + equivalents. If you have code based on those utilities, you + will have to update by hand. + o Added new types to the EssenceType_t enum. + o The guard macro for Win32 code has changed from WIN32 to + KM_WIN32. + + +2006.03.2x - new stuff + o Proper handling of stream-id byte of essence UL values + o writes 3-partition files, reads 2-part or 3-part + + +2006.03.16 - bug fixes plus + o Removed SMPTE_LABELS compile-time option. The reader will now + silently accept either SMPTE or MXF Interop labels, the writer + can be instructed which to use at runtime. Default is Interop. + o Added an AIFF reader. Support is preliminary, it works with the + AIFF files I have on hand. + o More code refactoring. More to come. + + +2006.03.09 - full read-write + o Removed ASDCP_WITHOUT_OPENSSL compile-time option. + o Full read/write now working on new MXF library + + +2005.00.00 - A New Hope + o The temporary mxf-lite has been removed. MXF files are now + managed via the objects in KLV.h, MXFTypes.h MXF.h and + Metadata.h. This release does not support writing MXF files. + o Fixed a header interpretation error in the Wav parser. + + +2005.00.00 - The Reformation + o Removed mxflib as a dependency by forking the necessary + functions and placing them in the mxf-lite subdirectory. + Please note that the very heavy modifications done here + render all comparisson to mxflib code a substantial task. + All errors are now mine and users are warned not to bug + Oliver or Matt for help with this code. The version of + mxflib at the time of the fork was: 0.5.1.3. + + +2005.06.03 - bug fixes v0.10.18 + o Updated UL batch to include GC UL. + + +2005.05.27 - bug fixes v0.10.17 + o Un-did essence container and compression descriptor changes. + The default build reflects MXF Interop decisions as of 26 May. + o Added note about build versions to README (see above). + o Added warnings to SMPTE_LABELS builds. + o Fixed JP2K essence container label. + + +2005.05.02 - bug fixes v0.10.16 + o Reorganized internal files, added file reader object, added OS + portability header, removed and renamed some files. If you have a + patch against previous versions of the source, you should check + it thoroughly. + o Added RGBA attributes to JP2K descriptor. + o Changed interface to CodestreamParser. + o Added JP2K parser implementation. It is parsing each frame but is + not yet being used to populate the descriptor. + o Added 48fps option for `asdcp-test -p`. + o Added picture rate constants to AS_DCP.h (23.976, 24, 48). + o Added sample rate constant to AS_DCP.h (48k). + o Changed asdcp-test to encrypt picture headers by default + (plaintext offset will be 0), added -E option to allow + plaintext headers. + + +2005.04.28 - bug fixes v0.9.15 + o The XML descriptors for the crypto DMS have moved in mxflib to + the file DMS_Crypto.xml (they were in DMS_DCPENC.xml). Older + installations should update the file from mxflib. + o Added Close() and Seek() to ~MyFileWriter(), cleaned up headers + o Added UUID generator output mode (-u). + o Added -S option to extract PCM essence into stereo wav files + o Added more UL testing and conformance checking. + o Added macro SMPTE_LABELS which causes the library to be built + with SMPTE (as opposed to MXF Interop) labels. This is not + set by default, and currently only affects the PCM container + label and encrypted element label. + o Cleaned up the GNUmakefile test targets, the source files + are now named with the TEST_FILE_PREFIX macro. + o enabled 23.976-framed PCM (2002 samples per frame) + o The size of the asdcp-test frame buffer for picture essence + may now be set from the command line (-b). The default is 4MB. + o h__Reader::ReadEKLVPacket() now tests the UL (duh) and switches + on the value, allowing plaintext and ciphertext frames to + be mixed in the file. + o Fixed error in UUID generator format. + o JP2K files now use the GenericPictureDescriptor to store + ContainerDuration and SampleRate. SampleRate is mapped + to EditRate in the PictureDescriptor struct. This fixes + the second caveat from the 0.8.13 release. + o Fxed bug in PCMParserList that was miscalculating the extent + of a PCM sample. This bug did not affect API users, it was + only present in asdcp-test. + o Fixed EditRate on PCM files (was showing sample rate) + o Fixed Encrypted Essence Container UL + o Fixed BlockAlign value for PCM essence + + - The following changes were provided by Jeff Loewenguth + - Thanks Jeff! + o Moved the DMS CryptographicFramework entry from the material + package to the source package + o Fixed erroneous Source Essence Container Label value + o Fixed broken sort of JP2K frames in JP2K parser + o Added FindFrameGOPStart() method to the MPEG2 MXFReader + o Added missing length values for EKLV packets without HMAC + o -x with JP2K essence writes to files with 6 digit names + (up from 5 digits). + o The Key ID may now be specified as an argument to asdcp-test + (-j ) + + +2004.12.30 - bug fixes + wav files v0.8.14 + o Added WAV file write to asdcp-test (uses mxflib::waveheader_t). + o Three-partition files reading properly. adscplib still writes + two-partition files. + o Changes in the mxflib WAV essence parser API had broken + asdcplib's ability to read essence from a WAV file. I have + fixed this bug, but at the expense of breaking compatibility + with older versions of mxflib. Beware! + o Removed redundant (but working) bin-text-bin conversions. + + +2004.12.23 - JPEG 2000 support v0.8.13 + o Reads/writes JPEG 2000 essence in plaintext and ciphertext + with the following caveats: + - The Picture Essence Descriptor is empty. + - Because there is no essence descriptor, the reader code + in asdcp-test has no idea how many frames are in the file + and ends with an out-of-bounds frame error. This error + is being suppressed in asdcp-test for the current release. + o Still broken when reading three-partition files. + + +2004.10.22 - fixes and UL updates v0.7.11 + WARNING: COMPATIBILITY BREAKPOINT + Files created with this and future versions of this library are + not compatible with previous versions of this library. As you + might suspect, files created with previous versions of this + library are not compatible with this and future versions. + + o h__Reader will now open a three-partitition file (untested) + o Moved DMS from Material partition to File partition + o Added length fields to appropriate places in EKLV packet + + +2004.10.22 - fixes and UL updates v0.7.10 + o fixed frame buffer handling of externally allocated buffer, + created unit test (asdcp-mem-test) + o added operator==() and operator!=() to Rational type + o fixed some type-related compiler warnings + o asdcp-test -p now works on unwrap + o updated some ULs to match documentation (thanks to Arun + for the submission) + o canonicalized line endings + + +2004.07.02 - full plaintext + ciphertext read/write v0.6.9 + o HMAC, plaintext offest and raw ciphertext read supported + o back to proper CBR index + o MPEG temporal offset working + + +2004.07.01 - plaintext + ciphertext read/write v0.5.8 + o encryption of MPEG and PCM essence supported with the + following caveats: + - no HMAC support + - no plaintext offest support + - no raw ciphertext read support + o moved to reflecting the whole KLV triplet in the CBR + index (now incompatible with mxflib, still searching + for info about what's "right") + o awaitng the following fixes/features: + - retrieve Temporal Offset from index in MPEG2::Reader + - test for correct ULs when reading frame triplets + - fix header metadata items for encrypted files + - HMAC support + - plaintext offest support + - raw ciphertext read support + + +2004.06.14 - plaintext read/write w/key generator v0.4.5 + o Project now uses OpenSSL (tested with 0.9.7d on win32, Linux, Darwin) + Use `make ASDCP_WITHOUT_OPENSSL=1` to make plaintext-only version + o Accepts interior I frames when parsing MPEG2 VES + o Improved error reporting on format errors + o Added support for encryption to asdcp-test + o Added RNG for asdcp-test (non-production use only, see notes in FortunaRNG.h) + o Implemented CBC encrypt, decrypt module + o Added partial TemporalOffset retrieval from MPEG2 parser + o Fixed win32 binmode bug + + +2004.05.12 - plaintext read/write v0.3.4 + o Full read/write of plaintext MPEG-2 VES and WAV files + (does not yet support mux from or demux to 2 channel pairs) + o Builds with autoconf-based mxflib + o Added ASDCP_ prefix to macros + o Updated documentation, fixed documentation errors + o Simplified API for MXF writer setup + o Decoupled essence parsers from MXF writers + o added raw ciphertext support to FrameBuffer + o Cleaned up Get/Set naming confusion + o Added missing const qualifiers + + +2004.04.27 - preview release v0.2.1 + o hasty release for quick review + o this release may not build with mxflib using autoconf. + o writes plaintext AS-DCP MPEG2 essence files + o tested under win32 and linux. FreeBSD and Darwin do not work + + +2004.02.04 - First release (v0.1.1): + o asdcp-test is mostly complete. It should correctly provide + access to the read and info capabilities of the library. + o The MPEG2 reader is functional but not fully tested. + o Some file format integrity tests remain to be coded. + o The PCM reader is mostly complete, I am having difficulty + getting a suitable test file from mxfwrap. + o The makefile creates a static library module. The API + will cleanly support a DSO (or DLL). Let me know if DSO + support is important to you. + o Nothing is thread safe. Thread safety was not a requirement + in the initial project definition. Thread safety may be added + above the mxflib/klvlib level. Let me know if it is important + to you. + o The files xmldict.xml and types.xml must be in the current + directory when the program is run. The files are supplied + with mxflib. Runtime location of the files is not currently + a project goal. Comments on how best to handle this situation + would be appreciated. See AS_DCP.cpp at init_mxf_types() + for a more detailed discussion. + +-- diff -ruN asdcplib.old/src/AS_DCP_AES.cpp asdcplib/src/AS_DCP_AES.cpp --- asdcplib.old/src/AS_DCP_AES.cpp 2017-01-17 22:38:59.494475028 +0100 +++ asdcplib/src/AS_DCP_AES.cpp 2017-01-17 22:40:55.166469875 +0100 @@ -37,25 +37,16 @@ using Kumu::DefaultLogSink; using namespace ASDCP; -const int KEY_SIZE_BITS = 128; -#include -#include -#include -#include +#include +#include +#include -void -print_ssl_error() -{ - char err_buf[256]; - unsigned long errval = ERR_get_error(); - DefaultLogSink().Error("OpenSSL: %s\n", ERR_error_string(errval, err_buf)); -} //------------------------------------------------------------------------------------------ -class ASDCP::AESEncContext::h__AESContext : public AES_KEY +class ASDCP::AESEncContext::h__AESContext : public aes128_ctx { public: Kumu::SymmetricKey m_KeyBuf; @@ -79,12 +70,8 @@ m_Context = new h__AESContext; m_Context->m_KeyBuf.Set(key); - if ( AES_set_encrypt_key(m_Context->m_KeyBuf.Value(), KEY_SIZE_BITS, m_Context) ) - { - print_ssl_error(); - return RESULT_CRYPT_INIT; - } - + // nettle set/get encrypt key returns void + aes128_set_encrypt_key(m_Context, m_Context->m_KeyBuf.Value()); return RESULT_OK; } @@ -144,7 +131,7 @@ for ( ui32_t i = 0; i < CBC_BLOCK_SIZE; i++ ) tmp_buf[i] = in_p[i] ^ Ctx->m_IVec[i]; - AES_encrypt(tmp_buf, Ctx->m_IVec, Ctx); + aes128_encrypt(Ctx, sizeof(tmp_buf), Ctx->m_IVec, tmp_buf); memcpy(out_p, Ctx->m_IVec, CBC_BLOCK_SIZE); in_p += CBC_BLOCK_SIZE; @@ -158,7 +145,7 @@ //------------------------------------------------------------------------------------------ -class ASDCP::AESDecContext::h__AESContext : public AES_KEY +class ASDCP::AESDecContext::h__AESContext : public aes128_ctx { public: Kumu::SymmetricKey m_KeyBuf; @@ -182,12 +169,7 @@ m_Context = new h__AESContext; m_Context->m_KeyBuf.Set(key); - if ( AES_set_decrypt_key(m_Context->m_KeyBuf.Value(), KEY_SIZE_BITS, m_Context) ) - { - print_ssl_error(); - return RESULT_CRYPT_INIT; - } - + aes128_set_decrypt_key(m_Context, m_Context->m_KeyBuf.Value()) ; return RESULT_OK; } @@ -226,7 +208,7 @@ while ( block_size ) { - AES_decrypt(in_p, out_p, Ctx); + aes128_decrypt(Ctx, sizeof(in_p), out_p,in_p ); for ( ui32_t i = 0; i < CBC_BLOCK_SIZE; i++ ) out_p[i] ^= Ctx->m_IVec[i]; @@ -250,7 +232,7 @@ class HMACContext::h__HMACContext { - SHA_CTX m_SHA; + sha1_ctx m_SHA; byte_t m_key[KeyLen]; ASDCP_NO_COPY_CONSTRUCT(h__HMACContext); @@ -264,12 +246,12 @@ // SMPTE 429.6 MIC key generation void SetKey(const byte_t* key) { - byte_t rng_buf[SHA_DIGEST_LENGTH*2]; - Kumu::Gen_FIPS_186_Value(key, KeyLen, rng_buf, SHA_DIGEST_LENGTH*2); + byte_t rng_buf[SHA1_DIGEST_SIZE*2]; + Kumu::Gen_FIPS_186_Value(key, KeyLen, rng_buf, SHA1_DIGEST_SIZE*2); // rng_buf contains two rounds, x0 and x1 (each 160 bits). // Use x1 per SMPTE 430-6-2006 Sec. 7.10 - memcpy(m_key, rng_buf+SHA_DIGEST_LENGTH, KeyLen); + memcpy(m_key, rng_buf+SHA1_DIGEST_SIZE, KeyLen); Reset(); } @@ -278,14 +260,14 @@ { static byte_t key_nonce[KeyLen] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff }; - byte_t sha_buf[SHA_DIGEST_LENGTH]; + byte_t sha_buf[SHA1_DIGEST_SIZE]; // 7.10: MICKey = trunc( SHA1 ( key, key_nonce ) ) - SHA_CTX SHA; - SHA1_Init(&SHA); - SHA1_Update(&SHA, key, KeyLen); - SHA1_Update(&SHA, key_nonce, KeyLen); - SHA1_Final(sha_buf, &SHA); + sha1_ctx SHA; + sha1_init(&SHA); + sha1_update(&SHA, KeyLen, key); + sha1_update(&SHA, KeyLen, key_nonce); + sha1_digest(&SHA, sizeof(sha_buf), sha_buf); memcpy(m_key, sha_buf, KeyLen); Reset(); } @@ -300,14 +282,14 @@ memset(m_SHAValue, 0, HMAC_SIZE); m_Final = false; - SHA1_Init(&m_SHA); + sha1_init(&m_SHA); // H(K XOR opad, H(K XOR ipad, text)) // ^^^^^^^^^^ for ( ui32_t i = 0; i < B_len; i++ ) xor_buf[i] ^= ipad_const; - SHA1_Update(&m_SHA, xor_buf, B_len); + sha1_update(&m_SHA, B_len, xor_buf); } // @@ -316,37 +298,37 @@ { // H(K XOR opad, H(K XOR ipad, text)) // ^^^^ - SHA1_Update(&m_SHA, buf, buf_len); + sha1_update(&m_SHA, buf_len,buf); } // void Finalize() { - SHA_CTX SHA; - SHA1_Init(&SHA); + sha1_ctx SHA; + sha1_init(&SHA); byte_t xor_buf[B_len]; memset(xor_buf, 0, B_len); memcpy(xor_buf, m_key, KeyLen); - SHA1_Init(&SHA); + sha1_init(&SHA); // H(K XOR opad, H(K XOR ipad, text)) // ^^^^^^^^^^ for ( ui32_t i = 0; i < B_len; i++ ) xor_buf[i] ^= opad_const; - SHA1_Update(&SHA, xor_buf, B_len); + sha1_update(&SHA, B_len, xor_buf); // H(K XOR opad, H(K XOR ipad, text)) // ^ - SHA1_Final(m_SHAValue, &m_SHA); - SHA1_Update(&SHA, m_SHAValue, HMAC_SIZE); + sha1_digest( &m_SHA, sizeof(m_SHAValue), m_SHAValue); + sha1_update(&SHA, sizeof(m_SHAValue), m_SHAValue); // H(K XOR opad, H(K XOR ipad, text)) // ^ - SHA1_Final(m_SHAValue, &SHA); + sha1_digest( &m_SHA, sizeof(m_SHAValue),m_SHAValue); m_Final = true; } }; diff -ruN asdcplib.old/src/AS_DCP.h asdcplib/src/AS_DCP.h --- asdcplib.old/src/AS_DCP.h 2017-01-17 22:38:59.494475028 +0100 +++ asdcplib/src/AS_DCP.h 2017-01-17 22:40:55.166469875 +0100 @@ -52,7 +52,7 @@ o SMPTE ST 422:2006 - JPEG 2000 picture in GC o SMPTE ST 382:2007 - WAV/PCM sound in GC o IETF RFC 2104 - HMAC/SHA1 - o NIST FIPS 197 - AES (Rijndael) (via OpenSSL) + o NIST FIPS 197 - AES (Rijndael) (via Nettle) o MXF Interop Track File Specification o MXF Interop Track File Essence Encryption Specification @@ -75,7 +75,7 @@ o Read header metadata from an AS-DCP file This project depends upon the following libraries: - - OpenSSL http://www.openssl.org/ + - Nettle http://www.nettle.org/ - Expat http://expat.sourceforge.net/ or Xerces-C http://xerces.apache.org/xerces-c/ An XML library is not needed if you don't need support for SMPTE ST 429-5:2009. diff -ruN asdcplib.old/src/asdcp-test.cpp asdcplib/src/asdcp-test.cpp --- asdcplib.old/src/asdcp-test.cpp 2017-01-17 22:38:59.494475028 +0100 +++ asdcplib/src/asdcp-test.cpp 2017-01-17 22:40:55.166469875 +0100 @@ -53,7 +53,7 @@ #include #include #include -#include +#include #include #include @@ -1889,8 +1889,8 @@ ASDCP_TEST_NULL_STR(filename); FileReader Reader; - SHA_CTX Ctx; - SHA1_Init(&Ctx); + sha1_ctx Ctx; + sha1_init(&Ctx); ByteString Buf(8192); Result_t result = Reader.OpenRead(filename); @@ -1907,7 +1907,7 @@ } if ( ASDCP_SUCCESS(result) ) - SHA1_Update(&Ctx, Buf.Data(), read_count); + sha1_update(&Ctx, read_count, Buf.Data()); } if ( ASDCP_SUCCESS(result) ) @@ -1915,7 +1915,7 @@ const ui32_t sha_len = 20; byte_t bin_buf[sha_len]; char sha_buf[64]; - SHA1_Final(bin_buf, &Ctx); + sha1_digest(&Ctx, sizeof(bin_buf), bin_buf); fprintf(stdout, "%s %s\n", base64encode(bin_buf, sha_len, sha_buf, 64), filename); } diff -ruN asdcplib.old/src/asdcp-test.cpp.orig asdcplib/src/asdcp-test.cpp.orig --- asdcplib.old/src/asdcp-test.cpp.orig 1970-01-01 01:00:00.000000000 +0100 +++ asdcplib/src/asdcp-test.cpp.orig 2017-01-17 22:40:39.146470588 +0100 @@ -0,0 +1,2101 @@ +/* +Copyright (c) 2003-2014, John Hurst +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. 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. +3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. +*/ +/*! \file asdcp-test.cpp + \version $Id: asdcp-test.cpp,v 1.54 2016/11/22 17:58:19 jhurst Exp $ + \brief AS-DCP file manipulation utility + + This program provides command line access to the major features of the asdcplib + library, and serves as a library unit test which provides the functionality of + the supported use cases. + + For more information about asdcplib, please refer to the header file AS_DCP.h + + WARNING: While the asdcplib library attempts to provide a complete and secure + implementation of the cryptographic features of the AS-DCP file formats, this + unit test program is NOT secure and is therefore NOT SUITABLE FOR USE in a + production environment without some modification. + + In particular, this program uses weak IV generation and externally generated + plaintext keys. These shortcomings exist because cryptographic-quality + random number generation and key management are outside the scope of the + asdcplib library. Developers using asdcplib for commercial implementations + claiming SMPTE conformance are expected to provide proper implementations of + these features. +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +using namespace ASDCP; + +const ui32_t FRAME_BUFFER_SIZE = 4 * Kumu::Megabyte; + +//------------------------------------------------------------------------------------------ +// +// command line option parser class + +static const char* PROGRAM_NAME = "asdcp-test"; // program name for messages +const ui32_t MAX_IN_FILES = 16; // maximum number of input files handled by + // the command option parser + +// local program identification info written to file headers +class MyInfo : public WriterInfo +{ +public: + MyInfo() + { + static byte_t default_ProductUUID_Data[UUIDlen] = + { 0x7d, 0x83, 0x6e, 0x16, 0x37, 0xc7, 0x4c, 0x22, + 0xb2, 0xe0, 0x46, 0xa7, 0x17, 0xe8, 0x4f, 0x42 }; + + memcpy(ProductUUID, default_ProductUUID_Data, UUIDlen); + CompanyName = "WidgetCo"; + ProductName = "asdcp-test"; + ProductVersion = ASDCP::Version(); + } +} s_MyInfo; + + + +// Increment the iterator, test for an additional non-option command line argument. +// Causes the caller to return if there are no remaining arguments or if the next +// argument begins with '-'. +#define TEST_EXTRA_ARG(i,c) if ( ++i >= argc || argv[(i)][0] == '-' ) \ + { \ + fprintf(stderr, "Argument not found for option -%c.\n", (c)); \ + return; \ + } +// +void +banner(FILE* stream = stdout) +{ + fprintf(stream, "\n\ +%s (asdcplib %s)\n\n\ +Copyright (c) 2003-2015 John Hurst\n\n\ +asdcplib may be copied only under the terms of the license found at\n\ +the top of every file in the asdcplib distribution kit.\n\n\ +Specify the -h (help) option for further information about %s\n\n", + PROGRAM_NAME, ASDCP::Version(), PROGRAM_NAME); +} + +// +void +usage(FILE* stream = stdout) +{ + fprintf(stream, "\ +USAGE: %s -c [-3] [-a ] [-b ]\n\ + [-d ] [-e|-E] [-f ] [-j ]\n\ + [-k ] [-l