From 76d26f64585b975710ea3847db03cdbb79646d86 Mon Sep 17 00:00:00 2001 From: ca333 Date: Tue, 9 May 2017 04:31:02 +0200 Subject: [PATCH 0001/1081] add libcurl build recipe for static linking --- depends/packages/libcurl.mk | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 depends/packages/libcurl.mk diff --git a/depends/packages/libcurl.mk b/depends/packages/libcurl.mk new file mode 100644 index 00000000000..9e8577bb5e1 --- /dev/null +++ b/depends/packages/libcurl.mk @@ -0,0 +1,23 @@ +package=libcurl +$(package)_version=7.54.0 +$(package)_download_path=https://curl.haxx.se/download +$(package)_file_name=curl-$($(package)_version).tar.gz +$(package)_sha256_hash=a84b635941c74e26cce69dd817489bec687eb1f230e7d1897fc5b5f108b59adf +$(package)_config_opts=--disable-shared --enable-static --prefix=$(host_prefix) +$(package)_cflags= +$(package)_conf_tool=./configure + +define $(package)_set_vars +endef + +define $(package)_config_cmds + $($(package)_conf_tool) $($(package)_config_opts) +endef + +define $(package)_build_cmds + $(MAKE) +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install +endef From f4b532076cee930c05fb3de2a018af9f924cc784 Mon Sep 17 00:00:00 2001 From: ca333 Date: Tue, 9 May 2017 04:35:33 +0200 Subject: [PATCH 0002/1081] statify libcurl --- src/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Makefile.am b/src/Makefile.am index b6f4f2e83af..ce0bd6cd380 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -23,7 +23,7 @@ BITCOIN_INCLUDES=-I$(builddir) -I$(builddir)/obj $(BOOST_CPPFLAGS) $(LEVELDB_CPP BITCOIN_INCLUDES += -I$(srcdir)/secp256k1/include BITCOIN_INCLUDES += -I$(srcdir)/univalue/include -LIBBITCOIN_SERVER=libbitcoin_server.a +LIBBITCOIN_SERVER=libbitcoin_server.a -lcurl LIBBITCOIN_WALLET=libbitcoin_wallet.a LIBBITCOIN_COMMON=libbitcoin_common.a LIBBITCOIN_CLI=libbitcoin_cli.a From 9069e4addf009e0069cea756d5c2f3d365e31e49 Mon Sep 17 00:00:00 2001 From: Max Lapan Date: Sun, 23 Jul 2017 16:34:31 +0200 Subject: [PATCH 0003/1081] Debian package for komodo 1. tweaks in control file (name, url, git, etc) 2. package script 3. changelog --- contrib/debian/changelog | 2 +- contrib/debian/control | 14 +++++++------- zcutil/build-debian-package.sh | 34 +++++++++++++++++----------------- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/contrib/debian/changelog b/contrib/debian/changelog index c400dca7332..b9503400bbf 100644 --- a/contrib/debian/changelog +++ b/contrib/debian/changelog @@ -1,4 +1,4 @@ -zcash (1.0.8) jessie; urgency=medium +komodo (1.0.8) jessie; urgency=medium * 1.0.8 release. diff --git a/contrib/debian/control b/contrib/debian/control index b0c220cf01c..84ffaac0de5 100644 --- a/contrib/debian/control +++ b/contrib/debian/control @@ -1,21 +1,21 @@ -Source: zcash +Source: komodo Section: utils Priority: optional Maintainer: Zcash Company -Homepage: https://z.cash +Homepage: https://komodoplatform.com/ Build-Depends: autoconf, automake, bsdmainutils, build-essential, git, g++-multilib, libc6-dev, libtool, m4, ncurses-dev, pkg-config, python, unzip, wget, zlib1g-dev -Vcs-Git: https://github.com/zcash/zcash.git -Vcs-Browser: https://github.com/zcash/zcash +Vcs-Git: https://github.com/jl777/komodo +Vcs-Browser: https://github.com/jl777/komodo -Package: zcash +Package: komodo Architecture: amd64 Depends: ${shlibs:Depends} Description: HTTPS for money. Based on Bitcoin's code, it intends to offer a far higher standard of privacy and anonymity through a sophisticiated zero-knowledge proving scheme which preserves confidentiality of transaction metadata. - This package provides the daemon, zcashd, and the CLI tool, - zcash-cli, to interact with the daemon. + This package provides the daemon, komodod, and the CLI tool, + komodo-cli, to interact with the daemon. diff --git a/zcutil/build-debian-package.sh b/zcutil/build-debian-package.sh index 8c2d05c3f8f..11b68badc93 100755 --- a/zcutil/build-debian-package.sh +++ b/zcutil/build-debian-package.sh @@ -5,8 +5,8 @@ set -e set -x -BUILD_PATH="/tmp/zcbuild" -PACKAGE_NAME="zcash" +BUILD_PATH="/tmp/kmdbuild" +PACKAGE_NAME="komodo" SRC_PATH=`pwd` SRC_DEB=$SRC_PATH/contrib/debian SRC_DOC=$SRC_PATH/doc @@ -17,7 +17,7 @@ if [ ! -d $BUILD_PATH ]; then mkdir $BUILD_PATH fi -PACKAGE_VERSION=$($SRC_PATH/src/zcashd --version | grep version | cut -d' ' -f4 | tr -d v) +PACKAGE_VERSION=$($SRC_PATH/src/komodod --version | grep version | cut -d' ' -f4 | tr -d v) BUILD_DIR="$BUILD_PATH/$PACKAGE_NAME-$PACKAGE_VERSION-amd64" if [ -d $BUILD_DIR ]; then @@ -28,7 +28,7 @@ DEB_BIN=$BUILD_DIR/usr/bin DEB_CMP=$BUILD_DIR/usr/share/bash-completion/completions DEB_DOC=$BUILD_DIR/usr/share/doc/$PACKAGE_NAME DEB_MAN=$BUILD_DIR/usr/share/man/man1 -mkdir -p $BUILD_DIR/DEBIAN $DEB_CMP $DEB_BIN $DEB_DOC $DEB_MAN +mkdir -p $BUILD_DIR/DEBIAN $DEB_BIN $DEB_DOC chmod 0755 -R $BUILD_DIR/* # Package maintainer scripts (currently empty) @@ -37,32 +37,32 @@ chmod 0755 -R $BUILD_DIR/* #cp $SRC_DEB/preinst $BUILD_DIR/DEBIAN #cp $SRC_DEB/prerm $BUILD_DIR/DEBIAN # Copy binaries -cp $SRC_PATH/src/zcashd $DEB_BIN -cp $SRC_PATH/src/zcash-cli $DEB_BIN -cp $SRC_PATH/zcutil/fetch-params.sh $DEB_BIN/zcash-fetch-params +cp $SRC_PATH/src/komodod $DEB_BIN +cp $SRC_PATH/src/komodo-cli $DEB_BIN +cp $SRC_PATH/zcutil/fetch-params.sh $DEB_BIN/komodo-fetch-params # Copy docs cp $SRC_PATH/doc/release-notes/release-notes-1.0.0.md $DEB_DOC/changelog cp $SRC_DEB/changelog $DEB_DOC/changelog.Debian cp $SRC_DEB/copyright $DEB_DOC cp -r $SRC_DEB/examples $DEB_DOC # Copy manpages -cp $SRC_DOC/man/zcashd.1 $DEB_MAN -cp $SRC_DOC/man/zcash-cli.1 $DEB_MAN -cp $SRC_DOC/man/zcash-fetch-params.1 $DEB_MAN -# Copy bash completion files -cp $SRC_PATH/contrib/bitcoind.bash-completion $DEB_CMP/zcashd -cp $SRC_PATH/contrib/bitcoin-cli.bash-completion $DEB_CMP/zcash-cli +#cp $SRC_DOC/man/zcashd.1 $DEB_MAN +#cp $SRC_DOC/man/zcash-cli.1 $DEB_MAN +#cp $SRC_DOC/man/zcash-fetch-params.1 $DEB_MAN +# Copy bash completion files TODO: fix them for komodo +#cp $SRC_PATH/contrib/bitcoind.bash-completion $DEB_CMP/komodod +#cp $SRC_PATH/contrib/bitcoin-cli.bash-completion $DEB_CMP/komodod-cli # Gzip files gzip --best -n $DEB_DOC/changelog gzip --best -n $DEB_DOC/changelog.Debian -gzip --best -n $DEB_MAN/zcashd.1 -gzip --best -n $DEB_MAN/zcash-cli.1 -gzip --best -n $DEB_MAN/zcash-fetch-params.1 +#gzip --best -n $DEB_MAN/zcashd.1 +#gzip --best -n $DEB_MAN/zcash-cli.1 +#gzip --best -n $DEB_MAN/zcash-fetch-params.1 cd $SRC_PATH/contrib # Create the control file -dpkg-shlibdeps $DEB_BIN/zcashd $DEB_BIN/zcash-cli +dpkg-shlibdeps $DEB_BIN/komodod $DEB_BIN/komodo-cli dpkg-gencontrol -P$BUILD_DIR # Create the Debian package From a30e0a4a6c0c2af8d1bb1d0f7967382364d05d82 Mon Sep 17 00:00:00 2001 From: Paul Romero Date: Thu, 24 Aug 2017 21:12:45 +0100 Subject: [PATCH 0004/1081] README.md updates spelling, grammar etc. --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ef3d637a601..54406f6189f 100644 --- a/README.md +++ b/README.md @@ -188,7 +188,7 @@ Jumblr works like described previously where all the nodes with jumblr active sy JUMBLR implements t -> z, z -> z and z -> t transactions to maximize privacy of the destination t (transparent) address. So while it is transparent, its first activity is funds coming from an untracable z address. -Which of the three stages is done is randomly selected at each turn. Also when there are more than one possible transaction at the selected stage, a random one is selected. This randomization prevents analyzing incoming z ->t transactions by its size to correlate it to the originating address. +Which of the three stages is done is randomly selected at each turn. Also when there is more than one possible transaction at the selected stage, a random one is selected. This randomization prevents analyzing incoming z ->t transactions by its size to correlate it to the originating address. jumblr_deposit designates the deposit address as the jumblr deposit address for that session. You can select an address that already has funds in it and it will immediately start jumblr process. If there are no funds, it will wait until you send funds to it. @@ -197,7 +197,7 @@ There are three sizes of a jumblr transaction: 10 KMD, 100 KMD and 1000 KMD. The jumblr_secret notifies JUMBLR where to send the final z -> t transactions. In order to allow larger accounts to obtain privacy, up to 777 secret addresses are supported. Whenever a z -> t stage is activated, a random secret address from the list of the then active secret addresses is selected. Practical Advice: -Obtaining privacy used to be very difficult. JUMBLR makes it as simple as issuing two command line calls. Higher level layers can be added to help manage the addresses, ie. linking them at the passphrase level. Such things are left to each implementation. +Obtaining privacy used to be very difficult. JUMBLR makes it as simple as issuing two command line calls. Higher level layers can be added to help manage the addresses, ie. linking them at the passphrase level. Such matters are left to each implementation. Once obtained, it is very easy to lose all the privacy. With a single errant transaction that combines some previously used address and the secretaddress, well, the secretaddress is no longer so private. @@ -205,9 +205,9 @@ The advice is to setup a totally separate node! This might seem a bit drastic, but if you want to maintain privacy, it is best to make it look like all the transactions are coming from a different node. The easiest way for most people to do this is to actually have a different node. -It can be a dedicated laptop (recommended) or a VPS (for not so big amounts) with a totally fresh komodod wallet. Generate an address on this wallet and use that as the jumblr_secret address on your main node. As the JUMBLR operates funds will teleport into your secret node's address. If you are careful and never use the same IP address for both your nodes, you will be able to maintain very good privacy. +It can be a dedicated laptop (recommended) or a VPS (for smaller amounts) with a totally fresh komodod wallet. Generate an address on this wallet and use that as the jumblr_secret address on your main node. As the JUMBLR operates funds will teleport into your secret node's address. If you are careful and never use the same IP address for both your nodes, you will be able to maintain very good privacy. -Of course, dont be sending emails that link the two accounts together! Dont use secret address funds for home delivery purchases!! Etc. There are many ways to lose the privacy, just think about what linkages can be dont at the IP and blockchain level and that should be a useful preparation. +Of course, don't send emails that link the two accounts together! Dont use secret address funds for home delivery purchases! Etc. There are many ways to lose the privacy, just think about what linkages can be dont at the IP and blockchain level and that should be a useful preparation. What if you have 100,000 KMD and you dont want others to know you are such a whale? From 7c49b46d5a5b6a1d0f38fddc56138de6f53807b1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 13 Oct 2017 16:43:52 +0300 Subject: [PATCH 0005/1081] Revert "Merge branch 'master' into dPoW" This reverts commit a487e5a1d32e369f663512297330ce3a2a38bc1f, reversing changes made to 6be96b7e1c7255bc9af455bc9f092b59f77d229c. --- README.md | 4 ---- contrib/debian/changelog | 2 +- contrib/debian/control | 14 +++++++------- depends/packages/libcurl.mk | 2 -- src/Makefile.am | 1 - zcutil/build-debian-package.sh | 34 +++++++++++++++++----------------- 6 files changed, 25 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index d59f452cb46..2bbd8a743ea 100644 --- a/README.md +++ b/README.md @@ -145,19 +145,15 @@ mv ~/.komodo ~/.komodo.old && mkdir ~/.komodo && cp ~/.komodo.old/komodo.conf ~/ komodod now has jumblr_deposit and jumblr_secret RPC calls. Jumblr works like described previously where all the nodes with jumblr active synchronize their tx activity during the same block to maximize the mixing effect. However, unlike all other mixers/tumblers, you never give up control of your coins to anybody else. JUMBLR uses a one to many allocation of funds, ie. one deposit address and many secret addresses. You can always run multiple komodod daemons to get multiple active deposit addresses. JUMBLR implements t -> z, z -> z and z -> t transactions to maximize privacy of the destination t (transparent) address. So while it is transparent, its first activity is funds coming from an untracable z address. - Which of the three stages is done is randomly selected at each turn. Also when there is more than one possible transaction at the selected stage, a random one is selected. This randomization prevents analyzing incoming z ->t transactions by its size to correlate it to the originating address. - jumblr_deposit designates the deposit address as the jumblr deposit address for that session. You can select an address that already has funds in it and it will immediately start jumblr process. If there are no funds, it will wait until you send funds to it. There are three sizes of a jumblr transaction: 10 KMD, 100 KMD and 1000 KMD. There is also a fixed interval of blocks where all jumblr nodes are active. Currently it is set to be 10, but this is subject to change. Only during every 10*10 blocks are the largest 1000 KMD transactions processed, so this concentrates all the large transactions every N*N blocks. jumblr_secret notifies JUMBLR where to send the final z -> t transactions. In order to allow larger accounts to obtain privacy, up to 777 secret addresses are supported. Whenever a z -> t stage is activated, a random secret address from the list of the then active secret addresses is selected. Practical Advice: Obtaining privacy used to be very difficult. JUMBLR makes it as simple as issuing two command line calls. Higher level layers can be added to help manage the addresses, ie. linking them at the passphrase level. Such matters are left to each implementation. - Once obtained, it is very easy to lose all the privacy. With a single errant transaction that combines some previously used address and the secretaddress, well, the secretaddress is no longer so private. The advice is to setup a totally separate node! This might seem a bit drastic, but if you want to maintain privacy, it is best to make it look like all the transactions are coming from a different node. The easiest way for most people to do this is to actually have a different node. - It can be a dedicated laptop (recommended) or a VPS (for smaller amounts) with a totally fresh komodod wallet. Generate an address on this wallet and use that as the jumblr_secret address on your main node. As the JUMBLR operates funds will teleport into your secret node's address. If you are careful and never use the same IP address for both your nodes, you will be able to maintain very good privacy. Of course, don't send emails that link the two accounts together! Dont use secret address funds for home delivery purchases! Etc. There are many ways to lose the privacy, just think about what linkages can be dont at the IP and blockchain level and that should be a useful preparation. What if you have 100,000 KMD and you dont want others to know you are such a whale? diff --git a/contrib/debian/changelog b/contrib/debian/changelog index b9503400bbf..c400dca7332 100644 --- a/contrib/debian/changelog +++ b/contrib/debian/changelog @@ -1,4 +1,4 @@ -komodo (1.0.8) jessie; urgency=medium +zcash (1.0.8) jessie; urgency=medium * 1.0.8 release. diff --git a/contrib/debian/control b/contrib/debian/control index 84ffaac0de5..b0c220cf01c 100644 --- a/contrib/debian/control +++ b/contrib/debian/control @@ -1,21 +1,21 @@ -Source: komodo +Source: zcash Section: utils Priority: optional Maintainer: Zcash Company -Homepage: https://komodoplatform.com/ +Homepage: https://z.cash Build-Depends: autoconf, automake, bsdmainutils, build-essential, git, g++-multilib, libc6-dev, libtool, m4, ncurses-dev, pkg-config, python, unzip, wget, zlib1g-dev -Vcs-Git: https://github.com/jl777/komodo -Vcs-Browser: https://github.com/jl777/komodo +Vcs-Git: https://github.com/zcash/zcash.git +Vcs-Browser: https://github.com/zcash/zcash -Package: komodo +Package: zcash Architecture: amd64 Depends: ${shlibs:Depends} Description: HTTPS for money. Based on Bitcoin's code, it intends to offer a far higher standard of privacy and anonymity through a sophisticiated zero-knowledge proving scheme which preserves confidentiality of transaction metadata. - This package provides the daemon, komodod, and the CLI tool, - komodo-cli, to interact with the daemon. + This package provides the daemon, zcashd, and the CLI tool, + zcash-cli, to interact with the daemon. diff --git a/depends/packages/libcurl.mk b/depends/packages/libcurl.mk index 19c5eab1681..349469f1112 100644 --- a/depends/packages/libcurl.mk +++ b/depends/packages/libcurl.mk @@ -3,7 +3,6 @@ $(package)_version=7.54.0 $(package)_download_path=https://curl.haxx.se/download $(package)_file_name=curl-$($(package)_version).tar.gz $(package)_sha256_hash=a84b635941c74e26cce69dd817489bec687eb1f230e7d1897fc5b5f108b59adf - $(package)_config_opts_linux=--disable-shared --enable-static --prefix=$(host_prefix) $(package)_config_opts_mingw32=--enable-mingw --disable-shared --enable-static --prefix=$(host_prefix) --host=x86_64-w64-mingw32 $(package)_config_opts_darwin=--disable-shared --enable-static --prefix=$(host_prefix) @@ -30,7 +29,6 @@ define $(package)_build_cmds endef endif - define $(package)_stage_cmds $(MAKE) DESTDIR=$($(package)_staging_dir) install endef diff --git a/src/Makefile.am b/src/Makefile.am index 5b2e0c2267e..72805281aec 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -32,7 +32,6 @@ else LIBBITCOIN_SERVER=libbitcoin_server.a endif - LIBBITCOIN_WALLET=libbitcoin_wallet.a LIBBITCOIN_COMMON=libbitcoin_common.a LIBBITCOIN_CLI=libbitcoin_cli.a diff --git a/zcutil/build-debian-package.sh b/zcutil/build-debian-package.sh index 11b68badc93..8c2d05c3f8f 100755 --- a/zcutil/build-debian-package.sh +++ b/zcutil/build-debian-package.sh @@ -5,8 +5,8 @@ set -e set -x -BUILD_PATH="/tmp/kmdbuild" -PACKAGE_NAME="komodo" +BUILD_PATH="/tmp/zcbuild" +PACKAGE_NAME="zcash" SRC_PATH=`pwd` SRC_DEB=$SRC_PATH/contrib/debian SRC_DOC=$SRC_PATH/doc @@ -17,7 +17,7 @@ if [ ! -d $BUILD_PATH ]; then mkdir $BUILD_PATH fi -PACKAGE_VERSION=$($SRC_PATH/src/komodod --version | grep version | cut -d' ' -f4 | tr -d v) +PACKAGE_VERSION=$($SRC_PATH/src/zcashd --version | grep version | cut -d' ' -f4 | tr -d v) BUILD_DIR="$BUILD_PATH/$PACKAGE_NAME-$PACKAGE_VERSION-amd64" if [ -d $BUILD_DIR ]; then @@ -28,7 +28,7 @@ DEB_BIN=$BUILD_DIR/usr/bin DEB_CMP=$BUILD_DIR/usr/share/bash-completion/completions DEB_DOC=$BUILD_DIR/usr/share/doc/$PACKAGE_NAME DEB_MAN=$BUILD_DIR/usr/share/man/man1 -mkdir -p $BUILD_DIR/DEBIAN $DEB_BIN $DEB_DOC +mkdir -p $BUILD_DIR/DEBIAN $DEB_CMP $DEB_BIN $DEB_DOC $DEB_MAN chmod 0755 -R $BUILD_DIR/* # Package maintainer scripts (currently empty) @@ -37,32 +37,32 @@ chmod 0755 -R $BUILD_DIR/* #cp $SRC_DEB/preinst $BUILD_DIR/DEBIAN #cp $SRC_DEB/prerm $BUILD_DIR/DEBIAN # Copy binaries -cp $SRC_PATH/src/komodod $DEB_BIN -cp $SRC_PATH/src/komodo-cli $DEB_BIN -cp $SRC_PATH/zcutil/fetch-params.sh $DEB_BIN/komodo-fetch-params +cp $SRC_PATH/src/zcashd $DEB_BIN +cp $SRC_PATH/src/zcash-cli $DEB_BIN +cp $SRC_PATH/zcutil/fetch-params.sh $DEB_BIN/zcash-fetch-params # Copy docs cp $SRC_PATH/doc/release-notes/release-notes-1.0.0.md $DEB_DOC/changelog cp $SRC_DEB/changelog $DEB_DOC/changelog.Debian cp $SRC_DEB/copyright $DEB_DOC cp -r $SRC_DEB/examples $DEB_DOC # Copy manpages -#cp $SRC_DOC/man/zcashd.1 $DEB_MAN -#cp $SRC_DOC/man/zcash-cli.1 $DEB_MAN -#cp $SRC_DOC/man/zcash-fetch-params.1 $DEB_MAN -# Copy bash completion files TODO: fix them for komodo -#cp $SRC_PATH/contrib/bitcoind.bash-completion $DEB_CMP/komodod -#cp $SRC_PATH/contrib/bitcoin-cli.bash-completion $DEB_CMP/komodod-cli +cp $SRC_DOC/man/zcashd.1 $DEB_MAN +cp $SRC_DOC/man/zcash-cli.1 $DEB_MAN +cp $SRC_DOC/man/zcash-fetch-params.1 $DEB_MAN +# Copy bash completion files +cp $SRC_PATH/contrib/bitcoind.bash-completion $DEB_CMP/zcashd +cp $SRC_PATH/contrib/bitcoin-cli.bash-completion $DEB_CMP/zcash-cli # Gzip files gzip --best -n $DEB_DOC/changelog gzip --best -n $DEB_DOC/changelog.Debian -#gzip --best -n $DEB_MAN/zcashd.1 -#gzip --best -n $DEB_MAN/zcash-cli.1 -#gzip --best -n $DEB_MAN/zcash-fetch-params.1 +gzip --best -n $DEB_MAN/zcashd.1 +gzip --best -n $DEB_MAN/zcash-cli.1 +gzip --best -n $DEB_MAN/zcash-fetch-params.1 cd $SRC_PATH/contrib # Create the control file -dpkg-shlibdeps $DEB_BIN/komodod $DEB_BIN/komodo-cli +dpkg-shlibdeps $DEB_BIN/zcashd $DEB_BIN/zcash-cli dpkg-gencontrol -P$BUILD_DIR # Create the Debian package From 07f83521f7f4dc21e895d3a2a60a1a40aa0ce2bb Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Thu, 19 Oct 2017 14:08:32 -0700 Subject: [PATCH 0006/1081] basic integration of cryptoconditions --- .gitmodules | 4 +++ configure.ac | 2 +- src/Makefile.am | 16 +++++++++--- src/cJSON.h | 1 + src/cryptoconditions | 1 + src/komodo_structs.h | 5 ++++ src/script/interpreter.cpp | 52 ++++++++++++++++++++++++++++++++++++++ src/script/interpreter.h | 7 +++++ src/script/script.cpp | 3 +++ src/script/script.h | 3 ++- src/script/script_error.h | 5 +++- 11 files changed, 92 insertions(+), 7 deletions(-) create mode 100644 .gitmodules create mode 160000 src/cryptoconditions diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000000..44ceb90302e --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "cryptoconditions"] + path = src/cryptoconditions + url = https://github.com/libscott/libcryptoconditions + branch = komodo-integration diff --git a/configure.ac b/configure.ac index c471bab89c8..9f8f1900f93 100644 --- a/configure.ac +++ b/configure.ac @@ -996,7 +996,7 @@ unset PKG_CONFIG_LIBDIR PKG_CONFIG_LIBDIR="$PKGCONFIG_LIBDIR_TEMP" ac_configure_args="${ac_configure_args} --disable-shared --with-pic --with-bignum=no" -AC_CONFIG_SUBDIRS([src/secp256k1 src/univalue]) +AC_CONFIG_SUBDIRS([src/secp256k1 src/univalue src/cryptoconditions]) AC_OUTPUT diff --git a/src/Makefile.am b/src/Makefile.am index 72805281aec..8907fa54a7d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,4 +1,4 @@ -DIST_SUBDIRS = secp256k1 univalue +DIST_SUBDIRS = secp256k1 univalue cryptoconditions AM_LDFLAGS = $(PTHREAD_CFLAGS) $(LIBTOOL_LDFLAGS) @@ -21,6 +21,7 @@ BITCOIN_CONFIG_INCLUDES=-I$(builddir)/config BITCOIN_INCLUDES=-I$(builddir) -I$(builddir)/obj $(BOOST_CPPFLAGS) $(LEVELDB_CPPFLAGS) $(CRYPTO_CFLAGS) $(SSL_CFLAGS) BITCOIN_INCLUDES += -I$(srcdir)/secp256k1/include +BITCOIN_INCLUDES += -I$(srcdir)/cryptoconditions/include -I$(srcdir)/cryptoconditions/src/asn BITCOIN_INCLUDES += -I$(srcdir)/univalue/include if TARGET_WINDOWS @@ -38,6 +39,7 @@ LIBBITCOIN_CLI=libbitcoin_cli.a LIBBITCOIN_UTIL=libbitcoin_util.a LIBBITCOIN_CRYPTO=crypto/libbitcoin_crypto.a LIBSECP256K1=secp256k1/libsecp256k1.la +LIBCRYPTOCONDITIONS=cryptoconditions/libcryptoconditions.la LIBUNIVALUE=univalue/libunivalue.la LIBZCASH=libzcash.a -lcurl @@ -47,6 +49,9 @@ $(LIBSECP256K1): $(wildcard secp256k1/src/*) $(wildcard secp256k1/include/*) $(LIBUNIVALUE): $(wildcard univalue/lib/*) $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C univalue/ +$(LIBCRYPTOCONDITIONS): $(wildcard cryptoconditions/src/*) $(wildcard cryptoconditions/include/*) + $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C $(@D) $(@F) + # Make is not made aware of per-object dependencies to avoid limiting building parallelization # But to build the less dependent modules first, we manually select their order here: EXTRA_LIBRARIES = \ @@ -389,7 +394,8 @@ komodod_LDADD = \ $(LIBZCASH) \ $(LIBLEVELDB) \ $(LIBMEMENV) \ - $(LIBSECP256K1) + $(LIBSECP256K1) \ + $(LIBCRYPTOCONDITIONS) if ENABLE_ZMQ komodod_LDADD += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS) @@ -450,7 +456,8 @@ komodo_tx_LDADD = \ $(LIBSECP256K1) \ $(LIBZCASH) \ $(LIBBITCOIN_CRYPTO) \ - $(LIBZCASH_LIBS) + $(LIBZCASH_LIBS) \ + $(LIBCRYPTOCONDITIONS) komodo_tx_LDADD += $(BOOST_LIBS) $(CRYPTO_LIBS) # @@ -507,7 +514,8 @@ endif libzcashconsensus_la_LDFLAGS = -no-undefined $(RELDFLAGS) libzcashconsensus_la_LIBADD = $(CRYPTO_LIBS) -libzcashconsensus_la_CPPFLAGS = $(CRYPTO_CFLAGS) -I$(builddir)/obj -DBUILD_BITCOIN_INTERNAL +libzcashconsensus_la_CPPFLAGS = $(CRYPTO_CFLAGS) -I$(builddir)/obj -DBUILD_BITCOIN_INTERNAL \ + -I$(builddir)/cryptoconditions/src/asn endif # diff --git a/src/cJSON.h b/src/cJSON.h index d3076aa53fd..2ee7863581c 100755 --- a/src/cJSON.h +++ b/src/cJSON.h @@ -30,6 +30,7 @@ #include #include #include +#include "komodo_structs.h" //#include "../crypto777/OS_portable.h" diff --git a/src/cryptoconditions b/src/cryptoconditions new file mode 160000 index 00000000000..7bd65d43af4 --- /dev/null +++ b/src/cryptoconditions @@ -0,0 +1 @@ +Subproject commit 7bd65d43af4e95ea6d8edf6c3dc5f340e39770cd diff --git a/src/komodo_structs.h b/src/komodo_structs.h index a35e7e008a8..fa8b3c2f1cd 100644 --- a/src/komodo_structs.h +++ b/src/komodo_structs.h @@ -22,6 +22,9 @@ #define PACKED __attribute__((packed)) #endif*/ +#ifndef KOMODO_STRUCTS_H +#define KOMODO_STRUCTS_H + #define GENESIS_NBITS 0x1f00ffff #define KOMODO_MINRATIFY ((height < 90000) ? 7 : 11) #define KOMODO_MAXBLOCKS 5000000 @@ -88,3 +91,5 @@ struct komodo_state struct komodo_event **Komodo_events; int32_t Komodo_numevents; uint32_t RTbufs[64][3]; uint64_t RTmask; }; + +#endif /* KOMODO_STRUCTS_H */ diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 6c17eab704c..f65581068a2 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -13,6 +13,8 @@ #include "pubkey.h" #include "script/script.h" #include "uint256.h" +#include "cryptoconditions/include/cryptoconditions.h" + using namespace std; @@ -934,6 +936,51 @@ bool EvalScript(vector >& stack, const CScript& script, un } break; + case OP_CHECKCRYPTOCONDITION: + case OP_CHECKCRYPTOCONDITIONVERIFY: + { + // (fulfillment condition -- bool) + + if (stack.size() < 2) + return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); + + valtype& vchFulfillment = stacktop(-2); + valtype& vchCondition = stacktop(-1); + + // Hard limit fulfillment size + if (vchFulfillment.size() > 1024 * 10) { + return set_error(serror, SCRIPT_ERR_CRYPTOCONDITION_INVALID_FULFILLMENT); + } + + CC *cond = (CC*) calloc(1, sizeof(CC)); + char *fulfillmentBin = (char*) vchFulfillment.data(); + int rc = cc_readFulfillmentBinary(cond, fulfillmentBin, vchFulfillment.size()); + if (rc != 0) { + return set_error(serror, SCRIPT_ERR_CRYPTOCONDITION_INVALID_FULFILLMENT); + } + + char *condBin = (char*) &vchCondition[0]; + // TODO: Should nHashType be hardcoded? + // Other types use the last byte of the signature + char *msg = (char*) checker.GetMessage(script, SIGHASH_ALL).begin(); +; + bool fSuccess = cc_verify(cond, msg, 32, condBin, vchCondition.size()); + + popstack(stack); + popstack(stack); + + stack.push_back(fSuccess ? vchTrue : vchFalse); + + if (opcode == OP_CHECKCRYPTOCONDITIONVERIFY) + { + if (fSuccess) + popstack(stack); + else + return set_error(serror, SCRIPT_ERR_CRYPTOCONDITION_VERIFY); + } + } + break; + default: return set_error(serror, SCRIPT_ERR_BAD_OPCODE); } @@ -1147,6 +1194,11 @@ bool TransactionSignatureChecker::CheckLockTime(const CScriptNum& nLockTime) con return true; } +uint256 TransactionSignatureChecker::GetMessage(const CScript& scriptCode, int nHashType) const +{ + return SignatureHash(scriptCode, *txTo, nIn, nHashType); +} + bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* serror) { diff --git a/src/script/interpreter.h b/src/script/interpreter.h index b94916fac87..fad2d9a919a 100644 --- a/src/script/interpreter.h +++ b/src/script/interpreter.h @@ -102,6 +102,12 @@ class BaseSignatureChecker return false; } + virtual uint256 GetMessage(const CScript& scriptCode, int nHashType) const + { + uint256 blob; + return blob; + } + virtual ~BaseSignatureChecker() {} }; @@ -118,6 +124,7 @@ class TransactionSignatureChecker : public BaseSignatureChecker TransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn) : txTo(txToIn), nIn(nInIn) {} bool CheckSig(const std::vector& scriptSig, const std::vector& vchPubKey, const CScript& scriptCode) const; bool CheckLockTime(const CScriptNum& nLockTime) const; + uint256 GetMessage(const CScript& scriptCode, int nHashType) const; }; class MutableTransactionSignatureChecker : public TransactionSignatureChecker diff --git a/src/script/script.cpp b/src/script/script.cpp index fd33924732c..3cb3f855d66 100644 --- a/src/script/script.cpp +++ b/src/script/script.cpp @@ -138,6 +138,9 @@ const char* GetOpName(opcodetype opcode) case OP_CHECKSIGVERIFY : return "OP_CHECKSIGVERIFY"; case OP_CHECKMULTISIG : return "OP_CHECKMULTISIG"; case OP_CHECKMULTISIGVERIFY : return "OP_CHECKMULTISIGVERIFY"; + case OP_CHECKCRYPTOCONDITION : return "OP_CHECKCRYPTOCONDITION"; + case OP_CHECKCRYPTOCONDITIONVERIFY + : return "OP_CHECKCRYPTOCONDITIONVERIFY"; // expanson case OP_NOP1 : return "OP_NOP1"; diff --git a/src/script/script.h b/src/script/script.h index e0e89185f79..584fefac12f 100644 --- a/src/script/script.h +++ b/src/script/script.h @@ -154,6 +154,8 @@ enum opcodetype OP_CHECKSIGVERIFY = 0xad, OP_CHECKMULTISIG = 0xae, OP_CHECKMULTISIGVERIFY = 0xaf, + OP_CHECKCRYPTOCONDITION = 0xcc, + OP_CHECKCRYPTOCONDITIONVERIFY = 0xcd, // expansion OP_NOP1 = 0xb0, @@ -168,7 +170,6 @@ enum opcodetype OP_NOP9 = 0xb8, OP_NOP10 = 0xb9, - // template matching params OP_SMALLDATA = 0xf9, OP_SMALLINTEGER = 0xfa, diff --git a/src/script/script_error.h b/src/script/script_error.h index bb10b8a2932..e8426897737 100644 --- a/src/script/script_error.h +++ b/src/script/script_error.h @@ -52,7 +52,10 @@ typedef enum ScriptError_t /* softfork safeness */ SCRIPT_ERR_DISCOURAGE_UPGRADABLE_NOPS, - SCRIPT_ERR_ERROR_COUNT + SCRIPT_ERR_ERROR_COUNT, + + SCRIPT_ERR_CRYPTOCONDITION_VERIFY, + SCRIPT_ERR_CRYPTOCONDITION_INVALID_FULFILLMENT } ScriptError; #define SCRIPT_ERR_LAST SCRIPT_ERR_ERROR_COUNT From 2b67565e51f0df0c6d6473292de76af169f1c217 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Fri, 20 Oct 2017 23:44:45 -0700 Subject: [PATCH 0007/1081] update cryptoconditions module ref --- .gitmodules | 2 +- src/cryptoconditions | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitmodules b/.gitmodules index 44ceb90302e..0c640d62c31 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "cryptoconditions"] path = src/cryptoconditions - url = https://github.com/libscott/libcryptoconditions + url = git@github.com:libscott/libcryptoconditions.git branch = komodo-integration diff --git a/src/cryptoconditions b/src/cryptoconditions index 7bd65d43af4..a59c22dcf9a 160000 --- a/src/cryptoconditions +++ b/src/cryptoconditions @@ -1 +1 @@ -Subproject commit 7bd65d43af4e95ea6d8edf6c3dc5f340e39770cd +Subproject commit a59c22dcf9a67be5f11f88ff89bbd9cb40fd22c0 From a032ddea1f0ab6ed403499b7ea1febfcd1e6d2e9 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Sat, 21 Oct 2017 17:54:17 -0700 Subject: [PATCH 0008/1081] configure.ac must not include cryptoconditions in AC_CONFIG_SUBDIRS because that disables shared linking. cryptoconditions must not include config.h because that includes conflicting variables. --- configure.ac | 2 +- src/Makefile.am | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 9f8f1900f93..c471bab89c8 100644 --- a/configure.ac +++ b/configure.ac @@ -996,7 +996,7 @@ unset PKG_CONFIG_LIBDIR PKG_CONFIG_LIBDIR="$PKGCONFIG_LIBDIR_TEMP" ac_configure_args="${ac_configure_args} --disable-shared --with-pic --with-bignum=no" -AC_CONFIG_SUBDIRS([src/secp256k1 src/univalue src/cryptoconditions]) +AC_CONFIG_SUBDIRS([src/secp256k1 src/univalue]) AC_OUTPUT diff --git a/src/Makefile.am b/src/Makefile.am index 8907fa54a7d..815d75d4cd8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -515,7 +515,8 @@ endif libzcashconsensus_la_LDFLAGS = -no-undefined $(RELDFLAGS) libzcashconsensus_la_LIBADD = $(CRYPTO_LIBS) libzcashconsensus_la_CPPFLAGS = $(CRYPTO_CFLAGS) -I$(builddir)/obj -DBUILD_BITCOIN_INTERNAL \ - -I$(builddir)/cryptoconditions/src/asn + -I$(builddir)/cryptoconditions/src/asn \ + -I$(builddir)/cryptoconditions/src endif # From 342611f9325e6074ddbe00f53adc0b6e3d40d4e7 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Sat, 21 Oct 2017 23:23:57 -0700 Subject: [PATCH 0009/1081] add rpccryptoconditions --- src/Makefile.am | 1 + src/rpcclient.cpp | 6 +- src/rpccryptoconditions.cpp | 925 ++++++++++++++++++++++++++++++++++++ src/rpcserver.cpp | 2 + src/rpcserver.h | 3 + 5 files changed, 936 insertions(+), 1 deletion(-) create mode 100644 src/rpccryptoconditions.cpp diff --git a/src/Makefile.am b/src/Makefile.am index 815d75d4cd8..919c6fc8946 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -238,6 +238,7 @@ libbitcoin_server_a_SOURCES = \ rpcmisc.cpp \ rpcnet.cpp \ rpcrawtransaction.cpp \ + rpccryptoconditions.cpp \ rpcserver.cpp \ script/sigcache.cpp \ timedata.cpp \ diff --git a/src/rpcclient.cpp b/src/rpcclient.cpp index da8fdc4b65b..2378e3ca01f 100644 --- a/src/rpcclient.cpp +++ b/src/rpcclient.cpp @@ -75,8 +75,12 @@ static const CRPCConvertParam vRPCConvertParams[] = { "getrawtransaction", 1 }, { "createrawtransaction", 0 }, { "createrawtransaction", 1 }, + { "createrawtransactioncc", 0 }, + { "createrawtransactioncc", 1 }, { "signrawtransaction", 1 }, { "signrawtransaction", 2 }, + { "signrawtransactioncc", 1 }, + { "signrawtransactioncc", 2 }, { "sendrawtransaction", 1 }, { "fundrawtransaction", 1 }, { "gettxout", 1 }, @@ -156,7 +160,7 @@ UniValue ParseNonRFCJSONValue(const std::string& strVal) UniValue jVal; if (!jVal.read(std::string("[")+strVal+std::string("]")) || !jVal.isArray() || jVal.size()!=1) - throw runtime_error(string("Error parsing JSON:")+strVal); + throw runtime_error(string("Error JSON:")+strVal); return jVal[0]; } diff --git a/src/rpccryptoconditions.cpp b/src/rpccryptoconditions.cpp new file mode 100644 index 00000000000..946667aae3a --- /dev/null +++ b/src/rpccryptoconditions.cpp @@ -0,0 +1,925 @@ +// Copyright (c) 2010 Satoshi Nakamoto +// Copyright (c) 2009-2015 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "base58.h" +#include "consensus/validation.h" +#include "core_io.h" +#include "init.h" +#include "keystore.h" +#include "main.h" +#include "merkleblock.h" +#include "net.h" +#include "primitives/transaction.h" +#include "rpcserver.h" +#include "script/script.h" +#include "script/script_error.h" +#include "script/sign.h" +#include "script/standard.h" +#include "uint256.h" +#include "cryptoconditions/include/cryptoconditions.h" +#ifdef ENABLE_WALLET +#include "wallet/wallet.h" +#endif + +#include + +#include + +#include + +using namespace std; + +void ScriptPubKeyToJSON(const CScript& scriptPubKey, UniValue& out, bool fIncludeHex); + + +UniValue TxJoinSplitToJSONcc(const CTransaction& tx) { + UniValue vjoinsplit(UniValue::VARR); + for (unsigned int i = 0; i < tx.vjoinsplit.size(); i++) { + const JSDescription& jsdescription = tx.vjoinsplit[i]; + UniValue joinsplit(UniValue::VOBJ); + + joinsplit.push_back(Pair("vpub_old", ValueFromAmount(jsdescription.vpub_old))); + joinsplit.push_back(Pair("vpub_new", ValueFromAmount(jsdescription.vpub_new))); + + joinsplit.push_back(Pair("anchor", jsdescription.anchor.GetHex())); + + { + UniValue nullifiers(UniValue::VARR); + BOOST_FOREACH(const uint256 nf, jsdescription.nullifiers) { + nullifiers.push_back(nf.GetHex()); + } + joinsplit.push_back(Pair("nullifiers", nullifiers)); + } + + { + UniValue commitments(UniValue::VARR); + BOOST_FOREACH(const uint256 commitment, jsdescription.commitments) { + commitments.push_back(commitment.GetHex()); + } + joinsplit.push_back(Pair("commitments", commitments)); + } + + joinsplit.push_back(Pair("onetimePubKey", jsdescription.ephemeralKey.GetHex())); + joinsplit.push_back(Pair("randomSeed", jsdescription.randomSeed.GetHex())); + + { + UniValue macs(UniValue::VARR); + BOOST_FOREACH(const uint256 mac, jsdescription.macs) { + macs.push_back(mac.GetHex()); + } + joinsplit.push_back(Pair("macs", macs)); + } + + CDataStream ssProof(SER_NETWORK, PROTOCOL_VERSION); + ssProof << jsdescription.proof; + joinsplit.push_back(Pair("proof", HexStr(ssProof.begin(), ssProof.end()))); + + { + UniValue ciphertexts(UniValue::VARR); + for (const ZCNoteEncryption::Ciphertext ct : jsdescription.ciphertexts) { + ciphertexts.push_back(HexStr(ct.begin(), ct.end())); + } + joinsplit.push_back(Pair("ciphertexts", ciphertexts)); + } + + vjoinsplit.push_back(joinsplit); + } + return vjoinsplit; +} + +uint64_t komodo_interest(int32_t txheight,uint64_t nValue,uint32_t nLockTime,uint32_t tiptime); + +void TxToJSON(const CTransaction& tx, const uint256 hashBlock, UniValue& entry); + + +UniValue getrawtransactioncc(const UniValue& params, bool fHelp) +{ + if (fHelp || params.size() < 1 || params.size() > 2) + throw runtime_error( + "getrawtransaction \"txid\" ( verbose )\n" + "\nNOTE: By default this function only works sometimes. This is when the tx is in the mempool\n" + "or there is an unspent output in the utxo for this transaction. To make it always work,\n" + "you need to maintain a transaction index, using the -txindex command line option.\n" + "\nReturn the raw transaction data.\n" + "\nIf verbose=0, returns a string that is serialized, hex-encoded data for 'txid'.\n" + "If verbose is non-zero, returns an Object with information about 'txid'.\n" + + "\nArguments:\n" + "1. \"txid\" (string, required) The transaction id\n" + "2. verbose (numeric, optional, default=0) If 0, return a string, other return a json object\n" + + "\nResult (if verbose is not set or set to 0):\n" + "\"data\" (string) The serialized, hex-encoded data for 'txid'\n" + + "\nResult (if verbose > 0):\n" + "{\n" + " \"hex\" : \"data\", (string) The serialized, hex-encoded data for 'txid'\n" + " \"txid\" : \"id\", (string) The transaction id (same as provided)\n" + " \"version\" : n, (numeric) The version\n" + " \"locktime\" : ttt, (numeric) The lock time\n" + " \"vin\" : [ (array of json objects)\n" + " {\n" + " \"txid\": \"id\", (string) The transaction id\n" + " \"vout\": n, (numeric) \n" + " \"scriptSig\": { (json object) The script\n" + " \"asm\": \"asm\", (string) asm\n" + " \"hex\": \"hex\" (string) hex\n" + " },\n" + " \"sequence\": n (numeric) The script sequence number\n" + " }\n" + " ,...\n" + " ],\n" + " \"vout\" : [ (array of json objects)\n" + " {\n" + " \"value\" : x.xxx, (numeric) The value in btc\n" + " \"n\" : n, (numeric) index\n" + " \"scriptPubKey\" : { (json object)\n" + " \"asm\" : \"asm\", (string) the asm\n" + " \"hex\" : \"hex\", (string) the hex\n" + " \"reqSigs\" : n, (numeric) The required sigs\n" + " \"type\" : \"pubkeyhash\", (string) The type, eg 'pubkeyhash'\n" + " \"addresses\" : [ (json array of string)\n" + " \"bitcoinaddress\" (string) bitcoin address\n" + " ,...\n" + " ]\n" + " }\n" + " }\n" + " ,...\n" + " ],\n" + " \"vjoinsplit\" : [ (array of json objects, only for version >= 2)\n" + " {\n" + " \"vpub_old\" : x.xxx, (numeric) public input value in ZEC\n" + " \"vpub_new\" : x.xxx, (numeric) public output value in ZEC\n" + " \"anchor\" : \"hex\", (string) the anchor\n" + " \"nullifiers\" : [ (json array of string)\n" + " \"hex\" (string) input note nullifier\n" + " ,...\n" + " ],\n" + " \"commitments\" : [ (json array of string)\n" + " \"hex\" (string) output note commitment\n" + " ,...\n" + " ],\n" + " \"onetimePubKey\" : \"hex\", (string) the onetime public key used to encrypt the ciphertexts\n" + " \"randomSeed\" : \"hex\", (string) the random seed\n" + " \"macs\" : [ (json array of string)\n" + " \"hex\" (string) input note MAC\n" + " ,...\n" + " ],\n" + " \"proof\" : \"hex\", (string) the zero-knowledge proof\n" + " \"ciphertexts\" : [ (json array of string)\n" + " \"hex\" (string) output note ciphertext\n" + " ,...\n" + " ]\n" + " }\n" + " ,...\n" + " ],\n" + " \"blockhash\" : \"hash\", (string) the block hash\n" + " \"confirmations\" : n, (numeric) The confirmations\n" + " \"time\" : ttt, (numeric) The transaction time in seconds since epoch (Jan 1 1970 GMT)\n" + " \"blocktime\" : ttt (numeric) The block time in seconds since epoch (Jan 1 1970 GMT)\n" + "}\n" + + "\nExamples:\n" + + HelpExampleCli("getrawtransaction", "\"mytxid\"") + + HelpExampleCli("getrawtransaction", "\"mytxid\" 1") + + HelpExampleRpc("getrawtransaction", "\"mytxid\", 1") + ); + + LOCK(cs_main); + + uint256 hash = ParseHashV(params[0], "parameter 1"); + + bool fVerbose = false; + if (params.size() > 1) + fVerbose = (params[1].get_int() != 0); + + CTransaction tx; + uint256 hashBlock; + if (!GetTransaction(hash, tx, hashBlock, true)) + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "No information available about transaction"); + + string strHex = EncodeHexTx(tx); + + if (!fVerbose) + return strHex; + + UniValue result(UniValue::VOBJ); + result.push_back(Pair("hex", strHex)); + TxToJSON(tx, hashBlock, result); + return result; +} + +int32_t gettxout_scriptPubKeycc(uint8_t *scriptPubKey,int32_t maxsize,uint256 txid,int32_t n) +{ + int32_t i,m; uint8_t *ptr; + LOCK(cs_main); + /*CCoins coins; + for (iter=0; iter<2; iter++) + { + if ( iter == 0 ) + { + LOCK(mempool.cs); + CCoinsViewMemPool view(pcoinsTip,mempool); + if ( view.GetCoins(txid,coins) == 0 ) + { + //fprintf(stderr,"cant get view\n"); + continue; + } + mempool.pruneSpent(txid, coins); // TODO: this should be done by the CCoinsViewMemPool + } + else if ( pcoinsTip->GetCoins(txid,coins) == 0 ) + { + //fprintf(stderr,"cant get pcoinsTip->GetCoins\n"); + continue; + } + if ( n < 0 || (unsigned int)n >= coins.vout.size() || coins.vout[n].IsNull() ) + { + fprintf(stderr,"iter.%d n.%d vs voutsize.%d\n",iter,n,(int32_t)coins.vout.size()); + continue; + } + ptr = (uint8_t *)coins.vout[n].scriptPubKey.data(); + m = coins.vout[n].scriptPubKey.size(); + for (i=0; i setTxids; + uint256 oneTxid; + UniValue txids = params[0].get_array(); + for (size_t idx = 0; idx < txids.size(); idx++) { + const UniValue& txid = txids[idx]; + if (txid.get_str().length() != 64 || !IsHex(txid.get_str())) + throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid txid ")+txid.get_str()); + uint256 hash(uint256S(txid.get_str())); + if (setTxids.count(hash)) + throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid parameter, duplicated txid: ")+txid.get_str()); + setTxids.insert(hash); + oneTxid = hash; + } + + LOCK(cs_main); + + CBlockIndex* pblockindex = NULL; + + uint256 hashBlock; + if (params.size() > 1) + { + hashBlock = uint256S(params[1].get_str()); + if (!mapBlockIndex.count(hashBlock)) + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found"); + pblockindex = mapBlockIndex[hashBlock]; + } else { + CCoins coins; + if (pcoinsTip->GetCoins(oneTxid, coins) && coins.nHeight > 0 && coins.nHeight <= chainActive.Height()) + pblockindex = chainActive[coins.nHeight]; + } + + if (pblockindex == NULL) + { + CTransaction tx; + if (!GetTransaction(oneTxid, tx, hashBlock, false) || hashBlock.IsNull()) + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Transaction not yet in block"); + if (!mapBlockIndex.count(hashBlock)) + throw JSONRPCError(RPC_INTERNAL_ERROR, "Transaction index corrupt"); + pblockindex = mapBlockIndex[hashBlock]; + } + + CBlock block; + if(!ReadBlockFromDisk(block, pblockindex)) + throw JSONRPCError(RPC_INTERNAL_ERROR, "Can't read block from disk"); + + unsigned int ntxFound = 0; + BOOST_FOREACH(const CTransaction&tx, block.vtx) + if (setTxids.count(tx.GetHash())) + ntxFound++; + if (ntxFound != setTxids.size()) + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "(Not all) transactions not found in specified block"); + + CDataStream ssMB(SER_NETWORK, PROTOCOL_VERSION); + CMerkleBlock mb(block, setTxids); + ssMB << mb; + std::string strHex = HexStr(ssMB.begin(), ssMB.end()); + return strHex; +} + +UniValue verifytxoutproofcc(const UniValue& params, bool fHelp) +{ + if (fHelp || params.size() != 1) + throw runtime_error( + "verifytxoutproof \"proof\"\n" + "\nVerifies that a proof points to a transaction in a block, returning the transaction it commits to\n" + "and throwing an RPC error if the block is not in our best chain\n" + "\nArguments:\n" + "1. \"proof\" (string, required) The hex-encoded proof generated by gettxoutproof\n" + "\nResult:\n" + "[\"txid\"] (array, strings) The txid(s) which the proof commits to, or empty array if the proof is invalid\n" + ); + + CDataStream ssMB(ParseHexV(params[0], "proof"), SER_NETWORK, PROTOCOL_VERSION); + CMerkleBlock merkleBlock; + ssMB >> merkleBlock; + + UniValue res(UniValue::VARR); + + vector vMatch; + if (merkleBlock.txn.ExtractMatches(vMatch) != merkleBlock.header.hashMerkleRoot) + return res; + + LOCK(cs_main); + + if (!mapBlockIndex.count(merkleBlock.header.GetHash()) || !chainActive.Contains(mapBlockIndex[merkleBlock.header.GetHash()])) + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found in chain"); + + BOOST_FOREACH(const uint256& hash, vMatch) + res.push_back(hash.GetHex()); + return res; +} + +UniValue createrawtransactioncc(const UniValue& params, bool fHelp) +{ + if (fHelp || params.size() != 2) + throw runtime_error( + "createrawtransaction [{\"txid\":\"id\",\"vout\":n},...] {\"address\":amount,...}\n" + "\nCreate a transaction spending the given inputs and sending to the given addresses.\n" + "Returns hex-encoded raw transaction.\n" + "Note that the transaction's inputs are not signed, and\n" + "it is not stored in the wallet or transmitted to the network.\n" + + "\nArguments:\n" + "1. \"transactions\" (string, required) A json array of json objects\n" + " [\n" + " {\n" + " \"txid\":\"id\", (string, required) The transaction id\n" + " \"vout\":n (numeric, required) The output number\n" + " }\n" + " ,...\n" + " ]\n" + "2. \"addresses\" (string, required) a json object with addresses as keys and amounts as values\n" + " {\n" + " \"address\": x.xxx (numeric, required) The key is the bitcoin address, the value is the btc amount\n" + " ,...\n" + " }\n" + + "\nResult:\n" + "\"transaction\" (string) hex string of the transaction\n" + + "\nExamples\n" + + HelpExampleCli("createrawtransactioncc", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\" \"{\\\"address\\\":0.01}\"") + + HelpExampleRpc("createrawtransactioncc", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\", \"{\\\"address\\\":0.01}\"") + ); + + LOCK(cs_main); + RPCTypeCheck(params, boost::assign::list_of(UniValue::VARR)(UniValue::VARR)); + + UniValue inputs = params[0].get_array(); + UniValue outputs = params[1].get_array(); + + CMutableTransaction rawTx; + + for (size_t idx = 0; idx < inputs.size(); idx++) { + const UniValue& input = inputs[idx]; + const UniValue& o = input.get_obj(); + + uint256 txid = ParseHashO(o, "txid"); + + const UniValue& vout_v = find_value(o, "vout"); + if (!vout_v.isNum()) + throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, missing vout key"); + int nOutput = vout_v.get_int(); + if (nOutput < 0) + throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, vout must be positive"); + + CTxIn in(COutPoint(txid, nOutput)); + rawTx.vin.push_back(in); + } + + for (size_t idx = 0; idx < outputs.size(); idx++) { + const UniValue& output = outputs[idx].get_obj(); + + const UniValue& condition = find_value(output, "condition"); + std::string encoded = condition.write(); + fprintf(stderr, "%s\n", encoded.c_str()); + char *err = new char[1000]; + CC *cond = cc_conditionFromJSONString(encoded.c_str(), err); + if (NULL == cond) + throw JSONRPCError(RPC_INVALID_PARAMETER, err); + char *condBin = new char[1000]; + size_t binLength = cc_conditionBinary(cond, condBin); + std::vector condVec(condBin, condBin + binLength); + + CScript redeemScript; + redeemScript << ToByteVector(condVec) << OP_CHECKCRYPTOCONDITIONVERIFY; + CAmount nAmount = AmountFromValue(find_value(output, "amount")); + + CTxOut out(nAmount, redeemScript); + rawTx.vout.push_back(out); + } + + /* + set setAddress; + vector addrList = sendTo.getKeys(); + BOOST_FOREACH(const string& name_, addrList) { + CBitcoinAddress address(name_); + if (!address.IsValid()) + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, string("Invalid Bitcoin address: ")+name_); + + if (setAddress.count(address)) + throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid parameter, duplicated address: ")+name_); + setAddress.insert(address); + + CScript scriptPubKey = GetScriptForDestination(address.Get()); + CAmount nAmount = AmountFromValue(sendTo[name_]); + + CTxOut out(nAmount, scriptPubKey); + rawTx.vout.push_back(out); + } + */ + + return EncodeHexTx(rawTx); +} + +UniValue decoderawtransactioncc(const UniValue& params, bool fHelp) +{ + if (fHelp || params.size() != 1) + throw runtime_error( + "decoderawtransaction \"hexstring\"\n" + "\nReturn a JSON object representing the serialized, hex-encoded transaction.\n" + + "\nArguments:\n" + "1. \"hex\" (string, required) The transaction hex string\n" + + "\nResult:\n" + "{\n" + " \"txid\" : \"id\", (string) The transaction id\n" + " \"version\" : n, (numeric) The version\n" + " \"locktime\" : ttt, (numeric) The lock time\n" + " \"vin\" : [ (array of json objects)\n" + " {\n" + " \"txid\": \"id\", (string) The transaction id\n" + " \"vout\": n, (numeric) The output number\n" + " \"scriptSig\": { (json object) The script\n" + " \"asm\": \"asm\", (string) asm\n" + " \"hex\": \"hex\" (string) hex\n" + " },\n" + " \"sequence\": n (numeric) The script sequence number\n" + " }\n" + " ,...\n" + " ],\n" + " \"vout\" : [ (array of json objects)\n" + " {\n" + " \"value\" : x.xxx, (numeric) The value in btc\n" + " \"n\" : n, (numeric) index\n" + " \"scriptPubKey\" : { (json object)\n" + " \"asm\" : \"asm\", (string) the asm\n" + " \"hex\" : \"hex\", (string) the hex\n" + " \"reqSigs\" : n, (numeric) The required sigs\n" + " \"type\" : \"pubkeyhash\", (string) The type, eg 'pubkeyhash'\n" + " \"addresses\" : [ (json array of string)\n" + " \"12tvKAXCxZjSmdNbao16dKXC8tRWfcF5oc\" (string) bitcoin address\n" + " ,...\n" + " ]\n" + " }\n" + " }\n" + " ,...\n" + " ],\n" + " \"vjoinsplit\" : [ (array of json objects, only for version >= 2)\n" + " {\n" + " \"vpub_old\" : x.xxx, (numeric) public input value in ZEC\n" + " \"vpub_new\" : x.xxx, (numeric) public output value in ZEC\n" + " \"anchor\" : \"hex\", (string) the anchor\n" + " \"nullifiers\" : [ (json array of string)\n" + " \"hex\" (string) input note nullifier\n" + " ,...\n" + " ],\n" + " \"commitments\" : [ (json array of string)\n" + " \"hex\" (string) output note commitment\n" + " ,...\n" + " ],\n" + " \"onetimePubKey\" : \"hex\", (string) the onetime public key used to encrypt the ciphertexts\n" + " \"randomSeed\" : \"hex\", (string) the random seed\n" + " \"macs\" : [ (json array of string)\n" + " \"hex\" (string) input note MAC\n" + " ,...\n" + " ],\n" + " \"proof\" : \"hex\", (string) the zero-knowledge proof\n" + " \"ciphertexts\" : [ (json array of string)\n" + " \"hex\" (string) output note ciphertext\n" + " ,...\n" + " ]\n" + " }\n" + " ,...\n" + " ],\n" + "}\n" + + "\nExamples:\n" + + HelpExampleCli("decoderawtransaction", "\"hexstring\"") + + HelpExampleRpc("decoderawtransaction", "\"hexstring\"") + ); + + LOCK(cs_main); + RPCTypeCheck(params, boost::assign::list_of(UniValue::VSTR)); + + CTransaction tx; + + if (!DecodeHexTx(tx, params[0].get_str())) + throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed"); + + UniValue result(UniValue::VOBJ); + TxToJSON(tx, uint256(), result); + + return result; +} + +UniValue decodescriptcc(const UniValue& params, bool fHelp) +{ + if (fHelp || params.size() != 1) + throw runtime_error( + "decodescript \"hex\"\n" + "\nDecode a hex-encoded script.\n" + "\nArguments:\n" + "1. \"hex\" (string) the hex encoded script\n" + "\nResult:\n" + "{\n" + " \"asm\":\"asm\", (string) Script public key\n" + " \"hex\":\"hex\", (string) hex encoded public key\n" + " \"type\":\"type\", (string) The output type\n" + " \"reqSigs\": n, (numeric) The required signatures\n" + " \"addresses\": [ (json array of string)\n" + " \"address\" (string) bitcoin address\n" + " ,...\n" + " ],\n" + " \"p2sh\",\"address\" (string) script address\n" + "}\n" + "\nExamples:\n" + + HelpExampleCli("decodescript", "\"hexstring\"") + + HelpExampleRpc("decodescript", "\"hexstring\"") + ); + + LOCK(cs_main); + RPCTypeCheck(params, boost::assign::list_of(UniValue::VSTR)); + + UniValue r(UniValue::VOBJ); + CScript script; + if (params[0].get_str().size() > 0){ + vector scriptData(ParseHexV(params[0], "argument")); + script = CScript(scriptData.begin(), scriptData.end()); + } else { + // Empty scripts are valid + } + ScriptPubKeyToJSON(script, r, false); + + r.push_back(Pair("p2sh", CBitcoinAddress(CScriptID(script)).ToString())); + return r; +} + +/** Pushes a JSON object for script verification or signing errors to vErrorsRet. */ +static void TxInErrorToJSON(const CTxIn& txin, UniValue& vErrorsRet, const std::string& strMessage) {} + + +UniValue signrawtransactioncc(const UniValue& params, bool fHelp) +{ + if (fHelp || params.size() < 1 || params.size() > 4) + throw runtime_error( + "signrawtransactioncc \"hexstring\" ( [{\"txid\":\"id\",\"vout\":n,\"scriptPubKey\":\"hex\",\"redeemScript\":\"hex\"},...] [\"privatekey1\",...] sighashtype )\n" + "\nSign cryptocondition inputs for raw transaction (serialized, hex-encoded).\n" + "The second optional argument (may be null) is an array of previous transaction outputs that\n" + "this transaction depends on but may not yet be in the block chain.\n" + "The third optional argument (may be null) is an array of base58-encoded private\n" + "keys that, if given, will be the only keys used to sign the transaction.\n" +#ifdef ENABLE_WALLET + + HelpRequiringPassphrase() + "\n" +#endif + + "\nArguments:\n" + "1. \"hexstring\" (string, required) The transaction hex string\n" + /* "2. \"prevtxs\" (string, optional) An json array of previous dependent transaction outputs\n" + " [ (json array of json objects, or 'null' if none provided)\n" + " {\n" + " \"txid\":\"id\", (string, required) The transaction id\n" + " \"vout\":n, (numeric, required) The output number\n" + " \"scriptPubKey\": \"hex\", (string, required) script key\n" + " \"redeemScript\": \"hex\" (string, required for P2SH) redeem script\n" + " }\n" + " ,...\n" + " ]\n" */ + "3. \"privatekeys\" (string, optional) A json array of base58-encoded private keys for signing\n" + " [ (json array of strings, or 'null' if none provided)\n" + " \"privatekey\" (string) private key in base58-encoding\n" + " ,...\n" + " ]\n" + /* "4. \"sighashtype\" (string, optional, default=ALL) The signature hash type. Must be one of\n" + " \"ALL\"\n" + " \"NONE\"\n" + " \"SINGLE\"\n" + " \"ALL|ANYONECANPAY\"\n" + " \"NONE|ANYONECANPAY\"\n" + " \"SINGLE|ANYONECANPAY\"\n" */ + + "\nResult:\n" + "{\n" + " \"hex\" : \"value\", (string) The hex-encoded raw transaction with signature(s)\n" + " \"complete\" : true|false, (boolean) If the transaction has a complete set of signatures\n" + " \"errors\" : [ (json array of objects) Script verification errors (if there are any)\n" + " {\n" + " \"txid\" : \"hash\", (string) The hash of the referenced, previous transaction\n" + " \"vout\" : n, (numeric) The index of the output to spent and used as input\n" + " \"scriptSig\" : \"hex\", (string) The hex-encoded signature script\n" + " \"sequence\" : n, (numeric) Script sequence number\n" + " \"error\" : \"text\" (string) Verification or signing error related to the input\n" + " }\n" + " ,...\n" + " ]\n" + "}\n" + + "\nExamples:\n" + + HelpExampleCli("signrawtransactioncc", "\"myhex\"") + + HelpExampleRpc("signrawtransactioncc", "\"myhex\"") + ); + +#ifdef ENABLE_WALLET + LOCK2(cs_main, pwalletMain ? &pwalletMain->cs_wallet : NULL); +#else + LOCK(cs_main); +#endif + RPCTypeCheck(params, boost::assign::list_of(UniValue::VSTR)(UniValue::VARR)(UniValue::VARR)(UniValue::VSTR), true); + + vector txData(ParseHexV(params[0], "argument 1")); + CDataStream ssData(txData, SER_NETWORK, PROTOCOL_VERSION); + vector txVariants; + while (!ssData.empty()) { + //try { + CMutableTransaction tx; + ssData >> tx; + txVariants.push_back(tx); + //} + //catch (const std::exception&) { + //throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed"); + //} + } + + if (txVariants.empty()) + throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Missing transaction"); + + // mergedTx will end up with all the signatures; it + // starts as a clone of the rawtx: + CMutableTransaction mergedTx(txVariants[0]); + + // Fetch previous transactions (inputs): + CCoinsView viewDummy; + CCoinsViewCache view(&viewDummy); + { + LOCK(mempool.cs); + CCoinsViewCache &viewChain = *pcoinsTip; + CCoinsViewMemPool viewMempool(&viewChain, mempool); + view.SetBackend(viewMempool); // temporarily switch cache backend to db+mempool view + + BOOST_FOREACH(const CTxIn& txin, mergedTx.vin) { + const uint256& prevHash = txin.prevout.hash; + CCoins coins; + view.AccessCoins(prevHash); // this is certainly allowed to fail + } + + view.SetBackend(viewDummy); // switch back to avoid locking mempool for too long + } + + bool fGivenKeys = false; + CBasicKeyStore tempKeystore; + if (params.size() > 2 && !params[2].isNull()) { + fGivenKeys = true; + UniValue keys = params[2].get_array(); + for (size_t idx = 0; idx < keys.size(); idx++) { + UniValue k = keys[idx]; + CBitcoinSecret vchSecret; + bool fGood = vchSecret.SetString(k.get_str()); + if (!fGood) + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid private key"); + CKey key = vchSecret.GetKey(); + if (!key.IsValid()) + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Private key outside allowed range"); + tempKeystore.AddKey(key); + } + } +#ifdef ENABLE_WALLET + else if (pwalletMain) + EnsureWalletIsUnlocked(); +#endif + + // Add previous txouts given in the RPC call: + /* + if (params.size() > 1 && !params[1].isNull()) { + UniValue prevTxs = params[1].get_array(); + for (size_t idx = 0; idx < prevTxs.size(); idx++) { + const UniValue& p = prevTxs[idx]; + if (!p.isObject()) + throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "expected object with {\"txid'\",\"vout\",\"scriptPubKey\"}"); + + UniValue prevOut = p.get_obj(); + + RPCTypeCheckObj(prevOut, boost::assign::map_list_of("txid", UniValue::VSTR)("vout", UniValue::VNUM)("scriptPubKey", UniValue::VSTR)); + + uint256 txid = ParseHashO(prevOut, "txid"); + + int nOut = find_value(prevOut, "vout").get_int(); + if (nOut < 0) + throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "vout must be positive"); + + vector pkData(ParseHexO(prevOut, "scriptPubKey")); + CScript scriptPubKey(pkData.begin(), pkData.end()); + + { + CCoinsModifier coins = view.ModifyCoins(txid); + if (coins->IsAvailable(nOut) && coins->vout[nOut].scriptPubKey != scriptPubKey) { + string err("Previous output scriptPubKey mismatch:\n"); + err = err + coins->vout[nOut].scriptPubKey.ToString() + "\nvs:\n"+ + scriptPubKey.ToString(); + throw JSONRPCError(RPC_DESERIALIZATION_ERROR, err); + } + if ((unsigned int)nOut >= coins->vout.size()) + coins->vout.resize(nOut+1); + coins->vout[nOut].scriptPubKey = scriptPubKey; + coins->vout[nOut].nValue = 0; // we don't know the actual output value + } + + // if redeemScript given and not using the local wallet (private keys + // given), add redeemScript to the tempKeystore so it can be signed: + if (fGivenKeys && scriptPubKey.IsPayToScriptHash()) { + RPCTypeCheckObj(prevOut, boost::assign::map_list_of("txid", UniValue::VSTR)("vout", UniValue::VNUM)("scriptPubKey", UniValue::VSTR)("redeemScript",UniValue::VSTR)); + UniValue v = find_value(prevOut, "redeemScript"); + if (!v.isNull()) { + vector rsData(ParseHexV(v, "redeemScript")); + CScript redeemScript(rsData.begin(), rsData.end()); + tempKeystore.AddCScript(redeemScript); + } + } + } + } + */ + +#ifdef ENABLE_WALLET + const CKeyStore& keystore = ((fGivenKeys || !pwalletMain) ? tempKeystore : *pwalletMain); +#else + const CKeyStore& keystore = tempKeystore; +#endif + + int nHashType = SIGHASH_ALL; + /* + if (params.size() > 3 && !params[3].isNull()) { + static map mapSigHashValues = + boost::assign::map_list_of + (string("ALL"), int(SIGHASH_ALL)) + (string("ALL|ANYONECANPAY"), int(SIGHASH_ALL|SIGHASH_ANYONECANPAY)) + (string("NONE"), int(SIGHASH_NONE)) + (string("NONE|ANYONECANPAY"), int(SIGHASH_NONE|SIGHASH_ANYONECANPAY)) + (string("SINGLE"), int(SIGHASH_SINGLE)) + (string("SINGLE|ANYONECANPAY"), int(SIGHASH_SINGLE|SIGHASH_ANYONECANPAY)) + ; + string strHashType = params[3].get_str(); + if (mapSigHashValues.count(strHashType)) + nHashType = mapSigHashValues[strHashType]; + else + throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid sighash param"); + } + */ + + bool fHashSingle = ((nHashType & ~SIGHASH_ANYONECANPAY) == SIGHASH_SINGLE); + + // Script verification errors + UniValue vErrors(UniValue::VARR); + + // Sign what we can: + for (unsigned int i = 0; i < mergedTx.vin.size(); i++) { + CTxIn& txin = mergedTx.vin[i]; + const CCoins* coins = view.AccessCoins(txin.prevout.hash); + if (coins == NULL || !coins->IsAvailable(txin.prevout.n)) { + TxInErrorToJSON(txin, vErrors, "Input not found or already spent"); + continue; + } + const CScript& prevPubKey = coins->vout[txin.prevout.n].scriptPubKey; + + txin.scriptSig.clear(); + // Only sign SIGHASH_SINGLE if there's a corresponding output: + if (!fHashSingle || (i < mergedTx.vout.size())) + SignSignature(keystore, prevPubKey, mergedTx, i, nHashType); + + // ... and merge in other signatures: + BOOST_FOREACH(const CMutableTransaction& txv, txVariants) { + txin.scriptSig = CombineSignatures(prevPubKey, mergedTx, i, txin.scriptSig, txv.vin[i].scriptSig); + } + ScriptError serror = SCRIPT_ERR_OK; + if (!VerifyScript(txin.scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, MutableTransactionSignatureChecker(&mergedTx, i), &serror)) { + TxInErrorToJSON(txin, vErrors, ScriptErrorString(serror)); + } + } + bool fComplete = vErrors.empty(); + + UniValue result(UniValue::VOBJ); + result.push_back(Pair("hex", EncodeHexTx(mergedTx))); + result.push_back(Pair("complete", fComplete)); + if (!vErrors.empty()) { + result.push_back(Pair("errors", vErrors)); + } + + return result; +} + +UniValue sendrawtransactioncc(const UniValue& params, bool fHelp) +{ + if (fHelp || params.size() < 1 || params.size() > 2) + throw runtime_error( + "sendrawtransaction \"hexstring\" ( allowhighfees )\n" + "\nSubmits raw transaction (serialized, hex-encoded) to local node and network.\n" + "\nAlso see createrawtransaction and signrawtransaction calls.\n" + "\nArguments:\n" + "1. \"hexstring\" (string, required) The hex string of the raw transaction)\n" + "2. allowhighfees (boolean, optional, default=false) Allow high fees\n" + "\nResult:\n" + "\"hex\" (string) The transaction hash in hex\n" + "\nExamples:\n" + "\nCreate a transaction\n" + + HelpExampleCli("createrawtransaction", "\"[{\\\"txid\\\" : \\\"mytxid\\\",\\\"vout\\\":0}]\" \"{\\\"myaddress\\\":0.01}\"") + + "Sign the transaction, and get back the hex\n" + + HelpExampleCli("signrawtransaction", "\"myhex\"") + + "\nSend the transaction (signed hex)\n" + + HelpExampleCli("sendrawtransaction", "\"signedhex\"") + + "\nAs a json rpc call\n" + + HelpExampleRpc("sendrawtransaction", "\"signedhex\"") + ); + + LOCK(cs_main); + RPCTypeCheck(params, boost::assign::list_of(UniValue::VSTR)(UniValue::VBOOL)); + + // parse hex string from parameter + CTransaction tx; + if (!DecodeHexTx(tx, params[0].get_str())) + throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed"); + uint256 hashTx = tx.GetHash(); + + bool fOverrideFees = false; + if (params.size() > 1) + fOverrideFees = params[1].get_bool(); + + CCoinsViewCache &view = *pcoinsTip; + const CCoins* existingCoins = view.AccessCoins(hashTx); + bool fHaveMempool = mempool.exists(hashTx); + bool fHaveChain = existingCoins && existingCoins->nHeight < 1000000000; + if (!fHaveMempool && !fHaveChain) { + // push to local node and sync with wallets + CValidationState state; + bool fMissingInputs; + if (!AcceptToMemoryPool(mempool, state, tx, false, &fMissingInputs, !fOverrideFees)) { + if (state.IsInvalid()) { + throw JSONRPCError(RPC_TRANSACTION_REJECTED, strprintf("%i: %s", state.GetRejectCode(), state.GetRejectReason())); + } else { + if (fMissingInputs) { + throw JSONRPCError(RPC_TRANSACTION_ERROR, "Missing inputs"); + } + throw JSONRPCError(RPC_TRANSACTION_ERROR, state.GetRejectReason()); + } + } + } else if (fHaveChain) { + throw JSONRPCError(RPC_TRANSACTION_ALREADY_IN_CHAIN, "transaction already in block chain"); + } + RelayTransaction(tx); + + return hashTx.GetHex(); +} diff --git a/src/rpcserver.cpp b/src/rpcserver.cpp index 518ba4693da..06c08a3be09 100644 --- a/src/rpcserver.cpp +++ b/src/rpcserver.cpp @@ -325,6 +325,8 @@ static const CRPCCommand vRPCCommands[] = { "rawtransactions", "getrawtransaction", &getrawtransaction, true }, { "rawtransactions", "sendrawtransaction", &sendrawtransaction, false }, { "rawtransactions", "signrawtransaction", &signrawtransaction, false }, /* uses wallet if enabled */ + { "rawtransactions", "createrawtransactioncc", &createrawtransactioncc, true }, + { "rawtransactions", "signrawtransactioncc", &signrawtransactioncc, false }, /* uses wallet if enabled */ #ifdef ENABLE_WALLET { "rawtransactions", "fundrawtransaction", &fundrawtransaction, false }, #endif diff --git a/src/rpcserver.h b/src/rpcserver.h index ecf7b0573fd..611abd05fdb 100644 --- a/src/rpcserver.h +++ b/src/rpcserver.h @@ -262,6 +262,9 @@ extern UniValue sendrawtransaction(const UniValue& params, bool fHelp); extern UniValue gettxoutproof(const UniValue& params, bool fHelp); extern UniValue verifytxoutproof(const UniValue& params, bool fHelp); +extern UniValue createrawtransactioncc(const UniValue& params, bool fHelp); // in rpccryptocondition.cpp +extern UniValue signrawtransactioncc(const UniValue& params, bool fHelp); + extern UniValue getblockcount(const UniValue& params, bool fHelp); // in rpcblockchain.cpp extern UniValue getbestblockhash(const UniValue& params, bool fHelp); extern UniValue getdifficulty(const UniValue& params, bool fHelp); From 8fa1b4be0e9c60ef3f6f877e44a32ae20b7b91e4 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Sun, 22 Oct 2017 21:57:07 -0700 Subject: [PATCH 0010/1081] upgrade cJSON and move cJSON extensions to different module --- src/bitcoin-cli.cpp | 2 +- src/cJSON.c | 3471 +++++++++++++++++++++++++++++++------------ src/cJSON.h | 462 +++--- src/komodo.h | 2 +- src/komodo_cJSON.c | 559 +++++++ src/komodo_cJSON.h | 128 ++ src/komodo_jumblr.h | 18 +- src/komodo_notary.h | 2 + 8 files changed, 3465 insertions(+), 1179 deletions(-) mode change 100755 => 100644 src/cJSON.c mode change 100755 => 100644 src/cJSON.h create mode 100755 src/komodo_cJSON.c create mode 100755 src/komodo_cJSON.h diff --git a/src/bitcoin-cli.cpp b/src/bitcoin-cli.cpp index bb9aeb58052..cac650a0049 100644 --- a/src/bitcoin-cli.cpp +++ b/src/bitcoin-cli.cpp @@ -72,7 +72,7 @@ class CConnectionFailed : public std::runtime_error #include "komodo_globals.h" #include "komodo_utils.h" -#include "cJSON.c" +#include "komodo_cJSON.c" #include "komodo_notary.h" void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotaries,uint8_t notaryid,uint256 txhash,uint64_t voutmask,uint8_t numvouts,uint32_t *pvals,uint8_t numpvals,int32_t KMDheight,uint32_t KMDtimestamp,uint64_t opretvalue,uint8_t *opretbuf,uint16_t opretlen,uint16_t vout) diff --git a/src/cJSON.c b/src/cJSON.c old mode 100755 new mode 100644 index 82b78a40346..5b58f2ffc6b --- a/src/cJSON.c +++ b/src/cJSON.c @@ -1,1136 +1,2699 @@ - /* - Copyright (c) 2009 Dave Gamble - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - */ + Copyright (c) 2009-2017 Dave Gamble and cJSON contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ /* cJSON */ /* JSON parser in C. */ + +#ifdef __GNUC__ +#pragma GCC visibility push(default) +#endif + +#include +#include #include +#include +#include +#include +#include +#include + +#ifdef __GNUC__ +#pragma GCC visibility pop +#endif #include "cJSON.h" -#ifndef DBL_EPSILON -#define DBL_EPSILON 2.2204460492503131E-16 +/* define our own boolean type */ +#define true ((cJSON_bool)1) +#define false ((cJSON_bool)0) + +typedef struct { + const unsigned char *json; + size_t position; +} cJSON_error; +static cJSON_error global_error = { NULL, 0 }; + +CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void) +{ + return (const char*) (global_error.json + global_error.position); +} + +/* This is a safeguard to prevent copy-pasters from using incompatible C and header files */ +#if (CJSON_VERSION_MAJOR != 1) || (CJSON_VERSION_MINOR != 5) || (CJSON_VERSION_PATCH != 9) + #error cJSON.h and cJSON.c have different versions. Make sure that both have the same. #endif -static const char *ep; +CJSON_PUBLIC(const char*) cJSON_Version(void) +{ + static char version[15]; + sprintf(version, "%i.%i.%i", CJSON_VERSION_MAJOR, CJSON_VERSION_MINOR, CJSON_VERSION_PATCH); + + return version; +} + +/* Case insensitive string comparison, doesn't consider two NULL pointers equal though */ +static int case_insensitive_strcmp(const unsigned char *string1, const unsigned char *string2) +{ + if ((string1 == NULL) || (string2 == NULL)) + { + return 1; + } + + if (string1 == string2) + { + return 0; + } + + for(; tolower(*string1) == tolower(*string2); (void)string1++, string2++) + { + if (*string1 == '\0') + { + return 0; + } + } + + return tolower(*string1) - tolower(*string2); +} + +typedef struct internal_hooks +{ + void *(*allocate)(size_t size); + void (*deallocate)(void *pointer); + void *(*reallocate)(void *pointer, size_t size); +} internal_hooks; + +static internal_hooks global_hooks = { malloc, free, realloc }; + +static unsigned char* cJSON_strdup(const unsigned char* string, const internal_hooks * const hooks) +{ + size_t length = 0; + unsigned char *copy = NULL; + + if (string == NULL) + { + return NULL; + } + + length = strlen((const char*)string) + sizeof(""); + if (!(copy = (unsigned char*)hooks->allocate(length))) + { + return NULL; + } + memcpy(copy, string, length); + + return copy; +} + +CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks) +{ + if (hooks == NULL) + { + /* Reset hooks */ + global_hooks.allocate = malloc; + global_hooks.deallocate = free; + global_hooks.reallocate = realloc; + return; + } + + global_hooks.allocate = malloc; + if (hooks->malloc_fn != NULL) + { + global_hooks.allocate = hooks->malloc_fn; + } + + global_hooks.deallocate = free; + if (hooks->free_fn != NULL) + { + global_hooks.deallocate = hooks->free_fn; + } + + /* use realloc only if both free and malloc are used */ + global_hooks.reallocate = NULL; + if ((global_hooks.allocate == malloc) && (global_hooks.deallocate == free)) + { + global_hooks.reallocate = realloc; + } +} + +/* Internal constructor. */ +static cJSON *cJSON_New_Item(const internal_hooks * const hooks) +{ + cJSON* node = (cJSON*)hooks->allocate(sizeof(cJSON)); + if (node) + { + memset(node, '\0', sizeof(cJSON)); + } + + return node; +} + +/* Delete a cJSON structure. */ +CJSON_PUBLIC(void) cJSON_Delete(cJSON *item) +{ + cJSON *next = NULL; + while (item != NULL) + { + next = item->next; + if (!(item->type & cJSON_IsReference) && (item->child != NULL)) + { + cJSON_Delete(item->child); + } + if (!(item->type & cJSON_IsReference) && (item->valuestring != NULL)) + { + global_hooks.deallocate(item->valuestring); + } + if (!(item->type & cJSON_StringIsConst) && (item->string != NULL)) + { + global_hooks.deallocate(item->string); + } + global_hooks.deallocate(item); + item = next; + } +} + +/* get the decimal point character of the current locale */ +static unsigned char get_decimal_point(void) +{ + struct lconv *lconv = localeconv(); + return (unsigned char) lconv->decimal_point[0]; +} + +typedef struct +{ + const unsigned char *content; + size_t length; + size_t offset; + size_t depth; /* How deeply nested (in arrays/objects) is the input at the current offset. */ + internal_hooks hooks; +} parse_buffer; + +/* check if the given size is left to read in a given parse buffer (starting with 1) */ +#define can_read(buffer, size) ((buffer != NULL) && (((buffer)->offset + size) <= (buffer)->length)) +#define cannot_read(buffer, size) (!can_read(buffer, size)) +/* check if the buffer can be accessed at the given index (starting with 0) */ +#define can_access_at_index(buffer, index) ((buffer != NULL) && (((buffer)->offset + index) < (buffer)->length)) +#define cannot_access_at_index(buffer, index) (!can_access_at_index(buffer, index)) +/* get a pointer to the buffer at the position */ +#define buffer_at_offset(buffer) ((buffer)->content + (buffer)->offset) + +/* Parse the input text to generate a number, and populate the result into item. */ +static cJSON_bool parse_number(cJSON * const item, parse_buffer * const input_buffer) +{ + double number = 0; + unsigned char *after_end = NULL; + unsigned char number_c_string[64]; + unsigned char decimal_point = get_decimal_point(); + size_t i = 0; + + if ((input_buffer == NULL) || (input_buffer->content == NULL)) + { + return false; + } + + /* copy the number into a temporary buffer and replace '.' with the decimal point + * of the current locale (for strtod) + * This also takes care of '\0' not necessarily being available for marking the end of the input */ + for (i = 0; (i < (sizeof(number_c_string) - 1)) && can_access_at_index(input_buffer, i); i++) + { + switch (buffer_at_offset(input_buffer)[i]) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '+': + case '-': + case 'e': + case 'E': + number_c_string[i] = buffer_at_offset(input_buffer)[i]; + break; + + case '.': + number_c_string[i] = decimal_point; + break; + + default: + goto loop_end; + } + } +loop_end: + number_c_string[i] = '\0'; + + number = strtod((const char*)number_c_string, (char**)&after_end); + if (number_c_string == after_end) + { + return false; /* parse_error */ + } + + item->valuedouble = number; + + /* use saturation in case of overflow */ + if (number >= INT_MAX) + { + item->valueint = INT_MAX; + } + else if (number <= INT_MIN) + { + item->valueint = INT_MIN; + } + else + { + item->valueint = (int)number; + } + + item->type = cJSON_Number; + + input_buffer->offset += (size_t)(after_end - number_c_string); + return true; +} + +/* don't ask me, but the original cJSON_SetNumberValue returns an integer or double */ +CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number) +{ + if (number >= INT_MAX) + { + object->valueint = INT_MAX; + } + else if (number <= INT_MIN) + { + object->valueint = INT_MIN; + } + else + { + object->valueint = (int)number; + } + + return object->valuedouble = number; +} + +typedef struct +{ + unsigned char *buffer; + size_t length; + size_t offset; + size_t depth; /* current nesting depth (for formatted printing) */ + cJSON_bool noalloc; + cJSON_bool format; /* is this print a formatted print */ + internal_hooks hooks; +} printbuffer; + +/* realloc printbuffer if necessary to have at least "needed" bytes more */ +static unsigned char* ensure(printbuffer * const p, size_t needed) +{ + unsigned char *newbuffer = NULL; + size_t newsize = 0; + + if ((p == NULL) || (p->buffer == NULL)) + { + return NULL; + } + + if ((p->length > 0) && (p->offset >= p->length)) + { + /* make sure that offset is valid */ + return NULL; + } + + if (needed > INT_MAX) + { + /* sizes bigger than INT_MAX are currently not supported */ + return NULL; + } + + needed += p->offset + 1; + if (needed <= p->length) + { + return p->buffer + p->offset; + } + + if (p->noalloc) { + return NULL; + } + + /* calculate new buffer size */ + if (needed > (INT_MAX / 2)) + { + /* overflow of int, use INT_MAX if possible */ + if (needed <= INT_MAX) + { + newsize = INT_MAX; + } + else + { + return NULL; + } + } + else + { + newsize = needed * 2; + } + + if (p->hooks.reallocate != NULL) + { + /* reallocate with realloc if available */ + newbuffer = (unsigned char*)p->hooks.reallocate(p->buffer, newsize); + if (newbuffer == NULL) + { + p->hooks.deallocate(p->buffer); + p->length = 0; + p->buffer = NULL; + + return NULL; + } + } + else + { + /* otherwise reallocate manually */ + newbuffer = (unsigned char*)p->hooks.allocate(newsize); + if (!newbuffer) + { + p->hooks.deallocate(p->buffer); + p->length = 0; + p->buffer = NULL; + + return NULL; + } + if (newbuffer) + { + memcpy(newbuffer, p->buffer, p->offset + 1); + } + p->hooks.deallocate(p->buffer); + } + p->length = newsize; + p->buffer = newbuffer; + + return newbuffer + p->offset; +} + +/* calculate the new length of the string in a printbuffer and update the offset */ +static void update_offset(printbuffer * const buffer) +{ + const unsigned char *buffer_pointer = NULL; + if ((buffer == NULL) || (buffer->buffer == NULL)) + { + return; + } + buffer_pointer = buffer->buffer + buffer->offset; + + buffer->offset += strlen((const char*)buffer_pointer); +} + +/* Render the number nicely from the given item into a string. */ +static cJSON_bool print_number(const cJSON * const item, printbuffer * const output_buffer) +{ + unsigned char *output_pointer = NULL; + double d = item->valuedouble; + int length = 0; + size_t i = 0; + unsigned char number_buffer[26]; /* temporary buffer to print the number into */ + unsigned char decimal_point = get_decimal_point(); + double test; + + if (output_buffer == NULL) + { + return false; + } + + /* This checks for NaN and Infinity */ + if ((d * 0) != 0) + { + length = sprintf((char*)number_buffer, "null"); + } + else + { + /* Try 15 decimal places of precision to avoid nonsignificant nonzero digits */ + length = sprintf((char*)number_buffer, "%1.15g", d); + + /* Check whether the original double can be recovered */ + if ((sscanf((char*)number_buffer, "%lg", &test) != 1) || ((double)test != d)) + { + /* If not, print with 17 decimal places of precision */ + length = sprintf((char*)number_buffer, "%1.17g", d); + } + } + + /* sprintf failed or buffer overrun occured */ + if ((length < 0) || (length > (int)(sizeof(number_buffer) - 1))) + { + return false; + } + + /* reserve appropriate space in the output */ + output_pointer = ensure(output_buffer, (size_t)length); + if (output_pointer == NULL) + { + return false; + } + + /* copy the printed number to the output and replace locale + * dependent decimal point with '.' */ + for (i = 0; i < ((size_t)length); i++) + { + if (number_buffer[i] == decimal_point) + { + output_pointer[i] = '.'; + continue; + } + + output_pointer[i] = number_buffer[i]; + } + output_pointer[i] = '\0'; + + output_buffer->offset += (size_t)length; + + return true; +} + +/* parse 4 digit hexadecimal number */ +static unsigned parse_hex4(const unsigned char * const input) +{ + unsigned int h = 0; + size_t i = 0; + + for (i = 0; i < 4; i++) + { + /* parse digit */ + if ((input[i] >= '0') && (input[i] <= '9')) + { + h += (unsigned int) input[i] - '0'; + } + else if ((input[i] >= 'A') && (input[i] <= 'F')) + { + h += (unsigned int) 10 + input[i] - 'A'; + } + else if ((input[i] >= 'a') && (input[i] <= 'f')) + { + h += (unsigned int) 10 + input[i] - 'a'; + } + else /* invalid */ + { + return 0; + } + + if (i < 3) + { + /* shift left to make place for the next nibble */ + h = h << 4; + } + } + + return h; +} + +/* converts a UTF-16 literal to UTF-8 + * A literal can be one or two sequences of the form \uXXXX */ +static unsigned char utf16_literal_to_utf8(const unsigned char * const input_pointer, const unsigned char * const input_end, unsigned char **output_pointer) +{ + long unsigned int codepoint = 0; + unsigned int first_code = 0; + const unsigned char *first_sequence = input_pointer; + unsigned char utf8_length = 0; + unsigned char utf8_position = 0; + unsigned char sequence_length = 0; + unsigned char first_byte_mark = 0; + + if ((input_end - first_sequence) < 6) + { + /* input ends unexpectedly */ + goto fail; + } + + /* get the first utf16 sequence */ + first_code = parse_hex4(first_sequence + 2); + + /* check that the code is valid */ + if (((first_code >= 0xDC00) && (first_code <= 0xDFFF))) + { + goto fail; + } + + /* UTF16 surrogate pair */ + if ((first_code >= 0xD800) && (first_code <= 0xDBFF)) + { + const unsigned char *second_sequence = first_sequence + 6; + unsigned int second_code = 0; + sequence_length = 12; /* \uXXXX\uXXXX */ + + if ((input_end - second_sequence) < 6) + { + /* input ends unexpectedly */ + goto fail; + } + + if ((second_sequence[0] != '\\') || (second_sequence[1] != 'u')) + { + /* missing second half of the surrogate pair */ + goto fail; + } + + /* get the second utf16 sequence */ + second_code = parse_hex4(second_sequence + 2); + /* check that the code is valid */ + if ((second_code < 0xDC00) || (second_code > 0xDFFF)) + { + /* invalid second half of the surrogate pair */ + goto fail; + } + + + /* calculate the unicode codepoint from the surrogate pair */ + codepoint = 0x10000 + (((first_code & 0x3FF) << 10) | (second_code & 0x3FF)); + } + else + { + sequence_length = 6; /* \uXXXX */ + codepoint = first_code; + } + + /* encode as UTF-8 + * takes at maximum 4 bytes to encode: + * 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ + if (codepoint < 0x80) + { + /* normal ascii, encoding 0xxxxxxx */ + utf8_length = 1; + } + else if (codepoint < 0x800) + { + /* two bytes, encoding 110xxxxx 10xxxxxx */ + utf8_length = 2; + first_byte_mark = 0xC0; /* 11000000 */ + } + else if (codepoint < 0x10000) + { + /* three bytes, encoding 1110xxxx 10xxxxxx 10xxxxxx */ + utf8_length = 3; + first_byte_mark = 0xE0; /* 11100000 */ + } + else if (codepoint <= 0x10FFFF) + { + /* four bytes, encoding 1110xxxx 10xxxxxx 10xxxxxx 10xxxxxx */ + utf8_length = 4; + first_byte_mark = 0xF0; /* 11110000 */ + } + else + { + /* invalid unicode codepoint */ + goto fail; + } + + /* encode as utf8 */ + for (utf8_position = (unsigned char)(utf8_length - 1); utf8_position > 0; utf8_position--) + { + /* 10xxxxxx */ + (*output_pointer)[utf8_position] = (unsigned char)((codepoint | 0x80) & 0xBF); + codepoint >>= 6; + } + /* encode first byte */ + if (utf8_length > 1) + { + (*output_pointer)[0] = (unsigned char)((codepoint | first_byte_mark) & 0xFF); + } + else + { + (*output_pointer)[0] = (unsigned char)(codepoint & 0x7F); + } + + *output_pointer += utf8_length; + + return sequence_length; + +fail: + return 0; +} + +/* Parse the input text into an unescaped cinput, and populate item. */ +static cJSON_bool parse_string(cJSON * const item, parse_buffer * const input_buffer) +{ + const unsigned char *input_pointer = buffer_at_offset(input_buffer) + 1; + const unsigned char *input_end = buffer_at_offset(input_buffer) + 1; + unsigned char *output_pointer = NULL; + unsigned char *output = NULL; + + /* not a string */ + if (buffer_at_offset(input_buffer)[0] != '\"') + { + goto fail; + } + + { + /* calculate approximate size of the output (overestimate) */ + size_t allocation_length = 0; + size_t skipped_bytes = 0; + while (((size_t)(input_end - input_buffer->content) < input_buffer->length) && (*input_end != '\"')) + { + /* is escape sequence */ + if (input_end[0] == '\\') + { + if ((size_t)(input_end + 1 - input_buffer->content) >= input_buffer->length) + { + /* prevent buffer overflow when last input character is a backslash */ + goto fail; + } + skipped_bytes++; + input_end++; + } + input_end++; + } + if (((size_t)(input_end - input_buffer->content) >= input_buffer->length) || (*input_end != '\"')) + { + goto fail; /* string ended unexpectedly */ + } + + /* This is at most how much we need for the output */ + allocation_length = (size_t) (input_end - buffer_at_offset(input_buffer)) - skipped_bytes; + output = (unsigned char*)input_buffer->hooks.allocate(allocation_length + sizeof("")); + if (output == NULL) + { + goto fail; /* allocation failure */ + } + } + + output_pointer = output; + /* loop through the string literal */ + while (input_pointer < input_end) + { + if (*input_pointer != '\\') + { + *output_pointer++ = *input_pointer++; + } + /* escape sequence */ + else + { + unsigned char sequence_length = 2; + if ((input_end - input_pointer) < 1) + { + goto fail; + } + + switch (input_pointer[1]) + { + case 'b': + *output_pointer++ = '\b'; + break; + case 'f': + *output_pointer++ = '\f'; + break; + case 'n': + *output_pointer++ = '\n'; + break; + case 'r': + *output_pointer++ = '\r'; + break; + case 't': + *output_pointer++ = '\t'; + break; + case '\"': + case '\\': + case '/': + *output_pointer++ = input_pointer[1]; + break; + + /* UTF-16 literal */ + case 'u': + sequence_length = utf16_literal_to_utf8(input_pointer, input_end, &output_pointer); + if (sequence_length == 0) + { + /* failed to convert UTF16-literal to UTF-8 */ + goto fail; + } + break; + + default: + goto fail; + } + input_pointer += sequence_length; + } + } + + /* zero terminate the output */ + *output_pointer = '\0'; + + item->type = cJSON_String; + item->valuestring = (char*)output; + + input_buffer->offset = (size_t) (input_end - input_buffer->content); + input_buffer->offset++; + + return true; + +fail: + if (output != NULL) + { + input_buffer->hooks.deallocate(output); + } + + if (input_pointer != NULL) + { + input_buffer->offset = (size_t)(input_pointer - input_buffer->content); + } + + return false; +} + +/* Render the cstring provided to an escaped version that can be printed. */ +static cJSON_bool print_string_ptr(const unsigned char * const input, printbuffer * const output_buffer) +{ + const unsigned char *input_pointer = NULL; + unsigned char *output = NULL; + unsigned char *output_pointer = NULL; + size_t output_length = 0; + /* numbers of additional characters needed for escaping */ + size_t escape_characters = 0; + + if (output_buffer == NULL) + { + return false; + } + + /* empty string */ + if (input == NULL) + { + output = ensure(output_buffer, sizeof("\"\"")); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "\"\""); + + return true; + } + + /* set "flag" to 1 if something needs to be escaped */ + for (input_pointer = input; *input_pointer; input_pointer++) + { + switch (*input_pointer) + { + case '\"': + case '\\': + case '\b': + case '\f': + case '\n': + case '\r': + case '\t': + /* one character escape sequence */ + escape_characters++; + break; + default: + if (*input_pointer < 32) + { + /* UTF-16 escape sequence uXXXX */ + escape_characters += 5; + } + break; + } + } + output_length = (size_t)(input_pointer - input) + escape_characters; + + output = ensure(output_buffer, output_length + sizeof("\"\"")); + if (output == NULL) + { + return false; + } + + /* no characters have to be escaped */ + if (escape_characters == 0) + { + output[0] = '\"'; + memcpy(output + 1, input, output_length); + output[output_length + 1] = '\"'; + output[output_length + 2] = '\0'; + + return true; + } + + output[0] = '\"'; + output_pointer = output + 1; + /* copy the string */ + for (input_pointer = input; *input_pointer != '\0'; (void)input_pointer++, output_pointer++) + { + if ((*input_pointer > 31) && (*input_pointer != '\"') && (*input_pointer != '\\')) + { + /* normal character, copy */ + *output_pointer = *input_pointer; + } + else + { + /* character needs to be escaped */ + *output_pointer++ = '\\'; + switch (*input_pointer) + { + case '\\': + *output_pointer = '\\'; + break; + case '\"': + *output_pointer = '\"'; + break; + case '\b': + *output_pointer = 'b'; + break; + case '\f': + *output_pointer = 'f'; + break; + case '\n': + *output_pointer = 'n'; + break; + case '\r': + *output_pointer = 'r'; + break; + case '\t': + *output_pointer = 't'; + break; + default: + /* escape and print as unicode codepoint */ + sprintf((char*)output_pointer, "u%04x", *input_pointer); + output_pointer += 4; + break; + } + } + } + output[output_length + 1] = '\"'; + output[output_length + 2] = '\0'; + + return true; +} + +/* Invoke print_string_ptr (which is useful) on an item. */ +static cJSON_bool print_string(const cJSON * const item, printbuffer * const p) +{ + return print_string_ptr((unsigned char*)item->valuestring, p); +} + +/* Predeclare these prototypes. */ +static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer); +static cJSON_bool print_value(const cJSON * const item, printbuffer * const output_buffer); +static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer); +static cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer); +static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer); +static cJSON_bool print_object(const cJSON * const item, printbuffer * const output_buffer); + +/* Utility to jump whitespace and cr/lf */ +static parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer) +{ + if ((buffer == NULL) || (buffer->content == NULL)) + { + return NULL; + } + + while (can_access_at_index(buffer, 0) && (buffer_at_offset(buffer)[0] <= 32)) + { + buffer->offset++; + } + + if (buffer->offset == buffer->length) + { + buffer->offset--; + } + + return buffer; +} + +/* Parse an object - create a new root, and populate. */ +CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated) +{ + parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } }; + cJSON *item = NULL; + + /* reset error position */ + global_error.json = NULL; + global_error.position = 0; + + if (value == NULL) + { + goto fail; + } + + buffer.content = (const unsigned char*)value; + buffer.length = strlen((const char*)value) + sizeof(""); + buffer.offset = 0; + buffer.hooks = global_hooks; + + item = cJSON_New_Item(&global_hooks); + if (item == NULL) /* memory fail */ + { + goto fail; + } + + if (!parse_value(item, buffer_skip_whitespace(&buffer))) + { + /* parse failure. ep is set. */ + goto fail; + } + + /* if we require null-terminated JSON without appended garbage, skip and then check for a null terminator */ + if (require_null_terminated) + { + buffer_skip_whitespace(&buffer); + if ((buffer.offset >= buffer.length) || buffer_at_offset(&buffer)[0] != '\0') + { + goto fail; + } + } + if (return_parse_end) + { + *return_parse_end = (const char*)buffer_at_offset(&buffer); + } + + return item; + +fail: + if (item != NULL) + { + cJSON_Delete(item); + } + + if (value != NULL) + { + cJSON_error local_error; + local_error.json = (const unsigned char*)value; + local_error.position = 0; + + if (buffer.offset < buffer.length) + { + local_error.position = buffer.offset; + } + else if (buffer.length > 0) + { + local_error.position = buffer.length - 1; + } + + if (return_parse_end != NULL) + { + *return_parse_end = (const char*)local_error.json + local_error.position; + } + + global_error = local_error; + } + + return NULL; +} + +/* Default options for cJSON_Parse */ +CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value) +{ + return cJSON_ParseWithOpts(value, 0, 0); +} + +#define cjson_min(a, b) ((a < b) ? a : b) + +static unsigned char *print(const cJSON * const item, cJSON_bool format, const internal_hooks * const hooks) +{ + printbuffer buffer[1]; + unsigned char *printed = NULL; + + memset(buffer, 0, sizeof(buffer)); + + /* create buffer */ + buffer->buffer = (unsigned char*) hooks->allocate(256); + buffer->format = format; + buffer->hooks = *hooks; + if (buffer->buffer == NULL) + { + goto fail; + } + + /* print the value */ + if (!print_value(item, buffer)) + { + goto fail; + } + update_offset(buffer); + + /* check if reallocate is available */ + if (hooks->reallocate != NULL) + { + printed = (unsigned char*) hooks->reallocate(buffer->buffer, buffer->length); + buffer->buffer = NULL; + if (printed == NULL) { + goto fail; + } + } + else /* otherwise copy the JSON over to a new buffer */ + { + printed = (unsigned char*) hooks->allocate(buffer->offset + 1); + if (printed == NULL) + { + goto fail; + } + memcpy(printed, buffer->buffer, cjson_min(buffer->length, buffer->offset + 1)); + printed[buffer->offset] = '\0'; /* just to be sure */ + + /* free the buffer */ + hooks->deallocate(buffer->buffer); + } + + return printed; + +fail: + if (buffer->buffer != NULL) + { + hooks->deallocate(buffer->buffer); + } + + if (printed != NULL) + { + hooks->deallocate(printed); + } + + return NULL; +} + +/* Render a cJSON item/entity/structure to text. */ +CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item) +{ + return (char*)print(item, true, &global_hooks); +} + +CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item) +{ + return (char*)print(item, false, &global_hooks); +} + +CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt) +{ + printbuffer p = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; + + if (prebuffer < 0) + { + return NULL; + } + + p.buffer = (unsigned char*)global_hooks.allocate((size_t)prebuffer); + if (!p.buffer) + { + return NULL; + } + + p.length = (size_t)prebuffer; + p.offset = 0; + p.noalloc = false; + p.format = fmt; + p.hooks = global_hooks; + + if (!print_value(item, &p)) + { + global_hooks.deallocate(p.buffer); + return NULL; + } + + return (char*)p.buffer; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buf, const int len, const cJSON_bool fmt) +{ + printbuffer p = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; + + if ((len < 0) || (buf == NULL)) + { + return false; + } + + p.buffer = (unsigned char*)buf; + p.length = (size_t)len; + p.offset = 0; + p.noalloc = true; + p.format = fmt; + p.hooks = global_hooks; + + return print_value(item, &p); +} + +/* Parser core - when encountering text, process appropriately. */ +static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer) +{ + if ((input_buffer == NULL) || (input_buffer->content == NULL)) + { + return false; /* no input */ + } + + /* parse the different types of values */ + /* null */ + if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "null", 4) == 0)) + { + item->type = cJSON_NULL; + input_buffer->offset += 4; + return true; + } + /* false */ + if (can_read(input_buffer, 5) && (strncmp((const char*)buffer_at_offset(input_buffer), "false", 5) == 0)) + { + item->type = cJSON_False; + input_buffer->offset += 5; + return true; + } + /* true */ + if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "true", 4) == 0)) + { + item->type = cJSON_True; + item->valueint = 1; + input_buffer->offset += 4; + return true; + } + /* string */ + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '\"')) + { + return parse_string(item, input_buffer); + } + /* number */ + if (can_access_at_index(input_buffer, 0) && ((buffer_at_offset(input_buffer)[0] == '-') || ((buffer_at_offset(input_buffer)[0] >= '0') && (buffer_at_offset(input_buffer)[0] <= '9')))) + { + return parse_number(item, input_buffer); + } + /* array */ + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '[')) + { + return parse_array(item, input_buffer); + } + /* object */ + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '{')) + { + return parse_object(item, input_buffer); + } + + + return false; +} + +/* Render a value to text. */ +static cJSON_bool print_value(const cJSON * const item, printbuffer * const output_buffer) +{ + unsigned char *output = NULL; + + if ((item == NULL) || (output_buffer == NULL)) + { + return false; + } + + switch ((item->type) & 0xFF) + { + case cJSON_NULL: + output = ensure(output_buffer, 5); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "null"); + return true; + + case cJSON_False: + output = ensure(output_buffer, 6); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "false"); + return true; + + case cJSON_True: + output = ensure(output_buffer, 5); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "true"); + return true; + + case cJSON_Number: + return print_number(item, output_buffer); + + case cJSON_Raw: + { + size_t raw_length = 0; + if (item->valuestring == NULL) + { + if (!output_buffer->noalloc) + { + output_buffer->hooks.deallocate(output_buffer->buffer); + } + return false; + } + + raw_length = strlen(item->valuestring) + sizeof(""); + output = ensure(output_buffer, raw_length); + if (output == NULL) + { + return false; + } + memcpy(output, item->valuestring, raw_length); + return true; + } + + case cJSON_String: + return print_string(item, output_buffer); + + case cJSON_Array: + return print_array(item, output_buffer); + + case cJSON_Object: + return print_object(item, output_buffer); + + default: + return false; + } +} + +/* Build an array from input text. */ +static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer) +{ + cJSON *head = NULL; /* head of the linked list */ + cJSON *current_item = NULL; + + if (input_buffer->depth >= CJSON_NESTING_LIMIT) + { + return false; /* to deeply nested */ + } + input_buffer->depth++; + + if (buffer_at_offset(input_buffer)[0] != '[') + { + /* not an array */ + goto fail; + } + + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ']')) + { + /* empty array */ + goto success; + } + + /* check if we skipped to the end of the buffer */ + if (cannot_access_at_index(input_buffer, 0)) + { + input_buffer->offset--; + goto fail; + } + + /* step back to character in front of the first element */ + input_buffer->offset--; + /* loop through the comma separated array elements */ + do + { + /* allocate next item */ + cJSON *new_item = cJSON_New_Item(&(input_buffer->hooks)); + if (new_item == NULL) + { + goto fail; /* allocation failure */ + } + + /* attach next item to list */ + if (head == NULL) + { + /* start the linked list */ + current_item = head = new_item; + } + else + { + /* add to the end and advance */ + current_item->next = new_item; + new_item->prev = current_item; + current_item = new_item; + } + + /* parse next value */ + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (!parse_value(current_item, input_buffer)) + { + goto fail; /* failed to parse value */ + } + buffer_skip_whitespace(input_buffer); + } + while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ',')); + + if (cannot_access_at_index(input_buffer, 0) || buffer_at_offset(input_buffer)[0] != ']') + { + goto fail; /* expected end of array */ + } + +success: + input_buffer->depth--; + + item->type = cJSON_Array; + item->child = head; + + input_buffer->offset++; + + return true; + +fail: + if (head != NULL) + { + cJSON_Delete(head); + } + + return false; +} + +/* Render an array to text */ +static cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer) +{ + unsigned char *output_pointer = NULL; + size_t length = 0; + cJSON *current_element = item->child; + + if (output_buffer == NULL) + { + return false; + } + + /* Compose the output array. */ + /* opening square bracket */ + output_pointer = ensure(output_buffer, 1); + if (output_pointer == NULL) + { + return false; + } + + *output_pointer = '['; + output_buffer->offset++; + output_buffer->depth++; + + while (current_element != NULL) + { + if (!print_value(current_element, output_buffer)) + { + return false; + } + update_offset(output_buffer); + if (current_element->next) + { + length = (size_t) (output_buffer->format ? 2 : 1); + output_pointer = ensure(output_buffer, length + 1); + if (output_pointer == NULL) + { + return false; + } + *output_pointer++ = ','; + if(output_buffer->format) + { + *output_pointer++ = ' '; + } + *output_pointer = '\0'; + output_buffer->offset += length; + } + current_element = current_element->next; + } + + output_pointer = ensure(output_buffer, 2); + if (output_pointer == NULL) + { + return false; + } + *output_pointer++ = ']'; + *output_pointer = '\0'; + output_buffer->depth--; + + return true; +} + +/* Build an object from the text. */ +static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer) +{ + cJSON *head = NULL; /* linked list head */ + cJSON *current_item = NULL; + + if (input_buffer->depth >= CJSON_NESTING_LIMIT) + { + return false; /* to deeply nested */ + } + input_buffer->depth++; + + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '{')) + { + goto fail; /* not an object */ + } + + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '}')) + { + goto success; /* empty object */ + } + + /* check if we skipped to the end of the buffer */ + if (cannot_access_at_index(input_buffer, 0)) + { + input_buffer->offset--; + goto fail; + } + + /* step back to character in front of the first element */ + input_buffer->offset--; + /* loop through the comma separated array elements */ + do + { + /* allocate next item */ + cJSON *new_item = cJSON_New_Item(&(input_buffer->hooks)); + if (new_item == NULL) + { + goto fail; /* allocation failure */ + } + + /* attach next item to list */ + if (head == NULL) + { + /* start the linked list */ + current_item = head = new_item; + } + else + { + /* add to the end and advance */ + current_item->next = new_item; + new_item->prev = current_item; + current_item = new_item; + } + + /* parse the name of the child */ + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (!parse_string(current_item, input_buffer)) + { + goto fail; /* faile to parse name */ + } + buffer_skip_whitespace(input_buffer); + + /* swap valuestring and string, because we parsed the name */ + current_item->string = current_item->valuestring; + current_item->valuestring = NULL; + + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != ':')) + { + goto fail; /* invalid object */ + } + + /* parse the value */ + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (!parse_value(current_item, input_buffer)) + { + goto fail; /* failed to parse value */ + } + buffer_skip_whitespace(input_buffer); + } + while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ',')); + + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '}')) + { + goto fail; /* expected end of object */ + } + +success: + input_buffer->depth--; + + item->type = cJSON_Object; + item->child = head; + + input_buffer->offset++; + return true; + +fail: + if (head != NULL) + { + cJSON_Delete(head); + } + + return false; +} + +/* Render an object to text. */ +static cJSON_bool print_object(const cJSON * const item, printbuffer * const output_buffer) +{ + unsigned char *output_pointer = NULL; + size_t length = 0; + cJSON *current_item = item->child; + + if (output_buffer == NULL) + { + return false; + } + + /* Compose the output: */ + length = (size_t) (output_buffer->format ? 2 : 1); /* fmt: {\n */ + output_pointer = ensure(output_buffer, length + 1); + if (output_pointer == NULL) + { + return false; + } + + *output_pointer++ = '{'; + output_buffer->depth++; + if (output_buffer->format) + { + *output_pointer++ = '\n'; + } + output_buffer->offset += length; + + while (current_item) + { + if (output_buffer->format) + { + size_t i; + output_pointer = ensure(output_buffer, output_buffer->depth); + if (output_pointer == NULL) + { + return false; + } + for (i = 0; i < output_buffer->depth; i++) + { + *output_pointer++ = '\t'; + } + output_buffer->offset += output_buffer->depth; + } + + /* print key */ + if (!print_string_ptr((unsigned char*)current_item->string, output_buffer)) + { + return false; + } + update_offset(output_buffer); + + length = (size_t) (output_buffer->format ? 2 : 1); + output_pointer = ensure(output_buffer, length); + if (output_pointer == NULL) + { + return false; + } + *output_pointer++ = ':'; + if (output_buffer->format) + { + *output_pointer++ = '\t'; + } + output_buffer->offset += length; + + /* print value */ + if (!print_value(current_item, output_buffer)) + { + return false; + } + update_offset(output_buffer); + + /* print comma if not last */ + length = (size_t) ((output_buffer->format ? 1 : 0) + (current_item->next ? 1 : 0)); + output_pointer = ensure(output_buffer, length + 1); + if (output_pointer == NULL) + { + return false; + } + if (current_item->next) + { + *output_pointer++ = ','; + } + + if (output_buffer->format) + { + *output_pointer++ = '\n'; + } + *output_pointer = '\0'; + output_buffer->offset += length; + + current_item = current_item->next; + } + + output_pointer = ensure(output_buffer, output_buffer->format ? (output_buffer->depth + 1) : 2); + if (output_pointer == NULL) + { + return false; + } + if (output_buffer->format) + { + size_t i; + for (i = 0; i < (output_buffer->depth - 1); i++) + { + *output_pointer++ = '\t'; + } + } + *output_pointer++ = '}'; + *output_pointer = '\0'; + output_buffer->depth--; + + return true; +} + +/* Get Array size/item / object item. */ +CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array) +{ + cJSON *child = NULL; + size_t size = 0; + + if (array == NULL) + { + return 0; + } + + child = array->child; + + while(child != NULL) + { + size++; + child = child->next; + } + + /* FIXME: Can overflow here. Cannot be fixed without breaking the API */ + + return (int)size; +} + +static cJSON* get_array_item(const cJSON *array, size_t index) +{ + cJSON *current_child = NULL; + + if (array == NULL) + { + return NULL; + } + + current_child = array->child; + while ((current_child != NULL) && (index > 0)) + { + index--; + current_child = current_child->next; + } + + return current_child; +} + +CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index) +{ + if (index < 0) + { + return NULL; + } + + return get_array_item(array, (size_t)index); +} + +static cJSON *get_object_item(const cJSON * const object, const char * const name, const cJSON_bool case_sensitive) +{ + cJSON *current_element = NULL; + + if ((object == NULL) || (name == NULL)) + { + return NULL; + } + + current_element = object->child; + if (case_sensitive) + { + while ((current_element != NULL) && (strcmp(name, current_element->string) != 0)) + { + current_element = current_element->next; + } + } + else + { + while ((current_element != NULL) && (case_insensitive_strcmp((const unsigned char*)name, (const unsigned char*)(current_element->string)) != 0)) + { + current_element = current_element->next; + } + } + + return current_element; +} + +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string) +{ + return get_object_item(object, string, false); +} + +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string) +{ + return get_object_item(object, string, true); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string) +{ + return cJSON_GetObjectItem(object, string) ? 1 : 0; +} + +/* Utility for array list handling. */ +static void suffix_object(cJSON *prev, cJSON *item) +{ + prev->next = item; + item->prev = prev; +} + +/* Utility for handling references. */ +static cJSON *create_reference(const cJSON *item, const internal_hooks * const hooks) +{ + cJSON *reference = NULL; + if (item == NULL) + { + return NULL; + } + + reference = cJSON_New_Item(hooks); + if (reference == NULL) + { + return NULL; + } + + memcpy(reference, item, sizeof(cJSON)); + reference->string = NULL; + reference->type |= cJSON_IsReference; + reference->next = reference->prev = NULL; + return reference; +} + +/* Add item to array/object. */ +CJSON_PUBLIC(void) cJSON_AddItemToArray(cJSON *array, cJSON *item) +{ + cJSON *child = NULL; + + if ((item == NULL) || (array == NULL)) + { + return; + } + + child = array->child; + + if (child == NULL) + { + /* list is empty, start new one */ + array->child = item; + } + else + { + /* append to the end */ + while (child->next) + { + child = child->next; + } + suffix_object(child, item); + } +} + +CJSON_PUBLIC(void) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item) +{ + if (item == NULL) + { + return; + } + + /* call cJSON_AddItemToObjectCS for code reuse */ + cJSON_AddItemToObjectCS(object, (char*)cJSON_strdup((const unsigned char*)string, &global_hooks), item); + /* remove cJSON_StringIsConst flag */ + item->type &= ~cJSON_StringIsConst; +} + +#if defined (__clang__) || ((__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))) + #pragma GCC diagnostic push +#endif +#ifdef __GNUC__ +#pragma GCC diagnostic ignored "-Wcast-qual" +#endif + +/* Add an item to an object with constant string as key */ +CJSON_PUBLIC(void) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item) +{ + if ((item == NULL) || (string == NULL)) + { + return; + } + if (!(item->type & cJSON_StringIsConst) && item->string) + { + global_hooks.deallocate(item->string); + } + item->string = (char*)string; + item->type |= cJSON_StringIsConst; + cJSON_AddItemToArray(object, item); +} +#if defined (__clang__) || ((__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))) + #pragma GCC diagnostic pop +#endif + +CJSON_PUBLIC(void) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item) +{ + if (array == NULL) + { + return; + } + + cJSON_AddItemToArray(array, create_reference(item, &global_hooks)); +} + +CJSON_PUBLIC(void) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item) +{ + if ((object == NULL) || (string == NULL)) + { + return; + } + + cJSON_AddItemToObject(object, string, create_reference(item, &global_hooks)); +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item) +{ + if ((parent == NULL) || (item == NULL)) + { + return NULL; + } + + if (item->prev != NULL) + { + /* not the first element */ + item->prev->next = item->next; + } + if (item->next != NULL) + { + /* not the last element */ + item->next->prev = item->prev; + } + + if (item == parent->child) + { + /* first element */ + parent->child = item->next; + } + /* make sure the detached item doesn't point anywhere anymore */ + item->prev = NULL; + item->next = NULL; + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which) +{ + if (which < 0) + { + return NULL; + } + + return cJSON_DetachItemViaPointer(array, get_array_item(array, (size_t)which)); +} + +CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which) +{ + cJSON_Delete(cJSON_DetachItemFromArray(array, which)); +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string) +{ + cJSON *to_detach = cJSON_GetObjectItem(object, string); + + return cJSON_DetachItemViaPointer(object, to_detach); +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string) +{ + cJSON *to_detach = cJSON_GetObjectItemCaseSensitive(object, string); + + return cJSON_DetachItemViaPointer(object, to_detach); +} + +CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string) +{ + cJSON_Delete(cJSON_DetachItemFromObject(object, string)); +} + +CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string) +{ + cJSON_Delete(cJSON_DetachItemFromObjectCaseSensitive(object, string)); +} + +/* Replace array/object items with new ones. */ +CJSON_PUBLIC(void) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem) +{ + cJSON *after_inserted = NULL; + + if (which < 0) + { + return; + } + + after_inserted = get_array_item(array, (size_t)which); + if (after_inserted == NULL) + { + cJSON_AddItemToArray(array, newitem); + return; + } + + newitem->next = after_inserted; + newitem->prev = after_inserted->prev; + after_inserted->prev = newitem; + if (after_inserted == array->child) + { + array->child = newitem; + } + else + { + newitem->prev->next = newitem; + } +} -long stripquotes(char *str) +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement) { - long len,offset; - if ( str == 0 ) - return(0); - len = strlen(str); - if ( str[0] == '"' && str[len-1] == '"' ) - str[len-1] = 0, offset = 1; - else offset = 0; - return(offset); -} + if ((parent == NULL) || (replacement == NULL) || (item == NULL)) + { + return false; + } -const char *cJSON_GetErrorPtr(void) {return ep;} + if (replacement == item) + { + return true; + } -static int32_t cJSON_strcasecmp(const char *s1,const char *s2) -{ - if (!s1) return (s1==s2)?0:1;if (!s2) return 1; - for(; tolower((int32_t)(*s1)) == tolower((int32_t)(*s2)); ++s1, ++s2) if(*s1 == 0) return 0; - return tolower((int32_t)(*(const unsigned char *)s1)) - tolower((int32_t)(*(const unsigned char *)s2)); -} + replacement->next = item->next; + replacement->prev = item->prev; -static void *(*cJSON_malloc)(size_t sz) = malloc; -static void (*cJSON_free)(void *ptr) = free; + if (replacement->next != NULL) + { + replacement->next->prev = replacement; + } + if (replacement->prev != NULL) + { + replacement->prev->next = replacement; + } + if (parent->child == item) + { + parent->child = replacement; + } -static char* cJSON_strdup(const char* str) -{ - size_t len; - char* copy; - - len = strlen(str) + 1; - if (!(copy = (char*)cJSON_malloc(len+1))) return 0; - memcpy(copy,str,len); - return copy; + item->next = NULL; + item->prev = NULL; + cJSON_Delete(item); + + return true; } -void cJSON_InitHooks(cJSON_Hooks* hooks) +CJSON_PUBLIC(void) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem) { - if (!hooks) { /* Reset hooks */ - cJSON_malloc = malloc; - cJSON_free = free; + if (which < 0) + { return; } - - cJSON_malloc = (hooks->malloc_fn)?hooks->malloc_fn:malloc; - cJSON_free = (hooks->free_fn)?hooks->free_fn:free; -} -/* Internal constructor. */ -static cJSON *cJSON_New_Item(void) -{ - cJSON* node = (cJSON*)cJSON_malloc(sizeof(cJSON)); - if (node) memset(node,0,sizeof(cJSON)); - return node; + cJSON_ReplaceItemViaPointer(array, get_array_item(array, (size_t)which), newitem); } -/* Delete a cJSON structure. */ -void cJSON_Delete(cJSON *c) +static cJSON_bool replace_item_in_object(cJSON *object, const char *string, cJSON *replacement, cJSON_bool case_sensitive) { - cJSON *next; - while (c) - { - next=c->next; - if (!(c->type&cJSON_IsReference) && c->child) cJSON_Delete(c->child); - if (!(c->type&cJSON_IsReference) && c->valuestring) cJSON_free(c->valuestring); - if (c->string) cJSON_free(c->string); - cJSON_free(c); - c=next; - } -} - -/* Parse the input text to generate a number, and populate the result into item. */ -static const char *parse_number(cJSON *item,const char *num) -{ - double n=0,sign=1,scale=0;int32_t subscale=0,signsubscale=1; - - if (*num=='-') sign=-1,num++; /* Has sign? */ - if (*num=='0') num++; /* is zero */ - if (*num>='1' && *num<='9') do n=(n*10.0)+(*num++ -'0'); while (*num>='0' && *num<='9'); /* Number? */ - if (*num=='.' && num[1]>='0' && num[1]<='9') {num++; do n=(n*10.0)+(*num++ -'0'),scale--; while (*num>='0' && *num<='9');} /* Fractional part? */ - if (*num=='e' || *num=='E') /* Exponent? */ - { num++;if (*num=='+') num++; else if (*num=='-') signsubscale=-1,num++; /* With sign? */ - while (*num>='0' && *num<='9') subscale=(subscale*10)+(*num++ - '0'); /* Number? */ - } - - n=sign*n*pow(10.0,(scale+subscale*signsubscale)); /* number = +/- number.fraction * 10^+/- exponent */ - - item->valuedouble=n; - item->valueint=(int64_t)n; - item->type=cJSON_Number; - return num; -} - -/* Render the number nicely from the given item into a string. */ -static char *print_number(cJSON *item) -{ - char *str; - double d = item->valuedouble; - if ( fabs(((double)item->valueint) - d) <= DBL_EPSILON && d >= (1. - DBL_EPSILON) && d < (1LL << 62) )//d <= INT_MAX && d >= INT_MIN ) - { - str = (char *)cJSON_malloc(24); /* 2^64+1 can be represented in 21 chars + sign. */ - if ( str != 0 ) - sprintf(str,"%lld",(long long)item->valueint); - } - else - { - str = (char *)cJSON_malloc(66); /* This is a nice tradeoff. */ - if ( str != 0 ) - { - if ( fabs(floor(d) - d) <= DBL_EPSILON && fabs(d) < 1.0e60 ) - sprintf(str,"%.0f",d); - //else if (fabs(d)<1.0e-6 || fabs(d)>1.0e9) sprintf(str,"%e",d); - else - sprintf(str,"%.8f",d); - } - } - return str; -} - -static unsigned parse_hex4(const char *str) -{ - unsigned h=0; - if (*str>='0' && *str<='9') h+=(*str)-'0'; else if (*str>='A' && *str<='F') h+=10+(*str)-'A'; else if (*str>='a' && *str<='f') h+=10+(*str)-'a'; else return 0; - h=h<<4;str++; - if (*str>='0' && *str<='9') h+=(*str)-'0'; else if (*str>='A' && *str<='F') h+=10+(*str)-'A'; else if (*str>='a' && *str<='f') h+=10+(*str)-'a'; else return 0; - h=h<<4;str++; - if (*str>='0' && *str<='9') h+=(*str)-'0'; else if (*str>='A' && *str<='F') h+=10+(*str)-'A'; else if (*str>='a' && *str<='f') h+=10+(*str)-'a'; else return 0; - h=h<<4;str++; - if (*str>='0' && *str<='9') h+=(*str)-'0'; else if (*str>='A' && *str<='F') h+=10+(*str)-'A'; else if (*str>='a' && *str<='f') h+=10+(*str)-'a'; else return 0; - return h; -} - -/* Parse the input text into an unescaped cstring, and populate item. */ -static const unsigned char firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; -static const char *parse_string(cJSON *item,const char *str) -{ - const char *ptr=str+1;char *ptr2;char *out;int32_t len=0;unsigned uc,uc2; - if (*str!='\"') {ep=str;return 0;} /* not a string! */ - - while (*ptr!='\"' && *ptr && ++len) if (*ptr++ == '\\') ptr++; // Skip escaped quotes - - out=(char*)cJSON_malloc(len+2); /* This is how long we need for the string, roughly. */ - if (!out) return 0; - - ptr=str+1;ptr2=out; - while (*ptr!='\"' && *ptr) - { - if (*ptr!='\\') - { - if ( *ptr == '%' && is_hexstr((char *)&ptr[1],2) && isprint(_decode_hex((char *)&ptr[1])) != 0 ) - *ptr2++ = _decode_hex((char *)&ptr[1]), ptr += 3; - else *ptr2++ = *ptr++; - } - else - { - ptr++; - switch (*ptr) - { - case 'b': *ptr2++='\b'; break; - case 'f': *ptr2++='\f'; break; - case 'n': *ptr2++='\n'; break; - case 'r': *ptr2++='\r'; break; - case 't': *ptr2++='\t'; break; - case 'u': // transcode utf16 to utf8 - uc=parse_hex4(ptr+1);ptr+=4; // get the unicode char - - if ((uc>=0xDC00 && uc<=0xDFFF) || uc==0) break; // check for invalid - - if (uc>=0xD800 && uc<=0xDBFF) // UTF16 surrogate pairs - { - if (ptr[1]!='\\' || ptr[2]!='u') break; // missing second-half of surrogate. - uc2=parse_hex4(ptr+3);ptr+=6; - if (uc2<0xDC00 || uc2>0xDFFF) break; // invalid second-half of surrogate - uc=0x10000 + (((uc&0x3FF)<<10) | (uc2&0x3FF)); - } - - len=4;if (uc<0x80) len=1;else if (uc<0x800) len=2;else if (uc<0x10000) len=3; ptr2+=len; - - switch (len) { - case 4: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6; - case 3: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6; - case 2: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6; - case 1: *--ptr2 =(uc | firstByteMark[len]); - } - ptr2+=len; - break; - default: *ptr2++=*ptr; break; - } - ptr++; - } - } - *ptr2=0; - if (*ptr=='\"') ptr++; - item->valuestring=out; - item->type=cJSON_String; - return ptr; -} - -/* Render the cstring provided to an escaped version that can be printed. */ -static char *print_string_ptr(const char *str) -{ - const char *ptr;char *ptr2,*out;int32_t len=0;unsigned char token; - - if (!str) return cJSON_strdup(""); - ptr=str;while ((token=*ptr) && ++len) {if (strchr("\"\\\b\f\n\r\t",token)) len++; else if (token<32) len+=5;ptr++;} - - out=(char*)cJSON_malloc(len+3+1); - if (!out) return 0; - - ptr2=out;ptr=str; - *ptr2++='\"'; - while (*ptr) - { - if ((unsigned char)*ptr>31 && *ptr!='\"' && *ptr!='\\') *ptr2++=*ptr++; - else - { - *ptr2++='\\'; - switch (token=*ptr++) - { - case '\\': *ptr2++='\\'; break; - case '\"': *ptr2++='\"'; break; - case '\b': *ptr2++='b'; break; - case '\f': *ptr2++='f'; break; - case '\n': *ptr2++='n'; break; - case '\r': *ptr2++='r'; break; - case '\t': *ptr2++='t'; break; - default: sprintf(ptr2,"u%04x",token);ptr2+=5; break; /* escape and print */ - } - } - } - *ptr2++='\"';*ptr2++=0; - return out; -} -/* Invote print_string_ptr (which is useful) on an item. */ -static char *print_string(cJSON *item) {return print_string_ptr(item->valuestring);} + if ((replacement == NULL) || (string == NULL)) + { + return false; + } -/* Predeclare these prototypes. */ -static const char *parse_value(cJSON *item,const char *value); -static char *print_value(cJSON *item,int32_t depth,int32_t fmt); -static const char *parse_array(cJSON *item,const char *value); -static char *print_array(cJSON *item,int32_t depth,int32_t fmt); -static const char *parse_object(cJSON *item,const char *value); -static char *print_object(cJSON *item,int32_t depth,int32_t fmt); + /* replace the name in the replacement */ + if (!(replacement->type & cJSON_StringIsConst) && (replacement->string != NULL)) + { + cJSON_free(replacement->string); + } + replacement->string = (char*)cJSON_strdup((const unsigned char*)string, &global_hooks); + replacement->type &= ~cJSON_StringIsConst; -/* Utility to jump whitespace and cr/lf */ -static const char *skip(const char *in) {while (in && *in && (unsigned char)*in<=32) in++; return in;} + cJSON_ReplaceItemViaPointer(object, get_object_item(object, string, case_sensitive), replacement); -/* Parse an object - create a new root, and populate. */ -cJSON *cJSON_ParseWithOpts(const char *value,const char **return_parse_end,int32_t require_null_terminated) -{ - const char *end=0; - cJSON *c=cJSON_New_Item(); - ep=0; - if (!c) return 0; /* memory fail */ - - end=parse_value(c,skip(value)); - if (!end) {cJSON_Delete(c);return 0;} /* parse failure. ep is set. */ - - /* if we require null-terminated JSON without appended garbage, skip and then check for a null terminator */ - if (require_null_terminated) {end=skip(end);if (*end) {cJSON_Delete(c);ep=end;return 0;}} - if (return_parse_end) *return_parse_end=end; - return c; -} -/* Default options for cJSON_Parse */ -cJSON *cJSON_Parse(const char *value) -{ - return(cJSON_ParseWithOpts(value,0,0)); + return true; } -/* Render a cJSON item/entity/structure to text. */ -char *cJSON_Print(cJSON *item) +CJSON_PUBLIC(void) cJSON_ReplaceItemInObject(cJSON *object, const char *string, cJSON *newitem) { - return(print_value(item,0,1)); + replace_item_in_object(object, string, newitem, false); } -char *cJSON_PrintUnformatted(cJSON *item) {return print_value(item,0,0);} -/* Parser core - when encountering text, process appropriately. */ -static const char *parse_value(cJSON *item,const char *value) +CJSON_PUBLIC(void) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object, const char *string, cJSON *newitem) { - if (!value) return 0; /* Fail on null. */ - if (!strncmp(value,"null",4)) { item->type=cJSON_NULL; return value+4; } - if (!strncmp(value,"false",5)) { item->type=cJSON_False; return value+5; } - if (!strncmp(value,"true",4)) { item->type=cJSON_True; item->valueint=1; return value+4; } - if (*value=='\"') { return parse_string(item,value); } - if (*value=='-' || (*value>='0' && *value<='9')) { return parse_number(item,value); } - if (*value=='[') { return parse_array(item,value); } - if (*value=='{') { return parse_object(item,value); } - - ep=value;return 0; /* failure. */ + replace_item_in_object(object, string, newitem, true); } -/* Render a value to text. */ -static char *print_value(cJSON *item,int32_t depth,int32_t fmt) -{ - char *out=0; - if (!item) return 0; - switch ((item->type)&255) - { - case cJSON_NULL: out=cJSON_strdup("null"); break; - case cJSON_False: out=cJSON_strdup("false");break; - case cJSON_True: out=cJSON_strdup("true"); break; - case cJSON_Number: out=print_number(item);break; - case cJSON_String: out=print_string(item);break; - case cJSON_Array: out=print_array(item,depth,fmt);break; - case cJSON_Object: out=print_object(item,depth,fmt);break; - } - return out; -} +/* Create basic types: */ +CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_NULL; + } -/* Build an array from input text. */ -static const char *parse_array(cJSON *item,const char *value) -{ - cJSON *child; - if (*value!='[') {ep=value;return 0;} /* not an array! */ - - item->type=cJSON_Array; - value=skip(value+1); - if (*value==']') return value+1; /* empty array. */ - - item->child=child=cJSON_New_Item(); - if (!item->child) return 0; /* memory fail */ - value=skip(parse_value(child,skip(value))); /* skip any spacing, get the value. */ - if (!value) return 0; - - while (*value==',') - { - cJSON *new_item; - if (!(new_item=cJSON_New_Item())) return 0; /* memory fail */ - child->next=new_item;new_item->prev=child;child=new_item; - value=skip(parse_value(child,skip(value+1))); - if (!value) return 0; /* memory fail */ - } - - if (*value==']') return value+1; /* end of array */ - ep=value;return 0; /* malformed. */ + return item; } -/* Render an array to text */ -static char *print_array(cJSON *item,int32_t depth,int32_t fmt) -{ - char **entries; - char *out=0,*ptr,*ret;int32_t len=5; - cJSON *child=item->child; - int32_t numentries=0,i=0,fail=0; - - /* How many entries in the array? */ - while (child) numentries++,child=child->next; - /* Explicitly handle numentries==0 */ - if (!numentries) - { - out=(char*)cJSON_malloc(3+1); - if (out) strcpy(out,"[]"); - return out; - } - /* Allocate an array to hold the values for each */ - entries=(char**)cJSON_malloc((1+numentries)*sizeof(char*)); - if (!entries) return 0; - memset(entries,0,numentries*sizeof(char*)); - /* Retrieve all the results: */ - child=item->child; - while (child && !fail) - { - ret=print_value(child,depth+1,fmt); - entries[i++]=ret; - if (ret) len+=strlen(ret)+2+(fmt?1:0); else fail=1; - child=child->next; - } - - /* If we didn't fail, try to malloc the output string */ - if (!fail) out=(char*)cJSON_malloc(len+1); - /* If that fails, we fail. */ - if (!out) fail=1; - - /* Handle failure. */ - if (fail) - { - for (i=0;itype = cJSON_True; + } -/* Build an object from the text. */ -static const char *parse_object(cJSON *item,const char *value) -{ - cJSON *child; - if (*value!='{') {ep=value;return 0;} /* not an object! */ - - item->type=cJSON_Object; - value=skip(value+1); - if (*value=='}') return value+1; /* empty array. */ - - item->child=child=cJSON_New_Item(); - if (!item->child) return 0; - value=skip(parse_string(child,skip(value))); - if (!value) return 0; - child->string=child->valuestring;child->valuestring=0; - if (*value!=':') {ep=value;return 0;} /* fail! */ - value=skip(parse_value(child,skip(value+1))); /* skip any spacing, get the value. */ - if (!value) return 0; - - while (*value==',') - { - cJSON *new_item; - if (!(new_item=cJSON_New_Item())) return 0; /* memory fail */ - child->next=new_item;new_item->prev=child;child=new_item; - value=skip(parse_string(child,skip(value+1))); - if (!value) return 0; - child->string=child->valuestring;child->valuestring=0; - if (*value!=':') {ep=value;return 0;} /* fail! */ - value=skip(parse_value(child,skip(value+1))); /* skip any spacing, get the value. */ - if (!value) return 0; - } - - if (*value=='}') return value+1; /* end of array */ - ep=value;return 0; /* malformed. */ + return item; } -/* Render an object to text. */ -static char *print_object(cJSON *item,int32_t depth,int32_t fmt) +CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void) { - char **entries=0,**names=0; - char *out=0,*ptr,*ret,*str;int32_t len=7,i=0,j; - cJSON *child=item->child,*firstchild; - int32_t numentries=0,fail=0; - // Count the number of entries - firstchild = child; - while ( child ) + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) { - numentries++; - child = child->next; - if ( child == firstchild ) - { - printf("cJSON infinite loop detected\n"); - break; - } + item->type = cJSON_False; } - /* Explicitly handle empty object case */ - if (!numentries) - { - out=(char*)cJSON_malloc(fmt?depth+4+1:3+1); - if (!out) return 0; - ptr=out;*ptr++='{'; - if (fmt) {*ptr++='\n';for (i=0;ichild;depth++;if (fmt) len+=depth; - while ( child ) - { - names[i]=str=print_string_ptr(child->string); - entries[i++]=ret=print_value(child,depth,fmt); - if (str && ret) len+=strlen(ret)+strlen(str)+2+(fmt?2+depth:0); else fail=1; - child=child->next; - if ( child == firstchild ) - break; - } - - /* Try to allocate the output string */ - if (!fail) out=(char*)cJSON_malloc(len+1); - if (!out) fail=1; - - /* Handle failure */ - if (fail) - { - for (i=0;ichild;int32_t i=0;while(c)i++,c=c->next;return i;} -cJSON *cJSON_GetArrayItem(cJSON *array,int32_t item) {cJSON *c=array->child; while (c && item>0) item--,c=c->next; return c;} -cJSON *cJSON_GetObjectItem(cJSON *object,const char *string) {cJSON *c=object->child; while (c && cJSON_strcasecmp(c->string,string)) c=c->next; return c;} - -/* Utility for array list handling. */ -static void suffix_object(cJSON *prev,cJSON *item) {prev->next=item;item->prev=prev;} -/* Utility for handling references. */ -static cJSON *create_reference(cJSON *item) {cJSON *ref=cJSON_New_Item();if (!ref) return 0;memcpy(ref,item,sizeof(cJSON));ref->string=0;ref->type|=cJSON_IsReference;ref->next=ref->prev=0;return ref;} -/* Add item to array/object. */ -void cJSON_AddItemToArray(cJSON *array, cJSON *item) {cJSON *c=array->child;if (!item) return; if (!c) {array->child=item;} else {while (c && c->next) c=c->next; suffix_object(c,item);}} -void cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item) {if (!item) return; if (item->string) cJSON_free(item->string);item->string=cJSON_strdup(string);cJSON_AddItemToArray(object,item);} -void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item) {cJSON_AddItemToArray(array,create_reference(item));} -void cJSON_AddItemReferenceToObject(cJSON *object,const char *string,cJSON *item) {cJSON_AddItemToObject(object,string,create_reference(item));} - -cJSON *cJSON_DetachItemFromArray(cJSON *array,int32_t which) {cJSON *c=array->child;while (c && which>0) c=c->next,which--;if (!c) return 0; - if (c->prev) c->prev->next=c->next;if (c->next) c->next->prev=c->prev;if (c==array->child) array->child=c->next;c->prev=c->next=0;return c;} -void cJSON_DeleteItemFromArray(cJSON *array,int32_t which) {cJSON_Delete(cJSON_DetachItemFromArray(array,which));} -cJSON *cJSON_DetachItemFromObject(cJSON *object,const char *string) {int32_t i=0;cJSON *c=object->child;while (c && cJSON_strcasecmp(c->string,string)) i++,c=c->next;if (c) return cJSON_DetachItemFromArray(object,i);return 0;} -void cJSON_DeleteItemFromObject(cJSON *object,const char *string) {cJSON_Delete(cJSON_DetachItemFromObject(object,string));} + return item; +} -/* Replace array/object items with new ones. */ -void cJSON_ReplaceItemInArray(cJSON *array,int32_t which,cJSON *newitem) {cJSON *c=array->child;while (c && which>0) c=c->next,which--;if (!c) return; - newitem->next=c->next;newitem->prev=c->prev;if (newitem->next) newitem->next->prev=newitem; - if (c==array->child) array->child=newitem; else newitem->prev->next=newitem;c->next=c->prev=0;cJSON_Delete(c);} -void cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem){int32_t i=0;cJSON *c=object->child;while(c && cJSON_strcasecmp(c->string,string))i++,c=c->next;if(c){newitem->string=cJSON_strdup(string);cJSON_ReplaceItemInArray(object,i,newitem);}} +CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool b) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = b ? cJSON_True : cJSON_False; + } -/* Create basic types: */ -cJSON *cJSON_CreateNull(void) {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_NULL;return item;} -cJSON *cJSON_CreateTrue(void) {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_True;return item;} -cJSON *cJSON_CreateFalse(void) {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_False;return item;} -cJSON *cJSON_CreateBool(int32_t b) {cJSON *item=cJSON_New_Item();if(item)item->type=b?cJSON_True:cJSON_False;return item;} -cJSON *cJSON_CreateNumber(double num) {cJSON *item=cJSON_New_Item();if(item){item->type=cJSON_Number;item->valuedouble=num;item->valueint=(int64_t)num;}return item;} -cJSON *cJSON_CreateString(const char *string) {cJSON *item=cJSON_New_Item();if(item){item->type=cJSON_String;item->valuestring=cJSON_strdup(string);}return item;} -cJSON *cJSON_CreateArray(void) {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_Array;return item;} -cJSON *cJSON_CreateObject(void) {cJSON *item=cJSON_New_Item();if(item)item->type=cJSON_Object;return item;} + return item; +} -/* Create Arrays: */ -cJSON *cJSON_CreateIntArray(int64_t *numbers,int32_t count) {int32_t i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && ichild=n;else suffix_object(p,n);p=n;}return a;} -cJSON *cJSON_CreateFloatArray(float *numbers,int32_t count) {int32_t i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && ichild=n;else suffix_object(p,n);p=n;}return a;} -cJSON *cJSON_CreateDoubleArray(double *numbers,int32_t count) {int32_t i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && ichild=n;else suffix_object(p,n);p=n;}return a;} -cJSON *cJSON_CreateStringArray(char **strings,int32_t count) {int32_t i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;a && ichild=n;else suffix_object(p,n);p=n;}return a;} +CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_Number; + item->valuedouble = num; -/* Duplication */ -cJSON *cJSON_Duplicate(cJSON *item,int32_t recurse) -{ - cJSON *newitem,*cptr,*nptr=0,*newchild; - /* Bail on bad ptr */ - if (!item) return 0; - /* Create new item */ - newitem=cJSON_New_Item(); - if (!newitem) return 0; - /* Copy over all vars */ - newitem->type=item->type&(~cJSON_IsReference),newitem->valueint=item->valueint,newitem->valuedouble=item->valuedouble; - if (item->valuestring) {newitem->valuestring=cJSON_strdup(item->valuestring); if (!newitem->valuestring) {cJSON_Delete(newitem);return 0;}} - if (item->string) {newitem->string=cJSON_strdup(item->string); if (!newitem->string) {cJSON_Delete(newitem);return 0;}} - /* If non-recursive, then we're done! */ - if (!recurse) return newitem; - /* Walk the ->next chain for the child. */ - cptr=item->child; - while (cptr) - { - newchild=cJSON_Duplicate(cptr,1); /* Duplicate (with recurse) each item in the ->next chain */ - if (!newchild) {cJSON_Delete(newitem);return 0;} - if (nptr) {nptr->next=newchild,newchild->prev=nptr;nptr=newchild;} /* If newitem->child already set, then crosswire ->prev and ->next and move on */ - else {newitem->child=newchild;nptr=newchild;} /* Set newitem->child and move to it */ - cptr=cptr->next; - } - return newitem; -} - -void cJSON_Minify(char *json) -{ - char *into=json; - while (*json) - { - if (*json==' ') json++; - else if (*json=='\t') json++; // Whitespace characters. - else if (*json=='\r') json++; - else if (*json=='\n') json++; - else if (*json=='/' && json[1]=='/') while (*json && *json!='\n') json++; // double-slash comments, to end of line. - else if (*json=='/' && json[1]=='*') {while (*json && !(*json=='*' && json[1]=='/')) json++;json+=2;} // multiline comments. - else if (*json=='\"'){*into++=*json++;while (*json && *json!='\"'){if (*json=='\\') *into++=*json++;*into++=*json++;}*into++=*json++;} // string literals, which are \" sensitive. - else *into++=*json++; // All other characters. - } - *into=0; // and null-terminate. -} - -// the following written by jl777 -/****************************************************************************** - * Copyright © 2014-2017 The SuperNET Developers. * - * * - * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * - * the top-level directory of this distribution for the individual copyright * - * holder information and the developer policies on copyright and licensing. * - * * - * Unless otherwise agreed in a custom licensing agreement, no part of the * - * SuperNET software, including this file may be copied, modified, propagated * - * or distributed except according to the terms contained in the LICENSE file * - * * - * Removal or modification of this copyright notice is prohibited. * - * * - ******************************************************************************/ - -void copy_cJSON(struct destbuf *dest,cJSON *obj) -{ - char *str; - int i; - long offset; - dest->buf[0] = 0; - if ( obj != 0 ) - { - str = cJSON_Print(obj); - if ( str != 0 ) - { - offset = stripquotes(str); - //strcpy(dest,str+offset); - for (i=0; ibuf[i]= str[offset+i]) == 0 ) - break; - dest->buf[i] = 0; - free(str); + /* use saturation in case of overflow */ + if (num >= INT_MAX) + { + item->valueint = INT_MAX; + } + else if (num <= INT_MIN) + { + item->valueint = INT_MIN; + } + else + { + item->valueint = (int)num; } } -} -void copy_cJSON2(char *dest,int32_t maxlen,cJSON *obj) -{ - struct destbuf tmp; - maxlen--; - dest[0] = 0; - if ( maxlen > sizeof(tmp.buf) ) - maxlen = sizeof(tmp.buf); - copy_cJSON(&tmp,obj); - if ( strlen(tmp.buf) < maxlen ) - strcpy(dest,tmp.buf); - else dest[0] = 0; + return item; } -int64_t _get_cJSON_int(cJSON *json) +CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string) { - struct destbuf tmp; - if ( json != 0 ) + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) { - copy_cJSON(&tmp,json); - if ( tmp.buf[0] != 0 ) - return(calc_nxt64bits(tmp.buf)); + item->type = cJSON_String; + item->valuestring = (char*)cJSON_strdup((const unsigned char*)string, &global_hooks); + if(!item->valuestring) + { + cJSON_Delete(item); + return NULL; + } } - return(0); + + return item; } -int64_t get_cJSON_int(cJSON *json,char *field) +CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw) { - cJSON *numjson; - if ( json != 0 ) + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) { - numjson = cJSON_GetObjectItem(json,field); - if ( numjson != 0 ) - return(_get_cJSON_int(numjson)); + item->type = cJSON_Raw; + item->valuestring = (char*)cJSON_strdup((const unsigned char*)raw, &global_hooks); + if(!item->valuestring) + { + cJSON_Delete(item); + return NULL; + } } - return(0); -} -int64_t conv_floatstr(char *numstr) -{ - double val,corr; - val = atof(numstr); - corr = (val < 0.) ? -0.50000000001 : 0.50000000001; - return((int64_t)(val * SATOSHIDEN + corr)); + return item; } -int64_t _conv_cJSON_float(cJSON *json) +CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void) { - int64_t conv_floatstr(char *); - struct destbuf tmp; - if ( json != 0 ) + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) { - copy_cJSON(&tmp,json); - return(conv_floatstr(tmp.buf)); + item->type=cJSON_Array; } - return(0); -} -int64_t conv_cJSON_float(cJSON *json,char *field) -{ - if ( json != 0 ) - return(_conv_cJSON_float(cJSON_GetObjectItem(json,field))); - return(0); + return item; } -int32_t extract_cJSON_str(char *dest,int32_t max,cJSON *json,char *field) +CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void) { - int32_t safecopy(char *dest,char *src,long len); - char *str; - cJSON *obj; - int32_t len; - long offset; - dest[0] = 0; - obj = cJSON_GetObjectItem(json,field); - if ( obj != 0 ) + cJSON *item = cJSON_New_Item(&global_hooks); + if (item) { - str = cJSON_Print(obj); - offset = stripquotes(str); - len = safecopy(dest,str+offset,max); - free(str); - return(len); + item->type = cJSON_Object; } - return(0); + + return item; } -cJSON *gen_list_json(char **list) +/* Create Arrays: */ +CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count) { - cJSON *array,*item; - array = cJSON_CreateArray(); - while ( list != 0 && *list != 0 && *list[0] != 0 ) + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (numbers == NULL)) { - item = cJSON_CreateString(*list++); - cJSON_AddItemToArray(array,item); + return NULL; } - return(array); -} -uint64_t get_API_nxt64bits(cJSON *obj) -{ - uint64_t nxt64bits = 0; - struct destbuf tmp; - if ( obj != 0 ) + a = cJSON_CreateArray(); + for(i = 0; a && (i < (size_t)count); i++) { - if ( is_cJSON_Number(obj) != 0 ) - return((uint64_t)obj->valuedouble); - copy_cJSON(&tmp,obj); - nxt64bits = calc_nxt64bits(tmp.buf); + n = cJSON_CreateNumber(numbers[i]); + if (!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; } - return(nxt64bits); + + return a; } -uint64_t j64bits(cJSON *json,char *field) { if ( field == 0 ) return(get_API_nxt64bits(json)); return(get_API_nxt64bits(cJSON_GetObjectItem(json,field))); } -uint64_t j64bitsi(cJSON *json,int32_t i) { return(get_API_nxt64bits(cJSON_GetArrayItem(json,i))); } -uint64_t get_satoshi_obj(cJSON *json,char *field) +CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count) { - int32_t i,n; - uint64_t prev,satoshis,mult = 1; - struct destbuf numstr,checkstr; - cJSON *numjson; - numjson = cJSON_GetObjectItem(json,field); - copy_cJSON(&numstr,numjson); - satoshis = prev = 0; mult = 1; n = (int32_t)strlen(numstr.buf); - for (i=n-1; i>=0; i--,mult*=10) + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (numbers == NULL)) { - satoshis += (mult * (numstr.buf[i] - '0')); - if ( satoshis < prev ) - printf("get_satoshi_obj numstr.(%s) i.%d prev.%llu vs satoshis.%llu\n",numstr.buf,i,(unsigned long long)prev,(unsigned long long)satoshis); - prev = satoshis; + return NULL; } - sprintf(checkstr.buf,"%llu",(long long)satoshis); - if ( strcmp(checkstr.buf,numstr.buf) != 0 ) + + a = cJSON_CreateArray(); + + for(i = 0; a && (i < (size_t)count); i++) { - printf("SATOSHI GREMLIN?? numstr.(%s) -> %.8f -> (%s)\n",numstr.buf,dstr(satoshis),checkstr.buf); + n = cJSON_CreateNumber((double)numbers[i]); + if(!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; } - return(satoshis); -} -void add_satoshis_json(cJSON *json,char *field,uint64_t satoshis) -{ - cJSON *obj; - char numstr[64]; - sprintf(numstr,"%lld",(long long)satoshis); - obj = cJSON_CreateString(numstr); - cJSON_AddItemToObject(json,field,obj); - if ( satoshis != get_satoshi_obj(json,field) ) - printf("error adding satoshi obj %ld -> %ld\n",(unsigned long)satoshis,(unsigned long)get_satoshi_obj(json,field)); + return a; } -char *cJSON_str(cJSON *json) +CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count) { - if ( json != 0 && is_cJSON_String(json) != 0 ) - return(json->valuestring); - return(0); -} + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; -void jadd(cJSON *json,char *field,cJSON *item) { if ( json != 0 )cJSON_AddItemToObject(json,field,item); } -void jaddstr(cJSON *json,char *field,char *str) { if ( json != 0 && str != 0 ) cJSON_AddItemToObject(json,field,cJSON_CreateString(str)); } -void jaddnum(cJSON *json,char *field,double num) { if ( json != 0 )cJSON_AddItemToObject(json,field,cJSON_CreateNumber(num)); } -void jadd64bits(cJSON *json,char *field,uint64_t nxt64bits) { char numstr[64]; sprintf(numstr,"%llu",(long long)nxt64bits), jaddstr(json,field,numstr); } -void jaddi(cJSON *json,cJSON *item) { if ( json != 0 ) cJSON_AddItemToArray(json,item); } -void jaddistr(cJSON *json,char *str) { if ( json != 0 ) cJSON_AddItemToArray(json,cJSON_CreateString(str)); } -void jaddinum(cJSON *json,double num) { if ( json != 0 ) cJSON_AddItemToArray(json,cJSON_CreateNumber(num)); } -void jaddi64bits(cJSON *json,uint64_t nxt64bits) { char numstr[64]; sprintf(numstr,"%llu",(long long)nxt64bits), jaddistr(json,numstr); } -char *jstr(cJSON *json,char *field) { if ( json == 0 ) return(0); if ( field == 0 ) return(cJSON_str(json)); return(cJSON_str(cJSON_GetObjectItem(json,field))); } - -char *jstri(cJSON *json,int32_t i) { return(cJSON_str(cJSON_GetArrayItem(json,i))); } -char *jprint(cJSON *json,int32_t freeflag) -{ - char *str; - /*static portable_mutex_t mutex; static int32_t initflag; - if ( initflag == 0 ) + if ((count < 0) || (numbers == NULL)) { - portable_mutex_init(&mutex); - initflag = 1; - }*/ - if ( json == 0 ) - return(clonestr((char *)"{}")); - //portable_mutex_lock(&mutex); - //usleep(5000); - str = cJSON_Print(json), _stripwhite(str,' '); - if ( freeflag != 0 ) - free_json(json); - //portable_mutex_unlock(&mutex); - return(str); -} + return NULL; + } -bits256 get_API_bits256(cJSON *obj) -{ - bits256 hash; char *str; - memset(hash.bytes,0,sizeof(hash)); - if ( obj != 0 ) + a = cJSON_CreateArray(); + + for(i = 0;a && (i < (size_t)count); i++) { - if ( is_cJSON_String(obj) != 0 && (str= obj->valuestring) != 0 && strlen(str) == 64 ) - decode_hex(hash.bytes,sizeof(hash),str); + n = cJSON_CreateNumber(numbers[i]); + if(!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; } - return(hash); + + return a; } -bits256 jbits256(cJSON *json,char *field) { if ( field == 0 ) return(get_API_bits256(json)); return(get_API_bits256(cJSON_GetObjectItem(json,field))); } -bits256 jbits256i(cJSON *json,int32_t i) { return(get_API_bits256(cJSON_GetArrayItem(json,i))); } -void jaddbits256(cJSON *json,char *field,bits256 hash) { char str[65]; bits256_str(str,hash), jaddstr(json,field,str); } -void jaddibits256(cJSON *json,bits256 hash) { char str[65]; bits256_str(str,hash), jaddistr(json,str); } -char *get_cJSON_fieldname(cJSON *obj) +CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char **strings, int count) { - if ( obj != 0 ) + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (strings == NULL)) { - if ( obj->child != 0 && obj->child->string != 0 ) - return(obj->child->string); - else if ( obj->string != 0 ) - return(obj->string); + return NULL; } - return((char *)""); -} -int32_t jnum(cJSON *obj,char *field) -{ - char *str; int32_t polarity = 1; - if ( field != 0 ) - obj = jobj(obj,field); - if ( obj != 0 ) + a = cJSON_CreateArray(); + + for (i = 0; a && (i < (size_t)count); i++) { - if ( is_cJSON_Number(obj) != 0 ) - return(obj->valuedouble); - else if ( is_cJSON_String(obj) != 0 && (str= jstr(obj,0)) != 0 ) + n = cJSON_CreateString(strings[i]); + if(!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else { - if ( str[0] == '-' ) - polarity = -1, str++; - return(polarity * (int32_t)calc_nxt64bits(str)); + suffix_object(p,n); } + p = n; } - return(0); -} -void ensure_jsonitem(cJSON *json,char *field,char *value) -{ - cJSON *obj = cJSON_GetObjectItem(json,field); - if ( obj == 0 ) - cJSON_AddItemToObject(json,field,cJSON_CreateString(value)); - else cJSON_ReplaceItemInObject(json,field,cJSON_CreateString(value)); + return a; } -int32_t in_jsonarray(cJSON *array,char *value) +/* Duplication */ +CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse) { - int32_t i,n; - struct destbuf remote; - if ( array != 0 && is_cJSON_Array(array) != 0 ) + cJSON *newitem = NULL; + cJSON *child = NULL; + cJSON *next = NULL; + cJSON *newchild = NULL; + + /* Bail on bad ptr */ + if (!item) + { + goto fail; + } + /* Create new item */ + newitem = cJSON_New_Item(&global_hooks); + if (!newitem) + { + goto fail; + } + /* Copy over all vars */ + newitem->type = item->type & (~cJSON_IsReference); + newitem->valueint = item->valueint; + newitem->valuedouble = item->valuedouble; + if (item->valuestring) { - n = cJSON_GetArraySize(array); - for (i=0; ivaluestring = (char*)cJSON_strdup((unsigned char*)item->valuestring, &global_hooks); + if (!newitem->valuestring) { - if ( array == 0 || n == 0 ) - break; - copy_cJSON(&remote,cJSON_GetArrayItem(array,i)); - if ( strcmp(remote.buf,value) == 0 ) - return(1); + goto fail; } } - return(0); -} + if (item->string) + { + newitem->string = (item->type&cJSON_StringIsConst) ? item->string : (char*)cJSON_strdup((unsigned char*)item->string, &global_hooks); + if (!newitem->string) + { + goto fail; + } + } + /* If non-recursive, then we're done! */ + if (!recurse) + { + return newitem; + } + /* Walk the ->next chain for the child. */ + child = item->child; + while (child != NULL) + { + newchild = cJSON_Duplicate(child, true); /* Duplicate (with recurse) each item in the ->next chain */ + if (!newchild) + { + goto fail; + } + if (next != NULL) + { + /* If newitem->child already set, then crosswire ->prev and ->next and move on */ + next->next = newchild; + newchild->prev = next; + next = newchild; + } + else + { + /* Set newitem->child and move to it */ + newitem->child = newchild; + next = newchild; + } + child = child->next; + } -int32_t myatoi(char *str,int32_t range) -{ - long x; char *ptr; - x = strtol(str,&ptr,10); - if ( range != 0 && x >= range ) - x = (range - 1); - return((int32_t)x); -} + return newitem; -int32_t get_API_int(cJSON *obj,int32_t val) -{ - struct destbuf buf; - if ( obj != 0 ) +fail: + if (newitem != NULL) { - if ( is_cJSON_Number(obj) != 0 ) - return((int32_t)obj->valuedouble); - copy_cJSON(&buf,obj); - val = myatoi(buf.buf,0); - if ( val < 0 ) - val = 0; + cJSON_Delete(newitem); } - return(val); + + return NULL; } -int32_t jint(cJSON *json,char *field) { if ( json == 0 ) return(0); if ( field == 0 ) return(get_API_int(json,0)); return(get_API_int(cJSON_GetObjectItem(json,field),0)); } -int32_t jinti(cJSON *json,int32_t i) { if ( json == 0 ) return(0); return(get_API_int(cJSON_GetArrayItem(json,i),0)); } -uint32_t get_API_uint(cJSON *obj,uint32_t val) +CJSON_PUBLIC(void) cJSON_Minify(char *json) { - struct destbuf buf; - if ( obj != 0 ) + unsigned char *into = (unsigned char*)json; + + if (json == NULL) + { + return; + } + + while (*json) { - if ( is_cJSON_Number(obj) != 0 ) - return((uint32_t)obj->valuedouble); - copy_cJSON(&buf,obj); - val = myatoi(buf.buf,0); + if (*json == ' ') + { + json++; + } + else if (*json == '\t') + { + /* Whitespace characters. */ + json++; + } + else if (*json == '\r') + { + json++; + } + else if (*json=='\n') + { + json++; + } + else if ((*json == '/') && (json[1] == '/')) + { + /* double-slash comments, to end of line. */ + while (*json && (*json != '\n')) + { + json++; + } + } + else if ((*json == '/') && (json[1] == '*')) + { + /* multiline comments. */ + while (*json && !((*json == '*') && (json[1] == '/'))) + { + json++; + } + json += 2; + } + else if (*json == '\"') + { + /* string literals, which are \" sensitive. */ + *into++ = (unsigned char)*json++; + while (*json && (*json != '\"')) + { + if (*json == '\\') + { + *into++ = (unsigned char)*json++; + } + *into++ = (unsigned char)*json++; + } + *into++ = (unsigned char)*json++; + } + else + { + /* All other characters. */ + *into++ = (unsigned char)*json++; + } } - return(val); + + /* and null-terminate. */ + *into = '\0'; } -uint32_t juint(cJSON *json,char *field) { if ( json == 0 ) return(0); if ( field == 0 ) return(get_API_uint(json,0)); return(get_API_uint(cJSON_GetObjectItem(json,field),0)); } -uint32_t juinti(cJSON *json,int32_t i) { if ( json == 0 ) return(0); return(get_API_uint(cJSON_GetArrayItem(json,i),0)); } -double get_API_float(cJSON *obj) +CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item) { - double val = 0.; - struct destbuf buf; - if ( obj != 0 ) + if (item == NULL) { - if ( is_cJSON_Number(obj) != 0 ) - return(obj->valuedouble); - copy_cJSON(&buf,obj); - val = atof(buf.buf); + return false; } - return(val); + + return (item->type & 0xFF) == cJSON_Invalid; } -double jdouble(cJSON *json,char *field) +CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item) { - if ( json != 0 ) + if (item == NULL) { - if ( field == 0 ) - return(get_API_float(json)); - else return(get_API_float(cJSON_GetObjectItem(json,field))); - } else return(0.); + return false; + } + + return (item->type & 0xFF) == cJSON_False; } -double jdoublei(cJSON *json,int32_t i) +CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item) { - if ( json != 0 ) - return(get_API_float(cJSON_GetArrayItem(json,i))); - else return(0.); + if (item == NULL) + { + return false; + } + + return (item->type & 0xff) == cJSON_True; } -cJSON *jobj(cJSON *json,char *field) { if ( json != 0 ) return(cJSON_GetObjectItem(json,field)); return(0); } -void jdelete(cJSON *json,char *field) +CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item) { - if ( jobj(json,field) != 0 ) - cJSON_DeleteItemFromObject(json,field); + if (item == NULL) + { + return false; + } + + return (item->type & (cJSON_True | cJSON_False)) != 0; } +CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } -cJSON *jduplicate(cJSON *json) { return(cJSON_Duplicate(json,1)); } + return (item->type & 0xFF) == cJSON_NULL; +} -cJSON *jitem(cJSON *array,int32_t i) { if ( array != 0 && is_cJSON_Array(array) != 0 && cJSON_GetArraySize(array) > i ) return(cJSON_GetArrayItem(array,i)); return(0); } -cJSON *jarray(int32_t *nump,cJSON *json,char *field) +CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item) { - cJSON *array; - if ( json != 0 ) + if (item == NULL) { - if ( field == 0 ) - array = json; - else array = cJSON_GetObjectItem(json,field); - if ( array != 0 && is_cJSON_Array(array) != 0 && (*nump= cJSON_GetArraySize(array)) > 0 ) - return(array); + return false; } - *nump = 0; - return(0); + + return (item->type & 0xFF) == cJSON_Number; } -int32_t expand_nxt64bits(char *NXTaddr,uint64_t nxt64bits) +CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item) { - int32_t i,n; - uint64_t modval; - char rev[64]; - for (i=0; nxt64bits!=0; i++) + if (item == NULL) { - modval = nxt64bits % 10; - rev[i] = (char)(modval + '0'); - nxt64bits /= 10; + return false; } - n = i; - for (i=0; itype & 0xFF) == cJSON_String; } -char *nxt64str(uint64_t nxt64bits) +CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item) { - static char NXTaddr[64]; - expand_nxt64bits(NXTaddr,nxt64bits); - return(NXTaddr); + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Array; } -char *nxt64str2(uint64_t nxt64bits) +CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item) { - static char NXTaddr[64]; - expand_nxt64bits(NXTaddr,nxt64bits); - return(NXTaddr); + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Object; } -int32_t cmp_nxt64bits(const char *str,uint64_t nxt64bits) +CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item) { - char expanded[64]; - if ( str == 0 )//|| str[0] == 0 || nxt64bits == 0 ) - return(-1); - if ( nxt64bits == 0 && str[0] == 0 ) - return(0); - expand_nxt64bits(expanded,nxt64bits); - return(strcmp(str,expanded)); + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Raw; } -uint64_t calc_nxt64bits(const char *NXTaddr) +CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive) { - int32_t c; - int64_t n,i,polarity = 1; - uint64_t lastval,mult,nxt64bits = 0; - if ( NXTaddr == 0 ) + if ((a == NULL) || (b == NULL) || ((a->type & 0xFF) != (b->type & 0xFF)) || cJSON_IsInvalid(a)) { - printf("calling calc_nxt64bits with null ptr!\n"); - return(0); + return false; } - n = strlen(NXTaddr); - if ( n >= 22 ) + + /* check if type is valid */ + switch (a->type & 0xFF) { - printf("calc_nxt64bits: illegal NXTaddr.(%s) too long\n",NXTaddr); - return(0); + case cJSON_False: + case cJSON_True: + case cJSON_NULL: + case cJSON_Number: + case cJSON_String: + case cJSON_Raw: + case cJSON_Array: + case cJSON_Object: + break; + + default: + return false; } - else if ( strcmp(NXTaddr,"0") == 0 || strcmp(NXTaddr,"false") == 0 ) + + /* identical objects are equal */ + if (a == b) { - // printf("zero address?\n"); getchar(); - return(0); + return true; } - if ( NXTaddr[0] == '-' ) - polarity = -1, NXTaddr++, n--; - mult = 1; - lastval = 0; - for (i=n-1; i>=0; i--,mult*=10) + + switch (a->type & 0xFF) { - c = NXTaddr[i]; - if ( c < '0' || c > '9' ) + /* in these cases and equal type is enough */ + case cJSON_False: + case cJSON_True: + case cJSON_NULL: + return true; + + case cJSON_Number: + if (a->valuedouble == b->valuedouble) + { + return true; + } + return false; + + case cJSON_String: + case cJSON_Raw: + if ((a->valuestring == NULL) || (b->valuestring == NULL)) + { + return false; + } + if (strcmp(a->valuestring, b->valuestring) == 0) + { + return true; + } + + return false; + + case cJSON_Array: + { + cJSON *a_element = a->child; + cJSON *b_element = b->child; + + for (; (a_element != NULL) && (b_element != NULL);) + { + if (!cJSON_Compare(a_element, b_element, case_sensitive)) + { + return false; + } + + a_element = a_element->next; + b_element = b_element->next; + } + + /* one of the arrays is longer than the other */ + if (a_element != b_element) { + return false; + } + + return true; + } + + case cJSON_Object: { - printf("calc_nxt64bits: illegal char.(%c %d) in (%s).%d\n",c,c,NXTaddr,(int32_t)i); -#ifdef __APPLE__ - //while ( 1 ) + cJSON *a_element = NULL; + cJSON *b_element = NULL; + cJSON_ArrayForEach(a_element, a) { - //sleep(60); - printf("calc_nxt64bits: illegal char.(%c %d) in (%s).%d\n",c,c,NXTaddr,(int32_t)i); + /* TODO This has O(n^2) runtime, which is horrible! */ + b_element = get_object_item(b, a_element->string, case_sensitive); + if (b_element == NULL) + { + return false; + } + + if (!cJSON_Compare(a_element, b_element, case_sensitive)) + { + return false; + } } -#endif - return(0); + + /* doing this twice, once on a and b to prevent true comparison if a subset of b + * TODO: Do this the proper way, this is just a fix for now */ + cJSON_ArrayForEach(b_element, b) + { + a_element = get_object_item(a, b_element->string, case_sensitive); + if (a_element == NULL) + { + return false; + } + + if (!cJSON_Compare(b_element, a_element, case_sensitive)) + { + return false; + } + } + + return true; } - nxt64bits += mult * (c - '0'); - if ( nxt64bits < lastval ) - printf("calc_nxt64bits: warning: 64bit overflow %llx < %llx\n",(long long)nxt64bits,(long long)lastval); - lastval = nxt64bits; + + default: + return false; } - while ( *NXTaddr == '0' && *NXTaddr != 0 ) - NXTaddr++; - if ( cmp_nxt64bits(NXTaddr,nxt64bits) != 0 ) - printf("error calculating nxt64bits: %s -> %llx -> %s\n",NXTaddr,(long long)nxt64bits,nxt64str(nxt64bits)); - if ( polarity < 0 ) - return(-(int64_t)nxt64bits); - return(nxt64bits); } -cJSON *addrs_jsonarray(uint64_t *addrs,int32_t num) +CJSON_PUBLIC(void *) cJSON_malloc(size_t size) { - int32_t j; cJSON *array; - array = cJSON_CreateArray(); - for (j=0; j -#include -#include -#include -#include -#include -#include -#include "komodo_structs.h" + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. -//#include "../crypto777/OS_portable.h" + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ -#define MAX_JSON_FIELD 4096 // on the big side +#ifndef cJSON__h +#define cJSON__h #ifdef __cplusplus extern "C" { #endif - - /* cJSON Types: */ -#define cJSON_False 0 -#define cJSON_True 1 -#define cJSON_NULL 2 -#define cJSON_Number 3 -#define cJSON_String 4 -#define cJSON_Array 5 -#define cJSON_Object 6 - -#define is_cJSON_Null(json) ((json) != 0 && ((json)->type & 0xff) == cJSON_NULL) -#define is_cJSON_Array(json) ((json) != 0 && ((json)->type & 0xff) == cJSON_Array) -#define is_cJSON_String(json) ((json) != 0 && ((json)->type & 0xff) == cJSON_String) -#define is_cJSON_Number(json) ((json) != 0 && ((json)->type & 0xff) == cJSON_Number) -#define is_cJSON_Object(json) ((json) != 0 && ((json)->type & 0xff) == cJSON_Object) -#define is_cJSON_True(json) ((json) != 0 && ((json)->type & 0xff) == cJSON_True) -#define is_cJSON_False(json) ((json) != 0 && ((json)->type & 0xff) == cJSON_False) - + +/* project version */ +#define CJSON_VERSION_MAJOR 1 +#define CJSON_VERSION_MINOR 5 +#define CJSON_VERSION_PATCH 9 + +#include + +/* cJSON Types: */ +#define cJSON_Invalid (0) +#define cJSON_False (1 << 0) +#define cJSON_True (1 << 1) +#define cJSON_NULL (1 << 2) +#define cJSON_Number (1 << 3) +#define cJSON_String (1 << 4) +#define cJSON_Array (1 << 5) +#define cJSON_Object (1 << 6) +#define cJSON_Raw (1 << 7) /* raw json */ + #define cJSON_IsReference 256 - - /* The cJSON structure: */ - typedef struct cJSON { - struct cJSON *next,*prev; /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */ - struct cJSON *child; /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */ - - int32_t type; /* The type of the item, as above. */ - - char *valuestring; /* The item's string, if type==cJSON_String */ - int64_t valueint; /* The item's number, if type==cJSON_Number */ - double valuedouble; /* The item's number, if type==cJSON_Number */ - - char *string; /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */ - } cJSON; - - typedef struct cJSON_Hooks { - void *(*malloc_fn)(size_t sz); - void (*free_fn)(void *ptr); - } cJSON_Hooks; - - /* Supply malloc, realloc and free functions to cJSON */ - extern void cJSON_InitHooks(cJSON_Hooks* hooks); - - - /* Supply a block of JSON, and this returns a cJSON object you can interrogate. Call cJSON_Delete when finished. */ - extern cJSON *cJSON_Parse(const char *value); - /* Render a cJSON entity to text for transfer/storage. Free the char* when finished. */ - extern char *cJSON_Print(cJSON *item); - /* Render a cJSON entity to text for transfer/storage without any formatting. Free the char* when finished. */ - extern char *cJSON_PrintUnformatted(cJSON *item); - /* Delete a cJSON entity and all subentities. */ - extern void cJSON_Delete(cJSON *c); - - /* Returns the number of items in an array (or object). */ - extern int cJSON_GetArraySize(cJSON *array); - /* Retrieve item number "item" from array "array". Returns NULL if unsuccessful. */ - extern cJSON *cJSON_GetArrayItem(cJSON *array,int32_t item); - /* Get item "string" from object. Case insensitive. */ - extern cJSON *cJSON_GetObjectItem(cJSON *object,const char *string); - - /* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */ - extern const char *cJSON_GetErrorPtr(void); - - /* These calls create a cJSON item of the appropriate type. */ - extern cJSON *cJSON_CreateNull(void); - extern cJSON *cJSON_CreateTrue(void); - extern cJSON *cJSON_CreateFalse(void); - extern cJSON *cJSON_CreateBool(int32_t b); - extern cJSON *cJSON_CreateNumber(double num); - extern cJSON *cJSON_CreateString(const char *string); - extern cJSON *cJSON_CreateArray(void); - extern cJSON *cJSON_CreateObject(void); - - /* These utilities create an Array of count items. */ - extern cJSON *cJSON_CreateIntArray(int64_t *numbers,int32_t count); - extern cJSON *cJSON_CreateFloatArray(float *numbers,int32_t count); - extern cJSON *cJSON_CreateDoubleArray(double *numbers,int32_t count); - extern cJSON *cJSON_CreateStringArray(char **strings,int32_t count); - - /* Append item to the specified array/object. */ - extern void cJSON_AddItemToArray(cJSON *array, cJSON *item); - extern void cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item); - /* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */ - extern void cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item); - extern void cJSON_AddItemReferenceToObject(cJSON *object,const char *string,cJSON *item); - - /* Remove/Detatch items from Arrays/Objects. */ - extern cJSON *cJSON_DetachItemFromArray(cJSON *array,int32_t which); - extern void cJSON_DeleteItemFromArray(cJSON *array,int32_t which); - extern cJSON *cJSON_DetachItemFromObject(cJSON *object,const char *string); - extern void cJSON_DeleteItemFromObject(cJSON *object,const char *string); - - /* Update array items. */ - extern void cJSON_ReplaceItemInArray(cJSON *array,int32_t which,cJSON *newitem); - extern void cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem); - - /* Duplicate a cJSON item */ - extern cJSON *cJSON_Duplicate(cJSON *item,int32_t recurse); - /* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will - need to be released. With recurse!=0, it will duplicate any children connected to the item. - The item->next and ->prev pointers are always zero on return from Duplicate. */ - - /* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */ - extern cJSON *cJSON_ParseWithOpts(const char *value,const char **return_parse_end,int32_t require_null_terminated); - - extern void cJSON_Minify(char *json); - - /* Macros for creating things quickly. */ -#define cJSON_AddNullToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateNull()) -#define cJSON_AddTrueToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateTrue()) -#define cJSON_AddFalseToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateFalse()) -#define cJSON_AddBoolToObject(object,name,b) cJSON_AddItemToObject(object, name, cJSON_CreateBool(b)) -#define cJSON_AddNumberToObject(object,name,n) cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n)) -#define cJSON_AddStringToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateString(s)) - - struct destbuf { char buf[MAX_JSON_FIELD]; }; - - /* When assigning an integer value, it needs to be propagated to valuedouble too. */ -#define cJSON_SetIntValue(object,val) ((object)?(object)->valueint=(object)->valuedouble=(val):(val)) -#define jfieldstr get_cJSON_fieldname - - char *cJSON_str(cJSON *json); - char *jstr(cJSON *json,char *field); - char *jprint(cJSON *json,int32_t freeflag); - int32_t jint(cJSON *json,char *field); - uint32_t juint(cJSON *json,char *field); - char *jstri(cJSON *json,int32_t i); - int32_t jinti(cJSON *json,int32_t i); - uint32_t juinti(cJSON *json,int32_t i); - uint64_t j64bitsi(cJSON *json,int32_t i); - double jdoublei(cJSON *json,int32_t i); - double jdouble(cJSON *json,char *field); - cJSON *jobj(cJSON *json,char *field); - cJSON *jarray(int32_t *nump,cJSON *json,char *field); - cJSON *jitem(cJSON *array,int32_t i); - uint64_t j64bits(cJSON *json,char *field); - void jadd(cJSON *json,char *field,cJSON *item); - void jaddstr(cJSON *json,char *field,char *str); - void jaddnum(cJSON *json,char *field,double num); - void jadd64bits(cJSON *json,char *field,uint64_t nxt64bits); - void jaddi(cJSON *json,cJSON *item); - void jaddistr(cJSON *json,char *str); - void jaddinum(cJSON *json,double num); - void jaddi64bits(cJSON *json,uint64_t nxt64bits); - void jdelete(cJSON *object,char *string); - cJSON *jduplicate(cJSON *json); - int32_t jnum(cJSON *obj,char *field); - - bits256 jbits256(cJSON *json,char *field); - bits256 jbits256i(cJSON *json,int32_t i); - void jaddbits256(cJSON *json,char *field,bits256 hash); - void jaddibits256(cJSON *json,bits256 hash); - void copy_cJSON(struct destbuf *dest,cJSON *obj); - void copy_cJSON2(char *dest,int32_t maxlen,cJSON *obj); - cJSON *gen_list_json(char **list); - int32_t extract_cJSON_str(char *dest,int32_t max,cJSON *json,char *field); - - void free_json(cJSON *json); - int64_t _conv_cJSON_float(cJSON *json); - int64_t conv_cJSON_float(cJSON *json,char *field); - int64_t get_cJSON_int(cJSON *json,char *field); - void add_satoshis_json(cJSON *json,char *field,uint64_t satoshis); - uint64_t get_satoshi_obj(cJSON *json,char *field); - - int32_t get_API_int(cJSON *obj,int32_t val); - uint32_t get_API_uint(cJSON *obj,uint32_t val); - uint64_t get_API_nxt64bits(cJSON *obj); - double get_API_float(cJSON *obj); - char *get_cJSON_fieldname(cJSON *obj); - void ensure_jsonitem(cJSON *json,char *field,char *value); - int32_t in_jsonarray(cJSON *array,char *value); - char *bitcoind_RPC(char **retstrp,char *debugstr,char *url,char *userpass,char *command,char *params); - uint64_t calc_nxt64bits(const char *str); - int32_t expand_nxt64bits(char *str,uint64_t nxt64bits); - char *nxt64str(uint64_t nxt64bits); - char *nxt64str2(uint64_t nxt64bits); - cJSON *addrs_jsonarray(uint64_t *addrs,int32_t num); - int32_t myatoi(char *str,int32_t range); - - char *stringifyM(char *str); -#define replace_backslashquotes unstringify - char *unstringify(char *str); -#define jtrue cJSON_CreateTrue -#define jfalse cJSON_CreateFalse - -#define jfieldname get_cJSON_fieldname +#define cJSON_StringIsConst 512 + +/* The cJSON structure: */ +typedef struct cJSON +{ + /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */ + struct cJSON *next; + struct cJSON *prev; + /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */ + struct cJSON *child; + + /* The type of the item, as above. */ + int type; + + /* The item's string, if type==cJSON_String and type == cJSON_Raw */ + char *valuestring; + /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */ + int valueint; + /* The item's number, if type==cJSON_Number */ + double valuedouble; + + /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */ + char *string; +} cJSON; + +typedef struct cJSON_Hooks +{ + void *(*malloc_fn)(size_t sz); + void (*free_fn)(void *ptr); +} cJSON_Hooks; + +typedef int cJSON_bool; + +#if !defined(__WINDOWS__) && (defined(WIN32) || defined(WIN64) || defined(_MSC_VER) || defined(_WIN32)) +#define __WINDOWS__ +#endif +#ifdef __WINDOWS__ + +/* When compiling for windows, we specify a specific calling convention to avoid issues where we are being called from a project with a different default calling convention. For windows you have 2 define options: + +CJSON_HIDE_SYMBOLS - Define this in the case where you don't want to ever dllexport symbols +CJSON_EXPORT_SYMBOLS - Define this on library build when you want to dllexport symbols (default) +CJSON_IMPORT_SYMBOLS - Define this if you want to dllimport symbol + +For *nix builds that support visibility attribute, you can define similar behavior by + +setting default visibility to hidden by adding +-fvisibility=hidden (for gcc) +or +-xldscope=hidden (for sun cc) +to CFLAGS + +then using the CJSON_API_VISIBILITY flag to "export" the same symbols the way CJSON_EXPORT_SYMBOLS does + +*/ + +/* export symbols by default, this is necessary for copy pasting the C and header file */ +#if !defined(CJSON_HIDE_SYMBOLS) && !defined(CJSON_IMPORT_SYMBOLS) && !defined(CJSON_EXPORT_SYMBOLS) +#define CJSON_EXPORT_SYMBOLS +#endif + +#if defined(CJSON_HIDE_SYMBOLS) +#define CJSON_PUBLIC(type) type __stdcall +#elif defined(CJSON_EXPORT_SYMBOLS) +#define CJSON_PUBLIC(type) __declspec(dllexport) type __stdcall +#elif defined(CJSON_IMPORT_SYMBOLS) +#define CJSON_PUBLIC(type) __declspec(dllimport) type __stdcall +#endif +#else /* !WIN32 */ +#if (defined(__GNUC__) || defined(__SUNPRO_CC) || defined (__SUNPRO_C)) && defined(CJSON_API_VISIBILITY) +#define CJSON_PUBLIC(type) __attribute__((visibility("default"))) type +#else +#define CJSON_PUBLIC(type) type +#endif +#endif + +/* Limits how deeply nested arrays/objects can be before cJSON rejects to parse them. + * This is to prevent stack overflows. */ +#ifndef CJSON_NESTING_LIMIT +#define CJSON_NESTING_LIMIT 1000 +#endif + +/* returns the version of cJSON as a string */ +CJSON_PUBLIC(const char*) cJSON_Version(void); + +/* Supply malloc, realloc and free functions to cJSON */ +CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks); + +/* Memory Management: the caller is always responsible to free the results from all variants of cJSON_Parse (with cJSON_Delete) and cJSON_Print (with stdlib free, cJSON_Hooks.free_fn, or cJSON_free as appropriate). The exception is cJSON_PrintPreallocated, where the caller has full responsibility of the buffer. */ +/* Supply a block of JSON, and this returns a cJSON object you can interrogate. */ +CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value); +/* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */ +/* If you supply a ptr in return_parse_end and parsing fails, then return_parse_end will contain a pointer to the error so will match cJSON_GetErrorPtr(). */ +CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated); + +/* Render a cJSON entity to text for transfer/storage. */ +CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item); +/* Render a cJSON entity to text for transfer/storage without any formatting. */ +CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item); +/* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess at the final size. guessing well reduces reallocation. fmt=0 gives unformatted, =1 gives formatted */ +CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt); +/* Render a cJSON entity to text using a buffer already allocated in memory with given length. Returns 1 on success and 0 on failure. */ +/* NOTE: cJSON is not always 100% accurate in estimating how much memory it will use, so to be safe allocate 5 bytes more than you actually need */ +CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format); +/* Delete a cJSON entity and all subentities. */ +CJSON_PUBLIC(void) cJSON_Delete(cJSON *c); + +/* Returns the number of items in an array (or object). */ +CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array); +/* Retrieve item number "item" from array "array". Returns NULL if unsuccessful. */ +CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index); +/* Get item "string" from object. Case insensitive. */ +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string); +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string); +CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string); +/* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */ +CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void); + +/* These functions check the type of an item */ +CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item); + +/* These calls create a cJSON item of the appropriate type. */ +CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool boolean); +CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num); +CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string); +/* raw json */ +CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw); +CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void); + +/* These utilities create an Array of count items. */ +CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count); +CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count); +CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count); +CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char **strings, int count); + +/* Append item to the specified array/object. */ +CJSON_PUBLIC(void) cJSON_AddItemToArray(cJSON *array, cJSON *item); +CJSON_PUBLIC(void) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item); +/* Use this when string is definitely const (i.e. a literal, or as good as), and will definitely survive the cJSON object. + * WARNING: When this function was used, make sure to always check that (item->type & cJSON_StringIsConst) is zero before + * writing to `item->string` */ +CJSON_PUBLIC(void) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item); +/* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */ +CJSON_PUBLIC(void) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item); +CJSON_PUBLIC(void) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item); + +/* Remove/Detatch items from Arrays/Objects. */ +CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item); +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which); +CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which); +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string); +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string); +CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string); +CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string); + +/* Update array items. */ +CJSON_PUBLIC(void) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem); /* Shifts pre-existing items to the right. */ +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement); +CJSON_PUBLIC(void) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem); +CJSON_PUBLIC(void) cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem); +CJSON_PUBLIC(void) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object,const char *string,cJSON *newitem); + +/* Duplicate a cJSON item */ +CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse); +/* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will +need to be released. With recurse!=0, it will duplicate any children connected to the item. +The item->next and ->prev pointers are always zero on return from Duplicate. */ +/* Recursively compare two cJSON items for equality. If either a or b is NULL or invalid, they will be considered unequal. + * case_sensitive determines if object keys are treated case sensitive (1) or case insensitive (0) */ +CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive); + + +CJSON_PUBLIC(void) cJSON_Minify(char *json); + +/* Macros for creating things quickly. */ +#define cJSON_AddNullToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateNull()) +#define cJSON_AddTrueToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateTrue()) +#define cJSON_AddFalseToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateFalse()) +#define cJSON_AddBoolToObject(object,name,b) cJSON_AddItemToObject(object, name, cJSON_CreateBool(b)) +#define cJSON_AddNumberToObject(object,name,n) cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n)) +#define cJSON_AddStringToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateString(s)) +#define cJSON_AddRawToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateRaw(s)) + +/* When assigning an integer value, it needs to be propagated to valuedouble too. */ +#define cJSON_SetIntValue(object, number) ((object) ? (object)->valueint = (object)->valuedouble = (number) : (number)) +/* helper for the cJSON_SetNumberValue macro */ +CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number); +#define cJSON_SetNumberValue(object, number) ((object != NULL) ? cJSON_SetNumberHelper(object, (double)number) : (number)) + +/* Macro for iterating over an array or object */ +#define cJSON_ArrayForEach(element, array) for(element = (array != NULL) ? (array)->child : NULL; element != NULL; element = element->next) + +/* malloc/free objects using the malloc/free functions that have been set with cJSON_InitHooks */ +CJSON_PUBLIC(void *) cJSON_malloc(size_t size); +CJSON_PUBLIC(void) cJSON_free(void *object); #ifdef __cplusplus } diff --git a/src/komodo.h b/src/komodo.h index e1e40448d1b..010f1b3b653 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -42,7 +42,7 @@ void komodo_connectblock(CBlockIndex *pindex,CBlock& block); #include "komodo_utils.h" #include "komodo_curve25519.h" -#include "cJSON.c" +#include "komodo_cJSON.c" #include "komodo_bitcoind.h" #include "komodo_interest.h" #include "komodo_pax.h" diff --git a/src/komodo_cJSON.c b/src/komodo_cJSON.c new file mode 100755 index 00000000000..ca2c6517c3c --- /dev/null +++ b/src/komodo_cJSON.c @@ -0,0 +1,559 @@ + +/* + Copyright (c) 2009 Dave Gamble + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + */ + +/* cJSON */ +/* JSON parser in C. */ +#include + +#include "cJSON.h" +#include "komodo_cJSON.h" +#include "cJSON.c" + +#ifndef DBL_EPSILON +#define DBL_EPSILON 2.2204460492503131E-16 +#endif + +static const char *ep; + +long stripquotes(char *str) +{ + long len,offset; + if ( str == 0 ) + return(0); + len = strlen(str); + if ( str[0] == '"' && str[len-1] == '"' ) + str[len-1] = 0, offset = 1; + else offset = 0; + return(offset); +} + +static int32_t cJSON_strcasecmp(const char *s1,const char *s2) +{ + if (!s1) return (s1==s2)?0:1;if (!s2) return 1; + for(; tolower((int32_t)(*s1)) == tolower((int32_t)(*s2)); ++s1, ++s2) if(*s1 == 0) return 0; + return tolower((int32_t)(*(const unsigned char *)s1)) - tolower((int32_t)(*(const unsigned char *)s2)); +} + +// the following written by jl777 +/****************************************************************************** + * Copyright © 2014-2017 The SuperNET Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * SuperNET software, including this file may be copied, modified, propagated * + * or distributed except according to the terms contained in the LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +void copy_cJSON(struct destbuf *dest,cJSON *obj) +{ + char *str; + int i; + long offset; + dest->buf[0] = 0; + if ( obj != 0 ) + { + str = cJSON_Print(obj); + if ( str != 0 ) + { + offset = stripquotes(str); + //strcpy(dest,str+offset); + for (i=0; ibuf[i]= str[offset+i]) == 0 ) + break; + dest->buf[i] = 0; + free(str); + } + } +} + +void copy_cJSON2(char *dest,int32_t maxlen,cJSON *obj) +{ + struct destbuf tmp; + maxlen--; + dest[0] = 0; + if ( maxlen > sizeof(tmp.buf) ) + maxlen = sizeof(tmp.buf); + copy_cJSON(&tmp,obj); + if ( strlen(tmp.buf) < maxlen ) + strcpy(dest,tmp.buf); + else dest[0] = 0; +} + +int64_t _get_cJSON_int(cJSON *json) +{ + struct destbuf tmp; + if ( json != 0 ) + { + copy_cJSON(&tmp,json); + if ( tmp.buf[0] != 0 ) + return(calc_nxt64bits(tmp.buf)); + } + return(0); +} + +int64_t get_cJSON_int(cJSON *json,char *field) +{ + cJSON *numjson; + if ( json != 0 ) + { + numjson = cJSON_GetObjectItem(json,field); + if ( numjson != 0 ) + return(_get_cJSON_int(numjson)); + } + return(0); +} + +int64_t conv_floatstr(char *numstr) +{ + double val,corr; + val = atof(numstr); + corr = (val < 0.) ? -0.50000000001 : 0.50000000001; + return((int64_t)(val * SATOSHIDEN + corr)); +} + +int64_t _conv_cJSON_float(cJSON *json) +{ + int64_t conv_floatstr(char *); + struct destbuf tmp; + if ( json != 0 ) + { + copy_cJSON(&tmp,json); + return(conv_floatstr(tmp.buf)); + } + return(0); +} + +int64_t conv_cJSON_float(cJSON *json,char *field) +{ + if ( json != 0 ) + return(_conv_cJSON_float(cJSON_GetObjectItem(json,field))); + return(0); +} + +int32_t extract_cJSON_str(char *dest,int32_t max,cJSON *json,char *field) +{ + int32_t safecopy(char *dest,char *src,long len); + char *str; + cJSON *obj; + int32_t len; + long offset; + dest[0] = 0; + obj = cJSON_GetObjectItem(json,field); + if ( obj != 0 ) + { + str = cJSON_Print(obj); + offset = stripquotes(str); + len = safecopy(dest,str+offset,max); + free(str); + return(len); + } + return(0); +} + +cJSON *gen_list_json(char **list) +{ + cJSON *array,*item; + array = cJSON_CreateArray(); + while ( list != 0 && *list != 0 && *list[0] != 0 ) + { + item = cJSON_CreateString(*list++); + cJSON_AddItemToArray(array,item); + } + return(array); +} + +uint64_t get_API_nxt64bits(cJSON *obj) +{ + uint64_t nxt64bits = 0; + struct destbuf tmp; + if ( obj != 0 ) + { + if ( cJSON_IsNumber(obj) != 0 ) + return((uint64_t)obj->valuedouble); + copy_cJSON(&tmp,obj); + nxt64bits = calc_nxt64bits(tmp.buf); + } + return(nxt64bits); +} +uint64_t j64bits(cJSON *json,char *field) { if ( field == 0 ) return(get_API_nxt64bits(json)); return(get_API_nxt64bits(cJSON_GetObjectItem(json,field))); } +uint64_t j64bitsi(cJSON *json,int32_t i) { return(get_API_nxt64bits(cJSON_GetArrayItem(json,i))); } + +uint64_t get_satoshi_obj(cJSON *json,char *field) +{ + int32_t i,n; + uint64_t prev,satoshis,mult = 1; + struct destbuf numstr,checkstr; + cJSON *numjson; + numjson = cJSON_GetObjectItem(json,field); + copy_cJSON(&numstr,numjson); + satoshis = prev = 0; mult = 1; n = (int32_t)strlen(numstr.buf); + for (i=n-1; i>=0; i--,mult*=10) + { + satoshis += (mult * (numstr.buf[i] - '0')); + if ( satoshis < prev ) + printf("get_satoshi_obj numstr.(%s) i.%d prev.%llu vs satoshis.%llu\n",numstr.buf,i,(unsigned long long)prev,(unsigned long long)satoshis); + prev = satoshis; + } + sprintf(checkstr.buf,"%llu",(long long)satoshis); + if ( strcmp(checkstr.buf,numstr.buf) != 0 ) + { + printf("SATOSHI GREMLIN?? numstr.(%s) -> %.8f -> (%s)\n",numstr.buf,dstr(satoshis),checkstr.buf); + } + return(satoshis); +} + +void add_satoshis_json(cJSON *json,char *field,uint64_t satoshis) +{ + cJSON *obj; + char numstr[64]; + sprintf(numstr,"%lld",(long long)satoshis); + obj = cJSON_CreateString(numstr); + cJSON_AddItemToObject(json,field,obj); + if ( satoshis != get_satoshi_obj(json,field) ) + printf("error adding satoshi obj %ld -> %ld\n",(unsigned long)satoshis,(unsigned long)get_satoshi_obj(json,field)); +} + +char *cJSON_str(cJSON *json) +{ + if ( json != 0 && cJSON_IsString(json) != 0 ) + return(json->valuestring); + return(0); +} + +void jadd(cJSON *json,char *field,cJSON *item) { if ( json != 0 )cJSON_AddItemToObject(json,field,item); } +void jaddstr(cJSON *json,char *field,char *str) { if ( json != 0 && str != 0 ) cJSON_AddItemToObject(json,field,cJSON_CreateString(str)); } +void jaddnum(cJSON *json,char *field,double num) { if ( json != 0 )cJSON_AddItemToObject(json,field,cJSON_CreateNumber(num)); } +void jadd64bits(cJSON *json,char *field,uint64_t nxt64bits) { char numstr[64]; sprintf(numstr,"%llu",(long long)nxt64bits), jaddstr(json,field,numstr); } +void jaddi(cJSON *json,cJSON *item) { if ( json != 0 ) cJSON_AddItemToArray(json,item); } +void jaddistr(cJSON *json,char *str) { if ( json != 0 ) cJSON_AddItemToArray(json,cJSON_CreateString(str)); } +void jaddinum(cJSON *json,double num) { if ( json != 0 ) cJSON_AddItemToArray(json,cJSON_CreateNumber(num)); } +void jaddi64bits(cJSON *json,uint64_t nxt64bits) { char numstr[64]; sprintf(numstr,"%llu",(long long)nxt64bits), jaddistr(json,numstr); } +char *jstr(cJSON *json,char *field) { if ( json == 0 ) return(0); if ( field == 0 ) return(cJSON_str(json)); return(cJSON_str(cJSON_GetObjectItem(json,field))); } + +char *jstri(cJSON *json,int32_t i) { return(cJSON_str(cJSON_GetArrayItem(json,i))); } +char *jprint(cJSON *json,int32_t freeflag) +{ + char *str; + /*static portable_mutex_t mutex; static int32_t initflag; + if ( initflag == 0 ) + { + portable_mutex_init(&mutex); + initflag = 1; + }*/ + if ( json == 0 ) + return(clonestr((char *)"{}")); + //portable_mutex_lock(&mutex); + //usleep(5000); + str = cJSON_Print(json), _stripwhite(str,' '); + if ( freeflag != 0 ) + free_json(json); + //portable_mutex_unlock(&mutex); + return(str); +} + +bits256 get_API_bits256(cJSON *obj) +{ + bits256 hash; char *str; + memset(hash.bytes,0,sizeof(hash)); + if ( obj != 0 ) + { + if ( cJSON_IsString(obj) != 0 && (str= obj->valuestring) != 0 && strlen(str) == 64 ) + decode_hex(hash.bytes,sizeof(hash),str); + } + return(hash); +} +bits256 jbits256(cJSON *json,char *field) { if ( field == 0 ) return(get_API_bits256(json)); return(get_API_bits256(cJSON_GetObjectItem(json,field))); } +bits256 jbits256i(cJSON *json,int32_t i) { return(get_API_bits256(cJSON_GetArrayItem(json,i))); } +void jaddbits256(cJSON *json,char *field,bits256 hash) { char str[65]; bits256_str(str,hash), jaddstr(json,field,str); } +void jaddibits256(cJSON *json,bits256 hash) { char str[65]; bits256_str(str,hash), jaddistr(json,str); } + +char *get_cJSON_fieldname(cJSON *obj) +{ + if ( obj != 0 ) + { + if ( obj->child != 0 && obj->child->string != 0 ) + return(obj->child->string); + else if ( obj->string != 0 ) + return(obj->string); + } + return((char *)""); +} + +int32_t jnum(cJSON *obj,char *field) +{ + char *str; int32_t polarity = 1; + if ( field != 0 ) + obj = jobj(obj,field); + if ( obj != 0 ) + { + if ( cJSON_IsNumber(obj) != 0 ) + return(obj->valuedouble); + else if ( cJSON_IsString(obj) != 0 && (str= jstr(obj,0)) != 0 ) + { + if ( str[0] == '-' ) + polarity = -1, str++; + return(polarity * (int32_t)calc_nxt64bits(str)); + } + } + return(0); +} + +void ensure_jsonitem(cJSON *json,char *field,char *value) +{ + cJSON *obj = cJSON_GetObjectItem(json,field); + if ( obj == 0 ) + cJSON_AddItemToObject(json,field,cJSON_CreateString(value)); + else cJSON_ReplaceItemInObject(json,field,cJSON_CreateString(value)); +} + +int32_t in_jsonarray(cJSON *array,char *value) +{ + int32_t i,n; + struct destbuf remote; + if ( array != 0 && cJSON_IsArray(array) != 0 ) + { + n = cJSON_GetArraySize(array); + for (i=0; i= range ) + x = (range - 1); + return((int32_t)x); +} + +int32_t get_API_int(cJSON *obj,int32_t val) +{ + struct destbuf buf; + if ( obj != 0 ) + { + if ( cJSON_IsNumber(obj) != 0 ) + return((int32_t)obj->valuedouble); + copy_cJSON(&buf,obj); + val = myatoi(buf.buf,0); + if ( val < 0 ) + val = 0; + } + return(val); +} + +int32_t jint(cJSON *json,char *field) { if ( json == 0 ) return(0); if ( field == 0 ) return(get_API_int(json,0)); return(get_API_int(cJSON_GetObjectItem(json,field),0)); } +int32_t jinti(cJSON *json,int32_t i) { if ( json == 0 ) return(0); return(get_API_int(cJSON_GetArrayItem(json,i),0)); } + +uint32_t get_API_uint(cJSON *obj,uint32_t val) +{ + struct destbuf buf; + if ( obj != 0 ) + { + if ( cJSON_IsNumber(obj) != 0 ) + return((uint32_t)obj->valuedouble); + copy_cJSON(&buf,obj); + val = myatoi(buf.buf,0); + } + return(val); +} +uint32_t juint(cJSON *json,char *field) { if ( json == 0 ) return(0); if ( field == 0 ) return(get_API_uint(json,0)); return(get_API_uint(cJSON_GetObjectItem(json,field),0)); } +uint32_t juinti(cJSON *json,int32_t i) { if ( json == 0 ) return(0); return(get_API_uint(cJSON_GetArrayItem(json,i),0)); } + +double get_API_float(cJSON *obj) +{ + double val = 0.; + struct destbuf buf; + if ( obj != 0 ) + { + if ( cJSON_IsNumber(obj) != 0 ) + return(obj->valuedouble); + copy_cJSON(&buf,obj); + val = atof(buf.buf); + } + return(val); +} + +double jdouble(cJSON *json,char *field) +{ + if ( json != 0 ) + { + if ( field == 0 ) + return(get_API_float(json)); + else return(get_API_float(cJSON_GetObjectItem(json,field))); + } else return(0.); +} + +double jdoublei(cJSON *json,int32_t i) +{ + if ( json != 0 ) + return(get_API_float(cJSON_GetArrayItem(json,i))); + else return(0.); +} + +cJSON *jobj(cJSON *json,char *field) { if ( json != 0 ) return(cJSON_GetObjectItem(json,field)); return(0); } + +void jdelete(cJSON *json,char *field) +{ + if ( jobj(json,field) != 0 ) + cJSON_DeleteItemFromObject(json,field); +} + +cJSON *jduplicate(cJSON *json) { return(cJSON_Duplicate(json,1)); } + +cJSON *jitem(cJSON *array,int32_t i) { if ( array != 0 && cJSON_IsArray(array) != 0 && cJSON_GetArraySize(array) > i ) return(cJSON_GetArrayItem(array,i)); return(0); } +cJSON *jarray(int32_t *nump,cJSON *json,char *field) +{ + cJSON *array; + if ( json != 0 ) + { + if ( field == 0 ) + array = json; + else array = cJSON_GetObjectItem(json,field); + if ( array != 0 && cJSON_IsArray(array) != 0 && (*nump= cJSON_GetArraySize(array)) > 0 ) + return(array); + } + *nump = 0; + return(0); +} + +int32_t expand_nxt64bits(char *NXTaddr,uint64_t nxt64bits) +{ + int32_t i,n; + uint64_t modval; + char rev[64]; + for (i=0; nxt64bits!=0; i++) + { + modval = nxt64bits % 10; + rev[i] = (char)(modval + '0'); + nxt64bits /= 10; + } + n = i; + for (i=0; i= 22 ) + { + printf("calc_nxt64bits: illegal NXTaddr.(%s) too long\n",NXTaddr); + return(0); + } + else if ( strcmp(NXTaddr,"0") == 0 || strcmp(NXTaddr,"false") == 0 ) + { + // printf("zero address?\n"); getchar(); + return(0); + } + if ( NXTaddr[0] == '-' ) + polarity = -1, NXTaddr++, n--; + mult = 1; + lastval = 0; + for (i=n-1; i>=0; i--,mult*=10) + { + c = NXTaddr[i]; + if ( c < '0' || c > '9' ) + { + printf("calc_nxt64bits: illegal char.(%c %d) in (%s).%d\n",c,c,NXTaddr,(int32_t)i); +#ifdef __APPLE__ + //while ( 1 ) + { + //sleep(60); + printf("calc_nxt64bits: illegal char.(%c %d) in (%s).%d\n",c,c,NXTaddr,(int32_t)i); + } +#endif + return(0); + } + nxt64bits += mult * (c - '0'); + if ( nxt64bits < lastval ) + printf("calc_nxt64bits: warning: 64bit overflow %llx < %llx\n",(long long)nxt64bits,(long long)lastval); + lastval = nxt64bits; + } + while ( *NXTaddr == '0' && *NXTaddr != 0 ) + NXTaddr++; + if ( cmp_nxt64bits(NXTaddr,nxt64bits) != 0 ) + printf("error calculating nxt64bits: %s -> %llx -> %s\n",NXTaddr,(long long)nxt64bits,nxt64str(nxt64bits)); + if ( polarity < 0 ) + return(-(int64_t)nxt64bits); + return(nxt64bits); +} + +cJSON *addrs_jsonarray(uint64_t *addrs,int32_t num) +{ + int32_t j; cJSON *array; + array = cJSON_CreateArray(); + for (j=0; j +#include +#include +#include +#include +#include +#include +#include "komodo_structs.h" + +#include "cJSON.h" + +//#include "../crypto777/OS_portable.h" + +#define MAX_JSON_FIELD 4096 // on the big side + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Macros for creating things quickly. */ +#define cJSON_AddNullToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateNull()) +#define cJSON_AddTrueToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateTrue()) +#define cJSON_AddFalseToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateFalse()) +#define cJSON_AddBoolToObject(object,name,b) cJSON_AddItemToObject(object, name, cJSON_CreateBool(b)) +#define cJSON_AddNumberToObject(object,name,n) cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n)) +#define cJSON_AddStringToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateString(s)) + + struct destbuf { char buf[MAX_JSON_FIELD]; }; + +#define jfieldstr get_cJSON_fieldname + + char *cJSON_str(cJSON *json); + char *jstr(cJSON *json,char *field); + char *jprint(cJSON *json,int32_t freeflag); + int32_t jint(cJSON *json,char *field); + uint32_t juint(cJSON *json,char *field); + char *jstri(cJSON *json,int32_t i); + int32_t jinti(cJSON *json,int32_t i); + uint32_t juinti(cJSON *json,int32_t i); + uint64_t j64bitsi(cJSON *json,int32_t i); + double jdoublei(cJSON *json,int32_t i); + double jdouble(cJSON *json,char *field); + cJSON *jobj(cJSON *json,char *field); + cJSON *jarray(int32_t *nump,cJSON *json,char *field); + cJSON *jitem(cJSON *array,int32_t i); + uint64_t j64bits(cJSON *json,char *field); + void jadd(cJSON *json,char *field,cJSON *item); + void jaddstr(cJSON *json,char *field,char *str); + void jaddnum(cJSON *json,char *field,double num); + void jadd64bits(cJSON *json,char *field,uint64_t nxt64bits); + void jaddi(cJSON *json,cJSON *item); + void jaddistr(cJSON *json,char *str); + void jaddinum(cJSON *json,double num); + void jaddi64bits(cJSON *json,uint64_t nxt64bits); + void jdelete(cJSON *object,char *string); + cJSON *jduplicate(cJSON *json); + int32_t jnum(cJSON *obj,char *field); + + bits256 jbits256(cJSON *json,char *field); + bits256 jbits256i(cJSON *json,int32_t i); + void jaddbits256(cJSON *json,char *field,bits256 hash); + void jaddibits256(cJSON *json,bits256 hash); + void copy_cJSON(struct destbuf *dest,cJSON *obj); + void copy_cJSON2(char *dest,int32_t maxlen,cJSON *obj); + cJSON *gen_list_json(char **list); + int32_t extract_cJSON_str(char *dest,int32_t max,cJSON *json,char *field); + + void free_json(cJSON *json); + int64_t _conv_cJSON_float(cJSON *json); + int64_t conv_cJSON_float(cJSON *json,char *field); + int64_t get_cJSON_int(cJSON *json,char *field); + void add_satoshis_json(cJSON *json,char *field,uint64_t satoshis); + uint64_t get_satoshi_obj(cJSON *json,char *field); + + int32_t get_API_int(cJSON *obj,int32_t val); + uint32_t get_API_uint(cJSON *obj,uint32_t val); + uint64_t get_API_nxt64bits(cJSON *obj); + double get_API_float(cJSON *obj); + char *get_cJSON_fieldname(cJSON *obj); + void ensure_jsonitem(cJSON *json,char *field,char *value); + int32_t in_jsonarray(cJSON *array,char *value); + char *bitcoind_RPC(char **retstrp,char *debugstr,char *url,char *userpass,char *command,char *params); + uint64_t calc_nxt64bits(const char *str); + int32_t expand_nxt64bits(char *str,uint64_t nxt64bits); + char *nxt64str(uint64_t nxt64bits); + char *nxt64str2(uint64_t nxt64bits); + cJSON *addrs_jsonarray(uint64_t *addrs,int32_t num); + int32_t myatoi(char *str,int32_t range); + + char *stringifyM(char *str); +#define replace_backslashquotes unstringify + char *unstringify(char *str); +#define jtrue cJSON_CreateTrue +#define jfalse cJSON_CreateFalse + +#define jfieldname get_cJSON_fieldname + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index f0bfecc9cf2..baafc6dbe71 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -141,7 +141,7 @@ int32_t Jumblr_depositaddradd(char *depositaddr) // external { if ( (retjson= cJSON_Parse(retstr)) != 0 ) { - if ( (ismine= jobj(retjson,(char *)"ismine")) != 0 && is_cJSON_True(ismine) != 0 ) + if ( (ismine= jobj(retjson,(char *)"ismine")) != 0 && cJSON_IsTrue(ismine) != 0 ) { retval = 0; safecopy(Jumblr_deposit,depositaddr,sizeof(Jumblr_deposit)); @@ -149,7 +149,7 @@ int32_t Jumblr_depositaddradd(char *depositaddr) // external else { retval = JUMBLR_ERROR_NOTINWALLET; - printf("%s not in wallet: ismine.%p %d %s\n",depositaddr,ismine,is_cJSON_True(ismine),jprint(retjson,0)); + printf("%s not in wallet: ismine.%p %d %s\n",depositaddr,ismine,cJSON_IsTrue(ismine),jprint(retjson,0)); } free_json(retjson); } @@ -366,7 +366,7 @@ int64_t jumblr_balance(char *addr) //printf("jumblr.[%s].(%s)\n","KMD",retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { - if ( (n= cJSON_GetArraySize(retjson)) > 0 && is_cJSON_Array(retjson) != 0 ) + if ( (n= cJSON_GetArraySize(retjson)) > 0 && cJSON_IsArray(retjson) != 0 ) for (i=0; i 0 && is_cJSON_Array(array) != 0 ) + if ( (n= cJSON_GetArraySize(array)) > 0 && cJSON_IsArray(array) != 0 ) { //printf("%s -> n%d\n",retstr,n); for (i=0; i 0 && is_cJSON_Array(array) != 0 ) + if ( (n= cJSON_GetArraySize(array)) > 0 && cJSON_IsArray(array) != 0 ) { for (i=0; i Date: Sun, 22 Oct 2017 23:27:44 -0700 Subject: [PATCH 0011/1081] function to create a cryptocondition from a Univalue --- configure.ac | 2 +- src/rpccryptoconditions.cpp | 21 +++++++++++++-------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/configure.ac b/configure.ac index c471bab89c8..9f8f1900f93 100644 --- a/configure.ac +++ b/configure.ac @@ -996,7 +996,7 @@ unset PKG_CONFIG_LIBDIR PKG_CONFIG_LIBDIR="$PKGCONFIG_LIBDIR_TEMP" ac_configure_args="${ac_configure_args} --disable-shared --with-pic --with-bignum=no" -AC_CONFIG_SUBDIRS([src/secp256k1 src/univalue]) +AC_CONFIG_SUBDIRS([src/secp256k1 src/univalue src/cryptoconditions]) AC_OUTPUT diff --git a/src/rpccryptoconditions.cpp b/src/rpccryptoconditions.cpp index 946667aae3a..e297ed4e4c9 100644 --- a/src/rpccryptoconditions.cpp +++ b/src/rpccryptoconditions.cpp @@ -375,6 +375,14 @@ UniValue verifytxoutproofcc(const UniValue& params, bool fHelp) return res; } +CC *ConditionFromValue(const UniValue& condition) { + std::string encoded = condition.write(); + char *err = new char[1000]; + CC *cond = cc_conditionFromJSONString(encoded.c_str(), err); + if (NULL == cond) + throw JSONRPCError(RPC_INVALID_PARAMETER, err); +} + UniValue createrawtransactioncc(const UniValue& params, bool fHelp) { if (fHelp || params.size() != 2) @@ -409,7 +417,7 @@ UniValue createrawtransactioncc(const UniValue& params, bool fHelp) ); LOCK(cs_main); - RPCTypeCheck(params, boost::assign::list_of(UniValue::VARR)(UniValue::VARR)); + //RPCTypeCheck(params, boost::assign::list_of(UniValue::VARR)(UniValue::VARR)); UniValue inputs = params[0].get_array(); UniValue outputs = params[1].get_array(); @@ -429,6 +437,9 @@ UniValue createrawtransactioncc(const UniValue& params, bool fHelp) if (nOutput < 0) throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, vout must be positive"); + CC *cond = ConditionFromValue(find_value(output, "condition")); + char *ffillBin = new char[1024*1024]; + CTxIn in(COutPoint(txid, nOutput)); rawTx.vin.push_back(in); } @@ -436,13 +447,7 @@ UniValue createrawtransactioncc(const UniValue& params, bool fHelp) for (size_t idx = 0; idx < outputs.size(); idx++) { const UniValue& output = outputs[idx].get_obj(); - const UniValue& condition = find_value(output, "condition"); - std::string encoded = condition.write(); - fprintf(stderr, "%s\n", encoded.c_str()); - char *err = new char[1000]; - CC *cond = cc_conditionFromJSONString(encoded.c_str(), err); - if (NULL == cond) - throw JSONRPCError(RPC_INVALID_PARAMETER, err); + CC *cond = ConditionFromValue(find_value(output, "condition")); char *condBin = new char[1000]; size_t binLength = cc_conditionBinary(cond, condBin); std::vector condVec(condBin, condBin + binLength); From 6585a02268125511b5589fe330a39c376f78d165 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Tue, 23 Jan 2018 14:05:43 -0300 Subject: [PATCH 0012/1081] cli method to create CC transaction --- qa/test_rpc_cryptoconditions.py | 47 ++++++ src/rpccryptoconditions.cpp | 246 +++++++++++--------------------- 2 files changed, 129 insertions(+), 164 deletions(-) create mode 100644 qa/test_rpc_cryptoconditions.py diff --git a/qa/test_rpc_cryptoconditions.py b/qa/test_rpc_cryptoconditions.py new file mode 100644 index 00000000000..a93eab86aa1 --- /dev/null +++ b/qa/test_rpc_cryptoconditions.py @@ -0,0 +1,47 @@ +import os +import subprocess +import json +import base64 + + +inputs = [ + { + 'txid': '9b907ef1e3c26fc71fe4a4b3580bc75264112f95050014157059c736f0202e71', + 'vout': 0, + 'fulfillment': { + 'type': 'preimage-sha-256', + 'preimage': '', + }, + } +] + +outputs = [ + { + "condition": { + 'type': 'preimage-sha-256', + 'preimage': '' + }, + "amount": 1, + } +] + +addresses = ['RQygCQA7ovCrVCHM3sSkDQjjQUg5X4SCJw'] +privkeys = ["UszeEw39HcoeRegZb74xuvngbcQ5jkwQZZVpAvBp1bvBhXD36ghX"] + + +proc = subprocess.Popen(['src/komodo-cli', 'createrawtransactioncc', json.dumps(inputs), json.dumps(outputs)], + stdout=subprocess.PIPE) + +assert not proc.wait() + +tx_hex = proc.stdout.read().strip() +tx = base64.b16decode(tx_hex, casefold=True) + +print repr(tx) + +proc = subprocess.Popen(['src/komodo-cli', 'signrawtransactioncc', tx_hex, json.dumps(privkeys)], + stdout=subprocess.PIPE) + +proc.wait() + +result = json.loads(proc.stdout.read()) diff --git a/src/rpccryptoconditions.cpp b/src/rpccryptoconditions.cpp index e297ed4e4c9..18d6774f0ff 100644 --- a/src/rpccryptoconditions.cpp +++ b/src/rpccryptoconditions.cpp @@ -375,45 +375,73 @@ UniValue verifytxoutproofcc(const UniValue& params, bool fHelp) return res; } -CC *ConditionFromValue(const UniValue& condition) { - std::string encoded = condition.write(); + +CC *ConditionFromString(std::string encoded) { char *err = new char[1000]; CC *cond = cc_conditionFromJSONString(encoded.c_str(), err); if (NULL == cond) throw JSONRPCError(RPC_INVALID_PARAMETER, err); } + +CC *ConditionFromCharVector(vector& vch) { + return ConditionFromString(std::string(vch.begin(), vch.end())); +} + + +CC *ConditionFromUnsignedInputScript(const CScript& script) +{ + opcodetype op; + CScript::const_iterator it = script.begin(); + + vector vch; + if (script.GetOp2(it, op, &vch)) { + if (vch.at(0) == '{') { + return ConditionFromCharVector(vch); + } + } + return NULL; +} + + +CC *ConditionFromValue(UniValue value) { + std::string conditionEncoded = value.write(); + // TODO: Is null? + return ConditionFromString(conditionEncoded); +} + UniValue createrawtransactioncc(const UniValue& params, bool fHelp) { if (fHelp || params.size() != 2) throw runtime_error( - "createrawtransaction [{\"txid\":\"id\",\"vout\":n},...] {\"address\":amount,...}\n" + "createrawtransactioncc [{\"txid\":\"id\",\"vout\":n,\"fulfillment\":{...}},...] {\"address\":amount,...}\n" "\nCreate a transaction spending the given inputs and sending to the given addresses.\n" "Returns hex-encoded raw transaction.\n" "Note that the transaction's inputs are not signed, and\n" "it is not stored in the wallet or transmitted to the network.\n" "\nArguments:\n" - "1. \"transactions\" (string, required) A json array of json objects\n" + "1. \"inputs\" (string, required) A json array of json objects\n" " [\n" " {\n" - " \"txid\":\"id\", (string, required) The transaction id\n" - " \"vout\":n (numeric, required) The output number\n" + " \"txid\":\"id\", (string, required) The transaction id\n" + " \"vout\":n, (numeric, required) The output number\n" + " \"fulfillment\":{...} (object, required) The JSON encoded cryptocondition fulfillment for the previous transaction's output\n" " }\n" " ,...\n" " ]\n" - "2. \"addresses\" (string, required) a json object with addresses as keys and amounts as values\n" + "2. \"outputs\" (string, required) a json array with addresses as keys and amounts as values\n" " {\n" - " \"address\": x.xxx (numeric, required) The key is the bitcoin address, the value is the btc amount\n" - " ,...\n" + " \"condition\":\"{...}\" (object, required) The JSON encoded condition\n" + " \"amount\":n, (numeric, required) The coin amount in satoshis\n" " }\n" "\nResult:\n" - "\"transaction\" (string) hex string of the transaction\n" + "\"transaction\" (string) hex string of the transaction\n" - "\nExamples\n" - + HelpExampleCli("createrawtransactioncc", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\" \"{\\\"address\\\":0.01}\"") - + HelpExampleRpc("createrawtransactioncc", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\", \"{\\\"address\\\":0.01}\"") + // "\nExamples\n" + // + HelpExampleCli("createrawtransactioncc", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\" \"{\\\"address\\\":0.01}\"") + // + HelpExampleRpc("createrawtransactioncc", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\", \"{\\\"address\\\":0.01}\"") ); LOCK(cs_main); @@ -437,49 +465,46 @@ UniValue createrawtransactioncc(const UniValue& params, bool fHelp) if (nOutput < 0) throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, vout must be positive"); - CC *cond = ConditionFromValue(find_value(output, "condition")); - char *ffillBin = new char[1024*1024]; + const UniValue& ffill_v = find_value(input, "fulfillment"); + if (!ffill_v.isObject()) { + throw JSONRPCError(RPC_INVALID_PARAMETER, "\"fulfillment\" missing or not an object"); + } + const std::string ffillEncoded = ffill_v.write(); + + // Validate the fulfillment + CC *cond = ConditionFromString(ffillEncoded); + if (cond == NULL) { + throw JSONRPCError(RPC_INVALID_PARAMETER, "\"fulfillment\" not a valid JSON encoded crypto condition"); + } + cc_free(cond); - CTxIn in(COutPoint(txid, nOutput)); + CScript inputScript; + const std::vector ffill(ffillEncoded.c_str(), ffillEncoded.c_str() + ffillEncoded.size()); + inputScript << ffill; + + CTxIn in(COutPoint(txid, nOutput), inputScript); rawTx.vin.push_back(in); } for (size_t idx = 0; idx < outputs.size(); idx++) { const UniValue& output = outputs[idx].get_obj(); + // This does not need to be fulfilled, we just want the condition binary CC *cond = ConditionFromValue(find_value(output, "condition")); + char *condBin = new char[1000]; size_t binLength = cc_conditionBinary(cond, condBin); - std::vector condVec(condBin, condBin + binLength); + const std::vector condVec(condBin, condBin + binLength); CScript redeemScript; - redeemScript << ToByteVector(condVec) << OP_CHECKCRYPTOCONDITIONVERIFY; + redeemScript << condVec << OP_CHECKCRYPTOCONDITIONVERIFY; + CAmount nAmount = AmountFromValue(find_value(output, "amount")); CTxOut out(nAmount, redeemScript); rawTx.vout.push_back(out); } - /* - set setAddress; - vector addrList = sendTo.getKeys(); - BOOST_FOREACH(const string& name_, addrList) { - CBitcoinAddress address(name_); - if (!address.IsValid()) - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, string("Invalid Bitcoin address: ")+name_); - - if (setAddress.count(address)) - throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid parameter, duplicated address: ")+name_); - setAddress.insert(address); - - CScript scriptPubKey = GetScriptForDestination(address.Get()); - CAmount nAmount = AmountFromValue(sendTo[name_]); - - CTxOut out(nAmount, scriptPubKey); - rawTx.vout.push_back(out); - } - */ - return EncodeHexTx(rawTx); } @@ -575,57 +600,15 @@ UniValue decoderawtransactioncc(const UniValue& params, bool fHelp) return result; } -UniValue decodescriptcc(const UniValue& params, bool fHelp) -{ - if (fHelp || params.size() != 1) - throw runtime_error( - "decodescript \"hex\"\n" - "\nDecode a hex-encoded script.\n" - "\nArguments:\n" - "1. \"hex\" (string) the hex encoded script\n" - "\nResult:\n" - "{\n" - " \"asm\":\"asm\", (string) Script public key\n" - " \"hex\":\"hex\", (string) hex encoded public key\n" - " \"type\":\"type\", (string) The output type\n" - " \"reqSigs\": n, (numeric) The required signatures\n" - " \"addresses\": [ (json array of string)\n" - " \"address\" (string) bitcoin address\n" - " ,...\n" - " ],\n" - " \"p2sh\",\"address\" (string) script address\n" - "}\n" - "\nExamples:\n" - + HelpExampleCli("decodescript", "\"hexstring\"") - + HelpExampleRpc("decodescript", "\"hexstring\"") - ); - - LOCK(cs_main); - RPCTypeCheck(params, boost::assign::list_of(UniValue::VSTR)); - - UniValue r(UniValue::VOBJ); - CScript script; - if (params[0].get_str().size() > 0){ - vector scriptData(ParseHexV(params[0], "argument")); - script = CScript(scriptData.begin(), scriptData.end()); - } else { - // Empty scripts are valid - } - ScriptPubKeyToJSON(script, r, false); - - r.push_back(Pair("p2sh", CBitcoinAddress(CScriptID(script)).ToString())); - return r; -} - /** Pushes a JSON object for script verification or signing errors to vErrorsRet. */ static void TxInErrorToJSON(const CTxIn& txin, UniValue& vErrorsRet, const std::string& strMessage) {} UniValue signrawtransactioncc(const UniValue& params, bool fHelp) { - if (fHelp || params.size() < 1 || params.size() > 4) + if (fHelp || params.size() < 1 || params.size() > 2) throw runtime_error( - "signrawtransactioncc \"hexstring\" ( [{\"txid\":\"id\",\"vout\":n,\"scriptPubKey\":\"hex\",\"redeemScript\":\"hex\"},...] [\"privatekey1\",...] sighashtype )\n" + "signrawtransactioncc \"hexstring\" ( [\"privatekey1\",...] sighashtype )\n" "\nSign cryptocondition inputs for raw transaction (serialized, hex-encoded).\n" "The second optional argument (may be null) is an array of previous transaction outputs that\n" "this transaction depends on but may not yet be in the block chain.\n" @@ -637,17 +620,7 @@ UniValue signrawtransactioncc(const UniValue& params, bool fHelp) "\nArguments:\n" "1. \"hexstring\" (string, required) The transaction hex string\n" - /* "2. \"prevtxs\" (string, optional) An json array of previous dependent transaction outputs\n" - " [ (json array of json objects, or 'null' if none provided)\n" - " {\n" - " \"txid\":\"id\", (string, required) The transaction id\n" - " \"vout\":n, (numeric, required) The output number\n" - " \"scriptPubKey\": \"hex\", (string, required) script key\n" - " \"redeemScript\": \"hex\" (string, required for P2SH) redeem script\n" - " }\n" - " ,...\n" - " ]\n" */ - "3. \"privatekeys\" (string, optional) A json array of base58-encoded private keys for signing\n" + "2. \"privatekeys\" (string, optional) A json array of base58-encoded private keys for signing\n" " [ (json array of strings, or 'null' if none provided)\n" " \"privatekey\" (string) private key in base58-encoding\n" " ,...\n" @@ -709,24 +682,6 @@ UniValue signrawtransactioncc(const UniValue& params, bool fHelp) // starts as a clone of the rawtx: CMutableTransaction mergedTx(txVariants[0]); - // Fetch previous transactions (inputs): - CCoinsView viewDummy; - CCoinsViewCache view(&viewDummy); - { - LOCK(mempool.cs); - CCoinsViewCache &viewChain = *pcoinsTip; - CCoinsViewMemPool viewMempool(&viewChain, mempool); - view.SetBackend(viewMempool); // temporarily switch cache backend to db+mempool view - - BOOST_FOREACH(const CTxIn& txin, mergedTx.vin) { - const uint256& prevHash = txin.prevout.hash; - CCoins coins; - view.AccessCoins(prevHash); // this is certainly allowed to fail - } - - view.SetBackend(viewDummy); // switch back to avoid locking mempool for too long - } - bool fGivenKeys = false; CBasicKeyStore tempKeystore; if (params.size() > 2 && !params[2].isNull()) { @@ -749,57 +704,6 @@ UniValue signrawtransactioncc(const UniValue& params, bool fHelp) EnsureWalletIsUnlocked(); #endif - // Add previous txouts given in the RPC call: - /* - if (params.size() > 1 && !params[1].isNull()) { - UniValue prevTxs = params[1].get_array(); - for (size_t idx = 0; idx < prevTxs.size(); idx++) { - const UniValue& p = prevTxs[idx]; - if (!p.isObject()) - throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "expected object with {\"txid'\",\"vout\",\"scriptPubKey\"}"); - - UniValue prevOut = p.get_obj(); - - RPCTypeCheckObj(prevOut, boost::assign::map_list_of("txid", UniValue::VSTR)("vout", UniValue::VNUM)("scriptPubKey", UniValue::VSTR)); - - uint256 txid = ParseHashO(prevOut, "txid"); - - int nOut = find_value(prevOut, "vout").get_int(); - if (nOut < 0) - throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "vout must be positive"); - - vector pkData(ParseHexO(prevOut, "scriptPubKey")); - CScript scriptPubKey(pkData.begin(), pkData.end()); - - { - CCoinsModifier coins = view.ModifyCoins(txid); - if (coins->IsAvailable(nOut) && coins->vout[nOut].scriptPubKey != scriptPubKey) { - string err("Previous output scriptPubKey mismatch:\n"); - err = err + coins->vout[nOut].scriptPubKey.ToString() + "\nvs:\n"+ - scriptPubKey.ToString(); - throw JSONRPCError(RPC_DESERIALIZATION_ERROR, err); - } - if ((unsigned int)nOut >= coins->vout.size()) - coins->vout.resize(nOut+1); - coins->vout[nOut].scriptPubKey = scriptPubKey; - coins->vout[nOut].nValue = 0; // we don't know the actual output value - } - - // if redeemScript given and not using the local wallet (private keys - // given), add redeemScript to the tempKeystore so it can be signed: - if (fGivenKeys && scriptPubKey.IsPayToScriptHash()) { - RPCTypeCheckObj(prevOut, boost::assign::map_list_of("txid", UniValue::VSTR)("vout", UniValue::VNUM)("scriptPubKey", UniValue::VSTR)("redeemScript",UniValue::VSTR)); - UniValue v = find_value(prevOut, "redeemScript"); - if (!v.isNull()) { - vector rsData(ParseHexV(v, "redeemScript")); - CScript redeemScript(rsData.begin(), rsData.end()); - tempKeystore.AddCScript(redeemScript); - } - } - } - } - */ - #ifdef ENABLE_WALLET const CKeyStore& keystore = ((fGivenKeys || !pwalletMain) ? tempKeystore : *pwalletMain); #else @@ -834,6 +738,18 @@ UniValue signrawtransactioncc(const UniValue& params, bool fHelp) // Sign what we can: for (unsigned int i = 0; i < mergedTx.vin.size(); i++) { CTxIn& txin = mergedTx.vin[i]; + + CC *cond; + + printf("Go\n"); + if (cond = ConditionFromUnsignedInputScript(txin.scriptSig)) { + printf("Found unsigned\n"); + continue; + } + printf("No luck\n"); + + /* + * Replace all this with detection of cryptoconditions spec and signing with each privkey const CCoins* coins = view.AccessCoins(txin.prevout.hash); if (coins == NULL || !coins->IsAvailable(txin.prevout.n)) { TxInErrorToJSON(txin, vErrors, "Input not found or already spent"); @@ -854,6 +770,7 @@ UniValue signrawtransactioncc(const UniValue& params, bool fHelp) if (!VerifyScript(txin.scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, MutableTransactionSignatureChecker(&mergedTx, i), &serror)) { TxInErrorToJSON(txin, vErrors, ScriptErrorString(serror)); } + */ } bool fComplete = vErrors.empty(); @@ -867,13 +784,14 @@ UniValue signrawtransactioncc(const UniValue& params, bool fHelp) return result; } + UniValue sendrawtransactioncc(const UniValue& params, bool fHelp) { if (fHelp || params.size() < 1 || params.size() > 2) throw runtime_error( "sendrawtransaction \"hexstring\" ( allowhighfees )\n" "\nSubmits raw transaction (serialized, hex-encoded) to local node and network.\n" - "\nAlso see createrawtransaction and signrawtransaction calls.\n" + "\nAlso see createrawtransactioncc and signrawtransactioncc calls.\n" "\nArguments:\n" "1. \"hexstring\" (string, required) The hex string of the raw transaction)\n" "2. allowhighfees (boolean, optional, default=false) Allow high fees\n" @@ -881,7 +799,7 @@ UniValue sendrawtransactioncc(const UniValue& params, bool fHelp) "\"hex\" (string) The transaction hash in hex\n" "\nExamples:\n" "\nCreate a transaction\n" - + HelpExampleCli("createrawtransaction", "\"[{\\\"txid\\\" : \\\"mytxid\\\",\\\"vout\\\":0}]\" \"{\\\"myaddress\\\":0.01}\"") + + + HelpExampleCli("createrawtransactioncc", "\"[{\\\"txid\\\" : \\\"mytxid\\\",\\\"vout\\\":0}]\" \"{\\\"myaddress\\\":0.01}\"") + "Sign the transaction, and get back the hex\n" + HelpExampleCli("signrawtransaction", "\"myhex\"") + "\nSend the transaction (signed hex)\n" From 63d3e4aab1b310b1658dafa648d50a96da6745bd Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Tue, 23 Jan 2018 14:12:43 -0300 Subject: [PATCH 0013/1081] add isFulfulled to cryptoconditions --- src/cryptoconditions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cryptoconditions b/src/cryptoconditions index a59c22dcf9a..6e34f2e3255 160000 --- a/src/cryptoconditions +++ b/src/cryptoconditions @@ -1 +1 @@ -Subproject commit a59c22dcf9a67be5f11f88ff89bbd9cb40fd22c0 +Subproject commit 6e34f2e325516a08ea11e847f661bf6a8e524d38 From 6e821110fdfa03f3deb051b5146142bd46d8c60e Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Tue, 6 Feb 2018 18:37:08 -0300 Subject: [PATCH 0014/1081] auxiliary cryptoconditions --- src/cryptoconditions | 2 +- src/komodo_cryptoconditions.h | 8 ++++++++ src/script/interpreter.cpp | 5 +++-- 3 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 src/komodo_cryptoconditions.h diff --git a/src/cryptoconditions b/src/cryptoconditions index 6e34f2e3255..89325dc2939 160000 --- a/src/cryptoconditions +++ b/src/cryptoconditions @@ -1 +1 @@ -Subproject commit 6e34f2e325516a08ea11e847f661bf6a8e524d38 +Subproject commit 89325dc29391f473da75503105a4946f2f96fb76 diff --git a/src/komodo_cryptoconditions.h b/src/komodo_cryptoconditions.h new file mode 100644 index 00000000000..d5e643c91ae --- /dev/null +++ b/src/komodo_cryptoconditions.h @@ -0,0 +1,8 @@ + + +/* + * Method stub for aux conditions. Unimplemented, thus fails if an aux condition is encountered. + */ +int komodoCCAux(CC *cond, void *context) { + return 0; +} diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index f65581068a2..94727cbcadc 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -14,6 +14,7 @@ #include "script/script.h" #include "uint256.h" #include "cryptoconditions/include/cryptoconditions.h" +#include "komodo_cryptoconditions.h" using namespace std; @@ -963,8 +964,8 @@ bool EvalScript(vector >& stack, const CScript& script, un // TODO: Should nHashType be hardcoded? // Other types use the last byte of the signature char *msg = (char*) checker.GetMessage(script, SIGHASH_ALL).begin(); -; - bool fSuccess = cc_verify(cond, msg, 32, condBin, vchCondition.size()); + + bool fSuccess = cc_verify(cond, msg, 32, condBin, vchCondition.size(), komodoCCAux, NULL); popstack(stack); popstack(stack); From a01d0f56724dcfe0345637c4209cbfedb9ba2b34 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Fri, 16 Feb 2018 14:24:38 -0300 Subject: [PATCH 0015/1081] remove rpc crypto conditions --- src/Makefile.am | 1 - src/rpcclient.cpp | 4 - src/rpccryptoconditions.cpp | 848 ------------------------------------ src/rpcserver.cpp | 2 - src/rpcserver.h | 3 - 5 files changed, 858 deletions(-) delete mode 100644 src/rpccryptoconditions.cpp diff --git a/src/Makefile.am b/src/Makefile.am index 919c6fc8946..815d75d4cd8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -238,7 +238,6 @@ libbitcoin_server_a_SOURCES = \ rpcmisc.cpp \ rpcnet.cpp \ rpcrawtransaction.cpp \ - rpccryptoconditions.cpp \ rpcserver.cpp \ script/sigcache.cpp \ timedata.cpp \ diff --git a/src/rpcclient.cpp b/src/rpcclient.cpp index 2378e3ca01f..545d75b6fd9 100644 --- a/src/rpcclient.cpp +++ b/src/rpcclient.cpp @@ -75,12 +75,8 @@ static const CRPCConvertParam vRPCConvertParams[] = { "getrawtransaction", 1 }, { "createrawtransaction", 0 }, { "createrawtransaction", 1 }, - { "createrawtransactioncc", 0 }, - { "createrawtransactioncc", 1 }, { "signrawtransaction", 1 }, { "signrawtransaction", 2 }, - { "signrawtransactioncc", 1 }, - { "signrawtransactioncc", 2 }, { "sendrawtransaction", 1 }, { "fundrawtransaction", 1 }, { "gettxout", 1 }, diff --git a/src/rpccryptoconditions.cpp b/src/rpccryptoconditions.cpp deleted file mode 100644 index 18d6774f0ff..00000000000 --- a/src/rpccryptoconditions.cpp +++ /dev/null @@ -1,848 +0,0 @@ -// Copyright (c) 2010 Satoshi Nakamoto -// Copyright (c) 2009-2015 The Bitcoin Core developers -// Distributed under the MIT software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. - -#include "base58.h" -#include "consensus/validation.h" -#include "core_io.h" -#include "init.h" -#include "keystore.h" -#include "main.h" -#include "merkleblock.h" -#include "net.h" -#include "primitives/transaction.h" -#include "rpcserver.h" -#include "script/script.h" -#include "script/script_error.h" -#include "script/sign.h" -#include "script/standard.h" -#include "uint256.h" -#include "cryptoconditions/include/cryptoconditions.h" -#ifdef ENABLE_WALLET -#include "wallet/wallet.h" -#endif - -#include - -#include - -#include - -using namespace std; - -void ScriptPubKeyToJSON(const CScript& scriptPubKey, UniValue& out, bool fIncludeHex); - - -UniValue TxJoinSplitToJSONcc(const CTransaction& tx) { - UniValue vjoinsplit(UniValue::VARR); - for (unsigned int i = 0; i < tx.vjoinsplit.size(); i++) { - const JSDescription& jsdescription = tx.vjoinsplit[i]; - UniValue joinsplit(UniValue::VOBJ); - - joinsplit.push_back(Pair("vpub_old", ValueFromAmount(jsdescription.vpub_old))); - joinsplit.push_back(Pair("vpub_new", ValueFromAmount(jsdescription.vpub_new))); - - joinsplit.push_back(Pair("anchor", jsdescription.anchor.GetHex())); - - { - UniValue nullifiers(UniValue::VARR); - BOOST_FOREACH(const uint256 nf, jsdescription.nullifiers) { - nullifiers.push_back(nf.GetHex()); - } - joinsplit.push_back(Pair("nullifiers", nullifiers)); - } - - { - UniValue commitments(UniValue::VARR); - BOOST_FOREACH(const uint256 commitment, jsdescription.commitments) { - commitments.push_back(commitment.GetHex()); - } - joinsplit.push_back(Pair("commitments", commitments)); - } - - joinsplit.push_back(Pair("onetimePubKey", jsdescription.ephemeralKey.GetHex())); - joinsplit.push_back(Pair("randomSeed", jsdescription.randomSeed.GetHex())); - - { - UniValue macs(UniValue::VARR); - BOOST_FOREACH(const uint256 mac, jsdescription.macs) { - macs.push_back(mac.GetHex()); - } - joinsplit.push_back(Pair("macs", macs)); - } - - CDataStream ssProof(SER_NETWORK, PROTOCOL_VERSION); - ssProof << jsdescription.proof; - joinsplit.push_back(Pair("proof", HexStr(ssProof.begin(), ssProof.end()))); - - { - UniValue ciphertexts(UniValue::VARR); - for (const ZCNoteEncryption::Ciphertext ct : jsdescription.ciphertexts) { - ciphertexts.push_back(HexStr(ct.begin(), ct.end())); - } - joinsplit.push_back(Pair("ciphertexts", ciphertexts)); - } - - vjoinsplit.push_back(joinsplit); - } - return vjoinsplit; -} - -uint64_t komodo_interest(int32_t txheight,uint64_t nValue,uint32_t nLockTime,uint32_t tiptime); - -void TxToJSON(const CTransaction& tx, const uint256 hashBlock, UniValue& entry); - - -UniValue getrawtransactioncc(const UniValue& params, bool fHelp) -{ - if (fHelp || params.size() < 1 || params.size() > 2) - throw runtime_error( - "getrawtransaction \"txid\" ( verbose )\n" - "\nNOTE: By default this function only works sometimes. This is when the tx is in the mempool\n" - "or there is an unspent output in the utxo for this transaction. To make it always work,\n" - "you need to maintain a transaction index, using the -txindex command line option.\n" - "\nReturn the raw transaction data.\n" - "\nIf verbose=0, returns a string that is serialized, hex-encoded data for 'txid'.\n" - "If verbose is non-zero, returns an Object with information about 'txid'.\n" - - "\nArguments:\n" - "1. \"txid\" (string, required) The transaction id\n" - "2. verbose (numeric, optional, default=0) If 0, return a string, other return a json object\n" - - "\nResult (if verbose is not set or set to 0):\n" - "\"data\" (string) The serialized, hex-encoded data for 'txid'\n" - - "\nResult (if verbose > 0):\n" - "{\n" - " \"hex\" : \"data\", (string) The serialized, hex-encoded data for 'txid'\n" - " \"txid\" : \"id\", (string) The transaction id (same as provided)\n" - " \"version\" : n, (numeric) The version\n" - " \"locktime\" : ttt, (numeric) The lock time\n" - " \"vin\" : [ (array of json objects)\n" - " {\n" - " \"txid\": \"id\", (string) The transaction id\n" - " \"vout\": n, (numeric) \n" - " \"scriptSig\": { (json object) The script\n" - " \"asm\": \"asm\", (string) asm\n" - " \"hex\": \"hex\" (string) hex\n" - " },\n" - " \"sequence\": n (numeric) The script sequence number\n" - " }\n" - " ,...\n" - " ],\n" - " \"vout\" : [ (array of json objects)\n" - " {\n" - " \"value\" : x.xxx, (numeric) The value in btc\n" - " \"n\" : n, (numeric) index\n" - " \"scriptPubKey\" : { (json object)\n" - " \"asm\" : \"asm\", (string) the asm\n" - " \"hex\" : \"hex\", (string) the hex\n" - " \"reqSigs\" : n, (numeric) The required sigs\n" - " \"type\" : \"pubkeyhash\", (string) The type, eg 'pubkeyhash'\n" - " \"addresses\" : [ (json array of string)\n" - " \"bitcoinaddress\" (string) bitcoin address\n" - " ,...\n" - " ]\n" - " }\n" - " }\n" - " ,...\n" - " ],\n" - " \"vjoinsplit\" : [ (array of json objects, only for version >= 2)\n" - " {\n" - " \"vpub_old\" : x.xxx, (numeric) public input value in ZEC\n" - " \"vpub_new\" : x.xxx, (numeric) public output value in ZEC\n" - " \"anchor\" : \"hex\", (string) the anchor\n" - " \"nullifiers\" : [ (json array of string)\n" - " \"hex\" (string) input note nullifier\n" - " ,...\n" - " ],\n" - " \"commitments\" : [ (json array of string)\n" - " \"hex\" (string) output note commitment\n" - " ,...\n" - " ],\n" - " \"onetimePubKey\" : \"hex\", (string) the onetime public key used to encrypt the ciphertexts\n" - " \"randomSeed\" : \"hex\", (string) the random seed\n" - " \"macs\" : [ (json array of string)\n" - " \"hex\" (string) input note MAC\n" - " ,...\n" - " ],\n" - " \"proof\" : \"hex\", (string) the zero-knowledge proof\n" - " \"ciphertexts\" : [ (json array of string)\n" - " \"hex\" (string) output note ciphertext\n" - " ,...\n" - " ]\n" - " }\n" - " ,...\n" - " ],\n" - " \"blockhash\" : \"hash\", (string) the block hash\n" - " \"confirmations\" : n, (numeric) The confirmations\n" - " \"time\" : ttt, (numeric) The transaction time in seconds since epoch (Jan 1 1970 GMT)\n" - " \"blocktime\" : ttt (numeric) The block time in seconds since epoch (Jan 1 1970 GMT)\n" - "}\n" - - "\nExamples:\n" - + HelpExampleCli("getrawtransaction", "\"mytxid\"") - + HelpExampleCli("getrawtransaction", "\"mytxid\" 1") - + HelpExampleRpc("getrawtransaction", "\"mytxid\", 1") - ); - - LOCK(cs_main); - - uint256 hash = ParseHashV(params[0], "parameter 1"); - - bool fVerbose = false; - if (params.size() > 1) - fVerbose = (params[1].get_int() != 0); - - CTransaction tx; - uint256 hashBlock; - if (!GetTransaction(hash, tx, hashBlock, true)) - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "No information available about transaction"); - - string strHex = EncodeHexTx(tx); - - if (!fVerbose) - return strHex; - - UniValue result(UniValue::VOBJ); - result.push_back(Pair("hex", strHex)); - TxToJSON(tx, hashBlock, result); - return result; -} - -int32_t gettxout_scriptPubKeycc(uint8_t *scriptPubKey,int32_t maxsize,uint256 txid,int32_t n) -{ - int32_t i,m; uint8_t *ptr; - LOCK(cs_main); - /*CCoins coins; - for (iter=0; iter<2; iter++) - { - if ( iter == 0 ) - { - LOCK(mempool.cs); - CCoinsViewMemPool view(pcoinsTip,mempool); - if ( view.GetCoins(txid,coins) == 0 ) - { - //fprintf(stderr,"cant get view\n"); - continue; - } - mempool.pruneSpent(txid, coins); // TODO: this should be done by the CCoinsViewMemPool - } - else if ( pcoinsTip->GetCoins(txid,coins) == 0 ) - { - //fprintf(stderr,"cant get pcoinsTip->GetCoins\n"); - continue; - } - if ( n < 0 || (unsigned int)n >= coins.vout.size() || coins.vout[n].IsNull() ) - { - fprintf(stderr,"iter.%d n.%d vs voutsize.%d\n",iter,n,(int32_t)coins.vout.size()); - continue; - } - ptr = (uint8_t *)coins.vout[n].scriptPubKey.data(); - m = coins.vout[n].scriptPubKey.size(); - for (i=0; i setTxids; - uint256 oneTxid; - UniValue txids = params[0].get_array(); - for (size_t idx = 0; idx < txids.size(); idx++) { - const UniValue& txid = txids[idx]; - if (txid.get_str().length() != 64 || !IsHex(txid.get_str())) - throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid txid ")+txid.get_str()); - uint256 hash(uint256S(txid.get_str())); - if (setTxids.count(hash)) - throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid parameter, duplicated txid: ")+txid.get_str()); - setTxids.insert(hash); - oneTxid = hash; - } - - LOCK(cs_main); - - CBlockIndex* pblockindex = NULL; - - uint256 hashBlock; - if (params.size() > 1) - { - hashBlock = uint256S(params[1].get_str()); - if (!mapBlockIndex.count(hashBlock)) - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found"); - pblockindex = mapBlockIndex[hashBlock]; - } else { - CCoins coins; - if (pcoinsTip->GetCoins(oneTxid, coins) && coins.nHeight > 0 && coins.nHeight <= chainActive.Height()) - pblockindex = chainActive[coins.nHeight]; - } - - if (pblockindex == NULL) - { - CTransaction tx; - if (!GetTransaction(oneTxid, tx, hashBlock, false) || hashBlock.IsNull()) - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Transaction not yet in block"); - if (!mapBlockIndex.count(hashBlock)) - throw JSONRPCError(RPC_INTERNAL_ERROR, "Transaction index corrupt"); - pblockindex = mapBlockIndex[hashBlock]; - } - - CBlock block; - if(!ReadBlockFromDisk(block, pblockindex)) - throw JSONRPCError(RPC_INTERNAL_ERROR, "Can't read block from disk"); - - unsigned int ntxFound = 0; - BOOST_FOREACH(const CTransaction&tx, block.vtx) - if (setTxids.count(tx.GetHash())) - ntxFound++; - if (ntxFound != setTxids.size()) - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "(Not all) transactions not found in specified block"); - - CDataStream ssMB(SER_NETWORK, PROTOCOL_VERSION); - CMerkleBlock mb(block, setTxids); - ssMB << mb; - std::string strHex = HexStr(ssMB.begin(), ssMB.end()); - return strHex; -} - -UniValue verifytxoutproofcc(const UniValue& params, bool fHelp) -{ - if (fHelp || params.size() != 1) - throw runtime_error( - "verifytxoutproof \"proof\"\n" - "\nVerifies that a proof points to a transaction in a block, returning the transaction it commits to\n" - "and throwing an RPC error if the block is not in our best chain\n" - "\nArguments:\n" - "1. \"proof\" (string, required) The hex-encoded proof generated by gettxoutproof\n" - "\nResult:\n" - "[\"txid\"] (array, strings) The txid(s) which the proof commits to, or empty array if the proof is invalid\n" - ); - - CDataStream ssMB(ParseHexV(params[0], "proof"), SER_NETWORK, PROTOCOL_VERSION); - CMerkleBlock merkleBlock; - ssMB >> merkleBlock; - - UniValue res(UniValue::VARR); - - vector vMatch; - if (merkleBlock.txn.ExtractMatches(vMatch) != merkleBlock.header.hashMerkleRoot) - return res; - - LOCK(cs_main); - - if (!mapBlockIndex.count(merkleBlock.header.GetHash()) || !chainActive.Contains(mapBlockIndex[merkleBlock.header.GetHash()])) - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found in chain"); - - BOOST_FOREACH(const uint256& hash, vMatch) - res.push_back(hash.GetHex()); - return res; -} - - -CC *ConditionFromString(std::string encoded) { - char *err = new char[1000]; - CC *cond = cc_conditionFromJSONString(encoded.c_str(), err); - if (NULL == cond) - throw JSONRPCError(RPC_INVALID_PARAMETER, err); -} - - -CC *ConditionFromCharVector(vector& vch) { - return ConditionFromString(std::string(vch.begin(), vch.end())); -} - - -CC *ConditionFromUnsignedInputScript(const CScript& script) -{ - opcodetype op; - CScript::const_iterator it = script.begin(); - - vector vch; - if (script.GetOp2(it, op, &vch)) { - if (vch.at(0) == '{') { - return ConditionFromCharVector(vch); - } - } - return NULL; -} - - -CC *ConditionFromValue(UniValue value) { - std::string conditionEncoded = value.write(); - // TODO: Is null? - return ConditionFromString(conditionEncoded); -} - -UniValue createrawtransactioncc(const UniValue& params, bool fHelp) -{ - if (fHelp || params.size() != 2) - throw runtime_error( - "createrawtransactioncc [{\"txid\":\"id\",\"vout\":n,\"fulfillment\":{...}},...] {\"address\":amount,...}\n" - "\nCreate a transaction spending the given inputs and sending to the given addresses.\n" - "Returns hex-encoded raw transaction.\n" - "Note that the transaction's inputs are not signed, and\n" - "it is not stored in the wallet or transmitted to the network.\n" - - "\nArguments:\n" - "1. \"inputs\" (string, required) A json array of json objects\n" - " [\n" - " {\n" - " \"txid\":\"id\", (string, required) The transaction id\n" - " \"vout\":n, (numeric, required) The output number\n" - " \"fulfillment\":{...} (object, required) The JSON encoded cryptocondition fulfillment for the previous transaction's output\n" - " }\n" - " ,...\n" - " ]\n" - "2. \"outputs\" (string, required) a json array with addresses as keys and amounts as values\n" - " {\n" - " \"condition\":\"{...}\" (object, required) The JSON encoded condition\n" - " \"amount\":n, (numeric, required) The coin amount in satoshis\n" - " }\n" - - "\nResult:\n" - "\"transaction\" (string) hex string of the transaction\n" - - // "\nExamples\n" - // + HelpExampleCli("createrawtransactioncc", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\" \"{\\\"address\\\":0.01}\"") - // + HelpExampleRpc("createrawtransactioncc", "\"[{\\\"txid\\\":\\\"myid\\\",\\\"vout\\\":0}]\", \"{\\\"address\\\":0.01}\"") - ); - - LOCK(cs_main); - //RPCTypeCheck(params, boost::assign::list_of(UniValue::VARR)(UniValue::VARR)); - - UniValue inputs = params[0].get_array(); - UniValue outputs = params[1].get_array(); - - CMutableTransaction rawTx; - - for (size_t idx = 0; idx < inputs.size(); idx++) { - const UniValue& input = inputs[idx]; - const UniValue& o = input.get_obj(); - - uint256 txid = ParseHashO(o, "txid"); - - const UniValue& vout_v = find_value(o, "vout"); - if (!vout_v.isNum()) - throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, missing vout key"); - int nOutput = vout_v.get_int(); - if (nOutput < 0) - throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, vout must be positive"); - - const UniValue& ffill_v = find_value(input, "fulfillment"); - if (!ffill_v.isObject()) { - throw JSONRPCError(RPC_INVALID_PARAMETER, "\"fulfillment\" missing or not an object"); - } - const std::string ffillEncoded = ffill_v.write(); - - // Validate the fulfillment - CC *cond = ConditionFromString(ffillEncoded); - if (cond == NULL) { - throw JSONRPCError(RPC_INVALID_PARAMETER, "\"fulfillment\" not a valid JSON encoded crypto condition"); - } - cc_free(cond); - - CScript inputScript; - const std::vector ffill(ffillEncoded.c_str(), ffillEncoded.c_str() + ffillEncoded.size()); - inputScript << ffill; - - CTxIn in(COutPoint(txid, nOutput), inputScript); - rawTx.vin.push_back(in); - } - - for (size_t idx = 0; idx < outputs.size(); idx++) { - const UniValue& output = outputs[idx].get_obj(); - - // This does not need to be fulfilled, we just want the condition binary - CC *cond = ConditionFromValue(find_value(output, "condition")); - - char *condBin = new char[1000]; - size_t binLength = cc_conditionBinary(cond, condBin); - const std::vector condVec(condBin, condBin + binLength); - - CScript redeemScript; - redeemScript << condVec << OP_CHECKCRYPTOCONDITIONVERIFY; - - CAmount nAmount = AmountFromValue(find_value(output, "amount")); - - CTxOut out(nAmount, redeemScript); - rawTx.vout.push_back(out); - } - - return EncodeHexTx(rawTx); -} - -UniValue decoderawtransactioncc(const UniValue& params, bool fHelp) -{ - if (fHelp || params.size() != 1) - throw runtime_error( - "decoderawtransaction \"hexstring\"\n" - "\nReturn a JSON object representing the serialized, hex-encoded transaction.\n" - - "\nArguments:\n" - "1. \"hex\" (string, required) The transaction hex string\n" - - "\nResult:\n" - "{\n" - " \"txid\" : \"id\", (string) The transaction id\n" - " \"version\" : n, (numeric) The version\n" - " \"locktime\" : ttt, (numeric) The lock time\n" - " \"vin\" : [ (array of json objects)\n" - " {\n" - " \"txid\": \"id\", (string) The transaction id\n" - " \"vout\": n, (numeric) The output number\n" - " \"scriptSig\": { (json object) The script\n" - " \"asm\": \"asm\", (string) asm\n" - " \"hex\": \"hex\" (string) hex\n" - " },\n" - " \"sequence\": n (numeric) The script sequence number\n" - " }\n" - " ,...\n" - " ],\n" - " \"vout\" : [ (array of json objects)\n" - " {\n" - " \"value\" : x.xxx, (numeric) The value in btc\n" - " \"n\" : n, (numeric) index\n" - " \"scriptPubKey\" : { (json object)\n" - " \"asm\" : \"asm\", (string) the asm\n" - " \"hex\" : \"hex\", (string) the hex\n" - " \"reqSigs\" : n, (numeric) The required sigs\n" - " \"type\" : \"pubkeyhash\", (string) The type, eg 'pubkeyhash'\n" - " \"addresses\" : [ (json array of string)\n" - " \"12tvKAXCxZjSmdNbao16dKXC8tRWfcF5oc\" (string) bitcoin address\n" - " ,...\n" - " ]\n" - " }\n" - " }\n" - " ,...\n" - " ],\n" - " \"vjoinsplit\" : [ (array of json objects, only for version >= 2)\n" - " {\n" - " \"vpub_old\" : x.xxx, (numeric) public input value in ZEC\n" - " \"vpub_new\" : x.xxx, (numeric) public output value in ZEC\n" - " \"anchor\" : \"hex\", (string) the anchor\n" - " \"nullifiers\" : [ (json array of string)\n" - " \"hex\" (string) input note nullifier\n" - " ,...\n" - " ],\n" - " \"commitments\" : [ (json array of string)\n" - " \"hex\" (string) output note commitment\n" - " ,...\n" - " ],\n" - " \"onetimePubKey\" : \"hex\", (string) the onetime public key used to encrypt the ciphertexts\n" - " \"randomSeed\" : \"hex\", (string) the random seed\n" - " \"macs\" : [ (json array of string)\n" - " \"hex\" (string) input note MAC\n" - " ,...\n" - " ],\n" - " \"proof\" : \"hex\", (string) the zero-knowledge proof\n" - " \"ciphertexts\" : [ (json array of string)\n" - " \"hex\" (string) output note ciphertext\n" - " ,...\n" - " ]\n" - " }\n" - " ,...\n" - " ],\n" - "}\n" - - "\nExamples:\n" - + HelpExampleCli("decoderawtransaction", "\"hexstring\"") - + HelpExampleRpc("decoderawtransaction", "\"hexstring\"") - ); - - LOCK(cs_main); - RPCTypeCheck(params, boost::assign::list_of(UniValue::VSTR)); - - CTransaction tx; - - if (!DecodeHexTx(tx, params[0].get_str())) - throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed"); - - UniValue result(UniValue::VOBJ); - TxToJSON(tx, uint256(), result); - - return result; -} - -/** Pushes a JSON object for script verification or signing errors to vErrorsRet. */ -static void TxInErrorToJSON(const CTxIn& txin, UniValue& vErrorsRet, const std::string& strMessage) {} - - -UniValue signrawtransactioncc(const UniValue& params, bool fHelp) -{ - if (fHelp || params.size() < 1 || params.size() > 2) - throw runtime_error( - "signrawtransactioncc \"hexstring\" ( [\"privatekey1\",...] sighashtype )\n" - "\nSign cryptocondition inputs for raw transaction (serialized, hex-encoded).\n" - "The second optional argument (may be null) is an array of previous transaction outputs that\n" - "this transaction depends on but may not yet be in the block chain.\n" - "The third optional argument (may be null) is an array of base58-encoded private\n" - "keys that, if given, will be the only keys used to sign the transaction.\n" -#ifdef ENABLE_WALLET - + HelpRequiringPassphrase() + "\n" -#endif - - "\nArguments:\n" - "1. \"hexstring\" (string, required) The transaction hex string\n" - "2. \"privatekeys\" (string, optional) A json array of base58-encoded private keys for signing\n" - " [ (json array of strings, or 'null' if none provided)\n" - " \"privatekey\" (string) private key in base58-encoding\n" - " ,...\n" - " ]\n" - /* "4. \"sighashtype\" (string, optional, default=ALL) The signature hash type. Must be one of\n" - " \"ALL\"\n" - " \"NONE\"\n" - " \"SINGLE\"\n" - " \"ALL|ANYONECANPAY\"\n" - " \"NONE|ANYONECANPAY\"\n" - " \"SINGLE|ANYONECANPAY\"\n" */ - - "\nResult:\n" - "{\n" - " \"hex\" : \"value\", (string) The hex-encoded raw transaction with signature(s)\n" - " \"complete\" : true|false, (boolean) If the transaction has a complete set of signatures\n" - " \"errors\" : [ (json array of objects) Script verification errors (if there are any)\n" - " {\n" - " \"txid\" : \"hash\", (string) The hash of the referenced, previous transaction\n" - " \"vout\" : n, (numeric) The index of the output to spent and used as input\n" - " \"scriptSig\" : \"hex\", (string) The hex-encoded signature script\n" - " \"sequence\" : n, (numeric) Script sequence number\n" - " \"error\" : \"text\" (string) Verification or signing error related to the input\n" - " }\n" - " ,...\n" - " ]\n" - "}\n" - - "\nExamples:\n" - + HelpExampleCli("signrawtransactioncc", "\"myhex\"") - + HelpExampleRpc("signrawtransactioncc", "\"myhex\"") - ); - -#ifdef ENABLE_WALLET - LOCK2(cs_main, pwalletMain ? &pwalletMain->cs_wallet : NULL); -#else - LOCK(cs_main); -#endif - RPCTypeCheck(params, boost::assign::list_of(UniValue::VSTR)(UniValue::VARR)(UniValue::VARR)(UniValue::VSTR), true); - - vector txData(ParseHexV(params[0], "argument 1")); - CDataStream ssData(txData, SER_NETWORK, PROTOCOL_VERSION); - vector txVariants; - while (!ssData.empty()) { - //try { - CMutableTransaction tx; - ssData >> tx; - txVariants.push_back(tx); - //} - //catch (const std::exception&) { - //throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed"); - //} - } - - if (txVariants.empty()) - throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Missing transaction"); - - // mergedTx will end up with all the signatures; it - // starts as a clone of the rawtx: - CMutableTransaction mergedTx(txVariants[0]); - - bool fGivenKeys = false; - CBasicKeyStore tempKeystore; - if (params.size() > 2 && !params[2].isNull()) { - fGivenKeys = true; - UniValue keys = params[2].get_array(); - for (size_t idx = 0; idx < keys.size(); idx++) { - UniValue k = keys[idx]; - CBitcoinSecret vchSecret; - bool fGood = vchSecret.SetString(k.get_str()); - if (!fGood) - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid private key"); - CKey key = vchSecret.GetKey(); - if (!key.IsValid()) - throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Private key outside allowed range"); - tempKeystore.AddKey(key); - } - } -#ifdef ENABLE_WALLET - else if (pwalletMain) - EnsureWalletIsUnlocked(); -#endif - -#ifdef ENABLE_WALLET - const CKeyStore& keystore = ((fGivenKeys || !pwalletMain) ? tempKeystore : *pwalletMain); -#else - const CKeyStore& keystore = tempKeystore; -#endif - - int nHashType = SIGHASH_ALL; - /* - if (params.size() > 3 && !params[3].isNull()) { - static map mapSigHashValues = - boost::assign::map_list_of - (string("ALL"), int(SIGHASH_ALL)) - (string("ALL|ANYONECANPAY"), int(SIGHASH_ALL|SIGHASH_ANYONECANPAY)) - (string("NONE"), int(SIGHASH_NONE)) - (string("NONE|ANYONECANPAY"), int(SIGHASH_NONE|SIGHASH_ANYONECANPAY)) - (string("SINGLE"), int(SIGHASH_SINGLE)) - (string("SINGLE|ANYONECANPAY"), int(SIGHASH_SINGLE|SIGHASH_ANYONECANPAY)) - ; - string strHashType = params[3].get_str(); - if (mapSigHashValues.count(strHashType)) - nHashType = mapSigHashValues[strHashType]; - else - throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid sighash param"); - } - */ - - bool fHashSingle = ((nHashType & ~SIGHASH_ANYONECANPAY) == SIGHASH_SINGLE); - - // Script verification errors - UniValue vErrors(UniValue::VARR); - - // Sign what we can: - for (unsigned int i = 0; i < mergedTx.vin.size(); i++) { - CTxIn& txin = mergedTx.vin[i]; - - CC *cond; - - printf("Go\n"); - if (cond = ConditionFromUnsignedInputScript(txin.scriptSig)) { - printf("Found unsigned\n"); - continue; - } - printf("No luck\n"); - - /* - * Replace all this with detection of cryptoconditions spec and signing with each privkey - const CCoins* coins = view.AccessCoins(txin.prevout.hash); - if (coins == NULL || !coins->IsAvailable(txin.prevout.n)) { - TxInErrorToJSON(txin, vErrors, "Input not found or already spent"); - continue; - } - const CScript& prevPubKey = coins->vout[txin.prevout.n].scriptPubKey; - - txin.scriptSig.clear(); - // Only sign SIGHASH_SINGLE if there's a corresponding output: - if (!fHashSingle || (i < mergedTx.vout.size())) - SignSignature(keystore, prevPubKey, mergedTx, i, nHashType); - - // ... and merge in other signatures: - BOOST_FOREACH(const CMutableTransaction& txv, txVariants) { - txin.scriptSig = CombineSignatures(prevPubKey, mergedTx, i, txin.scriptSig, txv.vin[i].scriptSig); - } - ScriptError serror = SCRIPT_ERR_OK; - if (!VerifyScript(txin.scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, MutableTransactionSignatureChecker(&mergedTx, i), &serror)) { - TxInErrorToJSON(txin, vErrors, ScriptErrorString(serror)); - } - */ - } - bool fComplete = vErrors.empty(); - - UniValue result(UniValue::VOBJ); - result.push_back(Pair("hex", EncodeHexTx(mergedTx))); - result.push_back(Pair("complete", fComplete)); - if (!vErrors.empty()) { - result.push_back(Pair("errors", vErrors)); - } - - return result; -} - - -UniValue sendrawtransactioncc(const UniValue& params, bool fHelp) -{ - if (fHelp || params.size() < 1 || params.size() > 2) - throw runtime_error( - "sendrawtransaction \"hexstring\" ( allowhighfees )\n" - "\nSubmits raw transaction (serialized, hex-encoded) to local node and network.\n" - "\nAlso see createrawtransactioncc and signrawtransactioncc calls.\n" - "\nArguments:\n" - "1. \"hexstring\" (string, required) The hex string of the raw transaction)\n" - "2. allowhighfees (boolean, optional, default=false) Allow high fees\n" - "\nResult:\n" - "\"hex\" (string) The transaction hash in hex\n" - "\nExamples:\n" - "\nCreate a transaction\n" - + HelpExampleCli("createrawtransactioncc", "\"[{\\\"txid\\\" : \\\"mytxid\\\",\\\"vout\\\":0}]\" \"{\\\"myaddress\\\":0.01}\"") + - "Sign the transaction, and get back the hex\n" - + HelpExampleCli("signrawtransaction", "\"myhex\"") + - "\nSend the transaction (signed hex)\n" - + HelpExampleCli("sendrawtransaction", "\"signedhex\"") + - "\nAs a json rpc call\n" - + HelpExampleRpc("sendrawtransaction", "\"signedhex\"") - ); - - LOCK(cs_main); - RPCTypeCheck(params, boost::assign::list_of(UniValue::VSTR)(UniValue::VBOOL)); - - // parse hex string from parameter - CTransaction tx; - if (!DecodeHexTx(tx, params[0].get_str())) - throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed"); - uint256 hashTx = tx.GetHash(); - - bool fOverrideFees = false; - if (params.size() > 1) - fOverrideFees = params[1].get_bool(); - - CCoinsViewCache &view = *pcoinsTip; - const CCoins* existingCoins = view.AccessCoins(hashTx); - bool fHaveMempool = mempool.exists(hashTx); - bool fHaveChain = existingCoins && existingCoins->nHeight < 1000000000; - if (!fHaveMempool && !fHaveChain) { - // push to local node and sync with wallets - CValidationState state; - bool fMissingInputs; - if (!AcceptToMemoryPool(mempool, state, tx, false, &fMissingInputs, !fOverrideFees)) { - if (state.IsInvalid()) { - throw JSONRPCError(RPC_TRANSACTION_REJECTED, strprintf("%i: %s", state.GetRejectCode(), state.GetRejectReason())); - } else { - if (fMissingInputs) { - throw JSONRPCError(RPC_TRANSACTION_ERROR, "Missing inputs"); - } - throw JSONRPCError(RPC_TRANSACTION_ERROR, state.GetRejectReason()); - } - } - } else if (fHaveChain) { - throw JSONRPCError(RPC_TRANSACTION_ALREADY_IN_CHAIN, "transaction already in block chain"); - } - RelayTransaction(tx); - - return hashTx.GetHex(); -} diff --git a/src/rpcserver.cpp b/src/rpcserver.cpp index 06c08a3be09..518ba4693da 100644 --- a/src/rpcserver.cpp +++ b/src/rpcserver.cpp @@ -325,8 +325,6 @@ static const CRPCCommand vRPCCommands[] = { "rawtransactions", "getrawtransaction", &getrawtransaction, true }, { "rawtransactions", "sendrawtransaction", &sendrawtransaction, false }, { "rawtransactions", "signrawtransaction", &signrawtransaction, false }, /* uses wallet if enabled */ - { "rawtransactions", "createrawtransactioncc", &createrawtransactioncc, true }, - { "rawtransactions", "signrawtransactioncc", &signrawtransactioncc, false }, /* uses wallet if enabled */ #ifdef ENABLE_WALLET { "rawtransactions", "fundrawtransaction", &fundrawtransaction, false }, #endif diff --git a/src/rpcserver.h b/src/rpcserver.h index 611abd05fdb..ecf7b0573fd 100644 --- a/src/rpcserver.h +++ b/src/rpcserver.h @@ -262,9 +262,6 @@ extern UniValue sendrawtransaction(const UniValue& params, bool fHelp); extern UniValue gettxoutproof(const UniValue& params, bool fHelp); extern UniValue verifytxoutproof(const UniValue& params, bool fHelp); -extern UniValue createrawtransactioncc(const UniValue& params, bool fHelp); // in rpccryptocondition.cpp -extern UniValue signrawtransactioncc(const UniValue& params, bool fHelp); - extern UniValue getblockcount(const UniValue& params, bool fHelp); // in rpcblockchain.cpp extern UniValue getbestblockhash(const UniValue& params, bool fHelp); extern UniValue getdifficulty(const UniValue& params, bool fHelp); From a99ca25a5adfc520fff84bcf5156917cebda7d54 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Sat, 17 Feb 2018 02:03:34 -0300 Subject: [PATCH 0016/1081] cryptocondition transaction is standard too --- src/script/script.cpp | 23 +++++++++++++++++++++++ src/script/script.h | 2 ++ src/script/standard.cpp | 7 +++++++ src/script/standard.h | 1 + 4 files changed, 33 insertions(+) diff --git a/src/script/script.cpp b/src/script/script.cpp index 3cb3f855d66..a78bd7e292e 100644 --- a/src/script/script.cpp +++ b/src/script/script.cpp @@ -223,6 +223,29 @@ bool CScript::IsPayToScriptHash() const this->at(22) == OP_EQUAL); } +bool CScript::IsPayToCryptoCondition() const +{ + const_iterator pc = this->begin(); + vector data; + int i; + while (pc < this->end()) + { + opcodetype opcode; + if (!this->GetOp(pc, opcode, data)) + return 0; + if (0 == i) + if (opcode != OP_PUSHDATA1) + return 0; + if (1 == i) + if (opcode != OP_CHECKCRYPTOCONDITION) + return 0; + if (i > 1) + return 0; + i++; + } + return 1; +} + bool CScript::IsPushOnly() const { const_iterator pc = begin(); diff --git a/src/script/script.h b/src/script/script.h index 584fefac12f..800289a1590 100644 --- a/src/script/script.h +++ b/src/script/script.h @@ -176,6 +176,7 @@ enum opcodetype OP_PUBKEYS = 0xfb, OP_PUBKEYHASH = 0xfd, OP_PUBKEY = 0xfe, + OP_CRYPTOCONDITION = 0xfc, OP_INVALIDOPCODE = 0xff, }; @@ -563,6 +564,7 @@ class CScript : public std::vector unsigned int GetSigOpCount(const CScript& scriptSig) const; bool IsPayToScriptHash() const; + bool IsPayToCryptoCondition() const; /** Called by IsStandardTx and P2SH/BIP62 VerifyScript (which makes it consensus-critical). */ bool IsPushOnly() const; diff --git a/src/script/standard.cpp b/src/script/standard.cpp index 71838853def..c304840f485 100644 --- a/src/script/standard.cpp +++ b/src/script/standard.cpp @@ -68,6 +68,13 @@ bool Solver(const CScript& scriptPubKey, txnouttype& typeRet, vector Date: Sun, 18 Feb 2018 18:49:04 -0300 Subject: [PATCH 0017/1081] enable cryptoconditions spending --- src/script/script.cpp | 23 ++++++++++++++--------- src/script/standard.cpp | 4 +++- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/script/script.cpp b/src/script/script.cpp index a78bd7e292e..c5eab8ca844 100644 --- a/src/script/script.cpp +++ b/src/script/script.cpp @@ -227,21 +227,26 @@ bool CScript::IsPayToCryptoCondition() const { const_iterator pc = this->begin(); vector data; - int i; + int i = 0; while (pc < this->end()) { opcodetype opcode; if (!this->GetOp(pc, opcode, data)) return 0; - if (0 == i) - if (opcode != OP_PUSHDATA1) - return 0; - if (1 == i) - if (opcode != OP_CHECKCRYPTOCONDITION) + switch (i++) { + case 0: + // Binary condition should be less than 76 bytes + if (!(opcode > OP_0 && opcode < OP_PUSHDATA1)) + return 0; + break; + case 1: + if (opcode != OP_CHECKCRYPTOCONDITION) + return 0; + break; + default: return 0; - if (i > 1) - return 0; - i++; + break; + } } return 1; } diff --git a/src/script/standard.cpp b/src/script/standard.cpp index c304840f485..4dadaff5682 100644 --- a/src/script/standard.cpp +++ b/src/script/standard.cpp @@ -71,7 +71,7 @@ bool Solver(const CScript& scriptPubKey, txnouttype& typeRet, vector Date: Sun, 18 Feb 2018 19:35:48 -0300 Subject: [PATCH 0018/1081] make IsPayToCryptoCondition neat --- src/script/script.cpp | 31 +++++++++---------------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/src/script/script.cpp b/src/script/script.cpp index c5eab8ca844..5069d915296 100644 --- a/src/script/script.cpp +++ b/src/script/script.cpp @@ -227,28 +227,15 @@ bool CScript::IsPayToCryptoCondition() const { const_iterator pc = this->begin(); vector data; - int i = 0; - while (pc < this->end()) - { - opcodetype opcode; - if (!this->GetOp(pc, opcode, data)) - return 0; - switch (i++) { - case 0: - // Binary condition should be less than 76 bytes - if (!(opcode > OP_0 && opcode < OP_PUSHDATA1)) - return 0; - break; - case 1: - if (opcode != OP_CHECKCRYPTOCONDITION) - return 0; - break; - default: - return 0; - break; - } - } - return 1; + opcodetype opcode; + if (this->GetOp(pc, opcode, data)) + // Sha256 conditions are <76 bytes + if (opcode > OP_0 && opcode < OP_PUSHDATA1) + if (this->GetOp(pc, opcode, data)) + if (opcode == OP_CHECKCRYPTOCONDITION) + if (pc == this->end()) + return 1; + return 0; } bool CScript::IsPushOnly() const From 6263d4023951ec1ae40b416e551446bcd273e1f9 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Sun, 18 Feb 2018 20:38:29 -0300 Subject: [PATCH 0019/1081] guard cryptoconditions --- src/script/interpreter.cpp | 5 ++++- src/script/standard.cpp | 13 ++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 94727cbcadc..f203ccf85e2 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -940,7 +940,9 @@ bool EvalScript(vector >& stack, const CScript& script, un case OP_CHECKCRYPTOCONDITION: case OP_CHECKCRYPTOCONDITIONVERIFY: { - // (fulfillment condition -- bool) + if (!IsCryptoConditionsEnabled()) { + goto INTERPRETER_DEFAULT; + } if (stack.size() < 2) return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); @@ -982,6 +984,7 @@ bool EvalScript(vector >& stack, const CScript& script, un } break; +INTERPRETER_DEFAULT: default: return set_error(serror, SCRIPT_ERR_BAD_OPCODE); } diff --git a/src/script/standard.cpp b/src/script/standard.cpp index 4dadaff5682..308f4e0856a 100644 --- a/src/script/standard.cpp +++ b/src/script/standard.cpp @@ -9,6 +9,7 @@ #include "script/script.h" #include "util.h" #include "utilstrencodings.h" +#include "komodo_cryptoconditions.h" #include @@ -68,11 +69,13 @@ bool Solver(const CScript& scriptPubKey, txnouttype& typeRet, vector Date: Sun, 18 Feb 2018 20:40:24 -0300 Subject: [PATCH 0020/1081] guard cryptoconditions --- src/komodo_cryptoconditions.h | 13 ++++++++++++- src/script/interpreter.cpp | 6 ++++-- src/script/standard.cpp | 13 ++++++++----- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/komodo_cryptoconditions.h b/src/komodo_cryptoconditions.h index d5e643c91ae..3cfc15e1259 100644 --- a/src/komodo_cryptoconditions.h +++ b/src/komodo_cryptoconditions.h @@ -1,8 +1,19 @@ +#ifndef KOMODO_CRYPTOCONDITIONS_H +#define KOMODO_CRYPTOCONDITIONS_H +#include "cryptoconditions/include/cryptoconditions.h" + +extern int32_t ASSETCHAINS_CC; + +static bool IsCryptoConditionsEnabled() { + return 0 != ASSETCHAINS_CC; +} /* * Method stub for aux conditions. Unimplemented, thus fails if an aux condition is encountered. */ -int komodoCCAux(CC *cond, void *context) { +static int komodoCCAux(CC *cond, void *context) { return 0; } + +#endif /* KOMODO_CRYPTOCONDITIONS_H */ diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 94727cbcadc..4e03527a411 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -13,7 +13,6 @@ #include "pubkey.h" #include "script/script.h" #include "uint256.h" -#include "cryptoconditions/include/cryptoconditions.h" #include "komodo_cryptoconditions.h" @@ -940,7 +939,9 @@ bool EvalScript(vector >& stack, const CScript& script, un case OP_CHECKCRYPTOCONDITION: case OP_CHECKCRYPTOCONDITIONVERIFY: { - // (fulfillment condition -- bool) + if (!IsCryptoConditionsEnabled()) { + goto INTERPRETER_DEFAULT; + } if (stack.size() < 2) return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); @@ -982,6 +983,7 @@ bool EvalScript(vector >& stack, const CScript& script, un } break; +INTERPRETER_DEFAULT: default: return set_error(serror, SCRIPT_ERR_BAD_OPCODE); } diff --git a/src/script/standard.cpp b/src/script/standard.cpp index 4dadaff5682..60f059ac369 100644 --- a/src/script/standard.cpp +++ b/src/script/standard.cpp @@ -9,6 +9,7 @@ #include "script/script.h" #include "util.h" #include "utilstrencodings.h" +#include "komodo_cryptoconditions.h" #include @@ -68,11 +69,13 @@ bool Solver(const CScript& scriptPubKey, txnouttype& typeRet, vector Date: Sun, 18 Feb 2018 21:48:58 -0300 Subject: [PATCH 0021/1081] remove test file that shoudnt be there --- qa/test_rpc_cryptoconditions.py | 47 --------------------------------- 1 file changed, 47 deletions(-) delete mode 100644 qa/test_rpc_cryptoconditions.py diff --git a/qa/test_rpc_cryptoconditions.py b/qa/test_rpc_cryptoconditions.py deleted file mode 100644 index a93eab86aa1..00000000000 --- a/qa/test_rpc_cryptoconditions.py +++ /dev/null @@ -1,47 +0,0 @@ -import os -import subprocess -import json -import base64 - - -inputs = [ - { - 'txid': '9b907ef1e3c26fc71fe4a4b3580bc75264112f95050014157059c736f0202e71', - 'vout': 0, - 'fulfillment': { - 'type': 'preimage-sha-256', - 'preimage': '', - }, - } -] - -outputs = [ - { - "condition": { - 'type': 'preimage-sha-256', - 'preimage': '' - }, - "amount": 1, - } -] - -addresses = ['RQygCQA7ovCrVCHM3sSkDQjjQUg5X4SCJw'] -privkeys = ["UszeEw39HcoeRegZb74xuvngbcQ5jkwQZZVpAvBp1bvBhXD36ghX"] - - -proc = subprocess.Popen(['src/komodo-cli', 'createrawtransactioncc', json.dumps(inputs), json.dumps(outputs)], - stdout=subprocess.PIPE) - -assert not proc.wait() - -tx_hex = proc.stdout.read().strip() -tx = base64.b16decode(tx_hex, casefold=True) - -print repr(tx) - -proc = subprocess.Popen(['src/komodo-cli', 'signrawtransactioncc', tx_hex, json.dumps(privkeys)], - stdout=subprocess.PIPE) - -proc.wait() - -result = json.loads(proc.stdout.read()) From 4f0da23b911db5b9426dd9ef1076681552de459f Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Mon, 19 Feb 2018 01:22:27 -0300 Subject: [PATCH 0022/1081] integration test for hoek and komodod with -ac_cc --- qa/cryptoconditions/README.md | 1 + qa/cryptoconditions/test_integration.py | 78 +++++++++++++++++++++++++ qa/cryptoconditions/testsupport.py | 47 +++++++++++++++ 3 files changed, 126 insertions(+) create mode 100644 qa/cryptoconditions/README.md create mode 100644 qa/cryptoconditions/test_integration.py create mode 100644 qa/cryptoconditions/testsupport.py diff --git a/qa/cryptoconditions/README.md b/qa/cryptoconditions/README.md new file mode 100644 index 00000000000..6c8e01d60de --- /dev/null +++ b/qa/cryptoconditions/README.md @@ -0,0 +1 @@ +Integration tests for Crypto-Conditions diff --git a/qa/cryptoconditions/test_integration.py b/qa/cryptoconditions/test_integration.py new file mode 100644 index 00000000000..a47b458e184 --- /dev/null +++ b/qa/cryptoconditions/test_integration.py @@ -0,0 +1,78 @@ +import sys +import time +import json +from testsupport import * + + +def wait_for_block(height): + for i in range(100): + try: + return rpc.getblock(str(height)) + except RPCError as e: + time.sleep(3) + raise Exception('Time out waiting for block at height %s' % height) + + +def sign_and_submit(tx): + signed = hoek.signTxBitcoin({'tx': tx, 'privateKeys': [notary_sk]}) + signed = hoek.signTxEd25519({'tx': signed['tx'], 'privateKeys': [alice_sk]}) + encoded = hoek.encodeTx(signed) + try: + rpc.getrawtransaction(encoded['txid']) + return encoded['txid'] + except RPCError: + pass + print >> sys.stderr, "submit transaction: %s:%s" % (encoded['txid'], json.dumps(signed)) + return rpc.sendrawtransaction(encoded['hex']) + + +def test_basic_spend(): + block = wait_for_block(3) + reward_txid = block['tx'][0] + reward_tx_raw = rpc.getrawtransaction(reward_txid) + reward_tx = hoek.decodeTx({'hex': reward_tx_raw}) + balance = reward_tx['tx']['outputs'][0]['amount'] + + spend0 = { + 'inputs': [ + {'txid': reward_txid, 'idx': 0, 'script': {'pubkey': notary_pk}} + ], + "outputs": [ + {"amount": 1000, "script": {"condition": cond_alice}}, + {"amount": balance - 1000, "script": {"address": notary_addr}} + ] + } + + spend0_txid = sign_and_submit(spend0) + + spend1 = { + 'inputs': [ + {'txid': spend0_txid, 'idx': 0, 'script': {"fulfillment": cond_alice}}, + {'txid': spend0_txid, 'idx': 1, 'script': {'address': notary_addr}} + ], + 'outputs': [ + {"amount": balance, "script": {"address": notary_addr}} + ] + } + + spend1_txid = sign_and_submit(spend1) + + assert rpc.getrawtransaction(spend1_txid) + + print("all done!") + + +notary_addr = 'RXSwmXKtDURwXP7sdqNfsJ6Ga8RaxTchxE' +notary_pk = '0205a8ad0c1dbc515f149af377981aab58b836af008d4d7ab21bd76faf80550b47' +notary_sk = 'UxFWWxsf1d7w7K5TvAWSkeX4H95XQKwdwGv49DXwWUTzPTTjHBbU' +alice_pk = '8ryTLBMnozUK4xUz7y49fjzZhxDDMK7c4mucLdbVY6jW' +alice_sk = 'E4ER7uYvaSTdpQFzTXNNSTkR6jNRJyqhZPJMGuU899nY' +cond_alice = {"type": "ed25519-sha-256", "publicKey": alice_pk} + + + +if __name__ == '__main__': + hoek = Hoek() + rpc = Komodod('/home/scott/.komodo/CCWAT/CCWAT.conf') + test_basic_spend() + diff --git a/qa/cryptoconditions/testsupport.py b/qa/cryptoconditions/testsupport.py new file mode 100644 index 00000000000..166d98d149a --- /dev/null +++ b/qa/cryptoconditions/testsupport.py @@ -0,0 +1,47 @@ +import sys +import json +import subprocess + + +class RPCError(IOError): + pass + + +class JsonClient(object): + def __getattr__(self, method): + def inner(*args): + return self._exec(method, args) + return inner + + def load_response(self, data): + data = json.loads(data) + if data.get('error'): + raise RPCError(data['error']) + if 'result' in data: + return data['result'] + return data + + +def run_cmd(cmd): + proc = subprocess.Popen(cmd, stdout=subprocess.PIPE) + #print >>sys.stderr, "> %s" % repr(cmd)[1:-1] + assert proc.wait() == 0 + return proc.stdout.read() + + +class Hoek(JsonClient): + def _exec(self, method, args): + return self.load_response(run_cmd(['hoek', method, json.dumps(args[0])])) + + +class Komodod(JsonClient): + def __init__(self, conf_path): + urltpl = 'http://$rpcuser:$rpcpassword@${rpchost:-127.0.0.1}:$rpcport' + cmd = ['bash', '-c', '. "%s"; echo -n %s' % (conf_path, urltpl)] + self.url = run_cmd(cmd) + + def _exec(self, method, args): + req = {'method': method, 'params': args, 'id': 1} + cmd = ['curl', '-s', '-H', 'Content-Type: application/json', '-d', json.dumps(req), self.url] + return self.load_response(run_cmd(cmd)) + From a236c673fe6fee1464b967a672afa43904155940 Mon Sep 17 00:00:00 2001 From: libscott Date: Mon, 19 Feb 2018 01:37:54 -0300 Subject: [PATCH 0023/1081] Update cryptoconditions test suite README --- qa/cryptoconditions/README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/qa/cryptoconditions/README.md b/qa/cryptoconditions/README.md index 6c8e01d60de..d14ab5b7daa 100644 --- a/qa/cryptoconditions/README.md +++ b/qa/cryptoconditions/README.md @@ -1 +1,7 @@ -Integration tests for Crypto-Conditions +# Integration tests for Crypto-Conditions + +These tests are for the [Crypto-Conditions](https://github.com/rfcs/crypto-conditions) functionality in Komodod, using [Hoek](https://github.com/libscott/hoek) as a tool to create and sign transactions. + +The tests use Python as a scripting language and each one should "just work" given Linux and a 2.7+ Python interpreter. Each file prefixed with "test_" is a test case. + +The tests require `hoek` to be on the $PATH. Included is a script to perform a complete installation of `hoek`. From d17b8ec6a2cb6e86c45b443eabaff8c4d2aa3572 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Mon, 19 Feb 2018 03:22:26 -0300 Subject: [PATCH 0024/1081] use a fanout tx to create inputs --- qa/cryptoconditions/test_integration.py | 48 ++----------- qa/cryptoconditions/testsupport.py | 93 ++++++++++++++++++++++--- 2 files changed, 90 insertions(+), 51 deletions(-) diff --git a/qa/cryptoconditions/test_integration.py b/qa/cryptoconditions/test_integration.py index a47b458e184..0bb004aebe2 100644 --- a/qa/cryptoconditions/test_integration.py +++ b/qa/cryptoconditions/test_integration.py @@ -4,42 +4,14 @@ from testsupport import * -def wait_for_block(height): - for i in range(100): - try: - return rpc.getblock(str(height)) - except RPCError as e: - time.sleep(3) - raise Exception('Time out waiting for block at height %s' % height) - - -def sign_and_submit(tx): - signed = hoek.signTxBitcoin({'tx': tx, 'privateKeys': [notary_sk]}) - signed = hoek.signTxEd25519({'tx': signed['tx'], 'privateKeys': [alice_sk]}) - encoded = hoek.encodeTx(signed) - try: - rpc.getrawtransaction(encoded['txid']) - return encoded['txid'] - except RPCError: - pass - print >> sys.stderr, "submit transaction: %s:%s" % (encoded['txid'], json.dumps(signed)) - return rpc.sendrawtransaction(encoded['hex']) - - def test_basic_spend(): - block = wait_for_block(3) - reward_txid = block['tx'][0] - reward_tx_raw = rpc.getrawtransaction(reward_txid) - reward_tx = hoek.decodeTx({'hex': reward_tx_raw}) - balance = reward_tx['tx']['outputs'][0]['amount'] - spend0 = { 'inputs': [ - {'txid': reward_txid, 'idx': 0, 'script': {'pubkey': notary_pk}} + {'txid': fanout, 'idx': 0, 'script': {'address': notary_addr}} ], "outputs": [ - {"amount": 1000, "script": {"condition": cond_alice}}, - {"amount": balance - 1000, "script": {"address": notary_addr}} + {"amount": 500, "script": {"condition": cond_alice}}, + {"amount": 500, "script": {"address": notary_addr}} ] } @@ -51,7 +23,7 @@ def test_basic_spend(): {'txid': spend0_txid, 'idx': 1, 'script': {'address': notary_addr}} ], 'outputs': [ - {"amount": balance, "script": {"address": notary_addr}} + {"amount": 1000, "script": {"address": notary_addr}} ] } @@ -62,17 +34,7 @@ def test_basic_spend(): print("all done!") -notary_addr = 'RXSwmXKtDURwXP7sdqNfsJ6Ga8RaxTchxE' -notary_pk = '0205a8ad0c1dbc515f149af377981aab58b836af008d4d7ab21bd76faf80550b47' -notary_sk = 'UxFWWxsf1d7w7K5TvAWSkeX4H95XQKwdwGv49DXwWUTzPTTjHBbU' -alice_pk = '8ryTLBMnozUK4xUz7y49fjzZhxDDMK7c4mucLdbVY6jW' -alice_sk = 'E4ER7uYvaSTdpQFzTXNNSTkR6jNRJyqhZPJMGuU899nY' -cond_alice = {"type": "ed25519-sha-256", "publicKey": alice_pk} - - if __name__ == '__main__': - hoek = Hoek() - rpc = Komodod('/home/scott/.komodo/CCWAT/CCWAT.conf') + fanout = setup() test_basic_spend() - diff --git a/qa/cryptoconditions/testsupport.py b/qa/cryptoconditions/testsupport.py index 166d98d149a..c33a611d2b9 100644 --- a/qa/cryptoconditions/testsupport.py +++ b/qa/cryptoconditions/testsupport.py @@ -1,5 +1,7 @@ import sys import json +import time +import argparse import subprocess @@ -31,17 +33,92 @@ def run_cmd(cmd): class Hoek(JsonClient): def _exec(self, method, args): - return self.load_response(run_cmd(['hoek', method, json.dumps(args[0])])) + cmd = ['hoek', method, json.dumps(args[0])] + return self.load_response(run_cmd(cmd)) class Komodod(JsonClient): - def __init__(self, conf_path): - urltpl = 'http://$rpcuser:$rpcpassword@${rpchost:-127.0.0.1}:$rpcport' - cmd = ['bash', '-c', '. "%s"; echo -n %s' % (conf_path, urltpl)] - self.url = run_cmd(cmd) - def _exec(self, method, args): req = {'method': method, 'params': args, 'id': 1} - cmd = ['curl', '-s', '-H', 'Content-Type: application/json', '-d', json.dumps(req), self.url] + cmd = ['curl', '-s', '-H', 'Content-Type: application/json', + '-d', json.dumps(req), CONFIG['komodod_url']] return self.load_response(run_cmd(cmd)) - + + +rpc = Komodod() +hoek = Hoek() + + +def wait_for_block(height): + print >>sys.stderr, "Waiting for block height %s" % height + for i in range(100): + try: + return rpc.getblock(str(height)) + except RPCError as e: + time.sleep(3) + raise Exception('Time out waiting for block at height %s' % height) + + +def sign_and_submit(tx): + signed = hoek.signTxBitcoin({'tx': tx, 'privateKeys': [notary_sk]}) + signed = hoek.signTxEd25519({'tx': signed['tx'], 'privateKeys': [alice_sk]}) + encoded = hoek.encodeTx(signed) + try: + rpc.getrawtransaction(encoded['txid']) + print >> sys.stderr, "Transaction already in chain: %s" % encoded['txid'] + return encoded['txid'] + except RPCError: + pass + print >> sys.stderr, "submit transaction: %s:%s" % (encoded['txid'], json.dumps(signed)) + print encoded + return rpc.sendrawtransaction(encoded['hex']) + + + +CONFIG = None +FANOUT_TXID = None + + +def setup(): + global CONFIG, FANOUT_TXID + if not CONFIG: + parser = argparse.ArgumentParser(description='Crypto-Condition integration suite.') + parser.add_argument('komodod_conf', help='Location of Komodod config file') + args = parser.parse_args() + + urltpl = 'http://$rpcuser:$rpcpassword@${rpchost:-127.0.0.1}:$rpcport' + cmd = ['bash', '-c', '. %s && echo -n %s' % (args.komodod_conf, urltpl)] + url = run_cmd(cmd) + + CONFIG = {'komodod_url': url} + + if not FANOUT_TXID: + block = wait_for_block(1) + reward_txid = block['tx'][0] + reward_tx_raw = rpc.getrawtransaction(reward_txid) + reward_tx = hoek.decodeTx({'hex': reward_tx_raw}) + balance = reward_tx['tx']['outputs'][0]['amount'] + + n_outs = 100 + remainder = balance - n_outs * 1000 + + fanout = { + 'inputs': [ + {'txid': reward_txid, 'idx': 0, 'script': {'pubkey': notary_pk}} + ], + "outputs": (100 * [ + {"amount": 1000, "script": {"address": notary_addr}} + ] + [{"amount": remainder, 'script': {'address': notary_addr}}]) + } + + FANOUT_TXID = sign_and_submit(fanout) + + return FANOUT_TXID + + +notary_addr = 'RXSwmXKtDURwXP7sdqNfsJ6Ga8RaxTchxE' +notary_pk = '0205a8ad0c1dbc515f149af377981aab58b836af008d4d7ab21bd76faf80550b47' +notary_sk = 'UxFWWxsf1d7w7K5TvAWSkeX4H95XQKwdwGv49DXwWUTzPTTjHBbU' +alice_pk = '8ryTLBMnozUK4xUz7y49fjzZhxDDMK7c4mucLdbVY6jW' +alice_sk = 'E4ER7uYvaSTdpQFzTXNNSTkR6jNRJyqhZPJMGuU899nY' +cond_alice = {"type": "ed25519-sha-256", "publicKey": alice_pk} From 82e6c354304e25b50063071ae2c864b7104cbfd6 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Mon, 19 Feb 2018 15:16:14 -0300 Subject: [PATCH 0025/1081] test with invalid crypto-condition fulfillment --- qa/cryptoconditions/test_integration.py | 90 +++++++++++++++++++---- qa/cryptoconditions/testsupport.py | 96 +++++++++++++------------ 2 files changed, 125 insertions(+), 61 deletions(-) diff --git a/qa/cryptoconditions/test_integration.py b/qa/cryptoconditions/test_integration.py index 0bb004aebe2..87ee59825cb 100644 --- a/qa/cryptoconditions/test_integration.py +++ b/qa/cryptoconditions/test_integration.py @@ -1,40 +1,100 @@ import sys import time import json +import logging +import binascii from testsupport import * -def test_basic_spend(): +@fanout_input(0) +def test_basic_spend(inp): spend0 = { - 'inputs': [ - {'txid': fanout, 'idx': 0, 'script': {'address': notary_addr}} - ], + 'inputs': [inp], "outputs": [ {"amount": 500, "script": {"condition": cond_alice}}, {"amount": 500, "script": {"address": notary_addr}} ] } - - spend0_txid = sign_and_submit(spend0) - + spend0_txid = submit(sign(spend0)) spend1 = { 'inputs': [ {'txid': spend0_txid, 'idx': 0, 'script': {"fulfillment": cond_alice}}, {'txid': spend0_txid, 'idx': 1, 'script': {'address': notary_addr}} ], - 'outputs': [ - {"amount": 1000, "script": {"address": notary_addr}} - ] + 'outputs': [{"amount": 1000, "script": {"address": notary_addr}}] } + spend1_txid = submit(sign(spend1)) + assert rpc.getrawtransaction(spend1_txid) - spend1_txid = sign_and_submit(spend1) - assert rpc.getrawtransaction(spend1_txid) +@fanout_input(1) +def test_fulfillment_wrong_signature(inp): + spend0 = { + 'inputs': [inp], + "outputs": [{"amount": 1000, "script": {"condition": cond_bob}}] + } + spend0_txid = submit(sign(spend0)) + spend1 = { + 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {"fulfillment": cond_alice}}], + 'outputs': [{"amount": 1000, "script": {"address": notary_addr}}] + } + + signed = sign(spend1) + # Set the correct pubkey, signature is wrong + signed['tx']['inputs'][0]['script']['fulfillment']['publicKey'] = bob_pk + + try: + assert not submit(sign(spend1)), 'should raise an error' + except RPCError as e: + assert '16: mandatory-script-verify-flag-failed' in str(e), str(e) + - print("all done!") +@fanout_input(2) +def test_fulfillment_wrong_pubkey(inp): + spend0 = { + 'inputs': [inp], + "outputs": [{"amount": 1000, "script": {"condition": cond_alice}}] + } + spend0_txid = submit(sign(spend0)) + spend1 = { + 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {"fulfillment": cond_alice}}], + 'outputs': [{"amount": 1000, "script": {"address": notary_addr}}] + } + + signed = sign(spend1) + # Set the wrong pubkey, signature is correct + signed['tx']['inputs'][0]['script']['fulfillment']['publicKey'] = bob_pk + + try: + assert not submit(signed), 'should raise an error' + except RPCError as e: + assert '16: mandatory-script-verify-flag-failed' in str(e), str(e) + + +@fanout_input(3) +def test_fulfillment_invalid_fulfillment(inp): + spend0 = { + 'inputs': [inp], + "outputs": [{"amount": 1000, "script": {"condition": cond_alice}}] + } + spend0_txid = submit(sign(spend0)) + + # Create a valid script with an invalid fulfillment payload + script = binascii.hexlify(b"\007invalid").decode('utf-8') + + spend1 = { + 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': script}], + 'outputs': [{"amount": 1000, "script": {"address": notary_addr}}] + } + try: + assert not submit({'tx': spend1}), 'should raise an error' + except RPCError as e: + assert 'Crypto-Condition payload is invalid' in str(e), str(e) if __name__ == '__main__': - fanout = setup() - test_basic_spend() + for name, f in globals().items(): + if name.startswith('test_'): + logging.info("Running test: %s" % name) + f() diff --git a/qa/cryptoconditions/testsupport.py b/qa/cryptoconditions/testsupport.py index c33a611d2b9..aad64e32004 100644 --- a/qa/cryptoconditions/testsupport.py +++ b/qa/cryptoconditions/testsupport.py @@ -1,8 +1,10 @@ +from __future__ import print_function import sys import json import time -import argparse +import logging import subprocess +import functools class RPCError(IOError): @@ -11,12 +13,14 @@ class RPCError(IOError): class JsonClient(object): def __getattr__(self, method): + if method[0] == '_': + return getattr(super(JsonClient, self), method) def inner(*args): return self._exec(method, args) return inner def load_response(self, data): - data = json.loads(data) + data = json.loads(data.decode("utf-8")) if data.get('error'): raise RPCError(data['error']) if 'result' in data: @@ -26,7 +30,6 @@ def load_response(self, data): def run_cmd(cmd): proc = subprocess.Popen(cmd, stdout=subprocess.PIPE) - #print >>sys.stderr, "> %s" % repr(cmd)[1:-1] assert proc.wait() == 0 return proc.stdout.read() @@ -39,9 +42,13 @@ def _exec(self, method, args): class Komodod(JsonClient): def _exec(self, method, args): + if not hasattr(self, '_url'): + urltpl = 'http://$rpcuser:$rpcpassword@${rpchost:-127.0.0.1}:$rpcport' + cmd = ['bash', '-c', '. $KOMODO_CONF_PATH && echo -n %s' % urltpl] + self._url = run_cmd(cmd) + req = {'method': method, 'params': args, 'id': 1} - cmd = ['curl', '-s', '-H', 'Content-Type: application/json', - '-d', json.dumps(req), CONFIG['komodod_url']] + cmd = ['curl', '-s', '-H', 'Content-Type: application/json', '-d', json.dumps(req), self._url] return self.load_response(run_cmd(cmd)) @@ -50,7 +57,7 @@ def _exec(self, method, args): def wait_for_block(height): - print >>sys.stderr, "Waiting for block height %s" % height + logging.info("Waiting for block height %s" % height) for i in range(100): try: return rpc.getblock(str(height)) @@ -59,61 +66,55 @@ def wait_for_block(height): raise Exception('Time out waiting for block at height %s' % height) -def sign_and_submit(tx): +def sign(tx): signed = hoek.signTxBitcoin({'tx': tx, 'privateKeys': [notary_sk]}) - signed = hoek.signTxEd25519({'tx': signed['tx'], 'privateKeys': [alice_sk]}) - encoded = hoek.encodeTx(signed) + return hoek.signTxEd25519({'tx': signed['tx'], 'privateKeys': [alice_sk]}) + + +def submit(tx): + encoded = hoek.encodeTx(tx) try: rpc.getrawtransaction(encoded['txid']) - print >> sys.stderr, "Transaction already in chain: %s" % encoded['txid'] + logging.info("Transaction already in chain: %s" % encoded['txid']) return encoded['txid'] except RPCError: pass - print >> sys.stderr, "submit transaction: %s:%s" % (encoded['txid'], json.dumps(signed)) - print encoded + logging.info("submit transaction: %s:%s" % (encoded['txid'], json.dumps(tx))) return rpc.sendrawtransaction(encoded['hex']) +def get_fanout_txid(): + block = wait_for_block(1) + reward_txid = block['tx'][0] + reward_tx_raw = rpc.getrawtransaction(reward_txid) + reward_tx = hoek.decodeTx({'hex': reward_tx_raw}) + balance = reward_tx['tx']['outputs'][0]['amount'] -CONFIG = None -FANOUT_TXID = None - - -def setup(): - global CONFIG, FANOUT_TXID - if not CONFIG: - parser = argparse.ArgumentParser(description='Crypto-Condition integration suite.') - parser.add_argument('komodod_conf', help='Location of Komodod config file') - args = parser.parse_args() - - urltpl = 'http://$rpcuser:$rpcpassword@${rpchost:-127.0.0.1}:$rpcport' - cmd = ['bash', '-c', '. %s && echo -n %s' % (args.komodod_conf, urltpl)] - url = run_cmd(cmd) - - CONFIG = {'komodod_url': url} + n_outs = 100 + remainder = balance - n_outs * 1000 - if not FANOUT_TXID: - block = wait_for_block(1) - reward_txid = block['tx'][0] - reward_tx_raw = rpc.getrawtransaction(reward_txid) - reward_tx = hoek.decodeTx({'hex': reward_tx_raw}) - balance = reward_tx['tx']['outputs'][0]['amount'] + fanout = { + 'inputs': [ + {'txid': reward_txid, 'idx': 0, 'script': {'pubkey': notary_pk}} + ], + "outputs": (100 * [ + {"amount": 1000, "script": {"address": notary_addr}} + ] + [{"amount": remainder, 'script': {'address': notary_addr}}]) + } - n_outs = 100 - remainder = balance - n_outs * 1000 + return submit(sign(fanout)) - fanout = { - 'inputs': [ - {'txid': reward_txid, 'idx': 0, 'script': {'pubkey': notary_pk}} - ], - "outputs": (100 * [ - {"amount": 1000, "script": {"address": notary_addr}} - ] + [{"amount": remainder, 'script': {'address': notary_addr}}]) - } - FANOUT_TXID = sign_and_submit(fanout) +def fanout_input(n): + def decorate(f): + def wrapper(): + if not hasattr(fanout_input, 'txid'): + fanout_input.txid = get_fanout_txid() + inp = {'txid': fanout_input.txid, 'idx': n, 'script': {'address': notary_addr}} + f(inp) + return functools.wraps(f)(wrapper) + return decorate - return FANOUT_TXID notary_addr = 'RXSwmXKtDURwXP7sdqNfsJ6Ga8RaxTchxE' @@ -122,3 +123,6 @@ def setup(): alice_pk = '8ryTLBMnozUK4xUz7y49fjzZhxDDMK7c4mucLdbVY6jW' alice_sk = 'E4ER7uYvaSTdpQFzTXNNSTkR6jNRJyqhZPJMGuU899nY' cond_alice = {"type": "ed25519-sha-256", "publicKey": alice_pk} +bob_pk = 'C8MfEjKiFxDguacHvcM7MV83cRQ55RAHacC73xqg8qeu' +bob_sk = 'GrP1fZdUxUc1NYmu7kiNkJV4p7PKpshp1yBY7hogPUWT' +cond_bob = {"type": "ed25519-sha-256", "publicKey": bob_pk} From 456c9e72fd848cb542e02a2c37fcd4d9138735c0 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Mon, 19 Feb 2018 15:39:05 -0300 Subject: [PATCH 0026/1081] simplify CC tests --- qa/cryptoconditions/test_integration.py | 70 ++++++------------------- qa/cryptoconditions/testsupport.py | 7 +-- 2 files changed, 20 insertions(+), 57 deletions(-) diff --git a/qa/cryptoconditions/test_integration.py b/qa/cryptoconditions/test_integration.py index 87ee59825cb..ee266dfdf79 100644 --- a/qa/cryptoconditions/test_integration.py +++ b/qa/cryptoconditions/test_integration.py @@ -8,87 +8,49 @@ @fanout_input(0) def test_basic_spend(inp): - spend0 = { - 'inputs': [inp], - "outputs": [ - {"amount": 500, "script": {"condition": cond_alice}}, - {"amount": 500, "script": {"address": notary_addr}} - ] - } - spend0_txid = submit(sign(spend0)) - spend1 = { - 'inputs': [ - {'txid': spend0_txid, 'idx': 0, 'script': {"fulfillment": cond_alice}}, - {'txid': spend0_txid, 'idx': 1, 'script': {'address': notary_addr}} - ], - 'outputs': [{"amount": 1000, "script": {"address": notary_addr}}] - } - spend1_txid = submit(sign(spend1)) - assert rpc.getrawtransaction(spend1_txid) + spend = {'inputs': [inp], "outputs": [nospend]} + spend_txid = submit(sign(spend)) + assert rpc.getrawtransaction(spend_txid) @fanout_input(1) def test_fulfillment_wrong_signature(inp): - spend0 = { - 'inputs': [inp], - "outputs": [{"amount": 1000, "script": {"condition": cond_bob}}] - } - spend0_txid = submit(sign(spend0)) - spend1 = { - 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {"fulfillment": cond_alice}}], - 'outputs': [{"amount": 1000, "script": {"address": notary_addr}}] - } + # Set other pubkey and sign + inp['script']['fulfillment']['publicKey'] = bob_pk + spend = {'inputs': [inp], 'outputs': [nospend]} + signed = sign(spend) - signed = sign(spend1) # Set the correct pubkey, signature is wrong - signed['tx']['inputs'][0]['script']['fulfillment']['publicKey'] = bob_pk + signed['tx']['inputs'][0]['script']['fulfillment']['publicKey'] = alice_pk try: - assert not submit(sign(spend1)), 'should raise an error' + assert not submit(signed), 'should raise an error' except RPCError as e: - assert '16: mandatory-script-verify-flag-failed' in str(e), str(e) + assert 'Script evaluated without error but finished with a false/empty top stack element' in str(e), str(e) @fanout_input(2) def test_fulfillment_wrong_pubkey(inp): - spend0 = { - 'inputs': [inp], - "outputs": [{"amount": 1000, "script": {"condition": cond_alice}}] - } - spend0_txid = submit(sign(spend0)) - spend1 = { - 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {"fulfillment": cond_alice}}], - 'outputs': [{"amount": 1000, "script": {"address": notary_addr}}] - } + spend = {'inputs': [inp], 'outputs': [nospend]} - signed = sign(spend1) + signed = sign(spend) # Set the wrong pubkey, signature is correct signed['tx']['inputs'][0]['script']['fulfillment']['publicKey'] = bob_pk try: assert not submit(signed), 'should raise an error' except RPCError as e: - assert '16: mandatory-script-verify-flag-failed' in str(e), str(e) + assert 'Script evaluated without error but finished with a false/empty top stack element' in str(e), str(e) @fanout_input(3) def test_fulfillment_invalid_fulfillment(inp): - spend0 = { - 'inputs': [inp], - "outputs": [{"amount": 1000, "script": {"condition": cond_alice}}] - } - spend0_txid = submit(sign(spend0)) - # Create a valid script with an invalid fulfillment payload - script = binascii.hexlify(b"\007invalid").decode('utf-8') - - spend1 = { - 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': script}], - 'outputs': [{"amount": 1000, "script": {"address": notary_addr}}] - } + inp['script'] = binascii.hexlify(b"\007invalid").decode('utf-8') + spend = {'inputs': [inp], 'outputs': [nospend]} try: - assert not submit({'tx': spend1}), 'should raise an error' + assert not submit({'tx': spend}), 'should raise an error' except RPCError as e: assert 'Crypto-Condition payload is invalid' in str(e), str(e) diff --git a/qa/cryptoconditions/testsupport.py b/qa/cryptoconditions/testsupport.py index aad64e32004..5b00f8218a7 100644 --- a/qa/cryptoconditions/testsupport.py +++ b/qa/cryptoconditions/testsupport.py @@ -68,7 +68,7 @@ def wait_for_block(height): def sign(tx): signed = hoek.signTxBitcoin({'tx': tx, 'privateKeys': [notary_sk]}) - return hoek.signTxEd25519({'tx': signed['tx'], 'privateKeys': [alice_sk]}) + return hoek.signTxEd25519({'tx': signed['tx'], 'privateKeys': [alice_sk, bob_sk]}) def submit(tx): @@ -98,7 +98,7 @@ def get_fanout_txid(): {'txid': reward_txid, 'idx': 0, 'script': {'pubkey': notary_pk}} ], "outputs": (100 * [ - {"amount": 1000, "script": {"address": notary_addr}} + {"amount": 1000, "script": {"condition": cond_alice}} ] + [{"amount": remainder, 'script': {'address': notary_addr}}]) } @@ -110,7 +110,7 @@ def decorate(f): def wrapper(): if not hasattr(fanout_input, 'txid'): fanout_input.txid = get_fanout_txid() - inp = {'txid': fanout_input.txid, 'idx': n, 'script': {'address': notary_addr}} + inp = {'txid': fanout_input.txid, 'idx': n, 'script': {'fulfillment': cond_alice}} f(inp) return functools.wraps(f)(wrapper) return decorate @@ -126,3 +126,4 @@ def wrapper(): bob_pk = 'C8MfEjKiFxDguacHvcM7MV83cRQ55RAHacC73xqg8qeu' bob_sk = 'GrP1fZdUxUc1NYmu7kiNkJV4p7PKpshp1yBY7hogPUWT' cond_bob = {"type": "ed25519-sha-256", "publicKey": bob_pk} +nospend = {"amount": 1000, "script": {"address": notary_addr}} From f5cf215f71a2477070314b2eb14d9ba4fce63e81 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Mon, 19 Feb 2018 18:24:12 -0300 Subject: [PATCH 0027/1081] extra tests for failure modes and remove CRYPTOCONDITION_OVERSIZE error state --- qa/cryptoconditions/README.md | 7 +++-- qa/cryptoconditions/test_integration.py | 40 +++++++++++++++++++++++-- qa/cryptoconditions/testsupport.py | 10 +++++-- src/cryptoconditions | 2 +- src/script/interpreter.cpp | 5 ---- src/script/script_error.cpp | 2 ++ src/script/script_error.h | 1 + 7 files changed, 54 insertions(+), 13 deletions(-) diff --git a/qa/cryptoconditions/README.md b/qa/cryptoconditions/README.md index d14ab5b7daa..d93e8e266a2 100644 --- a/qa/cryptoconditions/README.md +++ b/qa/cryptoconditions/README.md @@ -2,6 +2,9 @@ These tests are for the [Crypto-Conditions](https://github.com/rfcs/crypto-conditions) functionality in Komodod, using [Hoek](https://github.com/libscott/hoek) as a tool to create and sign transactions. -The tests use Python as a scripting language and each one should "just work" given Linux and a 2.7+ Python interpreter. Each file prefixed with "test_" is a test case. +## How to run the tests -The tests require `hoek` to be on the $PATH. Included is a script to perform a complete installation of `hoek`. +1. Install hoek: https://github.com/libscott/hoek +2. Start komodod: `src/komodod -ac_name=CCTEST -ac_supply=21000000 -gen -pubkey=0205a8ad0c1dbc515f149af377981aab58b836af008d4d7ab21bd76faf80550b47 -ac_cc=1` +3. Set environment variable pointing to Komodo conf: `export KOMODO_CONF_PATH=~/.komodo/CCTEST/CCTEST.conf` +4. Run tests: `python test_integration.py` (you can also use a test runner such as `nose`). diff --git a/qa/cryptoconditions/test_integration.py b/qa/cryptoconditions/test_integration.py index ee266dfdf79..24792cc6043 100644 --- a/qa/cryptoconditions/test_integration.py +++ b/qa/cryptoconditions/test_integration.py @@ -3,6 +3,7 @@ import json import logging import binascii +import struct from testsupport import * @@ -20,7 +21,7 @@ def test_fulfillment_wrong_signature(inp): spend = {'inputs': [inp], 'outputs': [nospend]} signed = sign(spend) - # Set the correct pubkey, signature is wrong + # Set the correct pubkey, signature is bob's signed['tx']['inputs'][0]['script']['fulfillment']['publicKey'] = alice_pk try: @@ -32,8 +33,8 @@ def test_fulfillment_wrong_signature(inp): @fanout_input(2) def test_fulfillment_wrong_pubkey(inp): spend = {'inputs': [inp], 'outputs': [nospend]} - signed = sign(spend) + # Set the wrong pubkey, signature is correct signed['tx']['inputs'][0]['script']['fulfillment']['publicKey'] = bob_pk @@ -44,7 +45,7 @@ def test_fulfillment_wrong_pubkey(inp): @fanout_input(3) -def test_fulfillment_invalid_fulfillment(inp): +def test_invalid_fulfillment_binary(inp): # Create a valid script with an invalid fulfillment payload inp['script'] = binascii.hexlify(b"\007invalid").decode('utf-8') spend = {'inputs': [inp], 'outputs': [nospend]} @@ -55,8 +56,41 @@ def test_fulfillment_invalid_fulfillment(inp): assert 'Crypto-Condition payload is invalid' in str(e), str(e) +@fanout_input(4) +def test_invalid_condition(inp): + # Create a valid output script with an invalid cryptocondition binary + outputscript = to_hex(b"\007invalid\xcc") + spend = {'inputs': [inp], 'outputs': [{'amount': 1000, 'script': outputscript}]} + spend_txid = submit(sign(spend)) + + spend1 = { + 'inputs': [{'txid': spend_txid, 'idx': 0, 'script': {'fulfillment': cond_alice}}], + 'outputs': [nospend], + } + + try: + assert not submit(sign(spend1)), 'should raise an error' + except RPCError as e: + assert 'Script evaluated without error but finished with a false/empty top stack element' in str(e), str(e) + + +@fanout_input(19) +def test_oversize_fulfillment(inp): + # Create oversize fulfillment script where the total length is <2000 + binscript = b'\x4d%s%s' % (struct.pack('h', 2000), b'a' * 2000) + inp['script'] = to_hex(binscript) + spend = {'inputs': [inp], 'outputs': [nospend]} + + try: + assert not submit({'tx': spend}), 'should raise an error' + except RPCError as e: + assert 'scriptsig-size' in str(e), str(e) + + if __name__ == '__main__': + logging.basicConfig(level=logging.INFO) for name, f in globals().items(): if name.startswith('test_'): logging.info("Running test: %s" % name) f() + logging.info("Test OK: %s" % name) diff --git a/qa/cryptoconditions/testsupport.py b/qa/cryptoconditions/testsupport.py index 5b00f8218a7..e6025c0bcb2 100644 --- a/qa/cryptoconditions/testsupport.py +++ b/qa/cryptoconditions/testsupport.py @@ -2,9 +2,11 @@ import sys import json import time +import copy +import base64 import logging -import subprocess import functools +import subprocess class RPCError(IOError): @@ -34,6 +36,10 @@ def run_cmd(cmd): return proc.stdout.read() +def to_hex(s): + return base64.b16encode(s).decode('utf-8') + + class Hoek(JsonClient): def _exec(self, method, args): cmd = ['hoek', method, json.dumps(args[0])] @@ -111,7 +117,7 @@ def wrapper(): if not hasattr(fanout_input, 'txid'): fanout_input.txid = get_fanout_txid() inp = {'txid': fanout_input.txid, 'idx': n, 'script': {'fulfillment': cond_alice}} - f(inp) + f(copy.deepcopy(inp)) return functools.wraps(f)(wrapper) return decorate diff --git a/src/cryptoconditions b/src/cryptoconditions index 89325dc2939..7ab93ba8617 160000 --- a/src/cryptoconditions +++ b/src/cryptoconditions @@ -1 +1 @@ -Subproject commit 89325dc29391f473da75503105a4946f2f96fb76 +Subproject commit 7ab93ba86174efa32da3dac8b625ff9e1ef05fdd diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 4e03527a411..e0c2c1d0106 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -949,11 +949,6 @@ bool EvalScript(vector >& stack, const CScript& script, un valtype& vchFulfillment = stacktop(-2); valtype& vchCondition = stacktop(-1); - // Hard limit fulfillment size - if (vchFulfillment.size() > 1024 * 10) { - return set_error(serror, SCRIPT_ERR_CRYPTOCONDITION_INVALID_FULFILLMENT); - } - CC *cond = (CC*) calloc(1, sizeof(CC)); char *fulfillmentBin = (char*) vchFulfillment.data(); int rc = cc_readFulfillmentBinary(cond, fulfillmentBin, vchFulfillment.size()); diff --git a/src/script/script_error.cpp b/src/script/script_error.cpp index f1aa1fb408a..41c8a24e05f 100644 --- a/src/script/script_error.cpp +++ b/src/script/script_error.cpp @@ -67,6 +67,8 @@ const char* ScriptErrorString(const ScriptError serror) return "NOPx reserved for soft-fork upgrades"; case SCRIPT_ERR_PUBKEYTYPE: return "Public key is neither compressed or uncompressed"; + case SCRIPT_ERR_CRYPTOCONDITION_INVALID_FULFILLMENT: + return "Crypto-Condition payload is invalid"; case SCRIPT_ERR_UNKNOWN_ERROR: case SCRIPT_ERR_ERROR_COUNT: default: break; diff --git a/src/script/script_error.h b/src/script/script_error.h index e8426897737..35c8fbfd8ad 100644 --- a/src/script/script_error.h +++ b/src/script/script_error.h @@ -54,6 +54,7 @@ typedef enum ScriptError_t SCRIPT_ERR_ERROR_COUNT, + /* crypto-condition script errors */ SCRIPT_ERR_CRYPTOCONDITION_VERIFY, SCRIPT_ERR_CRYPTOCONDITION_INVALID_FULFILLMENT } ScriptError; From ccb128503efa55d3348d8ad5b913dbb8d7b942a6 Mon Sep 17 00:00:00 2001 From: libscott Date: Mon, 19 Feb 2018 18:31:39 -0300 Subject: [PATCH 0028/1081] Update README.md --- qa/cryptoconditions/README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/qa/cryptoconditions/README.md b/qa/cryptoconditions/README.md index d93e8e266a2..2bf479ecdd4 100644 --- a/qa/cryptoconditions/README.md +++ b/qa/cryptoconditions/README.md @@ -5,6 +5,7 @@ These tests are for the [Crypto-Conditions](https://github.com/rfcs/crypto-condi ## How to run the tests 1. Install hoek: https://github.com/libscott/hoek -2. Start komodod: `src/komodod -ac_name=CCTEST -ac_supply=21000000 -gen -pubkey=0205a8ad0c1dbc515f149af377981aab58b836af008d4d7ab21bd76faf80550b47 -ac_cc=1` -3. Set environment variable pointing to Komodo conf: `export KOMODO_CONF_PATH=~/.komodo/CCTEST/CCTEST.conf` -4. Run tests: `python test_integration.py` (you can also use a test runner such as `nose`). +1. Allow peer-less block creation: set "fMiningRequiresPeers = false" in src/chainparams.cpp, then build komodod. +1. Start komodod: `src/komodod -ac_name=CCTEST -ac_supply=21000000 -gen -pubkey=0205a8ad0c1dbc515f149af377981aab58b836af008d4d7ab21bd76faf80550b47 -ac_cc=1` +1. Set environment variable pointing to Komodo conf: `export KOMODO_CONF_PATH=~/.komodo/CCTEST/CCTEST.conf` +1. Run tests: `python test_integration.py` (you can also use a test runner such as `nose`). From fbc955c49338668eaffb1e161825c2ec5e1ed010 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Mon, 19 Feb 2018 20:45:11 -0300 Subject: [PATCH 0029/1081] use public github submodule url --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index 0c640d62c31..83942a053a3 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "cryptoconditions"] path = src/cryptoconditions - url = git@github.com:libscott/libcryptoconditions.git + url = https://github.com/libscott/libcryptoconditions.git branch = komodo-integration From 85b55ada89d71b7d51cd23e556677bbbfe1104ab Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Mon, 19 Feb 2018 21:13:05 -0300 Subject: [PATCH 0030/1081] use public github url --- src/cryptoconditions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cryptoconditions b/src/cryptoconditions index 7ab93ba8617..e482849382f 160000 --- a/src/cryptoconditions +++ b/src/cryptoconditions @@ -1 +1 @@ -Subproject commit 7ab93ba86174efa32da3dac8b625ff9e1ef05fdd +Subproject commit e482849382f36702fe083c5604dd160f4ebaedd1 From 73b9e32b9d7ede630af0df9bae8853cd9fa1b88a Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Wed, 21 Feb 2018 14:10:42 -0300 Subject: [PATCH 0031/1081] update to latest libcryptoconditions --- src/cryptoconditions | 2 +- src/script/interpreter.cpp | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/cryptoconditions b/src/cryptoconditions index e482849382f..6b859e63a2b 160000 --- a/src/cryptoconditions +++ b/src/cryptoconditions @@ -1 +1 @@ -Subproject commit e482849382f36702fe083c5604dd160f4ebaedd1 +Subproject commit 6b859e63a2bce5107f9b888823f2709a13dd3c26 diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index e0c2c1d0106..1e5c7ec79b7 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -949,10 +949,9 @@ bool EvalScript(vector >& stack, const CScript& script, un valtype& vchFulfillment = stacktop(-2); valtype& vchCondition = stacktop(-1); - CC *cond = (CC*) calloc(1, sizeof(CC)); char *fulfillmentBin = (char*) vchFulfillment.data(); - int rc = cc_readFulfillmentBinary(cond, fulfillmentBin, vchFulfillment.size()); - if (rc != 0) { + CC *cond = cc_readFulfillmentBinary(fulfillmentBin, vchFulfillment.size()); + if (!cond) { return set_error(serror, SCRIPT_ERR_CRYPTOCONDITION_INVALID_FULFILLMENT); } From 691b8708f1bbbab2df2163ad17d9d0b6a2abb67f Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Wed, 21 Feb 2018 19:28:52 -0300 Subject: [PATCH 0032/1081] Komodo CC aux callback has access to transaction via checker --- src/Makefile.am | 2 ++ src/cryptoconditions | 2 +- src/komodo_cryptoconditions.cpp | 8 ++++++++ src/komodo_cryptoconditions.h | 7 ------- src/script/interpreter.cpp | 32 ++++++++++++++++++++------------ src/script/interpreter.h | 14 ++++++++++---- 6 files changed, 41 insertions(+), 24 deletions(-) create mode 100644 src/komodo_cryptoconditions.cpp diff --git a/src/Makefile.am b/src/Makefile.am index 815d75d4cd8..4ec21614d6e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -336,6 +336,7 @@ libbitcoin_common_a_SOURCES = \ script/script_error.cpp \ script/sign.cpp \ script/standard.cpp \ + komodo_cryptoconditions.cpp \ $(BITCOIN_CORE_H) \ $(LIBZCASH_H) @@ -505,6 +506,7 @@ libzcashconsensus_la_SOURCES = \ script/zcashconsensus.cpp \ script/interpreter.cpp \ script/script.cpp \ + komodo_cryptoconditions.cpp \ uint256.cpp \ utilstrencodings.cpp diff --git a/src/cryptoconditions b/src/cryptoconditions index 6b859e63a2b..e33203ae343 160000 --- a/src/cryptoconditions +++ b/src/cryptoconditions @@ -1 +1 @@ -Subproject commit 6b859e63a2bce5107f9b888823f2709a13dd3c26 +Subproject commit e33203ae3430d2682a4eb734ceaf63791eb0eb6d diff --git a/src/komodo_cryptoconditions.cpp b/src/komodo_cryptoconditions.cpp new file mode 100644 index 00000000000..a7fcf9f998e --- /dev/null +++ b/src/komodo_cryptoconditions.cpp @@ -0,0 +1,8 @@ + +#include "cryptoconditions/include/cryptoconditions.h" +#include "script/interpreter.h" + + +int CryptoConditionChecker::CheckAuxCondition(const CC *cond) const { + return true; +} diff --git a/src/komodo_cryptoconditions.h b/src/komodo_cryptoconditions.h index 3cfc15e1259..42cf3b077bd 100644 --- a/src/komodo_cryptoconditions.h +++ b/src/komodo_cryptoconditions.h @@ -9,11 +9,4 @@ static bool IsCryptoConditionsEnabled() { return 0 != ASSETCHAINS_CC; } -/* - * Method stub for aux conditions. Unimplemented, thus fails if an aux condition is encountered. - */ -static int komodoCCAux(CC *cond, void *context) { - return 0; -} - #endif /* KOMODO_CRYPTOCONDITIONS_H */ diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 1e5c7ec79b7..689dcf2045c 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -949,18 +949,15 @@ bool EvalScript(vector >& stack, const CScript& script, un valtype& vchFulfillment = stacktop(-2); valtype& vchCondition = stacktop(-1); - char *fulfillmentBin = (char*) vchFulfillment.data(); - CC *cond = cc_readFulfillmentBinary(fulfillmentBin, vchFulfillment.size()); + CC *cond = cc_readFulfillmentBinary((unsigned char*)vchFulfillment.data(), + vchFulfillment.size()); if (!cond) { return set_error(serror, SCRIPT_ERR_CRYPTOCONDITION_INVALID_FULFILLMENT); } - char *condBin = (char*) &vchCondition[0]; - // TODO: Should nHashType be hardcoded? - // Other types use the last byte of the signature - char *msg = (char*) checker.GetMessage(script, SIGHASH_ALL).begin(); + bool fSuccess = checker.CheckCryptoCondition(cond, vchCondition, script); - bool fSuccess = cc_verify(cond, msg, 32, condBin, vchCondition.size(), komodoCCAux, NULL); + cc_free(cond); popstack(stack); popstack(stack); @@ -1155,6 +1152,22 @@ bool TransactionSignatureChecker::CheckSig(const vector& vchSigIn return true; } +extern "C" +{ + static int komodoCCAux(CC *cond, void *transactionSignatureChecker); +} + +static int komodoCCAux(CC *cond, void *checker) { + return ((CryptoConditionChecker*)checker)->CheckAuxCondition(cond); +} + +bool TransactionSignatureChecker::CheckCryptoCondition(const CC *cond, const std::vector& condBin, const CScript& scriptCode) const +{ + uint256 message = SignatureHash(scriptCode, *txTo, nIn, SIGHASH_ALL); + return cc_verify(cond, (const unsigned char*)&message, 32, + condBin.data(), condBin.size(), komodoCCAux, (void*)this); +} + bool TransactionSignatureChecker::CheckLockTime(const CScriptNum& nLockTime) const { // There are two times of nLockTime: lock-by-blockheight @@ -1191,11 +1204,6 @@ bool TransactionSignatureChecker::CheckLockTime(const CScriptNum& nLockTime) con return true; } -uint256 TransactionSignatureChecker::GetMessage(const CScript& scriptCode, int nHashType) const -{ - return SignatureHash(scriptCode, *txTo, nIn, nHashType); -} - bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* serror) { diff --git a/src/script/interpreter.h b/src/script/interpreter.h index fad2d9a919a..90c50eff6f8 100644 --- a/src/script/interpreter.h +++ b/src/script/interpreter.h @@ -8,6 +8,7 @@ #include "script_error.h" #include "primitives/transaction.h" +#include "komodo_cryptoconditions.h" #include #include @@ -102,10 +103,9 @@ class BaseSignatureChecker return false; } - virtual uint256 GetMessage(const CScript& scriptCode, int nHashType) const + virtual bool CheckCryptoCondition(const CC *cond, const std::vector& condBin, const CScript& scriptCode) const { - uint256 blob; - return blob; + return false; } virtual ~BaseSignatureChecker() {} @@ -124,7 +124,7 @@ class TransactionSignatureChecker : public BaseSignatureChecker TransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn) : txTo(txToIn), nIn(nInIn) {} bool CheckSig(const std::vector& scriptSig, const std::vector& vchPubKey, const CScript& scriptCode) const; bool CheckLockTime(const CScriptNum& nLockTime) const; - uint256 GetMessage(const CScript& scriptCode, int nHashType) const; + bool CheckCryptoCondition(const CC *cond, const std::vector& condBin, const CScript& scriptCode) const; }; class MutableTransactionSignatureChecker : public TransactionSignatureChecker @@ -139,4 +139,10 @@ class MutableTransactionSignatureChecker : public TransactionSignatureChecker bool EvalScript(std::vector >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* error = NULL); bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* error = NULL); +class CryptoConditionChecker : public TransactionSignatureChecker +{ +public: + int CheckAuxCondition(const CC *cond) const; +}; + #endif // BITCOIN_SCRIPT_INTERPRETER_H From db2df2c37ba98cf7490122a9176f0cad17d94f85 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Thu, 22 Feb 2018 00:59:15 -0300 Subject: [PATCH 0033/1081] integration test for basic aux condition --- qa/cryptoconditions/test_integration.py | 42 ++++++++++++++++++++++++- src/cryptoconditions | 2 +- src/komodo_cryptoconditions.cpp | 7 ++++- 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/qa/cryptoconditions/test_integration.py b/qa/cryptoconditions/test_integration.py index 24792cc6043..d5b4569538a 100644 --- a/qa/cryptoconditions/test_integration.py +++ b/qa/cryptoconditions/test_integration.py @@ -74,7 +74,7 @@ def test_invalid_condition(inp): assert 'Script evaluated without error but finished with a false/empty top stack element' in str(e), str(e) -@fanout_input(19) +@fanout_input(5) def test_oversize_fulfillment(inp): # Create oversize fulfillment script where the total length is <2000 binscript = b'\x4d%s%s' % (struct.pack('h', 2000), b'a' * 2000) @@ -87,6 +87,46 @@ def test_oversize_fulfillment(inp): assert 'scriptsig-size' in str(e), str(e) +@fanout_input(6) +def test_aux_basic(inp): + aux_cond = { + 'type': 'aux-sha-256', + 'method': 'equals', + 'conditionAux': 'LTE', + 'fulfillmentAux': 'LTE' + } + + # Setup some aux outputs + spend0 = { + 'inputs': [inp], + 'outputs': [ + {'amount': 500, 'script': {'condition': aux_cond}}, + {'amount': 500, 'script': {'condition': aux_cond}} + ] + } + spend0_txid = submit(sign(spend0)) + assert rpc.getrawtransaction(spend0_txid) + + # Test a good fulfillment + spend1 = { + 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {'fulfillment': aux_cond}}], + 'outputs': [{'amount': 500, 'script': {'condition': aux_cond}}] + } + spend1_txid = submit(sign(spend1)) + assert rpc.getrawtransaction(spend1_txid) + + # Test a bad fulfillment + aux_cond['fulfillmentAux'] = 'WYW' + spend2 = { + 'inputs': [{'txid': spend0_txid, 'idx': 1, 'script': {'fulfillment': aux_cond}}], + 'outputs': [{'amount': 500, 'script': {'condition': aux_cond}}] + } + try: + assert not submit(sign(spend2)), 'should raise an error' + except RPCError as e: + assert 'Script evaluated without error but finished with a false/empty top stack element' in str(e), str(e) + + if __name__ == '__main__': logging.basicConfig(level=logging.INFO) for name, f in globals().items(): diff --git a/src/cryptoconditions b/src/cryptoconditions index e33203ae343..0dcac79cf9f 160000 --- a/src/cryptoconditions +++ b/src/cryptoconditions @@ -1 +1 @@ -Subproject commit e33203ae3430d2682a4eb734ceaf63791eb0eb6d +Subproject commit 0dcac79cf9ffeda8aff9d3e9e41fa23ac8208486 diff --git a/src/komodo_cryptoconditions.cpp b/src/komodo_cryptoconditions.cpp index a7fcf9f998e..9617add50d7 100644 --- a/src/komodo_cryptoconditions.cpp +++ b/src/komodo_cryptoconditions.cpp @@ -4,5 +4,10 @@ int CryptoConditionChecker::CheckAuxCondition(const CC *cond) const { - return true; + if (0 == strcmp((const char*)cond->method, "equals")) { + return (cond->conditionAuxLength == cond->fulfillmentAuxLength) && + (0 == memcmp(cond->conditionAux, cond->fulfillmentAux, cond->conditionAuxLength)); + } + printf("no defined behaviour for method:%s\n", cond->method); + return 0; } From 46d1bcc607ee5b795ed72351b24f978ab6952633 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Thu, 22 Feb 2018 01:43:43 -0300 Subject: [PATCH 0034/1081] integration test for complex aux condition --- qa/cryptoconditions/test_integration.py | 44 +++++++++++++++++++++++++ src/komodo_cryptoconditions.cpp | 13 +++++++- src/script/interpreter.cpp | 2 +- src/script/interpreter.h | 7 +--- 4 files changed, 58 insertions(+), 8 deletions(-) diff --git a/qa/cryptoconditions/test_integration.py b/qa/cryptoconditions/test_integration.py index d5b4569538a..6d60ee921d4 100644 --- a/qa/cryptoconditions/test_integration.py +++ b/qa/cryptoconditions/test_integration.py @@ -127,6 +127,50 @@ def test_aux_basic(inp): assert 'Script evaluated without error but finished with a false/empty top stack element' in str(e), str(e) +@fanout_input(7) +def test_aux_complex(inp): + aux_cond = { + 'type': 'aux-sha-256', + 'method': 'inputIsReturn', + 'conditionAux': '', + 'fulfillmentAux': 'AQ' # \1 (tx.vout[1]) + } + + # Setup some aux outputs + spend0 = { + 'inputs': [inp], + 'outputs': [ + {'amount': 500, 'script': {'condition': aux_cond}}, + {'amount': 500, 'script': {'condition': aux_cond}} + ] + } + spend0_txid = submit(sign(spend0)) + assert rpc.getrawtransaction(spend0_txid) + + # Test a good fulfillment + spend1 = { + 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {'fulfillment': aux_cond}}], + 'outputs': [ + {'amount': 250, 'script': {'condition': aux_cond}}, + {'amount': 250, 'script': "6A0B68656C6C6F207468657265"} # OP_RETURN somedata + ] + } + spend1_txid = submit(sign(spend1)) + assert rpc.getrawtransaction(spend1_txid) + + # Test a bad fulfillment + spend2 = { + 'inputs': [{'txid': spend0_txid, 'idx': 1, 'script': {'fulfillment': aux_cond}}], + 'outputs': [ + {'amount': 500, 'script': "6A0B68656C6C6F207468657265"} # OP_RETURN somedata + ] + } + try: + assert not submit(sign(spend2)), 'should raise an error' + except RPCError as e: + assert 'Script evaluated without error but finished with a false/empty top stack element' in str(e), str(e) + + if __name__ == '__main__': logging.basicConfig(level=logging.INFO) for name, f in globals().items(): diff --git a/src/komodo_cryptoconditions.cpp b/src/komodo_cryptoconditions.cpp index 9617add50d7..c807df7c987 100644 --- a/src/komodo_cryptoconditions.cpp +++ b/src/komodo_cryptoconditions.cpp @@ -3,11 +3,22 @@ #include "script/interpreter.h" -int CryptoConditionChecker::CheckAuxCondition(const CC *cond) const { +int TransactionSignatureChecker::CheckAuxCondition(const CC *cond) const { + + // Check that condition is equal to fulfillment if (0 == strcmp((const char*)cond->method, "equals")) { return (cond->conditionAuxLength == cond->fulfillmentAuxLength) && (0 == memcmp(cond->conditionAux, cond->fulfillmentAux, cond->conditionAuxLength)); } + + // Check that pubKeyScript specified in fulfillment is OP_RETURN + if (0 == strcmp((const char*)cond->method, "inputIsReturn")) { + if (cond->fulfillmentAuxLength != 1) return 0; + int n = (int) cond->fulfillmentAux[0]; + if (n >= txTo->vout.size()) return 0; + uint8_t *ptr = (uint8_t *)txTo->vout[n].scriptPubKey.data(); + return ptr[0] == OP_RETURN; + } printf("no defined behaviour for method:%s\n", cond->method); return 0; } diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 689dcf2045c..709b566f6ed 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -1158,7 +1158,7 @@ extern "C" } static int komodoCCAux(CC *cond, void *checker) { - return ((CryptoConditionChecker*)checker)->CheckAuxCondition(cond); + return ((TransactionSignatureChecker*)checker)->CheckAuxCondition(cond); } bool TransactionSignatureChecker::CheckCryptoCondition(const CC *cond, const std::vector& condBin, const CScript& scriptCode) const diff --git a/src/script/interpreter.h b/src/script/interpreter.h index 90c50eff6f8..8936fde7a15 100644 --- a/src/script/interpreter.h +++ b/src/script/interpreter.h @@ -125,6 +125,7 @@ class TransactionSignatureChecker : public BaseSignatureChecker bool CheckSig(const std::vector& scriptSig, const std::vector& vchPubKey, const CScript& scriptCode) const; bool CheckLockTime(const CScriptNum& nLockTime) const; bool CheckCryptoCondition(const CC *cond, const std::vector& condBin, const CScript& scriptCode) const; + int CheckAuxCondition(const CC *cond) const; }; class MutableTransactionSignatureChecker : public TransactionSignatureChecker @@ -139,10 +140,4 @@ class MutableTransactionSignatureChecker : public TransactionSignatureChecker bool EvalScript(std::vector >& stack, const CScript& script, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* error = NULL); bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* error = NULL); -class CryptoConditionChecker : public TransactionSignatureChecker -{ -public: - int CheckAuxCondition(const CC *cond) const; -}; - #endif // BITCOIN_SCRIPT_INTERPRETER_H From 7d937f290e08522beaf10d6ffe237a756a06361b Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Sat, 24 Feb 2018 19:43:37 -0300 Subject: [PATCH 0035/1081] add secp256k1 condition type to cryptoconditions --- .gitmodules | 2 +- qa/cryptoconditions/test_integration.py | 53 ++++++++++++++++++++++--- qa/cryptoconditions/testsupport.py | 22 ++++++++-- src/cryptoconditions | 2 +- src/komodo_cryptoconditions.cpp | 4 +- src/script/interpreter.cpp | 2 +- src/secp256k1/src/ecdsa_impl.h | 10 ++++- 7 files changed, 81 insertions(+), 14 deletions(-) diff --git a/.gitmodules b/.gitmodules index 83942a053a3..bf76cc359e1 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "cryptoconditions"] path = src/cryptoconditions url = https://github.com/libscott/libcryptoconditions.git - branch = komodo-integration + branch = komodo diff --git a/qa/cryptoconditions/test_integration.py b/qa/cryptoconditions/test_integration.py index 6d60ee921d4..f764fcb81c9 100644 --- a/qa/cryptoconditions/test_integration.py +++ b/qa/cryptoconditions/test_integration.py @@ -7,6 +7,9 @@ from testsupport import * +SCRIPT_FALSE = 'Script evaluated without error but finished with a false/empty top stack element' + + @fanout_input(0) def test_basic_spend(inp): spend = {'inputs': [inp], "outputs": [nospend]} @@ -27,7 +30,7 @@ def test_fulfillment_wrong_signature(inp): try: assert not submit(signed), 'should raise an error' except RPCError as e: - assert 'Script evaluated without error but finished with a false/empty top stack element' in str(e), str(e) + assert SCRIPT_FALSE in str(e), str(e) @fanout_input(2) @@ -41,7 +44,7 @@ def test_fulfillment_wrong_pubkey(inp): try: assert not submit(signed), 'should raise an error' except RPCError as e: - assert 'Script evaluated without error but finished with a false/empty top stack element' in str(e), str(e) + assert SCRIPT_FALSE in str(e), str(e) @fanout_input(3) @@ -71,7 +74,7 @@ def test_invalid_condition(inp): try: assert not submit(sign(spend1)), 'should raise an error' except RPCError as e: - assert 'Script evaluated without error but finished with a false/empty top stack element' in str(e), str(e) + assert SCRIPT_FALSE in str(e), str(e) @fanout_input(5) @@ -124,7 +127,7 @@ def test_aux_basic(inp): try: assert not submit(sign(spend2)), 'should raise an error' except RPCError as e: - assert 'Script evaluated without error but finished with a false/empty top stack element' in str(e), str(e) + assert SCRIPT_FALSE in str(e), str(e) @fanout_input(7) @@ -168,7 +171,47 @@ def test_aux_complex(inp): try: assert not submit(sign(spend2)), 'should raise an error' except RPCError as e: - assert 'Script evaluated without error but finished with a false/empty top stack element' in str(e), str(e) + assert SCRIPT_FALSE in str(e), str(e) + + +@fanout_input(8) +def test_secp256k1_condition(inp): + ec_cond = { + 'type': 'secp256k1-sha-256', + 'publicKey': notary_pk + } + + # Create some secp256k1 outputs + spend0 = { + 'inputs': [inp], + 'outputs': [ + {'amount': 500, 'script': {'condition': ec_cond}}, + {'amount': 500, 'script': {'condition': ec_cond}} + ] + } + spend0_txid = submit(sign(spend0)) + assert rpc.getrawtransaction(spend0_txid) + + # Test a good fulfillment + spend1 = { + 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {'fulfillment': ec_cond}}], + 'outputs': [{'amount': 500, 'script': {'condition': ec_cond}}] + } + spend1_txid = submit(sign(spend1)) + assert rpc.getrawtransaction(spend1_txid) + + # Test a bad fulfillment + spend2 = { + 'inputs': [{'txid': spend0_txid, 'idx': 1, 'script': {'fulfillment': ec_cond}}], + 'outputs': [{'amount': 500, 'script': {'condition': ec_cond}}] + } + signed = sign(spend2) + signed['tx']['inputs'][0]['script']['fulfillment']['publicKey'] = \ + '0275cef12fc5c49be64f5aab3d1fbba08cd7b0d02908b5112fbd8504218d14bc7d' + try: + assert not submit(signed), 'should raise an error' + except RPCError as e: + assert SCRIPT_FALSE in str(e), str(e) if __name__ == '__main__': diff --git a/qa/cryptoconditions/testsupport.py b/qa/cryptoconditions/testsupport.py index e6025c0bcb2..35b7ecdf6e2 100644 --- a/qa/cryptoconditions/testsupport.py +++ b/qa/cryptoconditions/testsupport.py @@ -74,7 +74,8 @@ def wait_for_block(height): def sign(tx): signed = hoek.signTxBitcoin({'tx': tx, 'privateKeys': [notary_sk]}) - return hoek.signTxEd25519({'tx': signed['tx'], 'privateKeys': [alice_sk, bob_sk]}) + signed = hoek.signTxEd25519({'tx': signed['tx'], 'privateKeys': [alice_sk, bob_sk]}) + return hoek.signTxSecp256k1({'tx': signed['tx'], 'privateKeys': [notary_sk]}) def submit(tx): @@ -96,14 +97,14 @@ def get_fanout_txid(): reward_tx = hoek.decodeTx({'hex': reward_tx_raw}) balance = reward_tx['tx']['outputs'][0]['amount'] - n_outs = 100 + n_outs = 16 remainder = balance - n_outs * 1000 fanout = { 'inputs': [ {'txid': reward_txid, 'idx': 0, 'script': {'pubkey': notary_pk}} ], - "outputs": (100 * [ + "outputs": (n_outs * [ {"amount": 1000, "script": {"condition": cond_alice}} ] + [{"amount": remainder, 'script': {'address': notary_addr}}]) } @@ -122,6 +123,21 @@ def wrapper(): return decorate +def decode_base64(data): + """Decode base64, padding being optional. + + :param data: Base64 data as an ASCII byte string + :returns: The decoded byte string. + """ + missing_padding = len(data) % 4 + if missing_padding: + data += '=' * (4 - missing_padding) + return base64.urlsafe_b64decode(data) + + +def encode_base64(data): + return base64.urlsafe_b64encode(data).rstrip(b'=') + notary_addr = 'RXSwmXKtDURwXP7sdqNfsJ6Ga8RaxTchxE' notary_pk = '0205a8ad0c1dbc515f149af377981aab58b836af008d4d7ab21bd76faf80550b47' diff --git a/src/cryptoconditions b/src/cryptoconditions index 0dcac79cf9f..863d9266141 160000 --- a/src/cryptoconditions +++ b/src/cryptoconditions @@ -1 +1 @@ -Subproject commit 0dcac79cf9ffeda8aff9d3e9e41fa23ac8208486 +Subproject commit 863d9266141667b469a6574ce7285134665427c6 diff --git a/src/komodo_cryptoconditions.cpp b/src/komodo_cryptoconditions.cpp index c807df7c987..4c516b32022 100644 --- a/src/komodo_cryptoconditions.cpp +++ b/src/komodo_cryptoconditions.cpp @@ -3,8 +3,8 @@ #include "script/interpreter.h" -int TransactionSignatureChecker::CheckAuxCondition(const CC *cond) const { - +int TransactionSignatureChecker::CheckAuxCondition(const CC *cond) const +{ // Check that condition is equal to fulfillment if (0 == strcmp((const char*)cond->method, "equals")) { return (cond->conditionAuxLength == cond->fulfillmentAuxLength) && diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 709b566f6ed..91b22039e94 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -1164,7 +1164,7 @@ static int komodoCCAux(CC *cond, void *checker) { bool TransactionSignatureChecker::CheckCryptoCondition(const CC *cond, const std::vector& condBin, const CScript& scriptCode) const { uint256 message = SignatureHash(scriptCode, *txTo, nIn, SIGHASH_ALL); - return cc_verify(cond, (const unsigned char*)&message, 32, + return cc_verify(cond, (const unsigned char*)&message, 32, 0, condBin.data(), condBin.size(), komodoCCAux, (void*)this); } diff --git a/src/secp256k1/src/ecdsa_impl.h b/src/secp256k1/src/ecdsa_impl.h index ed1d228189d..8d97db946cf 100644 --- a/src/secp256k1/src/ecdsa_impl.h +++ b/src/secp256k1/src/ecdsa_impl.h @@ -47,12 +47,20 @@ static const secp256k1_fe_t secp256k1_ecdsa_const_p_minus_order = SECP256K1_FE_C ); static int secp256k1_ecdsa_sig_parse(secp256k1_ecdsa_sig_t *r, const unsigned char *sig, int size) { + + /* libscott had to add this to get this version of the library to read compact sigs */ + int overflow = 0; + if (size == 64) { + secp256k1_scalar_set_b32(&r->r, sig, &overflow); + secp256k1_scalar_set_b32(&r->s, sig+32, &overflow); + return 1; + } + unsigned char ra[32] = {0}, sa[32] = {0}; const unsigned char *rp; const unsigned char *sp; int lenr; int lens; - int overflow; if (sig[0] != 0x30) { return 0; } From 28658719eab23190d0a9c4910254372eda1a0980 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Sun, 25 Feb 2018 16:22:12 -0300 Subject: [PATCH 0036/1081] tweak hoek interface --- qa/cryptoconditions/test_integration.py | 10 +++++----- qa/cryptoconditions/testsupport.py | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/qa/cryptoconditions/test_integration.py b/qa/cryptoconditions/test_integration.py index f764fcb81c9..bd72b961d0f 100644 --- a/qa/cryptoconditions/test_integration.py +++ b/qa/cryptoconditions/test_integration.py @@ -25,7 +25,7 @@ def test_fulfillment_wrong_signature(inp): signed = sign(spend) # Set the correct pubkey, signature is bob's - signed['tx']['inputs'][0]['script']['fulfillment']['publicKey'] = alice_pk + signed['inputs'][0]['script']['fulfillment']['publicKey'] = alice_pk try: assert not submit(signed), 'should raise an error' @@ -39,7 +39,7 @@ def test_fulfillment_wrong_pubkey(inp): signed = sign(spend) # Set the wrong pubkey, signature is correct - signed['tx']['inputs'][0]['script']['fulfillment']['publicKey'] = bob_pk + signed['inputs'][0]['script']['fulfillment']['publicKey'] = bob_pk try: assert not submit(signed), 'should raise an error' @@ -54,7 +54,7 @@ def test_invalid_fulfillment_binary(inp): spend = {'inputs': [inp], 'outputs': [nospend]} try: - assert not submit({'tx': spend}), 'should raise an error' + assert not submit(spend), 'should raise an error' except RPCError as e: assert 'Crypto-Condition payload is invalid' in str(e), str(e) @@ -85,7 +85,7 @@ def test_oversize_fulfillment(inp): spend = {'inputs': [inp], 'outputs': [nospend]} try: - assert not submit({'tx': spend}), 'should raise an error' + assert not submit(spend), 'should raise an error' except RPCError as e: assert 'scriptsig-size' in str(e), str(e) @@ -206,7 +206,7 @@ def test_secp256k1_condition(inp): 'outputs': [{'amount': 500, 'script': {'condition': ec_cond}}] } signed = sign(spend2) - signed['tx']['inputs'][0]['script']['fulfillment']['publicKey'] = \ + signed['inputs'][0]['script']['fulfillment']['publicKey'] = \ '0275cef12fc5c49be64f5aab3d1fbba08cd7b0d02908b5112fbd8504218d14bc7d' try: assert not submit(signed), 'should raise an error' diff --git a/qa/cryptoconditions/testsupport.py b/qa/cryptoconditions/testsupport.py index 35b7ecdf6e2..e22520f3f51 100644 --- a/qa/cryptoconditions/testsupport.py +++ b/qa/cryptoconditions/testsupport.py @@ -74,8 +74,8 @@ def wait_for_block(height): def sign(tx): signed = hoek.signTxBitcoin({'tx': tx, 'privateKeys': [notary_sk]}) - signed = hoek.signTxEd25519({'tx': signed['tx'], 'privateKeys': [alice_sk, bob_sk]}) - return hoek.signTxSecp256k1({'tx': signed['tx'], 'privateKeys': [notary_sk]}) + signed = hoek.signTxEd25519({'tx': signed, 'privateKeys': [alice_sk, bob_sk]}) + return hoek.signTxSecp256k1({'tx': signed, 'privateKeys': [notary_sk]}) def submit(tx): @@ -95,7 +95,7 @@ def get_fanout_txid(): reward_txid = block['tx'][0] reward_tx_raw = rpc.getrawtransaction(reward_txid) reward_tx = hoek.decodeTx({'hex': reward_tx_raw}) - balance = reward_tx['tx']['outputs'][0]['amount'] + balance = reward_tx['outputs'][0]['amount'] n_outs = 16 remainder = balance - n_outs * 1000 From 80ea0d26b01a8cff6f064f9e4b1db09a4effc6b8 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Mon, 26 Feb 2018 02:10:58 -0300 Subject: [PATCH 0037/1081] latest cryptoconditions --- src/cryptoconditions | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cryptoconditions b/src/cryptoconditions index 863d9266141..9ba2d454564 160000 --- a/src/cryptoconditions +++ b/src/cryptoconditions @@ -1 +1 @@ -Subproject commit 863d9266141667b469a6574ce7285134665427c6 +Subproject commit 9ba2d454564c3bb31446a2a2d1db8cb992e6cbe0 From b21d2e0f9d433c413ddc5f0ce852d8bedfe86e7c Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Thu, 8 Mar 2018 13:08:37 -0300 Subject: [PATCH 0038/1081] gitignore binaries --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 5b8b361e19b..6f82717db06 100644 --- a/.gitignore +++ b/.gitignore @@ -116,3 +116,6 @@ contrib/debian/files contrib/debian/substvars src/rpcmisc~.cpp +src/komodo-cli +src/komodod +src/komodo-tx From 2b2c75de29fc45e9de269e47aba44589ed561160 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Thu, 8 Mar 2018 15:15:01 -0300 Subject: [PATCH 0039/1081] basic implementation of transaction replacement. requires cleanup and testing --- qa/cryptoconditions/test_integration.py | 118 +++++++++++++----------- qa/cryptoconditions/testsupport.py | 6 +- src/Makefile.am | 7 +- src/cryptoconditions | 2 +- src/komodo_cryptoconditions.cpp | 97 ++++++++++++++++--- src/komodo_cryptoconditions.h | 7 ++ src/main.cpp | 62 ++++++++++++- src/main.h | 2 +- src/replacementpool.cpp | 96 +++++++++++++++++++ src/replacementpool.h | 68 ++++++++++++++ src/script/interpreter.cpp | 8 +- src/script/interpreter.h | 2 +- 12 files changed, 392 insertions(+), 83 deletions(-) create mode 100644 src/replacementpool.cpp create mode 100644 src/replacementpool.h diff --git a/qa/cryptoconditions/test_integration.py b/qa/cryptoconditions/test_integration.py index bd72b961d0f..1f6746b696d 100644 --- a/qa/cryptoconditions/test_integration.py +++ b/qa/cryptoconditions/test_integration.py @@ -4,6 +4,7 @@ import logging import binascii import struct +import base64 from testsupport import * @@ -91,20 +92,19 @@ def test_oversize_fulfillment(inp): @fanout_input(6) -def test_aux_basic(inp): - aux_cond = { - 'type': 'aux-sha-256', - 'method': 'equals', - 'conditionAux': 'LTE', - 'fulfillmentAux': 'LTE' +def test_eval_basic(inp): + eval_cond = { + 'type': 'eval-sha-256', + 'method': 'testEval', + 'params': encode_base64('testEval') } - # Setup some aux outputs + # Setup some eval outputs spend0 = { 'inputs': [inp], 'outputs': [ - {'amount': 500, 'script': {'condition': aux_cond}}, - {'amount': 500, 'script': {'condition': aux_cond}} + {'amount': 500, 'script': {'condition': eval_cond}}, + {'amount': 500, 'script': {'condition': eval_cond}} ] } spend0_txid = submit(sign(spend0)) @@ -112,17 +112,17 @@ def test_aux_basic(inp): # Test a good fulfillment spend1 = { - 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {'fulfillment': aux_cond}}], - 'outputs': [{'amount': 500, 'script': {'condition': aux_cond}}] + 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {'fulfillment': eval_cond}}], + 'outputs': [{'amount': 500, 'script': {'condition': eval_cond}}] } spend1_txid = submit(sign(spend1)) assert rpc.getrawtransaction(spend1_txid) # Test a bad fulfillment - aux_cond['fulfillmentAux'] = 'WYW' + eval_cond['params'] = '' spend2 = { - 'inputs': [{'txid': spend0_txid, 'idx': 1, 'script': {'fulfillment': aux_cond}}], - 'outputs': [{'amount': 500, 'script': {'condition': aux_cond}}] + 'inputs': [{'txid': spend0_txid, 'idx': 1, 'script': {'fulfillment': eval_cond}}], + 'outputs': [{'amount': 500, 'script': {'condition': eval_cond}}] } try: assert not submit(sign(spend2)), 'should raise an error' @@ -131,20 +131,18 @@ def test_aux_basic(inp): @fanout_input(7) -def test_aux_complex(inp): - aux_cond = { - 'type': 'aux-sha-256', - 'method': 'inputIsReturn', - 'conditionAux': '', - 'fulfillmentAux': 'AQ' # \1 (tx.vout[1]) +def test_secp256k1_condition(inp): + ec_cond = { + 'type': 'secp256k1-sha-256', + 'publicKey': notary_pk } - # Setup some aux outputs + # Create some secp256k1 outputs spend0 = { 'inputs': [inp], 'outputs': [ - {'amount': 500, 'script': {'condition': aux_cond}}, - {'amount': 500, 'script': {'condition': aux_cond}} + {'amount': 500, 'script': {'condition': ec_cond}}, + {'amount': 500, 'script': {'condition': ec_cond}} ] } spend0_txid = submit(sign(spend0)) @@ -152,66 +150,78 @@ def test_aux_complex(inp): # Test a good fulfillment spend1 = { - 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {'fulfillment': aux_cond}}], - 'outputs': [ - {'amount': 250, 'script': {'condition': aux_cond}}, - {'amount': 250, 'script': "6A0B68656C6C6F207468657265"} # OP_RETURN somedata - ] + 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {'fulfillment': ec_cond}}], + 'outputs': [{'amount': 500, 'script': {'condition': ec_cond}}] } spend1_txid = submit(sign(spend1)) assert rpc.getrawtransaction(spend1_txid) # Test a bad fulfillment spend2 = { - 'inputs': [{'txid': spend0_txid, 'idx': 1, 'script': {'fulfillment': aux_cond}}], - 'outputs': [ - {'amount': 500, 'script': "6A0B68656C6C6F207468657265"} # OP_RETURN somedata - ] + 'inputs': [{'txid': spend0_txid, 'idx': 1, 'script': {'fulfillment': ec_cond}}], + 'outputs': [{'amount': 500, 'script': {'condition': ec_cond}}] } + signed = sign(spend2) + signed['inputs'][0]['script']['fulfillment']['publicKey'] = \ + '0275cef12fc5c49be64f5aab3d1fbba08cd7b0d02908b5112fbd8504218d14bc7d' try: - assert not submit(sign(spend2)), 'should raise an error' + assert not submit(signed), 'should raise an error' except RPCError as e: assert SCRIPT_FALSE in str(e), str(e) -@fanout_input(8) -def test_secp256k1_condition(inp): - ec_cond = { - 'type': 'secp256k1-sha-256', - 'publicKey': notary_pk +@fanout_input(20) +def test_eval_replacement(inp): + eval_cond = { + 'type': 'eval-sha-256', + 'method': 'testReplace', + 'params': '', } - # Create some secp256k1 outputs + # Setup replaceable output spend0 = { 'inputs': [inp], 'outputs': [ - {'amount': 500, 'script': {'condition': ec_cond}}, - {'amount': 500, 'script': {'condition': ec_cond}} + {'amount': 1000, 'script': {'condition': eval_cond}}, ] } spend0_txid = submit(sign(spend0)) assert rpc.getrawtransaction(spend0_txid) - # Test a good fulfillment + b64_1 = 'AQ==' spend1 = { - 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {'fulfillment': ec_cond}}], - 'outputs': [{'amount': 500, 'script': {'condition': ec_cond}}] + 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {'fulfillment': eval_cond}}], + 'outputs': [{'amount': 1000, 'script': {'op_return': b64_1}}] + } + + b64_2 = 'Ag==' + spend2 = { + 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {'fulfillment': eval_cond}}], + 'outputs': [{'amount': 1000, 'script': {'op_return': b64_2}}] } + + # If spend2 is already registered, return true, as this test has already been performed + spend2_txid = hoek.encodeTx(sign(spend2))['txid'] + try: + rpc.getrawtransaction(spend2_txid) + return + except RPCError: + pass + + # Send replaceable spend1_txid = submit(sign(spend1)) assert rpc.getrawtransaction(spend1_txid) - # Test a bad fulfillment - spend2 = { - 'inputs': [{'txid': spend0_txid, 'idx': 1, 'script': {'fulfillment': ec_cond}}], - 'outputs': [{'amount': 500, 'script': {'condition': ec_cond}}] - } - signed = sign(spend2) - signed['inputs'][0]['script']['fulfillment']['publicKey'] = \ - '0275cef12fc5c49be64f5aab3d1fbba08cd7b0d02908b5112fbd8504218d14bc7d' + + # Send replacement (higher OP_RETURN data) + spend2_txid = submit(sign(spend2)) + assert rpc.getrawtransaction(spend2_txid) + + # Now the first transaction has gone try: - assert not submit(signed), 'should raise an error' + assert not rpc.getrawtransaction(spend1_txid), "should raise an error" except RPCError as e: - assert SCRIPT_FALSE in str(e), str(e) + assert 'No information available about transaction' in str(e), str(e) if __name__ == '__main__': diff --git a/qa/cryptoconditions/testsupport.py b/qa/cryptoconditions/testsupport.py index e22520f3f51..a127379f616 100644 --- a/qa/cryptoconditions/testsupport.py +++ b/qa/cryptoconditions/testsupport.py @@ -97,7 +97,7 @@ def get_fanout_txid(): reward_tx = hoek.decodeTx({'hex': reward_tx_raw}) balance = reward_tx['outputs'][0]['amount'] - n_outs = 16 + n_outs = 40 remainder = balance - n_outs * 1000 fanout = { @@ -109,7 +109,9 @@ def get_fanout_txid(): ] + [{"amount": remainder, 'script': {'address': notary_addr}}]) } - return submit(sign(fanout)) + txid = submit(sign(fanout)) + rpc.getrawtransaction(txid) + return txid def fanout_input(n): diff --git a/src/Makefile.am b/src/Makefile.am index 4ec21614d6e..865960ec60b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -137,6 +137,7 @@ BITCOIN_CORE_H = \ init.h \ key.h \ keystore.h \ + komodo_cryptoconditions.h \ leveldbwrapper.h \ limitedmap.h \ main.h \ @@ -155,6 +156,7 @@ BITCOIN_CORE_H = \ protocol.h \ pubkey.h \ random.h \ + replacementpool.h \ reverselock.h \ rpcclient.h \ rpcprotocol.h \ @@ -223,6 +225,7 @@ libbitcoin_server_a_SOURCES = \ httprpc.cpp \ httpserver.cpp \ init.cpp \ + komodo_cryptoconditions.cpp \ leveldbwrapper.cpp \ main.cpp \ merkleblock.cpp \ @@ -232,6 +235,7 @@ libbitcoin_server_a_SOURCES = \ noui.cpp \ policy/fees.cpp \ pow.cpp \ + replacementpool.cpp \ rest.cpp \ rpcblockchain.cpp \ rpcmining.cpp \ @@ -325,6 +329,7 @@ libbitcoin_common_a_SOURCES = \ hash.cpp \ key.cpp \ keystore.cpp \ + komodo_cryptoconditions.cpp \ netbase.cpp \ primitives/block.cpp \ primitives/transaction.cpp \ @@ -336,7 +341,6 @@ libbitcoin_common_a_SOURCES = \ script/script_error.cpp \ script/sign.cpp \ script/standard.cpp \ - komodo_cryptoconditions.cpp \ $(BITCOIN_CORE_H) \ $(LIBZCASH_H) @@ -506,7 +510,6 @@ libzcashconsensus_la_SOURCES = \ script/zcashconsensus.cpp \ script/interpreter.cpp \ script/script.cpp \ - komodo_cryptoconditions.cpp \ uint256.cpp \ utilstrencodings.cpp diff --git a/src/cryptoconditions b/src/cryptoconditions index 9ba2d454564..f606567ce30 160000 --- a/src/cryptoconditions +++ b/src/cryptoconditions @@ -1 +1 @@ -Subproject commit 9ba2d454564c3bb31446a2a2d1db8cb992e6cbe0 +Subproject commit f606567ce30780c28880094718b5b27c5c426827 diff --git a/src/komodo_cryptoconditions.cpp b/src/komodo_cryptoconditions.cpp index 4c516b32022..77e4c6c8a51 100644 --- a/src/komodo_cryptoconditions.cpp +++ b/src/komodo_cryptoconditions.cpp @@ -1,24 +1,93 @@ +#include "replacementpool.h" +#include "komodo_cryptoconditions.h" #include "cryptoconditions/include/cryptoconditions.h" #include "script/interpreter.h" +#include "coins.h" -int TransactionSignatureChecker::CheckAuxCondition(const CC *cond) const +#define REPLACEMENT_WINDOW_BLOCKS 2 + + +bool GetOpReturnData(const CScript &sig, std::vector &data) { - // Check that condition is equal to fulfillment - if (0 == strcmp((const char*)cond->method, "equals")) { - return (cond->conditionAuxLength == cond->fulfillmentAuxLength) && - (0 == memcmp(cond->conditionAux, cond->fulfillmentAux, cond->conditionAuxLength)); - } + auto pc = sig.begin(); + opcodetype opcode; + if (sig.GetOp(pc, opcode)) + if (opcode == OP_RETURN) + if (sig.GetOp(pc, opcode, data)) + return opcode > OP_0 && opcode <= OP_PUSHDATA4; + return false; +} - // Check that pubKeyScript specified in fulfillment is OP_RETURN - if (0 == strcmp((const char*)cond->method, "inputIsReturn")) { - if (cond->fulfillmentAuxLength != 1) return 0; - int n = (int) cond->fulfillmentAux[0]; - if (n >= txTo->vout.size()) return 0; - uint8_t *ptr = (uint8_t *)txTo->vout[n].scriptPubKey.data(); - return ptr[0] == OP_RETURN; + +bool EvalConditionBool(const CC *cond, const CTransaction *txTo) +{ + if (strcmp(cond->method, "testEval") == 0) { + return cond->paramsBinLength == 8 && + memcmp(cond->paramsBin, "testEval", 8) == 0; } - printf("no defined behaviour for method:%s\n", cond->method); + if (strcmp(cond->method, "testReplace") == 0) { + return true; + } + fprintf(stderr, "no defined behaviour for method: %s\n", cond->method); return 0; } + + +bool GetConditionPriority(const CC *cond, CTxReplacementPoolItem *rep) +{ + if (strcmp((const char*)cond->method, "testReplace") == 0) { + std::vector data; + if (GetOpReturnData(rep->tx.vout[0].scriptPubKey, data)) { + rep->priority = (uint64_t) data[0]; + rep->replacementWindow = REPLACEMENT_WINDOW_BLOCKS; + return true; + } + } + return false; +} + + +bool TransactionSignatureChecker::CheckEvalCondition(const CC *cond) const +{ + return EvalConditionBool(cond, txTo); +} + + +extern "C" +{ + int visitConditionPriority(CC *cond, struct CCVisitor visitor); +} + + +int visitConditionPriority(CC *cond, struct CCVisitor visitor) +{ + if (cc_typeId(cond) == CC_Eval) { + if (GetConditionPriority(cond, (CTxReplacementPoolItem*)visitor.context)) { + return 0; // stop + } + } + return 1; // continue +} + + +bool SetReplacementParams(CTxReplacementPoolItem &rep) +{ + // first, see if we have a cryptocondition + const CScript &sig = rep.tx.vin[0].scriptSig; + if (!sig.IsPushOnly()) return false; + CScript::const_iterator pc = sig.begin(); + std::vector data; + opcodetype opcode; + if (!sig.GetOp(pc, opcode, data)) return false; + CC *cond = cc_readFulfillmentBinary((unsigned char*)data.data(), data.size()); + if (!cond) return false; + + // now, see if it has a replacement node + CC *replacementNode = 0; + CCVisitor visitor = {&visitConditionPriority, (const unsigned char*)"", 0, &rep}; + bool out = cc_visit(cond, visitor); + cc_free(cond); + return !out; +} diff --git a/src/komodo_cryptoconditions.h b/src/komodo_cryptoconditions.h index 42cf3b077bd..406b2f10047 100644 --- a/src/komodo_cryptoconditions.h +++ b/src/komodo_cryptoconditions.h @@ -1,12 +1,19 @@ #ifndef KOMODO_CRYPTOCONDITIONS_H #define KOMODO_CRYPTOCONDITIONS_H +#include "coins.h" +#include "replacementpool.h" #include "cryptoconditions/include/cryptoconditions.h" extern int32_t ASSETCHAINS_CC; +extern CTxReplacementPool replacementPool; + static bool IsCryptoConditionsEnabled() { return 0 != ASSETCHAINS_CC; } +bool EvalConditionBool(const CC *cond, const CTransaction *tx); +//uint64_t EvalConditionPriority(const CC *cond, const CTransaction *tx); +bool SetReplacementParams(CTxReplacementPoolItem &rep); #endif /* KOMODO_CRYPTOCONDITIONS_H */ diff --git a/src/main.cpp b/src/main.cpp index 72f25f1fc34..2ff543b8c65 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -21,6 +21,8 @@ #include "pow.h" #include "txdb.h" #include "txmempool.h" +#include "replacementpool.h" +#include "komodo_cryptoconditions.h" #include "ui_interface.h" #include "undo.h" #include "util.h" @@ -53,6 +55,7 @@ extern uint8_t NOTARY_PUBKEY33[33]; BlockMap mapBlockIndex; CChain chainActive; + CBlockIndex *pindexBestHeader = NULL; int64_t nTimeBestReceived = 0; CWaitableCriticalSection csBestBlock; @@ -1107,7 +1110,7 @@ CAmount GetMinRelayFee(const CTransaction& tx, unsigned int nBytes, bool fAllowF } -bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree,bool* pfMissingInputs, bool fRejectAbsurdFee) +bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree,bool* pfMissingInputs, bool fRejectAbsurdFee, bool fAcceptReplacement) { AssertLockHeld(cs_main); if (pfMissingInputs) @@ -1178,6 +1181,8 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa } } + CTxReplacementPoolResult rpr = RP_NotReplace; + { CCoinsView dummy; CCoinsViewCache view(&dummy); @@ -1331,13 +1336,35 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa return error("AcceptToMemoryPool: BUG! PLEASE REPORT THIS! ConnectInputs failed against MANDATORY but not STANDARD flags %s", hash.ToString()); } - // Store transaction in memory if ( komodo_is_notarytx(tx) == 0 ) KOMODO_ON_DEMAND++; - pool.addUnchecked(hash, entry, !IsInitialBlockDownload()); + + if (fAcceptReplacement) { + CTxReplacementPoolItem item(tx, GetHeight()); + if (SetReplacementParams(item)) { + rpr = replacementPool.replace(item); + } + } + + if (rpr == RP_Invalid) { + // already have a better one + // TODO: Shouldn't neccesary log this as invalid, not sure if punishing peers is the best idea + fprintf(stderr,"accept failure.20\n"); + return error("AcceptToMemoryPool: Replacement is worse %s", hash.ToString()); + } + + // If there is no replacement action happening... + if (rpr == RP_NotReplace) { + // Store transaction in memory + pool.addUnchecked(hash, entry, !IsInitialBlockDownload()); + } } - SyncWithWallets(tx, NULL); + // in order for replaceable transactions to sync with wallet, replacementpool should advise + // wallet of transaction eviction + if (rpr == RP_NotReplace) { + SyncWithWallets(tx, NULL); + } return true; } @@ -1354,6 +1381,12 @@ bool GetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock return true; } + // replacementPool lookup is O(n) since there's no index by txid + if (fAllowSlow && replacementPool.lookup(hash, txOut)) + { + return true; + } + if (fTxIndex) { CDiskTxPos postx; if (pblocktree->ReadTxIndex(hash, postx)) { @@ -1403,6 +1436,17 @@ bool GetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock return false; } + +void ProcessReplacementPool(int newHeight) +{ + std::vector pending; + replacementPool.removePending(newHeight, pending); + CValidationState stateDummy; + BOOST_FOREACH(CTransaction tx, pending) { + AcceptToMemoryPool(mempool, stateDummy, tx, false, NULL, false, false); + } +} + /*char *komodo_getspendscript(uint256 hash,int32_t n) { CTransaction tx; uint256 hashBlock; @@ -2702,6 +2746,13 @@ bool static DisconnectTip(CValidationState &state) { // Update cached incremental witnesses //fprintf(stderr,"chaintip false\n"); GetMainSignals().ChainTip(pindexDelete, &block, newTree, false); + + /* if chain tip disconnects, some transactions may return to the replacementPool + * via AcceptToMemoryPool. + * + * No double send conflicts may result as the winning transaction will be picked. + */ + return true; } @@ -2761,6 +2812,8 @@ bool static ConnectTip(CValidationState &state, CBlockIndex *pindexNew, CBlock * mempool.check(pcoinsTip); // Update chainActive & related variables. UpdateTip(pindexNew); + // Process pending replacements + ProcessReplacementPool(pindexNew->nHeight-1); // Tell wallet about transactions that went from mempool // to conflicted: BOOST_FOREACH(const CTransaction &tx, txConflicted) { @@ -2770,6 +2823,7 @@ bool static ConnectTip(CValidationState &state, CBlockIndex *pindexNew, CBlock * BOOST_FOREACH(const CTransaction &tx, pblock->vtx) { SyncWithWallets(tx, pblock); } + // Update cached incremental witnesses //fprintf(stderr,"chaintip true\n"); GetMainSignals().ChainTip(pindexNew, pblock, oldTree, true); diff --git a/src/main.h b/src/main.h index bcdd04a5ea9..061dcfcc54e 100644 --- a/src/main.h +++ b/src/main.h @@ -250,7 +250,7 @@ void PruneAndFlush(); /** (try to) add transaction to memory pool **/ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree, - bool* pfMissingInputs, bool fRejectAbsurdFee=false); + bool* pfMissingInputs, bool fRejectAbsurdFee=false, bool fAcceptReplacement=true); struct CNodeStateStats { diff --git a/src/replacementpool.cpp b/src/replacementpool.cpp new file mode 100644 index 00000000000..0a509ef37b4 --- /dev/null +++ b/src/replacementpool.cpp @@ -0,0 +1,96 @@ + +#include +#include +#include + +#include "main.h" +#include "coins.h" +#include "replacementpool.h" + + +CTxReplacementPool replacementPool; + + +/* + * Add a transaction to the pool, with a priority. + * Return true if valid, false if not valid. */ +bool ValidateReplacementPoolItem(CTxReplacementPoolItem item) +{ + // Perform some validations. + if (item.tx.vin.size() > 1) { + // Replaceable transactions with multiple inputs are disabled for now. It's not yet clear + // what edge cases may arise. It is speculated that it will "just work", since if + // replaceable transactions spend multiple outputs using the replacement protocol, + // they will never conflict in the replaceMap data structure. But for now, to be prudent, disable. + return false; + } + + // A transaction with 0 priority is not valid. + if (item.priority == 0) { + return false; + } + + return true; +} + + +/* + * Validate the item + * + * Compare the item with any current replacement candidate + * + * Ensure that the item is not passed the replacement window + * + * Insert the item into the map + */ +CTxReplacementPoolResult CTxReplacementPool::replace(CTxReplacementPoolItem &item) +{ + if (!ValidateReplacementPoolItem(item)) { + return RP_Invalid; + } + + auto it = replaceMap.find(item.tx.vin[0].prevout); + + if (it != replaceMap.end()) { + if (it->second.priority >= item.priority) { + // Already have a transaction with equal or greater priority; this is not valid + return RP_Invalid; + } + // copy the previous starting block over + item.startBlock = it->second.startBlock; + } + + // This transaction has higher priority + replaceMap[item.tx.vin[0].prevout] = item; + + return RP_Valid; +} + + +void CTxReplacementPool::removePending(int height, std::vector &txs) +{ + for (auto it = replaceMap.begin(); it != replaceMap.end(); /**/) { + CTxReplacementPoolItem &rep = it->second; + if (rep.GetTargetBlock() <= height) { + txs.push_back(rep.tx); + replaceMap.erase(it++); + } else { + ++it; + } + } +} + + +/* + * O(n) lookup of tx by hash + */ +bool CTxReplacementPool::lookup(uint256 txHash, CTransaction &tx) +{ + for (auto it = replaceMap.begin(); it != replaceMap.end(); it++) { + if (it->second.tx.GetHash() == txHash) { + tx = it->second.tx; + return true; + } + } + return false; +} diff --git a/src/replacementpool.h b/src/replacementpool.h new file mode 100644 index 00000000000..71cb775fd9b --- /dev/null +++ b/src/replacementpool.h @@ -0,0 +1,68 @@ +// Copyright (c) 2018 The Komodo Developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef KOMODO_REPLACEMENTCACHE_H +#define KOMODO_REPLACEMENTCACHE_H + +#include "coins.h" +#include "primitives/transaction.h" + + +enum CTxReplacementPoolResult { RP_NotReplace, RP_Valid, RP_Invalid }; + +class CTxReplacementPoolItem +{ +public: + CTransaction tx; + int startBlock; + uint64_t priority; + uint32_t replacementWindow; + + CTxReplacementPoolItem() {} + + CTxReplacementPoolItem(const CTransaction &_tx, int _startBlock) { + tx = _tx; + startBlock = _startBlock; + priority = 0; + replacementWindow = 0; + } + + int GetTargetBlock() + { + return startBlock + replacementWindow; + } +}; + +/** + * CTxReplacementPool stores valid-according-to-the-current-best-chain (??? do we need to do this?) + * transactions that are valid but held for period of time during which + * they may be replaced. + * + * Transactions are added when they are found to be valid but not added + * to the mempool until a timeout. + * + * Replacement pool is like another mempool before the main mempool. + */ +class CTxReplacementPool +{ +private: + // A potential replacement is first stored here, not in the replaceMap. + // This is in case some other checks fail, during AcceptToMemoryPool. + // Later on, if all checks pass, processReplacement() is called. + + /* Index of spends that may be replaced */ + std::map replaceMap; +public: + CTxReplacementPoolResult replace(CTxReplacementPoolItem &item); + + // Remove and return all transactions up to a given block height. + void removePending(int height, std::vector &txs); + + bool lookup(uint256 txHash, CTransaction &tx); +}; + + +extern CTxReplacementPool replacementPool; + +#endif // KOMODO_REPLACEMENTCACHE_H diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 91b22039e94..09c09ced393 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -1154,18 +1154,18 @@ bool TransactionSignatureChecker::CheckSig(const vector& vchSigIn extern "C" { - static int komodoCCAux(CC *cond, void *transactionSignatureChecker); + static int komodoCCEval(CC *cond, void *transactionSignatureChecker); } -static int komodoCCAux(CC *cond, void *checker) { - return ((TransactionSignatureChecker*)checker)->CheckAuxCondition(cond); +static int komodoCCEval(CC *cond, void *checker) { + return ((TransactionSignatureChecker*)checker)->CheckEvalCondition(cond); } bool TransactionSignatureChecker::CheckCryptoCondition(const CC *cond, const std::vector& condBin, const CScript& scriptCode) const { uint256 message = SignatureHash(scriptCode, *txTo, nIn, SIGHASH_ALL); return cc_verify(cond, (const unsigned char*)&message, 32, 0, - condBin.data(), condBin.size(), komodoCCAux, (void*)this); + condBin.data(), condBin.size(), komodoCCEval, (void*)this); } bool TransactionSignatureChecker::CheckLockTime(const CScriptNum& nLockTime) const diff --git a/src/script/interpreter.h b/src/script/interpreter.h index 8936fde7a15..2cdeb8f8e1e 100644 --- a/src/script/interpreter.h +++ b/src/script/interpreter.h @@ -125,7 +125,7 @@ class TransactionSignatureChecker : public BaseSignatureChecker bool CheckSig(const std::vector& scriptSig, const std::vector& vchPubKey, const CScript& scriptCode) const; bool CheckLockTime(const CScriptNum& nLockTime) const; bool CheckCryptoCondition(const CC *cond, const std::vector& condBin, const CScript& scriptCode) const; - int CheckAuxCondition(const CC *cond) const; + bool CheckEvalCondition(const CC *cond) const; }; class MutableTransactionSignatureChecker : public TransactionSignatureChecker From e102037e61a2274cc807983f3aa150611e471740 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Thu, 8 Mar 2018 16:35:39 -0300 Subject: [PATCH 0040/1081] cleanup transaction replacement return codes --- src/consensus/validation.h | 1 + src/main.cpp | 23 ++++++++++++----- src/replacementpool.cpp | 53 ++++++++++++++------------------------ src/replacementpool.h | 30 +++++++++++---------- 4 files changed, 52 insertions(+), 55 deletions(-) diff --git a/src/consensus/validation.h b/src/consensus/validation.h index c62adcd8fc3..6c4db4c5906 100644 --- a/src/consensus/validation.h +++ b/src/consensus/validation.h @@ -17,6 +17,7 @@ static const unsigned char REJECT_NONSTANDARD = 0x40; static const unsigned char REJECT_DUST = 0x41; static const unsigned char REJECT_INSUFFICIENTFEE = 0x42; static const unsigned char REJECT_CHECKPOINT = 0x43; +static const unsigned char REJECT_HAVEBETTER = 0x44; /** Capture information about block/transaction validation */ class CValidationState { diff --git a/src/main.cpp b/src/main.cpp index 2ff543b8c65..09ff2871c70 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1181,7 +1181,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa } } - CTxReplacementPoolResult rpr = RP_NotReplace; + CTxReplacementPoolResult rpr = RP_NotReplaceable; { CCoinsView dummy; @@ -1339,22 +1339,31 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa if ( komodo_is_notarytx(tx) == 0 ) KOMODO_ON_DEMAND++; - if (fAcceptReplacement) { + if (fAcceptReplacement) + { CTxReplacementPoolItem item(tx, GetHeight()); if (SetReplacementParams(item)) { rpr = replacementPool.replace(item); } } - if (rpr == RP_Invalid) { + if (rpr == RP_HaveBetter) + { // already have a better one - // TODO: Shouldn't neccesary log this as invalid, not sure if punishing peers is the best idea fprintf(stderr,"accept failure.20\n"); - return error("AcceptToMemoryPool: Replacement is worse %s", hash.ToString()); + return state.DoS(0, error("AcceptToMemoryPool: Replacement is worse"), REJECT_HAVEBETTER, "replacement-is-worse"); + } + + if (rpr == RP_Invalid) + { + // Not valid according to replaceability rules + fprintf(stderr,"accept failure.21\n"); + return state.DoS(0, error("AcceptToMemoryPool: Replacement is invalid"), REJECT_INVALID, "replacement-is-worse"); } // If there is no replacement action happening... - if (rpr == RP_NotReplace) { + if (rpr == RP_NotReplaceable) + { // Store transaction in memory pool.addUnchecked(hash, entry, !IsInitialBlockDownload()); } @@ -1362,7 +1371,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa // in order for replaceable transactions to sync with wallet, replacementpool should advise // wallet of transaction eviction - if (rpr == RP_NotReplace) { + if (rpr == RP_NotReplaceable) { SyncWithWallets(tx, NULL); } diff --git a/src/replacementpool.cpp b/src/replacementpool.cpp index 0a509ef37b4..42da4fa7cc8 100644 --- a/src/replacementpool.cpp +++ b/src/replacementpool.cpp @@ -1,39 +1,11 @@ -#include -#include -#include - #include "main.h" -#include "coins.h" #include "replacementpool.h" CTxReplacementPool replacementPool; -/* - * Add a transaction to the pool, with a priority. - * Return true if valid, false if not valid. */ -bool ValidateReplacementPoolItem(CTxReplacementPoolItem item) -{ - // Perform some validations. - if (item.tx.vin.size() > 1) { - // Replaceable transactions with multiple inputs are disabled for now. It's not yet clear - // what edge cases may arise. It is speculated that it will "just work", since if - // replaceable transactions spend multiple outputs using the replacement protocol, - // they will never conflict in the replaceMap data structure. But for now, to be prudent, disable. - return false; - } - - // A transaction with 0 priority is not valid. - if (item.priority == 0) { - return false; - } - - return true; -} - - /* * Validate the item * @@ -45,7 +17,17 @@ bool ValidateReplacementPoolItem(CTxReplacementPoolItem item) */ CTxReplacementPoolResult CTxReplacementPool::replace(CTxReplacementPoolItem &item) { - if (!ValidateReplacementPoolItem(item)) { + AssertLockHeld(cs_main); + + // Perform some validations. + if (item.tx.vin.size() > 1) { + // Replaceable transactions with multiple inputs are disabled. + // It seems like quite alot of additional complexity. + return RP_Invalid; + } + + // A transaction with 0 priority is not valid. + if (item.priority == 0) { return RP_Invalid; } @@ -53,22 +35,25 @@ CTxReplacementPoolResult CTxReplacementPool::replace(CTxReplacementPoolItem &ite if (it != replaceMap.end()) { if (it->second.priority >= item.priority) { - // Already have a transaction with equal or greater priority; this is not valid - return RP_Invalid; + return RP_HaveBetter; // (ThanksThough) } - // copy the previous starting block over - item.startBlock = it->second.startBlock; } // This transaction has higher priority replaceMap[item.tx.vin[0].prevout] = item; + replaceMap[item.tx.vin[0].prevout].startBlock = it->second.startBlock; - return RP_Valid; + return RP_Accepted; } +/* + * Remove and return any spends that have matured + */ void CTxReplacementPool::removePending(int height, std::vector &txs) { + AssertLockHeld(cs_main); + for (auto it = replaceMap.begin(); it != replaceMap.end(); /**/) { CTxReplacementPoolItem &rep = it->second; if (rep.GetTargetBlock() <= height) { diff --git a/src/replacementpool.h b/src/replacementpool.h index 71cb775fd9b..6bf57799919 100644 --- a/src/replacementpool.h +++ b/src/replacementpool.h @@ -5,11 +5,11 @@ #ifndef KOMODO_REPLACEMENTCACHE_H #define KOMODO_REPLACEMENTCACHE_H -#include "coins.h" #include "primitives/transaction.h" -enum CTxReplacementPoolResult { RP_NotReplace, RP_Valid, RP_Invalid }; +enum CTxReplacementPoolResult { RP_Accepted, RP_HaveBetter, RP_Invalid, RP_NotReplaceable }; + class CTxReplacementPoolItem { @@ -28,41 +28,43 @@ class CTxReplacementPoolItem replacementWindow = 0; } - int GetTargetBlock() - { - return startBlock + replacementWindow; - } + int GetTargetBlock() { return startBlock + replacementWindow; } }; /** - * CTxReplacementPool stores valid-according-to-the-current-best-chain (??? do we need to do this?) - * transactions that are valid but held for period of time during which - * they may be replaced. + * CTxReplacementPool stores transactions that are valid but held for + * period of time during which they may be replaced. * * Transactions are added when they are found to be valid but not added * to the mempool until a timeout. * * Replacement pool is like another mempool before the main mempool. + * + * Transactions in the replacement pool are indexed by the output + * that they are spending. Once a replaceable transaction tries to + * spend an output, a countdown of blocks begins at the current block + * plus a window that is set by "userland" code. If another, better + * transaction replaces the spend that's already pending, the countdown + * start block remains the same. */ class CTxReplacementPool { private: - // A potential replacement is first stored here, not in the replaceMap. - // This is in case some other checks fail, during AcceptToMemoryPool. - // Later on, if all checks pass, processReplacement() is called. - /* Index of spends that may be replaced */ std::map replaceMap; public: + /* Try to replace a transaction in the index */ CTxReplacementPoolResult replace(CTxReplacementPoolItem &item); - // Remove and return all transactions up to a given block height. + /* Remove and return all transactions up to a given block height */ void removePending(int height, std::vector &txs); + /* Find a transaction in the index by it's hash. */ bool lookup(uint256 txHash, CTransaction &tx); }; +/* Global instance */ extern CTxReplacementPool replacementPool; #endif // KOMODO_REPLACEMENTCACHE_H From 1fe68cf52a8b6db3626d7fd8bc9cf9f47d612f01 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Thu, 8 Mar 2018 23:01:00 -0300 Subject: [PATCH 0041/1081] process orphan transactions after processing replacements --- src/komodo_cryptoconditions.h | 8 +-- src/main.cpp | 126 +++++++++++++++++++--------------- 2 files changed, 74 insertions(+), 60 deletions(-) diff --git a/src/komodo_cryptoconditions.h b/src/komodo_cryptoconditions.h index 406b2f10047..24eb341edce 100644 --- a/src/komodo_cryptoconditions.h +++ b/src/komodo_cryptoconditions.h @@ -1,19 +1,19 @@ #ifndef KOMODO_CRYPTOCONDITIONS_H #define KOMODO_CRYPTOCONDITIONS_H -#include "coins.h" #include "replacementpool.h" #include "cryptoconditions/include/cryptoconditions.h" extern int32_t ASSETCHAINS_CC; -extern CTxReplacementPool replacementPool; - static bool IsCryptoConditionsEnabled() { return 0 != ASSETCHAINS_CC; } +extern CTxReplacementPool replacementPool; + bool EvalConditionBool(const CC *cond, const CTransaction *tx); -//uint64_t EvalConditionPriority(const CC *cond, const CTransaction *tx); + bool SetReplacementParams(CTxReplacementPoolItem &rep); + #endif /* KOMODO_CRYPTOCONDITIONS_H */ diff --git a/src/main.cpp b/src/main.cpp index 09ff2871c70..ecf0e4f3001 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1446,13 +1446,17 @@ bool GetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock } +void ProcessOrphanTransactions(uint256 initialHash); + void ProcessReplacementPool(int newHeight) { std::vector pending; replacementPool.removePending(newHeight, pending); CValidationState stateDummy; BOOST_FOREACH(CTransaction tx, pending) { - AcceptToMemoryPool(mempool, stateDummy, tx, false, NULL, false, false); + if (AcceptToMemoryPool(mempool, stateDummy, tx, false, NULL, false, false)) + ProcessOrphanTransactions(tx.GetHash()); + // otherwise silently drop. TODO: log } } @@ -4690,6 +4694,70 @@ void static ProcessGetData(CNode* pfrom) } } + +void ProcessOrphanTransactions(uint256 parentHash) +{ + AssertLockHeld(cs_main); + + vector vWorkQueue, vEraseQueue; + // Recursively process any orphan transactions that depended on this one + vWorkQueue.push_back(parentHash); + set setMisbehaving; + + for (unsigned int i = 0; i < vWorkQueue.size(); i++) + { + map >::iterator itByPrev = mapOrphanTransactionsByPrev.find(vWorkQueue[i]); + if (itByPrev == mapOrphanTransactionsByPrev.end()) + continue; + for (set::iterator mi = itByPrev->second.begin(); + mi != itByPrev->second.end(); + ++mi) + { + const uint256& orphanHash = *mi; + const CTransaction& orphanTx = mapOrphanTransactions[orphanHash].tx; + NodeId fromPeer = mapOrphanTransactions[orphanHash].fromPeer; + bool fMissingInputs2 = false; + // Use a dummy CValidationState so someone can't setup nodes to counter-DoS based on orphan + // resolution (that is, feeding people an invalid transaction based on LegitTxX in order to get + // anyone relaying LegitTxX banned) + CValidationState stateDummy; + + + if (setMisbehaving.count(fromPeer)) + continue; + if (AcceptToMemoryPool(mempool, stateDummy, orphanTx, true, &fMissingInputs2)) + { + LogPrint("mempool", " accepted orphan tx %s\n", orphanHash.ToString()); + RelayTransaction(orphanTx); + vWorkQueue.push_back(orphanHash); + vEraseQueue.push_back(orphanHash); + } + else if (!fMissingInputs2) + { + int nDos = 0; + if (stateDummy.IsInvalid(nDos) && nDos > 0) + { + // Punish peer that gave us an invalid orphan tx + Misbehaving(fromPeer, nDos); + setMisbehaving.insert(fromPeer); + LogPrint("mempool", " invalid orphan tx %s\n", orphanHash.ToString()); + } + // Has inputs but not accepted to mempool + // Probably non-standard or insufficient fee/priority + LogPrint("mempool", " removed orphan tx %s\n", orphanHash.ToString()); + vEraseQueue.push_back(orphanHash); + assert(recentRejects); + recentRejects->insert(orphanHash); + } + mempool.check(pcoinsTip); + } + } + + BOOST_FOREACH(uint256 hash, vEraseQueue) + EraseOrphanTx(hash); +} + + bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, int64_t nTimeReceived) { const CChainParams& chainparams = Params(); @@ -5090,8 +5158,6 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, else if (strCommand == "tx") { - vector vWorkQueue; - vector vEraseQueue; CTransaction tx; vRecv >> tx; @@ -5110,66 +5176,14 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, { mempool.check(pcoinsTip); RelayTransaction(tx); - vWorkQueue.push_back(inv.hash); LogPrint("mempool", "AcceptToMemoryPool: peer=%d %s: accepted %s (poolsz %u)\n", pfrom->id, pfrom->cleanSubVer, tx.GetHash().ToString(), mempool.mapTx.size()); - // Recursively process any orphan transactions that depended on this one - set setMisbehaving; - for (unsigned int i = 0; i < vWorkQueue.size(); i++) - { - map >::iterator itByPrev = mapOrphanTransactionsByPrev.find(vWorkQueue[i]); - if (itByPrev == mapOrphanTransactionsByPrev.end()) - continue; - for (set::iterator mi = itByPrev->second.begin(); - mi != itByPrev->second.end(); - ++mi) - { - const uint256& orphanHash = *mi; - const CTransaction& orphanTx = mapOrphanTransactions[orphanHash].tx; - NodeId fromPeer = mapOrphanTransactions[orphanHash].fromPeer; - bool fMissingInputs2 = false; - // Use a dummy CValidationState so someone can't setup nodes to counter-DoS based on orphan - // resolution (that is, feeding people an invalid transaction based on LegitTxX in order to get - // anyone relaying LegitTxX banned) - CValidationState stateDummy; - - - if (setMisbehaving.count(fromPeer)) - continue; - if (AcceptToMemoryPool(mempool, stateDummy, orphanTx, true, &fMissingInputs2)) - { - LogPrint("mempool", " accepted orphan tx %s\n", orphanHash.ToString()); - RelayTransaction(orphanTx); - vWorkQueue.push_back(orphanHash); - vEraseQueue.push_back(orphanHash); - } - else if (!fMissingInputs2) - { - int nDos = 0; - if (stateDummy.IsInvalid(nDos) && nDos > 0) - { - // Punish peer that gave us an invalid orphan tx - Misbehaving(fromPeer, nDos); - setMisbehaving.insert(fromPeer); - LogPrint("mempool", " invalid orphan tx %s\n", orphanHash.ToString()); - } - // Has inputs but not accepted to mempool - // Probably non-standard or insufficient fee/priority - LogPrint("mempool", " removed orphan tx %s\n", orphanHash.ToString()); - vEraseQueue.push_back(orphanHash); - assert(recentRejects); - recentRejects->insert(orphanHash); - } - mempool.check(pcoinsTip); - } - } + ProcessOrphanTransactions(inv.hash); - BOOST_FOREACH(uint256 hash, vEraseQueue) - EraseOrphanTx(hash); } // TODO: currently, prohibit joinsplits from entering mapOrphans else if (fMissingInputs && tx.vjoinsplit.size() == 0) From 346eb4ae255ef6cfd1072680a1a559609d25c1c7 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Fri, 9 Mar 2018 09:40:31 -0300 Subject: [PATCH 0042/1081] small refactor --- src/komodo_cryptoconditions.cpp | 69 ++++++++++++++++----------------- src/komodo_cryptoconditions.h | 6 ++- src/script/interpreter.cpp | 11 ++++-- 3 files changed, 47 insertions(+), 39 deletions(-) diff --git a/src/komodo_cryptoconditions.cpp b/src/komodo_cryptoconditions.cpp index 77e4c6c8a51..debc2182f12 100644 --- a/src/komodo_cryptoconditions.cpp +++ b/src/komodo_cryptoconditions.cpp @@ -2,26 +2,15 @@ #include "replacementpool.h" #include "komodo_cryptoconditions.h" #include "cryptoconditions/include/cryptoconditions.h" -#include "script/interpreter.h" -#include "coins.h" #define REPLACEMENT_WINDOW_BLOCKS 2 -bool GetOpReturnData(const CScript &sig, std::vector &data) -{ - auto pc = sig.begin(); - opcodetype opcode; - if (sig.GetOp(pc, opcode)) - if (opcode == OP_RETURN) - if (sig.GetOp(pc, opcode, data)) - return opcode > OP_0 && opcode <= OP_PUSHDATA4; - return false; -} - - -bool EvalConditionBool(const CC *cond, const CTransaction *txTo) +/* + * Evaluate the validity of an Eval node + */ +bool EvalConditionValidity(const CC *cond, const CTransaction *txTo) { if (strcmp(cond->method, "testEval") == 0) { return cond->paramsBinLength == 8 && @@ -35,7 +24,16 @@ bool EvalConditionBool(const CC *cond, const CTransaction *txTo) } -bool GetConditionPriority(const CC *cond, CTxReplacementPoolItem *rep) +/* + * Evaluate the priority of an eval node. + * + * This method should set the ->priority and ->replacementWindow (in blocks) + * of the provided replacement pool item. Priority is a 64 bit unsigned int and + * 0 is invalid. + * + * This method does not need to validate, that is done separately. + */ +bool EvalConditionPriority(const CC *cond, CTxReplacementPoolItem *rep) { if (strcmp((const char*)cond->method, "testReplace") == 0) { std::vector data; @@ -49,30 +47,18 @@ bool GetConditionPriority(const CC *cond, CTxReplacementPoolItem *rep) } -bool TransactionSignatureChecker::CheckEvalCondition(const CC *cond) const -{ - return EvalConditionBool(cond, txTo); -} - - -extern "C" -{ - int visitConditionPriority(CC *cond, struct CCVisitor visitor); -} - - int visitConditionPriority(CC *cond, struct CCVisitor visitor) { - if (cc_typeId(cond) == CC_Eval) { - if (GetConditionPriority(cond, (CTxReplacementPoolItem*)visitor.context)) { - return 0; // stop - } - } - return 1; // continue + auto rep = (CTxReplacementPoolItem*)visitor.context; + // visitor protocol is 1 for continue, 0 for stop + return !(cc_typeId(cond) == CC_Eval && EvalConditionPriority(cond, rep)); } -bool SetReplacementParams(CTxReplacementPoolItem &rep) +/* + * Try to get replacement parameters from a transaction in &rep. + */ +bool PutReplacementParams(CTxReplacementPoolItem &rep) { // first, see if we have a cryptocondition const CScript &sig = rep.tx.vin[0].scriptSig; @@ -82,6 +68,7 @@ bool SetReplacementParams(CTxReplacementPoolItem &rep) opcodetype opcode; if (!sig.GetOp(pc, opcode, data)) return false; CC *cond = cc_readFulfillmentBinary((unsigned char*)data.data(), data.size()); + auto wat = {1, ""}; if (!cond) return false; // now, see if it has a replacement node @@ -91,3 +78,15 @@ bool SetReplacementParams(CTxReplacementPoolItem &rep) cc_free(cond); return !out; } + + +bool GetOpReturnData(const CScript &sig, std::vector &data) +{ + auto pc = sig.begin(); + opcodetype opcode; + if (sig.GetOp(pc, opcode)) + if (opcode == OP_RETURN) + if (sig.GetOp(pc, opcode, data)) + return opcode > OP_0 && opcode <= OP_PUSHDATA4; + return false; +} diff --git a/src/komodo_cryptoconditions.h b/src/komodo_cryptoconditions.h index 24eb341edce..926cd0be9c8 100644 --- a/src/komodo_cryptoconditions.h +++ b/src/komodo_cryptoconditions.h @@ -3,6 +3,8 @@ #include "replacementpool.h" #include "cryptoconditions/include/cryptoconditions.h" +#include "script/script.h" + extern int32_t ASSETCHAINS_CC; @@ -12,8 +14,10 @@ static bool IsCryptoConditionsEnabled() { extern CTxReplacementPool replacementPool; -bool EvalConditionBool(const CC *cond, const CTransaction *tx); +bool EvalConditionValidity(const CC *cond, const CTransaction *tx); bool SetReplacementParams(CTxReplacementPoolItem &rep); +bool GetOpReturnData(const CScript &sig, std::vector &data); + #endif /* KOMODO_CRYPTOCONDITIONS_H */ diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 09c09ced393..208f19c31ca 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -1152,15 +1152,19 @@ bool TransactionSignatureChecker::CheckSig(const vector& vchSigIn return true; } -extern "C" + +bool TransactionSignatureChecker::CheckEvalCondition(const CC *cond) const { - static int komodoCCEval(CC *cond, void *transactionSignatureChecker); + return EvalConditionValidity(cond, txTo); } -static int komodoCCEval(CC *cond, void *checker) { + +static int komodoCCEval(CC *cond, void *checker) +{ return ((TransactionSignatureChecker*)checker)->CheckEvalCondition(cond); } + bool TransactionSignatureChecker::CheckCryptoCondition(const CC *cond, const std::vector& condBin, const CScript& scriptCode) const { uint256 message = SignatureHash(scriptCode, *txTo, nIn, SIGHASH_ALL); @@ -1168,6 +1172,7 @@ bool TransactionSignatureChecker::CheckCryptoCondition(const CC *cond, const std condBin.data(), condBin.size(), komodoCCEval, (void*)this); } + bool TransactionSignatureChecker::CheckLockTime(const CScriptNum& nLockTime) const { // There are two times of nLockTime: lock-by-blockheight From a8acafb3548e57096287313ccdd9782717b7df5a Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Mon, 12 Mar 2018 01:57:35 -0300 Subject: [PATCH 0043/1081] test suite for replacementPool --- .gitignore | 1 + src/Makefile.am | 5 +- src/Makefile.ktest.include | 16 + src/cryptoconditions | 2 +- src/komodo_cryptoconditions.cpp | 41 +- src/komodo_cryptoconditions.h | 1 + src/main.cpp | 80 ++-- src/replacementpool.cpp | 44 ++- src/replacementpool.h | 9 +- src/rpcmining.cpp | 5 + src/test-komodo/main.cpp | 9 + src/test-komodo/test_replacementpool.cpp | 461 +++++++++++++++++++++++ 12 files changed, 603 insertions(+), 71 deletions(-) create mode 100644 src/Makefile.ktest.include create mode 100644 src/test-komodo/main.cpp create mode 100644 src/test-komodo/test_replacementpool.cpp diff --git a/.gitignore b/.gitignore index 6f82717db06..bebcef93246 100644 --- a/.gitignore +++ b/.gitignore @@ -119,3 +119,4 @@ src/rpcmisc~.cpp src/komodo-cli src/komodod src/komodo-tx +src/komodo-test diff --git a/src/Makefile.am b/src/Makefile.am index 865960ec60b..7c020062305 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -562,9 +562,10 @@ endif @test -f $(PROTOC) $(AM_V_GEN) $(PROTOC) --cpp_out=$(@D) --proto_path=$(abspath $(method, "testEval") == 0) { - return cond->paramsBinLength == 8 && - memcmp(cond->paramsBin, "testEval", 8) == 0; - } - if (strcmp(cond->method, "testReplace") == 0) { - return true; + if (ASSETCHAINS_CC_TEST) { + if (strcmp(cond->method, "testEval") == 0) { + return cond->paramsBinLength == 8 && + memcmp(cond->paramsBin, "testEval", 8) == 0; + } + if (strcmp(cond->method, "testReplace") == 0) { + std::vector data; + auto out = txTo->vout[txTo->vout.size()-1]; // Last output is data + return GetOpReturnData(out.scriptPubKey, data) && data.size() == 2; + } } fprintf(stderr, "no defined behaviour for method: %s\n", cond->method); return 0; @@ -31,16 +35,22 @@ bool EvalConditionValidity(const CC *cond, const CTransaction *txTo) * of the provided replacement pool item. Priority is a 64 bit unsigned int and * 0 is invalid. * - * This method does not need to validate, that is done separately. + * This method does not need to validate, that is done separately. Actually, + * this method will nearly always be called with the same condition and transaction + * in sequence after EvalConditionValidity. If performance became an issue, a very + * small LRU cache could be used to cache a result. */ bool EvalConditionPriority(const CC *cond, CTxReplacementPoolItem *rep) { - if (strcmp((const char*)cond->method, "testReplace") == 0) { - std::vector data; - if (GetOpReturnData(rep->tx.vout[0].scriptPubKey, data)) { - rep->priority = (uint64_t) data[0]; - rep->replacementWindow = REPLACEMENT_WINDOW_BLOCKS; - return true; + if (ASSETCHAINS_CC_TEST) { + if (strcmp((const char*)cond->method, "testReplace") == 0) { + std::vector data; + auto out = rep->tx.vout[rep->tx.vout.size()-1]; // Last output is data + if (GetOpReturnData(out.scriptPubKey, data)) { + rep->replacementWindow = (int) data[0]; + rep->priority = (uint64_t) data[1]; + return true; + } } } return false; @@ -58,7 +68,7 @@ int visitConditionPriority(CC *cond, struct CCVisitor visitor) /* * Try to get replacement parameters from a transaction in &rep. */ -bool PutReplacementParams(CTxReplacementPoolItem &rep) +bool SetReplacementParams(CTxReplacementPoolItem &rep) { // first, see if we have a cryptocondition const CScript &sig = rep.tx.vin[0].scriptSig; @@ -68,7 +78,6 @@ bool PutReplacementParams(CTxReplacementPoolItem &rep) opcodetype opcode; if (!sig.GetOp(pc, opcode, data)) return false; CC *cond = cc_readFulfillmentBinary((unsigned char*)data.data(), data.size()); - auto wat = {1, ""}; if (!cond) return false; // now, see if it has a replacement node diff --git a/src/komodo_cryptoconditions.h b/src/komodo_cryptoconditions.h index 926cd0be9c8..de12140ef6a 100644 --- a/src/komodo_cryptoconditions.h +++ b/src/komodo_cryptoconditions.h @@ -7,6 +7,7 @@ extern int32_t ASSETCHAINS_CC; +extern bool ASSETCHAINS_CC_TEST; static bool IsCryptoConditionsEnabled() { return 0 != ASSETCHAINS_CC; diff --git a/src/main.cpp b/src/main.cpp index ecf0e4f3001..6c25f1fe817 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1110,6 +1110,45 @@ CAmount GetMinRelayFee(const CTransaction& tx, unsigned int nBytes, bool fAllowF } +/* + * This should be called from AcceptToMemoryPool in order + * to perform all validations. + */ +bool AcceptToReplacementPool(const CTransaction &tx, CValidationState &state) +{ + CTxReplacementPoolItem item(tx, GetHeight()); + if (!SetReplacementParams(item)) return false; + + switch (replacementPool.replace(item)) { + + case RP_Accept: + return true; + + case RP_HaveBetter: + // already have a better one + fprintf(stderr,"accept failure.20\n"); + return state.Invalid(error("AcceptToMemoryPool: Replacement is worse"), + REJECT_HAVEBETTER, "replacement-is-worse"); + + case RP_InvalidZeroPriority: + // Not valid according to replaceability rules + fprintf(stderr,"accept failure.21\n"); + return state.Invalid(error("AcceptToMemoryPool: Replacement has 0 priority"), + REJECT_INVALID, "replacement-invalid-zero-priority"); + + case RP_InvalidStructure: + // Not valid according to replaceability rules + fprintf(stderr,"accept failure.22\n"); + return state.Invalid(error("AcceptToMemoryPool: Replacement has multiple inputs"), + REJECT_INVALID, "replacement-has-invalid-structure"); + + default: + return false; + } +} + + + bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree,bool* pfMissingInputs, bool fRejectAbsurdFee, bool fAcceptReplacement) { AssertLockHeld(cs_main); @@ -1181,8 +1220,6 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa } } - CTxReplacementPoolResult rpr = RP_NotReplaceable; - { CCoinsView dummy; CCoinsViewCache view(&dummy); @@ -1341,40 +1378,15 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa if (fAcceptReplacement) { - CTxReplacementPoolItem item(tx, GetHeight()); - if (SetReplacementParams(item)) { - rpr = replacementPool.replace(item); - } + if (AcceptToReplacementPool(tx, state)) return true; + if (state.IsInvalid()) return false; } - if (rpr == RP_HaveBetter) - { - // already have a better one - fprintf(stderr,"accept failure.20\n"); - return state.DoS(0, error("AcceptToMemoryPool: Replacement is worse"), REJECT_HAVEBETTER, "replacement-is-worse"); - } - - if (rpr == RP_Invalid) - { - // Not valid according to replaceability rules - fprintf(stderr,"accept failure.21\n"); - return state.DoS(0, error("AcceptToMemoryPool: Replacement is invalid"), REJECT_INVALID, "replacement-is-worse"); - } - - // If there is no replacement action happening... - if (rpr == RP_NotReplaceable) - { - // Store transaction in memory - pool.addUnchecked(hash, entry, !IsInitialBlockDownload()); - } - } - - // in order for replaceable transactions to sync with wallet, replacementpool should advise - // wallet of transaction eviction - if (rpr == RP_NotReplaceable) { - SyncWithWallets(tx, NULL); + // Store transaction in memory + pool.addUnchecked(hash, entry, !IsInitialBlockDownload()); } + SyncWithWallets(tx, NULL); return true; } @@ -1989,7 +2001,7 @@ bool ContextualCheckInputs(const CTransaction& tx, CValidationState &state, cons // as to the correct behavior - we may want to continue // peering with non-upgraded nodes even after a soft-fork // super-majority vote has passed. - return state.DoS(100,false, REJECT_INVALID, strprintf("mandatory-script-verify-flag-failed (%s)", ScriptErrorString(check.GetScriptError()))); + return state.DoS(100, false, REJECT_INVALID, strprintf("mandatory-script-verify-flag-failed (%s)", ScriptErrorString(check.GetScriptError()))); } } } @@ -2826,7 +2838,7 @@ bool static ConnectTip(CValidationState &state, CBlockIndex *pindexNew, CBlock * // Update chainActive & related variables. UpdateTip(pindexNew); // Process pending replacements - ProcessReplacementPool(pindexNew->nHeight-1); + ProcessReplacementPool(pindexNew->nHeight); // Tell wallet about transactions that went from mempool // to conflicted: BOOST_FOREACH(const CTransaction &tx, txConflicted) { diff --git a/src/replacementpool.cpp b/src/replacementpool.cpp index 42da4fa7cc8..306fa5460fd 100644 --- a/src/replacementpool.cpp +++ b/src/replacementpool.cpp @@ -1,9 +1,11 @@ #include "main.h" #include "replacementpool.h" +#include "sync.h" CTxReplacementPool replacementPool; +CCriticalSection cs_replacementPool; /* @@ -17,33 +19,39 @@ CTxReplacementPool replacementPool; */ CTxReplacementPoolResult CTxReplacementPool::replace(CTxReplacementPoolItem &item) { - AssertLockHeld(cs_main); + LOCK(cs_replacementPool); - // Perform some validations. - if (item.tx.vin.size() > 1) { - // Replaceable transactions with multiple inputs are disabled. - // It seems like quite alot of additional complexity. - return RP_Invalid; - } + // Replaceable transactions with multiple inputs are disabled + // until someone figures out how they would work. + if (item.tx.vin.size() > 1) return RP_InvalidStructure; // A transaction with 0 priority is not valid. - if (item.priority == 0) { - return RP_Invalid; + if (item.priority == 0) return RP_InvalidZeroPriority; + + // replacementWindow of 0 goes direct to mempool + if (item.replacementWindow == 0) + { + // But we also need to remove replacement candidates + replaceMap.erase(item.tx.vin[0].prevout); + return RP_NoReplace; } - auto it = replaceMap.find(item.tx.vin[0].prevout); + int startBlock = item.startBlock; - if (it != replaceMap.end()) { - if (it->second.priority >= item.priority) { - return RP_HaveBetter; // (ThanksThough) + auto it = replaceMap.find(item.tx.vin[0].prevout); + if (it != replaceMap.end()) + { + if (it->second.replacementWindow <= item.replacementWindow && + it->second.priority >= item.priority) { + return RP_HaveBetter; } + startBlock = it->second.startBlock; } // This transaction has higher priority replaceMap[item.tx.vin[0].prevout] = item; - replaceMap[item.tx.vin[0].prevout].startBlock = it->second.startBlock; - - return RP_Accepted; + replaceMap[item.tx.vin[0].prevout].startBlock = startBlock; + return RP_Accept; } @@ -52,10 +60,11 @@ CTxReplacementPoolResult CTxReplacementPool::replace(CTxReplacementPoolItem &ite */ void CTxReplacementPool::removePending(int height, std::vector &txs) { - AssertLockHeld(cs_main); + LOCK(cs_replacementPool); for (auto it = replaceMap.begin(); it != replaceMap.end(); /**/) { CTxReplacementPoolItem &rep = it->second; + if (rep.GetTargetBlock() <= height) { txs.push_back(rep.tx); replaceMap.erase(it++); @@ -71,6 +80,7 @@ void CTxReplacementPool::removePending(int height, std::vector &tx */ bool CTxReplacementPool::lookup(uint256 txHash, CTransaction &tx) { + LOCK(cs_replacementPool); for (auto it = replaceMap.begin(); it != replaceMap.end(); it++) { if (it->second.tx.GetHash() == txHash) { tx = it->second.tx; diff --git a/src/replacementpool.h b/src/replacementpool.h index 6bf57799919..4642f28c5c5 100644 --- a/src/replacementpool.h +++ b/src/replacementpool.h @@ -8,7 +8,14 @@ #include "primitives/transaction.h" -enum CTxReplacementPoolResult { RP_Accepted, RP_HaveBetter, RP_Invalid, RP_NotReplaceable }; +// My kingdom for a proper sum type... +enum CTxReplacementPoolResult { + RP_Accept, + RP_HaveBetter, + RP_InvalidZeroPriority, + RP_InvalidStructure, + RP_NoReplace +}; class CTxReplacementPoolItem diff --git a/src/rpcmining.cpp b/src/rpcmining.cpp index f2fdc141577..da1d5207f77 100644 --- a/src/rpcmining.cpp +++ b/src/rpcmining.cpp @@ -206,8 +206,13 @@ UniValue generate(const UniValue& params, bool fHelp) UniValue blockHashes(UniValue::VARR); unsigned int n = Params().EquihashN(); unsigned int k = Params().EquihashK(); + uint64_t lastTime = 0; while (nHeight < nHeightEnd) { + // Validation may fail if block generation is too fast + if (GetTime() == lastTime) MilliSleep(1001); + lastTime = GetTime(); + #ifdef ENABLE_WALLET std::unique_ptr pblocktemplate(CreateNewBlockWithKey(reservekey)); #else diff --git a/src/test-komodo/main.cpp b/src/test-komodo/main.cpp new file mode 100644 index 00000000000..7811d5f9a74 --- /dev/null +++ b/src/test-komodo/main.cpp @@ -0,0 +1,9 @@ +#include "gtest/gtest.h" +#include "crypto/common.h" + +int main(int argc, char **argv) { + assert(init_and_check_sodium() != -1); + + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/src/test-komodo/test_replacementpool.cpp b/src/test-komodo/test_replacementpool.cpp new file mode 100644 index 00000000000..fa081204a91 --- /dev/null +++ b/src/test-komodo/test_replacementpool.cpp @@ -0,0 +1,461 @@ +#include +#include + +#include "base58.h" +#include "core_io.h" +#include "key.h" +#include "komodo_cryptoconditions.h" +#include "main.h" +#include "miner.h" +#include "random.h" +#include "rpcserver.h" +#include "rpcprotocol.h" +#include "replacementpool.h" +#include "txdb.h" +#include "util.h" +#include "utilstrencodings.h" +#include "utiltime.h" +#include "consensus/validation.h" +#include "primitives/transaction.h" +#include "script/interpreter.h" +#include "cryptoconditions/include/cryptoconditions.h" + + +extern int32_t USE_EXTERNAL_PUBKEY; +extern std::string NOTARY_PUBKEY; +std::string _NOTARY_PUBKEY = "0205a8ad0c1dbc515f149af377981aab58b836af008d4d7ab21bd76faf80550b47"; +std::string NOTARY_SECRET = "UxFWWxsf1d7w7K5TvAWSkeX4H95XQKwdwGv49DXwWUTzPTTjHBbU"; +CKey notaryKey; + +#define VCH(a,b) std::vector(a, a + b) + + +/* + * We need to have control of clock, + * otherwise block production can fail. + */ +int64_t nMockTime; + + +void testSetup() +{ + SelectParams(CBaseChainParams::REGTEST); + + // enable CC + ASSETCHAINS_CC = 1; + ASSETCHAINS_CC_TEST = true; + + // Settings to get block reward + NOTARY_PUBKEY = _NOTARY_PUBKEY; + USE_EXTERNAL_PUBKEY = 1; + mapArgs["-mineraddress"] = "bogus"; + COINBASE_MATURITY = 1; + // Global mock time + nMockTime = GetTime(); + + // Init blockchain + ClearDatadirCache(); + auto pathTemp = GetTempPath() / strprintf("test_komodo_%li_%i", GetTime(), GetRand(100000)); + boost::filesystem::create_directories(pathTemp); + mapArgs["-datadir"] = pathTemp.string(); + pblocktree = new CBlockTreeDB(1 << 20, true); + CCoinsViewDB *pcoinsdbview = new CCoinsViewDB(1 << 23, true); + pcoinsTip = new CCoinsViewCache(pcoinsdbview); + InitBlockIndex(); + + // Set address + ECC_Start(); + + // Notary key + CBitcoinSecret vchSecret; + // this returns false due to network prefix mismatch but works anyway + vchSecret.SetString(NOTARY_SECRET); + notaryKey = vchSecret.GetKey(); +} + + +void generateBlock(CBlock *block=NULL) +{ + UniValue params; + params.setArray(); + params.push_back(1); + uint256 blockId; + + SetMockTime(nMockTime++); // CreateNewBlock can fail if not enough time passes + + try { + UniValue out = generate(params, false); + blockId.SetHex(out[0].getValStr()); + } catch (const UniValue& e) { + FAIL() << "failed to create block: " << e.write().data(); + } + if (block) ASSERT_TRUE(ReadBlockFromDisk(*block, mapBlockIndex[blockId])); +} + + +void acceptTx(const CTransaction tx) +{ + CValidationState state; + LOCK(cs_main); + if (!AcceptToMemoryPool(mempool, state, tx, false, NULL)) + FAIL() << state.GetRejectReason(); +} + + +static CMutableTransaction spendTx(const CTransaction &txIn, int nOut=0) +{ + CMutableTransaction mtx; + mtx.vin.resize(1); + mtx.vin[0].prevout.hash = txIn.GetHash(); + mtx.vin[0].prevout.n = nOut; + mtx.vout.resize(1); + mtx.vout[0].nValue = txIn.vout[nOut].nValue - 1000; + return mtx; +} + + +/* + * In order to do tests there needs to be inputs to spend. + * This method creates a block and returns a transaction that spends the coinbase. + */ +void getInputTx(CScript scriptPubKey, CTransaction &txIn) +{ + // Get coinbase + CBlock block; + generateBlock(&block); + CTransaction coinbase = block.vtx[0]; + + // Create tx + auto mtx = spendTx(coinbase); + mtx.vout[0].scriptPubKey = scriptPubKey; + uint256 hash = SignatureHash(coinbase.vout[0].scriptPubKey, mtx, 0, SIGHASH_ALL); + std::vector vchSig; + notaryKey.Sign(hash, vchSig); + vchSig.push_back((unsigned char)SIGHASH_ALL); + mtx.vin[0].scriptSig << vchSig; + + // Accept + acceptTx(mtx); + txIn = CTransaction(mtx); +} + + +std::string HexToB64(std::string hexStr) +{ + auto d = ParseHex(hexStr); + return EncodeBase64(d.data(), d.size()); +} + + +CC *getReplaceCond() +{ + const char *condJsonTpl = R"V0G0N( + { "type": "threshold-sha-256", + "threshold": 2, + "subfulfillments": [ + { "type": "secp256k1-sha-256", "publicKey": "%s"}, + { "type": "eval-sha-256", "method": "testReplace", "params": "" } + ] })V0G0N"; + char condJson[1000]; + sprintf(condJson, condJsonTpl, (char*)HexToB64(NOTARY_PUBKEY).data()); + + unsigned char err[1000] = "\0"; + return cc_conditionFromJSONString((const unsigned char*)condJson, err); + // above could fail +} + +CScript condPK(CC *cond) +{ + unsigned char buf[1000]; + size_t bufLen = cc_conditionBinary(cond, buf); + return CScript() << VCH(buf, bufLen) << OP_CHECKCRYPTOCONDITION; +} + +void setFulfillment(CMutableTransaction &mtx, CC *cond, const CScript &spk, int nIn=0) +{ + uint256 hash = SignatureHash(spk, mtx, nIn, SIGHASH_ALL); + int nSigned = cc_signTreeSecp256k1Msg32(cond, notaryKey.begin(), hash.begin()); + unsigned char buf[1000]; + size_t bufLen = cc_fulfillmentBinary(cond, buf, 1000); + mtx.vin[nIn].scriptSig = CScript() << VCH(buf, bufLen); +} + + +CScript getReplaceOut(unsigned char replacementWindow, unsigned char priority) +{ + std::vector v = {replacementWindow, priority}; + return CScript() << OP_RETURN << v; +} + + +CTransaction _txout; +#define ASSERT_REPLACEMENT_POOL(hash) ASSERT_TRUE(replacementPool.lookup(hash, _txout)); \ + ASSERT_FALSE(mempool.lookup(hash, _txout)); +#define ASSERT_MEM_POOL(hash) ASSERT_FALSE(replacementPool.lookup(hash, _txout)); \ + ASSERT_TRUE(mempool.lookup(hash, _txout)); + + + +// Setup environment and perform basic spend as test +TEST(replacementpool, 0_setup) +{ + testSetup(); // Only call this method here + + CTransaction txIn; + getInputTx(CScript() << OP_RETURN << VCH("1", 1), txIn); +} + + +// Perform replaceable spend +TEST(replacementpool, 1_basic) +{ + CTransaction txIn; + CC *cond = getReplaceCond(); + getInputTx(condPK(cond), txIn); + + // Spend output to replaceable + auto mtx = spendTx(txIn); + mtx.vout[0].scriptPubKey = getReplaceOut(2, 100); + setFulfillment(mtx, cond, txIn.vout[0].scriptPubKey); + + acceptTx(mtx); + + ASSERT_REPLACEMENT_POOL(mtx.GetHash()); + generateBlock(); + ASSERT_REPLACEMENT_POOL(mtx.GetHash()); + generateBlock(); + ASSERT_MEM_POOL(mtx.GetHash()); +} + + +/* + * replacementWindow is 0, transaction should go direct to mempool + */ +TEST(replacementpool, 2_noWindow) +{ + CTransaction txIn; + CC *cond = getReplaceCond(); + getInputTx(condPK(cond), txIn); + + // First set a tx with a 1 block wait. It should stay in the replacement pool. + auto mtx = spendTx(txIn); + mtx.vout[0].scriptPubKey = getReplaceOut(1, 100); + setFulfillment(mtx, cond, txIn.vout[0].scriptPubKey); + acceptTx(mtx); + ASSERT_REPLACEMENT_POOL(mtx.GetHash()); + + // Now set a transaction with a 0 block wait and higher priority. + // It should go direct to the mem pool. + auto mtx2 = spendTx(txIn); + mtx2.vout[0].scriptPubKey = getReplaceOut(0, 101); + setFulfillment(mtx2, cond, txIn.vout[0].scriptPubKey); + acceptTx(mtx2); + ASSERT_MEM_POOL(mtx2.GetHash()); + + // Additionally, there should be no replacement remaining for txIn in the mempool + ASSERT_FALSE(replacementPool.lookup(mtx.GetHash(), _txout)); +} + + +/* + * Multiple replaceable transactions dont interfere + */ +TEST(replacementpool, 3_noInterfere) +{ + CTransaction txIn1, txIn2; + CC *cond = getReplaceCond(); + getInputTx(condPK(cond), txIn1); + getInputTx(condPK(cond), txIn2); + + // First set a transaction with a low window + auto mtx = spendTx(txIn1); + mtx.vout[0].scriptPubKey = getReplaceOut(1, 100); + setFulfillment(mtx, cond, txIn1.vout[0].scriptPubKey); + acceptTx(mtx); + ASSERT_REPLACEMENT_POOL(mtx.GetHash()); + + // Now, a different spend with a higher window + auto mtx2 = spendTx(txIn2); + mtx2.vout[0].scriptPubKey = getReplaceOut(10, 100); + setFulfillment(mtx2, cond, txIn2.vout[0].scriptPubKey); + acceptTx(mtx2); + ASSERT_REPLACEMENT_POOL(mtx2.GetHash()); + + generateBlock(); + + // mtx has gone to mempool + ASSERT_MEM_POOL(mtx.GetHash()); + + // mtx2 still in replacementpool + ASSERT_REPLACEMENT_POOL(mtx2.GetHash()); + + // But 9 blocks later... + for (int i=0; i<9; i++) + { + generateBlock(); + ASSERT_EQ(i == 8, mempool.lookup(mtx2.GetHash(), _txout)); + } +} + + +/* + * 0 priority is invalid + */ +TEST(replacementpool, 4_invalidZeroPriority) +{ + LOCK(cs_main); + + CTransaction txIn; + CC *cond = getReplaceCond(); + getInputTx(condPK(cond), txIn); + + auto mtx = spendTx(txIn); + mtx.vout[0].scriptPubKey = getReplaceOut(1, 0); + setFulfillment(mtx, cond, txIn.vout[0].scriptPubKey); + + CValidationState state; + ASSERT_FALSE(AcceptToMemoryPool(mempool, state, mtx, false, NULL)); + ASSERT_EQ("replacement-invalid-zero-priority", state.GetRejectReason()); +} + + +/* + * Multiple inputs is invalid + */ +TEST(replacementpool, 5_invalidMultipleInputs) +{ + LOCK(cs_main); + + CTransaction txIn, txIn2; + CC *cond = getReplaceCond(); + getInputTx(condPK(cond), txIn); + getInputTx(condPK(cond), txIn2); + + CMutableTransaction mtx; + mtx.vout.resize(1); + mtx.vout[0].nValue = txIn.vout[0].nValue * 2 - 1000; + mtx.vout[0].scriptPubKey = getReplaceOut(1, 100); + mtx.vin.resize(2); + mtx.vin[0].prevout.hash = txIn.GetHash(); + mtx.vin[0].prevout.n = 0; + mtx.vin[1].prevout.hash = txIn2.GetHash(); + mtx.vin[1].prevout.n = 0; + setFulfillment(mtx, cond, txIn.vout[0].scriptPubKey); + setFulfillment(mtx, cond, txIn2.vout[0].scriptPubKey, 1); + + CValidationState state; + ASSERT_FALSE(AcceptToMemoryPool(mempool, state, mtx, false, NULL)); + ASSERT_EQ("replacement-has-invalid-structure", state.GetRejectReason()); +} + + +extern bool AddOrphanTx(const CTransaction& tx, NodeId peer); +extern void ProcessOrphanTransactions(uint256 parentHash); +struct COrphanTx { CTransaction tx; NodeId fromPeer; }; +extern std::map mapOrphanTransactions; + +/* + * Orphans are processed + */ +TEST(replacementpool, 6_orphansAreProcessed) +{ + LOCK(cs_main); + + CTransaction txIn; + CC *cond = getReplaceCond(); + getInputTx(condPK(cond), txIn); + + // Make basic replaceable spend and dont submit + auto mtx = spendTx(txIn); + mtx.vout.resize(2); + mtx.vout[0].nValue = txIn.vout[0].nValue - 1000; + mtx.vout[0].scriptPubKey = condPK(cond); + mtx.vout[1].nValue = 1; + mtx.vout[1].scriptPubKey = getReplaceOut(1, 100); + setFulfillment(mtx, cond, txIn.vout[0].scriptPubKey); + + // Make an orphan and add it + auto orphan = spendTx(mtx); + orphan.vout[0].scriptPubKey = getReplaceOut(0, 100); + setFulfillment(orphan, cond, mtx.vout[0].scriptPubKey); + ASSERT_TRUE(AddOrphanTx(orphan, 1001)); + ASSERT_EQ(1, mapOrphanTransactions.count(orphan.GetHash())); + + // parent goes into replacement pool + acceptTx(mtx); + ASSERT_REPLACEMENT_POOL(mtx.GetHash()); + + // this should not result in the movement of any orphans + ProcessOrphanTransactions(mtx.GetHash()); + ASSERT_EQ(1, mapOrphanTransactions.count(orphan.GetHash())); + + // Processing of parent transaction also un-orphanises orphan + generateBlock(); + ASSERT_MEM_POOL(mtx.GetHash()); + ASSERT_MEM_POOL(orphan.GetHash()); + ASSERT_EQ(0, mapOrphanTransactions.count(orphan.GetHash())); +} + + +/* + * Add transaction with lower priority, already have better + */ +TEST(replacementpool, 7_haveBetter) +{ + LOCK(cs_main); + + CTransaction txIn; + CC *cond = getReplaceCond(); + getInputTx(condPK(cond), txIn); + + // A replaceable tx. + auto mtx = spendTx(txIn); + mtx.vout[0].scriptPubKey = getReplaceOut(2, 100); + setFulfillment(mtx, cond, txIn.vout[0].scriptPubKey); + acceptTx(mtx); + ASSERT_REPLACEMENT_POOL(mtx.GetHash()); + + // Another one, but not as good. + auto mtx2 = spendTx(txIn); + mtx2.vout[0].scriptPubKey = getReplaceOut(2, 99); + setFulfillment(mtx2, cond, txIn.vout[0].scriptPubKey); + CValidationState state; + ASSERT_FALSE(AcceptToMemoryPool(mempool, state, mtx, false, NULL)); + ASSERT_EQ("replacement-is-worse", state.GetRejectReason()); + ASSERT_REPLACEMENT_POOL(mtx.GetHash()); +} + + +/* + * Add transaction with lower priority, but shorter replacementWindow + */ +TEST(replacementpool, 8_shorterReplacementWindow) +{ + LOCK(cs_main); + + CTransaction txIn; + CC *cond = getReplaceCond(); + getInputTx(condPK(cond), txIn); + + // A replaceable tx. + auto mtx = spendTx(txIn); + mtx.vout[0].scriptPubKey = getReplaceOut(2, 100); + setFulfillment(mtx, cond, txIn.vout[0].scriptPubKey); + acceptTx(mtx); + ASSERT_REPLACEMENT_POOL(mtx.GetHash()); + + // Another one, lower priority but shorter replacementWindow so wins. + auto mtx2 = spendTx(txIn); + mtx2.vout[0].scriptPubKey = getReplaceOut(1, 99); + setFulfillment(mtx2, cond, txIn.vout[0].scriptPubKey); + acceptTx(mtx2); + ASSERT_REPLACEMENT_POOL(mtx2.GetHash()); + ASSERT_FALSE(replacementPool.lookup(mtx.GetHash(), _txout)); + + // Shorter still, in fact direct to mem pool + auto mtx3 = spendTx(txIn); + mtx3.vout[0].scriptPubKey = getReplaceOut(0, 98); + setFulfillment(mtx3, cond, txIn.vout[0].scriptPubKey); + acceptTx(mtx3); + ASSERT_MEM_POOL(mtx3.GetHash()); +} From bd7ecdec066600a3a0f76161daba2773541b6721 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Mon, 12 Mar 2018 17:27:50 -0300 Subject: [PATCH 0044/1081] fix build, allow 0 priority --- src/cryptoconditions | 2 +- src/main.cpp | 10 +-- src/replacementpool.cpp | 5 +- src/replacementpool.h | 3 +- src/test-komodo/test_replacementpool.cpp | 79 +++++++++--------------- 5 files changed, 34 insertions(+), 65 deletions(-) diff --git a/src/cryptoconditions b/src/cryptoconditions index 3200bc78e82..96303cb0ad2 160000 --- a/src/cryptoconditions +++ b/src/cryptoconditions @@ -1 +1 @@ -Subproject commit 3200bc78e82fe7af54c5b3bc89029070349ed430 +Subproject commit 96303cb0ad2a03fc09338e310dbd90be13bec743 diff --git a/src/main.cpp b/src/main.cpp index 6c25f1fe817..3c2baeae0e8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1130,17 +1130,11 @@ bool AcceptToReplacementPool(const CTransaction &tx, CValidationState &state) return state.Invalid(error("AcceptToMemoryPool: Replacement is worse"), REJECT_HAVEBETTER, "replacement-is-worse"); - case RP_InvalidZeroPriority: - // Not valid according to replaceability rules - fprintf(stderr,"accept failure.21\n"); - return state.Invalid(error("AcceptToMemoryPool: Replacement has 0 priority"), - REJECT_INVALID, "replacement-invalid-zero-priority"); - - case RP_InvalidStructure: + case RP_Invalid: // Not valid according to replaceability rules fprintf(stderr,"accept failure.22\n"); return state.Invalid(error("AcceptToMemoryPool: Replacement has multiple inputs"), - REJECT_INVALID, "replacement-has-invalid-structure"); + REJECT_INVALID, "replacement-invalid"); default: return false; diff --git a/src/replacementpool.cpp b/src/replacementpool.cpp index 306fa5460fd..168c30b6eea 100644 --- a/src/replacementpool.cpp +++ b/src/replacementpool.cpp @@ -23,10 +23,7 @@ CTxReplacementPoolResult CTxReplacementPool::replace(CTxReplacementPoolItem &ite // Replaceable transactions with multiple inputs are disabled // until someone figures out how they would work. - if (item.tx.vin.size() > 1) return RP_InvalidStructure; - - // A transaction with 0 priority is not valid. - if (item.priority == 0) return RP_InvalidZeroPriority; + if (item.tx.vin.size() > 1) return RP_Invalid; // replacementWindow of 0 goes direct to mempool if (item.replacementWindow == 0) diff --git a/src/replacementpool.h b/src/replacementpool.h index 4642f28c5c5..d6ab2ed280a 100644 --- a/src/replacementpool.h +++ b/src/replacementpool.h @@ -12,8 +12,7 @@ enum CTxReplacementPoolResult { RP_Accept, RP_HaveBetter, - RP_InvalidZeroPriority, - RP_InvalidStructure, + RP_Invalid, RP_NoReplace }; diff --git a/src/test-komodo/test_replacementpool.cpp b/src/test-komodo/test_replacementpool.cpp index fa081204a91..b0ccc427838 100644 --- a/src/test-komodo/test_replacementpool.cpp +++ b/src/test-komodo/test_replacementpool.cpp @@ -189,10 +189,10 @@ CScript getReplaceOut(unsigned char replacementWindow, unsigned char priority) CTransaction _txout; -#define ASSERT_REPLACEMENT_POOL(hash) ASSERT_TRUE(replacementPool.lookup(hash, _txout)); \ - ASSERT_FALSE(mempool.lookup(hash, _txout)); -#define ASSERT_MEM_POOL(hash) ASSERT_FALSE(replacementPool.lookup(hash, _txout)); \ - ASSERT_TRUE(mempool.lookup(hash, _txout)); +#define ONLY_REPLACEMENT_POOL(hash) ASSERT_TRUE(replacementPool.lookup(hash, _txout)); \ + ASSERT_FALSE(mempool.lookup(hash, _txout)); +#define ONLY_MEM_POOL(hash) ASSERT_FALSE(replacementPool.lookup(hash, _txout)); \ + ASSERT_TRUE(mempool.lookup(hash, _txout)); @@ -207,7 +207,7 @@ TEST(replacementpool, 0_setup) // Perform replaceable spend -TEST(replacementpool, 1_basic) +TEST(replacementpool, basic) { CTransaction txIn; CC *cond = getReplaceCond(); @@ -220,18 +220,18 @@ TEST(replacementpool, 1_basic) acceptTx(mtx); - ASSERT_REPLACEMENT_POOL(mtx.GetHash()); + ONLY_REPLACEMENT_POOL(mtx.GetHash()); generateBlock(); - ASSERT_REPLACEMENT_POOL(mtx.GetHash()); + ONLY_REPLACEMENT_POOL(mtx.GetHash()); generateBlock(); - ASSERT_MEM_POOL(mtx.GetHash()); + ONLY_MEM_POOL(mtx.GetHash()); } /* * replacementWindow is 0, transaction should go direct to mempool */ -TEST(replacementpool, 2_noWindow) +TEST(replacementpool, noWindow) { CTransaction txIn; CC *cond = getReplaceCond(); @@ -242,7 +242,7 @@ TEST(replacementpool, 2_noWindow) mtx.vout[0].scriptPubKey = getReplaceOut(1, 100); setFulfillment(mtx, cond, txIn.vout[0].scriptPubKey); acceptTx(mtx); - ASSERT_REPLACEMENT_POOL(mtx.GetHash()); + ONLY_REPLACEMENT_POOL(mtx.GetHash()); // Now set a transaction with a 0 block wait and higher priority. // It should go direct to the mem pool. @@ -250,7 +250,7 @@ TEST(replacementpool, 2_noWindow) mtx2.vout[0].scriptPubKey = getReplaceOut(0, 101); setFulfillment(mtx2, cond, txIn.vout[0].scriptPubKey); acceptTx(mtx2); - ASSERT_MEM_POOL(mtx2.GetHash()); + ONLY_MEM_POOL(mtx2.GetHash()); // Additionally, there should be no replacement remaining for txIn in the mempool ASSERT_FALSE(replacementPool.lookup(mtx.GetHash(), _txout)); @@ -260,7 +260,7 @@ TEST(replacementpool, 2_noWindow) /* * Multiple replaceable transactions dont interfere */ -TEST(replacementpool, 3_noInterfere) +TEST(replacementpool, noInterfere) { CTransaction txIn1, txIn2; CC *cond = getReplaceCond(); @@ -272,22 +272,22 @@ TEST(replacementpool, 3_noInterfere) mtx.vout[0].scriptPubKey = getReplaceOut(1, 100); setFulfillment(mtx, cond, txIn1.vout[0].scriptPubKey); acceptTx(mtx); - ASSERT_REPLACEMENT_POOL(mtx.GetHash()); + ONLY_REPLACEMENT_POOL(mtx.GetHash()); // Now, a different spend with a higher window auto mtx2 = spendTx(txIn2); mtx2.vout[0].scriptPubKey = getReplaceOut(10, 100); setFulfillment(mtx2, cond, txIn2.vout[0].scriptPubKey); acceptTx(mtx2); - ASSERT_REPLACEMENT_POOL(mtx2.GetHash()); + ONLY_REPLACEMENT_POOL(mtx2.GetHash()); generateBlock(); // mtx has gone to mempool - ASSERT_MEM_POOL(mtx.GetHash()); + ONLY_MEM_POOL(mtx.GetHash()); // mtx2 still in replacementpool - ASSERT_REPLACEMENT_POOL(mtx2.GetHash()); + ONLY_REPLACEMENT_POOL(mtx2.GetHash()); // But 9 blocks later... for (int i=0; i<9; i++) @@ -298,31 +298,10 @@ TEST(replacementpool, 3_noInterfere) } -/* - * 0 priority is invalid - */ -TEST(replacementpool, 4_invalidZeroPriority) -{ - LOCK(cs_main); - - CTransaction txIn; - CC *cond = getReplaceCond(); - getInputTx(condPK(cond), txIn); - - auto mtx = spendTx(txIn); - mtx.vout[0].scriptPubKey = getReplaceOut(1, 0); - setFulfillment(mtx, cond, txIn.vout[0].scriptPubKey); - - CValidationState state; - ASSERT_FALSE(AcceptToMemoryPool(mempool, state, mtx, false, NULL)); - ASSERT_EQ("replacement-invalid-zero-priority", state.GetRejectReason()); -} - - /* * Multiple inputs is invalid */ -TEST(replacementpool, 5_invalidMultipleInputs) +TEST(replacementpool, invalidMultipleInputs) { LOCK(cs_main); @@ -345,7 +324,7 @@ TEST(replacementpool, 5_invalidMultipleInputs) CValidationState state; ASSERT_FALSE(AcceptToMemoryPool(mempool, state, mtx, false, NULL)); - ASSERT_EQ("replacement-has-invalid-structure", state.GetRejectReason()); + ASSERT_EQ("replacement-invalid", state.GetRejectReason()); } @@ -357,7 +336,7 @@ extern std::map mapOrphanTransactions; /* * Orphans are processed */ -TEST(replacementpool, 6_orphansAreProcessed) +TEST(replacementpool, orphansAreProcessed) { LOCK(cs_main); @@ -383,7 +362,7 @@ TEST(replacementpool, 6_orphansAreProcessed) // parent goes into replacement pool acceptTx(mtx); - ASSERT_REPLACEMENT_POOL(mtx.GetHash()); + ONLY_REPLACEMENT_POOL(mtx.GetHash()); // this should not result in the movement of any orphans ProcessOrphanTransactions(mtx.GetHash()); @@ -391,8 +370,8 @@ TEST(replacementpool, 6_orphansAreProcessed) // Processing of parent transaction also un-orphanises orphan generateBlock(); - ASSERT_MEM_POOL(mtx.GetHash()); - ASSERT_MEM_POOL(orphan.GetHash()); + ONLY_MEM_POOL(mtx.GetHash()); + ONLY_MEM_POOL(orphan.GetHash()); ASSERT_EQ(0, mapOrphanTransactions.count(orphan.GetHash())); } @@ -400,7 +379,7 @@ TEST(replacementpool, 6_orphansAreProcessed) /* * Add transaction with lower priority, already have better */ -TEST(replacementpool, 7_haveBetter) +TEST(replacementpool, haveBetter) { LOCK(cs_main); @@ -413,7 +392,7 @@ TEST(replacementpool, 7_haveBetter) mtx.vout[0].scriptPubKey = getReplaceOut(2, 100); setFulfillment(mtx, cond, txIn.vout[0].scriptPubKey); acceptTx(mtx); - ASSERT_REPLACEMENT_POOL(mtx.GetHash()); + ONLY_REPLACEMENT_POOL(mtx.GetHash()); // Another one, but not as good. auto mtx2 = spendTx(txIn); @@ -422,14 +401,14 @@ TEST(replacementpool, 7_haveBetter) CValidationState state; ASSERT_FALSE(AcceptToMemoryPool(mempool, state, mtx, false, NULL)); ASSERT_EQ("replacement-is-worse", state.GetRejectReason()); - ASSERT_REPLACEMENT_POOL(mtx.GetHash()); + ONLY_REPLACEMENT_POOL(mtx.GetHash()); } /* * Add transaction with lower priority, but shorter replacementWindow */ -TEST(replacementpool, 8_shorterReplacementWindow) +TEST(replacementpool, shorterReplacementWindow) { LOCK(cs_main); @@ -442,14 +421,14 @@ TEST(replacementpool, 8_shorterReplacementWindow) mtx.vout[0].scriptPubKey = getReplaceOut(2, 100); setFulfillment(mtx, cond, txIn.vout[0].scriptPubKey); acceptTx(mtx); - ASSERT_REPLACEMENT_POOL(mtx.GetHash()); + ONLY_REPLACEMENT_POOL(mtx.GetHash()); // Another one, lower priority but shorter replacementWindow so wins. auto mtx2 = spendTx(txIn); mtx2.vout[0].scriptPubKey = getReplaceOut(1, 99); setFulfillment(mtx2, cond, txIn.vout[0].scriptPubKey); acceptTx(mtx2); - ASSERT_REPLACEMENT_POOL(mtx2.GetHash()); + ONLY_REPLACEMENT_POOL(mtx2.GetHash()); ASSERT_FALSE(replacementPool.lookup(mtx.GetHash(), _txout)); // Shorter still, in fact direct to mem pool @@ -457,5 +436,5 @@ TEST(replacementpool, 8_shorterReplacementWindow) mtx3.vout[0].scriptPubKey = getReplaceOut(0, 98); setFulfillment(mtx3, cond, txIn.vout[0].scriptPubKey); acceptTx(mtx3); - ASSERT_MEM_POOL(mtx3.GetHash()); + ONLY_MEM_POOL(mtx3.GetHash()); } From 76b5216cf6cdc07e77ed7e5864a2d1643660336c Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Mon, 12 Mar 2018 17:54:30 -0300 Subject: [PATCH 0045/1081] remove cryptoconditions submodule --- .gitmodules | 4 ---- src/cryptoconditions | 1 - 2 files changed, 5 deletions(-) delete mode 160000 src/cryptoconditions diff --git a/.gitmodules b/.gitmodules index bf76cc359e1..e69de29bb2d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +0,0 @@ -[submodule "cryptoconditions"] - path = src/cryptoconditions - url = https://github.com/libscott/libcryptoconditions.git - branch = komodo diff --git a/src/cryptoconditions b/src/cryptoconditions deleted file mode 160000 index 96303cb0ad2..00000000000 --- a/src/cryptoconditions +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 96303cb0ad2a03fc09338e310dbd90be13bec743 From c6fa342bd6a04bd708932b35d7c49fc5e3e67149 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Mon, 12 Mar 2018 17:57:18 -0300 Subject: [PATCH 0046/1081] no more cryptoconditions submodule --- src/cryptoconditions/.gitignore | 24 + src/cryptoconditions/.gitmodules | 3 + src/cryptoconditions/.travis.yml | 10 + src/cryptoconditions/LICENSE | 13 + src/cryptoconditions/Makefile.am | 75 + src/cryptoconditions/README.md | 165 + src/cryptoconditions/autogen.sh | 3 + src/cryptoconditions/compile | 347 +++ src/cryptoconditions/configure.ac | 42 + src/cryptoconditions/cryptoconditions.py | 62 + .../include/cryptoconditions.h | 93 + src/cryptoconditions/src/anon.c | 79 + .../src/asn/AuxFingerprintContents.c | 94 + .../src/asn/AuxFingerprintContents.h | 38 + src/cryptoconditions/src/asn/AuxFulfillment.c | 78 + src/cryptoconditions/src/asn/AuxFulfillment.h | 39 + .../src/asn/AuxSha512Fulfillment.c | 78 + .../src/asn/AuxSha512Fulfillment.h | 39 + src/cryptoconditions/src/asn/BIT_STRING.c | 189 ++ src/cryptoconditions/src/asn/BIT_STRING.h | 33 + .../src/asn/CompoundSha256Condition.c | 235 ++ .../src/asn/CompoundSha256Condition.h | 42 + src/cryptoconditions/src/asn/Condition.c | 114 + src/cryptoconditions/src/asn/Condition.h | 59 + src/cryptoconditions/src/asn/ConditionTypes.c | 108 + src/cryptoconditions/src/asn/ConditionTypes.h | 49 + .../src/asn/CryptoConditions.asn | 118 + .../src/asn/Ed25519FingerprintContents.c | 84 + .../src/asn/Ed25519FingerprintContents.h | 37 + .../src/asn/Ed25519Sha512Fulfillment.c | 120 + .../src/asn/Ed25519Sha512Fulfillment.h | 38 + .../src/asn/EvalFingerprintContents.c | 94 + .../src/asn/EvalFingerprintContents.h | 38 + .../src/asn/EvalFulfillment.c | 94 + .../src/asn/EvalFulfillment.h | 38 + src/cryptoconditions/src/asn/Fulfillment.c | 114 + src/cryptoconditions/src/asn/Fulfillment.h | 70 + src/cryptoconditions/src/asn/INTEGER.c | 1025 +++++++ src/cryptoconditions/src/asn/INTEGER.h | 82 + .../src/asn/Makefile.am.sample | 122 + .../src/asn/NativeEnumerated.c | 207 ++ .../src/asn/NativeEnumerated.h | 32 + src/cryptoconditions/src/asn/NativeInteger.c | 332 ++ src/cryptoconditions/src/asn/NativeInteger.h | 37 + src/cryptoconditions/src/asn/OCTET_STRING.c | 1807 +++++++++++ src/cryptoconditions/src/asn/OCTET_STRING.h | 86 + .../src/asn/PrefixFingerprintContents.c | 209 ++ .../src/asn/PrefixFingerprintContents.h | 42 + .../src/asn/PrefixFulfillment.c | 209 ++ .../src/asn/PrefixFulfillment.h | 47 + .../src/asn/PreimageFulfillment.c | 58 + .../src/asn/PreimageFulfillment.h | 37 + .../src/asn/RsaFingerprintContents.c | 58 + .../src/asn/RsaFingerprintContents.h | 37 + .../src/asn/RsaSha256Fulfillment.c | 68 + .../src/asn/RsaSha256Fulfillment.h | 38 + .../src/asn/Secp256k1FingerprintContents.c | 84 + .../src/asn/Secp256k1FingerprintContents.h | 37 + .../src/asn/Secp256k1Fulfillment.c | 120 + .../src/asn/Secp256k1Fulfillment.h | 38 + .../src/asn/SimpleSha256Condition.c | 225 ++ .../src/asn/SimpleSha256Condition.h | 40 + .../src/asn/ThresholdFingerprintContents.c | 138 + .../src/asn/ThresholdFingerprintContents.h | 51 + .../src/asn/ThresholdFulfillment.c | 158 + .../src/asn/ThresholdFulfillment.h | 57 + src/cryptoconditions/src/asn/asn_SET_OF.c | 88 + src/cryptoconditions/src/asn/asn_SET_OF.h | 62 + .../src/asn/asn_application.h | 47 + src/cryptoconditions/src/asn/asn_codecs.h | 109 + .../src/asn/asn_codecs_prim.c | 312 ++ .../src/asn/asn_codecs_prim.h | 53 + src/cryptoconditions/src/asn/asn_internal.h | 128 + src/cryptoconditions/src/asn/asn_system.h | 138 + src/cryptoconditions/src/asn/ber_decoder.c | 283 ++ src/cryptoconditions/src/asn/ber_decoder.h | 64 + src/cryptoconditions/src/asn/ber_tlv_length.c | 178 ++ src/cryptoconditions/src/asn/ber_tlv_length.h | 50 + src/cryptoconditions/src/asn/ber_tlv_tag.c | 144 + src/cryptoconditions/src/asn/ber_tlv_tag.h | 60 + src/cryptoconditions/src/asn/constr_CHOICE.c | 1114 +++++++ src/cryptoconditions/src/asn/constr_CHOICE.h | 57 + .../src/asn/constr_SEQUENCE.c | 1425 +++++++++ .../src/asn/constr_SEQUENCE.h | 60 + src/cryptoconditions/src/asn/constr_SET_OF.c | 954 ++++++ src/cryptoconditions/src/asn/constr_SET_OF.h | 42 + src/cryptoconditions/src/asn/constr_TYPE.c | 77 + src/cryptoconditions/src/asn/constr_TYPE.h | 180 ++ src/cryptoconditions/src/asn/constraints.c | 93 + src/cryptoconditions/src/asn/constraints.h | 63 + src/cryptoconditions/src/asn/der_encoder.c | 201 ++ src/cryptoconditions/src/asn/der_encoder.h | 68 + src/cryptoconditions/src/asn/per_decoder.c | 93 + src/cryptoconditions/src/asn/per_decoder.h | 56 + src/cryptoconditions/src/asn/per_encoder.c | 151 + src/cryptoconditions/src/asn/per_encoder.h | 69 + src/cryptoconditions/src/asn/per_opentype.c | 378 +++ src/cryptoconditions/src/asn/per_opentype.h | 22 + src/cryptoconditions/src/asn/per_support.c | 483 +++ src/cryptoconditions/src/asn/per_support.h | 135 + src/cryptoconditions/src/asn/xer_decoder.c | 368 +++ src/cryptoconditions/src/asn/xer_decoder.h | 106 + src/cryptoconditions/src/asn/xer_encoder.c | 67 + src/cryptoconditions/src/asn/xer_encoder.h | 59 + src/cryptoconditions/src/asn/xer_support.c | 227 ++ src/cryptoconditions/src/asn/xer_support.h | 55 + .../src/cryptoconditions-config.h.in | 176 ++ src/cryptoconditions/src/cryptoconditions.c | 267 ++ src/cryptoconditions/src/ed25519.c | 170 ++ src/cryptoconditions/src/eval.c | 142 + src/cryptoconditions/src/include/cJSON.c | 2699 +++++++++++++++++ src/cryptoconditions/src/include/cJSON.h | 263 ++ .../src/include/ed25519/license.txt | 16 + .../src/include/ed25519/readme.md | 166 + .../src/include/ed25519/src/add_scalar.c | 69 + .../src/include/ed25519/src/ed25519.h | 38 + .../src/include/ed25519/src/fe.c | 1491 +++++++++ .../src/include/ed25519/src/fe.h | 41 + .../src/include/ed25519/src/fixedint.h | 72 + .../src/include/ed25519/src/ge.c | 467 +++ .../src/include/ed25519/src/ge.h | 74 + .../src/include/ed25519/src/key_exchange.c | 79 + .../src/include/ed25519/src/keypair.c | 16 + .../src/include/ed25519/src/precomp_data.h | 1391 +++++++++ .../src/include/ed25519/src/sc.c | 809 +++++ .../src/include/ed25519/src/sc.h | 12 + .../src/include/ed25519/src/seed.c | 40 + .../src/include/ed25519/src/sha512.c | 275 ++ .../src/include/ed25519/src/sha512.h | 21 + .../src/include/ed25519/src/sign.c | 31 + .../src/include/ed25519/src/verify.c | 77 + .../src/include/ed25519/test.c | 150 + src/cryptoconditions/src/include/libbase58.h | 23 + .../src/include/secp256k1/.gitignore | 37 + .../src/include/secp256k1/.travis.yml | 59 + .../src/include/secp256k1/COPYING | 19 + .../src/include/secp256k1/Makefile.am | 77 + .../src/include/secp256k1/README.md | 61 + .../src/include/secp256k1/TODO | 3 + .../src/include/secp256k1/autogen.sh | 3 + .../src/include/secp256k1/configure.ac | 330 ++ .../src/include/secp256k1/include/secp256k1.h | 347 +++ .../src/include/secp256k1/libsecp256k1.pc.in | 13 + .../src/include/secp256k1/obj/.gitignore | 0 .../src/include/secp256k1/src/bench.h | 56 + .../include/secp256k1/src/bench_internal.c | 318 ++ .../src/include/secp256k1/src/bench_recover.c | 51 + .../src/include/secp256k1/src/bench_sign.c | 50 + .../src/include/secp256k1/src/bench_verify.c | 56 + .../src/include/secp256k1/src/ecdsa.h | 24 + .../src/include/secp256k1/src/ecdsa_impl.h | 271 ++ .../src/include/secp256k1/src/eckey.h | 26 + .../src/include/secp256k1/src/eckey_impl.h | 202 ++ .../src/include/secp256k1/src/ecmult.h | 31 + .../src/include/secp256k1/src/ecmult_gen.h | 43 + .../include/secp256k1/src/ecmult_gen_impl.h | 184 ++ .../src/include/secp256k1/src/ecmult_impl.h | 317 ++ .../src/include/secp256k1/src/field.h | 119 + .../src/include/secp256k1/src/field_10x26.h | 47 + .../include/secp256k1/src/field_10x26_impl.h | 1136 +++++++ .../src/include/secp256k1/src/field_5x52.h | 47 + .../secp256k1/src/field_5x52_asm_impl.h | 502 +++ .../include/secp256k1/src/field_5x52_impl.h | 454 +++ .../secp256k1/src/field_5x52_int128_impl.h | 277 ++ .../src/include/secp256k1/src/field_impl.h | 263 ++ .../src/include/secp256k1/src/group.h | 121 + .../src/include/secp256k1/src/group_impl.h | 443 +++ .../src/include/secp256k1/src/hash.h | 41 + .../src/include/secp256k1/src/hash_impl.h | 293 ++ .../src/java/org/bitcoin/NativeSecp256k1.java | 60 + .../src/java/org_bitcoin_NativeSecp256k1.c | 23 + .../src/java/org_bitcoin_NativeSecp256k1.h | 21 + .../src/include/secp256k1/src/num.h | 68 + .../src/include/secp256k1/src/num_gmp.h | 20 + .../src/include/secp256k1/src/num_gmp_impl.h | 260 ++ .../src/include/secp256k1/src/num_impl.h | 24 + .../src/include/secp256k1/src/scalar.h | 93 + .../src/include/secp256k1/src/scalar_4x64.h | 19 + .../include/secp256k1/src/scalar_4x64_impl.h | 920 ++++++ .../src/include/secp256k1/src/scalar_8x32.h | 19 + .../include/secp256k1/src/scalar_8x32_impl.h | 681 +++++ .../src/include/secp256k1/src/scalar_impl.h | 327 ++ .../src/include/secp256k1/src/secp256k1.c | 419 +++ .../src/include/secp256k1/src/testrand.h | 28 + .../src/include/secp256k1/src/testrand_impl.h | 60 + .../src/include/secp256k1/src/tests.c | 2083 +++++++++++++ .../src/include/secp256k1/src/util.h | 104 + src/cryptoconditions/src/include/sha256.c | 264 ++ src/cryptoconditions/src/include/sha256.h | 114 + src/cryptoconditions/src/include/tweetnacl.c | 809 +++++ src/cryptoconditions/src/include/tweetnacl.h | 272 ++ src/cryptoconditions/src/internal.h | 76 + src/cryptoconditions/src/json_rpc.c | 332 ++ src/cryptoconditions/src/prefix.c | 126 + src/cryptoconditions/src/preimage.c | 83 + src/cryptoconditions/src/secp256k1.c | 253 ++ src/cryptoconditions/src/stamp-h1 | 1 + src/cryptoconditions/src/threshold.c | 206 ++ src/cryptoconditions/src/utils.c | 208 ++ src/cryptoconditions/test-requirements.txt | 3 + src/cryptoconditions/tests/__init__.py | 0 .../1000_test-minimal-eval.json | 14 + .../1001_test-minimal-secp256k1.json | 14 + src/cryptoconditions/tests/test_ed25519.py | 73 + .../tests/test_failure_modes.py | 63 + src/cryptoconditions/tests/test_secp256k1.py | 62 + src/cryptoconditions/tests/test_vectors.py | 149 + 207 files changed, 40503 insertions(+) create mode 100644 src/cryptoconditions/.gitignore create mode 100644 src/cryptoconditions/.gitmodules create mode 100644 src/cryptoconditions/.travis.yml create mode 100644 src/cryptoconditions/LICENSE create mode 100644 src/cryptoconditions/Makefile.am create mode 100644 src/cryptoconditions/README.md create mode 100755 src/cryptoconditions/autogen.sh create mode 100755 src/cryptoconditions/compile create mode 100644 src/cryptoconditions/configure.ac create mode 100755 src/cryptoconditions/cryptoconditions.py create mode 100644 src/cryptoconditions/include/cryptoconditions.h create mode 100644 src/cryptoconditions/src/anon.c create mode 100644 src/cryptoconditions/src/asn/AuxFingerprintContents.c create mode 100644 src/cryptoconditions/src/asn/AuxFingerprintContents.h create mode 100644 src/cryptoconditions/src/asn/AuxFulfillment.c create mode 100644 src/cryptoconditions/src/asn/AuxFulfillment.h create mode 100644 src/cryptoconditions/src/asn/AuxSha512Fulfillment.c create mode 100644 src/cryptoconditions/src/asn/AuxSha512Fulfillment.h create mode 100644 src/cryptoconditions/src/asn/BIT_STRING.c create mode 100644 src/cryptoconditions/src/asn/BIT_STRING.h create mode 100644 src/cryptoconditions/src/asn/CompoundSha256Condition.c create mode 100644 src/cryptoconditions/src/asn/CompoundSha256Condition.h create mode 100644 src/cryptoconditions/src/asn/Condition.c create mode 100644 src/cryptoconditions/src/asn/Condition.h create mode 100644 src/cryptoconditions/src/asn/ConditionTypes.c create mode 100644 src/cryptoconditions/src/asn/ConditionTypes.h create mode 100644 src/cryptoconditions/src/asn/CryptoConditions.asn create mode 100644 src/cryptoconditions/src/asn/Ed25519FingerprintContents.c create mode 100644 src/cryptoconditions/src/asn/Ed25519FingerprintContents.h create mode 100644 src/cryptoconditions/src/asn/Ed25519Sha512Fulfillment.c create mode 100644 src/cryptoconditions/src/asn/Ed25519Sha512Fulfillment.h create mode 100644 src/cryptoconditions/src/asn/EvalFingerprintContents.c create mode 100644 src/cryptoconditions/src/asn/EvalFingerprintContents.h create mode 100644 src/cryptoconditions/src/asn/EvalFulfillment.c create mode 100644 src/cryptoconditions/src/asn/EvalFulfillment.h create mode 100644 src/cryptoconditions/src/asn/Fulfillment.c create mode 100644 src/cryptoconditions/src/asn/Fulfillment.h create mode 100644 src/cryptoconditions/src/asn/INTEGER.c create mode 100644 src/cryptoconditions/src/asn/INTEGER.h create mode 100644 src/cryptoconditions/src/asn/Makefile.am.sample create mode 100644 src/cryptoconditions/src/asn/NativeEnumerated.c create mode 100644 src/cryptoconditions/src/asn/NativeEnumerated.h create mode 100644 src/cryptoconditions/src/asn/NativeInteger.c create mode 100644 src/cryptoconditions/src/asn/NativeInteger.h create mode 100644 src/cryptoconditions/src/asn/OCTET_STRING.c create mode 100644 src/cryptoconditions/src/asn/OCTET_STRING.h create mode 100644 src/cryptoconditions/src/asn/PrefixFingerprintContents.c create mode 100644 src/cryptoconditions/src/asn/PrefixFingerprintContents.h create mode 100644 src/cryptoconditions/src/asn/PrefixFulfillment.c create mode 100644 src/cryptoconditions/src/asn/PrefixFulfillment.h create mode 100644 src/cryptoconditions/src/asn/PreimageFulfillment.c create mode 100644 src/cryptoconditions/src/asn/PreimageFulfillment.h create mode 100644 src/cryptoconditions/src/asn/RsaFingerprintContents.c create mode 100644 src/cryptoconditions/src/asn/RsaFingerprintContents.h create mode 100644 src/cryptoconditions/src/asn/RsaSha256Fulfillment.c create mode 100644 src/cryptoconditions/src/asn/RsaSha256Fulfillment.h create mode 100644 src/cryptoconditions/src/asn/Secp256k1FingerprintContents.c create mode 100644 src/cryptoconditions/src/asn/Secp256k1FingerprintContents.h create mode 100644 src/cryptoconditions/src/asn/Secp256k1Fulfillment.c create mode 100644 src/cryptoconditions/src/asn/Secp256k1Fulfillment.h create mode 100644 src/cryptoconditions/src/asn/SimpleSha256Condition.c create mode 100644 src/cryptoconditions/src/asn/SimpleSha256Condition.h create mode 100644 src/cryptoconditions/src/asn/ThresholdFingerprintContents.c create mode 100644 src/cryptoconditions/src/asn/ThresholdFingerprintContents.h create mode 100644 src/cryptoconditions/src/asn/ThresholdFulfillment.c create mode 100644 src/cryptoconditions/src/asn/ThresholdFulfillment.h create mode 100644 src/cryptoconditions/src/asn/asn_SET_OF.c create mode 100644 src/cryptoconditions/src/asn/asn_SET_OF.h create mode 100644 src/cryptoconditions/src/asn/asn_application.h create mode 100644 src/cryptoconditions/src/asn/asn_codecs.h create mode 100644 src/cryptoconditions/src/asn/asn_codecs_prim.c create mode 100644 src/cryptoconditions/src/asn/asn_codecs_prim.h create mode 100644 src/cryptoconditions/src/asn/asn_internal.h create mode 100644 src/cryptoconditions/src/asn/asn_system.h create mode 100644 src/cryptoconditions/src/asn/ber_decoder.c create mode 100644 src/cryptoconditions/src/asn/ber_decoder.h create mode 100644 src/cryptoconditions/src/asn/ber_tlv_length.c create mode 100644 src/cryptoconditions/src/asn/ber_tlv_length.h create mode 100644 src/cryptoconditions/src/asn/ber_tlv_tag.c create mode 100644 src/cryptoconditions/src/asn/ber_tlv_tag.h create mode 100644 src/cryptoconditions/src/asn/constr_CHOICE.c create mode 100644 src/cryptoconditions/src/asn/constr_CHOICE.h create mode 100644 src/cryptoconditions/src/asn/constr_SEQUENCE.c create mode 100644 src/cryptoconditions/src/asn/constr_SEQUENCE.h create mode 100644 src/cryptoconditions/src/asn/constr_SET_OF.c create mode 100644 src/cryptoconditions/src/asn/constr_SET_OF.h create mode 100644 src/cryptoconditions/src/asn/constr_TYPE.c create mode 100644 src/cryptoconditions/src/asn/constr_TYPE.h create mode 100644 src/cryptoconditions/src/asn/constraints.c create mode 100644 src/cryptoconditions/src/asn/constraints.h create mode 100644 src/cryptoconditions/src/asn/der_encoder.c create mode 100644 src/cryptoconditions/src/asn/der_encoder.h create mode 100644 src/cryptoconditions/src/asn/per_decoder.c create mode 100644 src/cryptoconditions/src/asn/per_decoder.h create mode 100644 src/cryptoconditions/src/asn/per_encoder.c create mode 100644 src/cryptoconditions/src/asn/per_encoder.h create mode 100644 src/cryptoconditions/src/asn/per_opentype.c create mode 100644 src/cryptoconditions/src/asn/per_opentype.h create mode 100644 src/cryptoconditions/src/asn/per_support.c create mode 100644 src/cryptoconditions/src/asn/per_support.h create mode 100644 src/cryptoconditions/src/asn/xer_decoder.c create mode 100644 src/cryptoconditions/src/asn/xer_decoder.h create mode 100644 src/cryptoconditions/src/asn/xer_encoder.c create mode 100644 src/cryptoconditions/src/asn/xer_encoder.h create mode 100644 src/cryptoconditions/src/asn/xer_support.c create mode 100644 src/cryptoconditions/src/asn/xer_support.h create mode 100644 src/cryptoconditions/src/cryptoconditions-config.h.in create mode 100644 src/cryptoconditions/src/cryptoconditions.c create mode 100644 src/cryptoconditions/src/ed25519.c create mode 100644 src/cryptoconditions/src/eval.c create mode 100644 src/cryptoconditions/src/include/cJSON.c create mode 100644 src/cryptoconditions/src/include/cJSON.h create mode 100644 src/cryptoconditions/src/include/ed25519/license.txt create mode 100644 src/cryptoconditions/src/include/ed25519/readme.md create mode 100644 src/cryptoconditions/src/include/ed25519/src/add_scalar.c create mode 100644 src/cryptoconditions/src/include/ed25519/src/ed25519.h create mode 100644 src/cryptoconditions/src/include/ed25519/src/fe.c create mode 100644 src/cryptoconditions/src/include/ed25519/src/fe.h create mode 100644 src/cryptoconditions/src/include/ed25519/src/fixedint.h create mode 100644 src/cryptoconditions/src/include/ed25519/src/ge.c create mode 100644 src/cryptoconditions/src/include/ed25519/src/ge.h create mode 100644 src/cryptoconditions/src/include/ed25519/src/key_exchange.c create mode 100644 src/cryptoconditions/src/include/ed25519/src/keypair.c create mode 100644 src/cryptoconditions/src/include/ed25519/src/precomp_data.h create mode 100644 src/cryptoconditions/src/include/ed25519/src/sc.c create mode 100644 src/cryptoconditions/src/include/ed25519/src/sc.h create mode 100644 src/cryptoconditions/src/include/ed25519/src/seed.c create mode 100644 src/cryptoconditions/src/include/ed25519/src/sha512.c create mode 100644 src/cryptoconditions/src/include/ed25519/src/sha512.h create mode 100644 src/cryptoconditions/src/include/ed25519/src/sign.c create mode 100644 src/cryptoconditions/src/include/ed25519/src/verify.c create mode 100644 src/cryptoconditions/src/include/ed25519/test.c create mode 100644 src/cryptoconditions/src/include/libbase58.h create mode 100644 src/cryptoconditions/src/include/secp256k1/.gitignore create mode 100644 src/cryptoconditions/src/include/secp256k1/.travis.yml create mode 100644 src/cryptoconditions/src/include/secp256k1/COPYING create mode 100644 src/cryptoconditions/src/include/secp256k1/Makefile.am create mode 100644 src/cryptoconditions/src/include/secp256k1/README.md create mode 100644 src/cryptoconditions/src/include/secp256k1/TODO create mode 100755 src/cryptoconditions/src/include/secp256k1/autogen.sh create mode 100644 src/cryptoconditions/src/include/secp256k1/configure.ac create mode 100644 src/cryptoconditions/src/include/secp256k1/include/secp256k1.h create mode 100644 src/cryptoconditions/src/include/secp256k1/libsecp256k1.pc.in create mode 100644 src/cryptoconditions/src/include/secp256k1/obj/.gitignore create mode 100644 src/cryptoconditions/src/include/secp256k1/src/bench.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/bench_internal.c create mode 100644 src/cryptoconditions/src/include/secp256k1/src/bench_recover.c create mode 100644 src/cryptoconditions/src/include/secp256k1/src/bench_sign.c create mode 100644 src/cryptoconditions/src/include/secp256k1/src/bench_verify.c create mode 100644 src/cryptoconditions/src/include/secp256k1/src/ecdsa.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/ecdsa_impl.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/eckey.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/eckey_impl.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/ecmult.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/ecmult_gen.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/ecmult_gen_impl.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/ecmult_impl.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/field.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/field_10x26.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/field_10x26_impl.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/field_5x52.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/field_5x52_asm_impl.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/field_5x52_impl.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/field_5x52_int128_impl.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/field_impl.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/group.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/group_impl.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/hash.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/hash_impl.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/java/org/bitcoin/NativeSecp256k1.java create mode 100644 src/cryptoconditions/src/include/secp256k1/src/java/org_bitcoin_NativeSecp256k1.c create mode 100644 src/cryptoconditions/src/include/secp256k1/src/java/org_bitcoin_NativeSecp256k1.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/num.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/num_gmp.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/num_gmp_impl.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/num_impl.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/scalar.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/scalar_4x64.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/scalar_4x64_impl.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/scalar_8x32.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/scalar_8x32_impl.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/scalar_impl.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/secp256k1.c create mode 100644 src/cryptoconditions/src/include/secp256k1/src/testrand.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/testrand_impl.h create mode 100644 src/cryptoconditions/src/include/secp256k1/src/tests.c create mode 100644 src/cryptoconditions/src/include/secp256k1/src/util.h create mode 100644 src/cryptoconditions/src/include/sha256.c create mode 100644 src/cryptoconditions/src/include/sha256.h create mode 100644 src/cryptoconditions/src/include/tweetnacl.c create mode 100644 src/cryptoconditions/src/include/tweetnacl.h create mode 100644 src/cryptoconditions/src/internal.h create mode 100644 src/cryptoconditions/src/json_rpc.c create mode 100644 src/cryptoconditions/src/prefix.c create mode 100644 src/cryptoconditions/src/preimage.c create mode 100644 src/cryptoconditions/src/secp256k1.c create mode 100644 src/cryptoconditions/src/stamp-h1 create mode 100644 src/cryptoconditions/src/threshold.c create mode 100644 src/cryptoconditions/src/utils.c create mode 100644 src/cryptoconditions/test-requirements.txt create mode 100644 src/cryptoconditions/tests/__init__.py create mode 100644 src/cryptoconditions/tests/custom-vectors/1000_test-minimal-eval.json create mode 100644 src/cryptoconditions/tests/custom-vectors/1001_test-minimal-secp256k1.json create mode 100644 src/cryptoconditions/tests/test_ed25519.py create mode 100644 src/cryptoconditions/tests/test_failure_modes.py create mode 100644 src/cryptoconditions/tests/test_secp256k1.py create mode 100644 src/cryptoconditions/tests/test_vectors.py diff --git a/src/cryptoconditions/.gitignore b/src/cryptoconditions/.gitignore new file mode 100644 index 00000000000..1d84f261898 --- /dev/null +++ b/src/cryptoconditions/.gitignore @@ -0,0 +1,24 @@ +*.pyc +.cache +/Makefile +/Makefile.in +/aclocal.m4 +/autom4te.cache/ +/src/cryptoconditions-config.h +/configure +/depcomp +/install-sh +/libtool +/ltmain.sh +/m4/ +/missing +/stamp-h? +.deps/ +.dirstamp +.libs/ +*.l[ao] +*.[ao] +*~ +converter-sample.c +config.* +.pytest_cache diff --git a/src/cryptoconditions/.gitmodules b/src/cryptoconditions/.gitmodules new file mode 100644 index 00000000000..635f6c43dfd --- /dev/null +++ b/src/cryptoconditions/.gitmodules @@ -0,0 +1,3 @@ +[submodule "ext/crypto-conditions"] + path = ext/crypto-conditions + url = http://github.com/libscott/crypto-conditions.git diff --git a/src/cryptoconditions/.travis.yml b/src/cryptoconditions/.travis.yml new file mode 100644 index 00000000000..166cc9def60 --- /dev/null +++ b/src/cryptoconditions/.travis.yml @@ -0,0 +1,10 @@ +language: C +sudo: true +compiler: + - clang + - gcc +before_script: ./autogen.sh +addons: + apt: + packages: + - gdb diff --git a/src/cryptoconditions/LICENSE b/src/cryptoconditions/LICENSE new file mode 100644 index 00000000000..bd423f56ec1 --- /dev/null +++ b/src/cryptoconditions/LICENSE @@ -0,0 +1,13 @@ +Copyright 2017 Scott Sadler + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/src/cryptoconditions/Makefile.am b/src/cryptoconditions/Makefile.am new file mode 100644 index 00000000000..ab6259b5607 --- /dev/null +++ b/src/cryptoconditions/Makefile.am @@ -0,0 +1,75 @@ +lib_LTLIBRARIES=libcryptoconditions.la +SUBDIRS = src/include/secp256k1 + +AM_CFLAGS = -I$(top_srcdir)/src/asn -I$(top_srcdir)/include -I$(top_srcdir)/src/include \ + -Wall -Wno-pointer-sign -Wno-discarded-qualifiers + +LIBSECP256K1=src/include/secp256k1/libsecp256k1.la + +$(LIBSECP256K1): $(wildcard src/secp256k1/*) + $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C $(@D) $(@F) + +libcryptoconditions_la_LIBADD = $(LIBSECP256K1) +libcryptoconditions_la_SOURCES = \ + src/cryptoconditions.c \ + src/include/cJSON.c \ + src/include/sha256.c \ + src/include/ed25519/src/keypair.c \ + src/include/ed25519/src/seed.c \ + src/include/ed25519/src/verify.c \ + src/include/ed25519/src/sign.c \ + src/include/ed25519/src/fe.c \ + src/include/ed25519/src/sc.c \ + src/include/ed25519/src/sha512.c \ + src/include/ed25519/src/ge.c \ + src/include/ed25519/src/add_scalar.c \ + src/include/ed25519/src/key_exchange.c \ + src/asn/Condition.c \ + src/asn/SimpleSha256Condition.c \ + src/asn/CompoundSha256Condition.c \ + src/asn/ConditionTypes.c \ + src/asn/Fulfillment.c \ + src/asn/PreimageFulfillment.c \ + src/asn/PrefixFulfillment.c \ + src/asn/ThresholdFulfillment.c \ + src/asn/RsaSha256Fulfillment.c \ + src/asn/Ed25519Sha512Fulfillment.c \ + src/asn/PrefixFingerprintContents.c \ + src/asn/ThresholdFingerprintContents.c \ + src/asn/RsaFingerprintContents.c \ + src/asn/Ed25519FingerprintContents.c \ + src/asn/EvalFingerprintContents.c \ + src/asn/EvalFulfillment.c \ + src/asn/Secp256k1FingerprintContents.c \ + src/asn/Secp256k1Fulfillment.c \ + src/asn/INTEGER.c \ + src/asn/NativeEnumerated.c \ + src/asn/NativeInteger.c \ + src/asn/asn_SET_OF.c \ + src/asn/constr_CHOICE.c \ + src/asn/constr_SEQUENCE.c \ + src/asn/constr_SET_OF.c \ + src/asn/OCTET_STRING.c \ + src/asn/BIT_STRING.c \ + src/asn/asn_codecs_prim.c \ + src/asn/ber_tlv_length.c \ + src/asn/ber_tlv_tag.c \ + src/asn/ber_decoder.c \ + src/asn/der_encoder.c \ + src/asn/constr_TYPE.c \ + src/asn/constraints.c \ + src/asn/xer_support.c \ + src/asn/xer_decoder.c \ + src/asn/xer_encoder.c \ + src/asn/per_support.c \ + src/asn/per_decoder.c \ + src/asn/per_encoder.c \ + src/asn/per_opentype.c + +test: + bash -c '[ -d .env ] || virtualenv .env' + .env/bin/pip install pytest + gdb -batch -ex run -ex bt --args .env/bin/python -m pytest -s -x -v 2>&1 | grep -v ^"No stack."$ + +test-debug-interactive: + gdb -ex run --args python3 -m pytest -s -x -v diff --git a/src/cryptoconditions/README.md b/src/cryptoconditions/README.md new file mode 100644 index 00000000000..45418b62ad5 --- /dev/null +++ b/src/cryptoconditions/README.md @@ -0,0 +1,165 @@ +# libcryptoconditions [![Build Status](https://travis-ci.org/libscott/libcryptoconditions.svg?branch=komodo)](https://travis-ci.org/libscott/libcryptoconditions) + +Interledger Crypto-Conditions in C, targeting spec [draft-thomas-crypto-conditions-03](https://tools.ietf.org/html/draft-thomas-crypto-conditions-03). + +Features shared object and easy to use JSON api, as well as a command line interface written in Python. + +## Quickstart + +```shell +git clone --recursive https://github.com/libscott/libcryptoconditions +cd libcryptoconditions +./autogen.sh +./configure +make +./cryptoconditions.py --help +``` + +## Status + +JSON interface not particularly safe. The rest is getting there. + +## Embedding + +For the binary interface, see [cryptoconditions.h](./include/cryptoconditions.h). + +To embed in other languages, the easiest way may be to call the JSON RPC method via FFI. This is how it looks in Python: + +```python +import json +from ctypes import * + +so = cdll.LoadLibrary('.libs/libcryptoconditions.so') +so.jsonRPC.restype = c_char_p + +def call_cryptoconditions_rpc(method, params): + out = so.jsonRPC(json.dumps({ + 'method': method, + 'params': params, + })) + return json.loads(out) +``` + +## JSON methods + +### encodeCondition + +Encode a JSON condition to a base64 binary string + +```shell +cryptoconditions encodeCondition '{ + "type": "ed25519-sha-256", + "publicKey": "11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo" +}' +{ + "bin": "pCeAIHmSOauo_E_36r-8TETmnovf7ZkzJOEu1keSq-KJzx1fgQMCAAA", + "uri": "ni:///sha-256;eZI5q6j8T_fqv7xMROaei9_tmTMk4S7WR5Kr4onPHV8?fpt=ed25519-sha-256&cost=131072" +} +``` + +### decodeCondition + +Decode a binary condition + +```shell +cryptoconditions decodeCondition '{ + "bin": "pCeAIHmSOauo_E_36r-8TETmnovf7ZkzJOEu1keSq-KJzx1fgQMCAAA" +}' +{ + "bin": "pCeAIHmSOauo_E_36r-8TETmnovf7ZkzJOEu1keSq-KJzx1fgQMCAAA", + "uri": "ni:///sha-256;eZI5q6j8T_fqv7xMROaei9_tmTMk4S7WR5Kr4onPHV8?fpt=ed25519-sha-256&cost=131072" +} +``` + +### encodeFulfillment + +Encode a JSON condition to a binary fulfillment. The condition must be fulfilled, that is, +it needs to have signatures present. + +```shell +cryptoconditions encodeFulfillment '{ +{ + "type": "ed25519-sha-256", + "publicKey": "E0x0Ws4GhWhO_zBoUyaLbuqCz6hDdq11Ft1Dgbe9y9k", + "signature": "jcuovSRpHwqiC781KzSM1Jd0Qtyfge0cMGttUdLOVdjJlSBFLTtgpinASOaJpd-VGjhSGWkp1hPWuMAAZq6pAg" +}' +{ + "fulfillment": "pGSAIBNMdFrOBoVoTv8waFMmi27qgs-oQ3atdRbdQ4G3vcvZgUCNy6i9JGkfCqILvzUrNIzUl3RC3J-B7Rwwa21R0s5V2MmVIEUtO2CmKcBI5oml35UaOFIZaSnWE9a4wABmrqkC" +} + +``` + +### decodeFulfillment + +Decode a binary fulfillment + +```shell +cryptoconditions decodeFulfillment '{ + "fulfillment": "pGSAINdamAGCsQq31Uv-08lkBzoO4XLz2qYjJa8CGmj3B1EagUDlVkMAw2CscpCG4syAboKKhId_Hrjl2XTYc-BlIkkBVV-4ghWQozusxh45cBz5tGvSW_XwWVu-JGVRQUOOehAL" +}' +{ + "bin": "pCeAIHmSOauo_E_36r-8TETmnovf7ZkzJOEu1keSq-KJzx1fgQMCAAA", + "uri": "ni:///sha-256;eZI5q6j8T_fqv7xMROaei9_tmTMk4S7WR5Kr4onPHV8?fpt=ed25519-sha-256&cost=131072" +} +``` + +### verifyFulfillment + +Verify a fulfillment against a message and a condition URL + +```shell +cryptoconditions verifyFulfillment '{ + "message": "", + "fulfillment": "pGSAINdamAGCsQq31Uv-08lkBzoO4XLz2qYjJa8CGmj3B1EagUDlVkMAw2CscpCG4syAboKKhId_Hrjl2XTYc-BlIkkBVV-4ghWQozusxh45cBz5tGvSW_XwWVu-JGVRQUOOehAL", + "condition": "pCeAIHmSOauo_E_36r-8TETmnovf7ZkzJOEu1keSq-KJzx1fgQMCAAA" +} +{ + "valid": true +} +``` + +### signTreeEd25519 + +Sign all ed25519 nodes in a condition tree + +```shell +cryptoconditions signTreeEd25519 '{ + "condition": { + "type": "ed25519-sha-256", + "publicKey": "E0x0Ws4GhWhO_zBoUyaLbuqCz6hDdq11Ft1Dgbe9y9k", + }, + "privateKey": "11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo", + "message": "", +}' +{ + "num_signed": 1, + "condition": { + "type": "ed25519-sha-256", + "publicKey": "E0x0Ws4GhWhO_zBoUyaLbuqCz6hDdq11Ft1Dgbe9y9k", + "signature": "jcuovSRpHwqiC781KzSM1Jd0Qtyfge0cMGttUdLOVdjJlSBFLTtgpinASOaJpd-VGjhSGWkp1hPWuMAAZq6pAg" + } +} +``` + +### signTreeSecp256k1 + +Sign all secp256k1 nodes in a condition tree + +```shell +cryptoconditions signTreeSecp256k1 '{ + "condition": { + "type": "secp256k1-sha-256", + "publicKey": "AmkauD4tVL5-I7NN9hE_A8SlA0WdCIeJe_1Nac_km1hr", + }, + "privateKey": "Bxwd5hOLZcTvzrR5Cupm3IV7TWHHl8nNLeO4UhYfRs4", + "message": "", +}' +{ + "num_signed": 1, + "condition": { + "type": "secp256k1-sha-256", + "publicKey": "AmkauD4tVL5-I7NN9hE_A8SlA0WdCIeJe_1Nac_km1hr", + "signature": "LSQLzZo4cmt04KoCdoFcbIJX5MZ9CM6324SqkdqV1PppfUwquiWa7HD97hf4jdkdqU3ep8ZS9AU7zEJoUAl_Gg" + } +} +``` diff --git a/src/cryptoconditions/autogen.sh b/src/cryptoconditions/autogen.sh new file mode 100755 index 00000000000..65286b93530 --- /dev/null +++ b/src/cryptoconditions/autogen.sh @@ -0,0 +1,3 @@ +#!/bin/sh +set -e +autoreconf -if --warnings=all diff --git a/src/cryptoconditions/compile b/src/cryptoconditions/compile new file mode 100755 index 00000000000..a85b723c7e6 --- /dev/null +++ b/src/cryptoconditions/compile @@ -0,0 +1,347 @@ +#! /bin/sh +# Wrapper for compilers which do not understand '-c -o'. + +scriptversion=2012-10-14.11; # UTC + +# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# Written by Tom Tromey . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/src/cryptoconditions/configure.ac b/src/cryptoconditions/configure.ac new file mode 100644 index 00000000000..d6b45159a3f --- /dev/null +++ b/src/cryptoconditions/configure.ac @@ -0,0 +1,42 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ([2.69]) +AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) +AC_CONFIG_HEADERS([src/cryptoconditions-config.h]) +AC_CONFIG_MACRO_DIRS([m4]) +AC_CONFIG_SUBDIRS([src/include/secp256k1]) + +AM_INIT_AUTOMAKE([foreign subdir-objects]) +LT_INIT + +# Checks for programs. +AC_PROG_CC +AC_PROG_CC_STDC + +# Checks for libraries. + +# Checks for header files. +AC_FUNC_ALLOCA +AC_CHECK_HEADERS([arpa/inet.h float.h inttypes.h limits.h locale.h malloc.h netinet/in.h stddef.h stdint.h stdlib.h string.h]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_CHECK_HEADER_STDBOOL +AC_TYPE_INT16_T +AC_TYPE_INT32_T +AC_TYPE_INT8_T +AC_TYPE_SIZE_T +AC_TYPE_SSIZE_T +AC_TYPE_UINT16_T +AC_TYPE_UINT32_T +AC_TYPE_UINT64_T +AC_TYPE_UINT8_T +AC_CHECK_TYPES([ptrdiff_t]) + +# Checks for library functions. +AC_FUNC_MALLOC +AC_FUNC_STRTOD +AC_CHECK_FUNCS([localeconv memchr memset]) + +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT diff --git a/src/cryptoconditions/cryptoconditions.py b/src/cryptoconditions/cryptoconditions.py new file mode 100755 index 00000000000..4ffd86ce336 --- /dev/null +++ b/src/cryptoconditions/cryptoconditions.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python + +import sys +import json +import ctypes +import base64 +import os.path +import argparse +from ctypes import * + + +so = cdll.LoadLibrary('.libs/libcryptoconditions.so') +so.jsonRPC.restype = c_char_p + + +def jsonRPC(method, params, load=True): + out = so.cc_jsonRPC(json.dumps({ + 'method': method, + 'params': params, + })) + return json.loads(out) if load else out + + +def b16_to_b64(b16): + return base64.urlsafe_b64encode(base64.b16decode(b16)).rstrip('=') + + +USAGE = "cryptoconditions [-h] {method} {request_json}" + +def get_help(): + methods = jsonRPC("listMethods", {})['methods'] + + txt = USAGE + "\n\nmethods:\n" + + for method in methods: + txt += ' %s: %s\n' % (method['name'], method['description']) + + txt += """\noptional arguments: + -h, --help show this help message and exit +""" + return txt + + +def get_parser(): + class Parser(argparse.ArgumentParser): + def format_help(self): + return get_help() + + parser = Parser(description='Crypto Conditions JSON interface', usage=USAGE) + + json_loads = lambda r: json.loads(r) + json_loads.__name__ = 'json' + + parser.add_argument("method") + parser.add_argument("request", type=json_loads) + + return parser + + +if __name__ == '__main__': + args = get_parser().parse_args() + print(jsonRPC(args.method, args.request, load=False)) diff --git a/src/cryptoconditions/include/cryptoconditions.h b/src/cryptoconditions/include/cryptoconditions.h new file mode 100644 index 00000000000..22370d4d0d1 --- /dev/null +++ b/src/cryptoconditions/include/cryptoconditions.h @@ -0,0 +1,93 @@ +#include + + +#ifndef CRYPTOCONDITIONS_H +#define CRYPTOCONDITIONS_H + + +#ifdef __cplusplus +extern "C" { +#endif + + +struct CC; +struct CCType; + + +enum CCTypeId { + CC_Preimage = 0, + CC_Prefix = 1, + CC_Threshold = 2, + CC_Ed25519 = 4, + CC_Secp256k1 = 5, + CC_Eval = 15 +}; + + +/* + * Evaliliary verification callback + */ +typedef int (*VerifyEval)(struct CC *cond, void *context); + + +/* + * Crypto Condition + */ +typedef struct CC { + struct CCType *type; + union { + struct { unsigned char *publicKey, *signature; }; + struct { unsigned char *preimage; size_t preimageLength; }; + struct { long threshold; int size; struct CC **subconditions; }; + struct { unsigned char *prefix; size_t prefixLength; struct CC *subcondition; + unsigned long maxMessageLength; }; + struct { char method[64]; unsigned char *paramsBin; size_t paramsBinLength; }; + struct { unsigned char fingerprint[32]; uint32_t subtypes; unsigned long cost; }; + }; +} CC; + + + +/* + * Crypto Condition Visitor + */ +typedef struct CCVisitor { + int (*visit)(CC *cond, struct CCVisitor visitor); + const unsigned char *msg; + size_t msgLength; + void *context; +} CCVisitor; + + +/* + * Public methods + */ +int cc_isFulfilled(const CC *cond); +int cc_verify(const struct CC *cond, const unsigned char *msg, size_t msgLength, + int doHashMessage, const unsigned char *condBin, size_t condBinLength, + VerifyEval verifyEval, void *evalContext); +int cc_visit(CC *cond, struct CCVisitor visitor); +int cc_signTreeEd25519(CC *cond, const unsigned char *privateKey, + const unsigned char *msg, size_t msgLength); +int cc_signTreeSecp256k1Msg32(CC *cond, const unsigned char *privateKey, const unsigned char *msg32); +size_t cc_conditionBinary(const CC *cond, unsigned char *buf); +size_t cc_fulfillmentBinary(const CC *cond, unsigned char *buf, size_t bufLength); +static int cc_secp256k1VerifyTreeMsg32(const CC *cond, const unsigned char *msg32); +struct CC* cc_conditionFromJSON(cJSON *params, unsigned char *err); +struct CC* cc_conditionFromJSONString(const unsigned char *json, unsigned char *err); +struct CC* cc_readConditionBinary(unsigned char *cond_bin, size_t cond_bin_len); +struct CC* cc_readFulfillmentBinary(unsigned char *ffill_bin, size_t ffill_bin_len); +struct cJSON* cc_conditionToJSON(const CC *cond); +unsigned char* cc_conditionToJSONString(const CC *cond); +unsigned char* cc_conditionUri(const CC *cond); +unsigned char* cc_jsonRPC(unsigned char *request); +unsigned long cc_getCost(const CC *cond); +enum CCTypeId cc_typeId(const CC *cond); +void cc_free(struct CC *cond); + + +#ifdef __cplusplus +} +#endif + +#endif /* CRYPTOCONDITIONS_H */ diff --git a/src/cryptoconditions/src/anon.c b/src/cryptoconditions/src/anon.c new file mode 100644 index 00000000000..e23fffe3ee2 --- /dev/null +++ b/src/cryptoconditions/src/anon.c @@ -0,0 +1,79 @@ + +#include "asn/Condition.h" +#include "asn/Fulfillment.h" +#include "asn/PrefixFingerprintContents.h" +#include "asn/OCTET_STRING.h" +#include "include/cJSON.h" +#include "cryptoconditions.h" + + +struct CCType cc_anonType; + + +static CC *mkAnon(const Condition_t *asnCond) { + CCType *realType = getTypeByAsnEnum(asnCond->present); + if (!realType) { + printf("Unknown ASN type: %i", asnCond->present); + return 0; + } + CC *cond = calloc(1, sizeof(CC)); + cond->type = (CCType*) calloc(1, sizeof(CCType)); + *cond->type = cc_anonType; + strcpy(cond->type->name, realType->name); + cond->type->hasSubtypes = realType->hasSubtypes; + cond->type->typeId = realType->typeId; + cond->type->asnType = realType->asnType; + const CompoundSha256Condition_t *deets = &asnCond->choice.thresholdSha256; + memcpy(cond->fingerprint, deets->fingerprint.buf, 32); + cond->cost = deets->cost; + if (realType->hasSubtypes) { + cond->subtypes = fromAsnSubtypes(deets->subtypes); + } + return cond; +} + + + +static void anonToJSON(const CC *cond, cJSON *params) { + unsigned char *b64 = base64_encode(cond->fingerprint, 32); + cJSON_AddItemToObject(params, "fingerprint", cJSON_CreateString(b64)); + free(b64); + cJSON_AddItemToObject(params, "cost", cJSON_CreateNumber(cond->cost)); + cJSON_AddItemToObject(params, "subtypes", cJSON_CreateNumber(cond->subtypes)); +} + + +static unsigned char *anonFingerprint(const CC *cond) { + unsigned char *out = calloc(1, 32); + memcpy(out, cond->fingerprint, 32); + return out; +} + + +static unsigned long anonCost(const CC *cond) { + return cond->cost; +} + + +static uint32_t anonSubtypes(const CC *cond) { + return cond->subtypes; +} + + +static Fulfillment_t *anonFulfillment(const CC *cond) { + return NULL; +} + + +static void anonFree(CC *cond) { + free(cond->type); + free(cond); +} + + +static int anonIsFulfilled(const CC *cond) { + return 0; +} + + +struct CCType cc_anonType = { -1, "anon (a buffer large enough to accomodate any type name)", Condition_PR_NOTHING, 0, NULL, &anonFingerprint, &anonCost, &anonSubtypes, NULL, &anonToJSON, NULL, &anonFulfillment, &anonIsFulfilled, &anonFree }; diff --git a/src/cryptoconditions/src/asn/AuxFingerprintContents.c b/src/cryptoconditions/src/asn/AuxFingerprintContents.c new file mode 100644 index 00000000000..cc8aefa3f26 --- /dev/null +++ b/src/cryptoconditions/src/asn/AuxFingerprintContents.c @@ -0,0 +1,94 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#include "AuxFingerprintContents.h" + +static int +memb_method_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size; + + if((size == 64)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_TYPE_member_t asn_MBR_AuxFingerprintContents_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct AuxFingerprintContents, method), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCTET_STRING, + memb_method_constraint_1, + 0, /* PER is not compiled, use -gen-PER */ + 0, + "method" + }, + { ATF_NOFLAGS, 0, offsetof(struct AuxFingerprintContents, conditionAux), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCTET_STRING, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "conditionAux" + }, +}; +static const ber_tlv_tag_t asn_DEF_AuxFingerprintContents_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_AuxFingerprintContents_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* method */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* conditionAux */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_AuxFingerprintContents_specs_1 = { + sizeof(struct AuxFingerprintContents), + offsetof(struct AuxFingerprintContents, _asn_ctx), + asn_MAP_AuxFingerprintContents_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn_TYPE_descriptor_t asn_DEF_AuxFingerprintContents = { + "AuxFingerprintContents", + "AuxFingerprintContents", + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_AuxFingerprintContents_tags_1, + sizeof(asn_DEF_AuxFingerprintContents_tags_1) + /sizeof(asn_DEF_AuxFingerprintContents_tags_1[0]), /* 1 */ + asn_DEF_AuxFingerprintContents_tags_1, /* Same as above */ + sizeof(asn_DEF_AuxFingerprintContents_tags_1) + /sizeof(asn_DEF_AuxFingerprintContents_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + asn_MBR_AuxFingerprintContents_1, + 2, /* Elements count */ + &asn_SPC_AuxFingerprintContents_specs_1 /* Additional specs */ +}; + diff --git a/src/cryptoconditions/src/asn/AuxFingerprintContents.h b/src/cryptoconditions/src/asn/AuxFingerprintContents.h new file mode 100644 index 00000000000..9f14a1bacb6 --- /dev/null +++ b/src/cryptoconditions/src/asn/AuxFingerprintContents.h @@ -0,0 +1,38 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#ifndef _AuxFingerprintContents_H_ +#define _AuxFingerprintContents_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* AuxFingerprintContents */ +typedef struct AuxFingerprintContents { + OCTET_STRING_t method; + OCTET_STRING_t conditionAux; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} AuxFingerprintContents_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_AuxFingerprintContents; + +#ifdef __cplusplus +} +#endif + +#endif /* _AuxFingerprintContents_H_ */ +#include diff --git a/src/cryptoconditions/src/asn/AuxFulfillment.c b/src/cryptoconditions/src/asn/AuxFulfillment.c new file mode 100644 index 00000000000..84362f79dd1 --- /dev/null +++ b/src/cryptoconditions/src/asn/AuxFulfillment.c @@ -0,0 +1,78 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#include "AuxFulfillment.h" + +static asn_TYPE_member_t asn_MBR_AuxFulfillment_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct AuxFulfillment, method), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCTET_STRING, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "method" + }, + { ATF_NOFLAGS, 0, offsetof(struct AuxFulfillment, conditionAux), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCTET_STRING, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "conditionAux" + }, + { ATF_NOFLAGS, 0, offsetof(struct AuxFulfillment, fulfillmentAux), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCTET_STRING, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "fulfillmentAux" + }, +}; +static const ber_tlv_tag_t asn_DEF_AuxFulfillment_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_AuxFulfillment_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* method */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* conditionAux */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* fulfillmentAux */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_AuxFulfillment_specs_1 = { + sizeof(struct AuxFulfillment), + offsetof(struct AuxFulfillment, _asn_ctx), + asn_MAP_AuxFulfillment_tag2el_1, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn_TYPE_descriptor_t asn_DEF_AuxFulfillment = { + "AuxFulfillment", + "AuxFulfillment", + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_AuxFulfillment_tags_1, + sizeof(asn_DEF_AuxFulfillment_tags_1) + /sizeof(asn_DEF_AuxFulfillment_tags_1[0]), /* 1 */ + asn_DEF_AuxFulfillment_tags_1, /* Same as above */ + sizeof(asn_DEF_AuxFulfillment_tags_1) + /sizeof(asn_DEF_AuxFulfillment_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + asn_MBR_AuxFulfillment_1, + 3, /* Elements count */ + &asn_SPC_AuxFulfillment_specs_1 /* Additional specs */ +}; + diff --git a/src/cryptoconditions/src/asn/AuxFulfillment.h b/src/cryptoconditions/src/asn/AuxFulfillment.h new file mode 100644 index 00000000000..89b514b7781 --- /dev/null +++ b/src/cryptoconditions/src/asn/AuxFulfillment.h @@ -0,0 +1,39 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#ifndef _AuxFulfillment_H_ +#define _AuxFulfillment_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* AuxFulfillment */ +typedef struct AuxFulfillment { + OCTET_STRING_t method; + OCTET_STRING_t conditionAux; + OCTET_STRING_t fulfillmentAux; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} AuxFulfillment_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_AuxFulfillment; + +#ifdef __cplusplus +} +#endif + +#endif /* _AuxFulfillment_H_ */ +#include diff --git a/src/cryptoconditions/src/asn/AuxSha512Fulfillment.c b/src/cryptoconditions/src/asn/AuxSha512Fulfillment.c new file mode 100644 index 00000000000..62ad8a76f67 --- /dev/null +++ b/src/cryptoconditions/src/asn/AuxSha512Fulfillment.c @@ -0,0 +1,78 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#include "AuxSha512Fulfillment.h" + +static asn_TYPE_member_t asn_MBR_AuxSha512Fulfillment_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct AuxSha512Fulfillment, method), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCTET_STRING, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "method" + }, + { ATF_NOFLAGS, 0, offsetof(struct AuxSha512Fulfillment, conditionAux), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCTET_STRING, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "conditionAux" + }, + { ATF_NOFLAGS, 0, offsetof(struct AuxSha512Fulfillment, fulfillmentAux), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCTET_STRING, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "fulfillmentAux" + }, +}; +static const ber_tlv_tag_t asn_DEF_AuxSha512Fulfillment_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_AuxSha512Fulfillment_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* method */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* conditionAux */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* fulfillmentAux */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_AuxSha512Fulfillment_specs_1 = { + sizeof(struct AuxSha512Fulfillment), + offsetof(struct AuxSha512Fulfillment, _asn_ctx), + asn_MAP_AuxSha512Fulfillment_tag2el_1, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn_TYPE_descriptor_t asn_DEF_AuxSha512Fulfillment = { + "AuxSha512Fulfillment", + "AuxSha512Fulfillment", + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_AuxSha512Fulfillment_tags_1, + sizeof(asn_DEF_AuxSha512Fulfillment_tags_1) + /sizeof(asn_DEF_AuxSha512Fulfillment_tags_1[0]), /* 1 */ + asn_DEF_AuxSha512Fulfillment_tags_1, /* Same as above */ + sizeof(asn_DEF_AuxSha512Fulfillment_tags_1) + /sizeof(asn_DEF_AuxSha512Fulfillment_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + asn_MBR_AuxSha512Fulfillment_1, + 3, /* Elements count */ + &asn_SPC_AuxSha512Fulfillment_specs_1 /* Additional specs */ +}; + diff --git a/src/cryptoconditions/src/asn/AuxSha512Fulfillment.h b/src/cryptoconditions/src/asn/AuxSha512Fulfillment.h new file mode 100644 index 00000000000..81a7fa140c0 --- /dev/null +++ b/src/cryptoconditions/src/asn/AuxSha512Fulfillment.h @@ -0,0 +1,39 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#ifndef _AuxSha512Fulfillment_H_ +#define _AuxSha512Fulfillment_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* AuxSha512Fulfillment */ +typedef struct AuxSha512Fulfillment { + OCTET_STRING_t method; + OCTET_STRING_t conditionAux; + OCTET_STRING_t fulfillmentAux; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} AuxSha512Fulfillment_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_AuxSha512Fulfillment; + +#ifdef __cplusplus +} +#endif + +#endif /* _AuxSha512Fulfillment_H_ */ +#include diff --git a/src/cryptoconditions/src/asn/BIT_STRING.c b/src/cryptoconditions/src/asn/BIT_STRING.c new file mode 100644 index 00000000000..997ff41619e --- /dev/null +++ b/src/cryptoconditions/src/asn/BIT_STRING.c @@ -0,0 +1,189 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * BIT STRING basic type description. + */ +static const ber_tlv_tag_t asn_DEF_BIT_STRING_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)) +}; +static asn_OCTET_STRING_specifics_t asn_DEF_BIT_STRING_specs = { + sizeof(BIT_STRING_t), + offsetof(BIT_STRING_t, _asn_ctx), + ASN_OSUBV_BIT +}; +asn_TYPE_descriptor_t asn_DEF_BIT_STRING = { + "BIT STRING", + "BIT_STRING", + OCTET_STRING_free, /* Implemented in terms of OCTET STRING */ + BIT_STRING_print, + BIT_STRING_constraint, + OCTET_STRING_decode_ber, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_encode_der, /* Implemented in terms of OCTET STRING */ + OCTET_STRING_decode_xer_binary, + BIT_STRING_encode_xer, + OCTET_STRING_decode_uper, /* Unaligned PER decoder */ + OCTET_STRING_encode_uper, /* Unaligned PER encoder */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_BIT_STRING_tags, + sizeof(asn_DEF_BIT_STRING_tags) + / sizeof(asn_DEF_BIT_STRING_tags[0]), + asn_DEF_BIT_STRING_tags, /* Same as above */ + sizeof(asn_DEF_BIT_STRING_tags) + / sizeof(asn_DEF_BIT_STRING_tags[0]), + 0, /* No PER visible constraints */ + 0, 0, /* No members */ + &asn_DEF_BIT_STRING_specs +}; + +/* + * BIT STRING generic constraint. + */ +int +BIT_STRING_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + + if(st && st->buf) { + if((st->size == 0 && st->bits_unused) + || st->bits_unused < 0 || st->bits_unused > 7) { + ASN__CTFAIL(app_key, td, sptr, + "%s: invalid padding byte (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + return 0; +} + +static char *_bit_pattern[16] = { + "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", + "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111" +}; + +asn_enc_rval_t +BIT_STRING_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t er; + char scratch[128]; + char *p = scratch; + char *scend = scratch + (sizeof(scratch) - 10); + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + int xcan = (flags & XER_F_CANONICAL); + uint8_t *buf; + uint8_t *end; + + if(!st || !st->buf) + ASN__ENCODE_FAILED; + + er.encoded = 0; + + buf = st->buf; + end = buf + st->size - 1; /* Last byte is special */ + + /* + * Binary dump + */ + for(; buf < end; buf++) { + int v = *buf; + int nline = xcan?0:(((buf - st->buf) % 8) == 0); + if(p >= scend || nline) { + er.encoded += p - scratch; + ASN__CALLBACK(scratch, p - scratch); + p = scratch; + if(nline) ASN__TEXT_INDENT(1, ilevel); + } + memcpy(p + 0, _bit_pattern[v >> 4], 4); + memcpy(p + 4, _bit_pattern[v & 0x0f], 4); + p += 8; + } + + if(!xcan && ((buf - st->buf) % 8) == 0) + ASN__TEXT_INDENT(1, ilevel); + er.encoded += p - scratch; + ASN__CALLBACK(scratch, p - scratch); + p = scratch; + + if(buf == end) { + int v = *buf; + int ubits = st->bits_unused; + int i; + for(i = 7; i >= ubits; i--) + *p++ = (v & (1 << i)) ? 0x31 : 0x30; + er.encoded += p - scratch; + ASN__CALLBACK(scratch, p - scratch); + } + + if(!xcan) ASN__TEXT_INDENT(1, ilevel - 1); + + ASN__ENCODED_OK(er); +cb_failed: + ASN__ENCODE_FAILED; +} + + +/* + * BIT STRING specific contents printer. + */ +int +BIT_STRING_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + const char * const h2c = "0123456789ABCDEF"; + char scratch[64]; + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + uint8_t *buf; + uint8_t *end; + char *p = scratch; + + (void)td; /* Unused argument */ + + if(!st || !st->buf) + return (cb("", 8, app_key) < 0) ? -1 : 0; + + ilevel++; + buf = st->buf; + end = buf + st->size; + + /* + * Hexadecimal dump. + */ + for(; buf < end; buf++) { + if((buf - st->buf) % 16 == 0 && (st->size > 16) + && buf != st->buf) { + _i_INDENT(1); + /* Dump the string */ + if(cb(scratch, p - scratch, app_key) < 0) return -1; + p = scratch; + } + *p++ = h2c[*buf >> 4]; + *p++ = h2c[*buf & 0x0F]; + *p++ = 0x20; + } + + if(p > scratch) { + p--; /* Eat the tailing space */ + + if((st->size > 16)) { + _i_INDENT(1); + } + + /* Dump the incomplete 16-bytes row */ + if(cb(scratch, p - scratch, app_key) < 0) + return -1; + } + + return 0; +} + diff --git a/src/cryptoconditions/src/asn/BIT_STRING.h b/src/cryptoconditions/src/asn/BIT_STRING.h new file mode 100644 index 00000000000..732e878bcad --- /dev/null +++ b/src/cryptoconditions/src/asn/BIT_STRING.h @@ -0,0 +1,33 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _BIT_STRING_H_ +#define _BIT_STRING_H_ + +#include /* Some help from OCTET STRING */ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct BIT_STRING_s { + uint8_t *buf; /* BIT STRING body */ + int size; /* Size of the above buffer */ + + int bits_unused;/* Unused trailing bits in the last octet (0..7) */ + + asn_struct_ctx_t _asn_ctx; /* Parsing across buffer boundaries */ +} BIT_STRING_t; + +extern asn_TYPE_descriptor_t asn_DEF_BIT_STRING; + +asn_struct_print_f BIT_STRING_print; /* Human-readable output */ +asn_constr_check_f BIT_STRING_constraint; +xer_type_encoder_f BIT_STRING_encode_xer; + +#ifdef __cplusplus +} +#endif + +#endif /* _BIT_STRING_H_ */ diff --git a/src/cryptoconditions/src/asn/CompoundSha256Condition.c b/src/cryptoconditions/src/asn/CompoundSha256Condition.c new file mode 100644 index 00000000000..31c276bf601 --- /dev/null +++ b/src/cryptoconditions/src/asn/CompoundSha256Condition.c @@ -0,0 +1,235 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#include "CompoundSha256Condition.h" + +static int +cost_3_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + /* Constraint check succeeded */ + return 0; +} + +/* + * This type is implemented using NativeInteger, + * so here we adjust the DEF accordingly. + */ +static void +cost_3_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_NativeInteger.free_struct; + td->print_struct = asn_DEF_NativeInteger.print_struct; + td->check_constraints = asn_DEF_NativeInteger.check_constraints; + td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; + td->der_encoder = asn_DEF_NativeInteger.der_encoder; + td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; + td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_NativeInteger.per_constraints; + td->elements = asn_DEF_NativeInteger.elements; + td->elements_count = asn_DEF_NativeInteger.elements_count; + /* td->specifics = asn_DEF_NativeInteger.specifics; // Defined explicitly */ +} + +static void +cost_3_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + cost_3_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +static int +cost_3_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + cost_3_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +static asn_dec_rval_t +cost_3_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + cost_3_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +static asn_enc_rval_t +cost_3_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + cost_3_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +static asn_dec_rval_t +cost_3_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + cost_3_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +static asn_enc_rval_t +cost_3_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + cost_3_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +static int +memb_fingerprint_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size; + + if((size == 32)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_cost_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + /* Constraint check succeeded */ + return 0; +} + +static const asn_INTEGER_specifics_t asn_SPC_cost_specs_3 = { + 0, 0, 0, 0, 0, + 0, /* Native long size */ + 1 /* Unsigned representation */ +}; +static const ber_tlv_tag_t asn_DEF_cost_tags_3[] = { + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_cost_3 = { + "cost", + "cost", + cost_3_free, + cost_3_print, + cost_3_constraint, + cost_3_decode_ber, + cost_3_encode_der, + cost_3_decode_xer, + cost_3_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_cost_tags_3, + sizeof(asn_DEF_cost_tags_3) + /sizeof(asn_DEF_cost_tags_3[0]) - 1, /* 1 */ + asn_DEF_cost_tags_3, /* Same as above */ + sizeof(asn_DEF_cost_tags_3) + /sizeof(asn_DEF_cost_tags_3[0]), /* 2 */ + 0, /* No PER visible constraints */ + 0, 0, /* No members */ + &asn_SPC_cost_specs_3 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_CompoundSha256Condition_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct CompoundSha256Condition, fingerprint), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCTET_STRING, + memb_fingerprint_constraint_1, + 0, /* PER is not compiled, use -gen-PER */ + 0, + "fingerprint" + }, + { ATF_NOFLAGS, 0, offsetof(struct CompoundSha256Condition, cost), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_cost_3, + memb_cost_constraint_1, + 0, /* PER is not compiled, use -gen-PER */ + 0, + "cost" + }, + { ATF_NOFLAGS, 0, offsetof(struct CompoundSha256Condition, subtypes), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ConditionTypes, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "subtypes" + }, +}; +static const ber_tlv_tag_t asn_DEF_CompoundSha256Condition_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_CompoundSha256Condition_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* fingerprint */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* cost */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* subtypes */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_CompoundSha256Condition_specs_1 = { + sizeof(struct CompoundSha256Condition), + offsetof(struct CompoundSha256Condition, _asn_ctx), + asn_MAP_CompoundSha256Condition_tag2el_1, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn_TYPE_descriptor_t asn_DEF_CompoundSha256Condition = { + "CompoundSha256Condition", + "CompoundSha256Condition", + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_CompoundSha256Condition_tags_1, + sizeof(asn_DEF_CompoundSha256Condition_tags_1) + /sizeof(asn_DEF_CompoundSha256Condition_tags_1[0]), /* 1 */ + asn_DEF_CompoundSha256Condition_tags_1, /* Same as above */ + sizeof(asn_DEF_CompoundSha256Condition_tags_1) + /sizeof(asn_DEF_CompoundSha256Condition_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + asn_MBR_CompoundSha256Condition_1, + 3, /* Elements count */ + &asn_SPC_CompoundSha256Condition_specs_1 /* Additional specs */ +}; + diff --git a/src/cryptoconditions/src/asn/CompoundSha256Condition.h b/src/cryptoconditions/src/asn/CompoundSha256Condition.h new file mode 100644 index 00000000000..5d791be4f04 --- /dev/null +++ b/src/cryptoconditions/src/asn/CompoundSha256Condition.h @@ -0,0 +1,42 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#ifndef _CompoundSha256Condition_H_ +#define _CompoundSha256Condition_H_ + + +#include + +/* Including external dependencies */ +#include +#include +#include "ConditionTypes.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* CompoundSha256Condition */ +typedef struct CompoundSha256Condition { + OCTET_STRING_t fingerprint; + unsigned long cost; + ConditionTypes_t subtypes; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} CompoundSha256Condition_t; + +/* Implementation */ +/* extern asn_TYPE_descriptor_t asn_DEF_cost_3; // (Use -fall-defs-global to expose) */ +extern asn_TYPE_descriptor_t asn_DEF_CompoundSha256Condition; + +#ifdef __cplusplus +} +#endif + +#endif /* _CompoundSha256Condition_H_ */ +#include diff --git a/src/cryptoconditions/src/asn/Condition.c b/src/cryptoconditions/src/asn/Condition.c new file mode 100644 index 00000000000..49ec83e3b5a --- /dev/null +++ b/src/cryptoconditions/src/asn/Condition.c @@ -0,0 +1,114 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#include "Condition.h" + +static asn_TYPE_member_t asn_MBR_Condition_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct Condition, choice.preimageSha256), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_SimpleSha256Condition, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "preimageSha256" + }, + { ATF_NOFLAGS, 0, offsetof(struct Condition, choice.prefixSha256), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CompoundSha256Condition, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "prefixSha256" + }, + { ATF_NOFLAGS, 0, offsetof(struct Condition, choice.thresholdSha256), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_CompoundSha256Condition, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "thresholdSha256" + }, + { ATF_NOFLAGS, 0, offsetof(struct Condition, choice.rsaSha256), + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_SimpleSha256Condition, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "rsaSha256" + }, + { ATF_NOFLAGS, 0, offsetof(struct Condition, choice.ed25519Sha256), + (ASN_TAG_CLASS_CONTEXT | (4 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_SimpleSha256Condition, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "ed25519Sha256" + }, + { ATF_NOFLAGS, 0, offsetof(struct Condition, choice.secp256k1Sha256), + (ASN_TAG_CLASS_CONTEXT | (5 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_SimpleSha256Condition, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "secp256k1Sha256" + }, + { ATF_NOFLAGS, 0, offsetof(struct Condition, choice.evalSha256), + (ASN_TAG_CLASS_CONTEXT | (15 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_SimpleSha256Condition, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "evalSha256" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_Condition_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* preimageSha256 */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* prefixSha256 */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* thresholdSha256 */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* rsaSha256 */ + { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* ed25519Sha256 */ + { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* secp256k1Sha256 */ + { (ASN_TAG_CLASS_CONTEXT | (15 << 2)), 6, 0, 0 } /* evalSha256 */ +}; +static asn_CHOICE_specifics_t asn_SPC_Condition_specs_1 = { + sizeof(struct Condition), + offsetof(struct Condition, _asn_ctx), + offsetof(struct Condition, present), + sizeof(((struct Condition *)0)->present), + asn_MAP_Condition_tag2el_1, + 7, /* Count of tags in the map */ + 0, + -1 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_Condition = { + "Condition", + "Condition", + CHOICE_free, + CHOICE_print, + CHOICE_constraint, + CHOICE_decode_ber, + CHOICE_encode_der, + CHOICE_decode_xer, + CHOICE_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + CHOICE_outmost_tag, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + 0, /* No PER visible constraints */ + asn_MBR_Condition_1, + 7, /* Elements count */ + &asn_SPC_Condition_specs_1 /* Additional specs */ +}; + diff --git a/src/cryptoconditions/src/asn/Condition.h b/src/cryptoconditions/src/asn/Condition.h new file mode 100644 index 00000000000..ad32b18aac7 --- /dev/null +++ b/src/cryptoconditions/src/asn/Condition.h @@ -0,0 +1,59 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#ifndef _Condition_H_ +#define _Condition_H_ + + +#include + +/* Including external dependencies */ +#include "SimpleSha256Condition.h" +#include "CompoundSha256Condition.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum Condition_PR { + Condition_PR_NOTHING, /* No components present */ + Condition_PR_preimageSha256, + Condition_PR_prefixSha256, + Condition_PR_thresholdSha256, + Condition_PR_rsaSha256, + Condition_PR_ed25519Sha256, + Condition_PR_secp256k1Sha256, + Condition_PR_evalSha256 +} Condition_PR; + +/* Condition */ +typedef struct Condition { + Condition_PR present; + union Condition_u { + SimpleSha256Condition_t preimageSha256; + CompoundSha256Condition_t prefixSha256; + CompoundSha256Condition_t thresholdSha256; + SimpleSha256Condition_t rsaSha256; + SimpleSha256Condition_t ed25519Sha256; + SimpleSha256Condition_t secp256k1Sha256; + SimpleSha256Condition_t evalSha256; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} Condition_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_Condition; + +#ifdef __cplusplus +} +#endif + +#endif /* _Condition_H_ */ +#include diff --git a/src/cryptoconditions/src/asn/ConditionTypes.c b/src/cryptoconditions/src/asn/ConditionTypes.c new file mode 100644 index 00000000000..16ca9d19c4f --- /dev/null +++ b/src/cryptoconditions/src/asn/ConditionTypes.c @@ -0,0 +1,108 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#include "ConditionTypes.h" + +int +ConditionTypes_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + /* Replace with underlying type checker */ + td->check_constraints = asn_DEF_BIT_STRING.check_constraints; + return td->check_constraints(td, sptr, ctfailcb, app_key); +} + +/* + * This type is implemented using BIT_STRING, + * so here we adjust the DEF accordingly. + */ +static void +ConditionTypes_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_BIT_STRING.free_struct; + td->print_struct = asn_DEF_BIT_STRING.print_struct; + td->check_constraints = asn_DEF_BIT_STRING.check_constraints; + td->ber_decoder = asn_DEF_BIT_STRING.ber_decoder; + td->der_encoder = asn_DEF_BIT_STRING.der_encoder; + td->xer_decoder = asn_DEF_BIT_STRING.xer_decoder; + td->xer_encoder = asn_DEF_BIT_STRING.xer_encoder; + td->uper_decoder = asn_DEF_BIT_STRING.uper_decoder; + td->uper_encoder = asn_DEF_BIT_STRING.uper_encoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_BIT_STRING.per_constraints; + td->elements = asn_DEF_BIT_STRING.elements; + td->elements_count = asn_DEF_BIT_STRING.elements_count; + td->specifics = asn_DEF_BIT_STRING.specifics; +} + +void +ConditionTypes_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + ConditionTypes_1_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +int +ConditionTypes_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + ConditionTypes_1_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +asn_dec_rval_t +ConditionTypes_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + ConditionTypes_1_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +asn_enc_rval_t +ConditionTypes_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + ConditionTypes_1_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +asn_dec_rval_t +ConditionTypes_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + ConditionTypes_1_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +asn_enc_rval_t +ConditionTypes_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + ConditionTypes_1_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +static const ber_tlv_tag_t asn_DEF_ConditionTypes_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_ConditionTypes = { + "ConditionTypes", + "ConditionTypes", + ConditionTypes_free, + ConditionTypes_print, + ConditionTypes_constraint, + ConditionTypes_decode_ber, + ConditionTypes_encode_der, + ConditionTypes_decode_xer, + ConditionTypes_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_ConditionTypes_tags_1, + sizeof(asn_DEF_ConditionTypes_tags_1) + /sizeof(asn_DEF_ConditionTypes_tags_1[0]), /* 1 */ + asn_DEF_ConditionTypes_tags_1, /* Same as above */ + sizeof(asn_DEF_ConditionTypes_tags_1) + /sizeof(asn_DEF_ConditionTypes_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + 0, 0, /* Defined elsewhere */ + 0 /* No specifics */ +}; + diff --git a/src/cryptoconditions/src/asn/ConditionTypes.h b/src/cryptoconditions/src/asn/ConditionTypes.h new file mode 100644 index 00000000000..3d391eb3665 --- /dev/null +++ b/src/cryptoconditions/src/asn/ConditionTypes.h @@ -0,0 +1,49 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#ifndef _ConditionTypes_H_ +#define _ConditionTypes_H_ + + +#include + +/* Including external dependencies */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum ConditionTypes { + ConditionTypes_preImageSha256 = 0, + ConditionTypes_prefixSha256 = 1, + ConditionTypes_thresholdSha256 = 2, + ConditionTypes_rsaSha256 = 3, + ConditionTypes_ed25519Sha256 = 4, + ConditionTypes_secp256k1Sha256 = 5, + ConditionTypes_evalSha256 = 15 +} e_ConditionTypes; + +/* ConditionTypes */ +typedef BIT_STRING_t ConditionTypes_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_ConditionTypes; +asn_struct_free_f ConditionTypes_free; +asn_struct_print_f ConditionTypes_print; +asn_constr_check_f ConditionTypes_constraint; +ber_type_decoder_f ConditionTypes_decode_ber; +der_type_encoder_f ConditionTypes_encode_der; +xer_type_decoder_f ConditionTypes_decode_xer; +xer_type_encoder_f ConditionTypes_encode_xer; + +#ifdef __cplusplus +} +#endif + +#endif /* _ConditionTypes_H_ */ +#include diff --git a/src/cryptoconditions/src/asn/CryptoConditions.asn b/src/cryptoconditions/src/asn/CryptoConditions.asn new file mode 100644 index 00000000000..8aa1e365b9d --- /dev/null +++ b/src/cryptoconditions/src/asn/CryptoConditions.asn @@ -0,0 +1,118 @@ +---- + +Crypto-Conditions DEFINITIONS AUTOMATIC TAGS ::= BEGIN + + -- Conditions + + Condition ::= CHOICE { + preimageSha256 [0] SimpleSha256Condition, + prefixSha256 [1] CompoundSha256Condition, + thresholdSha256 [2] CompoundSha256Condition, + rsaSha256 [3] SimpleSha256Condition, + ed25519Sha256 [4] SimpleSha256Condition, + secp256k1Sha256 [5] SimpleSha256Condition, + evalSha256 [15] SimpleSha256Condition + } + + SimpleSha256Condition ::= SEQUENCE { + fingerprint OCTET STRING (SIZE(32)), + cost INTEGER (0..4294967295) + } + + CompoundSha256Condition ::= SEQUENCE { + fingerprint OCTET STRING (SIZE(32)), + cost INTEGER (0..4294967295), + subtypes ConditionTypes + } + + ConditionTypes ::= BIT STRING { + preImageSha256 (0), + prefixSha256 (1), + thresholdSha256 (2), + rsaSha256 (3), + ed25519Sha256 (4), + secp256k1Sha256 (5), + evalSha256 (15) + } + + -- Fulfillments + + Fulfillment ::= CHOICE { + preimageSha256 [0] PreimageFulfillment , + prefixSha256 [1] PrefixFulfillment, + thresholdSha256 [2] ThresholdFulfillment, + rsaSha256 [3] RsaSha256Fulfillment, + ed25519Sha256 [4] Ed25519Sha512Fulfillment, + secp256k1Sha256 [5] Secp256k1Fulfillment, + evalSha256 [15] EvalFulfillment + } + + PreimageFulfillment ::= SEQUENCE { + preimage OCTET STRING + } + + PrefixFulfillment ::= SEQUENCE { + prefix OCTET STRING, + maxMessageLength INTEGER (0..4294967295), + subfulfillment Fulfillment + } + + ThresholdFulfillment ::= SEQUENCE { + subfulfillments SET OF Fulfillment, + subconditions SET OF Condition + } + + RsaSha256Fulfillment ::= SEQUENCE { + modulus OCTET STRING, + signature OCTET STRING + } + + Ed25519Sha512Fulfillment ::= SEQUENCE { + publicKey OCTET STRING (SIZE(32)), + signature OCTET STRING (SIZE(64)) + } + + Secp256k1Fulfillment ::= SEQUENCE { + publicKey OCTET STRING (SIZE(33)), + signature OCTET STRING (SIZE(64)) + } + + EvalFulfillment ::= SEQUENCE { + method OCTET STRING (SIZE(64)), + paramsBin OCTET STRING + } + + -- Fingerprint Content + + -- The PREIMAGE-SHA-256 condition fingerprint content is not DER encoded + -- The fingerprint content is the preimage + + PrefixFingerprintContents ::= SEQUENCE { + prefix OCTET STRING, + maxMessageLength INTEGER (0..4294967295), + subcondition Condition + } + + ThresholdFingerprintContents ::= SEQUENCE { + threshold INTEGER (1..65535), + subconditions2 SET OF Condition + } + + RsaFingerprintContents ::= SEQUENCE { + modulus OCTET STRING + } + + Ed25519FingerprintContents ::= SEQUENCE { + publicKey OCTET STRING (SIZE(32)) + } + + Secp256k1FingerprintContents ::= SEQUENCE { + publicKey OCTET STRING (SIZE(33)) + } + + EvalFingerprintContents ::= SEQUENCE { + method OCTET STRING (SIZE(64)), + paramsBin OCTET STRING + } + +END diff --git a/src/cryptoconditions/src/asn/Ed25519FingerprintContents.c b/src/cryptoconditions/src/asn/Ed25519FingerprintContents.c new file mode 100644 index 00000000000..c4721310097 --- /dev/null +++ b/src/cryptoconditions/src/asn/Ed25519FingerprintContents.c @@ -0,0 +1,84 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#include "Ed25519FingerprintContents.h" + +static int +memb_publicKey_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size; + + if((size == 32)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_TYPE_member_t asn_MBR_Ed25519FingerprintContents_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct Ed25519FingerprintContents, publicKey), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCTET_STRING, + memb_publicKey_constraint_1, + 0, /* PER is not compiled, use -gen-PER */ + 0, + "publicKey" + }, +}; +static const ber_tlv_tag_t asn_DEF_Ed25519FingerprintContents_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_Ed25519FingerprintContents_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* publicKey */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_Ed25519FingerprintContents_specs_1 = { + sizeof(struct Ed25519FingerprintContents), + offsetof(struct Ed25519FingerprintContents, _asn_ctx), + asn_MAP_Ed25519FingerprintContents_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn_TYPE_descriptor_t asn_DEF_Ed25519FingerprintContents = { + "Ed25519FingerprintContents", + "Ed25519FingerprintContents", + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Ed25519FingerprintContents_tags_1, + sizeof(asn_DEF_Ed25519FingerprintContents_tags_1) + /sizeof(asn_DEF_Ed25519FingerprintContents_tags_1[0]), /* 1 */ + asn_DEF_Ed25519FingerprintContents_tags_1, /* Same as above */ + sizeof(asn_DEF_Ed25519FingerprintContents_tags_1) + /sizeof(asn_DEF_Ed25519FingerprintContents_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + asn_MBR_Ed25519FingerprintContents_1, + 1, /* Elements count */ + &asn_SPC_Ed25519FingerprintContents_specs_1 /* Additional specs */ +}; + diff --git a/src/cryptoconditions/src/asn/Ed25519FingerprintContents.h b/src/cryptoconditions/src/asn/Ed25519FingerprintContents.h new file mode 100644 index 00000000000..7ef9e188e48 --- /dev/null +++ b/src/cryptoconditions/src/asn/Ed25519FingerprintContents.h @@ -0,0 +1,37 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#ifndef _Ed25519FingerprintContents_H_ +#define _Ed25519FingerprintContents_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Ed25519FingerprintContents */ +typedef struct Ed25519FingerprintContents { + OCTET_STRING_t publicKey; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} Ed25519FingerprintContents_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_Ed25519FingerprintContents; + +#ifdef __cplusplus +} +#endif + +#endif /* _Ed25519FingerprintContents_H_ */ +#include diff --git a/src/cryptoconditions/src/asn/Ed25519Sha512Fulfillment.c b/src/cryptoconditions/src/asn/Ed25519Sha512Fulfillment.c new file mode 100644 index 00000000000..6f756fb569a --- /dev/null +++ b/src/cryptoconditions/src/asn/Ed25519Sha512Fulfillment.c @@ -0,0 +1,120 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#include "Ed25519Sha512Fulfillment.h" + +static int +memb_publicKey_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size; + + if((size == 32)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_signature_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size; + + if((size == 64)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_TYPE_member_t asn_MBR_Ed25519Sha512Fulfillment_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct Ed25519Sha512Fulfillment, publicKey), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCTET_STRING, + memb_publicKey_constraint_1, + 0, /* PER is not compiled, use -gen-PER */ + 0, + "publicKey" + }, + { ATF_NOFLAGS, 0, offsetof(struct Ed25519Sha512Fulfillment, signature), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCTET_STRING, + memb_signature_constraint_1, + 0, /* PER is not compiled, use -gen-PER */ + 0, + "signature" + }, +}; +static const ber_tlv_tag_t asn_DEF_Ed25519Sha512Fulfillment_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_Ed25519Sha512Fulfillment_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* publicKey */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* signature */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_Ed25519Sha512Fulfillment_specs_1 = { + sizeof(struct Ed25519Sha512Fulfillment), + offsetof(struct Ed25519Sha512Fulfillment, _asn_ctx), + asn_MAP_Ed25519Sha512Fulfillment_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn_TYPE_descriptor_t asn_DEF_Ed25519Sha512Fulfillment = { + "Ed25519Sha512Fulfillment", + "Ed25519Sha512Fulfillment", + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Ed25519Sha512Fulfillment_tags_1, + sizeof(asn_DEF_Ed25519Sha512Fulfillment_tags_1) + /sizeof(asn_DEF_Ed25519Sha512Fulfillment_tags_1[0]), /* 1 */ + asn_DEF_Ed25519Sha512Fulfillment_tags_1, /* Same as above */ + sizeof(asn_DEF_Ed25519Sha512Fulfillment_tags_1) + /sizeof(asn_DEF_Ed25519Sha512Fulfillment_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + asn_MBR_Ed25519Sha512Fulfillment_1, + 2, /* Elements count */ + &asn_SPC_Ed25519Sha512Fulfillment_specs_1 /* Additional specs */ +}; + diff --git a/src/cryptoconditions/src/asn/Ed25519Sha512Fulfillment.h b/src/cryptoconditions/src/asn/Ed25519Sha512Fulfillment.h new file mode 100644 index 00000000000..60383980397 --- /dev/null +++ b/src/cryptoconditions/src/asn/Ed25519Sha512Fulfillment.h @@ -0,0 +1,38 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#ifndef _Ed25519Sha512Fulfillment_H_ +#define _Ed25519Sha512Fulfillment_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Ed25519Sha512Fulfillment */ +typedef struct Ed25519Sha512Fulfillment { + OCTET_STRING_t publicKey; + OCTET_STRING_t signature; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} Ed25519Sha512Fulfillment_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_Ed25519Sha512Fulfillment; + +#ifdef __cplusplus +} +#endif + +#endif /* _Ed25519Sha512Fulfillment_H_ */ +#include diff --git a/src/cryptoconditions/src/asn/EvalFingerprintContents.c b/src/cryptoconditions/src/asn/EvalFingerprintContents.c new file mode 100644 index 00000000000..d23e3c3861f --- /dev/null +++ b/src/cryptoconditions/src/asn/EvalFingerprintContents.c @@ -0,0 +1,94 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#include "EvalFingerprintContents.h" + +static int +memb_method_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size; + + if((size == 64)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_TYPE_member_t asn_MBR_EvalFingerprintContents_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct EvalFingerprintContents, method), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCTET_STRING, + memb_method_constraint_1, + 0, /* PER is not compiled, use -gen-PER */ + 0, + "method" + }, + { ATF_NOFLAGS, 0, offsetof(struct EvalFingerprintContents, paramsBin), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCTET_STRING, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "paramsBin" + }, +}; +static const ber_tlv_tag_t asn_DEF_EvalFingerprintContents_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_EvalFingerprintContents_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* method */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* paramsBin */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_EvalFingerprintContents_specs_1 = { + sizeof(struct EvalFingerprintContents), + offsetof(struct EvalFingerprintContents, _asn_ctx), + asn_MAP_EvalFingerprintContents_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn_TYPE_descriptor_t asn_DEF_EvalFingerprintContents = { + "EvalFingerprintContents", + "EvalFingerprintContents", + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_EvalFingerprintContents_tags_1, + sizeof(asn_DEF_EvalFingerprintContents_tags_1) + /sizeof(asn_DEF_EvalFingerprintContents_tags_1[0]), /* 1 */ + asn_DEF_EvalFingerprintContents_tags_1, /* Same as above */ + sizeof(asn_DEF_EvalFingerprintContents_tags_1) + /sizeof(asn_DEF_EvalFingerprintContents_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + asn_MBR_EvalFingerprintContents_1, + 2, /* Elements count */ + &asn_SPC_EvalFingerprintContents_specs_1 /* Additional specs */ +}; + diff --git a/src/cryptoconditions/src/asn/EvalFingerprintContents.h b/src/cryptoconditions/src/asn/EvalFingerprintContents.h new file mode 100644 index 00000000000..52fb9ba62af --- /dev/null +++ b/src/cryptoconditions/src/asn/EvalFingerprintContents.h @@ -0,0 +1,38 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#ifndef _EvalFingerprintContents_H_ +#define _EvalFingerprintContents_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* EvalFingerprintContents */ +typedef struct EvalFingerprintContents { + OCTET_STRING_t method; + OCTET_STRING_t paramsBin; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} EvalFingerprintContents_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_EvalFingerprintContents; + +#ifdef __cplusplus +} +#endif + +#endif /* _EvalFingerprintContents_H_ */ +#include diff --git a/src/cryptoconditions/src/asn/EvalFulfillment.c b/src/cryptoconditions/src/asn/EvalFulfillment.c new file mode 100644 index 00000000000..e56b80317bf --- /dev/null +++ b/src/cryptoconditions/src/asn/EvalFulfillment.c @@ -0,0 +1,94 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#include "EvalFulfillment.h" + +static int +memb_method_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size; + + if((size == 64)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_TYPE_member_t asn_MBR_EvalFulfillment_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct EvalFulfillment, method), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCTET_STRING, + memb_method_constraint_1, + 0, /* PER is not compiled, use -gen-PER */ + 0, + "method" + }, + { ATF_NOFLAGS, 0, offsetof(struct EvalFulfillment, paramsBin), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCTET_STRING, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "paramsBin" + }, +}; +static const ber_tlv_tag_t asn_DEF_EvalFulfillment_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_EvalFulfillment_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* method */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* paramsBin */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_EvalFulfillment_specs_1 = { + sizeof(struct EvalFulfillment), + offsetof(struct EvalFulfillment, _asn_ctx), + asn_MAP_EvalFulfillment_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn_TYPE_descriptor_t asn_DEF_EvalFulfillment = { + "EvalFulfillment", + "EvalFulfillment", + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_EvalFulfillment_tags_1, + sizeof(asn_DEF_EvalFulfillment_tags_1) + /sizeof(asn_DEF_EvalFulfillment_tags_1[0]), /* 1 */ + asn_DEF_EvalFulfillment_tags_1, /* Same as above */ + sizeof(asn_DEF_EvalFulfillment_tags_1) + /sizeof(asn_DEF_EvalFulfillment_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + asn_MBR_EvalFulfillment_1, + 2, /* Elements count */ + &asn_SPC_EvalFulfillment_specs_1 /* Additional specs */ +}; + diff --git a/src/cryptoconditions/src/asn/EvalFulfillment.h b/src/cryptoconditions/src/asn/EvalFulfillment.h new file mode 100644 index 00000000000..a513ed1605f --- /dev/null +++ b/src/cryptoconditions/src/asn/EvalFulfillment.h @@ -0,0 +1,38 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#ifndef _EvalFulfillment_H_ +#define _EvalFulfillment_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* EvalFulfillment */ +typedef struct EvalFulfillment { + OCTET_STRING_t method; + OCTET_STRING_t paramsBin; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} EvalFulfillment_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_EvalFulfillment; + +#ifdef __cplusplus +} +#endif + +#endif /* _EvalFulfillment_H_ */ +#include diff --git a/src/cryptoconditions/src/asn/Fulfillment.c b/src/cryptoconditions/src/asn/Fulfillment.c new file mode 100644 index 00000000000..faf43b7723c --- /dev/null +++ b/src/cryptoconditions/src/asn/Fulfillment.c @@ -0,0 +1,114 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#include "Fulfillment.h" + +static asn_TYPE_member_t asn_MBR_Fulfillment_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct Fulfillment, choice.preimageSha256), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_PreimageFulfillment, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "preimageSha256" + }, + { ATF_POINTER, 0, offsetof(struct Fulfillment, choice.prefixSha256), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_PrefixFulfillment, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "prefixSha256" + }, + { ATF_POINTER, 0, offsetof(struct Fulfillment, choice.thresholdSha256), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_ThresholdFulfillment, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "thresholdSha256" + }, + { ATF_NOFLAGS, 0, offsetof(struct Fulfillment, choice.rsaSha256), + (ASN_TAG_CLASS_CONTEXT | (3 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_RsaSha256Fulfillment, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "rsaSha256" + }, + { ATF_NOFLAGS, 0, offsetof(struct Fulfillment, choice.ed25519Sha256), + (ASN_TAG_CLASS_CONTEXT | (4 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_Ed25519Sha512Fulfillment, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "ed25519Sha256" + }, + { ATF_NOFLAGS, 0, offsetof(struct Fulfillment, choice.secp256k1Sha256), + (ASN_TAG_CLASS_CONTEXT | (5 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_Secp256k1Fulfillment, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "secp256k1Sha256" + }, + { ATF_NOFLAGS, 0, offsetof(struct Fulfillment, choice.evalSha256), + (ASN_TAG_CLASS_CONTEXT | (15 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_EvalFulfillment, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "evalSha256" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_Fulfillment_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* preimageSha256 */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* prefixSha256 */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* thresholdSha256 */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* rsaSha256 */ + { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* ed25519Sha256 */ + { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* secp256k1Sha256 */ + { (ASN_TAG_CLASS_CONTEXT | (15 << 2)), 6, 0, 0 } /* evalSha256 */ +}; +static asn_CHOICE_specifics_t asn_SPC_Fulfillment_specs_1 = { + sizeof(struct Fulfillment), + offsetof(struct Fulfillment, _asn_ctx), + offsetof(struct Fulfillment, present), + sizeof(((struct Fulfillment *)0)->present), + asn_MAP_Fulfillment_tag2el_1, + 7, /* Count of tags in the map */ + 0, + -1 /* Extensions start */ +}; +asn_TYPE_descriptor_t asn_DEF_Fulfillment = { + "Fulfillment", + "Fulfillment", + CHOICE_free, + CHOICE_print, + CHOICE_constraint, + CHOICE_decode_ber, + CHOICE_encode_der, + CHOICE_decode_xer, + CHOICE_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + CHOICE_outmost_tag, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + 0, /* No PER visible constraints */ + asn_MBR_Fulfillment_1, + 7, /* Elements count */ + &asn_SPC_Fulfillment_specs_1 /* Additional specs */ +}; + diff --git a/src/cryptoconditions/src/asn/Fulfillment.h b/src/cryptoconditions/src/asn/Fulfillment.h new file mode 100644 index 00000000000..01799e94912 --- /dev/null +++ b/src/cryptoconditions/src/asn/Fulfillment.h @@ -0,0 +1,70 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#ifndef _Fulfillment_H_ +#define _Fulfillment_H_ + + +#include + +/* Including external dependencies */ +#include "PreimageFulfillment.h" +#include "RsaSha256Fulfillment.h" +#include "Ed25519Sha512Fulfillment.h" +#include "Secp256k1Fulfillment.h" +#include "EvalFulfillment.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Dependencies */ +typedef enum Fulfillment_PR { + Fulfillment_PR_NOTHING, /* No components present */ + Fulfillment_PR_preimageSha256, + Fulfillment_PR_prefixSha256, + Fulfillment_PR_thresholdSha256, + Fulfillment_PR_rsaSha256, + Fulfillment_PR_ed25519Sha256, + Fulfillment_PR_secp256k1Sha256, + Fulfillment_PR_evalSha256 +} Fulfillment_PR; + +/* Forward declarations */ +struct PrefixFulfillment; +struct ThresholdFulfillment; + +/* Fulfillment */ +typedef struct Fulfillment { + Fulfillment_PR present; + union Fulfillment_u { + PreimageFulfillment_t preimageSha256; + struct PrefixFulfillment *prefixSha256; + struct ThresholdFulfillment *thresholdSha256; + RsaSha256Fulfillment_t rsaSha256; + Ed25519Sha512Fulfillment_t ed25519Sha256; + Secp256k1Fulfillment_t secp256k1Sha256; + EvalFulfillment_t evalSha256; + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} Fulfillment_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_Fulfillment; + +#ifdef __cplusplus +} +#endif + +/* Referred external types */ +#include "PrefixFulfillment.h" +#include "ThresholdFulfillment.h" + +#endif /* _Fulfillment_H_ */ +#include diff --git a/src/cryptoconditions/src/asn/INTEGER.c b/src/cryptoconditions/src/asn/INTEGER.c new file mode 100644 index 00000000000..eed82176b50 --- /dev/null +++ b/src/cryptoconditions/src/asn/INTEGER.c @@ -0,0 +1,1025 @@ +/*- + * Copyright (c) 2003-2014 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include /* Encoder and decoder of a primitive type */ +#include + +/* + * INTEGER basic type description. + */ +static const ber_tlv_tag_t asn_DEF_INTEGER_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_INTEGER = { + "INTEGER", + "INTEGER", + ASN__PRIMITIVE_TYPE_free, + INTEGER_print, + asn_generic_no_constraint, + ber_decode_primitive, + INTEGER_encode_der, + INTEGER_decode_xer, + INTEGER_encode_xer, +#ifdef ASN_DISABLE_PER_SUPPORT + 0, + 0, +#else + INTEGER_decode_uper, /* Unaligned PER decoder */ + INTEGER_encode_uper, /* Unaligned PER encoder */ +#endif /* ASN_DISABLE_PER_SUPPORT */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_INTEGER_tags, + sizeof(asn_DEF_INTEGER_tags) / sizeof(asn_DEF_INTEGER_tags[0]), + asn_DEF_INTEGER_tags, /* Same as above */ + sizeof(asn_DEF_INTEGER_tags) / sizeof(asn_DEF_INTEGER_tags[0]), + 0, /* No PER visible constraints */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + +/* + * Encode INTEGER type using DER. + */ +asn_enc_rval_t +INTEGER_encode_der(asn_TYPE_descriptor_t *td, void *sptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + INTEGER_t *st = (INTEGER_t *)sptr; + + ASN_DEBUG("%s %s as INTEGER (tm=%d)", + cb?"Encoding":"Estimating", td->name, tag_mode); + + /* + * Canonicalize integer in the buffer. + * (Remove too long sign extension, remove some first 0x00 bytes) + */ + if(st->buf) { + uint8_t *buf = st->buf; + uint8_t *end1 = buf + st->size - 1; + int shift; + + /* Compute the number of superfluous leading bytes */ + for(; buf < end1; buf++) { + /* + * If the contents octets of an integer value encoding + * consist of more than one octet, then the bits of the + * first octet and bit 8 of the second octet: + * a) shall not all be ones; and + * b) shall not all be zero. + */ + switch(*buf) { + case 0x00: if((buf[1] & 0x80) == 0) + continue; + break; + case 0xff: if((buf[1] & 0x80)) + continue; + break; + } + break; + } + + /* Remove leading superfluous bytes from the integer */ + shift = buf - st->buf; + if(shift) { + uint8_t *nb = st->buf; + uint8_t *end; + + st->size -= shift; /* New size, minus bad bytes */ + end = nb + st->size; + + for(; nb < end; nb++, buf++) + *nb = *buf; + } + + } /* if(1) */ + + return der_encode_primitive(td, sptr, tag_mode, tag, cb, app_key); +} + +static const asn_INTEGER_enum_map_t *INTEGER_map_enum2value(asn_INTEGER_specifics_t *specs, const char *lstart, const char *lstop); + +/* + * INTEGER specific human-readable output. + */ +static ssize_t +INTEGER__dump(const asn_TYPE_descriptor_t *td, const INTEGER_t *st, asn_app_consume_bytes_f *cb, void *app_key, int plainOrXER) { + asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; + char scratch[32]; /* Enough for 64-bit integer */ + uint8_t *buf = st->buf; + uint8_t *buf_end = st->buf + st->size; + signed long value; + ssize_t wrote = 0; + char *p; + int ret; + + if(specs && specs->field_unsigned) + ret = asn_INTEGER2ulong(st, (unsigned long *)&value); + else + ret = asn_INTEGER2long(st, &value); + + /* Simple case: the integer size is small */ + if(ret == 0) { + const asn_INTEGER_enum_map_t *el; + size_t scrsize; + char *scr; + + el = (value >= 0 || !specs || !specs->field_unsigned) + ? INTEGER_map_value2enum(specs, value) : 0; + if(el) { + scrsize = el->enum_len + 32; + scr = (char *)alloca(scrsize); + if(plainOrXER == 0) + ret = snprintf(scr, scrsize, + "%ld (%s)", value, el->enum_name); + else + ret = snprintf(scr, scrsize, + "<%s/>", el->enum_name); + } else if(plainOrXER && specs && specs->strict_enumeration) { + ASN_DEBUG("ASN.1 forbids dealing with " + "unknown value of ENUMERATED type"); + errno = EPERM; + return -1; + } else { + scrsize = sizeof(scratch); + scr = scratch; + ret = snprintf(scr, scrsize, + (specs && specs->field_unsigned) + ?"%lu":"%ld", value); + } + assert(ret > 0 && (size_t)ret < scrsize); + return (cb(scr, ret, app_key) < 0) ? -1 : ret; + } else if(plainOrXER && specs && specs->strict_enumeration) { + /* + * Here and earlier, we cannot encode the ENUMERATED values + * if there is no corresponding identifier. + */ + ASN_DEBUG("ASN.1 forbids dealing with " + "unknown value of ENUMERATED type"); + errno = EPERM; + return -1; + } + + /* Output in the long xx:yy:zz... format */ + /* TODO: replace with generic algorithm (Knuth TAOCP Vol 2, 4.3.1) */ + for(p = scratch; buf < buf_end; buf++) { + const char * const h2c = "0123456789ABCDEF"; + if((p - scratch) >= (ssize_t)(sizeof(scratch) - 4)) { + /* Flush buffer */ + if(cb(scratch, p - scratch, app_key) < 0) + return -1; + wrote += p - scratch; + p = scratch; + } + *p++ = h2c[*buf >> 4]; + *p++ = h2c[*buf & 0x0F]; + *p++ = 0x3a; /* ":" */ + } + if(p != scratch) + p--; /* Remove the last ":" */ + + wrote += p - scratch; + return (cb(scratch, p - scratch, app_key) < 0) ? -1 : wrote; +} + +/* + * INTEGER specific human-readable output. + */ +int +INTEGER_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + const INTEGER_t *st = (const INTEGER_t *)sptr; + ssize_t ret; + + (void)td; + (void)ilevel; + + if(!st || !st->buf) + ret = cb("", 8, app_key); + else + ret = INTEGER__dump(td, st, cb, app_key, 0); + + return (ret < 0) ? -1 : 0; +} + +struct e2v_key { + const char *start; + const char *stop; + const asn_INTEGER_enum_map_t *vemap; + const unsigned int *evmap; +}; +static int +INTEGER__compar_enum2value(const void *kp, const void *am) { + const struct e2v_key *key = (const struct e2v_key *)kp; + const asn_INTEGER_enum_map_t *el = (const asn_INTEGER_enum_map_t *)am; + const char *ptr, *end, *name; + + /* Remap the element (sort by different criterion) */ + el = key->vemap + key->evmap[el - key->vemap]; + + /* Compare strings */ + for(ptr = key->start, end = key->stop, name = el->enum_name; + ptr < end; ptr++, name++) { + if(*ptr != *name) + return *(const unsigned char *)ptr + - *(const unsigned char *)name; + } + return name[0] ? -1 : 0; +} + +static const asn_INTEGER_enum_map_t * +INTEGER_map_enum2value(asn_INTEGER_specifics_t *specs, const char *lstart, const char *lstop) { + const asn_INTEGER_enum_map_t *el_found; + int count = specs ? specs->map_count : 0; + struct e2v_key key; + const char *lp; + + if(!count) return NULL; + + /* Guaranteed: assert(lstart < lstop); */ + /* Figure out the tag name */ + for(lstart++, lp = lstart; lp < lstop; lp++) { + switch(*lp) { + case 9: case 10: case 11: case 12: case 13: case 32: /* WSP */ + case 0x2f: /* '/' */ case 0x3e: /* '>' */ + break; + default: + continue; + } + break; + } + if(lp == lstop) return NULL; /* No tag found */ + lstop = lp; + + key.start = lstart; + key.stop = lstop; + key.vemap = specs->value2enum; + key.evmap = specs->enum2value; + el_found = (asn_INTEGER_enum_map_t *)bsearch(&key, + specs->value2enum, count, sizeof(specs->value2enum[0]), + INTEGER__compar_enum2value); + if(el_found) { + /* Remap enum2value into value2enum */ + el_found = key.vemap + key.evmap[el_found - key.vemap]; + } + return el_found; +} + +static int +INTEGER__compar_value2enum(const void *kp, const void *am) { + long a = *(const long *)kp; + const asn_INTEGER_enum_map_t *el = (const asn_INTEGER_enum_map_t *)am; + long b = el->nat_value; + if(a < b) return -1; + else if(a == b) return 0; + else return 1; +} + +const asn_INTEGER_enum_map_t * +INTEGER_map_value2enum(asn_INTEGER_specifics_t *specs, long value) { + int count = specs ? specs->map_count : 0; + if(!count) return 0; + return (asn_INTEGER_enum_map_t *)bsearch(&value, specs->value2enum, + count, sizeof(specs->value2enum[0]), + INTEGER__compar_value2enum); +} + +static int +INTEGER_st_prealloc(INTEGER_t *st, int min_size) { + void *p = MALLOC(min_size + 1); + if(p) { + void *b = st->buf; + st->size = 0; + st->buf = p; + FREEMEM(b); + return 0; + } else { + return -1; + } +} + +/* + * Decode the chunk of XML text encoding INTEGER. + */ +static enum xer_pbd_rval +INTEGER__xer_body_decode(asn_TYPE_descriptor_t *td, void *sptr, const void *chunk_buf, size_t chunk_size) { + INTEGER_t *st = (INTEGER_t *)sptr; + long dec_value; + long hex_value = 0; + const char *lp; + const char *lstart = (const char *)chunk_buf; + const char *lstop = lstart + chunk_size; + enum { + ST_LEADSPACE, + ST_SKIPSPHEX, + ST_WAITDIGITS, + ST_DIGITS, + ST_DIGITS_TRAILSPACE, + ST_HEXDIGIT1, + ST_HEXDIGIT2, + ST_HEXDIGITS_TRAILSPACE, + ST_HEXCOLON, + ST_END_ENUM, + ST_UNEXPECTED + } state = ST_LEADSPACE; + const char *dec_value_start = 0; /* INVARIANT: always !0 in ST_DIGITS */ + const char *dec_value_end = 0; + + if(chunk_size) + ASN_DEBUG("INTEGER body %ld 0x%2x..0x%2x", + (long)chunk_size, *lstart, lstop[-1]); + + if(INTEGER_st_prealloc(st, (chunk_size/3) + 1)) + return XPBD_SYSTEM_FAILURE; + + /* + * We may have received a tag here. It will be processed inline. + * Use strtoul()-like code and serialize the result. + */ + for(lp = lstart; lp < lstop; lp++) { + int lv = *lp; + switch(lv) { + case 0x09: case 0x0a: case 0x0d: case 0x20: + switch(state) { + case ST_LEADSPACE: + case ST_DIGITS_TRAILSPACE: + case ST_HEXDIGITS_TRAILSPACE: + case ST_SKIPSPHEX: + continue; + case ST_DIGITS: + dec_value_end = lp; + state = ST_DIGITS_TRAILSPACE; + continue; + case ST_HEXCOLON: + state = ST_HEXDIGITS_TRAILSPACE; + continue; + default: + break; + } + break; + case 0x2d: /* '-' */ + if(state == ST_LEADSPACE) { + dec_value = 0; + dec_value_start = lp; + state = ST_WAITDIGITS; + continue; + } + break; + case 0x2b: /* '+' */ + if(state == ST_LEADSPACE) { + dec_value = 0; + dec_value_start = lp; + state = ST_WAITDIGITS; + continue; + } + break; + case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: + case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: + switch(state) { + case ST_DIGITS: continue; + case ST_SKIPSPHEX: /* Fall through */ + case ST_HEXDIGIT1: + hex_value = (lv - 0x30) << 4; + state = ST_HEXDIGIT2; + continue; + case ST_HEXDIGIT2: + hex_value += (lv - 0x30); + state = ST_HEXCOLON; + st->buf[st->size++] = (uint8_t)hex_value; + continue; + case ST_HEXCOLON: + return XPBD_BROKEN_ENCODING; + case ST_LEADSPACE: + dec_value = 0; + dec_value_start = lp; + /* FALL THROUGH */ + case ST_WAITDIGITS: + state = ST_DIGITS; + continue; + default: + break; + } + break; + case 0x3c: /* '<', start of XML encoded enumeration */ + if(state == ST_LEADSPACE) { + const asn_INTEGER_enum_map_t *el; + el = INTEGER_map_enum2value( + (asn_INTEGER_specifics_t *) + td->specifics, lstart, lstop); + if(el) { + ASN_DEBUG("Found \"%s\" => %ld", + el->enum_name, el->nat_value); + dec_value = el->nat_value; + state = ST_END_ENUM; + lp = lstop - 1; + continue; + } + ASN_DEBUG("Unknown identifier for INTEGER"); + } + return XPBD_BROKEN_ENCODING; + case 0x3a: /* ':' */ + if(state == ST_HEXCOLON) { + /* This colon is expected */ + state = ST_HEXDIGIT1; + continue; + } else if(state == ST_DIGITS) { + /* The colon here means that we have + * decoded the first two hexadecimal + * places as a decimal value. + * Switch decoding mode. */ + ASN_DEBUG("INTEGER re-evaluate as hex form"); + state = ST_SKIPSPHEX; + dec_value_start = 0; + lp = lstart - 1; + continue; + } else { + ASN_DEBUG("state %d at %ld", state, (long)(lp - lstart)); + break; + } + /* [A-Fa-f] */ + case 0x41:case 0x42:case 0x43:case 0x44:case 0x45:case 0x46: + case 0x61:case 0x62:case 0x63:case 0x64:case 0x65:case 0x66: + switch(state) { + case ST_SKIPSPHEX: + case ST_LEADSPACE: /* Fall through */ + case ST_HEXDIGIT1: + hex_value = lv - ((lv < 0x61) ? 0x41 : 0x61); + hex_value += 10; + hex_value <<= 4; + state = ST_HEXDIGIT2; + continue; + case ST_HEXDIGIT2: + hex_value += lv - ((lv < 0x61) ? 0x41 : 0x61); + hex_value += 10; + st->buf[st->size++] = (uint8_t)hex_value; + state = ST_HEXCOLON; + continue; + case ST_DIGITS: + ASN_DEBUG("INTEGER re-evaluate as hex form"); + state = ST_SKIPSPHEX; + dec_value_start = 0; + lp = lstart - 1; + continue; + default: + break; + } + break; + } + + /* Found extra non-numeric stuff */ + ASN_DEBUG("INTEGER :: Found non-numeric 0x%2x at %ld", + lv, (long)(lp - lstart)); + state = ST_UNEXPECTED; + break; + } + + switch(state) { + case ST_END_ENUM: + /* Got a complete and valid enumeration encoded as a tag. */ + break; + case ST_DIGITS: + dec_value_end = lstop; + /* FALL THROUGH */ + case ST_DIGITS_TRAILSPACE: + /* The last symbol encountered was a digit. */ + switch(asn_strtol_lim(dec_value_start, &dec_value_end, &dec_value)) { + case ASN_STRTOL_OK: + break; + case ASN_STRTOL_ERROR_RANGE: + return XPBD_DECODER_LIMIT; + case ASN_STRTOL_ERROR_INVAL: + case ASN_STRTOL_EXPECT_MORE: + case ASN_STRTOL_EXTRA_DATA: + return XPBD_BROKEN_ENCODING; + } + break; + case ST_HEXCOLON: + case ST_HEXDIGITS_TRAILSPACE: + st->buf[st->size] = 0; /* Just in case termination */ + return XPBD_BODY_CONSUMED; + case ST_HEXDIGIT1: + case ST_HEXDIGIT2: + case ST_SKIPSPHEX: + return XPBD_BROKEN_ENCODING; + case ST_LEADSPACE: + /* Content not found */ + return XPBD_NOT_BODY_IGNORE; + case ST_WAITDIGITS: + case ST_UNEXPECTED: + ASN_DEBUG("INTEGER: No useful digits (state %d)", state); + return XPBD_BROKEN_ENCODING; /* No digits */ + } + + /* + * Convert the result of parsing of enumeration or a straight + * decimal value into a BER representation. + */ + if(asn_long2INTEGER(st, dec_value)) + return XPBD_SYSTEM_FAILURE; + + return XPBD_BODY_CONSUMED; +} + +asn_dec_rval_t +INTEGER_decode_xer(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, void **sptr, const char *opt_mname, + const void *buf_ptr, size_t size) { + + return xer_decode_primitive(opt_codec_ctx, td, + sptr, sizeof(INTEGER_t), opt_mname, + buf_ptr, size, INTEGER__xer_body_decode); +} + +asn_enc_rval_t +INTEGER_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + const INTEGER_t *st = (const INTEGER_t *)sptr; + asn_enc_rval_t er; + + (void)ilevel; + (void)flags; + + if(!st || !st->buf) + ASN__ENCODE_FAILED; + + er.encoded = INTEGER__dump(td, st, cb, app_key, 1); + if(er.encoded < 0) ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(er); +} + +#ifndef ASN_DISABLE_PER_SUPPORT + +asn_dec_rval_t +INTEGER_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; + asn_dec_rval_t rval = { RC_OK, 0 }; + INTEGER_t *st = (INTEGER_t *)*sptr; + asn_per_constraint_t *ct; + int repeat; + + (void)opt_codec_ctx; + + if(!st) { + st = (INTEGER_t *)(*sptr = CALLOC(1, sizeof(*st))); + if(!st) ASN__DECODE_FAILED; + } + + if(!constraints) constraints = td->per_constraints; + ct = constraints ? &constraints->value : 0; + + if(ct && ct->flags & APC_EXTENSIBLE) { + int inext = per_get_few_bits(pd, 1); + if(inext < 0) ASN__DECODE_STARVED; + if(inext) ct = 0; + } + + FREEMEM(st->buf); + st->buf = 0; + st->size = 0; + if(ct) { + if(ct->flags & APC_SEMI_CONSTRAINED) { + st->buf = (uint8_t *)CALLOC(1, 2); + if(!st->buf) ASN__DECODE_FAILED; + st->size = 1; + } else if(ct->flags & APC_CONSTRAINED && ct->range_bits >= 0) { + size_t size = (ct->range_bits + 7) >> 3; + st->buf = (uint8_t *)MALLOC(1 + size + 1); + if(!st->buf) ASN__DECODE_FAILED; + st->size = size; + } + } + + /* X.691-2008/11, #13.2.2, constrained whole number */ + if(ct && ct->flags != APC_UNCONSTRAINED) { + /* #11.5.6 */ + ASN_DEBUG("Integer with range %d bits", ct->range_bits); + if(ct->range_bits >= 0) { + if((size_t)ct->range_bits > 8 * sizeof(unsigned long)) + ASN__DECODE_FAILED; + + if(specs && specs->field_unsigned) { + unsigned long uvalue; + if(uper_get_constrained_whole_number(pd, + &uvalue, ct->range_bits)) + ASN__DECODE_STARVED; + ASN_DEBUG("Got value %lu + low %ld", + uvalue, ct->lower_bound); + uvalue += ct->lower_bound; + if(asn_ulong2INTEGER(st, uvalue)) + ASN__DECODE_FAILED; + } else { + unsigned long svalue; + if(uper_get_constrained_whole_number(pd, + &svalue, ct->range_bits)) + ASN__DECODE_STARVED; + ASN_DEBUG("Got value %ld + low %ld", + svalue, ct->lower_bound); + svalue += ct->lower_bound; + if(asn_long2INTEGER(st, svalue)) + ASN__DECODE_FAILED; + } + return rval; + } + } else { + ASN_DEBUG("Decoding unconstrained integer %s", td->name); + } + + /* X.691, #12.2.3, #12.2.4 */ + do { + ssize_t len; + void *p; + int ret; + + /* Get the PER length */ + len = uper_get_length(pd, -1, &repeat); + if(len < 0) ASN__DECODE_STARVED; + + p = REALLOC(st->buf, st->size + len + 1); + if(!p) ASN__DECODE_FAILED; + st->buf = (uint8_t *)p; + + ret = per_get_many_bits(pd, &st->buf[st->size], 0, 8 * len); + if(ret < 0) ASN__DECODE_STARVED; + st->size += len; + } while(repeat); + st->buf[st->size] = 0; /* JIC */ + + /* #12.2.3 */ + if(ct && ct->lower_bound) { + /* + * TODO: replace by in-place arithmetics. + */ + long value; + if(asn_INTEGER2long(st, &value)) + ASN__DECODE_FAILED; + if(asn_long2INTEGER(st, value + ct->lower_bound)) + ASN__DECODE_FAILED; + } + + return rval; +} + +asn_enc_rval_t +INTEGER_encode_uper(asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { + asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; + asn_enc_rval_t er; + INTEGER_t *st = (INTEGER_t *)sptr; + const uint8_t *buf; + const uint8_t *end; + asn_per_constraint_t *ct; + long value = 0; + unsigned long v = 0; + + if(!st || st->size == 0) ASN__ENCODE_FAILED; + + if(!constraints) constraints = td->per_constraints; + ct = constraints ? &constraints->value : 0; + + er.encoded = 0; + + if(ct) { + int inext = 0; + if(specs && specs->field_unsigned) { + unsigned long uval; + if(asn_INTEGER2ulong(st, &uval)) + ASN__ENCODE_FAILED; + /* Check proper range */ + if(ct->flags & APC_SEMI_CONSTRAINED) { + if(uval < (unsigned long)ct->lower_bound) + inext = 1; + } else if(ct->range_bits >= 0) { + if(uval < (unsigned long)ct->lower_bound + || uval > (unsigned long)ct->upper_bound) + inext = 1; + } + ASN_DEBUG("Value %lu (%02x/%d) lb %lu ub %lu %s", + uval, st->buf[0], st->size, + ct->lower_bound, ct->upper_bound, + inext ? "ext" : "fix"); + value = uval; + } else { + if(asn_INTEGER2long(st, &value)) + ASN__ENCODE_FAILED; + /* Check proper range */ + if(ct->flags & APC_SEMI_CONSTRAINED) { + if(value < ct->lower_bound) + inext = 1; + } else if(ct->range_bits >= 0) { + if(value < ct->lower_bound + || value > ct->upper_bound) + inext = 1; + } + ASN_DEBUG("Value %ld (%02x/%d) lb %ld ub %ld %s", + value, st->buf[0], st->size, + ct->lower_bound, ct->upper_bound, + inext ? "ext" : "fix"); + } + if(ct->flags & APC_EXTENSIBLE) { + if(per_put_few_bits(po, inext, 1)) + ASN__ENCODE_FAILED; + if(inext) ct = 0; + } else if(inext) { + ASN__ENCODE_FAILED; + } + } + + + /* X.691-11/2008, #13.2.2, test if constrained whole number */ + if(ct && ct->range_bits >= 0) { + /* #11.5.6 -> #11.3 */ + ASN_DEBUG("Encoding integer %ld (%lu) with range %d bits", + value, value - ct->lower_bound, ct->range_bits); + v = value - ct->lower_bound; + if(uper_put_constrained_whole_number_u(po, v, ct->range_bits)) + ASN__ENCODE_FAILED; + ASN__ENCODED_OK(er); + } + + if(ct && ct->lower_bound) { + ASN_DEBUG("Adjust lower bound to %ld", ct->lower_bound); + /* TODO: adjust lower bound */ + ASN__ENCODE_FAILED; + } + + for(buf = st->buf, end = st->buf + st->size; buf < end;) { + ssize_t mayEncode = uper_put_length(po, end - buf); + if(mayEncode < 0) + ASN__ENCODE_FAILED; + if(per_put_many_bits(po, buf, 8 * mayEncode)) + ASN__ENCODE_FAILED; + buf += mayEncode; + } + + ASN__ENCODED_OK(er); +} + +#endif /* ASN_DISABLE_PER_SUPPORT */ + +int +asn_INTEGER2long(const INTEGER_t *iptr, long *lptr) { + uint8_t *b, *end; + size_t size; + long l; + + /* Sanity checking */ + if(!iptr || !iptr->buf || !lptr) { + errno = EINVAL; + return -1; + } + + /* Cache the begin/end of the buffer */ + b = iptr->buf; /* Start of the INTEGER buffer */ + size = iptr->size; + end = b + size; /* Where to stop */ + + if(size > sizeof(long)) { + uint8_t *end1 = end - 1; + /* + * Slightly more advanced processing, + * able to >sizeof(long) bytes, + * when the actual value is small + * (0x0000000000abcdef would yield a fine 0x00abcdef) + */ + /* Skip out the insignificant leading bytes */ + for(; b < end1; b++) { + switch(*b) { + case 0x00: if((b[1] & 0x80) == 0) continue; break; + case 0xff: if((b[1] & 0x80) != 0) continue; break; + } + break; + } + + size = end - b; + if(size > sizeof(long)) { + /* Still cannot fit the long */ + errno = ERANGE; + return -1; + } + } + + /* Shortcut processing of a corner case */ + if(end == b) { + *lptr = 0; + return 0; + } + + /* Perform the sign initialization */ + /* Actually l = -(*b >> 7); gains nothing, yet unreadable! */ + if((*b >> 7)) l = -1; else l = 0; + + /* Conversion engine */ + for(; b < end; b++) + l = (l << 8) | *b; + + *lptr = l; + return 0; +} + +int +asn_INTEGER2ulong(const INTEGER_t *iptr, unsigned long *lptr) { + uint8_t *b, *end; + unsigned long l; + size_t size; + + if(!iptr || !iptr->buf || !lptr) { + errno = EINVAL; + return -1; + } + + b = iptr->buf; + size = iptr->size; + end = b + size; + + /* If all extra leading bytes are zeroes, ignore them */ + for(; size > sizeof(unsigned long); b++, size--) { + if(*b) { + /* Value won't fit unsigned long */ + errno = ERANGE; + return -1; + } + } + + /* Conversion engine */ + for(l = 0; b < end; b++) + l = (l << 8) | *b; + + *lptr = l; + return 0; +} + +int +asn_ulong2INTEGER(INTEGER_t *st, unsigned long value) { + uint8_t *buf; + uint8_t *end; + uint8_t *b; + int shr; + + if(value <= LONG_MAX) + return asn_long2INTEGER(st, value); + + buf = (uint8_t *)MALLOC(1 + sizeof(value)); + if(!buf) return -1; + + end = buf + (sizeof(value) + 1); + buf[0] = 0; + for(b = buf + 1, shr = (sizeof(long)-1)*8; b < end; shr -= 8, b++) + *b = (uint8_t)(value >> shr); + + if(st->buf) FREEMEM(st->buf); + st->buf = buf; + st->size = 1 + sizeof(value); + + return 0; +} + +int +asn_long2INTEGER(INTEGER_t *st, long value) { + uint8_t *buf, *bp; + uint8_t *p; + uint8_t *pstart; + uint8_t *pend1; + int littleEndian = 1; /* Run-time detection */ + int add; + + if(!st) { + errno = EINVAL; + return -1; + } + + buf = (uint8_t *)MALLOC(sizeof(value)); + if(!buf) return -1; + + if(*(char *)&littleEndian) { + pstart = (uint8_t *)&value + sizeof(value) - 1; + pend1 = (uint8_t *)&value; + add = -1; + } else { + pstart = (uint8_t *)&value; + pend1 = pstart + sizeof(value) - 1; + add = 1; + } + + /* + * If the contents octet consists of more than one octet, + * then bits of the first octet and bit 8 of the second octet: + * a) shall not all be ones; and + * b) shall not all be zero. + */ + for(p = pstart; p != pend1; p += add) { + switch(*p) { + case 0x00: if((*(p+add) & 0x80) == 0) + continue; + break; + case 0xff: if((*(p+add) & 0x80)) + continue; + break; + } + break; + } + /* Copy the integer body */ + for(pstart = p, bp = buf, pend1 += add; p != pend1; p += add) + *bp++ = *p; + + if(st->buf) FREEMEM(st->buf); + st->buf = buf; + st->size = bp - buf; + + return 0; +} + +/* + * This function is going to be DEPRECATED soon. + */ +enum asn_strtol_result_e +asn_strtol(const char *str, const char *end, long *lp) { + const char *endp = end; + + switch(asn_strtol_lim(str, &endp, lp)) { + case ASN_STRTOL_ERROR_RANGE: + return ASN_STRTOL_ERROR_RANGE; + case ASN_STRTOL_ERROR_INVAL: + return ASN_STRTOL_ERROR_INVAL; + case ASN_STRTOL_EXPECT_MORE: + return ASN_STRTOL_ERROR_INVAL; /* Retain old behavior */ + case ASN_STRTOL_OK: + return ASN_STRTOL_OK; + case ASN_STRTOL_EXTRA_DATA: + return ASN_STRTOL_ERROR_INVAL; /* Retain old behavior */ + } + + return ASN_STRTOL_ERROR_INVAL; /* Retain old behavior */ +} + +/* + * Parse the number in the given string until the given *end position, + * returning the position after the last parsed character back using the + * same (*end) pointer. + * WARNING: This behavior is different from the standard strtol(3). + */ +enum asn_strtol_result_e +asn_strtol_lim(const char *str, const char **end, long *lp) { + int sign = 1; + long l; + + const long upper_boundary = LONG_MAX / 10; + long last_digit_max = LONG_MAX % 10; + + if(str >= *end) return ASN_STRTOL_ERROR_INVAL; + + switch(*str) { + case '-': + last_digit_max++; + sign = -1; + /* FALL THROUGH */ + case '+': + str++; + if(str >= *end) { + *end = str; + return ASN_STRTOL_EXPECT_MORE; + } + } + + for(l = 0; str < (*end); str++) { + switch(*str) { + case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: + case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: { + int d = *str - '0'; + if(l < upper_boundary) { + l = l * 10 + d; + } else if(l == upper_boundary) { + if(d <= last_digit_max) { + if(sign > 0) { + l = l * 10 + d; + } else { + sign = 1; + l = -l * 10 - d; + } + } else { + *end = str; + return ASN_STRTOL_ERROR_RANGE; + } + } else { + *end = str; + return ASN_STRTOL_ERROR_RANGE; + } + } + continue; + default: + *end = str; + *lp = sign * l; + return ASN_STRTOL_EXTRA_DATA; + } + } + + *end = str; + *lp = sign * l; + return ASN_STRTOL_OK; +} + diff --git a/src/cryptoconditions/src/asn/INTEGER.h b/src/cryptoconditions/src/asn/INTEGER.h new file mode 100644 index 00000000000..9a880970757 --- /dev/null +++ b/src/cryptoconditions/src/asn/INTEGER.h @@ -0,0 +1,82 @@ +/*- + * Copyright (c) 2003, 2005 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _INTEGER_H_ +#define _INTEGER_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef ASN__PRIMITIVE_TYPE_t INTEGER_t; + +extern asn_TYPE_descriptor_t asn_DEF_INTEGER; + +/* Map with to integer value association */ +typedef struct asn_INTEGER_enum_map_s { + long nat_value; /* associated native integer value */ + size_t enum_len; /* strlen("tag") */ + const char *enum_name; /* "tag" */ +} asn_INTEGER_enum_map_t; + +/* This type describes an enumeration for INTEGER and ENUMERATED types */ +typedef const struct asn_INTEGER_specifics_s { + const asn_INTEGER_enum_map_t *value2enum; /* N -> "tag"; sorted by N */ + const unsigned int *enum2value; /* "tag" => N; sorted by tag */ + int map_count; /* Elements in either map */ + int extension; /* This map is extensible */ + int strict_enumeration; /* Enumeration set is fixed */ + int field_width; /* Size of native integer */ + int field_unsigned; /* Signed=0, unsigned=1 */ +} asn_INTEGER_specifics_t; + +asn_struct_print_f INTEGER_print; +ber_type_decoder_f INTEGER_decode_ber; +der_type_encoder_f INTEGER_encode_der; +xer_type_decoder_f INTEGER_decode_xer; +xer_type_encoder_f INTEGER_encode_xer; +per_type_decoder_f INTEGER_decode_uper; +per_type_encoder_f INTEGER_encode_uper; + +/*********************************** + * Some handy conversion routines. * + ***********************************/ + +/* + * Returns 0 if it was possible to convert, -1 otherwise. + * -1/EINVAL: Mandatory argument missing + * -1/ERANGE: Value encoded is out of range for long representation + * -1/ENOMEM: Memory allocation failed (in asn_long2INTEGER()). + */ +int asn_INTEGER2long(const INTEGER_t *i, long *l); +int asn_INTEGER2ulong(const INTEGER_t *i, unsigned long *l); +int asn_long2INTEGER(INTEGER_t *i, long l); +int asn_ulong2INTEGER(INTEGER_t *i, unsigned long l); + +/* A a reified version of strtol(3) with nicer error reporting. */ +enum asn_strtol_result_e { + ASN_STRTOL_ERROR_RANGE = -3, /* Input outside of numeric range for long type */ + ASN_STRTOL_ERROR_INVAL = -2, /* Invalid data encountered (e.g., "+-") */ + ASN_STRTOL_EXPECT_MORE = -1, /* More data expected (e.g. "+") */ + ASN_STRTOL_OK = 0, /* Conversion succeded, number ends at (*end) */ + ASN_STRTOL_EXTRA_DATA = 1 /* Conversion succeded, but the string has extra stuff */ +}; +enum asn_strtol_result_e asn_strtol_lim(const char *str, const char **end, long *l); + +/* The asn_strtol is going to be DEPRECATED soon */ +enum asn_strtol_result_e asn_strtol(const char *str, const char *end, long *l); + +/* + * Convert the integer value into the corresponding enumeration map entry. + */ +const asn_INTEGER_enum_map_t *INTEGER_map_value2enum(asn_INTEGER_specifics_t *specs, long value); + +#ifdef __cplusplus +} +#endif + +#endif /* _INTEGER_H_ */ diff --git a/src/cryptoconditions/src/asn/Makefile.am.sample b/src/cryptoconditions/src/asn/Makefile.am.sample new file mode 100644 index 00000000000..0bf696a74e9 --- /dev/null +++ b/src/cryptoconditions/src/asn/Makefile.am.sample @@ -0,0 +1,122 @@ +ASN_MODULE_SOURCES= \ + Condition.c \ + SimpleSha256Condition.c \ + CompoundSha256Condition.c \ + ConditionTypes.c \ + Fulfillment.c \ + PreimageFulfillment.c \ + PrefixFulfillment.c \ + ThresholdFulfillment.c \ + RsaSha256Fulfillment.c \ + Ed25519Sha512Fulfillment.c \ + Secp256k1Fulfillment.c \ + EvalFulfillment.c \ + PrefixFingerprintContents.c \ + ThresholdFingerprintContents.c \ + RsaFingerprintContents.c \ + Ed25519FingerprintContents.c \ + Secp256k1FingerprintContents.c \ + EvalFingerprintContents.c + +ASN_MODULE_HEADERS= \ + Condition.h \ + SimpleSha256Condition.h \ + CompoundSha256Condition.h \ + ConditionTypes.h \ + Fulfillment.h \ + PreimageFulfillment.h \ + PrefixFulfillment.h \ + ThresholdFulfillment.h \ + RsaSha256Fulfillment.h \ + Ed25519Sha512Fulfillment.h \ + Secp256k1Fulfillment.h \ + EvalFulfillment.h \ + PrefixFingerprintContents.h \ + ThresholdFingerprintContents.h \ + RsaFingerprintContents.h \ + Ed25519FingerprintContents.h \ + Secp256k1FingerprintContents.h \ + EvalFingerprintContents.h + +ASN_MODULE_HEADERS+=INTEGER.h +ASN_MODULE_HEADERS+=NativeEnumerated.h +ASN_MODULE_SOURCES+=INTEGER.c +ASN_MODULE_SOURCES+=NativeEnumerated.c +ASN_MODULE_HEADERS+=NativeInteger.h +ASN_MODULE_SOURCES+=NativeInteger.c +ASN_MODULE_HEADERS+=asn_SET_OF.h +ASN_MODULE_SOURCES+=asn_SET_OF.c +ASN_MODULE_HEADERS+=constr_CHOICE.h +ASN_MODULE_SOURCES+=constr_CHOICE.c +ASN_MODULE_HEADERS+=constr_SEQUENCE.h +ASN_MODULE_SOURCES+=constr_SEQUENCE.c +ASN_MODULE_HEADERS+=constr_SET_OF.h +ASN_MODULE_SOURCES+=constr_SET_OF.c +ASN_MODULE_HEADERS+=asn_application.h +ASN_MODULE_HEADERS+=asn_system.h +ASN_MODULE_HEADERS+=asn_codecs.h +ASN_MODULE_HEADERS+=asn_internal.h +ASN_MODULE_HEADERS+=OCTET_STRING.h +ASN_MODULE_SOURCES+=OCTET_STRING.c +ASN_MODULE_HEADERS+=BIT_STRING.h +ASN_MODULE_SOURCES+=BIT_STRING.c +ASN_MODULE_SOURCES+=asn_codecs_prim.c +ASN_MODULE_HEADERS+=asn_codecs_prim.h +ASN_MODULE_HEADERS+=ber_tlv_length.h +ASN_MODULE_SOURCES+=ber_tlv_length.c +ASN_MODULE_HEADERS+=ber_tlv_tag.h +ASN_MODULE_SOURCES+=ber_tlv_tag.c +ASN_MODULE_HEADERS+=ber_decoder.h +ASN_MODULE_SOURCES+=ber_decoder.c +ASN_MODULE_HEADERS+=der_encoder.h +ASN_MODULE_SOURCES+=der_encoder.c +ASN_MODULE_HEADERS+=constr_TYPE.h +ASN_MODULE_SOURCES+=constr_TYPE.c +ASN_MODULE_HEADERS+=constraints.h +ASN_MODULE_SOURCES+=constraints.c +ASN_MODULE_HEADERS+=xer_support.h +ASN_MODULE_SOURCES+=xer_support.c +ASN_MODULE_HEADERS+=xer_decoder.h +ASN_MODULE_SOURCES+=xer_decoder.c +ASN_MODULE_HEADERS+=xer_encoder.h +ASN_MODULE_SOURCES+=xer_encoder.c +ASN_MODULE_HEADERS+=per_support.h +ASN_MODULE_SOURCES+=per_support.c +ASN_MODULE_HEADERS+=per_decoder.h +ASN_MODULE_SOURCES+=per_decoder.c +ASN_MODULE_HEADERS+=per_encoder.h +ASN_MODULE_SOURCES+=per_encoder.c +ASN_MODULE_HEADERS+=per_opentype.h +ASN_MODULE_SOURCES+=per_opentype.c +ASN_CONVERTER_SOURCES+=converter-sample.c + + +lib_LTLIBRARIES=libsomething.la +libsomething_la_SOURCES=$(ASN_MODULE_SOURCES) $(ASN_MODULE_HEADERS) + +# This file may be used as an input for make(3) +# Remove the lines below to convert it into a pure .am file +TARGET = progname +CFLAGS += -I. +OBJS=${ASN_MODULE_SOURCES:.c=.o} ${ASN_CONVERTER_SOURCES:.c=.o} + +all: $(TARGET) + +$(TARGET): ${OBJS} + $(CC) $(CFLAGS) -o $(TARGET) ${OBJS} $(LDFLAGS) $(LIBS) + +.SUFFIXES: +.SUFFIXES: .c .o + +.c.o: + $(CC) $(CFLAGS) -o $@ -c $< + +clean: + rm -f $(TARGET) + rm -f $(OBJS) + +regen: regenerate-from-asn1-source + +regenerate-from-asn1-source: + asn1c CryptoConditions.asn + diff --git a/src/cryptoconditions/src/asn/NativeEnumerated.c b/src/cryptoconditions/src/asn/NativeEnumerated.c new file mode 100644 index 00000000000..78366af3184 --- /dev/null +++ b/src/cryptoconditions/src/asn/NativeEnumerated.c @@ -0,0 +1,207 @@ +/*- + * Copyright (c) 2004, 2007 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * Read the NativeInteger.h for the explanation wrt. differences between + * INTEGER and NativeInteger. + * Basically, both are decoders and encoders of ASN.1 INTEGER type, but this + * implementation deals with the standard (machine-specific) representation + * of them instead of using the platform-independent buffer. + */ +#include +#include + +/* + * NativeEnumerated basic type description. + */ +static const ber_tlv_tag_t asn_DEF_NativeEnumerated_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_NativeEnumerated = { + "ENUMERATED", /* The ASN.1 type is still ENUMERATED */ + "ENUMERATED", + NativeInteger_free, + NativeInteger_print, + asn_generic_no_constraint, + NativeInteger_decode_ber, + NativeInteger_encode_der, + NativeInteger_decode_xer, + NativeEnumerated_encode_xer, + NativeEnumerated_decode_uper, + NativeEnumerated_encode_uper, + 0, /* Use generic outmost tag fetcher */ + asn_DEF_NativeEnumerated_tags, + sizeof(asn_DEF_NativeEnumerated_tags) / sizeof(asn_DEF_NativeEnumerated_tags[0]), + asn_DEF_NativeEnumerated_tags, /* Same as above */ + sizeof(asn_DEF_NativeEnumerated_tags) / sizeof(asn_DEF_NativeEnumerated_tags[0]), + 0, /* No PER visible constraints */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + +asn_enc_rval_t +NativeEnumerated_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; + asn_enc_rval_t er; + const long *native = (const long *)sptr; + const asn_INTEGER_enum_map_t *el; + + (void)ilevel; + (void)flags; + + if(!native) ASN__ENCODE_FAILED; + + el = INTEGER_map_value2enum(specs, *native); + if(el) { + size_t srcsize = el->enum_len + 5; + char *src = (char *)alloca(srcsize); + + er.encoded = snprintf(src, srcsize, "<%s/>", el->enum_name); + assert(er.encoded > 0 && (size_t)er.encoded < srcsize); + if(cb(src, er.encoded, app_key) < 0) ASN__ENCODE_FAILED; + ASN__ENCODED_OK(er); + } else { + ASN_DEBUG("ASN.1 forbids dealing with " + "unknown value of ENUMERATED type"); + ASN__ENCODE_FAILED; + } +} + +asn_dec_rval_t +NativeEnumerated_decode_uper(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, + void **sptr, asn_per_data_t *pd) { + asn_INTEGER_specifics_t *specs = (asn_INTEGER_specifics_t *)td->specifics; + asn_dec_rval_t rval = { RC_OK, 0 }; + long *native = (long *)*sptr; + asn_per_constraint_t *ct; + long value; + + (void)opt_codec_ctx; + + if(constraints) ct = &constraints->value; + else if(td->per_constraints) ct = &td->per_constraints->value; + else ASN__DECODE_FAILED; /* Mandatory! */ + if(!specs) ASN__DECODE_FAILED; + + if(!native) { + native = (long *)(*sptr = CALLOC(1, sizeof(*native))); + if(!native) ASN__DECODE_FAILED; + } + + ASN_DEBUG("Decoding %s as NativeEnumerated", td->name); + + if(ct->flags & APC_EXTENSIBLE) { + int inext = per_get_few_bits(pd, 1); + if(inext < 0) ASN__DECODE_STARVED; + if(inext) ct = 0; + } + + if(ct && ct->range_bits >= 0) { + value = per_get_few_bits(pd, ct->range_bits); + if(value < 0) ASN__DECODE_STARVED; + if(value >= (specs->extension + ? specs->extension - 1 : specs->map_count)) + ASN__DECODE_FAILED; + } else { + if(!specs->extension) + ASN__DECODE_FAILED; + /* + * X.691, #10.6: normally small non-negative whole number; + */ + value = uper_get_nsnnwn(pd); + if(value < 0) ASN__DECODE_STARVED; + value += specs->extension - 1; + if(value >= specs->map_count) + ASN__DECODE_FAILED; + } + + *native = specs->value2enum[value].nat_value; + ASN_DEBUG("Decoded %s = %ld", td->name, *native); + + return rval; +} + +static int +NativeEnumerated__compar_value2enum(const void *ap, const void *bp) { + const asn_INTEGER_enum_map_t *a = ap; + const asn_INTEGER_enum_map_t *b = bp; + if(a->nat_value == b->nat_value) + return 0; + if(a->nat_value < b->nat_value) + return -1; + return 1; +} + +asn_enc_rval_t +NativeEnumerated_encode_uper(asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { + asn_INTEGER_specifics_t *specs = (asn_INTEGER_specifics_t *)td->specifics; + asn_enc_rval_t er; + long native, value; + asn_per_constraint_t *ct; + int inext = 0; + asn_INTEGER_enum_map_t key; + const asn_INTEGER_enum_map_t *kf; + + if(!sptr) ASN__ENCODE_FAILED; + if(!specs) ASN__ENCODE_FAILED; + + if(constraints) ct = &constraints->value; + else if(td->per_constraints) ct = &td->per_constraints->value; + else ASN__ENCODE_FAILED; /* Mandatory! */ + + ASN_DEBUG("Encoding %s as NativeEnumerated", td->name); + + er.encoded = 0; + + native = *(long *)sptr; + if(native < 0) ASN__ENCODE_FAILED; + + key.nat_value = native; + kf = bsearch(&key, specs->value2enum, specs->map_count, + sizeof(key), NativeEnumerated__compar_value2enum); + if(!kf) { + ASN_DEBUG("No element corresponds to %ld", native); + ASN__ENCODE_FAILED; + } + value = kf - specs->value2enum; + + if(ct->range_bits >= 0) { + int cmpWith = specs->extension + ? specs->extension - 1 : specs->map_count; + if(value >= cmpWith) + inext = 1; + } + if(ct->flags & APC_EXTENSIBLE) { + if(per_put_few_bits(po, inext, 1)) + ASN__ENCODE_FAILED; + if(inext) ct = 0; + } else if(inext) { + ASN__ENCODE_FAILED; + } + + if(ct && ct->range_bits >= 0) { + if(per_put_few_bits(po, value, ct->range_bits)) + ASN__ENCODE_FAILED; + ASN__ENCODED_OK(er); + } + + if(!specs->extension) + ASN__ENCODE_FAILED; + + /* + * X.691, #10.6: normally small non-negative whole number; + */ + ASN_DEBUG("value = %ld, ext = %d, inext = %d, res = %ld", + value, specs->extension, inext, + value - (inext ? (specs->extension - 1) : 0)); + if(uper_put_nsnnwn(po, value - (inext ? (specs->extension - 1) : 0))) + ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(er); +} + diff --git a/src/cryptoconditions/src/asn/NativeEnumerated.h b/src/cryptoconditions/src/asn/NativeEnumerated.h new file mode 100644 index 00000000000..c59bb1ba943 --- /dev/null +++ b/src/cryptoconditions/src/asn/NativeEnumerated.h @@ -0,0 +1,32 @@ +/*- + * Copyright (c) 2004, 2005, 2006 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * This type differs from the standard ENUMERATED in that it is modelled using + * the fixed machine type (long, int, short), so it can hold only values of + * limited length. There is no type (i.e., NativeEnumerated_t, any integer type + * will do). + * This type may be used when integer range is limited by subtype constraints. + */ +#ifndef _NativeEnumerated_H_ +#define _NativeEnumerated_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern asn_TYPE_descriptor_t asn_DEF_NativeEnumerated; + +xer_type_encoder_f NativeEnumerated_encode_xer; +per_type_decoder_f NativeEnumerated_decode_uper; +per_type_encoder_f NativeEnumerated_encode_uper; + +#ifdef __cplusplus +} +#endif + +#endif /* _NativeEnumerated_H_ */ diff --git a/src/cryptoconditions/src/asn/NativeInteger.c b/src/cryptoconditions/src/asn/NativeInteger.c new file mode 100644 index 00000000000..e8ce6d2c33c --- /dev/null +++ b/src/cryptoconditions/src/asn/NativeInteger.c @@ -0,0 +1,332 @@ +/*- + * Copyright (c) 2004, 2005, 2006 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * Read the NativeInteger.h for the explanation wrt. differences between + * INTEGER and NativeInteger. + * Basically, both are decoders and encoders of ASN.1 INTEGER type, but this + * implementation deals with the standard (machine-specific) representation + * of them instead of using the platform-independent buffer. + */ +#include +#include + +/* + * NativeInteger basic type description. + */ +static const ber_tlv_tag_t asn_DEF_NativeInteger_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +asn_TYPE_descriptor_t asn_DEF_NativeInteger = { + "INTEGER", /* The ASN.1 type is still INTEGER */ + "INTEGER", + NativeInteger_free, + NativeInteger_print, + asn_generic_no_constraint, + NativeInteger_decode_ber, + NativeInteger_encode_der, + NativeInteger_decode_xer, + NativeInteger_encode_xer, + NativeInteger_decode_uper, /* Unaligned PER decoder */ + NativeInteger_encode_uper, /* Unaligned PER encoder */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_NativeInteger_tags, + sizeof(asn_DEF_NativeInteger_tags) / sizeof(asn_DEF_NativeInteger_tags[0]), + asn_DEF_NativeInteger_tags, /* Same as above */ + sizeof(asn_DEF_NativeInteger_tags) / sizeof(asn_DEF_NativeInteger_tags[0]), + 0, /* No PER visible constraints */ + 0, 0, /* No members */ + 0 /* No specifics */ +}; + +/* + * Decode INTEGER type. + */ +asn_dec_rval_t +NativeInteger_decode_ber(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, + void **nint_ptr, const void *buf_ptr, size_t size, int tag_mode) { + asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; + long *native = (long *)*nint_ptr; + asn_dec_rval_t rval; + ber_tlv_len_t length; + + /* + * If the structure is not there, allocate it. + */ + if(native == NULL) { + native = (long *)(*nint_ptr = CALLOC(1, sizeof(*native))); + if(native == NULL) { + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + } + + ASN_DEBUG("Decoding %s as INTEGER (tm=%d)", + td->name, tag_mode); + + /* + * Check tags. + */ + rval = ber_check_tags(opt_codec_ctx, td, 0, buf_ptr, size, + tag_mode, 0, &length, 0); + if(rval.code != RC_OK) + return rval; + + ASN_DEBUG("%s length is %d bytes", td->name, (int)length); + + /* + * Make sure we have this length. + */ + buf_ptr = ((const char *)buf_ptr) + rval.consumed; + size -= rval.consumed; + if(length > (ber_tlv_len_t)size) { + rval.code = RC_WMORE; + rval.consumed = 0; + return rval; + } + + /* + * ASN.1 encoded INTEGER: buf_ptr, length + * Fill the native, at the same time checking for overflow. + * If overflow occured, return with RC_FAIL. + */ + { + INTEGER_t tmp; + union { + const void *constbuf; + void *nonconstbuf; + } unconst_buf; + long l; + + unconst_buf.constbuf = buf_ptr; + tmp.buf = (uint8_t *)unconst_buf.nonconstbuf; + tmp.size = length; + + if((specs&&specs->field_unsigned) + ? asn_INTEGER2ulong(&tmp, (unsigned long *)&l) /* sic */ + : asn_INTEGER2long(&tmp, &l)) { + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; + } + + *native = l; + } + + rval.code = RC_OK; + rval.consumed += length; + + ASN_DEBUG("Took %ld/%ld bytes to encode %s (%ld)", + (long)rval.consumed, (long)length, td->name, (long)*native); + + return rval; +} + +/* + * Encode the NativeInteger using the standard INTEGER type DER encoder. + */ +asn_enc_rval_t +NativeInteger_encode_der(asn_TYPE_descriptor_t *sd, void *ptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + unsigned long native = *(unsigned long *)ptr; /* Disable sign ext. */ + asn_enc_rval_t erval; + INTEGER_t tmp; + +#ifdef WORDS_BIGENDIAN /* Opportunistic optimization */ + + tmp.buf = (uint8_t *)&native; + tmp.size = sizeof(native); + +#else /* Works even if WORDS_BIGENDIAN is not set where should've been */ + uint8_t buf[sizeof(native)]; + uint8_t *p; + + /* Prepare a fake INTEGER */ + for(p = buf + sizeof(buf) - 1; p >= buf; p--, native >>= 8) + *p = (uint8_t)native; + + tmp.buf = buf; + tmp.size = sizeof(buf); +#endif /* WORDS_BIGENDIAN */ + + /* Encode fake INTEGER */ + erval = INTEGER_encode_der(sd, &tmp, tag_mode, tag, cb, app_key); + if(erval.encoded == -1) { + assert(erval.structure_ptr == &tmp); + erval.structure_ptr = ptr; + } + return erval; +} + +/* + * Decode the chunk of XML text encoding INTEGER. + */ +asn_dec_rval_t +NativeInteger_decode_xer(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, void **sptr, const char *opt_mname, + const void *buf_ptr, size_t size) { + asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; + asn_dec_rval_t rval; + INTEGER_t st; + void *st_ptr = (void *)&st; + long *native = (long *)*sptr; + + if(!native) { + native = (long *)(*sptr = CALLOC(1, sizeof(*native))); + if(!native) ASN__DECODE_FAILED; + } + + memset(&st, 0, sizeof(st)); + rval = INTEGER_decode_xer(opt_codec_ctx, td, &st_ptr, + opt_mname, buf_ptr, size); + if(rval.code == RC_OK) { + long l; + if((specs&&specs->field_unsigned) + ? asn_INTEGER2ulong(&st, (unsigned long *)&l) /* sic */ + : asn_INTEGER2long(&st, &l)) { + rval.code = RC_FAIL; + rval.consumed = 0; + } else { + *native = l; + } + } else { + /* + * Cannot restart from the middle; + * there is no place to save state in the native type. + * Request a continuation from the very beginning. + */ + rval.consumed = 0; + } + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &st); + return rval; +} + + +asn_enc_rval_t +NativeInteger_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; + char scratch[32]; /* Enough for 64-bit int */ + asn_enc_rval_t er; + const long *native = (const long *)sptr; + + (void)ilevel; + (void)flags; + + if(!native) ASN__ENCODE_FAILED; + + er.encoded = snprintf(scratch, sizeof(scratch), + (specs && specs->field_unsigned) + ? "%lu" : "%ld", *native); + if(er.encoded <= 0 || (size_t)er.encoded >= sizeof(scratch) + || cb(scratch, er.encoded, app_key) < 0) + ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(er); +} + +asn_dec_rval_t +NativeInteger_decode_uper(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + + asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; + asn_dec_rval_t rval; + long *native = (long *)*sptr; + INTEGER_t tmpint; + void *tmpintptr = &tmpint; + + (void)opt_codec_ctx; + ASN_DEBUG("Decoding NativeInteger %s (UPER)", td->name); + + if(!native) { + native = (long *)(*sptr = CALLOC(1, sizeof(*native))); + if(!native) ASN__DECODE_FAILED; + } + + memset(&tmpint, 0, sizeof tmpint); + rval = INTEGER_decode_uper(opt_codec_ctx, td, constraints, + &tmpintptr, pd); + if(rval.code == RC_OK) { + if((specs&&specs->field_unsigned) + ? asn_INTEGER2ulong(&tmpint, (unsigned long *)native) + : asn_INTEGER2long(&tmpint, native)) + rval.code = RC_FAIL; + else + ASN_DEBUG("NativeInteger %s got value %ld", + td->name, *native); + } + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); + + return rval; +} + +asn_enc_rval_t +NativeInteger_encode_uper(asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { + asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; + asn_enc_rval_t er; + long native; + INTEGER_t tmpint; + + if(!sptr) ASN__ENCODE_FAILED; + + native = *(long *)sptr; + + ASN_DEBUG("Encoding NativeInteger %s %ld (UPER)", td->name, native); + + memset(&tmpint, 0, sizeof(tmpint)); + if((specs&&specs->field_unsigned) + ? asn_ulong2INTEGER(&tmpint, native) + : asn_long2INTEGER(&tmpint, native)) + ASN__ENCODE_FAILED; + er = INTEGER_encode_uper(td, constraints, &tmpint, po); + ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_INTEGER, &tmpint); + return er; +} + +/* + * INTEGER specific human-readable output. + */ +int +NativeInteger_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_INTEGER_specifics_t *specs=(asn_INTEGER_specifics_t *)td->specifics; + const long *native = (const long *)sptr; + char scratch[32]; /* Enough for 64-bit int */ + int ret; + + (void)td; /* Unused argument */ + (void)ilevel; /* Unused argument */ + + if(native) { + ret = snprintf(scratch, sizeof(scratch), + (specs && specs->field_unsigned) + ? "%lu" : "%ld", *native); + assert(ret > 0 && (size_t)ret < sizeof(scratch)); + return (cb(scratch, ret, app_key) < 0) ? -1 : 0; + } else { + return (cb("", 8, app_key) < 0) ? -1 : 0; + } +} + +void +NativeInteger_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) { + + if(!td || !ptr) + return; + + ASN_DEBUG("Freeing %s as INTEGER (%d, %p, Native)", + td->name, contents_only, ptr); + + if(!contents_only) { + FREEMEM(ptr); + } +} + diff --git a/src/cryptoconditions/src/asn/NativeInteger.h b/src/cryptoconditions/src/asn/NativeInteger.h new file mode 100644 index 00000000000..4e63a8355d1 --- /dev/null +++ b/src/cryptoconditions/src/asn/NativeInteger.h @@ -0,0 +1,37 @@ +/*- + * Copyright (c) 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * This type differs from the standard INTEGER in that it is modelled using + * the fixed machine type (long, int, short), so it can hold only values of + * limited length. There is no type (i.e., NativeInteger_t, any integer type + * will do). + * This type may be used when integer range is limited by subtype constraints. + */ +#ifndef _NativeInteger_H_ +#define _NativeInteger_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern asn_TYPE_descriptor_t asn_DEF_NativeInteger; + +asn_struct_free_f NativeInteger_free; +asn_struct_print_f NativeInteger_print; +ber_type_decoder_f NativeInteger_decode_ber; +der_type_encoder_f NativeInteger_encode_der; +xer_type_decoder_f NativeInteger_decode_xer; +xer_type_encoder_f NativeInteger_encode_xer; +per_type_decoder_f NativeInteger_decode_uper; +per_type_encoder_f NativeInteger_encode_uper; + +#ifdef __cplusplus +} +#endif + +#endif /* _NativeInteger_H_ */ diff --git a/src/cryptoconditions/src/asn/OCTET_STRING.c b/src/cryptoconditions/src/asn/OCTET_STRING.c new file mode 100644 index 00000000000..5420dedecab --- /dev/null +++ b/src/cryptoconditions/src/asn/OCTET_STRING.c @@ -0,0 +1,1807 @@ +/*- + * Copyright (c) 2003, 2004, 2005, 2006 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include /* for .bits_unused member */ +#include + +/* + * OCTET STRING basic type description. + */ +static const ber_tlv_tag_t asn_DEF_OCTET_STRING_tags[] = { + (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) +}; +static const asn_OCTET_STRING_specifics_t asn_DEF_OCTET_STRING_specs = { + sizeof(OCTET_STRING_t), + offsetof(OCTET_STRING_t, _asn_ctx), + ASN_OSUBV_STR +}; +static const asn_per_constraints_t asn_DEF_OCTET_STRING_constraints = { + { APC_CONSTRAINED, 8, 8, 0, 255 }, + { APC_SEMI_CONSTRAINED, -1, -1, 0, 0 }, + 0, 0 +}; +asn_TYPE_descriptor_t asn_DEF_OCTET_STRING = { + "OCTET STRING", /* Canonical name */ + "OCTET_STRING", /* XML tag name */ + OCTET_STRING_free, + OCTET_STRING_print, /* non-ascii stuff, generally */ + asn_generic_no_constraint, + OCTET_STRING_decode_ber, + OCTET_STRING_encode_der, + OCTET_STRING_decode_xer_hex, + OCTET_STRING_encode_xer, + OCTET_STRING_decode_uper, /* Unaligned PER decoder */ + OCTET_STRING_encode_uper, /* Unaligned PER encoder */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_OCTET_STRING_tags, + sizeof(asn_DEF_OCTET_STRING_tags) + / sizeof(asn_DEF_OCTET_STRING_tags[0]), + asn_DEF_OCTET_STRING_tags, /* Same as above */ + sizeof(asn_DEF_OCTET_STRING_tags) + / sizeof(asn_DEF_OCTET_STRING_tags[0]), + 0, /* No PER visible constraints */ + 0, 0, /* No members */ + &asn_DEF_OCTET_STRING_specs +}; + +#undef _CH_PHASE +#undef NEXT_PHASE +#undef PREV_PHASE +#define _CH_PHASE(ctx, inc) do { \ + if(ctx->phase == 0) \ + ctx->context = 0; \ + ctx->phase += inc; \ + } while(0) +#define NEXT_PHASE(ctx) _CH_PHASE(ctx, +1) +#define PREV_PHASE(ctx) _CH_PHASE(ctx, -1) + +#undef ADVANCE +#define ADVANCE(num_bytes) do { \ + size_t num = (num_bytes); \ + buf_ptr = ((const char *)buf_ptr) + num; \ + size -= num; \ + consumed_myself += num; \ + } while(0) + +#undef RETURN +#define RETURN(_code) do { \ + asn_dec_rval_t tmprval; \ + tmprval.code = _code; \ + tmprval.consumed = consumed_myself; \ + return tmprval; \ + } while(0) + +#undef APPEND +#define APPEND(bufptr, bufsize) do { \ + size_t _bs = (bufsize); /* Append size */ \ + size_t _ns = ctx->context; /* Allocated now */ \ + size_t _es = st->size + _bs; /* Expected size */ \ + /* int is really a typeof(st->size): */ \ + if((int)_es < 0) RETURN(RC_FAIL); \ + if(_ns <= _es) { \ + void *ptr; \ + /* Be nice and round to the memory allocator */ \ + do { _ns = _ns ? _ns << 1 : 16; } \ + while(_ns <= _es); \ + /* int is really a typeof(st->size): */ \ + if((int)_ns < 0) RETURN(RC_FAIL); \ + ptr = REALLOC(st->buf, _ns); \ + if(ptr) { \ + st->buf = (uint8_t *)ptr; \ + ctx->context = _ns; \ + } else { \ + RETURN(RC_FAIL); \ + } \ + ASN_DEBUG("Reallocating into %ld", (long)_ns); \ + } \ + memcpy(st->buf + st->size, bufptr, _bs); \ + /* Convenient nul-termination */ \ + st->buf[_es] = '\0'; \ + st->size = _es; \ + } while(0) + +/* + * The main reason why ASN.1 is still alive is that too much time and effort + * is necessary for learning it more or less adequately, thus creating a gut + * necessity to demonstrate that aquired skill everywhere afterwards. + * No, I am not going to explain what the following stuff is. + */ +struct _stack_el { + ber_tlv_len_t left; /* What's left to read (or -1) */ + ber_tlv_len_t got; /* What was actually processed */ + int cont_level; /* Depth of subcontainment */ + int want_nulls; /* Want null "end of content" octets? */ + int bits_chopped; /* Flag in BIT STRING mode */ + ber_tlv_tag_t tag; /* For debugging purposes */ + struct _stack_el *prev; + struct _stack_el *next; +}; +struct _stack { + struct _stack_el *tail; + struct _stack_el *cur_ptr; +}; + +static struct _stack_el * +OS__add_stack_el(struct _stack *st) { + struct _stack_el *nel; + + /* + * Reuse the old stack frame or allocate a new one. + */ + if(st->cur_ptr && st->cur_ptr->next) { + nel = st->cur_ptr->next; + nel->bits_chopped = 0; + nel->got = 0; + /* Retain the nel->cont_level, it's correct. */ + } else { + nel = (struct _stack_el *)CALLOC(1, sizeof(struct _stack_el)); + if(nel == NULL) + return NULL; + + if(st->tail) { + /* Increase a subcontainment depth */ + nel->cont_level = st->tail->cont_level + 1; + st->tail->next = nel; + } + nel->prev = st->tail; + st->tail = nel; + } + + st->cur_ptr = nel; + + return nel; +} + +static struct _stack * +_new_stack() { + return (struct _stack *)CALLOC(1, sizeof(struct _stack)); +} + +/* + * Decode OCTET STRING type. + */ +asn_dec_rval_t +OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, + void **sptr, const void *buf_ptr, size_t size, int tag_mode) { + asn_OCTET_STRING_specifics_t *specs = td->specifics + ? (asn_OCTET_STRING_specifics_t *)td->specifics + : &asn_DEF_OCTET_STRING_specs; + BIT_STRING_t *st = (BIT_STRING_t *)*sptr; + asn_dec_rval_t rval; + asn_struct_ctx_t *ctx; + ssize_t consumed_myself = 0; + struct _stack *stck; /* Expectations stack structure */ + struct _stack_el *sel = 0; /* Stack element */ + int tlv_constr; + enum asn_OS_Subvariant type_variant = specs->subvariant; + + ASN_DEBUG("Decoding %s as %s (frame %ld)", + td->name, + (type_variant == ASN_OSUBV_STR) ? + "OCTET STRING" : "OS-SpecialCase", + (long)size); + + /* + * Create the string if does not exist. + */ + if(st == NULL) { + st = (BIT_STRING_t *)(*sptr = CALLOC(1, specs->struct_size)); + if(st == NULL) RETURN(RC_FAIL); + } + + /* Restore parsing context */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + switch(ctx->phase) { + case 0: + /* + * Check tags. + */ + rval = ber_check_tags(opt_codec_ctx, td, ctx, + buf_ptr, size, tag_mode, -1, + &ctx->left, &tlv_constr); + if(rval.code != RC_OK) + return rval; + + if(tlv_constr) { + /* + * Complex operation, requires stack of expectations. + */ + ctx->ptr = _new_stack(); + if(ctx->ptr) { + stck = (struct _stack *)ctx->ptr; + } else { + RETURN(RC_FAIL); + } + } else { + /* + * Jump into stackless primitive decoding. + */ + _CH_PHASE(ctx, 3); + if(type_variant == ASN_OSUBV_ANY && tag_mode != 1) + APPEND(buf_ptr, rval.consumed); + ADVANCE(rval.consumed); + goto phase3; + } + + NEXT_PHASE(ctx); + /* Fall through */ + case 1: + phase1: + /* + * Fill the stack with expectations. + */ + stck = (struct _stack *)ctx->ptr; + sel = stck->cur_ptr; + do { + ber_tlv_tag_t tlv_tag; + ber_tlv_len_t tlv_len; + ber_tlv_tag_t expected_tag; + ssize_t tl, ll, tlvl; + /* This one works even if (sel->left == -1) */ + ssize_t Left = ((!sel||(size_t)sel->left >= size) + ?(ssize_t)size:sel->left); + + + ASN_DEBUG("%p, s->l=%ld, s->wn=%ld, s->g=%ld\n", sel, + (long)(sel?sel->left:0), + (long)(sel?sel->want_nulls:0), + (long)(sel?sel->got:0) + ); + if(sel && sel->left <= 0 && sel->want_nulls == 0) { + if(sel->prev) { + struct _stack_el *prev = sel->prev; + if(prev->left != -1) { + if(prev->left < sel->got) + RETURN(RC_FAIL); + prev->left -= sel->got; + } + prev->got += sel->got; + sel = stck->cur_ptr = prev; + if(!sel) break; + tlv_constr = 1; + continue; + } else { + sel = stck->cur_ptr = 0; + break; /* Nothing to wait */ + } + } + + tl = ber_fetch_tag(buf_ptr, Left, &tlv_tag); + ASN_DEBUG("fetch tag(size=%ld,L=%ld), %sstack, left=%ld, wn=%ld, tl=%ld", + (long)size, (long)Left, sel?"":"!", + (long)(sel?sel->left:0), + (long)(sel?sel->want_nulls:0), + (long)tl); + switch(tl) { + case -1: RETURN(RC_FAIL); + case 0: RETURN(RC_WMORE); + } + + tlv_constr = BER_TLV_CONSTRUCTED(buf_ptr); + + ll = ber_fetch_length(tlv_constr, + (const char *)buf_ptr + tl,Left - tl,&tlv_len); + ASN_DEBUG("Got tag=%s, tc=%d, left=%ld, tl=%ld, len=%ld, ll=%ld", + ber_tlv_tag_string(tlv_tag), tlv_constr, + (long)Left, (long)tl, (long)tlv_len, (long)ll); + switch(ll) { + case -1: RETURN(RC_FAIL); + case 0: RETURN(RC_WMORE); + } + + if(sel && sel->want_nulls + && ((const uint8_t *)buf_ptr)[0] == 0 + && ((const uint8_t *)buf_ptr)[1] == 0) + { + + ASN_DEBUG("Eat EOC; wn=%d--", sel->want_nulls); + + if(type_variant == ASN_OSUBV_ANY + && (tag_mode != 1 || sel->cont_level)) + APPEND("\0\0", 2); + + ADVANCE(2); + sel->got += 2; + if(sel->left != -1) { + sel->left -= 2; /* assert(sel->left >= 2) */ + } + + sel->want_nulls--; + if(sel->want_nulls == 0) { + /* Move to the next expectation */ + sel->left = 0; + tlv_constr = 1; + } + + continue; + } + + /* + * Set up expected tags, + * depending on ASN.1 type being decoded. + */ + switch(type_variant) { + case ASN_OSUBV_BIT: + /* X.690: 8.6.4.1, NOTE 2 */ + /* Fall through */ + case ASN_OSUBV_STR: + default: + if(sel) { + int level = sel->cont_level; + if(level < td->all_tags_count) { + expected_tag = td->all_tags[level]; + break; + } else if(td->all_tags_count) { + expected_tag = td->all_tags + [td->all_tags_count - 1]; + break; + } + /* else, Fall through */ + } + /* Fall through */ + case ASN_OSUBV_ANY: + expected_tag = tlv_tag; + break; + } + + + if(tlv_tag != expected_tag) { + char buf[2][32]; + ber_tlv_tag_snprint(tlv_tag, + buf[0], sizeof(buf[0])); + ber_tlv_tag_snprint(td->tags[td->tags_count-1], + buf[1], sizeof(buf[1])); + ASN_DEBUG("Tag does not match expectation: %s != %s", + buf[0], buf[1]); + RETURN(RC_FAIL); + } + + tlvl = tl + ll; /* Combined length of T and L encoding */ + if((tlv_len + tlvl) < 0) { + /* tlv_len value is too big */ + ASN_DEBUG("TLV encoding + length (%ld) is too big", + (long)tlv_len); + RETURN(RC_FAIL); + } + + /* + * Append a new expectation. + */ + sel = OS__add_stack_el(stck); + if(!sel) RETURN(RC_FAIL); + + sel->tag = tlv_tag; + + sel->want_nulls = (tlv_len==-1); + if(sel->prev && sel->prev->left != -1) { + /* Check that the parent frame is big enough */ + if(sel->prev->left < tlvl + (tlv_len==-1?0:tlv_len)) + RETURN(RC_FAIL); + if(tlv_len == -1) + sel->left = sel->prev->left - tlvl; + else + sel->left = tlv_len; + } else { + sel->left = tlv_len; + } + if(type_variant == ASN_OSUBV_ANY + && (tag_mode != 1 || sel->cont_level)) + APPEND(buf_ptr, tlvl); + sel->got += tlvl; + ADVANCE(tlvl); + + ASN_DEBUG("+EXPECT2 got=%ld left=%ld, wn=%d, clvl=%d", + (long)sel->got, (long)sel->left, + sel->want_nulls, sel->cont_level); + + } while(tlv_constr); + if(sel == NULL) { + /* Finished operation, "phase out" */ + ASN_DEBUG("Phase out"); + _CH_PHASE(ctx, +3); + break; + } + + NEXT_PHASE(ctx); + /* Fall through */ + case 2: + stck = (struct _stack *)ctx->ptr; + sel = stck->cur_ptr; + ASN_DEBUG("Phase 2: Need %ld bytes, size=%ld, alrg=%ld, wn=%d", + (long)sel->left, (long)size, (long)sel->got, + sel->want_nulls); + { + ber_tlv_len_t len; + + assert(sel->left >= 0); + + len = ((ber_tlv_len_t)size < sel->left) + ? (ber_tlv_len_t)size : sel->left; + if(len > 0) { + if(type_variant == ASN_OSUBV_BIT + && sel->bits_chopped == 0) { + /* Put the unused-bits-octet away */ + st->bits_unused = *(const uint8_t *)buf_ptr; + APPEND(((const char *)buf_ptr+1), (len - 1)); + sel->bits_chopped = 1; + } else { + APPEND(buf_ptr, len); + } + ADVANCE(len); + sel->left -= len; + sel->got += len; + } + + if(sel->left) { + ASN_DEBUG("OS left %ld, size = %ld, wn=%d\n", + (long)sel->left, (long)size, sel->want_nulls); + RETURN(RC_WMORE); + } + + PREV_PHASE(ctx); + goto phase1; + } + break; + case 3: + phase3: + /* + * Primitive form, no stack required. + */ + assert(ctx->left >= 0); + + if(size < (size_t)ctx->left) { + if(!size) RETURN(RC_WMORE); + if(type_variant == ASN_OSUBV_BIT && !ctx->context) { + st->bits_unused = *(const uint8_t *)buf_ptr; + ctx->left--; + ADVANCE(1); + } + APPEND(buf_ptr, size); + assert(ctx->context > 0); + ctx->left -= size; + ADVANCE(size); + RETURN(RC_WMORE); + } else { + if(type_variant == ASN_OSUBV_BIT + && !ctx->context && ctx->left) { + st->bits_unused = *(const uint8_t *)buf_ptr; + ctx->left--; + ADVANCE(1); + } + APPEND(buf_ptr, ctx->left); + ADVANCE(ctx->left); + ctx->left = 0; + + NEXT_PHASE(ctx); + } + break; + } + + if(sel) { + ASN_DEBUG("3sel p=%p, wn=%d, l=%ld, g=%ld, size=%ld", + sel->prev, sel->want_nulls, + (long)sel->left, (long)sel->got, (long)size); + if(sel->prev || sel->want_nulls > 1 || sel->left > 0) { + RETURN(RC_WMORE); + } + } + + /* + * BIT STRING-specific processing. + */ + if(type_variant == ASN_OSUBV_BIT && st->size) { + /* Finalize BIT STRING: zero out unused bits. */ + st->buf[st->size-1] &= 0xff << st->bits_unused; + } + + ASN_DEBUG("Took %ld bytes to encode %s: [%s]:%ld", + (long)consumed_myself, td->name, + (type_variant == ASN_OSUBV_STR) ? (char *)st->buf : "", + (long)st->size); + + + RETURN(RC_OK); +} + +/* + * Encode OCTET STRING type using DER. + */ +asn_enc_rval_t +OCTET_STRING_encode_der(asn_TYPE_descriptor_t *td, void *sptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t er; + asn_OCTET_STRING_specifics_t *specs = td->specifics + ? (asn_OCTET_STRING_specifics_t *)td->specifics + : &asn_DEF_OCTET_STRING_specs; + BIT_STRING_t *st = (BIT_STRING_t *)sptr; + enum asn_OS_Subvariant type_variant = specs->subvariant; + int fix_last_byte = 0; + + ASN_DEBUG("%s %s as OCTET STRING", + cb?"Estimating":"Encoding", td->name); + + /* + * Write tags. + */ + if(type_variant != ASN_OSUBV_ANY || tag_mode == 1) { + er.encoded = der_write_tags(td, + (type_variant == ASN_OSUBV_BIT) + st->size, + tag_mode, type_variant == ASN_OSUBV_ANY, tag, + cb, app_key); + if(er.encoded == -1) { + er.failed_type = td; + er.structure_ptr = sptr; + return er; + } + } else { + /* Disallow: [] IMPLICIT ANY */ + assert(type_variant != ASN_OSUBV_ANY || tag_mode != -1); + er.encoded = 0; + } + + if(!cb) { + er.encoded += (type_variant == ASN_OSUBV_BIT) + st->size; + ASN__ENCODED_OK(er); + } + + /* + * Prepare to deal with the last octet of BIT STRING. + */ + if(type_variant == ASN_OSUBV_BIT) { + uint8_t b = st->bits_unused & 0x07; + if(b && st->size) fix_last_byte = 1; + ASN__CALLBACK(&b, 1); + er.encoded++; + } + + /* Invoke callback for the main part of the buffer */ + ASN__CALLBACK(st->buf, st->size - fix_last_byte); + + /* The last octet should be stripped off the unused bits */ + if(fix_last_byte) { + uint8_t b = st->buf[st->size-1] & (0xff << st->bits_unused); + ASN__CALLBACK(&b, 1); + } + + er.encoded += st->size; + ASN__ENCODED_OK(er); +cb_failed: + ASN__ENCODE_FAILED; +} + +asn_enc_rval_t +OCTET_STRING_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + const char * const h2c = "0123456789ABCDEF"; + const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; + asn_enc_rval_t er; + char scratch[16 * 3 + 4]; + char *p = scratch; + uint8_t *buf; + uint8_t *end; + size_t i; + + if(!st || (!st->buf && st->size)) + ASN__ENCODE_FAILED; + + er.encoded = 0; + + /* + * Dump the contents of the buffer in hexadecimal. + */ + buf = st->buf; + end = buf + st->size; + if(flags & XER_F_CANONICAL) { + char *scend = scratch + (sizeof(scratch) - 2); + for(; buf < end; buf++) { + if(p >= scend) { + ASN__CALLBACK(scratch, p - scratch); + er.encoded += p - scratch; + p = scratch; + } + *p++ = h2c[(*buf >> 4) & 0x0F]; + *p++ = h2c[*buf & 0x0F]; + } + + ASN__CALLBACK(scratch, p-scratch); /* Dump the rest */ + er.encoded += p - scratch; + } else { + for(i = 0; buf < end; buf++, i++) { + if(!(i % 16) && (i || st->size > 16)) { + ASN__CALLBACK(scratch, p-scratch); + er.encoded += (p-scratch); + p = scratch; + ASN__TEXT_INDENT(1, ilevel); + } + *p++ = h2c[(*buf >> 4) & 0x0F]; + *p++ = h2c[*buf & 0x0F]; + *p++ = 0x20; + } + if(p - scratch) { + p--; /* Remove the tail space */ + ASN__CALLBACK(scratch, p-scratch); /* Dump the rest */ + er.encoded += p - scratch; + if(st->size > 16) + ASN__TEXT_INDENT(1, ilevel-1); + } + } + + ASN__ENCODED_OK(er); +cb_failed: + ASN__ENCODE_FAILED; +} + +static const struct OCTET_STRING__xer_escape_table_s { + const char *string; + int size; +} OCTET_STRING__xer_escape_table[] = { +#define OSXET(s) { s, sizeof(s) - 1 } + OSXET("\074\156\165\154\057\076"), /* */ + OSXET("\074\163\157\150\057\076"), /* */ + OSXET("\074\163\164\170\057\076"), /* */ + OSXET("\074\145\164\170\057\076"), /* */ + OSXET("\074\145\157\164\057\076"), /* */ + OSXET("\074\145\156\161\057\076"), /* */ + OSXET("\074\141\143\153\057\076"), /* */ + OSXET("\074\142\145\154\057\076"), /* */ + OSXET("\074\142\163\057\076"), /* */ + OSXET("\011"), /* \t */ + OSXET("\012"), /* \n */ + OSXET("\074\166\164\057\076"), /* */ + OSXET("\074\146\146\057\076"), /* */ + OSXET("\015"), /* \r */ + OSXET("\074\163\157\057\076"), /* */ + OSXET("\074\163\151\057\076"), /* */ + OSXET("\074\144\154\145\057\076"), /* */ + OSXET("\074\144\143\061\057\076"), /* */ + OSXET("\074\144\143\062\057\076"), /* */ + OSXET("\074\144\143\063\057\076"), /* */ + OSXET("\074\144\143\064\057\076"), /* */ + OSXET("\074\156\141\153\057\076"), /* */ + OSXET("\074\163\171\156\057\076"), /* */ + OSXET("\074\145\164\142\057\076"), /* */ + OSXET("\074\143\141\156\057\076"), /* */ + OSXET("\074\145\155\057\076"), /* */ + OSXET("\074\163\165\142\057\076"), /* */ + OSXET("\074\145\163\143\057\076"), /* */ + OSXET("\074\151\163\064\057\076"), /* */ + OSXET("\074\151\163\063\057\076"), /* */ + OSXET("\074\151\163\062\057\076"), /* */ + OSXET("\074\151\163\061\057\076"), /* */ + { 0, 0 }, /* " " */ + { 0, 0 }, /* ! */ + { 0, 0 }, /* \" */ + { 0, 0 }, /* # */ + { 0, 0 }, /* $ */ + { 0, 0 }, /* % */ + OSXET("\046\141\155\160\073"), /* & */ + { 0, 0 }, /* ' */ + {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* ()*+,-./ */ + {0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, /* 01234567 */ + {0,0},{0,0},{0,0},{0,0}, /* 89:; */ + OSXET("\046\154\164\073"), /* < */ + { 0, 0 }, /* = */ + OSXET("\046\147\164\073"), /* > */ +}; + +static int +OS__check_escaped_control_char(const void *buf, int size) { + size_t i; + /* + * Inefficient algorithm which translates the escape sequences + * defined above into characters. Returns -1 if not found. + * TODO: replace by a faster algorithm (bsearch(), hash or + * nested table lookups). + */ + for(i = 0; i < 32 /* Don't spend time on the bottom half */; i++) { + const struct OCTET_STRING__xer_escape_table_s *el; + el = &OCTET_STRING__xer_escape_table[i]; + if(el->size == size && memcmp(buf, el->string, size) == 0) + return i; + } + return -1; +} + +static int +OCTET_STRING__handle_control_chars(void *struct_ptr, const void *chunk_buf, size_t chunk_size) { + /* + * This might be one of the escape sequences + * for control characters. Check it out. + * #11.15.5 + */ + int control_char = OS__check_escaped_control_char(chunk_buf,chunk_size); + if(control_char >= 0) { + OCTET_STRING_t *st = (OCTET_STRING_t *)struct_ptr; + void *p = REALLOC(st->buf, st->size + 2); + if(p) { + st->buf = (uint8_t *)p; + st->buf[st->size++] = control_char; + st->buf[st->size] = '\0'; /* nul-termination */ + return 0; + } + } + + return -1; /* No, it's not */ +} + +asn_enc_rval_t +OCTET_STRING_encode_xer_utf8(asn_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; + asn_enc_rval_t er; + uint8_t *buf, *end; + uint8_t *ss; /* Sequence start */ + ssize_t encoded_len = 0; + + (void)ilevel; /* Unused argument */ + (void)flags; /* Unused argument */ + + if(!st || (!st->buf && st->size)) + ASN__ENCODE_FAILED; + + buf = st->buf; + end = buf + st->size; + for(ss = buf; buf < end; buf++) { + unsigned int ch = *buf; + int s_len; /* Special encoding sequence length */ + + /* + * Escape certain characters: X.680/11.15 + */ + if(ch < sizeof(OCTET_STRING__xer_escape_table) + /sizeof(OCTET_STRING__xer_escape_table[0]) + && (s_len = OCTET_STRING__xer_escape_table[ch].size)) { + if(((buf - ss) && cb(ss, buf - ss, app_key) < 0) + || cb(OCTET_STRING__xer_escape_table[ch].string, s_len, + app_key) < 0) + ASN__ENCODE_FAILED; + encoded_len += (buf - ss) + s_len; + ss = buf + 1; + } + } + + encoded_len += (buf - ss); + if((buf - ss) && cb(ss, buf - ss, app_key) < 0) + ASN__ENCODE_FAILED; + + er.encoded = encoded_len; + ASN__ENCODED_OK(er); +} + +/* + * Convert from hexadecimal format (cstring): "AB CD EF" + */ +static ssize_t OCTET_STRING__convert_hexadecimal(void *sptr, const void *chunk_buf, size_t chunk_size, int have_more) { + OCTET_STRING_t *st = (OCTET_STRING_t *)sptr; + const char *chunk_stop = (const char *)chunk_buf; + const char *p = chunk_stop; + const char *pend = p + chunk_size; + unsigned int clv = 0; + int half = 0; /* Half bit */ + uint8_t *buf; + + /* Reallocate buffer according to high cap estimation */ + ssize_t _ns = st->size + (chunk_size + 1) / 2; + void *nptr = REALLOC(st->buf, _ns + 1); + if(!nptr) return -1; + st->buf = (uint8_t *)nptr; + buf = st->buf + st->size; + + /* + * If something like " a b c " appears here, the " a b":3 will be + * converted, and the rest skipped. That is, unless buf_size is greater + * than chunk_size, then it'll be equivalent to "ABC0". + */ + for(; p < pend; p++) { + int ch = *(const unsigned char *)p; + switch(ch) { + case 0x09: case 0x0a: case 0x0c: case 0x0d: + case 0x20: + /* Ignore whitespace */ + continue; + case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: /*01234*/ + case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: /*56789*/ + clv = (clv << 4) + (ch - 0x30); + break; + case 0x41: case 0x42: case 0x43: /* ABC */ + case 0x44: case 0x45: case 0x46: /* DEF */ + clv = (clv << 4) + (ch - 0x41 + 10); + break; + case 0x61: case 0x62: case 0x63: /* abc */ + case 0x64: case 0x65: case 0x66: /* def */ + clv = (clv << 4) + (ch - 0x61 + 10); + break; + default: + *buf = 0; /* JIC */ + return -1; + } + if(half++) { + half = 0; + *buf++ = clv; + chunk_stop = p + 1; + } + } + + /* + * Check partial decoding. + */ + if(half) { + if(have_more) { + /* + * Partial specification is fine, + * because no more more PXER_TEXT data is available. + */ + *buf++ = clv << 4; + chunk_stop = p; + } + } else { + chunk_stop = p; + } + + st->size = buf - st->buf; /* Adjust the buffer size */ + assert(st->size <= _ns); + st->buf[st->size] = 0; /* Courtesy termination */ + + return (chunk_stop - (const char *)chunk_buf); /* Converted size */ +} + +/* + * Convert from binary format: "00101011101" + */ +static ssize_t OCTET_STRING__convert_binary(void *sptr, const void *chunk_buf, size_t chunk_size, int have_more) { + BIT_STRING_t *st = (BIT_STRING_t *)sptr; + const char *p = (const char *)chunk_buf; + const char *pend = p + chunk_size; + int bits_unused = st->bits_unused & 0x7; + uint8_t *buf; + + /* Reallocate buffer according to high cap estimation */ + ssize_t _ns = st->size + (chunk_size + 7) / 8; + void *nptr = REALLOC(st->buf, _ns + 1); + if(!nptr) return -1; + st->buf = (uint8_t *)nptr; + buf = st->buf + st->size; + + (void)have_more; + + if(bits_unused == 0) + bits_unused = 8; + else if(st->size) + buf--; + + /* + * Convert series of 0 and 1 into the octet string. + */ + for(; p < pend; p++) { + int ch = *(const unsigned char *)p; + switch(ch) { + case 0x09: case 0x0a: case 0x0c: case 0x0d: + case 0x20: + /* Ignore whitespace */ + break; + case 0x30: + case 0x31: + if(bits_unused-- <= 0) { + *++buf = 0; /* Clean the cell */ + bits_unused = 7; + } + *buf |= (ch&1) << bits_unused; + break; + default: + st->bits_unused = bits_unused; + return -1; + } + } + + if(bits_unused == 8) { + st->size = buf - st->buf; + st->bits_unused = 0; + } else { + st->size = buf - st->buf + 1; + st->bits_unused = bits_unused; + } + + assert(st->size <= _ns); + st->buf[st->size] = 0; /* Courtesy termination */ + + return chunk_size; /* Converted in full */ +} + +/* + * Something like strtod(), but with stricter rules. + */ +static int +OS__strtoent(int base, const char *buf, const char *end, int32_t *ret_value) { + int32_t val = 0; + const char *p; + + for(p = buf; p < end; p++) { + int ch = *p; + + /* Strange huge value */ + if((val * base + base) < 0) + return -1; + + switch(ch) { + case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: /*01234*/ + case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: /*56789*/ + val = val * base + (ch - 0x30); + break; + case 0x41: case 0x42: case 0x43: /* ABC */ + case 0x44: case 0x45: case 0x46: /* DEF */ + val = val * base + (ch - 0x41 + 10); + break; + case 0x61: case 0x62: case 0x63: /* abc */ + case 0x64: case 0x65: case 0x66: /* def */ + val = val * base + (ch - 0x61 + 10); + break; + case 0x3b: /* ';' */ + *ret_value = val; + return (p - buf) + 1; + default: + return -1; /* Character set error */ + } + } + + *ret_value = -1; + return (p - buf); +} + +/* + * Convert from the plain UTF-8 format, expanding entity references: "2 < 3" + */ +static ssize_t OCTET_STRING__convert_entrefs(void *sptr, const void *chunk_buf, size_t chunk_size, int have_more) { + OCTET_STRING_t *st = (OCTET_STRING_t *)sptr; + const char *p = (const char *)chunk_buf; + const char *pend = p + chunk_size; + uint8_t *buf; + + /* Reallocate buffer */ + ssize_t _ns = st->size + chunk_size; + void *nptr = REALLOC(st->buf, _ns + 1); + if(!nptr) return -1; + st->buf = (uint8_t *)nptr; + buf = st->buf + st->size; + + /* + * Convert series of 0 and 1 into the octet string. + */ + for(; p < pend; p++) { + int ch = *(const unsigned char *)p; + int len; /* Length of the rest of the chunk */ + + if(ch != 0x26 /* '&' */) { + *buf++ = ch; + continue; /* That was easy... */ + } + + /* + * Process entity reference. + */ + len = chunk_size - (p - (const char *)chunk_buf); + if(len == 1 /* "&" */) goto want_more; + if(p[1] == 0x23 /* '#' */) { + const char *pval; /* Pointer to start of digits */ + int32_t val = 0; /* Entity reference value */ + int base; + + if(len == 2 /* "&#" */) goto want_more; + if(p[2] == 0x78 /* 'x' */) + pval = p + 3, base = 16; + else + pval = p + 2, base = 10; + len = OS__strtoent(base, pval, p + len, &val); + if(len == -1) { + /* Invalid charset. Just copy verbatim. */ + *buf++ = ch; + continue; + } + if(!len || pval[len-1] != 0x3b) goto want_more; + assert(val > 0); + p += (pval - p) + len - 1; /* Advance past entref */ + + if(val < 0x80) { + *buf++ = (char)val; + } else if(val < 0x800) { + *buf++ = 0xc0 | ((val >> 6)); + *buf++ = 0x80 | ((val & 0x3f)); + } else if(val < 0x10000) { + *buf++ = 0xe0 | ((val >> 12)); + *buf++ = 0x80 | ((val >> 6) & 0x3f); + *buf++ = 0x80 | ((val & 0x3f)); + } else if(val < 0x200000) { + *buf++ = 0xf0 | ((val >> 18)); + *buf++ = 0x80 | ((val >> 12) & 0x3f); + *buf++ = 0x80 | ((val >> 6) & 0x3f); + *buf++ = 0x80 | ((val & 0x3f)); + } else if(val < 0x4000000) { + *buf++ = 0xf8 | ((val >> 24)); + *buf++ = 0x80 | ((val >> 18) & 0x3f); + *buf++ = 0x80 | ((val >> 12) & 0x3f); + *buf++ = 0x80 | ((val >> 6) & 0x3f); + *buf++ = 0x80 | ((val & 0x3f)); + } else { + *buf++ = 0xfc | ((val >> 30) & 0x1); + *buf++ = 0x80 | ((val >> 24) & 0x3f); + *buf++ = 0x80 | ((val >> 18) & 0x3f); + *buf++ = 0x80 | ((val >> 12) & 0x3f); + *buf++ = 0x80 | ((val >> 6) & 0x3f); + *buf++ = 0x80 | ((val & 0x3f)); + } + } else { + /* + * Ugly, limited parsing of & > < + */ + char *sc = (char *)memchr(p, 0x3b, len > 5 ? 5 : len); + if(!sc) goto want_more; + if((sc - p) == 4 + && p[1] == 0x61 /* 'a' */ + && p[2] == 0x6d /* 'm' */ + && p[3] == 0x70 /* 'p' */) { + *buf++ = 0x26; + p = sc; + continue; + } + if((sc - p) == 3) { + if(p[1] == 0x6c) { + *buf = 0x3c; /* '<' */ + } else if(p[1] == 0x67) { + *buf = 0x3e; /* '>' */ + } else { + /* Unsupported entity reference */ + *buf++ = ch; + continue; + } + if(p[2] != 0x74) { + /* Unsupported entity reference */ + *buf++ = ch; + continue; + } + buf++; + p = sc; + continue; + } + /* Unsupported entity reference */ + *buf++ = ch; + } + + continue; + want_more: + if(have_more) { + /* + * We know that no more data (of the same type) + * is coming. Copy the rest verbatim. + */ + *buf++ = ch; + continue; + } + chunk_size = (p - (const char *)chunk_buf); + /* Processing stalled: need more data */ + break; + } + + st->size = buf - st->buf; + assert(st->size <= _ns); + st->buf[st->size] = 0; /* Courtesy termination */ + + return chunk_size; /* Converted in full */ +} + +/* + * Decode OCTET STRING from the XML element's body. + */ +static asn_dec_rval_t +OCTET_STRING__decode_xer(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, void **sptr, + const char *opt_mname, const void *buf_ptr, size_t size, + int (*opt_unexpected_tag_decoder) + (void *struct_ptr, const void *chunk_buf, size_t chunk_size), + ssize_t (*body_receiver) + (void *struct_ptr, const void *chunk_buf, size_t chunk_size, + int have_more) +) { + OCTET_STRING_t *st = (OCTET_STRING_t *)*sptr; + asn_OCTET_STRING_specifics_t *specs = td->specifics + ? (asn_OCTET_STRING_specifics_t *)td->specifics + : &asn_DEF_OCTET_STRING_specs; + const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; + asn_struct_ctx_t *ctx; /* Per-structure parser context */ + asn_dec_rval_t rval; /* Return value from the decoder */ + int st_allocated; + + /* + * Create the string if does not exist. + */ + if(!st) { + st = (OCTET_STRING_t *)CALLOC(1, specs->struct_size); + *sptr = (void *)st; + if(!st) goto sta_failed; + st_allocated = 1; + } else { + st_allocated = 0; + } + if(!st->buf) { + /* This is separate from above section */ + st->buf = (uint8_t *)CALLOC(1, 1); + if(!st->buf) { + if(st_allocated) { + *sptr = 0; + goto stb_failed; + } else { + goto sta_failed; + } + } + } + + /* Restore parsing context */ + ctx = (asn_struct_ctx_t *)(((char *)*sptr) + specs->ctx_offset); + + return xer_decode_general(opt_codec_ctx, ctx, *sptr, xml_tag, + buf_ptr, size, opt_unexpected_tag_decoder, body_receiver); + +stb_failed: + FREEMEM(st); +sta_failed: + rval.code = RC_FAIL; + rval.consumed = 0; + return rval; +} + +/* + * Decode OCTET STRING from the hexadecimal data. + */ +asn_dec_rval_t +OCTET_STRING_decode_xer_hex(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, void **sptr, + const char *opt_mname, const void *buf_ptr, size_t size) { + return OCTET_STRING__decode_xer(opt_codec_ctx, td, sptr, opt_mname, + buf_ptr, size, 0, OCTET_STRING__convert_hexadecimal); +} + +/* + * Decode OCTET STRING from the binary (0/1) data. + */ +asn_dec_rval_t +OCTET_STRING_decode_xer_binary(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, void **sptr, + const char *opt_mname, const void *buf_ptr, size_t size) { + return OCTET_STRING__decode_xer(opt_codec_ctx, td, sptr, opt_mname, + buf_ptr, size, 0, OCTET_STRING__convert_binary); +} + +/* + * Decode OCTET STRING from the string (ASCII/UTF-8) data. + */ +asn_dec_rval_t +OCTET_STRING_decode_xer_utf8(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, void **sptr, + const char *opt_mname, const void *buf_ptr, size_t size) { + return OCTET_STRING__decode_xer(opt_codec_ctx, td, sptr, opt_mname, + buf_ptr, size, + OCTET_STRING__handle_control_chars, + OCTET_STRING__convert_entrefs); +} + +static int +OCTET_STRING_per_get_characters(asn_per_data_t *po, uint8_t *buf, + size_t units, unsigned int bpc, unsigned int unit_bits, + long lb, long ub, asn_per_constraints_t *pc) { + uint8_t *end = buf + units * bpc; + + ASN_DEBUG("Expanding %d characters into (%ld..%ld):%d", + (int)units, lb, ub, unit_bits); + + /* X.691: 27.5.4 */ + if((unsigned long)ub <= ((unsigned long)2 << (unit_bits - 1))) { + /* Decode without translation */ + lb = 0; + } else if(pc && pc->code2value) { + if(unit_bits > 16) + return 1; /* FATAL: can't have constrained + * UniversalString with more than + * 16 million code points */ + for(; buf < end; buf += bpc) { + int value; + int code = per_get_few_bits(po, unit_bits); + if(code < 0) return -1; /* WMORE */ + value = pc->code2value(code); + if(value < 0) { + ASN_DEBUG("Code %d (0x%02x) is" + " not in map (%ld..%ld)", + code, code, lb, ub); + return 1; /* FATAL */ + } + switch(bpc) { + case 1: *buf = value; break; + case 2: buf[0] = value >> 8; buf[1] = value; break; + case 4: buf[0] = value >> 24; buf[1] = value >> 16; + buf[2] = value >> 8; buf[3] = value; break; + } + } + return 0; + } + + /* Shortcut the no-op copying to the aligned structure */ + if(lb == 0 && (unit_bits == 8 * bpc)) { + return per_get_many_bits(po, buf, 0, unit_bits * units); + } + + for(; buf < end; buf += bpc) { + int code = per_get_few_bits(po, unit_bits); + int ch = code + lb; + if(code < 0) return -1; /* WMORE */ + if(ch > ub) { + ASN_DEBUG("Code %d is out of range (%ld..%ld)", + ch, lb, ub); + return 1; /* FATAL */ + } + switch(bpc) { + case 1: *buf = ch; break; + case 2: buf[0] = ch >> 8; buf[1] = ch; break; + case 4: buf[0] = ch >> 24; buf[1] = ch >> 16; + buf[2] = ch >> 8; buf[3] = ch; break; + } + } + + return 0; +} + +static int +OCTET_STRING_per_put_characters(asn_per_outp_t *po, const uint8_t *buf, + size_t units, unsigned int bpc, unsigned int unit_bits, + long lb, long ub, asn_per_constraints_t *pc) { + const uint8_t *end = buf + units * bpc; + + ASN_DEBUG("Squeezing %d characters into (%ld..%ld):%d (%d bpc)", + (int)units, lb, ub, unit_bits, bpc); + + /* X.691: 27.5.4 */ + if((unsigned long)ub <= ((unsigned long)2 << (unit_bits - 1))) { + /* Encode as is */ + lb = 0; + } else if(pc && pc->value2code) { + for(; buf < end; buf += bpc) { + int code; + uint32_t value; + switch(bpc) { + case 1: value = *(const uint8_t *)buf; break; + case 2: value = (buf[0] << 8) | buf[1]; break; + case 4: value = (buf[0] << 24) | (buf[1] << 16) + | (buf[2] << 8) | buf[3]; break; + default: return -1; + } + code = pc->value2code(value); + if(code < 0) { + ASN_DEBUG("Character %d (0x%02x) is" + " not in map (%ld..%ld)", + *buf, *buf, lb, ub); + return -1; + } + if(per_put_few_bits(po, code, unit_bits)) + return -1; + } + } + + /* Shortcut the no-op copying to the aligned structure */ + if(lb == 0 && (unit_bits == 8 * bpc)) { + return per_put_many_bits(po, buf, unit_bits * units); + } + + for(ub -= lb; buf < end; buf += bpc) { + int ch; + uint32_t value; + switch(bpc) { + case 1: value = *(const uint8_t *)buf; break; + case 2: value = (buf[0] << 8) | buf[1]; break; + case 4: value = (buf[0] << 24) | (buf[1] << 16) + | (buf[2] << 8) | buf[3]; break; + default: return -1; + } + ch = value - lb; + if(ch < 0 || ch > ub) { + ASN_DEBUG("Character %d (0x%02x)" + " is out of range (%ld..%ld)", + *buf, *buf, lb, ub + lb); + return -1; + } + if(per_put_few_bits(po, ch, unit_bits)) + return -1; + } + + return 0; +} + +asn_dec_rval_t +OCTET_STRING_decode_uper(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, + void **sptr, asn_per_data_t *pd) { + + asn_OCTET_STRING_specifics_t *specs = td->specifics + ? (asn_OCTET_STRING_specifics_t *)td->specifics + : &asn_DEF_OCTET_STRING_specs; + asn_per_constraints_t *pc = constraints ? constraints + : td->per_constraints; + asn_per_constraint_t *cval; + asn_per_constraint_t *csiz; + asn_dec_rval_t rval = { RC_OK, 0 }; + BIT_STRING_t *st = (BIT_STRING_t *)*sptr; + ssize_t consumed_myself = 0; + int repeat; + enum { + OS__BPC_BIT = 0, + OS__BPC_CHAR = 1, + OS__BPC_U16 = 2, + OS__BPC_U32 = 4 + } bpc; /* Bytes per character */ + unsigned int unit_bits; + unsigned int canonical_unit_bits; + + (void)opt_codec_ctx; + + if(pc) { + cval = &pc->value; + csiz = &pc->size; + } else { + cval = &asn_DEF_OCTET_STRING_constraints.value; + csiz = &asn_DEF_OCTET_STRING_constraints.size; + } + + switch(specs->subvariant) { + default: + case ASN_OSUBV_ANY: + ASN_DEBUG("Unrecognized subvariant %d", specs->subvariant); + RETURN(RC_FAIL); + case ASN_OSUBV_BIT: + canonical_unit_bits = unit_bits = 1; + bpc = OS__BPC_BIT; + break; + case ASN_OSUBV_STR: + canonical_unit_bits = unit_bits = 8; + if(cval->flags & APC_CONSTRAINED) + unit_bits = cval->range_bits; + bpc = OS__BPC_CHAR; + break; + case ASN_OSUBV_U16: + canonical_unit_bits = unit_bits = 16; + if(cval->flags & APC_CONSTRAINED) + unit_bits = cval->range_bits; + bpc = OS__BPC_U16; + break; + case ASN_OSUBV_U32: + canonical_unit_bits = unit_bits = 32; + if(cval->flags & APC_CONSTRAINED) + unit_bits = cval->range_bits; + bpc = OS__BPC_U32; + break; + } + + /* + * Allocate the string. + */ + if(!st) { + st = (BIT_STRING_t *)(*sptr = CALLOC(1, specs->struct_size)); + if(!st) RETURN(RC_FAIL); + } + + ASN_DEBUG("PER Decoding %s size %ld .. %ld bits %d", + csiz->flags & APC_EXTENSIBLE ? "extensible" : "non-extensible", + csiz->lower_bound, csiz->upper_bound, csiz->effective_bits); + + if(csiz->flags & APC_EXTENSIBLE) { + int inext = per_get_few_bits(pd, 1); + if(inext < 0) RETURN(RC_WMORE); + if(inext) { + csiz = &asn_DEF_OCTET_STRING_constraints.size; + cval = &asn_DEF_OCTET_STRING_constraints.value; + unit_bits = canonical_unit_bits; + } + } + + if(csiz->effective_bits >= 0) { + FREEMEM(st->buf); + if(bpc) { + st->size = csiz->upper_bound * bpc; + } else { + st->size = (csiz->upper_bound + 7) >> 3; + } + st->buf = (uint8_t *)MALLOC(st->size + 1); + if(!st->buf) { st->size = 0; RETURN(RC_FAIL); } + } + + /* X.691, #16.5: zero-length encoding */ + /* X.691, #16.6: short fixed length encoding (up to 2 octets) */ + /* X.691, #16.7: long fixed length encoding (up to 64K octets) */ + if(csiz->effective_bits == 0) { + int ret; + if(bpc) { + ASN_DEBUG("Encoding OCTET STRING size %ld", + csiz->upper_bound); + ret = OCTET_STRING_per_get_characters(pd, st->buf, + csiz->upper_bound, bpc, unit_bits, + cval->lower_bound, cval->upper_bound, pc); + if(ret > 0) RETURN(RC_FAIL); + } else { + ASN_DEBUG("Encoding BIT STRING size %ld", + csiz->upper_bound); + ret = per_get_many_bits(pd, st->buf, 0, + unit_bits * csiz->upper_bound); + } + if(ret < 0) RETURN(RC_WMORE); + consumed_myself += unit_bits * csiz->upper_bound; + st->buf[st->size] = 0; + if(bpc == 0) { + int ubs = (csiz->upper_bound & 0x7); + st->bits_unused = ubs ? 8 - ubs : 0; + } + RETURN(RC_OK); + } + + st->size = 0; + do { + ssize_t raw_len; + ssize_t len_bytes; + ssize_t len_bits; + void *p; + int ret; + + /* Get the PER length */ + raw_len = uper_get_length(pd, csiz->effective_bits, &repeat); + if(raw_len < 0) RETURN(RC_WMORE); + raw_len += csiz->lower_bound; + + ASN_DEBUG("Got PER length eb %ld, len %ld, %s (%s)", + (long)csiz->effective_bits, (long)raw_len, + repeat ? "repeat" : "once", td->name); + if(bpc) { + len_bytes = raw_len * bpc; + len_bits = len_bytes * unit_bits; + } else { + len_bits = raw_len; + len_bytes = (len_bits + 7) >> 3; + if(len_bits & 0x7) + st->bits_unused = 8 - (len_bits & 0x7); + /* len_bits be multiple of 16K if repeat is set */ + } + p = REALLOC(st->buf, st->size + len_bytes + 1); + if(!p) RETURN(RC_FAIL); + st->buf = (uint8_t *)p; + + if(bpc) { + ret = OCTET_STRING_per_get_characters(pd, + &st->buf[st->size], raw_len, bpc, unit_bits, + cval->lower_bound, cval->upper_bound, pc); + if(ret > 0) RETURN(RC_FAIL); + } else { + ret = per_get_many_bits(pd, &st->buf[st->size], + 0, len_bits); + } + if(ret < 0) RETURN(RC_WMORE); + st->size += len_bytes; + } while(repeat); + st->buf[st->size] = 0; /* nul-terminate */ + + return rval; +} + +asn_enc_rval_t +OCTET_STRING_encode_uper(asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { + + asn_OCTET_STRING_specifics_t *specs = td->specifics + ? (asn_OCTET_STRING_specifics_t *)td->specifics + : &asn_DEF_OCTET_STRING_specs; + asn_per_constraints_t *pc = constraints ? constraints + : td->per_constraints; + asn_per_constraint_t *cval; + asn_per_constraint_t *csiz; + const BIT_STRING_t *st = (const BIT_STRING_t *)sptr; + asn_enc_rval_t er = { 0, 0, 0 }; + int inext = 0; /* Lies not within extension root */ + unsigned int unit_bits; + unsigned int canonical_unit_bits; + unsigned int sizeinunits; + const uint8_t *buf; + int ret; + enum { + OS__BPC_BIT = 0, + OS__BPC_CHAR = 1, + OS__BPC_U16 = 2, + OS__BPC_U32 = 4 + } bpc; /* Bytes per character */ + int ct_extensible; + + if(!st || (!st->buf && st->size)) + ASN__ENCODE_FAILED; + + if(pc) { + cval = &pc->value; + csiz = &pc->size; + } else { + cval = &asn_DEF_OCTET_STRING_constraints.value; + csiz = &asn_DEF_OCTET_STRING_constraints.size; + } + ct_extensible = csiz->flags & APC_EXTENSIBLE; + + switch(specs->subvariant) { + default: + case ASN_OSUBV_ANY: + ASN__ENCODE_FAILED; + case ASN_OSUBV_BIT: + canonical_unit_bits = unit_bits = 1; + bpc = OS__BPC_BIT; + sizeinunits = st->size * 8 - (st->bits_unused & 0x07); + ASN_DEBUG("BIT STRING of %d bytes, %d bits unused", + sizeinunits, st->bits_unused); + break; + case ASN_OSUBV_STR: + canonical_unit_bits = unit_bits = 8; + if(cval->flags & APC_CONSTRAINED) + unit_bits = cval->range_bits; + bpc = OS__BPC_CHAR; + sizeinunits = st->size; + break; + case ASN_OSUBV_U16: + canonical_unit_bits = unit_bits = 16; + if(cval->flags & APC_CONSTRAINED) + unit_bits = cval->range_bits; + bpc = OS__BPC_U16; + sizeinunits = st->size / 2; + break; + case ASN_OSUBV_U32: + canonical_unit_bits = unit_bits = 32; + if(cval->flags & APC_CONSTRAINED) + unit_bits = cval->range_bits; + bpc = OS__BPC_U32; + sizeinunits = st->size / 4; + break; + } + + ASN_DEBUG("Encoding %s into %d units of %d bits" + " (%ld..%ld, effective %d)%s", + td->name, sizeinunits, unit_bits, + csiz->lower_bound, csiz->upper_bound, + csiz->effective_bits, ct_extensible ? " EXT" : ""); + + /* Figure out whether size lies within PER visible constraint */ + + if(csiz->effective_bits >= 0) { + if((int)sizeinunits < csiz->lower_bound + || (int)sizeinunits > csiz->upper_bound) { + if(ct_extensible) { + cval = &asn_DEF_OCTET_STRING_constraints.value; + csiz = &asn_DEF_OCTET_STRING_constraints.size; + unit_bits = canonical_unit_bits; + inext = 1; + } else + ASN__ENCODE_FAILED; + } + } else { + inext = 0; + } + + if(ct_extensible) { + /* Declare whether length is [not] within extension root */ + if(per_put_few_bits(po, inext, 1)) + ASN__ENCODE_FAILED; + } + + /* X.691, #16.5: zero-length encoding */ + /* X.691, #16.6: short fixed length encoding (up to 2 octets) */ + /* X.691, #16.7: long fixed length encoding (up to 64K octets) */ + if(csiz->effective_bits >= 0) { + ASN_DEBUG("Encoding %d bytes (%ld), length in %d bits", + st->size, sizeinunits - csiz->lower_bound, + csiz->effective_bits); + ret = per_put_few_bits(po, sizeinunits - csiz->lower_bound, + csiz->effective_bits); + if(ret) ASN__ENCODE_FAILED; + if(bpc) { + ret = OCTET_STRING_per_put_characters(po, st->buf, + sizeinunits, bpc, unit_bits, + cval->lower_bound, cval->upper_bound, pc); + } else { + ret = per_put_many_bits(po, st->buf, + sizeinunits * unit_bits); + } + if(ret) ASN__ENCODE_FAILED; + ASN__ENCODED_OK(er); + } + + ASN_DEBUG("Encoding %d bytes", st->size); + + if(sizeinunits == 0) { + if(uper_put_length(po, 0)) + ASN__ENCODE_FAILED; + ASN__ENCODED_OK(er); + } + + buf = st->buf; + while(sizeinunits) { + ssize_t maySave = uper_put_length(po, sizeinunits); + if(maySave < 0) ASN__ENCODE_FAILED; + + ASN_DEBUG("Encoding %ld of %ld", + (long)maySave, (long)sizeinunits); + + if(bpc) { + ret = OCTET_STRING_per_put_characters(po, buf, + maySave, bpc, unit_bits, + cval->lower_bound, cval->upper_bound, pc); + } else { + ret = per_put_many_bits(po, buf, maySave * unit_bits); + } + if(ret) ASN__ENCODE_FAILED; + + if(bpc) + buf += maySave * bpc; + else + buf += maySave >> 3; + sizeinunits -= maySave; + assert(!(maySave & 0x07) || !sizeinunits); + } + + ASN__ENCODED_OK(er); +} + +int +OCTET_STRING_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + const char * const h2c = "0123456789ABCDEF"; + const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; + char scratch[16 * 3 + 4]; + char *p = scratch; + uint8_t *buf; + uint8_t *end; + size_t i; + + (void)td; /* Unused argument */ + + if(!st || (!st->buf && st->size)) + return (cb("", 8, app_key) < 0) ? -1 : 0; + + /* + * Dump the contents of the buffer in hexadecimal. + */ + buf = st->buf; + end = buf + st->size; + for(i = 0; buf < end; buf++, i++) { + if(!(i % 16) && (i || st->size > 16)) { + if(cb(scratch, p - scratch, app_key) < 0) + return -1; + _i_INDENT(1); + p = scratch; + } + *p++ = h2c[(*buf >> 4) & 0x0F]; + *p++ = h2c[*buf & 0x0F]; + *p++ = 0x20; + } + + if(p > scratch) { + p--; /* Remove the tail space */ + if(cb(scratch, p - scratch, app_key) < 0) + return -1; + } + + return 0; +} + +int +OCTET_STRING_print_utf8(asn_TYPE_descriptor_t *td, const void *sptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; + + (void)td; /* Unused argument */ + (void)ilevel; /* Unused argument */ + + if(st && (st->buf || !st->size)) { + return (cb(st->buf, st->size, app_key) < 0) ? -1 : 0; + } else { + return (cb("", 8, app_key) < 0) ? -1 : 0; + } +} + +void +OCTET_STRING_free(asn_TYPE_descriptor_t *td, void *sptr, int contents_only) { + OCTET_STRING_t *st = (OCTET_STRING_t *)sptr; + asn_OCTET_STRING_specifics_t *specs; + asn_struct_ctx_t *ctx; + struct _stack *stck; + + if(!td || !st) + return; + + specs = td->specifics + ? (asn_OCTET_STRING_specifics_t *)td->specifics + : &asn_DEF_OCTET_STRING_specs; + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + ASN_DEBUG("Freeing %s as OCTET STRING", td->name); + + if(st->buf) { + FREEMEM(st->buf); + st->buf = 0; + } + + /* + * Remove decode-time stack. + */ + stck = (struct _stack *)ctx->ptr; + if(stck) { + while(stck->tail) { + struct _stack_el *sel = stck->tail; + stck->tail = sel->prev; + FREEMEM(sel); + } + FREEMEM(stck); + } + + if(!contents_only) { + FREEMEM(st); + } +} + +/* + * Conversion routines. + */ +int +OCTET_STRING_fromBuf(OCTET_STRING_t *st, const char *str, int len) { + void *buf; + + if(st == 0 || (str == 0 && len)) { + errno = EINVAL; + return -1; + } + + /* + * Clear the OCTET STRING. + */ + if(str == NULL) { + FREEMEM(st->buf); + st->buf = 0; + st->size = 0; + return 0; + } + + /* Determine the original string size, if not explicitly given */ + if(len < 0) + len = strlen(str); + + /* Allocate and fill the memory */ + buf = MALLOC(len + 1); + if(buf == NULL) + return -1; + + memcpy(buf, str, len); + ((uint8_t *)buf)[len] = '\0'; /* Couldn't use memcpy(len+1)! */ + FREEMEM(st->buf); + st->buf = (uint8_t *)buf; + st->size = len; + + return 0; +} + +OCTET_STRING_t * +OCTET_STRING_new_fromBuf(asn_TYPE_descriptor_t *td, const char *str, int len) { + asn_OCTET_STRING_specifics_t *specs = td->specifics + ? (asn_OCTET_STRING_specifics_t *)td->specifics + : &asn_DEF_OCTET_STRING_specs; + OCTET_STRING_t *st; + + st = (OCTET_STRING_t *)CALLOC(1, specs->struct_size); + if(st && str && OCTET_STRING_fromBuf(st, str, len)) { + FREEMEM(st); + st = NULL; + } + + return st; +} + diff --git a/src/cryptoconditions/src/asn/OCTET_STRING.h b/src/cryptoconditions/src/asn/OCTET_STRING.h new file mode 100644 index 00000000000..013c7b13f96 --- /dev/null +++ b/src/cryptoconditions/src/asn/OCTET_STRING.h @@ -0,0 +1,86 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _OCTET_STRING_H_ +#define _OCTET_STRING_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct OCTET_STRING { + uint8_t *buf; /* Buffer with consecutive OCTET_STRING bits */ + int size; /* Size of the buffer */ + + asn_struct_ctx_t _asn_ctx; /* Parsing across buffer boundaries */ +} OCTET_STRING_t; + +extern asn_TYPE_descriptor_t asn_DEF_OCTET_STRING; + +asn_struct_free_f OCTET_STRING_free; +asn_struct_print_f OCTET_STRING_print; +asn_struct_print_f OCTET_STRING_print_utf8; +ber_type_decoder_f OCTET_STRING_decode_ber; +der_type_encoder_f OCTET_STRING_encode_der; +xer_type_decoder_f OCTET_STRING_decode_xer_hex; /* Hexadecimal */ +xer_type_decoder_f OCTET_STRING_decode_xer_binary; /* 01010111010 */ +xer_type_decoder_f OCTET_STRING_decode_xer_utf8; /* ASCII/UTF-8 */ +xer_type_encoder_f OCTET_STRING_encode_xer; +xer_type_encoder_f OCTET_STRING_encode_xer_utf8; +per_type_decoder_f OCTET_STRING_decode_uper; +per_type_encoder_f OCTET_STRING_encode_uper; + +/****************************** + * Handy conversion routines. * + ******************************/ + +/* + * This function clears the previous value of the OCTET STRING (if any) + * and then allocates a new memory with the specified content (str/size). + * If size = -1, the size of the original string will be determined + * using strlen(str). + * If str equals to NULL, the function will silently clear the + * current contents of the OCTET STRING. + * Returns 0 if it was possible to perform operation, -1 otherwise. + */ +int OCTET_STRING_fromBuf(OCTET_STRING_t *s, const char *str, int size); + +/* Handy conversion from the C string into the OCTET STRING. */ +#define OCTET_STRING_fromString(s, str) OCTET_STRING_fromBuf(s, str, -1) + +/* + * Allocate and fill the new OCTET STRING and return a pointer to the newly + * allocated object. NULL is permitted in str: the function will just allocate + * empty OCTET STRING. + */ +OCTET_STRING_t *OCTET_STRING_new_fromBuf(asn_TYPE_descriptor_t *td, + const char *str, int size); + +/**************************** + * Internally useful stuff. * + ****************************/ + +typedef const struct asn_OCTET_STRING_specifics_s { + /* + * Target structure description. + */ + int struct_size; /* Size of the structure */ + int ctx_offset; /* Offset of the asn_struct_ctx_t member */ + + enum asn_OS_Subvariant { + ASN_OSUBV_ANY, /* The open type (ANY) */ + ASN_OSUBV_BIT, /* BIT STRING */ + ASN_OSUBV_STR, /* String types, not {BMP,Universal}String */ + ASN_OSUBV_U16, /* 16-bit character (BMPString) */ + ASN_OSUBV_U32 /* 32-bit character (UniversalString) */ + } subvariant; +} asn_OCTET_STRING_specifics_t; + +#ifdef __cplusplus +} +#endif + +#endif /* _OCTET_STRING_H_ */ diff --git a/src/cryptoconditions/src/asn/PrefixFingerprintContents.c b/src/cryptoconditions/src/asn/PrefixFingerprintContents.c new file mode 100644 index 00000000000..13f54aaa18c --- /dev/null +++ b/src/cryptoconditions/src/asn/PrefixFingerprintContents.c @@ -0,0 +1,209 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#include "PrefixFingerprintContents.h" + +static int +maxMessageLength_3_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + /* Constraint check succeeded */ + return 0; +} + +/* + * This type is implemented using NativeInteger, + * so here we adjust the DEF accordingly. + */ +static void +maxMessageLength_3_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_NativeInteger.free_struct; + td->print_struct = asn_DEF_NativeInteger.print_struct; + td->check_constraints = asn_DEF_NativeInteger.check_constraints; + td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; + td->der_encoder = asn_DEF_NativeInteger.der_encoder; + td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; + td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_NativeInteger.per_constraints; + td->elements = asn_DEF_NativeInteger.elements; + td->elements_count = asn_DEF_NativeInteger.elements_count; + /* td->specifics = asn_DEF_NativeInteger.specifics; // Defined explicitly */ +} + +static void +maxMessageLength_3_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + maxMessageLength_3_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +static int +maxMessageLength_3_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + maxMessageLength_3_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +static asn_dec_rval_t +maxMessageLength_3_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + maxMessageLength_3_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +static asn_enc_rval_t +maxMessageLength_3_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + maxMessageLength_3_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +static asn_dec_rval_t +maxMessageLength_3_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + maxMessageLength_3_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +static asn_enc_rval_t +maxMessageLength_3_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + maxMessageLength_3_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +static int +memb_maxMessageLength_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + /* Constraint check succeeded */ + return 0; +} + +static const asn_INTEGER_specifics_t asn_SPC_maxMessageLength_specs_3 = { + 0, 0, 0, 0, 0, + 0, /* Native long size */ + 1 /* Unsigned representation */ +}; +static const ber_tlv_tag_t asn_DEF_maxMessageLength_tags_3[] = { + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_maxMessageLength_3 = { + "maxMessageLength", + "maxMessageLength", + maxMessageLength_3_free, + maxMessageLength_3_print, + maxMessageLength_3_constraint, + maxMessageLength_3_decode_ber, + maxMessageLength_3_encode_der, + maxMessageLength_3_decode_xer, + maxMessageLength_3_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_maxMessageLength_tags_3, + sizeof(asn_DEF_maxMessageLength_tags_3) + /sizeof(asn_DEF_maxMessageLength_tags_3[0]) - 1, /* 1 */ + asn_DEF_maxMessageLength_tags_3, /* Same as above */ + sizeof(asn_DEF_maxMessageLength_tags_3) + /sizeof(asn_DEF_maxMessageLength_tags_3[0]), /* 2 */ + 0, /* No PER visible constraints */ + 0, 0, /* No members */ + &asn_SPC_maxMessageLength_specs_3 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_PrefixFingerprintContents_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct PrefixFingerprintContents, prefix), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCTET_STRING, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "prefix" + }, + { ATF_NOFLAGS, 0, offsetof(struct PrefixFingerprintContents, maxMessageLength), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_maxMessageLength_3, + memb_maxMessageLength_constraint_1, + 0, /* PER is not compiled, use -gen-PER */ + 0, + "maxMessageLength" + }, + { ATF_NOFLAGS, 0, offsetof(struct PrefixFingerprintContents, subcondition), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_Condition, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "subcondition" + }, +}; +static const ber_tlv_tag_t asn_DEF_PrefixFingerprintContents_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_PrefixFingerprintContents_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* prefix */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* maxMessageLength */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* subcondition */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_PrefixFingerprintContents_specs_1 = { + sizeof(struct PrefixFingerprintContents), + offsetof(struct PrefixFingerprintContents, _asn_ctx), + asn_MAP_PrefixFingerprintContents_tag2el_1, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn_TYPE_descriptor_t asn_DEF_PrefixFingerprintContents = { + "PrefixFingerprintContents", + "PrefixFingerprintContents", + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_PrefixFingerprintContents_tags_1, + sizeof(asn_DEF_PrefixFingerprintContents_tags_1) + /sizeof(asn_DEF_PrefixFingerprintContents_tags_1[0]), /* 1 */ + asn_DEF_PrefixFingerprintContents_tags_1, /* Same as above */ + sizeof(asn_DEF_PrefixFingerprintContents_tags_1) + /sizeof(asn_DEF_PrefixFingerprintContents_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + asn_MBR_PrefixFingerprintContents_1, + 3, /* Elements count */ + &asn_SPC_PrefixFingerprintContents_specs_1 /* Additional specs */ +}; + diff --git a/src/cryptoconditions/src/asn/PrefixFingerprintContents.h b/src/cryptoconditions/src/asn/PrefixFingerprintContents.h new file mode 100644 index 00000000000..5d1254cd41a --- /dev/null +++ b/src/cryptoconditions/src/asn/PrefixFingerprintContents.h @@ -0,0 +1,42 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#ifndef _PrefixFingerprintContents_H_ +#define _PrefixFingerprintContents_H_ + + +#include + +/* Including external dependencies */ +#include +#include +#include "Condition.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* PrefixFingerprintContents */ +typedef struct PrefixFingerprintContents { + OCTET_STRING_t prefix; + unsigned long maxMessageLength; + Condition_t subcondition; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} PrefixFingerprintContents_t; + +/* Implementation */ +/* extern asn_TYPE_descriptor_t asn_DEF_maxMessageLength_3; // (Use -fall-defs-global to expose) */ +extern asn_TYPE_descriptor_t asn_DEF_PrefixFingerprintContents; + +#ifdef __cplusplus +} +#endif + +#endif /* _PrefixFingerprintContents_H_ */ +#include diff --git a/src/cryptoconditions/src/asn/PrefixFulfillment.c b/src/cryptoconditions/src/asn/PrefixFulfillment.c new file mode 100644 index 00000000000..f4c8548073b --- /dev/null +++ b/src/cryptoconditions/src/asn/PrefixFulfillment.c @@ -0,0 +1,209 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#include "PrefixFulfillment.h" + +static int +maxMessageLength_3_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + /* Constraint check succeeded */ + return 0; +} + +/* + * This type is implemented using NativeInteger, + * so here we adjust the DEF accordingly. + */ +static void +maxMessageLength_3_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_NativeInteger.free_struct; + td->print_struct = asn_DEF_NativeInteger.print_struct; + td->check_constraints = asn_DEF_NativeInteger.check_constraints; + td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; + td->der_encoder = asn_DEF_NativeInteger.der_encoder; + td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; + td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_NativeInteger.per_constraints; + td->elements = asn_DEF_NativeInteger.elements; + td->elements_count = asn_DEF_NativeInteger.elements_count; + /* td->specifics = asn_DEF_NativeInteger.specifics; // Defined explicitly */ +} + +static void +maxMessageLength_3_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + maxMessageLength_3_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +static int +maxMessageLength_3_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + maxMessageLength_3_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +static asn_dec_rval_t +maxMessageLength_3_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + maxMessageLength_3_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +static asn_enc_rval_t +maxMessageLength_3_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + maxMessageLength_3_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +static asn_dec_rval_t +maxMessageLength_3_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + maxMessageLength_3_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +static asn_enc_rval_t +maxMessageLength_3_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + maxMessageLength_3_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +static int +memb_maxMessageLength_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + /* Constraint check succeeded */ + return 0; +} + +static const asn_INTEGER_specifics_t asn_SPC_maxMessageLength_specs_3 = { + 0, 0, 0, 0, 0, + 0, /* Native long size */ + 1 /* Unsigned representation */ +}; +static const ber_tlv_tag_t asn_DEF_maxMessageLength_tags_3[] = { + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_maxMessageLength_3 = { + "maxMessageLength", + "maxMessageLength", + maxMessageLength_3_free, + maxMessageLength_3_print, + maxMessageLength_3_constraint, + maxMessageLength_3_decode_ber, + maxMessageLength_3_encode_der, + maxMessageLength_3_decode_xer, + maxMessageLength_3_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_maxMessageLength_tags_3, + sizeof(asn_DEF_maxMessageLength_tags_3) + /sizeof(asn_DEF_maxMessageLength_tags_3[0]) - 1, /* 1 */ + asn_DEF_maxMessageLength_tags_3, /* Same as above */ + sizeof(asn_DEF_maxMessageLength_tags_3) + /sizeof(asn_DEF_maxMessageLength_tags_3[0]), /* 2 */ + 0, /* No PER visible constraints */ + 0, 0, /* No members */ + &asn_SPC_maxMessageLength_specs_3 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_PrefixFulfillment_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct PrefixFulfillment, prefix), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCTET_STRING, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "prefix" + }, + { ATF_NOFLAGS, 0, offsetof(struct PrefixFulfillment, maxMessageLength), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_maxMessageLength_3, + memb_maxMessageLength_constraint_1, + 0, /* PER is not compiled, use -gen-PER */ + 0, + "maxMessageLength" + }, + { ATF_POINTER, 0, offsetof(struct PrefixFulfillment, subfulfillment), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_Fulfillment, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "subfulfillment" + }, +}; +static const ber_tlv_tag_t asn_DEF_PrefixFulfillment_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_PrefixFulfillment_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* prefix */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* maxMessageLength */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* subfulfillment */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_PrefixFulfillment_specs_1 = { + sizeof(struct PrefixFulfillment), + offsetof(struct PrefixFulfillment, _asn_ctx), + asn_MAP_PrefixFulfillment_tag2el_1, + 3, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn_TYPE_descriptor_t asn_DEF_PrefixFulfillment = { + "PrefixFulfillment", + "PrefixFulfillment", + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_PrefixFulfillment_tags_1, + sizeof(asn_DEF_PrefixFulfillment_tags_1) + /sizeof(asn_DEF_PrefixFulfillment_tags_1[0]), /* 1 */ + asn_DEF_PrefixFulfillment_tags_1, /* Same as above */ + sizeof(asn_DEF_PrefixFulfillment_tags_1) + /sizeof(asn_DEF_PrefixFulfillment_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + asn_MBR_PrefixFulfillment_1, + 3, /* Elements count */ + &asn_SPC_PrefixFulfillment_specs_1 /* Additional specs */ +}; + diff --git a/src/cryptoconditions/src/asn/PrefixFulfillment.h b/src/cryptoconditions/src/asn/PrefixFulfillment.h new file mode 100644 index 00000000000..1c06cbc8de3 --- /dev/null +++ b/src/cryptoconditions/src/asn/PrefixFulfillment.h @@ -0,0 +1,47 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#ifndef _PrefixFulfillment_H_ +#define _PrefixFulfillment_H_ + + +#include + +/* Including external dependencies */ +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct Fulfillment; + +/* PrefixFulfillment */ +typedef struct PrefixFulfillment { + OCTET_STRING_t prefix; + unsigned long maxMessageLength; + struct Fulfillment *subfulfillment; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} PrefixFulfillment_t; + +/* Implementation */ +/* extern asn_TYPE_descriptor_t asn_DEF_maxMessageLength_3; // (Use -fall-defs-global to expose) */ +extern asn_TYPE_descriptor_t asn_DEF_PrefixFulfillment; + +#ifdef __cplusplus +} +#endif + +/* Referred external types */ +#include "Fulfillment.h" + +#endif /* _PrefixFulfillment_H_ */ +#include diff --git a/src/cryptoconditions/src/asn/PreimageFulfillment.c b/src/cryptoconditions/src/asn/PreimageFulfillment.c new file mode 100644 index 00000000000..e7b918824c8 --- /dev/null +++ b/src/cryptoconditions/src/asn/PreimageFulfillment.c @@ -0,0 +1,58 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#include "PreimageFulfillment.h" + +static asn_TYPE_member_t asn_MBR_PreimageFulfillment_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct PreimageFulfillment, preimage), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCTET_STRING, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "preimage" + }, +}; +static const ber_tlv_tag_t asn_DEF_PreimageFulfillment_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_PreimageFulfillment_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* preimage */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_PreimageFulfillment_specs_1 = { + sizeof(struct PreimageFulfillment), + offsetof(struct PreimageFulfillment, _asn_ctx), + asn_MAP_PreimageFulfillment_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn_TYPE_descriptor_t asn_DEF_PreimageFulfillment = { + "PreimageFulfillment", + "PreimageFulfillment", + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_PreimageFulfillment_tags_1, + sizeof(asn_DEF_PreimageFulfillment_tags_1) + /sizeof(asn_DEF_PreimageFulfillment_tags_1[0]), /* 1 */ + asn_DEF_PreimageFulfillment_tags_1, /* Same as above */ + sizeof(asn_DEF_PreimageFulfillment_tags_1) + /sizeof(asn_DEF_PreimageFulfillment_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + asn_MBR_PreimageFulfillment_1, + 1, /* Elements count */ + &asn_SPC_PreimageFulfillment_specs_1 /* Additional specs */ +}; + diff --git a/src/cryptoconditions/src/asn/PreimageFulfillment.h b/src/cryptoconditions/src/asn/PreimageFulfillment.h new file mode 100644 index 00000000000..04df5bd3bd4 --- /dev/null +++ b/src/cryptoconditions/src/asn/PreimageFulfillment.h @@ -0,0 +1,37 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#ifndef _PreimageFulfillment_H_ +#define _PreimageFulfillment_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* PreimageFulfillment */ +typedef struct PreimageFulfillment { + OCTET_STRING_t preimage; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} PreimageFulfillment_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_PreimageFulfillment; + +#ifdef __cplusplus +} +#endif + +#endif /* _PreimageFulfillment_H_ */ +#include diff --git a/src/cryptoconditions/src/asn/RsaFingerprintContents.c b/src/cryptoconditions/src/asn/RsaFingerprintContents.c new file mode 100644 index 00000000000..63d9f5296af --- /dev/null +++ b/src/cryptoconditions/src/asn/RsaFingerprintContents.c @@ -0,0 +1,58 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#include "RsaFingerprintContents.h" + +static asn_TYPE_member_t asn_MBR_RsaFingerprintContents_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RsaFingerprintContents, modulus), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCTET_STRING, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "modulus" + }, +}; +static const ber_tlv_tag_t asn_DEF_RsaFingerprintContents_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RsaFingerprintContents_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* modulus */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_RsaFingerprintContents_specs_1 = { + sizeof(struct RsaFingerprintContents), + offsetof(struct RsaFingerprintContents, _asn_ctx), + asn_MAP_RsaFingerprintContents_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn_TYPE_descriptor_t asn_DEF_RsaFingerprintContents = { + "RsaFingerprintContents", + "RsaFingerprintContents", + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_RsaFingerprintContents_tags_1, + sizeof(asn_DEF_RsaFingerprintContents_tags_1) + /sizeof(asn_DEF_RsaFingerprintContents_tags_1[0]), /* 1 */ + asn_DEF_RsaFingerprintContents_tags_1, /* Same as above */ + sizeof(asn_DEF_RsaFingerprintContents_tags_1) + /sizeof(asn_DEF_RsaFingerprintContents_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + asn_MBR_RsaFingerprintContents_1, + 1, /* Elements count */ + &asn_SPC_RsaFingerprintContents_specs_1 /* Additional specs */ +}; + diff --git a/src/cryptoconditions/src/asn/RsaFingerprintContents.h b/src/cryptoconditions/src/asn/RsaFingerprintContents.h new file mode 100644 index 00000000000..8637cd911c2 --- /dev/null +++ b/src/cryptoconditions/src/asn/RsaFingerprintContents.h @@ -0,0 +1,37 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#ifndef _RsaFingerprintContents_H_ +#define _RsaFingerprintContents_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RsaFingerprintContents */ +typedef struct RsaFingerprintContents { + OCTET_STRING_t modulus; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RsaFingerprintContents_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RsaFingerprintContents; + +#ifdef __cplusplus +} +#endif + +#endif /* _RsaFingerprintContents_H_ */ +#include diff --git a/src/cryptoconditions/src/asn/RsaSha256Fulfillment.c b/src/cryptoconditions/src/asn/RsaSha256Fulfillment.c new file mode 100644 index 00000000000..3072a6bea93 --- /dev/null +++ b/src/cryptoconditions/src/asn/RsaSha256Fulfillment.c @@ -0,0 +1,68 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#include "RsaSha256Fulfillment.h" + +static asn_TYPE_member_t asn_MBR_RsaSha256Fulfillment_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct RsaSha256Fulfillment, modulus), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCTET_STRING, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "modulus" + }, + { ATF_NOFLAGS, 0, offsetof(struct RsaSha256Fulfillment, signature), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCTET_STRING, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "signature" + }, +}; +static const ber_tlv_tag_t asn_DEF_RsaSha256Fulfillment_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_RsaSha256Fulfillment_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* modulus */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* signature */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_RsaSha256Fulfillment_specs_1 = { + sizeof(struct RsaSha256Fulfillment), + offsetof(struct RsaSha256Fulfillment, _asn_ctx), + asn_MAP_RsaSha256Fulfillment_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn_TYPE_descriptor_t asn_DEF_RsaSha256Fulfillment = { + "RsaSha256Fulfillment", + "RsaSha256Fulfillment", + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_RsaSha256Fulfillment_tags_1, + sizeof(asn_DEF_RsaSha256Fulfillment_tags_1) + /sizeof(asn_DEF_RsaSha256Fulfillment_tags_1[0]), /* 1 */ + asn_DEF_RsaSha256Fulfillment_tags_1, /* Same as above */ + sizeof(asn_DEF_RsaSha256Fulfillment_tags_1) + /sizeof(asn_DEF_RsaSha256Fulfillment_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + asn_MBR_RsaSha256Fulfillment_1, + 2, /* Elements count */ + &asn_SPC_RsaSha256Fulfillment_specs_1 /* Additional specs */ +}; + diff --git a/src/cryptoconditions/src/asn/RsaSha256Fulfillment.h b/src/cryptoconditions/src/asn/RsaSha256Fulfillment.h new file mode 100644 index 00000000000..fda5242766f --- /dev/null +++ b/src/cryptoconditions/src/asn/RsaSha256Fulfillment.h @@ -0,0 +1,38 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#ifndef _RsaSha256Fulfillment_H_ +#define _RsaSha256Fulfillment_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* RsaSha256Fulfillment */ +typedef struct RsaSha256Fulfillment { + OCTET_STRING_t modulus; + OCTET_STRING_t signature; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} RsaSha256Fulfillment_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_RsaSha256Fulfillment; + +#ifdef __cplusplus +} +#endif + +#endif /* _RsaSha256Fulfillment_H_ */ +#include diff --git a/src/cryptoconditions/src/asn/Secp256k1FingerprintContents.c b/src/cryptoconditions/src/asn/Secp256k1FingerprintContents.c new file mode 100644 index 00000000000..e31887f7523 --- /dev/null +++ b/src/cryptoconditions/src/asn/Secp256k1FingerprintContents.c @@ -0,0 +1,84 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#include "Secp256k1FingerprintContents.h" + +static int +memb_publicKey_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size; + + if((size == 33)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_TYPE_member_t asn_MBR_Secp256k1FingerprintContents_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct Secp256k1FingerprintContents, publicKey), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCTET_STRING, + memb_publicKey_constraint_1, + 0, /* PER is not compiled, use -gen-PER */ + 0, + "publicKey" + }, +}; +static const ber_tlv_tag_t asn_DEF_Secp256k1FingerprintContents_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_Secp256k1FingerprintContents_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* publicKey */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_Secp256k1FingerprintContents_specs_1 = { + sizeof(struct Secp256k1FingerprintContents), + offsetof(struct Secp256k1FingerprintContents, _asn_ctx), + asn_MAP_Secp256k1FingerprintContents_tag2el_1, + 1, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn_TYPE_descriptor_t asn_DEF_Secp256k1FingerprintContents = { + "Secp256k1FingerprintContents", + "Secp256k1FingerprintContents", + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Secp256k1FingerprintContents_tags_1, + sizeof(asn_DEF_Secp256k1FingerprintContents_tags_1) + /sizeof(asn_DEF_Secp256k1FingerprintContents_tags_1[0]), /* 1 */ + asn_DEF_Secp256k1FingerprintContents_tags_1, /* Same as above */ + sizeof(asn_DEF_Secp256k1FingerprintContents_tags_1) + /sizeof(asn_DEF_Secp256k1FingerprintContents_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + asn_MBR_Secp256k1FingerprintContents_1, + 1, /* Elements count */ + &asn_SPC_Secp256k1FingerprintContents_specs_1 /* Additional specs */ +}; + diff --git a/src/cryptoconditions/src/asn/Secp256k1FingerprintContents.h b/src/cryptoconditions/src/asn/Secp256k1FingerprintContents.h new file mode 100644 index 00000000000..d0a3b0b3955 --- /dev/null +++ b/src/cryptoconditions/src/asn/Secp256k1FingerprintContents.h @@ -0,0 +1,37 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#ifndef _Secp256k1FingerprintContents_H_ +#define _Secp256k1FingerprintContents_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Secp256k1FingerprintContents */ +typedef struct Secp256k1FingerprintContents { + OCTET_STRING_t publicKey; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} Secp256k1FingerprintContents_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_Secp256k1FingerprintContents; + +#ifdef __cplusplus +} +#endif + +#endif /* _Secp256k1FingerprintContents_H_ */ +#include diff --git a/src/cryptoconditions/src/asn/Secp256k1Fulfillment.c b/src/cryptoconditions/src/asn/Secp256k1Fulfillment.c new file mode 100644 index 00000000000..cf8d65512bb --- /dev/null +++ b/src/cryptoconditions/src/asn/Secp256k1Fulfillment.c @@ -0,0 +1,120 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#include "Secp256k1Fulfillment.h" + +static int +memb_publicKey_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size; + + if((size == 33)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_signature_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size; + + if((size == 64)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_TYPE_member_t asn_MBR_Secp256k1Fulfillment_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct Secp256k1Fulfillment, publicKey), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCTET_STRING, + memb_publicKey_constraint_1, + 0, /* PER is not compiled, use -gen-PER */ + 0, + "publicKey" + }, + { ATF_NOFLAGS, 0, offsetof(struct Secp256k1Fulfillment, signature), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCTET_STRING, + memb_signature_constraint_1, + 0, /* PER is not compiled, use -gen-PER */ + 0, + "signature" + }, +}; +static const ber_tlv_tag_t asn_DEF_Secp256k1Fulfillment_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_Secp256k1Fulfillment_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* publicKey */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* signature */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_Secp256k1Fulfillment_specs_1 = { + sizeof(struct Secp256k1Fulfillment), + offsetof(struct Secp256k1Fulfillment, _asn_ctx), + asn_MAP_Secp256k1Fulfillment_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn_TYPE_descriptor_t asn_DEF_Secp256k1Fulfillment = { + "Secp256k1Fulfillment", + "Secp256k1Fulfillment", + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_Secp256k1Fulfillment_tags_1, + sizeof(asn_DEF_Secp256k1Fulfillment_tags_1) + /sizeof(asn_DEF_Secp256k1Fulfillment_tags_1[0]), /* 1 */ + asn_DEF_Secp256k1Fulfillment_tags_1, /* Same as above */ + sizeof(asn_DEF_Secp256k1Fulfillment_tags_1) + /sizeof(asn_DEF_Secp256k1Fulfillment_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + asn_MBR_Secp256k1Fulfillment_1, + 2, /* Elements count */ + &asn_SPC_Secp256k1Fulfillment_specs_1 /* Additional specs */ +}; + diff --git a/src/cryptoconditions/src/asn/Secp256k1Fulfillment.h b/src/cryptoconditions/src/asn/Secp256k1Fulfillment.h new file mode 100644 index 00000000000..79221317f2d --- /dev/null +++ b/src/cryptoconditions/src/asn/Secp256k1Fulfillment.h @@ -0,0 +1,38 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#ifndef _Secp256k1Fulfillment_H_ +#define _Secp256k1Fulfillment_H_ + + +#include + +/* Including external dependencies */ +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Secp256k1Fulfillment */ +typedef struct Secp256k1Fulfillment { + OCTET_STRING_t publicKey; + OCTET_STRING_t signature; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} Secp256k1Fulfillment_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_Secp256k1Fulfillment; + +#ifdef __cplusplus +} +#endif + +#endif /* _Secp256k1Fulfillment_H_ */ +#include diff --git a/src/cryptoconditions/src/asn/SimpleSha256Condition.c b/src/cryptoconditions/src/asn/SimpleSha256Condition.c new file mode 100644 index 00000000000..17c45a5fbe6 --- /dev/null +++ b/src/cryptoconditions/src/asn/SimpleSha256Condition.c @@ -0,0 +1,225 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#include "SimpleSha256Condition.h" + +static int +cost_3_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + /* Constraint check succeeded */ + return 0; +} + +/* + * This type is implemented using NativeInteger, + * so here we adjust the DEF accordingly. + */ +static void +cost_3_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) { + td->free_struct = asn_DEF_NativeInteger.free_struct; + td->print_struct = asn_DEF_NativeInteger.print_struct; + td->check_constraints = asn_DEF_NativeInteger.check_constraints; + td->ber_decoder = asn_DEF_NativeInteger.ber_decoder; + td->der_encoder = asn_DEF_NativeInteger.der_encoder; + td->xer_decoder = asn_DEF_NativeInteger.xer_decoder; + td->xer_encoder = asn_DEF_NativeInteger.xer_encoder; + td->uper_decoder = asn_DEF_NativeInteger.uper_decoder; + td->uper_encoder = asn_DEF_NativeInteger.uper_encoder; + if(!td->per_constraints) + td->per_constraints = asn_DEF_NativeInteger.per_constraints; + td->elements = asn_DEF_NativeInteger.elements; + td->elements_count = asn_DEF_NativeInteger.elements_count; + /* td->specifics = asn_DEF_NativeInteger.specifics; // Defined explicitly */ +} + +static void +cost_3_free(asn_TYPE_descriptor_t *td, + void *struct_ptr, int contents_only) { + cost_3_inherit_TYPE_descriptor(td); + td->free_struct(td, struct_ptr, contents_only); +} + +static int +cost_3_print(asn_TYPE_descriptor_t *td, const void *struct_ptr, + int ilevel, asn_app_consume_bytes_f *cb, void *app_key) { + cost_3_inherit_TYPE_descriptor(td); + return td->print_struct(td, struct_ptr, ilevel, cb, app_key); +} + +static asn_dec_rval_t +cost_3_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const void *bufptr, size_t size, int tag_mode) { + cost_3_inherit_TYPE_descriptor(td); + return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode); +} + +static asn_enc_rval_t +cost_3_encode_der(asn_TYPE_descriptor_t *td, + void *structure, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + cost_3_inherit_TYPE_descriptor(td); + return td->der_encoder(td, structure, tag_mode, tag, cb, app_key); +} + +static asn_dec_rval_t +cost_3_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **structure, const char *opt_mname, const void *bufptr, size_t size) { + cost_3_inherit_TYPE_descriptor(td); + return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size); +} + +static asn_enc_rval_t +cost_3_encode_xer(asn_TYPE_descriptor_t *td, void *structure, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + cost_3_inherit_TYPE_descriptor(td); + return td->xer_encoder(td, structure, ilevel, flags, cb, app_key); +} + +static int +memb_fingerprint_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr; + size_t size; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + size = st->size; + + if((size == 32)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static int +memb_cost_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + + /* Constraint check succeeded */ + return 0; +} + +static const asn_INTEGER_specifics_t asn_SPC_cost_specs_3 = { + 0, 0, 0, 0, 0, + 0, /* Native long size */ + 1 /* Unsigned representation */ +}; +static const ber_tlv_tag_t asn_DEF_cost_tags_3[] = { + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)) +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_cost_3 = { + "cost", + "cost", + cost_3_free, + cost_3_print, + cost_3_constraint, + cost_3_decode_ber, + cost_3_encode_der, + cost_3_decode_xer, + cost_3_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_cost_tags_3, + sizeof(asn_DEF_cost_tags_3) + /sizeof(asn_DEF_cost_tags_3[0]) - 1, /* 1 */ + asn_DEF_cost_tags_3, /* Same as above */ + sizeof(asn_DEF_cost_tags_3) + /sizeof(asn_DEF_cost_tags_3[0]), /* 2 */ + 0, /* No PER visible constraints */ + 0, 0, /* No members */ + &asn_SPC_cost_specs_3 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_SimpleSha256Condition_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct SimpleSha256Condition, fingerprint), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_OCTET_STRING, + memb_fingerprint_constraint_1, + 0, /* PER is not compiled, use -gen-PER */ + 0, + "fingerprint" + }, + { ATF_NOFLAGS, 0, offsetof(struct SimpleSha256Condition, cost), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_cost_3, + memb_cost_constraint_1, + 0, /* PER is not compiled, use -gen-PER */ + 0, + "cost" + }, +}; +static const ber_tlv_tag_t asn_DEF_SimpleSha256Condition_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_SimpleSha256Condition_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* fingerprint */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* cost */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_SimpleSha256Condition_specs_1 = { + sizeof(struct SimpleSha256Condition), + offsetof(struct SimpleSha256Condition, _asn_ctx), + asn_MAP_SimpleSha256Condition_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn_TYPE_descriptor_t asn_DEF_SimpleSha256Condition = { + "SimpleSha256Condition", + "SimpleSha256Condition", + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_SimpleSha256Condition_tags_1, + sizeof(asn_DEF_SimpleSha256Condition_tags_1) + /sizeof(asn_DEF_SimpleSha256Condition_tags_1[0]), /* 1 */ + asn_DEF_SimpleSha256Condition_tags_1, /* Same as above */ + sizeof(asn_DEF_SimpleSha256Condition_tags_1) + /sizeof(asn_DEF_SimpleSha256Condition_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + asn_MBR_SimpleSha256Condition_1, + 2, /* Elements count */ + &asn_SPC_SimpleSha256Condition_specs_1 /* Additional specs */ +}; + diff --git a/src/cryptoconditions/src/asn/SimpleSha256Condition.h b/src/cryptoconditions/src/asn/SimpleSha256Condition.h new file mode 100644 index 00000000000..4ca08877b5b --- /dev/null +++ b/src/cryptoconditions/src/asn/SimpleSha256Condition.h @@ -0,0 +1,40 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#ifndef _SimpleSha256Condition_H_ +#define _SimpleSha256Condition_H_ + + +#include + +/* Including external dependencies */ +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* SimpleSha256Condition */ +typedef struct SimpleSha256Condition { + OCTET_STRING_t fingerprint; + unsigned long cost; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} SimpleSha256Condition_t; + +/* Implementation */ +/* extern asn_TYPE_descriptor_t asn_DEF_cost_3; // (Use -fall-defs-global to expose) */ +extern asn_TYPE_descriptor_t asn_DEF_SimpleSha256Condition; + +#ifdef __cplusplus +} +#endif + +#endif /* _SimpleSha256Condition_H_ */ +#include diff --git a/src/cryptoconditions/src/asn/ThresholdFingerprintContents.c b/src/cryptoconditions/src/asn/ThresholdFingerprintContents.c new file mode 100644 index 00000000000..b4e05ac675d --- /dev/null +++ b/src/cryptoconditions/src/asn/ThresholdFingerprintContents.c @@ -0,0 +1,138 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#include "ThresholdFingerprintContents.h" + +static int +memb_threshold_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + long value; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + value = *(const long *)sptr; + + if((value >= 1 && value <= 65535)) { + /* Constraint check succeeded */ + return 0; + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: constraint failed (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +static asn_TYPE_member_t asn_MBR_subconditions2_3[] = { + { ATF_POINTER, 0, 0, + -1 /* Ambiguous tag (CHOICE?) */, + 0, + &asn_DEF_Condition, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_subconditions2_tags_3[] = { + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_subconditions2_specs_3 = { + sizeof(struct subconditions2), + offsetof(struct subconditions2, _asn_ctx), + 2, /* XER encoding is XMLValueList */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_subconditions2_3 = { + "subconditions2", + "subconditions2", + SET_OF_free, + SET_OF_print, + SET_OF_constraint, + SET_OF_decode_ber, + SET_OF_encode_der, + SET_OF_decode_xer, + SET_OF_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_subconditions2_tags_3, + sizeof(asn_DEF_subconditions2_tags_3) + /sizeof(asn_DEF_subconditions2_tags_3[0]) - 1, /* 1 */ + asn_DEF_subconditions2_tags_3, /* Same as above */ + sizeof(asn_DEF_subconditions2_tags_3) + /sizeof(asn_DEF_subconditions2_tags_3[0]), /* 2 */ + 0, /* No PER visible constraints */ + asn_MBR_subconditions2_3, + 1, /* Single element */ + &asn_SPC_subconditions2_specs_3 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_ThresholdFingerprintContents_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct ThresholdFingerprintContents, threshold), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_NativeInteger, + memb_threshold_constraint_1, + 0, /* PER is not compiled, use -gen-PER */ + 0, + "threshold" + }, + { ATF_NOFLAGS, 0, offsetof(struct ThresholdFingerprintContents, subconditions2), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + 0, + &asn_DEF_subconditions2_3, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "subconditions2" + }, +}; +static const ber_tlv_tag_t asn_DEF_ThresholdFingerprintContents_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_ThresholdFingerprintContents_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* threshold */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* subconditions2 */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_ThresholdFingerprintContents_specs_1 = { + sizeof(struct ThresholdFingerprintContents), + offsetof(struct ThresholdFingerprintContents, _asn_ctx), + asn_MAP_ThresholdFingerprintContents_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn_TYPE_descriptor_t asn_DEF_ThresholdFingerprintContents = { + "ThresholdFingerprintContents", + "ThresholdFingerprintContents", + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_ThresholdFingerprintContents_tags_1, + sizeof(asn_DEF_ThresholdFingerprintContents_tags_1) + /sizeof(asn_DEF_ThresholdFingerprintContents_tags_1[0]), /* 1 */ + asn_DEF_ThresholdFingerprintContents_tags_1, /* Same as above */ + sizeof(asn_DEF_ThresholdFingerprintContents_tags_1) + /sizeof(asn_DEF_ThresholdFingerprintContents_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + asn_MBR_ThresholdFingerprintContents_1, + 2, /* Elements count */ + &asn_SPC_ThresholdFingerprintContents_specs_1 /* Additional specs */ +}; + diff --git a/src/cryptoconditions/src/asn/ThresholdFingerprintContents.h b/src/cryptoconditions/src/asn/ThresholdFingerprintContents.h new file mode 100644 index 00000000000..4d1c4f491a0 --- /dev/null +++ b/src/cryptoconditions/src/asn/ThresholdFingerprintContents.h @@ -0,0 +1,51 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#ifndef _ThresholdFingerprintContents_H_ +#define _ThresholdFingerprintContents_H_ + + +#include + +/* Including external dependencies */ +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct Condition; + +/* ThresholdFingerprintContents */ +typedef struct ThresholdFingerprintContents { + long threshold; + struct subconditions2 { + A_SET_OF(struct Condition) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } subconditions2; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ThresholdFingerprintContents_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_ThresholdFingerprintContents; + +#ifdef __cplusplus +} +#endif + +/* Referred external types */ +#include "Condition.h" + +#endif /* _ThresholdFingerprintContents_H_ */ +#include diff --git a/src/cryptoconditions/src/asn/ThresholdFulfillment.c b/src/cryptoconditions/src/asn/ThresholdFulfillment.c new file mode 100644 index 00000000000..28c5e36a808 --- /dev/null +++ b/src/cryptoconditions/src/asn/ThresholdFulfillment.c @@ -0,0 +1,158 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#include "ThresholdFulfillment.h" + +static asn_TYPE_member_t asn_MBR_subfulfillments_2[] = { + { ATF_POINTER, 0, 0, + -1 /* Ambiguous tag (CHOICE?) */, + 0, + &asn_DEF_Fulfillment, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_subfulfillments_tags_2[] = { + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_subfulfillments_specs_2 = { + sizeof(struct subfulfillments), + offsetof(struct subfulfillments, _asn_ctx), + 2, /* XER encoding is XMLValueList */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_subfulfillments_2 = { + "subfulfillments", + "subfulfillments", + SET_OF_free, + SET_OF_print, + SET_OF_constraint, + SET_OF_decode_ber, + SET_OF_encode_der, + SET_OF_decode_xer, + SET_OF_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_subfulfillments_tags_2, + sizeof(asn_DEF_subfulfillments_tags_2) + /sizeof(asn_DEF_subfulfillments_tags_2[0]) - 1, /* 1 */ + asn_DEF_subfulfillments_tags_2, /* Same as above */ + sizeof(asn_DEF_subfulfillments_tags_2) + /sizeof(asn_DEF_subfulfillments_tags_2[0]), /* 2 */ + 0, /* No PER visible constraints */ + asn_MBR_subfulfillments_2, + 1, /* Single element */ + &asn_SPC_subfulfillments_specs_2 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_subconditions_4[] = { + { ATF_POINTER, 0, 0, + -1 /* Ambiguous tag (CHOICE?) */, + 0, + &asn_DEF_Condition, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "" + }, +}; +static const ber_tlv_tag_t asn_DEF_subconditions_tags_4[] = { + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)) +}; +static asn_SET_OF_specifics_t asn_SPC_subconditions_specs_4 = { + sizeof(struct subconditions), + offsetof(struct subconditions, _asn_ctx), + 2, /* XER encoding is XMLValueList */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_subconditions_4 = { + "subconditions", + "subconditions", + SET_OF_free, + SET_OF_print, + SET_OF_constraint, + SET_OF_decode_ber, + SET_OF_encode_der, + SET_OF_decode_xer, + SET_OF_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_subconditions_tags_4, + sizeof(asn_DEF_subconditions_tags_4) + /sizeof(asn_DEF_subconditions_tags_4[0]) - 1, /* 1 */ + asn_DEF_subconditions_tags_4, /* Same as above */ + sizeof(asn_DEF_subconditions_tags_4) + /sizeof(asn_DEF_subconditions_tags_4[0]), /* 2 */ + 0, /* No PER visible constraints */ + asn_MBR_subconditions_4, + 1, /* Single element */ + &asn_SPC_subconditions_specs_4 /* Additional specs */ +}; + +static asn_TYPE_member_t asn_MBR_ThresholdFulfillment_1[] = { + { ATF_NOFLAGS, 0, offsetof(struct ThresholdFulfillment, subfulfillments), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + 0, + &asn_DEF_subfulfillments_2, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "subfulfillments" + }, + { ATF_NOFLAGS, 0, offsetof(struct ThresholdFulfillment, subconditions), + (ASN_TAG_CLASS_CONTEXT | (1 << 2)), + 0, + &asn_DEF_subconditions_4, + 0, /* Defer constraints checking to the member type */ + 0, /* PER is not compiled, use -gen-PER */ + 0, + "subconditions" + }, +}; +static const ber_tlv_tag_t asn_DEF_ThresholdFulfillment_tags_1[] = { + (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) +}; +static const asn_TYPE_tag2member_t asn_MAP_ThresholdFulfillment_tag2el_1[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* subfulfillments */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* subconditions */ +}; +static asn_SEQUENCE_specifics_t asn_SPC_ThresholdFulfillment_specs_1 = { + sizeof(struct ThresholdFulfillment), + offsetof(struct ThresholdFulfillment, _asn_ctx), + asn_MAP_ThresholdFulfillment_tag2el_1, + 2, /* Count of tags in the map */ + 0, 0, 0, /* Optional elements (not needed) */ + -1, /* Start extensions */ + -1 /* Stop extensions */ +}; +asn_TYPE_descriptor_t asn_DEF_ThresholdFulfillment = { + "ThresholdFulfillment", + "ThresholdFulfillment", + SEQUENCE_free, + SEQUENCE_print, + SEQUENCE_constraint, + SEQUENCE_decode_ber, + SEQUENCE_encode_der, + SEQUENCE_decode_xer, + SEQUENCE_encode_xer, + 0, 0, /* No PER support, use "-gen-PER" to enable */ + 0, /* Use generic outmost tag fetcher */ + asn_DEF_ThresholdFulfillment_tags_1, + sizeof(asn_DEF_ThresholdFulfillment_tags_1) + /sizeof(asn_DEF_ThresholdFulfillment_tags_1[0]), /* 1 */ + asn_DEF_ThresholdFulfillment_tags_1, /* Same as above */ + sizeof(asn_DEF_ThresholdFulfillment_tags_1) + /sizeof(asn_DEF_ThresholdFulfillment_tags_1[0]), /* 1 */ + 0, /* No PER visible constraints */ + asn_MBR_ThresholdFulfillment_1, + 2, /* Elements count */ + &asn_SPC_ThresholdFulfillment_specs_1 /* Additional specs */ +}; + diff --git a/src/cryptoconditions/src/asn/ThresholdFulfillment.h b/src/cryptoconditions/src/asn/ThresholdFulfillment.h new file mode 100644 index 00000000000..e00ae5f2b3d --- /dev/null +++ b/src/cryptoconditions/src/asn/ThresholdFulfillment.h @@ -0,0 +1,57 @@ +/* + * Generated by asn1c-0.9.28 (http://lionet.info/asn1c) + * From ASN.1 module "Crypto-Conditions" + * found in "CryptoConditions.asn" + */ + +#ifndef _ThresholdFulfillment_H_ +#define _ThresholdFulfillment_H_ + + +#include + +/* Including external dependencies */ +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Forward declarations */ +struct Fulfillment; +struct Condition; + +/* ThresholdFulfillment */ +typedef struct ThresholdFulfillment { + struct subfulfillments { + A_SET_OF(struct Fulfillment) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } subfulfillments; + struct subconditions { + A_SET_OF(struct Condition) list; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } subconditions; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} ThresholdFulfillment_t; + +/* Implementation */ +extern asn_TYPE_descriptor_t asn_DEF_ThresholdFulfillment; + +#ifdef __cplusplus +} +#endif + +/* Referred external types */ +#include "Fulfillment.h" +#include "Condition.h" + +#endif /* _ThresholdFulfillment_H_ */ +#include diff --git a/src/cryptoconditions/src/asn/asn_SET_OF.c b/src/cryptoconditions/src/asn/asn_SET_OF.c new file mode 100644 index 00000000000..944f2cb8ad7 --- /dev/null +++ b/src/cryptoconditions/src/asn/asn_SET_OF.c @@ -0,0 +1,88 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * Add another element into the set. + */ +int +asn_set_add(void *asn_set_of_x, void *ptr) { + asn_anonymous_set_ *as = _A_SET_FROM_VOID(asn_set_of_x); + + if(as == 0 || ptr == 0) { + errno = EINVAL; /* Invalid arguments */ + return -1; + } + + /* + * Make sure there's enough space to insert an element. + */ + if(as->count == as->size) { + int _newsize = as->size ? (as->size << 1) : 4; + void *_new_arr; + _new_arr = REALLOC(as->array, _newsize * sizeof(as->array[0])); + if(_new_arr) { + as->array = (void **)_new_arr; + as->size = _newsize; + } else { + /* ENOMEM */ + return -1; + } + } + + as->array[as->count++] = ptr; + + return 0; +} + +void +asn_set_del(void *asn_set_of_x, int number, int _do_free) { + asn_anonymous_set_ *as = _A_SET_FROM_VOID(asn_set_of_x); + + if(as) { + void *ptr; + if(number < 0 || number >= as->count) + return; + + if(_do_free && as->free) { + ptr = as->array[number]; + } else { + ptr = 0; + } + + as->array[number] = as->array[--as->count]; + + /* + * Invoke the third-party function only when the state + * of the parent structure is consistent. + */ + if(ptr) as->free(ptr); + } +} + +/* + * Free the contents of the set, do not free the set itself. + */ +void +asn_set_empty(void *asn_set_of_x) { + asn_anonymous_set_ *as = _A_SET_FROM_VOID(asn_set_of_x); + + if(as) { + if(as->array) { + if(as->free) { + while(as->count--) + as->free(as->array[as->count]); + } + FREEMEM(as->array); + as->array = 0; + } + as->count = 0; + as->size = 0; + } + +} + diff --git a/src/cryptoconditions/src/asn/asn_SET_OF.h b/src/cryptoconditions/src/asn/asn_SET_OF.h new file mode 100644 index 00000000000..7edf14b51b9 --- /dev/null +++ b/src/cryptoconditions/src/asn/asn_SET_OF.h @@ -0,0 +1,62 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_SET_OF_H +#define ASN_SET_OF_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define A_SET_OF(type) \ + struct { \ + type **array; \ + int count; /* Meaningful size */ \ + int size; /* Allocated size */ \ + void (*free)(type *); \ + } + +#define ASN_SET_ADD(headptr, ptr) \ + asn_set_add((headptr), (ptr)) + +/******************************************* + * Implementation of the SET OF structure. + */ + +/* + * Add another structure into the set by its pointer. + * RETURN VALUES: + * 0 for success and -1/errno for failure. + */ +int asn_set_add(void *asn_set_of_x, void *ptr); + +/* + * Delete the element from the set by its number (base 0). + * This is a constant-time operation. The order of elements before the + * deleted ones is guaranteed, the order of elements after the deleted + * one is NOT guaranteed. + * If _do_free is given AND the (*free) is initialized, the element + * will be freed using the custom (*free) function as well. + */ +void asn_set_del(void *asn_set_of_x, int number, int _do_free); + +/* + * Empty the contents of the set. Will free the elements, if (*free) is given. + * Will NOT free the set itself. + */ +void asn_set_empty(void *asn_set_of_x); + +/* + * Cope with different conversions requirements to/from void in C and C++. + * This is mostly useful for support library. + */ +typedef A_SET_OF(void) asn_anonymous_set_; +#define _A_SET_FROM_VOID(ptr) ((asn_anonymous_set_ *)(ptr)) +#define _A_CSET_FROM_VOID(ptr) ((const asn_anonymous_set_ *)(ptr)) + +#ifdef __cplusplus +} +#endif + +#endif /* ASN_SET_OF_H */ diff --git a/src/cryptoconditions/src/asn/asn_application.h b/src/cryptoconditions/src/asn/asn_application.h new file mode 100644 index 00000000000..71e9ba61b2e --- /dev/null +++ b/src/cryptoconditions/src/asn/asn_application.h @@ -0,0 +1,47 @@ +/*- + * Copyright (c) 2004, 2006 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * Application-level ASN.1 callbacks. + */ +#ifndef ASN_APPLICATION_H +#define ASN_APPLICATION_H + +#include "asn_system.h" /* for platform-dependent types */ +#include "asn_codecs.h" /* for ASN.1 codecs specifics */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Generic type of an application-defined callback to return various + * types of data to the application. + * EXPECTED RETURN VALUES: + * -1: Failed to consume bytes. Abort the mission. + * Non-negative return values indicate success, and ignored. + */ +typedef int (asn_app_consume_bytes_f)(const void *buffer, size_t size, + void *application_specific_key); + +/* + * A callback of this type is called whenever constraint validation fails + * on some ASN.1 type. See "constraints.h" for more details on constraint + * validation. + * This callback specifies a descriptor of the ASN.1 type which failed + * the constraint check, as well as human readable message on what + * particular constraint has failed. + */ +typedef void (asn_app_constraint_failed_f)(void *application_specific_key, + struct asn_TYPE_descriptor_s *type_descriptor_which_failed, + const void *structure_which_failed_ptr, + const char *error_message_format, ...) GCC_PRINTFLIKE(4, 5); + +#ifdef __cplusplus +} +#endif + +#include "constr_TYPE.h" /* for asn_TYPE_descriptor_t */ + +#endif /* ASN_APPLICATION_H */ diff --git a/src/cryptoconditions/src/asn/asn_codecs.h b/src/cryptoconditions/src/asn/asn_codecs.h new file mode 100644 index 00000000000..4b2a294293c --- /dev/null +++ b/src/cryptoconditions/src/asn/asn_codecs.h @@ -0,0 +1,109 @@ +/*- + * Copyright (c) 2003, 2004, 2005 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_CODECS_H +#define ASN_CODECS_H + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* + * This structure defines a set of parameters that may be passed + * to every ASN.1 encoder or decoder function. + * WARNING: if max_stack_size member is set, and you are calling the + * function pointers of the asn_TYPE_descriptor_t directly, + * this structure must be ALLOCATED ON THE STACK! + * If you can't always satisfy this requirement, use ber_decode(), + * xer_decode() and uper_decode() functions instead. + */ +typedef struct asn_codec_ctx_s { + /* + * Limit the decoder routines to use no (much) more stack than a given + * number of bytes. Most of decoders are stack-based, and this + * would protect against stack overflows if the number of nested + * encodings is high. + * The OCTET STRING, BIT STRING and ANY BER decoders are heap-based, + * and are safe from this kind of overflow. + * A value from getrlimit(RLIMIT_STACK) may be used to initialize + * this variable. Be careful in multithreaded environments, as the + * stack size is rather limited. + */ + size_t max_stack_size; /* 0 disables stack bounds checking */ +} asn_codec_ctx_t; + +/* + * Type of the return value of the encoding functions (der_encode, xer_encode). + */ +typedef struct asn_enc_rval_s { + /* + * Number of bytes encoded. + * -1 indicates failure to encode the structure. + * In this case, the members below this one are meaningful. + */ + ssize_t encoded; + + /* + * Members meaningful when (encoded == -1), for post mortem analysis. + */ + + /* Type which cannot be encoded */ + struct asn_TYPE_descriptor_s *failed_type; + + /* Pointer to the structure of that type */ + void *structure_ptr; +} asn_enc_rval_t; +#define ASN__ENCODE_FAILED do { \ + asn_enc_rval_t tmp_error; \ + tmp_error.encoded = -1; \ + tmp_error.failed_type = td; \ + tmp_error.structure_ptr = sptr; \ + ASN_DEBUG("Failed to encode element %s", td ? td->name : ""); \ + return tmp_error; \ +} while(0) +#define ASN__ENCODED_OK(rval) do { \ + rval.structure_ptr = 0; \ + rval.failed_type = 0; \ + return rval; \ +} while(0) + +/* + * Type of the return value of the decoding functions (ber_decode, xer_decode) + * + * Please note that the number of consumed bytes is ALWAYS meaningful, + * even if code==RC_FAIL. This is to indicate the number of successfully + * decoded bytes, hence providing a possibility to fail with more diagnostics + * (i.e., print the offending remainder of the buffer). + */ +enum asn_dec_rval_code_e { + RC_OK, /* Decoded successfully */ + RC_WMORE, /* More data expected, call again */ + RC_FAIL /* Failure to decode data */ +}; +typedef struct asn_dec_rval_s { + enum asn_dec_rval_code_e code; /* Result code */ + size_t consumed; /* Number of bytes consumed */ +} asn_dec_rval_t; +#define ASN__DECODE_FAILED do { \ + asn_dec_rval_t tmp_error; \ + tmp_error.code = RC_FAIL; \ + tmp_error.consumed = 0; \ + ASN_DEBUG("Failed to decode element %s", td ? td->name : ""); \ + return tmp_error; \ +} while(0) +#define ASN__DECODE_STARVED do { \ + asn_dec_rval_t tmp_error; \ + tmp_error.code = RC_WMORE; \ + tmp_error.consumed = 0; \ + return tmp_error; \ +} while(0) + +#ifdef __cplusplus +} +#endif + +#endif /* ASN_CODECS_H */ diff --git a/src/cryptoconditions/src/asn/asn_codecs_prim.c b/src/cryptoconditions/src/asn/asn_codecs_prim.c new file mode 100644 index 00000000000..426339c94fa --- /dev/null +++ b/src/cryptoconditions/src/asn/asn_codecs_prim.c @@ -0,0 +1,312 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * Decode an always-primitive type. + */ +asn_dec_rval_t +ber_decode_primitive(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, + void **sptr, const void *buf_ptr, size_t size, int tag_mode) { + ASN__PRIMITIVE_TYPE_t *st = (ASN__PRIMITIVE_TYPE_t *)*sptr; + asn_dec_rval_t rval; + ber_tlv_len_t length = 0; /* =0 to avoid [incorrect] warning. */ + + /* + * If the structure is not there, allocate it. + */ + if(st == NULL) { + st = (ASN__PRIMITIVE_TYPE_t *)CALLOC(1, sizeof(*st)); + if(st == NULL) ASN__DECODE_FAILED; + *sptr = (void *)st; + } + + ASN_DEBUG("Decoding %s as plain primitive (tm=%d)", + td->name, tag_mode); + + /* + * Check tags and extract value length. + */ + rval = ber_check_tags(opt_codec_ctx, td, 0, buf_ptr, size, + tag_mode, 0, &length, 0); + if(rval.code != RC_OK) + return rval; + + ASN_DEBUG("%s length is %d bytes", td->name, (int)length); + + /* + * Make sure we have this length. + */ + buf_ptr = ((const char *)buf_ptr) + rval.consumed; + size -= rval.consumed; + if(length > (ber_tlv_len_t)size) { + rval.code = RC_WMORE; + rval.consumed = 0; + return rval; + } + + st->size = (int)length; + /* The following better be optimized away. */ + if(sizeof(st->size) != sizeof(length) + && (ber_tlv_len_t)st->size != length) { + st->size = 0; + ASN__DECODE_FAILED; + } + + st->buf = (uint8_t *)MALLOC(length + 1); + if(!st->buf) { + st->size = 0; + ASN__DECODE_FAILED; + } + + memcpy(st->buf, buf_ptr, length); + st->buf[length] = '\0'; /* Just in case */ + + rval.code = RC_OK; + rval.consumed += length; + + ASN_DEBUG("Took %ld/%ld bytes to encode %s", + (long)rval.consumed, + (long)length, td->name); + + return rval; +} + +/* + * Encode an always-primitive type using DER. + */ +asn_enc_rval_t +der_encode_primitive(asn_TYPE_descriptor_t *td, void *sptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t erval; + ASN__PRIMITIVE_TYPE_t *st = (ASN__PRIMITIVE_TYPE_t *)sptr; + + ASN_DEBUG("%s %s as a primitive type (tm=%d)", + cb?"Encoding":"Estimating", td->name, tag_mode); + + erval.encoded = der_write_tags(td, st->size, tag_mode, 0, tag, + cb, app_key); + ASN_DEBUG("%s wrote tags %d", td->name, (int)erval.encoded); + if(erval.encoded == -1) { + erval.failed_type = td; + erval.structure_ptr = sptr; + return erval; + } + + if(cb && st->buf) { + if(cb(st->buf, st->size, app_key) < 0) { + erval.encoded = -1; + erval.failed_type = td; + erval.structure_ptr = sptr; + return erval; + } + } else { + assert(st->buf || st->size == 0); + } + + erval.encoded += st->size; + ASN__ENCODED_OK(erval); +} + +void +ASN__PRIMITIVE_TYPE_free(asn_TYPE_descriptor_t *td, void *sptr, + int contents_only) { + ASN__PRIMITIVE_TYPE_t *st = (ASN__PRIMITIVE_TYPE_t *)sptr; + + if(!td || !sptr) + return; + + ASN_DEBUG("Freeing %s as a primitive type", td->name); + + if(st->buf) + FREEMEM(st->buf); + + if(!contents_only) + FREEMEM(st); +} + + +/* + * Local internal type passed around as an argument. + */ +struct xdp_arg_s { + asn_TYPE_descriptor_t *type_descriptor; + void *struct_key; + xer_primitive_body_decoder_f *prim_body_decoder; + int decoded_something; + int want_more; +}; + +/* + * Since some kinds of primitive values can be encoded using value-specific + * tags (, , etc), the primitive decoder must + * be supplied with such tags to parse them as needed. + */ +static int +xer_decode__unexpected_tag(void *key, const void *chunk_buf, size_t chunk_size) { + struct xdp_arg_s *arg = (struct xdp_arg_s *)key; + enum xer_pbd_rval bret; + + /* + * The chunk_buf is guaranteed to start at '<'. + */ + assert(chunk_size && ((const char *)chunk_buf)[0] == 0x3c); + + /* + * Decoding was performed once already. Prohibit doing it again. + */ + if(arg->decoded_something) + return -1; + + bret = arg->prim_body_decoder(arg->type_descriptor, + arg->struct_key, chunk_buf, chunk_size); + switch(bret) { + case XPBD_SYSTEM_FAILURE: + case XPBD_DECODER_LIMIT: + case XPBD_BROKEN_ENCODING: + break; + case XPBD_BODY_CONSUMED: + /* Tag decoded successfully */ + arg->decoded_something = 1; + /* Fall through */ + case XPBD_NOT_BODY_IGNORE: /* Safe to proceed further */ + return 0; + } + + return -1; +} + +static ssize_t +xer_decode__primitive_body(void *key, const void *chunk_buf, size_t chunk_size, int have_more) { + struct xdp_arg_s *arg = (struct xdp_arg_s *)key; + enum xer_pbd_rval bret; + size_t lead_wsp_size; + + if(arg->decoded_something) { + if(xer_whitespace_span(chunk_buf, chunk_size) == chunk_size) { + /* + * Example: + * "123 " + * ^- chunk_buf position. + */ + return chunk_size; + } + /* + * Decoding was done once already. Prohibit doing it again. + */ + return -1; + } + + if(!have_more) { + /* + * If we've received something like "1", we can't really + * tell whether it is really `1` or `123`, until we know + * that there is no more data coming. + * The have_more argument will be set to 1 once something + * like this is available to the caller of this callback: + * "1want_more = 1; + return -1; + } + + lead_wsp_size = xer_whitespace_span(chunk_buf, chunk_size); + chunk_buf = (const char *)chunk_buf + lead_wsp_size; + chunk_size -= lead_wsp_size; + + bret = arg->prim_body_decoder(arg->type_descriptor, + arg->struct_key, chunk_buf, chunk_size); + switch(bret) { + case XPBD_SYSTEM_FAILURE: + case XPBD_DECODER_LIMIT: + case XPBD_BROKEN_ENCODING: + break; + case XPBD_BODY_CONSUMED: + /* Tag decoded successfully */ + arg->decoded_something = 1; + /* Fall through */ + case XPBD_NOT_BODY_IGNORE: /* Safe to proceed further */ + return lead_wsp_size + chunk_size; + } + + return -1; +} + + +asn_dec_rval_t +xer_decode_primitive(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, + void **sptr, + size_t struct_size, + const char *opt_mname, + const void *buf_ptr, size_t size, + xer_primitive_body_decoder_f *prim_body_decoder +) { + const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; + asn_struct_ctx_t s_ctx; + struct xdp_arg_s s_arg; + asn_dec_rval_t rc; + + /* + * Create the structure if does not exist. + */ + if(!*sptr) { + *sptr = CALLOC(1, struct_size); + if(!*sptr) ASN__DECODE_FAILED; + } + + memset(&s_ctx, 0, sizeof(s_ctx)); + s_arg.type_descriptor = td; + s_arg.struct_key = *sptr; + s_arg.prim_body_decoder = prim_body_decoder; + s_arg.decoded_something = 0; + s_arg.want_more = 0; + + rc = xer_decode_general(opt_codec_ctx, &s_ctx, &s_arg, + xml_tag, buf_ptr, size, + xer_decode__unexpected_tag, xer_decode__primitive_body); + switch(rc.code) { + case RC_OK: + if(!s_arg.decoded_something) { + char ch; + ASN_DEBUG("Primitive body is not recognized, " + "supplying empty one"); + /* + * Decoding opportunity has come and gone. + * Where's the result? + * Try to feed with empty body, see if it eats it. + */ + if(prim_body_decoder(s_arg.type_descriptor, + s_arg.struct_key, &ch, 0) + != XPBD_BODY_CONSUMED) { + /* + * This decoder does not like empty stuff. + */ + ASN__DECODE_FAILED; + } + } + break; + case RC_WMORE: + /* + * Redo the whole thing later. + * We don't have a context to save intermediate parsing state. + */ + rc.consumed = 0; + break; + case RC_FAIL: + rc.consumed = 0; + if(s_arg.want_more) + rc.code = RC_WMORE; + else + ASN__DECODE_FAILED; + break; + } + return rc; +} + diff --git a/src/cryptoconditions/src/asn/asn_codecs_prim.h b/src/cryptoconditions/src/asn/asn_codecs_prim.h new file mode 100644 index 00000000000..0f683fdd0ac --- /dev/null +++ b/src/cryptoconditions/src/asn/asn_codecs_prim.h @@ -0,0 +1,53 @@ +/*- + * Copyright (c) 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN_CODECS_PRIM_H +#define ASN_CODECS_PRIM_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct ASN__PRIMITIVE_TYPE_s { + uint8_t *buf; /* Buffer with consecutive primitive encoding bytes */ + int size; /* Size of the buffer */ +} ASN__PRIMITIVE_TYPE_t; /* Do not use this type directly! */ + +asn_struct_free_f ASN__PRIMITIVE_TYPE_free; +ber_type_decoder_f ber_decode_primitive; +der_type_encoder_f der_encode_primitive; + +/* + * A callback specification for the xer_decode_primitive() function below. + */ +enum xer_pbd_rval { + XPBD_SYSTEM_FAILURE, /* System failure (memory shortage, etc) */ + XPBD_DECODER_LIMIT, /* Hit some decoder limitation or deficiency */ + XPBD_BROKEN_ENCODING, /* Encoding of a primitive body is broken */ + XPBD_NOT_BODY_IGNORE, /* Not a body format, but safe to ignore */ + XPBD_BODY_CONSUMED /* Body is recognized and consumed */ +}; +typedef enum xer_pbd_rval (xer_primitive_body_decoder_f) + (asn_TYPE_descriptor_t *td, void *struct_ptr, + const void *chunk_buf, size_t chunk_size); + +/* + * Specific function to decode simple primitive types. + * Also see xer_decode_general() in xer_decoder.h + */ +asn_dec_rval_t xer_decode_primitive(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *type_descriptor, + void **struct_ptr, size_t struct_size, + const char *opt_mname, + const void *buf_ptr, size_t size, + xer_primitive_body_decoder_f *prim_body_decoder +); + +#ifdef __cplusplus +} +#endif + +#endif /* ASN_CODECS_PRIM_H */ diff --git a/src/cryptoconditions/src/asn/asn_internal.h b/src/cryptoconditions/src/asn/asn_internal.h new file mode 100644 index 00000000000..9c94ca6c3b7 --- /dev/null +++ b/src/cryptoconditions/src/asn/asn_internal.h @@ -0,0 +1,128 @@ +/*- + * Copyright (c) 2003, 2004, 2005, 2007 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * Declarations internally useful for the ASN.1 support code. + */ +#ifndef ASN_INTERNAL_H +#define ASN_INTERNAL_H + +#include "asn_application.h" /* Application-visible API */ + +#ifndef __NO_ASSERT_H__ /* Include assert.h only for internal use. */ +#include /* for assert() macro */ +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Environment version might be used to avoid running with the old library */ +#define ASN1C_ENVIRONMENT_VERSION 923 /* Compile-time version */ +int get_asn1c_environment_version(void); /* Run-time version */ + +#define CALLOC(nmemb, size) calloc(nmemb, size) +#define MALLOC(size) malloc(size) +#define REALLOC(oldptr, size) realloc(oldptr, size) +#define FREEMEM(ptr) free(ptr) + +#define asn_debug_indent 0 +#define ASN_DEBUG_INDENT_ADD(i) do{}while(0) + +/* + * A macro for debugging the ASN.1 internals. + * You may enable or override it. + */ +#ifndef ASN_DEBUG /* If debugging code is not defined elsewhere... */ +#if EMIT_ASN_DEBUG == 1 /* And it was asked to emit this code... */ +#ifdef __GNUC__ +#ifdef ASN_THREAD_SAFE +/* Thread safety requires sacrifice in output indentation: + * Retain empty definition of ASN_DEBUG_INDENT_ADD. */ +#else /* !ASN_THREAD_SAFE */ +#undef ASN_DEBUG_INDENT_ADD +#undef asn_debug_indent +int asn_debug_indent; +#define ASN_DEBUG_INDENT_ADD(i) do { asn_debug_indent += i; } while(0) +#endif /* ASN_THREAD_SAFE */ +#define ASN_DEBUG(fmt, args...) do { \ + int adi = asn_debug_indent; \ + while(adi--) fprintf(stderr, " "); \ + fprintf(stderr, fmt, ##args); \ + fprintf(stderr, " (%s:%d)\n", \ + __FILE__, __LINE__); \ + } while(0) +#else /* !__GNUC__ */ +void ASN_DEBUG_f(const char *fmt, ...); +#define ASN_DEBUG ASN_DEBUG_f +#endif /* __GNUC__ */ +#else /* EMIT_ASN_DEBUG != 1 */ +static void ASN_DEBUG(const char *fmt, ...) { (void)fmt; } +#endif /* EMIT_ASN_DEBUG */ +#endif /* ASN_DEBUG */ + +/* + * Invoke the application-supplied callback and fail, if something is wrong. + */ +#define ASN__E_cbc(buf, size) (cb((buf), (size), app_key) < 0) +#define ASN__E_CALLBACK(foo) do { \ + if(foo) goto cb_failed; \ + } while(0) +#define ASN__CALLBACK(buf, size) \ + ASN__E_CALLBACK(ASN__E_cbc(buf, size)) +#define ASN__CALLBACK2(buf1, size1, buf2, size2) \ + ASN__E_CALLBACK(ASN__E_cbc(buf1, size1) || ASN__E_cbc(buf2, size2)) +#define ASN__CALLBACK3(buf1, size1, buf2, size2, buf3, size3) \ + ASN__E_CALLBACK(ASN__E_cbc(buf1, size1) \ + || ASN__E_cbc(buf2, size2) \ + || ASN__E_cbc(buf3, size3)) + +#define ASN__TEXT_INDENT(nl, level) do { \ + int tmp_level = (level); \ + int tmp_nl = ((nl) != 0); \ + int tmp_i; \ + if(tmp_nl) ASN__CALLBACK("\n", 1); \ + if(tmp_level < 0) tmp_level = 0; \ + for(tmp_i = 0; tmp_i < tmp_level; tmp_i++) \ + ASN__CALLBACK(" ", 4); \ + er.encoded += tmp_nl + 4 * tmp_level; \ + } while(0) + +#define _i_INDENT(nl) do { \ + int tmp_i; \ + if((nl) && cb("\n", 1, app_key) < 0) \ + return -1; \ + for(tmp_i = 0; tmp_i < ilevel; tmp_i++) \ + if(cb(" ", 4, app_key) < 0) \ + return -1; \ + } while(0) + +/* + * Check stack against overflow, if limit is set. + */ +#define ASN__DEFAULT_STACK_MAX (30000) +static int __attribute__((unused)) +ASN__STACK_OVERFLOW_CHECK(asn_codec_ctx_t *ctx) { + if(ctx && ctx->max_stack_size) { + + /* ctx MUST be allocated on the stack */ + ptrdiff_t usedstack = ((char *)ctx - (char *)&ctx); + if(usedstack > 0) usedstack = -usedstack; /* grows up! */ + + /* double negative required to avoid int wrap-around */ + if(usedstack < -(ptrdiff_t)ctx->max_stack_size) { + ASN_DEBUG("Stack limit %ld reached", + (long)ctx->max_stack_size); + return -1; + } + } + return 0; +} + +#ifdef __cplusplus +} +#endif + +#endif /* ASN_INTERNAL_H */ diff --git a/src/cryptoconditions/src/asn/asn_system.h b/src/cryptoconditions/src/asn/asn_system.h new file mode 100644 index 00000000000..71596fc342a --- /dev/null +++ b/src/cryptoconditions/src/asn/asn_system.h @@ -0,0 +1,138 @@ +/*- + * Copyright (c) 2003, 2004, 2007 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * Miscellaneous system-dependent types. + */ +#ifndef ASN_SYSTEM_H +#define ASN_SYSTEM_H + +#ifdef CRYPTOCONDITIONS_HAVE_CONFIG_H +#include "cryptoconditions-config.h" +#endif + +#ifndef _BSD_SOURCE +#define _BSD_SOURCE /* for snprintf() on some linux systems */ +#endif + +#include /* For snprintf(3) */ +#include /* For *alloc(3) */ +#include /* For memcpy(3) */ +#include /* For size_t */ +#include /* For LONG_MAX */ +#include /* For va_start */ +#include /* for offsetof and ptrdiff_t */ + +#ifdef HAVE_ALLOCA_H +#include /* For alloca(3) */ +#endif + +#ifdef _WIN32 + +#include +#define snprintf _snprintf +#define vsnprintf _vsnprintf + +/* To avoid linking with ws2_32.lib, here's the definition of ntohl() */ +#define sys_ntohl(l) ((((l) << 24) & 0xff000000) \ + | (((l) << 8) & 0xff0000) \ + | (((l) >> 8) & 0xff00) \ + | ((l >> 24) & 0xff)) + +#ifdef _MSC_VER /* MSVS.Net */ +#ifndef __cplusplus +#define inline __inline +#endif +#ifndef ASSUMESTDTYPES /* Standard types have been defined elsewhere */ +#define ssize_t SSIZE_T +typedef char int8_t; +typedef short int16_t; +typedef int int32_t; +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +#endif /* ASSUMESTDTYPES */ +#define WIN32_LEAN_AND_MEAN +#include +#include +#define isnan _isnan +#define finite _finite +#define copysign _copysign +#define ilogb _logb +#else /* !_MSC_VER */ +#include +#endif /* _MSC_VER */ + +#else /* !_WIN32 */ + +#if defined(__vxworks) +#include +#else /* !defined(__vxworks) */ + +#include /* C99 specifies this file */ +/* + * 1. Earlier FreeBSD version didn't have , + * but was present. + * 2. Sun Solaris requires for alloca(3), + * but does not have . + */ +#if (!defined(__FreeBSD__) || !defined(_SYS_INTTYPES_H_)) +#if defined(sun) +#include /* For alloca(3) */ +#include /* for finite(3) */ +#elif defined(__hpux) +#ifdef __GNUC__ +#include /* For alloca(3) */ +#else /* !__GNUC__ */ +#define inline +#endif /* __GNUC__ */ +#else +#include /* SUSv2+ and C99 specify this file, for uintXX_t */ +#endif /* defined(sun) */ +#endif + +#include /* for ntohl() */ +#define sys_ntohl(foo) ntohl(foo) + +#endif /* defined(__vxworks) */ + +#endif /* _WIN32 */ + +#if __GNUC__ >= 3 +#ifndef GCC_PRINTFLIKE +#define GCC_PRINTFLIKE(fmt,var) __attribute__((format(printf,fmt,var))) +#endif +#ifndef GCC_NOTUSED +#define GCC_NOTUSED __attribute__((unused)) +#endif +#else +#ifndef GCC_PRINTFLIKE +#define GCC_PRINTFLIKE(fmt,var) /* nothing */ +#endif +#ifndef GCC_NOTUSED +#define GCC_NOTUSED +#endif +#endif + +/* Figure out if thread safety is requested */ +#if !defined(ASN_THREAD_SAFE) && (defined(THREAD_SAFE) || defined(_REENTRANT)) +#define ASN_THREAD_SAFE +#endif /* Thread safety */ + +#ifndef offsetof /* If not defined by */ +#define offsetof(s, m) ((ptrdiff_t)&(((s *)0)->m) - (ptrdiff_t)((s *)0)) +#endif /* offsetof */ + + +//#ifndef MIN /* Suitable for comparing primitive types (integers) */ +//#if defined(__GNUC__) +//#define MIN(a,b) ({ __typeof a _a = a; __typeof b _b = b; \ +// ((_a)<(_b)?(_a):(_b)); }) +//#else /* !__GNUC__ */ +//#define MIN(a,b) ((a)<(b)?(a):(b)) /* Unsafe variant */ +//#endif /* __GNUC__ */ +//#endif /* MIN */ + +#endif /* ASN_SYSTEM_H */ diff --git a/src/cryptoconditions/src/asn/ber_decoder.c b/src/cryptoconditions/src/asn/ber_decoder.c new file mode 100644 index 00000000000..b3a6329e063 --- /dev/null +++ b/src/cryptoconditions/src/asn/ber_decoder.c @@ -0,0 +1,283 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include + +#undef ADVANCE +#define ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + ptr = ((const char *)ptr) + num; \ + size -= num; \ + consumed_myself += num; \ + } while(0) +#undef RETURN +#define RETURN(_code) do { \ + asn_dec_rval_t rval; \ + rval.code = _code; \ + if(opt_ctx) opt_ctx->step = step; /* Save context */ \ + if(_code == RC_OK || opt_ctx) \ + rval.consumed = consumed_myself; \ + else \ + rval.consumed = 0; /* Context-free */ \ + return rval; \ + } while(0) + +/* + * The BER decoder of any type. + */ +asn_dec_rval_t +ber_decode(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *type_descriptor, + void **struct_ptr, const void *ptr, size_t size) { + asn_codec_ctx_t s_codec_ctx; + + /* + * Stack checker requires that the codec context + * must be allocated on the stack. + */ + if(opt_codec_ctx) { + if(opt_codec_ctx->max_stack_size) { + s_codec_ctx = *opt_codec_ctx; + opt_codec_ctx = &s_codec_ctx; + } + } else { + /* If context is not given, be security-conscious anyway */ + memset(&s_codec_ctx, 0, sizeof(s_codec_ctx)); + s_codec_ctx.max_stack_size = ASN__DEFAULT_STACK_MAX; + opt_codec_ctx = &s_codec_ctx; + } + + /* + * Invoke type-specific decoder. + */ + return type_descriptor->ber_decoder(opt_codec_ctx, type_descriptor, + struct_ptr, /* Pointer to the destination structure */ + ptr, size, /* Buffer and its size */ + 0 /* Default tag mode is 0 */ + ); +} + +/* + * Check the set of >> tags matches the definition. + */ +asn_dec_rval_t +ber_check_tags(asn_codec_ctx_t *opt_codec_ctx, + asn_TYPE_descriptor_t *td, asn_struct_ctx_t *opt_ctx, + const void *ptr, size_t size, int tag_mode, int last_tag_form, + ber_tlv_len_t *last_length, int *opt_tlv_form) { + ssize_t consumed_myself = 0; + ssize_t tag_len; + ssize_t len_len; + ber_tlv_tag_t tlv_tag; + ber_tlv_len_t tlv_len; + ber_tlv_len_t limit_len = -1; + int expect_00_terminators = 0; + int tlv_constr = -1; /* If CHOICE, opt_tlv_form is not given */ + int step = opt_ctx ? opt_ctx->step : 0; /* Where we left previously */ + int tagno; + + /* + * Make sure we didn't exceed the maximum stack size. + */ + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + RETURN(RC_FAIL); + + /* + * So what does all this implicit skip stuff mean? + * Imagine two types, + * A ::= [5] IMPLICIT T + * B ::= [2] EXPLICIT T + * Where T is defined as + * T ::= [4] IMPLICIT SEQUENCE { ... } + * + * Let's say, we are starting to decode type A, given the + * following TLV stream: <5> <0>. What does this mean? + * It means that the type A contains type T which is, + * in turn, empty. + * Remember though, that we are still in A. We cannot + * just pass control to the type T decoder. Why? Because + * the type T decoder expects <4> <0>, not <5> <0>. + * So, we must make sure we are going to receive <5> while + * still in A, then pass control to the T decoder, indicating + * that the tag <4> was implicitly skipped. The decoder of T + * hence will be prepared to treat <4> as valid tag, and decode + * it appropriately. + */ + + tagno = step /* Continuing where left previously */ + + (tag_mode==1?-1:0) + ; + ASN_DEBUG("ber_check_tags(%s, size=%ld, tm=%d, step=%d, tagno=%d)", + td->name, (long)size, tag_mode, step, tagno); + /* assert(td->tags_count >= 1) May not be the case for CHOICE or ANY */ + + if(tag_mode == 0 && tagno == td->tags_count) { + /* + * This must be the _untagged_ ANY type, + * which outermost tag isn't known in advance. + * Fetch the tag and length separately. + */ + tag_len = ber_fetch_tag(ptr, size, &tlv_tag); + switch(tag_len) { + case -1: RETURN(RC_FAIL); + case 0: RETURN(RC_WMORE); + } + tlv_constr = BER_TLV_CONSTRUCTED(ptr); + len_len = ber_fetch_length(tlv_constr, + (const char *)ptr + tag_len, size - tag_len, &tlv_len); + switch(len_len) { + case -1: RETURN(RC_FAIL); + case 0: RETURN(RC_WMORE); + } + ASN_DEBUG("Advancing %ld in ANY case", + (long)(tag_len + len_len)); + ADVANCE(tag_len + len_len); + } else { + assert(tagno < td->tags_count); /* At least one loop */ + } + for((void)tagno; tagno < td->tags_count; tagno++, step++) { + + /* + * Fetch and process T from TLV. + */ + tag_len = ber_fetch_tag(ptr, size, &tlv_tag); + ASN_DEBUG("Fetching tag from {%p,%ld}: " + "len %ld, step %d, tagno %d got %s", + ptr, (long)size, + (long)tag_len, step, tagno, + ber_tlv_tag_string(tlv_tag)); + switch(tag_len) { + case -1: RETURN(RC_FAIL); + case 0: RETURN(RC_WMORE); + } + + tlv_constr = BER_TLV_CONSTRUCTED(ptr); + + /* + * If {I}, don't check anything. + * If {I,B,C}, check B and C unless we're at I. + */ + if(tag_mode != 0 && step == 0) { + /* + * We don't expect tag to match here. + * It's just because we don't know how the tag + * is supposed to look like. + */ + } else { + assert(tagno >= 0); /* Guaranteed by the code above */ + if(tlv_tag != td->tags[tagno]) { + /* + * Unexpected tag. Too bad. + */ + ASN_DEBUG("Expected: %s, " + "expectation failed (tn=%d, tm=%d)", + ber_tlv_tag_string(td->tags[tagno]), + tagno, tag_mode + ); + RETURN(RC_FAIL); + } + } + + /* + * Attention: if there are more tags expected, + * ensure that the current tag is presented + * in constructed form (it contains other tags!). + * If this one is the last one, check that the tag form + * matches the one given in descriptor. + */ + if(tagno < (td->tags_count - 1)) { + if(tlv_constr == 0) { + ASN_DEBUG("tlv_constr = %d, expfail", + tlv_constr); + RETURN(RC_FAIL); + } + } else { + if(last_tag_form != tlv_constr + && last_tag_form != -1) { + ASN_DEBUG("last_tag_form %d != %d", + last_tag_form, tlv_constr); + RETURN(RC_FAIL); + } + } + + /* + * Fetch and process L from TLV. + */ + len_len = ber_fetch_length(tlv_constr, + (const char *)ptr + tag_len, size - tag_len, &tlv_len); + ASN_DEBUG("Fetching len = %ld", (long)len_len); + switch(len_len) { + case -1: RETURN(RC_FAIL); + case 0: RETURN(RC_WMORE); + } + + /* + * FIXME + * As of today, the chain of tags + * must either contain several indefinite length TLVs, + * or several definite length ones. + * No mixing is allowed. + */ + if(tlv_len == -1) { + /* + * Indefinite length. + */ + if(limit_len == -1) { + expect_00_terminators++; + } else { + ASN_DEBUG("Unexpected indefinite length " + "in a chain of definite lengths"); + RETURN(RC_FAIL); + } + ADVANCE(tag_len + len_len); + continue; + } else { + if(expect_00_terminators) { + ASN_DEBUG("Unexpected definite length " + "in a chain of indefinite lengths"); + RETURN(RC_FAIL); + } + } + + /* + * Check that multiple TLVs specify ever decreasing length, + * which is consistent. + */ + if(limit_len == -1) { + limit_len = tlv_len + tag_len + len_len; + if(limit_len < 0) { + /* Too great tlv_len value? */ + RETURN(RC_FAIL); + } + } else if(limit_len != tlv_len + tag_len + len_len) { + /* + * Inner TLV specifies length which is inconsistent + * with the outer TLV's length value. + */ + ASN_DEBUG("Outer TLV is %ld and inner is %ld", + (long)limit_len, (long)tlv_len); + RETURN(RC_FAIL); + } + + ADVANCE(tag_len + len_len); + + limit_len -= (tag_len + len_len); + if((ssize_t)size > limit_len) { + /* + * Make sure that we won't consume more bytes + * from the parent frame than the inferred limit. + */ + size = limit_len; + } + } + + if(opt_tlv_form) + *opt_tlv_form = tlv_constr; + if(expect_00_terminators) + *last_length = -expect_00_terminators; + else + *last_length = tlv_len; + + RETURN(RC_OK); +} diff --git a/src/cryptoconditions/src/asn/ber_decoder.h b/src/cryptoconditions/src/asn/ber_decoder.h new file mode 100644 index 00000000000..9fe2e895dfb --- /dev/null +++ b/src/cryptoconditions/src/asn/ber_decoder.h @@ -0,0 +1,64 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _BER_DECODER_H_ +#define _BER_DECODER_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ +struct asn_codec_ctx_s; /* Forward declaration */ + +/* + * The BER decoder of any type. + * This function may be invoked directly from the application. + * The der_encode() function (der_encoder.h) is an opposite to ber_decode(). + */ +asn_dec_rval_t ber_decode(struct asn_codec_ctx_s *opt_codec_ctx, + struct asn_TYPE_descriptor_s *type_descriptor, + void **struct_ptr, /* Pointer to a target structure's pointer */ + const void *buffer, /* Data to be decoded */ + size_t size /* Size of that buffer */ + ); + +/* + * Type of generic function which decodes the byte stream into the structure. + */ +typedef asn_dec_rval_t (ber_type_decoder_f)( + struct asn_codec_ctx_s *opt_codec_ctx, + struct asn_TYPE_descriptor_s *type_descriptor, + void **struct_ptr, const void *buf_ptr, size_t size, + int tag_mode); + +/******************************* + * INTERNALLY USEFUL FUNCTIONS * + *******************************/ + +/* + * Check that all tags correspond to the type definition (as given in head). + * On return, last_length would contain either a non-negative length of the + * value part of the last TLV, or the negative number of expected + * "end of content" sequences. The number may only be negative if the + * head->last_tag_form is non-zero. + */ +asn_dec_rval_t ber_check_tags( + struct asn_codec_ctx_s *opt_codec_ctx, /* codec options */ + struct asn_TYPE_descriptor_s *type_descriptor, + asn_struct_ctx_t *opt_ctx, /* saved decoding context */ + const void *ptr, size_t size, + int tag_mode, /* {-1,0,1}: IMPLICIT, no, EXPLICIT */ + int last_tag_form, /* {-1,0:1}: any, primitive, constr */ + ber_tlv_len_t *last_length, + int *opt_tlv_form /* optional tag form */ + ); + +#ifdef __cplusplus +} +#endif + +#endif /* _BER_DECODER_H_ */ diff --git a/src/cryptoconditions/src/asn/ber_tlv_length.c b/src/cryptoconditions/src/asn/ber_tlv_length.c new file mode 100644 index 00000000000..4c2f1e5fd3c --- /dev/null +++ b/src/cryptoconditions/src/asn/ber_tlv_length.c @@ -0,0 +1,178 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +ssize_t +ber_fetch_length(int _is_constructed, const void *bufptr, size_t size, + ber_tlv_len_t *len_r) { + const uint8_t *buf = (const uint8_t *)bufptr; + unsigned oct; + + if(size == 0) + return 0; /* Want more */ + + oct = *(const uint8_t *)buf; + if((oct & 0x80) == 0) { + /* + * Short definite length. + */ + *len_r = oct; /* & 0x7F */ + return 1; + } else { + ber_tlv_len_t len; + size_t skipped; + + if(_is_constructed && oct == 0x80) { + *len_r = -1; /* Indefinite length */ + return 1; + } + + if(oct == 0xff) { + /* Reserved in standard for future use. */ + return -1; + } + + oct &= 0x7F; /* Leave only the 7 LS bits */ + for(len = 0, buf++, skipped = 1; + oct && (++skipped <= size); buf++, oct--) { + + len = (len << 8) | *buf; + if(len < 0 + || (len >> ((8 * sizeof(len)) - 8) && oct > 1)) { + /* + * Too large length value. + */ + return -1; + } + } + + if(oct == 0) { + ber_tlv_len_t lenplusepsilon = (size_t)len + 1024; + /* + * Here length may be very close or equal to 2G. + * However, the arithmetics used in some decoders + * may add some (small) quantities to the length, + * to check the resulting value against some limits. + * This may result in integer wrap-around, which + * we try to avoid by checking it earlier here. + */ + if(lenplusepsilon < 0) { + /* Too large length value */ + return -1; + } + + *len_r = len; + return skipped; + } + + return 0; /* Want more */ + } + +} + +ssize_t +ber_skip_length(asn_codec_ctx_t *opt_codec_ctx, + int _is_constructed, const void *ptr, size_t size) { + ber_tlv_len_t vlen; /* Length of V in TLV */ + ssize_t tl; /* Length of L in TLV */ + ssize_t ll; /* Length of L in TLV */ + size_t skip; + + /* + * Make sure we didn't exceed the maximum stack size. + */ + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + return -1; + + /* + * Determine the size of L in TLV. + */ + ll = ber_fetch_length(_is_constructed, ptr, size, &vlen); + if(ll <= 0) return ll; + + /* + * Definite length. + */ + if(vlen >= 0) { + skip = ll + vlen; + if(skip > size) + return 0; /* Want more */ + return skip; + } + + /* + * Indefinite length! + */ + ASN_DEBUG("Skipping indefinite length"); + for(skip = ll, ptr = ((const char *)ptr) + ll, size -= ll;;) { + ber_tlv_tag_t tag; + + /* Fetch the tag */ + tl = ber_fetch_tag(ptr, size, &tag); + if(tl <= 0) return tl; + + ll = ber_skip_length(opt_codec_ctx, + BER_TLV_CONSTRUCTED(ptr), + ((const char *)ptr) + tl, size - tl); + if(ll <= 0) return ll; + + skip += tl + ll; + + /* + * This may be the end of the indefinite length structure, + * two consecutive 0 octets. + * Check if it is true. + */ + if(((const uint8_t *)ptr)[0] == 0 + && ((const uint8_t *)ptr)[1] == 0) + return skip; + + ptr = ((const char *)ptr) + tl + ll; + size -= tl + ll; + } + + /* UNREACHABLE */ +} + +size_t +der_tlv_length_serialize(ber_tlv_len_t len, void *bufp, size_t size) { + size_t required_size; /* Size of len encoding */ + uint8_t *buf = (uint8_t *)bufp; + uint8_t *end; + size_t i; + + if(len <= 127) { + /* Encoded in 1 octet */ + if(size) *buf = (uint8_t)len; + return 1; + } + + /* + * Compute the size of the subsequent bytes. + */ + for(required_size = 1, i = 8; i < 8 * sizeof(len); i += 8) { + if(len >> i) + required_size++; + else + break; + } + + if(size <= required_size) + return required_size + 1; + + *buf++ = (uint8_t)(0x80 | required_size); /* Length of the encoding */ + + /* + * Produce the len encoding, space permitting. + */ + end = buf + required_size; + for(i -= 8; buf < end; i -= 8, buf++) + *buf = (uint8_t)(len >> i); + + return required_size + 1; +} + diff --git a/src/cryptoconditions/src/asn/ber_tlv_length.h b/src/cryptoconditions/src/asn/ber_tlv_length.h new file mode 100644 index 00000000000..34968022440 --- /dev/null +++ b/src/cryptoconditions/src/asn/ber_tlv_length.h @@ -0,0 +1,50 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _BER_TLV_LENGTH_H_ +#define _BER_TLV_LENGTH_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef ssize_t ber_tlv_len_t; + +/* + * This function tries to fetch the length of the BER TLV value and place it + * in *len_r. + * RETURN VALUES: + * 0: More data expected than bufptr contains. + * -1: Fatal error deciphering length. + * >0: Number of bytes used from bufptr. + * On return with >0, len_r is constrained as -1..MAX, where -1 mean + * that the value is of indefinite length. + */ +ssize_t ber_fetch_length(int _is_constructed, const void *bufptr, size_t size, + ber_tlv_len_t *len_r); + +/* + * This function expects bufptr to be positioned over L in TLV. + * It returns number of bytes occupied by L and V together, suitable + * for skipping. The function properly handles indefinite length. + * RETURN VALUES: + * Standard {-1,0,>0} convention. + */ +ssize_t ber_skip_length( + struct asn_codec_ctx_s *opt_codec_ctx, /* optional context */ + int _is_constructed, const void *bufptr, size_t size); + +/* + * This function serializes the length (L from TLV) in DER format. + * It always returns number of bytes necessary to represent the length, + * it is a caller's responsibility to check the return value + * against the supplied buffer's size. + */ +size_t der_tlv_length_serialize(ber_tlv_len_t len, void *bufptr, size_t size); + +#ifdef __cplusplus +} +#endif + +#endif /* _BER_TLV_LENGTH_H_ */ diff --git a/src/cryptoconditions/src/asn/ber_tlv_tag.c b/src/cryptoconditions/src/asn/ber_tlv_tag.c new file mode 100644 index 00000000000..42708760e08 --- /dev/null +++ b/src/cryptoconditions/src/asn/ber_tlv_tag.c @@ -0,0 +1,144 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +ssize_t +ber_fetch_tag(const void *ptr, size_t size, ber_tlv_tag_t *tag_r) { + ber_tlv_tag_t val; + ber_tlv_tag_t tclass; + size_t skipped; + + if(size == 0) + return 0; + + val = *(const uint8_t *)ptr; + tclass = (val >> 6); + if((val &= 0x1F) != 0x1F) { + /* + * Simple form: everything encoded in a single octet. + * Tag Class is encoded using two least significant bits. + */ + *tag_r = (val << 2) | tclass; + return 1; + } + + /* + * Each octet contains 7 bits of useful information. + * The MSB is 0 if it is the last octet of the tag. + */ + for(val = 0, ptr = ((const char *)ptr) + 1, skipped = 2; + skipped <= size; + ptr = ((const char *)ptr) + 1, skipped++) { + unsigned int oct = *(const uint8_t *)ptr; + if(oct & 0x80) { + val = (val << 7) | (oct & 0x7F); + /* + * Make sure there are at least 9 bits spare + * at the MS side of a value. + */ + if(val >> ((8 * sizeof(val)) - 9)) { + /* + * We would not be able to accomodate + * any more tag bits. + */ + return -1; + } + } else { + val = (val << 7) | oct; + *tag_r = (val << 2) | tclass; + return skipped; + } + } + + return 0; /* Want more */ +} + + +ssize_t +ber_tlv_tag_fwrite(ber_tlv_tag_t tag, FILE *f) { + char buf[sizeof("[APPLICATION ]") + 32]; + ssize_t ret; + + ret = ber_tlv_tag_snprint(tag, buf, sizeof(buf)); + if(ret >= (ssize_t)sizeof(buf) || ret < 2) { + errno = EPERM; + return -1; + } + + return fwrite(buf, 1, ret, f); +} + +ssize_t +ber_tlv_tag_snprint(ber_tlv_tag_t tag, char *buf, size_t size) { + char *type = 0; + int ret; + + switch(tag & 0x3) { + case ASN_TAG_CLASS_UNIVERSAL: type = "UNIVERSAL "; break; + case ASN_TAG_CLASS_APPLICATION: type = "APPLICATION "; break; + case ASN_TAG_CLASS_CONTEXT: type = ""; break; + case ASN_TAG_CLASS_PRIVATE: type = "PRIVATE "; break; + } + + ret = snprintf(buf, size, "[%s%u]", type, ((unsigned)tag) >> 2); + if(ret <= 0 && size) buf[0] = '\0'; /* against broken libc's */ + + return ret; +} + +char * +ber_tlv_tag_string(ber_tlv_tag_t tag) { + static char buf[sizeof("[APPLICATION ]") + 32]; + + (void)ber_tlv_tag_snprint(tag, buf, sizeof(buf)); + + return buf; +} + + +size_t +ber_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufp, size_t size) { + int tclass = BER_TAG_CLASS(tag); + ber_tlv_tag_t tval = BER_TAG_VALUE(tag); + uint8_t *buf = (uint8_t *)bufp; + uint8_t *end; + size_t required_size; + size_t i; + + if(tval <= 30) { + /* Encoded in 1 octet */ + if(size) buf[0] = (tclass << 6) | tval; + return 1; + } else if(size) { + *buf++ = (tclass << 6) | 0x1F; + size--; + } + + /* + * Compute the size of the subsequent bytes. + */ + for(required_size = 1, i = 7; i < 8 * sizeof(tval); i += 7) { + if(tval >> i) + required_size++; + else + break; + } + + if(size < required_size) + return required_size + 1; + + /* + * Fill in the buffer, space permitting. + */ + end = buf + required_size - 1; + for(i -= 7; buf < end; i -= 7, buf++) + *buf = 0x80 | ((tval >> i) & 0x7F); + *buf = (tval & 0x7F); /* Last octet without high bit */ + + return required_size + 1; +} + diff --git a/src/cryptoconditions/src/asn/ber_tlv_tag.h b/src/cryptoconditions/src/asn/ber_tlv_tag.h new file mode 100644 index 00000000000..60e866861b2 --- /dev/null +++ b/src/cryptoconditions/src/asn/ber_tlv_tag.h @@ -0,0 +1,60 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _BER_TLV_TAG_H_ +#define _BER_TLV_TAG_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +enum asn_tag_class { + ASN_TAG_CLASS_UNIVERSAL = 0, /* 0b00 */ + ASN_TAG_CLASS_APPLICATION = 1, /* 0b01 */ + ASN_TAG_CLASS_CONTEXT = 2, /* 0b10 */ + ASN_TAG_CLASS_PRIVATE = 3 /* 0b11 */ +}; +typedef unsigned ber_tlv_tag_t; /* BER TAG from Tag-Length-Value */ + +/* + * Tag class is encoded together with tag value for optimization purposes. + */ +#define BER_TAG_CLASS(tag) ((tag) & 0x3) +#define BER_TAG_VALUE(tag) ((tag) >> 2) +#define BER_TLV_CONSTRUCTED(tagptr) (((*(const uint8_t *)tagptr)&0x20)?1:0) + +#define BER_TAGS_EQUAL(tag1, tag2) ((tag1) == (tag2)) + +/* + * Several functions for printing the TAG in the canonical form + * (i.e. "[PRIVATE 0]"). + * Return values correspond to their libc counterparts (if any). + */ +ssize_t ber_tlv_tag_snprint(ber_tlv_tag_t tag, char *buf, size_t buflen); +ssize_t ber_tlv_tag_fwrite(ber_tlv_tag_t tag, FILE *); +char *ber_tlv_tag_string(ber_tlv_tag_t tag); + + +/* + * This function tries to fetch the tag from the input stream. + * RETURN VALUES: + * 0: More data expected than bufptr contains. + * -1: Fatal error deciphering tag. + * >0: Number of bytes used from bufptr. tag_r will contain the tag. + */ +ssize_t ber_fetch_tag(const void *bufptr, size_t size, ber_tlv_tag_t *tag_r); + +/* + * This function serializes the tag (T from TLV) in BER format. + * It always returns number of bytes necessary to represent the tag, + * it is a caller's responsibility to check the return value + * against the supplied buffer's size. + */ +size_t ber_tlv_tag_serialize(ber_tlv_tag_t tag, void *bufptr, size_t size); + +#ifdef __cplusplus +} +#endif + +#endif /* _BER_TLV_TAG_H_ */ diff --git a/src/cryptoconditions/src/asn/constr_CHOICE.c b/src/cryptoconditions/src/asn/constr_CHOICE.c new file mode 100644 index 00000000000..6116e6a6b0b --- /dev/null +++ b/src/cryptoconditions/src/asn/constr_CHOICE.c @@ -0,0 +1,1114 @@ +/* + * Copyright (c) 2003, 2004, 2005, 2006, 2007 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * Number of bytes left for this structure. + * (ctx->left) indicates the number of bytes _transferred_ for the structure. + * (size) contains the number of bytes in the buffer passed. + */ +#define LEFT ((size<(size_t)ctx->left)?size:(size_t)ctx->left) + +/* + * If the subprocessor function returns with an indication that it wants + * more data, it may well be a fatal decoding problem, because the + * size is constrained by the 's L, even if the buffer size allows + * reading more data. + * For example, consider the buffer containing the following TLVs: + * ... + * The TLV length clearly indicates that one byte is expected in V, but + * if the V processor returns with "want more data" even if the buffer + * contains way more data than the V processor have seen. + */ +#define SIZE_VIOLATION (ctx->left >= 0 && (size_t)ctx->left <= size) + +/* + * This macro "eats" the part of the buffer which is definitely "consumed", + * i.e. was correctly converted into local representation or rightfully skipped. + */ +#undef ADVANCE +#define ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + ptr = ((const char *)ptr) + num;\ + size -= num; \ + if(ctx->left >= 0) \ + ctx->left -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Switch to the next phase of parsing. + */ +#undef NEXT_PHASE +#define NEXT_PHASE(ctx) do { \ + ctx->phase++; \ + ctx->step = 0; \ + } while(0) + +/* + * Return a standardized complex structure. + */ +#undef RETURN +#define RETURN(_code) do { \ + rval.code = _code; \ + rval.consumed = consumed_myself;\ + return rval; \ + } while(0) + +/* + * See the definitions. + */ +static int _fetch_present_idx(const void *struct_ptr, int off, int size); +static void _set_present_idx(void *sptr, int offset, int size, int pres); + +/* + * Tags are canonically sorted in the tag to member table. + */ +static int +_search4tag(const void *ap, const void *bp) { + const asn_TYPE_tag2member_t *a = (const asn_TYPE_tag2member_t *)ap; + const asn_TYPE_tag2member_t *b = (const asn_TYPE_tag2member_t *)bp; + + int a_class = BER_TAG_CLASS(a->el_tag); + int b_class = BER_TAG_CLASS(b->el_tag); + + if(a_class == b_class) { + ber_tlv_tag_t a_value = BER_TAG_VALUE(a->el_tag); + ber_tlv_tag_t b_value = BER_TAG_VALUE(b->el_tag); + + if(a_value == b_value) + return 0; + else if(a_value < b_value) + return -1; + else + return 1; + } else if(a_class < b_class) { + return -1; + } else { + return 1; + } +} + +/* + * The decoder of the CHOICE type. + */ +asn_dec_rval_t +CHOICE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **struct_ptr, const void *ptr, size_t size, int tag_mode) { + /* + * Bring closer parts of structure description. + */ + asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; + asn_TYPE_member_t *elements = td->elements; + + /* + * Parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + ber_tlv_tag_t tlv_tag; /* T from TLV */ + ssize_t tag_len; /* Length of TLV's T */ + asn_dec_rval_t rval; /* Return code from subparsers */ + + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + + ASN_DEBUG("Decoding %s as CHOICE", td->name); + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) { + RETURN(RC_FAIL); + } + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + /* + * Start to parse where left previously + */ + switch(ctx->phase) { + case 0: + /* + * PHASE 0. + * Check that the set of tags associated with given structure + * perfectly fits our expectations. + */ + + if(tag_mode || td->tags_count) { + rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size, + tag_mode, -1, &ctx->left, 0); + if(rval.code != RC_OK) { + ASN_DEBUG("%s tagging check failed: %d", + td->name, rval.code); + return rval; + } + + if(ctx->left >= 0) { + /* ?Substracted below! */ + ctx->left += rval.consumed; + } + ADVANCE(rval.consumed); + } else { + ctx->left = -1; + } + + NEXT_PHASE(ctx); + + ASN_DEBUG("Structure consumes %ld bytes, buffer %ld", + (long)ctx->left, (long)size); + + /* Fall through */ + case 1: + /* + * Fetch the T from TLV. + */ + tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag); + ASN_DEBUG("In %s CHOICE tag length %d", td->name, (int)tag_len); + switch(tag_len) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + do { + const asn_TYPE_tag2member_t *t2m; + asn_TYPE_tag2member_t key; + + key.el_tag = tlv_tag; + t2m = (const asn_TYPE_tag2member_t *)bsearch(&key, + specs->tag2el, specs->tag2el_count, + sizeof(specs->tag2el[0]), _search4tag); + if(t2m) { + /* + * Found the element corresponding to the tag. + */ + NEXT_PHASE(ctx); + ctx->step = t2m->el_no; + break; + } else if(specs->ext_start == -1) { + ASN_DEBUG("Unexpected tag %s " + "in non-extensible CHOICE %s", + ber_tlv_tag_string(tlv_tag), td->name); + RETURN(RC_FAIL); + } else { + /* Skip this tag */ + ssize_t skip; + + ASN_DEBUG("Skipping unknown tag %s", + ber_tlv_tag_string(tlv_tag)); + + skip = ber_skip_length(opt_codec_ctx, + BER_TLV_CONSTRUCTED(ptr), + (const char *)ptr + tag_len, + LEFT - tag_len); + + switch(skip) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + ADVANCE(skip + tag_len); + RETURN(RC_OK); + } + } while(0); + + case 2: + /* + * PHASE 2. + * Read in the element. + */ + do { + asn_TYPE_member_t *elm;/* CHOICE's element */ + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + + elm = &elements[ctx->step]; + + /* + * Compute the position of the member inside a structure, + * and also a type of containment (it may be contained + * as pointer or using inline inclusion). + */ + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + /* + * A pointer to a pointer + * holding the start of the structure + */ + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + /* Set presence to be able to free it properly at any time */ + _set_present_idx(st, specs->pres_offset, + specs->pres_size, ctx->step + 1); + /* + * Invoke the member fetch routine according to member's type + */ + rval = elm->type->ber_decoder(opt_codec_ctx, elm->type, + memb_ptr2, ptr, LEFT, elm->tag_mode); + switch(rval.code) { + case RC_OK: + break; + case RC_WMORE: /* More data expected */ + if(!SIZE_VIOLATION) { + ADVANCE(rval.consumed); + RETURN(RC_WMORE); + } + RETURN(RC_FAIL); + case RC_FAIL: /* Fatal error */ + RETURN(rval.code); + } /* switch(rval) */ + + ADVANCE(rval.consumed); + } while(0); + + NEXT_PHASE(ctx); + + /* Fall through */ + case 3: + ASN_DEBUG("CHOICE %s Leftover: %ld, size = %ld, tm=%d, tc=%d", + td->name, (long)ctx->left, (long)size, + tag_mode, td->tags_count); + + if(ctx->left > 0) { + /* + * The type must be fully decoded + * by the CHOICE member-specific decoder. + */ + RETURN(RC_FAIL); + } + + if(ctx->left == -1 + && !(tag_mode || td->tags_count)) { + /* + * This is an untagged CHOICE. + * It doesn't contain nothing + * except for the member itself, including all its tags. + * The decoding is completed. + */ + NEXT_PHASE(ctx); + break; + } + + /* + * Read in the "end of data chunks"'s. + */ + while(ctx->left < 0) { + ssize_t tl; + + tl = ber_fetch_tag(ptr, LEFT, &tlv_tag); + switch(tl) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + /* + * Expected <0><0>... + */ + if(((const uint8_t *)ptr)[0] == 0) { + if(LEFT < 2) { + if(SIZE_VIOLATION) + RETURN(RC_FAIL); + else + RETURN(RC_WMORE); + } else if(((const uint8_t *)ptr)[1] == 0) { + /* + * Correctly finished with <0><0>. + */ + ADVANCE(2); + ctx->left++; + continue; + } + } else { + ASN_DEBUG("Unexpected continuation in %s", + td->name); + RETURN(RC_FAIL); + } + + /* UNREACHABLE */ + } + + NEXT_PHASE(ctx); + case 4: + /* No meaningful work here */ + break; + } + + RETURN(RC_OK); +} + +asn_enc_rval_t +CHOICE_encode_der(asn_TYPE_descriptor_t *td, void *sptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; + asn_TYPE_member_t *elm; /* CHOICE element */ + asn_enc_rval_t erval; + void *memb_ptr; + size_t computed_size = 0; + int present; + + if(!sptr) ASN__ENCODE_FAILED; + + ASN_DEBUG("%s %s as CHOICE", + cb?"Encoding":"Estimating", td->name); + + present = _fetch_present_idx(sptr, + specs->pres_offset, specs->pres_size); + + /* + * If the structure was not initialized, it cannot be encoded: + * can't deduce what to encode in the choice type. + */ + if(present <= 0 || present > td->elements_count) { + if(present == 0 && td->elements_count == 0) { + /* The CHOICE is empty?! */ + erval.encoded = 0; + ASN__ENCODED_OK(erval); + } + ASN__ENCODE_FAILED; + } + + /* + * Seek over the present member of the structure. + */ + elm = &td->elements[present-1]; + if(elm->flags & ATF_POINTER) { + memb_ptr = *(void **)((char *)sptr + elm->memb_offset); + if(memb_ptr == 0) { + if(elm->optional) { + erval.encoded = 0; + ASN__ENCODED_OK(erval); + } + /* Mandatory element absent */ + ASN__ENCODE_FAILED; + } + } else { + memb_ptr = (void *)((char *)sptr + elm->memb_offset); + } + + /* + * If the CHOICE itself is tagged EXPLICIT: + * T ::= [2] EXPLICIT CHOICE { ... } + * Then emit the appropriate tags. + */ + if(tag_mode == 1 || td->tags_count) { + /* + * For this, we need to pre-compute the member. + */ + ssize_t ret; + + /* Encode member with its tag */ + erval = elm->type->der_encoder(elm->type, memb_ptr, + elm->tag_mode, elm->tag, 0, 0); + if(erval.encoded == -1) + return erval; + + /* Encode CHOICE with parent or my own tag */ + ret = der_write_tags(td, erval.encoded, tag_mode, 1, tag, + cb, app_key); + if(ret == -1) + ASN__ENCODE_FAILED; + computed_size += ret; + } + + /* + * Encode the single underlying member. + */ + erval = elm->type->der_encoder(elm->type, memb_ptr, + elm->tag_mode, elm->tag, cb, app_key); + if(erval.encoded == -1) + return erval; + + ASN_DEBUG("Encoded CHOICE member in %ld bytes (+%ld)", + (long)erval.encoded, (long)computed_size); + + erval.encoded += computed_size; + + return erval; +} + +ber_tlv_tag_t +CHOICE_outmost_tag(const asn_TYPE_descriptor_t *td, const void *ptr, int tag_mode, ber_tlv_tag_t tag) { + asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; + int present; + + assert(tag_mode == 0); (void)tag_mode; + assert(tag == 0); (void)tag; + + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(ptr, specs->pres_offset, specs->pres_size); + + if(present > 0 || present <= td->elements_count) { + const asn_TYPE_member_t *elm = &td->elements[present-1]; + const void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(const void * const *) + ((const char *)ptr + elm->memb_offset); + } else { + memb_ptr = (const void *) + ((const char *)ptr + elm->memb_offset); + } + + return asn_TYPE_outmost_tag(elm->type, memb_ptr, + elm->tag_mode, elm->tag); + } else { + return (ber_tlv_tag_t)-1; + } +} + +int +CHOICE_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; + int present; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(sptr, specs->pres_offset,specs->pres_size); + if(present > 0 && present <= td->elements_count) { + asn_TYPE_member_t *elm = &td->elements[present-1]; + const void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) { + if(elm->optional) + return 0; + ASN__CTFAIL(app_key, td, sptr, + "%s: mandatory CHOICE element %s absent (%s:%d)", + td->name, elm->name, __FILE__, __LINE__); + return -1; + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + if(elm->memb_constraints) { + return elm->memb_constraints(elm->type, memb_ptr, + ctfailcb, app_key); + } else { + int ret = elm->type->check_constraints(elm->type, + memb_ptr, ctfailcb, app_key); + /* + * Cannot inherit it eralier: + * need to make sure we get the updated version. + */ + elm->memb_constraints = elm->type->check_constraints; + return ret; + } + } else { + ASN__CTFAIL(app_key, td, sptr, + "%s: no CHOICE element given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } +} + +#undef XER_ADVANCE +#define XER_ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + buf_ptr = (const void *)(((const char *)buf_ptr) + num); \ + size -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Decode the XER (XML) data. + */ +asn_dec_rval_t +CHOICE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **struct_ptr, const char *opt_mname, + const void *buf_ptr, size_t size) { + /* + * Bring closer parts of structure description. + */ + asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; + const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; + + /* + * Parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + asn_dec_rval_t rval; /* Return value of a decoder */ + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + int edx; /* Element index */ + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) RETURN(RC_FAIL); + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + if(ctx->phase == 0 && !*xml_tag) + ctx->phase = 1; /* Skip the outer tag checking phase */ + + /* + * Phases of XER/XML processing: + * Phase 0: Check that the opening tag matches our expectations. + * Phase 1: Processing body and reacting on closing tag. + * Phase 2: Processing inner type. + * Phase 3: Only waiting for closing tag. + * Phase 4: Skipping unknown extensions. + * Phase 5: PHASED OUT + */ + for(edx = ctx->step; ctx->phase <= 4;) { + pxer_chunk_type_e ch_type; /* XER chunk type */ + ssize_t ch_size; /* Chunk size */ + xer_check_tag_e tcv; /* Tag check value */ + asn_TYPE_member_t *elm; + + /* + * Go inside the member. + */ + if(ctx->phase == 2) { + asn_dec_rval_t tmprval; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + + elm = &td->elements[edx]; + + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + + /* Start/Continue decoding the inner member */ + tmprval = elm->type->xer_decoder(opt_codec_ctx, + elm->type, memb_ptr2, elm->name, + buf_ptr, size); + XER_ADVANCE(tmprval.consumed); + ASN_DEBUG("XER/CHOICE: itdf: [%s] code=%d", + elm->type->name, tmprval.code); + if(tmprval.code != RC_OK) + RETURN(tmprval.code); + assert(_fetch_present_idx(st, + specs->pres_offset, specs->pres_size) == 0); + /* Record what we've got */ + _set_present_idx(st, + specs->pres_offset, specs->pres_size, edx + 1); + ctx->phase = 3; + /* Fall through */ + } + + /* No need to wait for closing tag; special mode. */ + if(ctx->phase == 3 && !*xml_tag) { + ctx->phase = 5; /* Phase out */ + RETURN(RC_OK); + } + + /* + * Get the next part of the XML stream. + */ + ch_size = xer_next_token(&ctx->context, buf_ptr, size, &ch_type); + if(ch_size == -1) { + RETURN(RC_FAIL); + } else { + switch(ch_type) { + case PXER_WMORE: + RETURN(RC_WMORE); + case PXER_COMMENT: /* Got XML comment */ + case PXER_TEXT: /* Ignore free-standing text */ + XER_ADVANCE(ch_size); /* Skip silently */ + continue; + case PXER_TAG: + break; /* Check the rest down there */ + } + } + + tcv = xer_check_tag(buf_ptr, ch_size, xml_tag); + ASN_DEBUG("XER/CHOICE checked [%c%c%c%c] vs [%s], tcv=%d", + ch_size>0?((const uint8_t *)buf_ptr)[0]:'?', + ch_size>1?((const uint8_t *)buf_ptr)[1]:'?', + ch_size>2?((const uint8_t *)buf_ptr)[2]:'?', + ch_size>3?((const uint8_t *)buf_ptr)[3]:'?', + xml_tag, tcv); + + /* Skip the extensions section */ + if(ctx->phase == 4) { + ASN_DEBUG("skip_unknown(%d, %ld)", + tcv, (long)ctx->left); + switch(xer_skip_unknown(tcv, &ctx->left)) { + case -1: + ctx->phase = 5; + RETURN(RC_FAIL); + continue; + case 1: + ctx->phase = 3; + /* Fall through */ + case 0: + XER_ADVANCE(ch_size); + continue; + case 2: + ctx->phase = 3; + break; + } + } + + switch(tcv) { + case XCT_BOTH: + break; /* No CHOICE? */ + case XCT_CLOSING: + if(ctx->phase != 3) + break; + XER_ADVANCE(ch_size); + ctx->phase = 5; /* Phase out */ + RETURN(RC_OK); + case XCT_OPENING: + if(ctx->phase == 0) { + XER_ADVANCE(ch_size); + ctx->phase = 1; /* Processing body phase */ + continue; + } + /* Fall through */ + case XCT_UNKNOWN_OP: + case XCT_UNKNOWN_BO: + + if(ctx->phase != 1) + break; /* Really unexpected */ + + /* + * Search which inner member corresponds to this tag. + */ + for(edx = 0; edx < td->elements_count; edx++) { + elm = &td->elements[edx]; + tcv = xer_check_tag(buf_ptr,ch_size,elm->name); + switch(tcv) { + case XCT_BOTH: + case XCT_OPENING: + /* + * Process this member. + */ + ctx->step = edx; + ctx->phase = 2; + break; + case XCT_UNKNOWN_OP: + case XCT_UNKNOWN_BO: + continue; + default: + edx = td->elements_count; + break; /* Phase out */ + } + break; + } + if(edx != td->elements_count) + continue; + + /* It is expected extension */ + if(specs->ext_start != -1) { + ASN_DEBUG("Got anticipated extension"); + /* + * Check for (XCT_BOTH or XCT_UNKNOWN_BO) + * By using a mask. Only record a pure + * tags. + */ + if(tcv & XCT_CLOSING) { + /* Found without body */ + ctx->phase = 3; /* Terminating */ + } else { + ctx->left = 1; + ctx->phase = 4; /* Skip ...'s */ + } + XER_ADVANCE(ch_size); + continue; + } + + /* Fall through */ + default: + break; + } + + ASN_DEBUG("Unexpected XML tag [%c%c%c%c] in CHOICE [%s]" + " (ph=%d, tag=%s)", + ch_size>0?((const uint8_t *)buf_ptr)[0]:'?', + ch_size>1?((const uint8_t *)buf_ptr)[1]:'?', + ch_size>2?((const uint8_t *)buf_ptr)[2]:'?', + ch_size>3?((const uint8_t *)buf_ptr)[3]:'?', + td->name, ctx->phase, xml_tag); + break; + } + + ctx->phase = 5; /* Phase out, just in case */ + RETURN(RC_FAIL); +} + + +asn_enc_rval_t +CHOICE_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_CHOICE_specifics_t *specs=(asn_CHOICE_specifics_t *)td->specifics; + asn_enc_rval_t er; + int present; + + if(!sptr) + ASN__ENCODE_FAILED; + + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(sptr, specs->pres_offset,specs->pres_size); + + if(present <= 0 || present > td->elements_count) { + ASN__ENCODE_FAILED; + } else { + asn_enc_rval_t tmper; + asn_TYPE_member_t *elm = &td->elements[present-1]; + void *memb_ptr; + const char *mname = elm->name; + unsigned int mlen = strlen(mname); + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(void **)((char *)sptr + elm->memb_offset); + if(!memb_ptr) ASN__ENCODE_FAILED; + } else { + memb_ptr = (void *)((char *)sptr + elm->memb_offset); + } + + er.encoded = 0; + + if(!(flags & XER_F_CANONICAL)) ASN__TEXT_INDENT(1, ilevel); + ASN__CALLBACK3("<", 1, mname, mlen, ">", 1); + + tmper = elm->type->xer_encoder(elm->type, memb_ptr, + ilevel + 1, flags, cb, app_key); + if(tmper.encoded == -1) return tmper; + + ASN__CALLBACK3("", 1); + + er.encoded += 5 + (2 * mlen) + tmper.encoded; + } + + if(!(flags & XER_F_CANONICAL)) ASN__TEXT_INDENT(1, ilevel - 1); + + ASN__ENCODED_OK(er); +cb_failed: + ASN__ENCODE_FAILED; +} + +asn_dec_rval_t +CHOICE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; + asn_dec_rval_t rv; + asn_per_constraint_t *ct; + asn_TYPE_member_t *elm; /* CHOICE's element */ + void *memb_ptr; + void **memb_ptr2; + void *st = *sptr; + int value; + + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + ASN__DECODE_FAILED; + + /* + * Create the target structure if it is not present already. + */ + if(!st) { + st = *sptr = CALLOC(1, specs->struct_size); + if(!st) ASN__DECODE_FAILED; + } + + if(constraints) ct = &constraints->value; + else if(td->per_constraints) ct = &td->per_constraints->value; + else ct = 0; + + if(ct && ct->flags & APC_EXTENSIBLE) { + value = per_get_few_bits(pd, 1); + if(value < 0) ASN__DECODE_STARVED; + if(value) ct = 0; /* Not restricted */ + } + + if(ct && ct->range_bits >= 0) { + value = per_get_few_bits(pd, ct->range_bits); + if(value < 0) ASN__DECODE_STARVED; + ASN_DEBUG("CHOICE %s got index %d in range %d", + td->name, value, ct->range_bits); + if(value > ct->upper_bound) + ASN__DECODE_FAILED; + } else { + if(specs->ext_start == -1) + ASN__DECODE_FAILED; + value = uper_get_nsnnwn(pd); + if(value < 0) ASN__DECODE_STARVED; + value += specs->ext_start; + if(value >= td->elements_count) + ASN__DECODE_FAILED; + } + + /* Adjust if canonical order is different from natural order */ + if(specs->canonical_order) + value = specs->canonical_order[value]; + + /* Set presence to be able to free it later */ + _set_present_idx(st, specs->pres_offset, specs->pres_size, value + 1); + + elm = &td->elements[value]; + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + ASN_DEBUG("Discovered CHOICE %s encodes %s", td->name, elm->name); + + if(ct && ct->range_bits >= 0) { + rv = elm->type->uper_decoder(opt_codec_ctx, elm->type, + elm->per_constraints, memb_ptr2, pd); + } else { + rv = uper_open_type_get(opt_codec_ctx, elm->type, + elm->per_constraints, memb_ptr2, pd); + } + + if(rv.code != RC_OK) + ASN_DEBUG("Failed to decode %s in %s (CHOICE) %d", + elm->name, td->name, rv.code); + return rv; +} + +asn_enc_rval_t +CHOICE_encode_uper(asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { + asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; + asn_TYPE_member_t *elm; /* CHOICE's element */ + asn_per_constraint_t *ct; + void *memb_ptr; + int present; + int present_enc; + + if(!sptr) ASN__ENCODE_FAILED; + + ASN_DEBUG("Encoding %s as CHOICE", td->name); + + if(constraints) ct = &constraints->value; + else if(td->per_constraints) ct = &td->per_constraints->value; + else ct = 0; + + present = _fetch_present_idx(sptr, + specs->pres_offset, specs->pres_size); + + /* + * If the structure was not initialized properly, it cannot be encoded: + * can't deduce what to encode in the choice type. + */ + if(present <= 0 || present > td->elements_count) + ASN__ENCODE_FAILED; + else + present--; + + ASN_DEBUG("Encoding %s CHOICE element %d", td->name, present); + + /* Adjust if canonical order is different from natural order */ + if(specs->canonical_order) + present_enc = specs->canonical_order[present]; + else + present_enc = present; + + if(ct && ct->range_bits >= 0) { + if(present_enc < ct->lower_bound + || present_enc > ct->upper_bound) { + if(ct->flags & APC_EXTENSIBLE) { + if(per_put_few_bits(po, 1, 1)) + ASN__ENCODE_FAILED; + } else { + ASN__ENCODE_FAILED; + } + ct = 0; + } + } + if(ct && ct->flags & APC_EXTENSIBLE) + if(per_put_few_bits(po, 0, 1)) + ASN__ENCODE_FAILED; + + elm = &td->elements[present]; + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr = *(void **)((char *)sptr + elm->memb_offset); + if(!memb_ptr) ASN__ENCODE_FAILED; + } else { + memb_ptr = (char *)sptr + elm->memb_offset; + } + + if(ct && ct->range_bits >= 0) { + if(per_put_few_bits(po, present_enc, ct->range_bits)) + ASN__ENCODE_FAILED; + + return elm->type->uper_encoder(elm->type, elm->per_constraints, + memb_ptr, po); + } else { + asn_enc_rval_t rval; + if(specs->ext_start == -1) + ASN__ENCODE_FAILED; + if(uper_put_nsnnwn(po, present_enc - specs->ext_start)) + ASN__ENCODE_FAILED; + if(uper_open_type_put(elm->type, elm->per_constraints, + memb_ptr, po)) + ASN__ENCODE_FAILED; + rval.encoded = 0; + ASN__ENCODED_OK(rval); + } +} + + +int +CHOICE_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; + int present; + + if(!sptr) return (cb("", 8, app_key) < 0) ? -1 : 0; + + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(sptr, specs->pres_offset,specs->pres_size); + + /* + * Print that element. + */ + if(present > 0 && present <= td->elements_count) { + asn_TYPE_member_t *elm = &td->elements[present-1]; + const void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) return (cb("", 8, app_key) < 0) ? -1 : 0; + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + /* Print member's name and stuff */ + if(0) { + if(cb(elm->name, strlen(elm->name), app_key) < 0 + || cb(": ", 2, app_key) < 0) + return -1; + } + + return elm->type->print_struct(elm->type, memb_ptr, ilevel, + cb, app_key); + } else { + return (cb("", 8, app_key) < 0) ? -1 : 0; + } +} + +void +CHOICE_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) { + asn_CHOICE_specifics_t *specs = (asn_CHOICE_specifics_t *)td->specifics; + int present; + + if(!td || !ptr) + return; + + ASN_DEBUG("Freeing %s as CHOICE", td->name); + + /* + * Figure out which CHOICE element is encoded. + */ + present = _fetch_present_idx(ptr, specs->pres_offset, specs->pres_size); + + /* + * Free that element. + */ + if(present > 0 && present <= td->elements_count) { + asn_TYPE_member_t *elm = &td->elements[present-1]; + void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(void **)((char *)ptr + elm->memb_offset); + if(memb_ptr) + ASN_STRUCT_FREE(*elm->type, memb_ptr); + } else { + memb_ptr = (void *)((char *)ptr + elm->memb_offset); + ASN_STRUCT_FREE_CONTENTS_ONLY(*elm->type, memb_ptr); + } + } + + if(!contents_only) { + FREEMEM(ptr); + } +} + + +/* + * The following functions functions offer protection against -fshort-enums, + * compatible with little- and big-endian machines. + * If assertion is triggered, either disable -fshort-enums, or add an entry + * here with the ->pres_size of your target stracture. + * Unless the target structure is packed, the ".present" member + * is guaranteed to be aligned properly. ASN.1 compiler itself does not + * produce packed code. + */ +static int +_fetch_present_idx(const void *struct_ptr, int pres_offset, int pres_size) { + const void *present_ptr; + int present; + + present_ptr = ((const char *)struct_ptr) + pres_offset; + + switch(pres_size) { + case sizeof(int): present = *(const int *)present_ptr; break; + case sizeof(short): present = *(const short *)present_ptr; break; + case sizeof(char): present = *(const char *)present_ptr; break; + default: + /* ANSI C mandates enum to be equivalent to integer */ + assert(pres_size != sizeof(int)); + return 0; /* If not aborted, pass back safe value */ + } + + return present; +} + +static void +_set_present_idx(void *struct_ptr, int pres_offset, int pres_size, int present) { + void *present_ptr; + present_ptr = ((char *)struct_ptr) + pres_offset; + + switch(pres_size) { + case sizeof(int): *(int *)present_ptr = present; break; + case sizeof(short): *(short *)present_ptr = present; break; + case sizeof(char): *(char *)present_ptr = present; break; + default: + /* ANSI C mandates enum to be equivalent to integer */ + assert(pres_size != sizeof(int)); + } +} diff --git a/src/cryptoconditions/src/asn/constr_CHOICE.h b/src/cryptoconditions/src/asn/constr_CHOICE.h new file mode 100644 index 00000000000..e824a2206e0 --- /dev/null +++ b/src/cryptoconditions/src/asn/constr_CHOICE.h @@ -0,0 +1,57 @@ +/*- + * Copyright (c) 2003, 2004, 2005 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _CONSTR_CHOICE_H_ +#define _CONSTR_CHOICE_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef const struct asn_CHOICE_specifics_s { + /* + * Target structure description. + */ + int struct_size; /* Size of the target structure. */ + int ctx_offset; /* Offset of the asn_codec_ctx_t member */ + int pres_offset; /* Identifier of the present member */ + int pres_size; /* Size of the identifier (enum) */ + + /* + * Tags to members mapping table. + */ + const asn_TYPE_tag2member_t *tag2el; + int tag2el_count; + + /* Canonical ordering of CHOICE elements, for PER */ + int *canonical_order; + + /* + * Extensions-related stuff. + */ + int ext_start; /* First member of extensions, or -1 */ +} asn_CHOICE_specifics_t; + +/* + * A set specialized functions dealing with the CHOICE type. + */ +asn_struct_free_f CHOICE_free; +asn_struct_print_f CHOICE_print; +asn_constr_check_f CHOICE_constraint; +ber_type_decoder_f CHOICE_decode_ber; +der_type_encoder_f CHOICE_encode_der; +xer_type_decoder_f CHOICE_decode_xer; +xer_type_encoder_f CHOICE_encode_xer; +per_type_decoder_f CHOICE_decode_uper; +per_type_encoder_f CHOICE_encode_uper; +asn_outmost_tag_f CHOICE_outmost_tag; + +#ifdef __cplusplus +} +#endif + +#endif /* _CONSTR_CHOICE_H_ */ diff --git a/src/cryptoconditions/src/asn/constr_SEQUENCE.c b/src/cryptoconditions/src/asn/constr_SEQUENCE.c new file mode 100644 index 00000000000..5923023dee1 --- /dev/null +++ b/src/cryptoconditions/src/asn/constr_SEQUENCE.c @@ -0,0 +1,1425 @@ +/*- + * Copyright (c) 2003, 2004, 2005, 2006, 2007 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * Number of bytes left for this structure. + * (ctx->left) indicates the number of bytes _transferred_ for the structure. + * (size) contains the number of bytes in the buffer passed. + */ +#define LEFT ((size<(size_t)ctx->left)?size:(size_t)ctx->left) + +/* + * If the subprocessor function returns with an indication that it wants + * more data, it may well be a fatal decoding problem, because the + * size is constrained by the 's L, even if the buffer size allows + * reading more data. + * For example, consider the buffer containing the following TLVs: + * ... + * The TLV length clearly indicates that one byte is expected in V, but + * if the V processor returns with "want more data" even if the buffer + * contains way more data than the V processor have seen. + */ +#define SIZE_VIOLATION (ctx->left >= 0 && (size_t)ctx->left <= size) + +/* + * This macro "eats" the part of the buffer which is definitely "consumed", + * i.e. was correctly converted into local representation or rightfully skipped. + */ +#undef ADVANCE +#define ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + ptr = ((const char *)ptr) + num; \ + size -= num; \ + if(ctx->left >= 0) \ + ctx->left -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Switch to the next phase of parsing. + */ +#undef NEXT_PHASE +#undef PHASE_OUT +#define NEXT_PHASE(ctx) do { \ + ctx->phase++; \ + ctx->step = 0; \ + } while(0) +#define PHASE_OUT(ctx) do { ctx->phase = 10; } while(0) + +/* + * Return a standardized complex structure. + */ +#undef RETURN +#define RETURN(_code) do { \ + rval.code = _code; \ + rval.consumed = consumed_myself;\ + return rval; \ + } while(0) + +/* + * Check whether we are inside the extensions group. + */ +#define IN_EXTENSION_GROUP(specs, memb_idx) \ + ( ((memb_idx) > (specs)->ext_after) \ + &&((memb_idx) < (specs)->ext_before)) + + +/* + * Tags are canonically sorted in the tag2element map. + */ +static int +_t2e_cmp(const void *ap, const void *bp) { + const asn_TYPE_tag2member_t *a = (const asn_TYPE_tag2member_t *)ap; + const asn_TYPE_tag2member_t *b = (const asn_TYPE_tag2member_t *)bp; + + int a_class = BER_TAG_CLASS(a->el_tag); + int b_class = BER_TAG_CLASS(b->el_tag); + + if(a_class == b_class) { + ber_tlv_tag_t a_value = BER_TAG_VALUE(a->el_tag); + ber_tlv_tag_t b_value = BER_TAG_VALUE(b->el_tag); + + if(a_value == b_value) { + if(a->el_no > b->el_no) + return 1; + /* + * Important: we do not check + * for a->el_no <= b->el_no! + */ + return 0; + } else if(a_value < b_value) + return -1; + else + return 1; + } else if(a_class < b_class) { + return -1; + } else { + return 1; + } +} + + +/* + * The decoder of the SEQUENCE type. + */ +asn_dec_rval_t +SEQUENCE_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **struct_ptr, const void *ptr, size_t size, int tag_mode) { + /* + * Bring closer parts of structure description. + */ + asn_SEQUENCE_specifics_t *specs = (asn_SEQUENCE_specifics_t *)td->specifics; + asn_TYPE_member_t *elements = td->elements; + + /* + * Parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + ber_tlv_tag_t tlv_tag; /* T from TLV */ + asn_dec_rval_t rval; /* Return code from subparsers */ + + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + int edx; /* SEQUENCE element's index */ + + ASN_DEBUG("Decoding %s as SEQUENCE", td->name); + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) { + RETURN(RC_FAIL); + } + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + /* + * Start to parse where left previously + */ + switch(ctx->phase) { + case 0: + /* + * PHASE 0. + * Check that the set of tags associated with given structure + * perfectly fits our expectations. + */ + + rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size, + tag_mode, 1, &ctx->left, 0); + if(rval.code != RC_OK) { + ASN_DEBUG("%s tagging check failed: %d", + td->name, rval.code); + return rval; + } + + if(ctx->left >= 0) + ctx->left += rval.consumed; /* ?Substracted below! */ + ADVANCE(rval.consumed); + + NEXT_PHASE(ctx); + + ASN_DEBUG("Structure consumes %ld bytes, buffer %ld", + (long)ctx->left, (long)size); + + /* Fall through */ + case 1: + /* + * PHASE 1. + * From the place where we've left it previously, + * try to decode the next member from the list of + * this structure's elements. + * (ctx->step) stores the member being processed + * between invocations and the microphase {0,1} of parsing + * that member: + * step = ( * 2 + ). + */ + for(edx = (ctx->step >> 1); edx < td->elements_count; + edx++, ctx->step = (ctx->step & ~1) + 2) { + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + ssize_t tag_len; /* Length of TLV's T */ + int opt_edx_end; /* Next non-optional element */ + int use_bsearch; + int n; + + if(ctx->step & 1) + goto microphase2; + + /* + * MICROPHASE 1: Synchronize decoding. + */ + ASN_DEBUG("In %s SEQUENCE left %d, edx=%d flags=%d" + " opt=%d ec=%d", + td->name, (int)ctx->left, edx, + elements[edx].flags, elements[edx].optional, + td->elements_count); + + if(ctx->left == 0 /* No more stuff is expected */ + && ( + /* Explicit OPTIONAL specification reaches the end */ + (edx + elements[edx].optional + == td->elements_count) + || + /* All extensions are optional */ + (IN_EXTENSION_GROUP(specs, edx) + && specs->ext_before > td->elements_count) + ) + ) { + ASN_DEBUG("End of SEQUENCE %s", td->name); + /* + * Found the legitimate end of the structure. + */ + PHASE_OUT(ctx); + RETURN(RC_OK); + } + + /* + * Fetch the T from TLV. + */ + tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag); + ASN_DEBUG("Current tag in %s SEQUENCE for element %d " + "(%s) is %s encoded in %d bytes, of frame %ld", + td->name, edx, elements[edx].name, + ber_tlv_tag_string(tlv_tag), (int)tag_len, (long)LEFT); + switch(tag_len) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + if(ctx->left < 0 && ((const uint8_t *)ptr)[0] == 0) { + if(LEFT < 2) { + if(SIZE_VIOLATION) + RETURN(RC_FAIL); + else + RETURN(RC_WMORE); + } else if(((const uint8_t *)ptr)[1] == 0) { + ASN_DEBUG("edx = %d, opt = %d, ec=%d", + edx, elements[edx].optional, + td->elements_count); + if((edx + elements[edx].optional + == td->elements_count) + || (IN_EXTENSION_GROUP(specs, edx) + && specs->ext_before + > td->elements_count)) { + /* + * Yeah, baby! Found the terminator + * of the indefinite length structure. + */ + /* + * Proceed to the canonical + * finalization function. + * No advancing is necessary. + */ + goto phase3; + } + } + } + + /* + * Find the next available type with this tag. + */ + use_bsearch = 0; + opt_edx_end = edx + elements[edx].optional + 1; + if(opt_edx_end > td->elements_count) + opt_edx_end = td->elements_count; /* Cap */ + else if(opt_edx_end - edx > 8) { + /* Limit the scope of linear search... */ + opt_edx_end = edx + 8; + use_bsearch = 1; + /* ... and resort to bsearch() */ + } + for(n = edx; n < opt_edx_end; n++) { + if(BER_TAGS_EQUAL(tlv_tag, elements[n].tag)) { + /* + * Found element corresponding to the tag + * being looked at. + * Reposition over the right element. + */ + edx = n; + ctx->step = 1 + 2 * edx; /* Remember! */ + goto microphase2; + } else if(elements[n].flags & ATF_OPEN_TYPE) { + /* + * This is the ANY type, which may bear + * any flag whatsoever. + */ + edx = n; + ctx->step = 1 + 2 * edx; /* Remember! */ + goto microphase2; + } else if(elements[n].tag == (ber_tlv_tag_t)-1) { + use_bsearch = 1; + break; + } + } + if(use_bsearch) { + /* + * Resort to a binary search over + * sorted array of tags. + */ + const asn_TYPE_tag2member_t *t2m; + asn_TYPE_tag2member_t key; + key.el_tag = tlv_tag; + key.el_no = edx; + t2m = (const asn_TYPE_tag2member_t *)bsearch(&key, + specs->tag2el, specs->tag2el_count, + sizeof(specs->tag2el[0]), _t2e_cmp); + if(t2m) { + const asn_TYPE_tag2member_t *best = 0; + const asn_TYPE_tag2member_t *t2m_f, *t2m_l; + int edx_max = edx + elements[edx].optional; + /* + * Rewind to the first element with that tag, + * `cause bsearch() does not guarantee order. + */ + t2m_f = t2m + t2m->toff_first; + t2m_l = t2m + t2m->toff_last; + for(t2m = t2m_f; t2m <= t2m_l; t2m++) { + if(t2m->el_no > edx_max) break; + if(t2m->el_no < edx) continue; + best = t2m; + } + if(best) { + edx = best->el_no; + ctx->step = 1 + 2 * edx; + goto microphase2; + } + } + n = opt_edx_end; + } + if(n == opt_edx_end) { + /* + * If tag is unknown, it may be either + * an unknown (thus, incorrect) tag, + * or an extension (...), + * or an end of the indefinite-length structure. + */ + if(!IN_EXTENSION_GROUP(specs, + edx + elements[edx].optional)) { + ASN_DEBUG("Unexpected tag %s (at %d)", + ber_tlv_tag_string(tlv_tag), edx); + ASN_DEBUG("Expected tag %s (%s)%s", + ber_tlv_tag_string(elements[edx].tag), + elements[edx].name, + elements[edx].optional + ?" or alternatives":""); + RETURN(RC_FAIL); + } else { + /* Skip this tag */ + ssize_t skip; + edx += elements[edx].optional; + + ASN_DEBUG("Skipping unexpected %s (at %d)", + ber_tlv_tag_string(tlv_tag), edx); + skip = ber_skip_length(opt_codec_ctx, + BER_TLV_CONSTRUCTED(ptr), + (const char *)ptr + tag_len, + LEFT - tag_len); + ASN_DEBUG("Skip length %d in %s", + (int)skip, td->name); + switch(skip) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + ADVANCE(skip + tag_len); + ctx->step -= 2; + edx--; + continue; /* Try again with the next tag */ + } + } + + /* + * MICROPHASE 2: Invoke the member-specific decoder. + */ + ctx->step |= 1; /* Confirm entering next microphase */ + microphase2: + ASN_DEBUG("Inside SEQUENCE %s MF2", td->name); + + /* + * Compute the position of the member inside a structure, + * and also a type of containment (it may be contained + * as pointer or using inline inclusion). + */ + if(elements[edx].flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elements[edx].memb_offset); + } else { + /* + * A pointer to a pointer + * holding the start of the structure + */ + memb_ptr = (char *)st + elements[edx].memb_offset; + memb_ptr2 = &memb_ptr; + } + /* + * Invoke the member fetch routine according to member's type + */ + rval = elements[edx].type->ber_decoder(opt_codec_ctx, + elements[edx].type, + memb_ptr2, ptr, LEFT, + elements[edx].tag_mode); + ASN_DEBUG("In %s SEQUENCE decoded %d %s of %d " + "in %d bytes rval.code %d, size=%d", + td->name, edx, elements[edx].type->name, + (int)LEFT, (int)rval.consumed, rval.code, (int)size); + switch(rval.code) { + case RC_OK: + break; + case RC_WMORE: /* More data expected */ + if(!SIZE_VIOLATION) { + ADVANCE(rval.consumed); + RETURN(RC_WMORE); + } + ASN_DEBUG("Size violation (c->l=%ld <= s=%ld)", + (long)ctx->left, (long)size); + /* Fall through */ + case RC_FAIL: /* Fatal error */ + RETURN(RC_FAIL); + } /* switch(rval) */ + + ADVANCE(rval.consumed); + } /* for(all structure members) */ + + phase3: + ctx->phase = 3; + case 3: /* 00 and other tags expected */ + case 4: /* only 00's expected */ + + ASN_DEBUG("SEQUENCE %s Leftover: %ld, size = %ld", + td->name, (long)ctx->left, (long)size); + + /* + * Skip everything until the end of the SEQUENCE. + */ + while(ctx->left) { + ssize_t tl, ll; + + tl = ber_fetch_tag(ptr, LEFT, &tlv_tag); + switch(tl) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + /* + * If expected <0><0>... + */ + if(ctx->left < 0 + && ((const uint8_t *)ptr)[0] == 0) { + if(LEFT < 2) { + if(SIZE_VIOLATION) + RETURN(RC_FAIL); + else + RETURN(RC_WMORE); + } else if(((const uint8_t *)ptr)[1] == 0) { + /* + * Correctly finished with <0><0>. + */ + ADVANCE(2); + ctx->left++; + ctx->phase = 4; + continue; + } + } + + if(!IN_EXTENSION_GROUP(specs, td->elements_count) + || ctx->phase == 4) { + ASN_DEBUG("Unexpected continuation " + "of a non-extensible type " + "%s (SEQUENCE): %s", + td->name, + ber_tlv_tag_string(tlv_tag)); + RETURN(RC_FAIL); + } + + ll = ber_skip_length(opt_codec_ctx, + BER_TLV_CONSTRUCTED(ptr), + (const char *)ptr + tl, LEFT - tl); + switch(ll) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + ADVANCE(tl + ll); + } + + PHASE_OUT(ctx); + } + + RETURN(RC_OK); +} + + +/* + * The DER encoder of the SEQUENCE type. + */ +asn_enc_rval_t +SEQUENCE_encode_der(asn_TYPE_descriptor_t *td, + void *sptr, int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + size_t computed_size = 0; + asn_enc_rval_t erval; + ssize_t ret; + int edx; + + ASN_DEBUG("%s %s as SEQUENCE", + cb?"Encoding":"Estimating", td->name); + + /* + * Gather the length of the underlying members sequence. + */ + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; + if(elm->flags & ATF_POINTER) { + memb_ptr = *(void **)((char *)sptr + elm->memb_offset); + if(!memb_ptr) { + if(elm->optional) continue; + /* Mandatory element is missing */ + ASN__ENCODE_FAILED; + } + } else { + memb_ptr = (void *)((char *)sptr + elm->memb_offset); + } + erval = elm->type->der_encoder(elm->type, memb_ptr, + elm->tag_mode, elm->tag, + 0, 0); + if(erval.encoded == -1) + return erval; + computed_size += erval.encoded; + ASN_DEBUG("Member %d %s estimated %ld bytes", + edx, elm->name, (long)erval.encoded); + } + + /* + * Encode the TLV for the sequence itself. + */ + ret = der_write_tags(td, computed_size, tag_mode, 1, tag, cb, app_key); + ASN_DEBUG("Wrote tags: %ld (+%ld)", (long)ret, (long)computed_size); + if(ret == -1) + ASN__ENCODE_FAILED; + erval.encoded = computed_size + ret; + + if(!cb) ASN__ENCODED_OK(erval); + + /* + * Encode all members. + */ + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + asn_enc_rval_t tmperval; + void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(void **)((char *)sptr + elm->memb_offset); + if(!memb_ptr) continue; + } else { + memb_ptr = (void *)((char *)sptr + elm->memb_offset); + } + tmperval = elm->type->der_encoder(elm->type, memb_ptr, + elm->tag_mode, elm->tag, + cb, app_key); + if(tmperval.encoded == -1) + return tmperval; + computed_size -= tmperval.encoded; + ASN_DEBUG("Member %d %s of SEQUENCE %s encoded in %ld bytes", + edx, elm->name, td->name, (long)tmperval.encoded); + } + + if(computed_size != 0) + /* + * Encoded size is not equal to the computed size. + */ + ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(erval); +} + + +#undef XER_ADVANCE +#define XER_ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + buf_ptr = ((const char *)buf_ptr) + num;\ + size -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Decode the XER (XML) data. + */ +asn_dec_rval_t +SEQUENCE_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **struct_ptr, const char *opt_mname, + const void *buf_ptr, size_t size) { + /* + * Bring closer parts of structure description. + */ + asn_SEQUENCE_specifics_t *specs + = (asn_SEQUENCE_specifics_t *)td->specifics; + asn_TYPE_member_t *elements = td->elements; + const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; + + /* + * ... and parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + asn_dec_rval_t rval; /* Return value from a decoder */ + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + int edx; /* Element index */ + int edx_end; + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) RETURN(RC_FAIL); + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + + /* + * Phases of XER/XML processing: + * Phase 0: Check that the opening tag matches our expectations. + * Phase 1: Processing body and reacting on closing tag. + * Phase 2: Processing inner type. + * Phase 3: Skipping unknown extensions. + * Phase 4: PHASED OUT + */ + for(edx = ctx->step; ctx->phase <= 3;) { + pxer_chunk_type_e ch_type; /* XER chunk type */ + ssize_t ch_size; /* Chunk size */ + xer_check_tag_e tcv; /* Tag check value */ + asn_TYPE_member_t *elm; + int n; + + /* + * Go inside the inner member of a sequence. + */ + if(ctx->phase == 2) { + asn_dec_rval_t tmprval; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + + elm = &td->elements[edx]; + + if(elm->flags & ATF_POINTER) { + /* Member is a pointer to another structure */ + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + + /* Invoke the inner type decoder, m.b. multiple times */ + tmprval = elm->type->xer_decoder(opt_codec_ctx, + elm->type, memb_ptr2, elm->name, + buf_ptr, size); + XER_ADVANCE(tmprval.consumed); + if(tmprval.code != RC_OK) + RETURN(tmprval.code); + ctx->phase = 1; /* Back to body processing */ + ctx->step = ++edx; + ASN_DEBUG("XER/SEQUENCE phase => %d, step => %d", + ctx->phase, ctx->step); + /* Fall through */ + } + + /* + * Get the next part of the XML stream. + */ + ch_size = xer_next_token(&ctx->context, buf_ptr, size, + &ch_type); + if(ch_size == -1) { + RETURN(RC_FAIL); + } else { + switch(ch_type) { + case PXER_WMORE: + RETURN(RC_WMORE); + case PXER_COMMENT: /* Got XML comment */ + case PXER_TEXT: /* Ignore free-standing text */ + XER_ADVANCE(ch_size); /* Skip silently */ + continue; + case PXER_TAG: + break; /* Check the rest down there */ + } + } + + tcv = xer_check_tag(buf_ptr, ch_size, xml_tag); + ASN_DEBUG("XER/SEQUENCE: tcv = %d, ph=%d [%s]", + tcv, ctx->phase, xml_tag); + + /* Skip the extensions section */ + if(ctx->phase == 3) { + switch(xer_skip_unknown(tcv, &ctx->left)) { + case -1: + ctx->phase = 4; + RETURN(RC_FAIL); + case 0: + XER_ADVANCE(ch_size); + continue; + case 1: + XER_ADVANCE(ch_size); + ctx->phase = 1; + continue; + case 2: + ctx->phase = 1; + break; + } + } + + switch(tcv) { + case XCT_CLOSING: + if(ctx->phase == 0) break; + ctx->phase = 0; + /* Fall through */ + case XCT_BOTH: + if(ctx->phase == 0) { + if(edx >= td->elements_count + || + /* Explicit OPTIONAL specs reaches the end */ + (edx + elements[edx].optional + == td->elements_count) + || + /* All extensions are optional */ + (IN_EXTENSION_GROUP(specs, edx) + && specs->ext_before + > td->elements_count) + ) { + XER_ADVANCE(ch_size); + ctx->phase = 4; /* Phase out */ + RETURN(RC_OK); + } else { + ASN_DEBUG("Premature end of XER SEQUENCE"); + RETURN(RC_FAIL); + } + } + /* Fall through */ + case XCT_OPENING: + if(ctx->phase == 0) { + XER_ADVANCE(ch_size); + ctx->phase = 1; /* Processing body phase */ + continue; + } + /* Fall through */ + case XCT_UNKNOWN_OP: + case XCT_UNKNOWN_BO: + + ASN_DEBUG("XER/SEQUENCE: tcv=%d, ph=%d, edx=%d", + tcv, ctx->phase, edx); + if(ctx->phase != 1) { + break; /* Really unexpected */ + } + + if(edx < td->elements_count) { + /* + * Search which member corresponds to this tag. + */ + edx_end = edx + elements[edx].optional + 1; + if(edx_end > td->elements_count) + edx_end = td->elements_count; + for(n = edx; n < edx_end; n++) { + elm = &td->elements[n]; + tcv = xer_check_tag(buf_ptr, + ch_size, elm->name); + switch(tcv) { + case XCT_BOTH: + case XCT_OPENING: + /* + * Process this member. + */ + ctx->step = edx = n; + ctx->phase = 2; + break; + case XCT_UNKNOWN_OP: + case XCT_UNKNOWN_BO: + continue; + default: + n = edx_end; + break; /* Phase out */ + } + break; + } + if(n != edx_end) + continue; + } else { + ASN_DEBUG("Out of defined members: %d/%d", + edx, td->elements_count); + } + + /* It is expected extension */ + if(IN_EXTENSION_GROUP(specs, + edx + (edx < td->elements_count + ? elements[edx].optional : 0))) { + ASN_DEBUG("Got anticipated extension at %d", + edx); + /* + * Check for (XCT_BOTH or XCT_UNKNOWN_BO) + * By using a mask. Only record a pure + * tags. + */ + if(tcv & XCT_CLOSING) { + /* Found without body */ + } else { + ctx->left = 1; + ctx->phase = 3; /* Skip ...'s */ + } + XER_ADVANCE(ch_size); + continue; + } + + /* Fall through */ + default: + break; + } + + ASN_DEBUG("Unexpected XML tag in SEQUENCE [%c%c%c%c%c%c]", + size>0?((const char *)buf_ptr)[0]:'.', + size>1?((const char *)buf_ptr)[1]:'.', + size>2?((const char *)buf_ptr)[2]:'.', + size>3?((const char *)buf_ptr)[3]:'.', + size>4?((const char *)buf_ptr)[4]:'.', + size>5?((const char *)buf_ptr)[5]:'.'); + break; + } + + ctx->phase = 4; /* "Phase out" on hard failure */ + RETURN(RC_FAIL); +} + +asn_enc_rval_t +SEQUENCE_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t er; + int xcan = (flags & XER_F_CANONICAL); + int edx; + + if(!sptr) + ASN__ENCODE_FAILED; + + er.encoded = 0; + + for(edx = 0; edx < td->elements_count; edx++) { + asn_enc_rval_t tmper; + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; + const char *mname = elm->name; + unsigned int mlen = strlen(mname); + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(void **)((char *)sptr + elm->memb_offset); + if(!memb_ptr) { + if(elm->optional) + continue; + /* Mandatory element is missing */ + ASN__ENCODE_FAILED; + } + } else { + memb_ptr = (void *)((char *)sptr + elm->memb_offset); + } + + if(!xcan) ASN__TEXT_INDENT(1, ilevel); + ASN__CALLBACK3("<", 1, mname, mlen, ">", 1); + + /* Print the member itself */ + tmper = elm->type->xer_encoder(elm->type, memb_ptr, + ilevel + 1, flags, cb, app_key); + if(tmper.encoded == -1) return tmper; + + ASN__CALLBACK3("", 1); + er.encoded += 5 + (2 * mlen) + tmper.encoded; + } + + if(!xcan) ASN__TEXT_INDENT(1, ilevel - 1); + + ASN__ENCODED_OK(er); +cb_failed: + ASN__ENCODE_FAILED; +} + +int +SEQUENCE_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + int edx; + int ret; + + if(!sptr) return (cb("", 8, app_key) < 0) ? -1 : 0; + + /* Dump preamble */ + if(cb(td->name, strlen(td->name), app_key) < 0 + || cb(" ::= {", 6, app_key) < 0) + return -1; + + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) { + if(elm->optional) continue; + /* Print line */ + /* Fall through */ + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + /* Indentation */ + _i_INDENT(1); + + /* Print the member's name and stuff */ + if(cb(elm->name, strlen(elm->name), app_key) < 0 + || cb(": ", 2, app_key) < 0) + return -1; + + /* Print the member itself */ + ret = elm->type->print_struct(elm->type, memb_ptr, ilevel + 1, + cb, app_key); + if(ret) return ret; + } + + ilevel--; + _i_INDENT(1); + + return (cb("}", 1, app_key) < 0) ? -1 : 0; +} + +void +SEQUENCE_free(asn_TYPE_descriptor_t *td, void *sptr, int contents_only) { + int edx; + + if(!td || !sptr) + return; + + ASN_DEBUG("Freeing %s as SEQUENCE", td->name); + + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; + if(elm->flags & ATF_POINTER) { + memb_ptr = *(void **)((char *)sptr + elm->memb_offset); + if(memb_ptr) + ASN_STRUCT_FREE(*elm->type, memb_ptr); + } else { + memb_ptr = (void *)((char *)sptr + elm->memb_offset); + ASN_STRUCT_FREE_CONTENTS_ONLY(*elm->type, memb_ptr); + } + } + + if(!contents_only) { + FREEMEM(sptr); + } +} + +int +SEQUENCE_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + int edx; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + /* + * Iterate over structure members and check their validity. + */ + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + const void *memb_ptr; + + if(elm->flags & ATF_POINTER) { + memb_ptr = *(const void * const *)((const char *)sptr + elm->memb_offset); + if(!memb_ptr) { + if(elm->optional) + continue; + ASN__CTFAIL(app_key, td, sptr, + "%s: mandatory element %s absent (%s:%d)", + td->name, elm->name, __FILE__, __LINE__); + return -1; + } + } else { + memb_ptr = (const void *)((const char *)sptr + elm->memb_offset); + } + + if(elm->memb_constraints) { + int ret = elm->memb_constraints(elm->type, memb_ptr, + ctfailcb, app_key); + if(ret) return ret; + } else { + int ret = elm->type->check_constraints(elm->type, + memb_ptr, ctfailcb, app_key); + if(ret) return ret; + /* + * Cannot inherit it earlier: + * need to make sure we get the updated version. + */ + elm->memb_constraints = elm->type->check_constraints; + } + } + + return 0; +} + +asn_dec_rval_t +SEQUENCE_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + asn_SEQUENCE_specifics_t *specs = (asn_SEQUENCE_specifics_t *)td->specifics; + void *st = *sptr; /* Target structure. */ + int extpresent; /* Extension additions are present */ + uint8_t *opres; /* Presence of optional root members */ + asn_per_data_t opmd; + asn_dec_rval_t rv; + int edx; + + (void)constraints; + + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + ASN__DECODE_FAILED; + + if(!st) { + st = *sptr = CALLOC(1, specs->struct_size); + if(!st) ASN__DECODE_FAILED; + } + + ASN_DEBUG("Decoding %s as SEQUENCE (UPER)", td->name); + + /* Handle extensions */ + if(specs->ext_before >= 0) { + extpresent = per_get_few_bits(pd, 1); + if(extpresent < 0) ASN__DECODE_STARVED; + } else { + extpresent = 0; + } + + /* Prepare a place and read-in the presence bitmap */ + memset(&opmd, 0, sizeof(opmd)); + if(specs->roms_count) { + opres = (uint8_t *)MALLOC(((specs->roms_count + 7) >> 3) + 1); + if(!opres) ASN__DECODE_FAILED; + /* Get the presence map */ + if(per_get_many_bits(pd, opres, 0, specs->roms_count)) { + FREEMEM(opres); + ASN__DECODE_STARVED; + } + opmd.buffer = opres; + opmd.nbits = specs->roms_count; + ASN_DEBUG("Read in presence bitmap for %s of %d bits (%x..)", + td->name, specs->roms_count, *opres); + } else { + opres = 0; + } + + /* + * Get the sequence ROOT elements. + */ + for(edx = 0; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + + if(IN_EXTENSION_GROUP(specs, edx)) + continue; + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (char *)st + elm->memb_offset; + memb_ptr2 = &memb_ptr; + } + + /* Deal with optionality */ + if(elm->optional) { + int present = per_get_few_bits(&opmd, 1); + ASN_DEBUG("Member %s->%s is optional, p=%d (%d->%d)", + td->name, elm->name, present, + (int)opmd.nboff, (int)opmd.nbits); + if(present == 0) { + /* This element is not present */ + if(elm->default_value) { + /* Fill-in DEFAULT */ + if(elm->default_value(1, memb_ptr2)) { + FREEMEM(opres); + ASN__DECODE_FAILED; + } + ASN_DEBUG("Filled-in default"); + } + /* The member is just not present */ + continue; + } + /* Fall through */ + } + + /* Fetch the member from the stream */ + ASN_DEBUG("Decoding member %s in %s", elm->name, td->name); + rv = elm->type->uper_decoder(opt_codec_ctx, elm->type, + elm->per_constraints, memb_ptr2, pd); + if(rv.code != RC_OK) { + ASN_DEBUG("Failed decode %s in %s", + elm->name, td->name); + FREEMEM(opres); + return rv; + } + } + + /* Optionality map is not needed anymore */ + FREEMEM(opres); + + /* + * Deal with extensions. + */ + if(extpresent) { + ssize_t bmlength; + uint8_t *epres; /* Presence of extension members */ + asn_per_data_t epmd; + + bmlength = uper_get_nslength(pd); + if(bmlength < 0) ASN__DECODE_STARVED; + + ASN_DEBUG("Extensions %ld present in %s", (long)bmlength, td->name); + + epres = (uint8_t *)MALLOC((bmlength + 15) >> 3); + if(!epres) ASN__DECODE_STARVED; + + /* Get the extensions map */ + if(per_get_many_bits(pd, epres, 0, bmlength)) { + FREEMEM(epres); + ASN__DECODE_STARVED; + } + + memset(&epmd, 0, sizeof(epmd)); + epmd.buffer = epres; + epmd.nbits = bmlength; + ASN_DEBUG("Read in extensions bitmap for %s of %ld bits (%x..)", + td->name, (long)bmlength, *epres); + + /* Go over extensions and read them in */ + for(edx = specs->ext_after + 1; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + int present; + + if(!IN_EXTENSION_GROUP(specs, edx)) { + ASN_DEBUG("%d is not extension", edx); + continue; + } + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)st + elm->memb_offset); + } else { + memb_ptr = (void *)((char *)st + elm->memb_offset); + memb_ptr2 = &memb_ptr; + } + + present = per_get_few_bits(&epmd, 1); + if(present <= 0) { + if(present < 0) break; /* No more extensions */ + continue; + } + + ASN_DEBUG("Decoding member %s in %s %p", elm->name, td->name, *memb_ptr2); + rv = uper_open_type_get(opt_codec_ctx, elm->type, + elm->per_constraints, memb_ptr2, pd); + if(rv.code != RC_OK) { + FREEMEM(epres); + return rv; + } + } + + /* Skip over overflow extensions which aren't present + * in this system's version of the protocol */ + for(;;) { + ASN_DEBUG("Getting overflow extensions"); + switch(per_get_few_bits(&epmd, 1)) { + case -1: break; + case 0: continue; + default: + if(uper_open_type_skip(opt_codec_ctx, pd)) { + FREEMEM(epres); + ASN__DECODE_STARVED; + } + } + break; + } + + FREEMEM(epres); + } + + /* Fill DEFAULT members in extensions */ + for(edx = specs->roms_count; edx < specs->roms_count + + specs->aoms_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void **memb_ptr2; /* Pointer to member pointer */ + + if(!elm->default_value) continue; + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)st + + elm->memb_offset); + if(*memb_ptr2) continue; + } else { + continue; /* Extensions are all optionals */ + } + + /* Set default value */ + if(elm->default_value(1, memb_ptr2)) { + ASN__DECODE_FAILED; + } + } + + rv.consumed = 0; + rv.code = RC_OK; + return rv; +} + +static int +SEQUENCE_handle_extensions(asn_TYPE_descriptor_t *td, void *sptr, + asn_per_outp_t *po1, asn_per_outp_t *po2) { + asn_SEQUENCE_specifics_t *specs + = (asn_SEQUENCE_specifics_t *)td->specifics; + int exts_present = 0; + int exts_count = 0; + int edx; + + if(specs->ext_before < 0) + return 0; + + /* Find out which extensions are present */ + for(edx = specs->ext_after + 1; edx < td->elements_count; edx++) { + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + int present; + + if(!IN_EXTENSION_GROUP(specs, edx)) { + ASN_DEBUG("%s (@%d) is not extension", elm->type->name, edx); + continue; + } + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)sptr + elm->memb_offset); + present = (*memb_ptr2 != 0); + } else { + memb_ptr = (void *)((char *)sptr + elm->memb_offset); + memb_ptr2 = &memb_ptr; + present = 1; + } + + ASN_DEBUG("checking %s (@%d) present => %d", + elm->type->name, edx, present); + exts_count++; + exts_present += present; + + /* Encode as presence marker */ + if(po1 && per_put_few_bits(po1, present, 1)) + return -1; + /* Encode as open type field */ + if(po2 && present && uper_open_type_put(elm->type, + elm->per_constraints, *memb_ptr2, po2)) + return -1; + + } + + return exts_present ? exts_count : 0; +} + +asn_enc_rval_t +SEQUENCE_encode_uper(asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { + asn_SEQUENCE_specifics_t *specs + = (asn_SEQUENCE_specifics_t *)td->specifics; + asn_enc_rval_t er; + int n_extensions; + int edx; + int i; + + (void)constraints; + + if(!sptr) + ASN__ENCODE_FAILED; + + er.encoded = 0; + + ASN_DEBUG("Encoding %s as SEQUENCE (UPER)", td->name); + + + /* + * X.691#18.1 Whether structure is extensible + * and whether to encode extensions + */ + if(specs->ext_before >= 0) { + n_extensions = SEQUENCE_handle_extensions(td, sptr, 0, 0); + per_put_few_bits(po, n_extensions ? 1 : 0, 1); + } else { + n_extensions = 0; /* There are no extensions to encode */ + } + + /* Encode a presence bitmap */ + for(i = 0; i < specs->roms_count; i++) { + asn_TYPE_member_t *elm; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + int present; + + edx = specs->oms[i]; + elm = &td->elements[edx]; + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)sptr + elm->memb_offset); + present = (*memb_ptr2 != 0); + } else { + memb_ptr = (void *)((char *)sptr + elm->memb_offset); + memb_ptr2 = &memb_ptr; + present = 1; + } + + /* Eliminate default values */ + if(present && elm->default_value + && elm->default_value(0, memb_ptr2) == 1) + present = 0; + + ASN_DEBUG("Element %s %s %s->%s is %s", + elm->flags & ATF_POINTER ? "ptr" : "inline", + elm->default_value ? "def" : "wtv", + td->name, elm->name, present ? "present" : "absent"); + if(per_put_few_bits(po, present, 1)) + ASN__ENCODE_FAILED; + } + + /* + * Encode the sequence ROOT elements. + */ + ASN_DEBUG("ext_after = %d, ec = %d, eb = %d", specs->ext_after, td->elements_count, specs->ext_before); + for(edx = 0; edx < ((specs->ext_after < 0) + ? td->elements_count : specs->ext_before - 1); edx++) { + + asn_TYPE_member_t *elm = &td->elements[edx]; + void *memb_ptr; /* Pointer to the member */ + void **memb_ptr2; /* Pointer to that pointer */ + + if(IN_EXTENSION_GROUP(specs, edx)) + continue; + + ASN_DEBUG("About to encode %s", elm->type->name); + + /* Fetch the pointer to this member */ + if(elm->flags & ATF_POINTER) { + memb_ptr2 = (void **)((char *)sptr + elm->memb_offset); + if(!*memb_ptr2) { + ASN_DEBUG("Element %s %d not present", + elm->name, edx); + if(elm->optional) + continue; + /* Mandatory element is missing */ + ASN__ENCODE_FAILED; + } + } else { + memb_ptr = (void *)((char *)sptr + elm->memb_offset); + memb_ptr2 = &memb_ptr; + } + + /* Eliminate default values */ + if(elm->default_value && elm->default_value(0, memb_ptr2) == 1) + continue; + + ASN_DEBUG("Encoding %s->%s", td->name, elm->name); + er = elm->type->uper_encoder(elm->type, elm->per_constraints, + *memb_ptr2, po); + if(er.encoded == -1) + return er; + } + + /* No extensions to encode */ + if(!n_extensions) ASN__ENCODED_OK(er); + + ASN_DEBUG("Length of %d bit-map", n_extensions); + /* #18.8. Write down the presence bit-map length. */ + if(uper_put_nslength(po, n_extensions)) + ASN__ENCODE_FAILED; + + ASN_DEBUG("Bit-map of %d elements", n_extensions); + /* #18.7. Encoding the extensions presence bit-map. */ + /* TODO: act upon NOTE in #18.7 for canonical PER */ + if(SEQUENCE_handle_extensions(td, sptr, po, 0) != n_extensions) + ASN__ENCODE_FAILED; + + ASN_DEBUG("Writing %d extensions", n_extensions); + /* #18.9. Encode extensions as open type fields. */ + if(SEQUENCE_handle_extensions(td, sptr, 0, po) != n_extensions) + ASN__ENCODE_FAILED; + + ASN__ENCODED_OK(er); +} + diff --git a/src/cryptoconditions/src/asn/constr_SEQUENCE.h b/src/cryptoconditions/src/asn/constr_SEQUENCE.h new file mode 100644 index 00000000000..c2aeb667675 --- /dev/null +++ b/src/cryptoconditions/src/asn/constr_SEQUENCE.h @@ -0,0 +1,60 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _CONSTR_SEQUENCE_H_ +#define _CONSTR_SEQUENCE_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef const struct asn_SEQUENCE_specifics_s { + /* + * Target structure description. + */ + int struct_size; /* Size of the target structure. */ + int ctx_offset; /* Offset of the asn_struct_ctx_t member */ + + /* + * Tags to members mapping table (sorted). + */ + const asn_TYPE_tag2member_t *tag2el; + int tag2el_count; + + /* + * Optional members of the extensions root (roms) or additions (aoms). + * Meaningful for PER. + */ + const int *oms; /* Optional MemberS */ + int roms_count; /* Root optional members count */ + int aoms_count; /* Additions optional members count */ + + /* + * Description of an extensions group. + */ + int ext_after; /* Extensions start after this member */ + int ext_before; /* Extensions stop before this member */ +} asn_SEQUENCE_specifics_t; + + +/* + * A set specialized functions dealing with the SEQUENCE type. + */ +asn_struct_free_f SEQUENCE_free; +asn_struct_print_f SEQUENCE_print; +asn_constr_check_f SEQUENCE_constraint; +ber_type_decoder_f SEQUENCE_decode_ber; +der_type_encoder_f SEQUENCE_encode_der; +xer_type_decoder_f SEQUENCE_decode_xer; +xer_type_encoder_f SEQUENCE_encode_xer; +per_type_decoder_f SEQUENCE_decode_uper; +per_type_encoder_f SEQUENCE_encode_uper; + +#ifdef __cplusplus +} +#endif + +#endif /* _CONSTR_SEQUENCE_H_ */ diff --git a/src/cryptoconditions/src/asn/constr_SET_OF.c b/src/cryptoconditions/src/asn/constr_SET_OF.c new file mode 100644 index 00000000000..2dbc6e51884 --- /dev/null +++ b/src/cryptoconditions/src/asn/constr_SET_OF.c @@ -0,0 +1,954 @@ +/*- + * Copyright (c) 2003, 2004, 2005 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * Number of bytes left for this structure. + * (ctx->left) indicates the number of bytes _transferred_ for the structure. + * (size) contains the number of bytes in the buffer passed. + */ +#define LEFT ((size<(size_t)ctx->left)?size:(size_t)ctx->left) + +/* + * If the subprocessor function returns with an indication that it wants + * more data, it may well be a fatal decoding problem, because the + * size is constrained by the 's L, even if the buffer size allows + * reading more data. + * For example, consider the buffer containing the following TLVs: + * ... + * The TLV length clearly indicates that one byte is expected in V, but + * if the V processor returns with "want more data" even if the buffer + * contains way more data than the V processor have seen. + */ +#define SIZE_VIOLATION (ctx->left >= 0 && (size_t)ctx->left <= size) + +/* + * This macro "eats" the part of the buffer which is definitely "consumed", + * i.e. was correctly converted into local representation or rightfully skipped. + */ +#undef ADVANCE +#define ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + ptr = ((const char *)ptr) + num;\ + size -= num; \ + if(ctx->left >= 0) \ + ctx->left -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Switch to the next phase of parsing. + */ +#undef NEXT_PHASE +#undef PHASE_OUT +#define NEXT_PHASE(ctx) do { \ + ctx->phase++; \ + ctx->step = 0; \ + } while(0) +#define PHASE_OUT(ctx) do { ctx->phase = 10; } while(0) + +/* + * Return a standardized complex structure. + */ +#undef RETURN +#define RETURN(_code) do { \ + rval.code = _code; \ + rval.consumed = consumed_myself;\ + return rval; \ + } while(0) + +/* + * The decoder of the SET OF type. + */ +asn_dec_rval_t +SET_OF_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **struct_ptr, const void *ptr, size_t size, int tag_mode) { + /* + * Bring closer parts of structure description. + */ + asn_SET_OF_specifics_t *specs = (asn_SET_OF_specifics_t *)td->specifics; + asn_TYPE_member_t *elm = td->elements; /* Single one */ + + /* + * Parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + ber_tlv_tag_t tlv_tag; /* T from TLV */ + asn_dec_rval_t rval; /* Return code from subparsers */ + + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + + ASN_DEBUG("Decoding %s as SET OF", td->name); + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) { + RETURN(RC_FAIL); + } + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + /* + * Start to parse where left previously + */ + switch(ctx->phase) { + case 0: + /* + * PHASE 0. + * Check that the set of tags associated with given structure + * perfectly fits our expectations. + */ + + rval = ber_check_tags(opt_codec_ctx, td, ctx, ptr, size, + tag_mode, 1, &ctx->left, 0); + if(rval.code != RC_OK) { + ASN_DEBUG("%s tagging check failed: %d", + td->name, rval.code); + return rval; + } + + if(ctx->left >= 0) + ctx->left += rval.consumed; /* ?Substracted below! */ + ADVANCE(rval.consumed); + + ASN_DEBUG("Structure consumes %ld bytes, " + "buffer %ld", (long)ctx->left, (long)size); + + NEXT_PHASE(ctx); + /* Fall through */ + case 1: + /* + * PHASE 1. + * From the place where we've left it previously, + * try to decode the next item. + */ + for(;; ctx->step = 0) { + ssize_t tag_len; /* Length of TLV's T */ + + if(ctx->step & 1) + goto microphase2; + + /* + * MICROPHASE 1: Synchronize decoding. + */ + + if(ctx->left == 0) { + ASN_DEBUG("End of SET OF %s", td->name); + /* + * No more things to decode. + * Exit out of here. + */ + PHASE_OUT(ctx); + RETURN(RC_OK); + } + + /* + * Fetch the T from TLV. + */ + tag_len = ber_fetch_tag(ptr, LEFT, &tlv_tag); + switch(tag_len) { + case 0: if(!SIZE_VIOLATION) RETURN(RC_WMORE); + /* Fall through */ + case -1: RETURN(RC_FAIL); + } + + if(ctx->left < 0 && ((const uint8_t *)ptr)[0] == 0) { + if(LEFT < 2) { + if(SIZE_VIOLATION) + RETURN(RC_FAIL); + else + RETURN(RC_WMORE); + } else if(((const uint8_t *)ptr)[1] == 0) { + /* + * Found the terminator of the + * indefinite length structure. + */ + break; + } + } + + /* Outmost tag may be unknown and cannot be fetched/compared */ + if(elm->tag != (ber_tlv_tag_t)-1) { + if(BER_TAGS_EQUAL(tlv_tag, elm->tag)) { + /* + * The new list member of expected type has arrived. + */ + } else { + ASN_DEBUG("Unexpected tag %s fixed SET OF %s", + ber_tlv_tag_string(tlv_tag), td->name); + ASN_DEBUG("%s SET OF has tag %s", + td->name, ber_tlv_tag_string(elm->tag)); + RETURN(RC_FAIL); + } + } + + /* + * MICROPHASE 2: Invoke the member-specific decoder. + */ + ctx->step |= 1; /* Confirm entering next microphase */ + microphase2: + + /* + * Invoke the member fetch routine according to member's type + */ + rval = elm->type->ber_decoder(opt_codec_ctx, + elm->type, &ctx->ptr, ptr, LEFT, 0); + ASN_DEBUG("In %s SET OF %s code %d consumed %d", + td->name, elm->type->name, + rval.code, (int)rval.consumed); + switch(rval.code) { + case RC_OK: + { + asn_anonymous_set_ *list = _A_SET_FROM_VOID(st); + if(ASN_SET_ADD(list, ctx->ptr) != 0) + RETURN(RC_FAIL); + else + ctx->ptr = 0; + } + break; + case RC_WMORE: /* More data expected */ + if(!SIZE_VIOLATION) { + ADVANCE(rval.consumed); + RETURN(RC_WMORE); + } + /* Fall through */ + case RC_FAIL: /* Fatal error */ + ASN_STRUCT_FREE(*elm->type, ctx->ptr); + ctx->ptr = 0; + RETURN(RC_FAIL); + } /* switch(rval) */ + + ADVANCE(rval.consumed); + } /* for(all list members) */ + + NEXT_PHASE(ctx); + case 2: + /* + * Read in all "end of content" TLVs. + */ + while(ctx->left < 0) { + if(LEFT < 2) { + if(LEFT > 0 && ((const char *)ptr)[0] != 0) { + /* Unexpected tag */ + RETURN(RC_FAIL); + } else { + RETURN(RC_WMORE); + } + } + if(((const char *)ptr)[0] == 0 + && ((const char *)ptr)[1] == 0) { + ADVANCE(2); + ctx->left++; + } else { + RETURN(RC_FAIL); + } + } + + PHASE_OUT(ctx); + } + + RETURN(RC_OK); +} + +/* + * Internally visible buffer holding a single encoded element. + */ +struct _el_buffer { + uint8_t *buf; + size_t length; + size_t size; +}; +/* Append bytes to the above structure */ +static int _el_addbytes(const void *buffer, size_t size, void *el_buf_ptr) { + struct _el_buffer *el_buf = (struct _el_buffer *)el_buf_ptr; + + if(el_buf->length + size > el_buf->size) + return -1; + + memcpy(el_buf->buf + el_buf->length, buffer, size); + + el_buf->length += size; + return 0; +} +static int _el_buf_cmp(const void *ap, const void *bp) { + const struct _el_buffer *a = (const struct _el_buffer *)ap; + const struct _el_buffer *b = (const struct _el_buffer *)bp; + int ret; + size_t common_len; + + if(a->length < b->length) + common_len = a->length; + else + common_len = b->length; + + ret = memcmp(a->buf, b->buf, common_len); + if(ret == 0) { + if(a->length < b->length) + ret = -1; + else if(a->length > b->length) + ret = 1; + } + + return ret; +} + +/* + * The DER encoder of the SET OF type. + */ +asn_enc_rval_t +SET_OF_encode_der(asn_TYPE_descriptor_t *td, void *ptr, + int tag_mode, ber_tlv_tag_t tag, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_TYPE_member_t *elm = td->elements; + asn_TYPE_descriptor_t *elm_type = elm->type; + der_type_encoder_f *der_encoder = elm_type->der_encoder; + asn_anonymous_set_ *list = _A_SET_FROM_VOID(ptr); + size_t computed_size = 0; + ssize_t encoding_size = 0; + struct _el_buffer *encoded_els; + ssize_t eels_count = 0; + size_t max_encoded_len = 1; + asn_enc_rval_t erval; + int ret; + int edx; + + ASN_DEBUG("Estimating size for SET OF %s", td->name); + + /* + * Gather the length of the underlying members sequence. + */ + for(edx = 0; edx < list->count; edx++) { + void *memb_ptr = list->array[edx]; + if(!memb_ptr) continue; + erval = der_encoder(elm_type, memb_ptr, 0, elm->tag, 0, 0); + if(erval.encoded == -1) + return erval; + computed_size += erval.encoded; + + /* Compute maximum encoding's size */ + if(max_encoded_len < (size_t)erval.encoded) + max_encoded_len = erval.encoded; + } + + /* + * Encode the TLV for the sequence itself. + */ + encoding_size = der_write_tags(td, computed_size, tag_mode, 1, tag, + cb, app_key); + if(encoding_size == -1) { + erval.encoded = -1; + erval.failed_type = td; + erval.structure_ptr = ptr; + return erval; + } + computed_size += encoding_size; + + if(!cb || list->count == 0) { + erval.encoded = computed_size; + ASN__ENCODED_OK(erval); + } + + /* + * DER mandates dynamic sorting of the SET OF elements + * according to their encodings. Build an array of the + * encoded elements. + */ + encoded_els = (struct _el_buffer *)MALLOC( + list->count * sizeof(encoded_els[0])); + if(encoded_els == NULL) { + erval.encoded = -1; + erval.failed_type = td; + erval.structure_ptr = ptr; + return erval; + } + + ASN_DEBUG("Encoding members of %s SET OF", td->name); + + /* + * Encode all members. + */ + for(edx = 0; edx < list->count; edx++) { + void *memb_ptr = list->array[edx]; + struct _el_buffer *encoded_el = &encoded_els[eels_count]; + + if(!memb_ptr) continue; + + /* + * Prepare space for encoding. + */ + encoded_el->buf = (uint8_t *)MALLOC(max_encoded_len); + if(encoded_el->buf) { + encoded_el->length = 0; + encoded_el->size = max_encoded_len; + } else { + for(edx--; edx >= 0; edx--) + FREEMEM(encoded_els[edx].buf); + FREEMEM(encoded_els); + erval.encoded = -1; + erval.failed_type = td; + erval.structure_ptr = ptr; + return erval; + } + + /* + * Encode the member into the prepared space. + */ + erval = der_encoder(elm_type, memb_ptr, 0, elm->tag, + _el_addbytes, encoded_el); + if(erval.encoded == -1) { + for(; edx >= 0; edx--) + FREEMEM(encoded_els[edx].buf); + FREEMEM(encoded_els); + return erval; + } + encoding_size += erval.encoded; + eels_count++; + } + + /* + * Sort the encoded elements according to their encoding. + */ + qsort(encoded_els, eels_count, sizeof(encoded_els[0]), _el_buf_cmp); + + /* + * Report encoded elements to the application. + * Dispose of temporary sorted members table. + */ + ret = 0; + for(edx = 0; edx < eels_count; edx++) { + struct _el_buffer *encoded_el = &encoded_els[edx]; + /* Report encoded chunks to the application */ + if(ret == 0 + && cb(encoded_el->buf, encoded_el->length, app_key) < 0) + ret = -1; + FREEMEM(encoded_el->buf); + } + FREEMEM(encoded_els); + + if(ret || computed_size != (size_t)encoding_size) { + /* + * Standard callback failed, or + * encoded size is not equal to the computed size. + */ + erval.encoded = -1; + erval.failed_type = td; + erval.structure_ptr = ptr; + } else { + erval.encoded = computed_size; + } + + ASN__ENCODED_OK(erval); +} + +#undef XER_ADVANCE +#define XER_ADVANCE(num_bytes) do { \ + size_t num = num_bytes; \ + buf_ptr = ((const char *)buf_ptr) + num;\ + size -= num; \ + consumed_myself += num; \ + } while(0) + +/* + * Decode the XER (XML) data. + */ +asn_dec_rval_t +SET_OF_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **struct_ptr, const char *opt_mname, + const void *buf_ptr, size_t size) { + /* + * Bring closer parts of structure description. + */ + asn_SET_OF_specifics_t *specs = (asn_SET_OF_specifics_t *)td->specifics; + asn_TYPE_member_t *element = td->elements; + const char *elm_tag; + const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; + + /* + * ... and parts of the structure being constructed. + */ + void *st = *struct_ptr; /* Target structure. */ + asn_struct_ctx_t *ctx; /* Decoder context */ + + asn_dec_rval_t rval; /* Return value from a decoder */ + ssize_t consumed_myself = 0; /* Consumed bytes from ptr */ + + /* + * Create the target structure if it is not present already. + */ + if(st == 0) { + st = *struct_ptr = CALLOC(1, specs->struct_size); + if(st == 0) RETURN(RC_FAIL); + } + + /* Which tag is expected for the downstream */ + if(specs->as_XMLValueList) { + elm_tag = (specs->as_XMLValueList == 1) ? 0 : ""; + } else { + elm_tag = (*element->name) + ? element->name : element->type->xml_tag; + } + + /* + * Restore parsing context. + */ + ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); + + /* + * Phases of XER/XML processing: + * Phase 0: Check that the opening tag matches our expectations. + * Phase 1: Processing body and reacting on closing tag. + * Phase 2: Processing inner type. + */ + for(; ctx->phase <= 2;) { + pxer_chunk_type_e ch_type; /* XER chunk type */ + ssize_t ch_size; /* Chunk size */ + xer_check_tag_e tcv; /* Tag check value */ + + /* + * Go inside the inner member of a set. + */ + if(ctx->phase == 2) { + asn_dec_rval_t tmprval; + + /* Invoke the inner type decoder, m.b. multiple times */ + ASN_DEBUG("XER/SET OF element [%s]", elm_tag); + tmprval = element->type->xer_decoder(opt_codec_ctx, + element->type, &ctx->ptr, elm_tag, + buf_ptr, size); + if(tmprval.code == RC_OK) { + asn_anonymous_set_ *list = _A_SET_FROM_VOID(st); + if(ASN_SET_ADD(list, ctx->ptr) != 0) + RETURN(RC_FAIL); + ctx->ptr = 0; + XER_ADVANCE(tmprval.consumed); + } else { + XER_ADVANCE(tmprval.consumed); + RETURN(tmprval.code); + } + ctx->phase = 1; /* Back to body processing */ + ASN_DEBUG("XER/SET OF phase => %d", ctx->phase); + /* Fall through */ + } + + /* + * Get the next part of the XML stream. + */ + ch_size = xer_next_token(&ctx->context, + buf_ptr, size, &ch_type); + if(ch_size == -1) { + RETURN(RC_FAIL); + } else { + switch(ch_type) { + case PXER_WMORE: + RETURN(RC_WMORE); + case PXER_COMMENT: /* Got XML comment */ + case PXER_TEXT: /* Ignore free-standing text */ + XER_ADVANCE(ch_size); /* Skip silently */ + continue; + case PXER_TAG: + break; /* Check the rest down there */ + } + } + + tcv = xer_check_tag(buf_ptr, ch_size, xml_tag); + ASN_DEBUG("XER/SET OF: tcv = %d, ph=%d t=%s", + tcv, ctx->phase, xml_tag); + switch(tcv) { + case XCT_CLOSING: + if(ctx->phase == 0) break; + ctx->phase = 0; + /* Fall through */ + case XCT_BOTH: + if(ctx->phase == 0) { + /* No more things to decode */ + XER_ADVANCE(ch_size); + ctx->phase = 3; /* Phase out */ + RETURN(RC_OK); + } + /* Fall through */ + case XCT_OPENING: + if(ctx->phase == 0) { + XER_ADVANCE(ch_size); + ctx->phase = 1; /* Processing body phase */ + continue; + } + /* Fall through */ + case XCT_UNKNOWN_OP: + case XCT_UNKNOWN_BO: + + ASN_DEBUG("XER/SET OF: tcv=%d, ph=%d", tcv, ctx->phase); + if(ctx->phase == 1) { + /* + * Process a single possible member. + */ + ctx->phase = 2; + continue; + } + /* Fall through */ + default: + break; + } + + ASN_DEBUG("Unexpected XML tag in SET OF"); + break; + } + + ctx->phase = 3; /* "Phase out" on hard failure */ + RETURN(RC_FAIL); +} + + + +typedef struct xer_tmp_enc_s { + void *buffer; + size_t offset; + size_t size; +} xer_tmp_enc_t; +static int +SET_OF_encode_xer_callback(const void *buffer, size_t size, void *key) { + xer_tmp_enc_t *t = (xer_tmp_enc_t *)key; + if(t->offset + size >= t->size) { + size_t newsize = (t->size << 2) + size; + void *p = REALLOC(t->buffer, newsize); + if(!p) return -1; + t->buffer = p; + t->size = newsize; + } + memcpy((char *)t->buffer + t->offset, buffer, size); + t->offset += size; + return 0; +} +static int +SET_OF_xer_order(const void *aptr, const void *bptr) { + const xer_tmp_enc_t *a = (const xer_tmp_enc_t *)aptr; + const xer_tmp_enc_t *b = (const xer_tmp_enc_t *)bptr; + size_t minlen = a->offset; + int ret; + if(b->offset < minlen) minlen = b->offset; + /* Well-formed UTF-8 has this nice lexicographical property... */ + ret = memcmp(a->buffer, b->buffer, minlen); + if(ret != 0) return ret; + if(a->offset == b->offset) + return 0; + if(a->offset == minlen) + return -1; + return 1; +} + + +asn_enc_rval_t +SET_OF_encode_xer(asn_TYPE_descriptor_t *td, void *sptr, + int ilevel, enum xer_encoder_flags_e flags, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t er; + asn_SET_OF_specifics_t *specs = (asn_SET_OF_specifics_t *)td->specifics; + asn_TYPE_member_t *elm = td->elements; + asn_anonymous_set_ *list = _A_SET_FROM_VOID(sptr); + const char *mname = specs->as_XMLValueList + ? 0 : ((*elm->name) ? elm->name : elm->type->xml_tag); + size_t mlen = mname ? strlen(mname) : 0; + int xcan = (flags & XER_F_CANONICAL); + xer_tmp_enc_t *encs = 0; + size_t encs_count = 0; + void *original_app_key = app_key; + asn_app_consume_bytes_f *original_cb = cb; + int i; + + if(!sptr) ASN__ENCODE_FAILED; + + if(xcan) { + encs = (xer_tmp_enc_t *)MALLOC(list->count * sizeof(encs[0])); + if(!encs) ASN__ENCODE_FAILED; + cb = SET_OF_encode_xer_callback; + } + + er.encoded = 0; + + for(i = 0; i < list->count; i++) { + asn_enc_rval_t tmper; + + void *memb_ptr = list->array[i]; + if(!memb_ptr) continue; + + if(encs) { + memset(&encs[encs_count], 0, sizeof(encs[0])); + app_key = &encs[encs_count]; + encs_count++; + } + + if(mname) { + if(!xcan) ASN__TEXT_INDENT(1, ilevel); + ASN__CALLBACK3("<", 1, mname, mlen, ">", 1); + } + + if(!xcan && specs->as_XMLValueList == 1) + ASN__TEXT_INDENT(1, ilevel + 1); + tmper = elm->type->xer_encoder(elm->type, memb_ptr, + ilevel + (specs->as_XMLValueList != 2), + flags, cb, app_key); + if(tmper.encoded == -1) { + td = tmper.failed_type; + sptr = tmper.structure_ptr; + goto cb_failed; + } + if(tmper.encoded == 0 && specs->as_XMLValueList) { + const char *name = elm->type->xml_tag; + size_t len = strlen(name); + ASN__CALLBACK3("<", 1, name, len, "/>", 2); + } + + if(mname) { + ASN__CALLBACK3("", 1); + er.encoded += 5; + } + + er.encoded += (2 * mlen) + tmper.encoded; + } + + if(!xcan) ASN__TEXT_INDENT(1, ilevel - 1); + + if(encs) { + xer_tmp_enc_t *enc = encs; + xer_tmp_enc_t *end = encs + encs_count; + ssize_t control_size = 0; + + cb = original_cb; + app_key = original_app_key; + qsort(encs, encs_count, sizeof(encs[0]), SET_OF_xer_order); + + for(; enc < end; enc++) { + ASN__CALLBACK(enc->buffer, enc->offset); + FREEMEM(enc->buffer); + enc->buffer = 0; + control_size += enc->offset; + } + assert(control_size == er.encoded); + } + + goto cleanup; +cb_failed: + er.encoded = -1; + er.failed_type = td; + er.structure_ptr = sptr; +cleanup: + if(encs) { + while(encs_count-- > 0) { + if(encs[encs_count].buffer) + FREEMEM(encs[encs_count].buffer); + } + FREEMEM(encs); + } + ASN__ENCODED_OK(er); +} + +int +SET_OF_print(asn_TYPE_descriptor_t *td, const void *sptr, int ilevel, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_TYPE_member_t *elm = td->elements; + const asn_anonymous_set_ *list = _A_CSET_FROM_VOID(sptr); + int ret; + int i; + + if(!sptr) return (cb("", 8, app_key) < 0) ? -1 : 0; + + /* Dump preamble */ + if(cb(td->name, strlen(td->name), app_key) < 0 + || cb(" ::= {", 6, app_key) < 0) + return -1; + + for(i = 0; i < list->count; i++) { + const void *memb_ptr = list->array[i]; + if(!memb_ptr) continue; + + _i_INDENT(1); + + ret = elm->type->print_struct(elm->type, memb_ptr, + ilevel + 1, cb, app_key); + if(ret) return ret; + } + + ilevel--; + _i_INDENT(1); + + return (cb("}", 1, app_key) < 0) ? -1 : 0; +} + +void +SET_OF_free(asn_TYPE_descriptor_t *td, void *ptr, int contents_only) { + if(td && ptr) { + asn_SET_OF_specifics_t *specs; + asn_TYPE_member_t *elm = td->elements; + asn_anonymous_set_ *list = _A_SET_FROM_VOID(ptr); + asn_struct_ctx_t *ctx; /* Decoder context */ + int i; + + /* + * Could not use set_of_empty() because of (*free) + * incompatibility. + */ + for(i = 0; i < list->count; i++) { + void *memb_ptr = list->array[i]; + if(memb_ptr) + ASN_STRUCT_FREE(*elm->type, memb_ptr); + } + list->count = 0; /* No meaningful elements left */ + + asn_set_empty(list); /* Remove (list->array) */ + + specs = (asn_SET_OF_specifics_t *)td->specifics; + ctx = (asn_struct_ctx_t *)((char *)ptr + specs->ctx_offset); + if(ctx->ptr) { + ASN_STRUCT_FREE(*elm->type, ctx->ptr); + ctx->ptr = 0; + } + + if(!contents_only) { + FREEMEM(ptr); + } + } +} + +int +SET_OF_constraint(asn_TYPE_descriptor_t *td, const void *sptr, + asn_app_constraint_failed_f *ctfailcb, void *app_key) { + asn_TYPE_member_t *elm = td->elements; + asn_constr_check_f *constr; + const asn_anonymous_set_ *list = _A_CSET_FROM_VOID(sptr); + int i; + + if(!sptr) { + ASN__CTFAIL(app_key, td, sptr, + "%s: value not given (%s:%d)", + td->name, __FILE__, __LINE__); + return -1; + } + + constr = elm->memb_constraints; + if(!constr) constr = elm->type->check_constraints; + + /* + * Iterate over the members of an array. + * Validate each in turn, until one fails. + */ + for(i = 0; i < list->count; i++) { + const void *memb_ptr = list->array[i]; + int ret; + + if(!memb_ptr) continue; + + ret = constr(elm->type, memb_ptr, ctfailcb, app_key); + if(ret) return ret; + } + + /* + * Cannot inherit it eralier: + * need to make sure we get the updated version. + */ + if(!elm->memb_constraints) + elm->memb_constraints = elm->type->check_constraints; + + return 0; +} + +asn_dec_rval_t +SET_OF_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + asn_dec_rval_t rv; + asn_SET_OF_specifics_t *specs = (asn_SET_OF_specifics_t *)td->specifics; + asn_TYPE_member_t *elm = td->elements; /* Single one */ + void *st = *sptr; + asn_anonymous_set_ *list; + asn_per_constraint_t *ct; + int repeat = 0; + ssize_t nelems; + + if(ASN__STACK_OVERFLOW_CHECK(opt_codec_ctx)) + ASN__DECODE_FAILED; + + /* + * Create the target structure if it is not present already. + */ + if(!st) { + st = *sptr = CALLOC(1, specs->struct_size); + if(!st) ASN__DECODE_FAILED; + } + list = _A_SET_FROM_VOID(st); + + /* Figure out which constraints to use */ + if(constraints) ct = &constraints->size; + else if(td->per_constraints) ct = &td->per_constraints->size; + else ct = 0; + + if(ct && ct->flags & APC_EXTENSIBLE) { + int value = per_get_few_bits(pd, 1); + if(value < 0) ASN__DECODE_STARVED; + if(value) ct = 0; /* Not restricted! */ + } + + if(ct && ct->effective_bits >= 0) { + /* X.691, #19.5: No length determinant */ + nelems = per_get_few_bits(pd, ct->effective_bits); + ASN_DEBUG("Preparing to fetch %ld+%ld elements from %s", + (long)nelems, ct->lower_bound, td->name); + if(nelems < 0) ASN__DECODE_STARVED; + nelems += ct->lower_bound; + } else { + nelems = -1; + } + + do { + int i; + if(nelems < 0) { + nelems = uper_get_length(pd, + ct ? ct->effective_bits : -1, &repeat); + ASN_DEBUG("Got to decode %d elements (eff %d)", + (int)nelems, (int)(ct ? ct->effective_bits : -1)); + if(nelems < 0) ASN__DECODE_STARVED; + } + + for(i = 0; i < nelems; i++) { + void *ptr = 0; + ASN_DEBUG("SET OF %s decoding", elm->type->name); + rv = elm->type->uper_decoder(opt_codec_ctx, elm->type, + elm->per_constraints, &ptr, pd); + ASN_DEBUG("%s SET OF %s decoded %d, %p", + td->name, elm->type->name, rv.code, ptr); + if(rv.code == RC_OK) { + if(ASN_SET_ADD(list, ptr) == 0) + continue; + ASN_DEBUG("Failed to add element into %s", + td->name); + /* Fall through */ + rv.code = RC_FAIL; + } else { + ASN_DEBUG("Failed decoding %s of %s (SET OF)", + elm->type->name, td->name); + } + if(ptr) ASN_STRUCT_FREE(*elm->type, ptr); + return rv; + } + + nelems = -1; /* Allow uper_get_length() */ + } while(repeat); + + ASN_DEBUG("Decoded %s as SET OF", td->name); + + rv.code = RC_OK; + rv.consumed = 0; + return rv; +} + diff --git a/src/cryptoconditions/src/asn/constr_SET_OF.h b/src/cryptoconditions/src/asn/constr_SET_OF.h new file mode 100644 index 00000000000..75e18cfa0c5 --- /dev/null +++ b/src/cryptoconditions/src/asn/constr_SET_OF.h @@ -0,0 +1,42 @@ +/*- + * Copyright (c) 2003 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _CONSTR_SET_OF_H_ +#define _CONSTR_SET_OF_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef const struct asn_SET_OF_specifics_s { + /* + * Target structure description. + */ + int struct_size; /* Size of the target structure. */ + int ctx_offset; /* Offset of the asn_struct_ctx_t member */ + + /* XER-specific stuff */ + int as_XMLValueList; /* The member type must be encoded like this */ +} asn_SET_OF_specifics_t; + +/* + * A set specialized functions dealing with the SET OF type. + */ +asn_struct_free_f SET_OF_free; +asn_struct_print_f SET_OF_print; +asn_constr_check_f SET_OF_constraint; +ber_type_decoder_f SET_OF_decode_ber; +der_type_encoder_f SET_OF_encode_der; +xer_type_decoder_f SET_OF_decode_xer; +xer_type_encoder_f SET_OF_encode_xer; +per_type_decoder_f SET_OF_decode_uper; +per_type_encoder_f SET_OF_encode_uper; + +#ifdef __cplusplus +} +#endif + +#endif /* _CONSTR_SET_OF_H_ */ diff --git a/src/cryptoconditions/src/asn/constr_TYPE.c b/src/cryptoconditions/src/asn/constr_TYPE.c new file mode 100644 index 00000000000..322f68c86c8 --- /dev/null +++ b/src/cryptoconditions/src/asn/constr_TYPE.c @@ -0,0 +1,77 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * Version of the ASN.1 infrastructure shipped with compiler. + */ +int get_asn1c_environment_version() { return ASN1C_ENVIRONMENT_VERSION; } + +static asn_app_consume_bytes_f _print2fp; + +/* + * Return the outmost tag of the type. + */ +ber_tlv_tag_t +asn_TYPE_outmost_tag(const asn_TYPE_descriptor_t *type_descriptor, + const void *struct_ptr, int tag_mode, ber_tlv_tag_t tag) { + + if(tag_mode) + return tag; + + if(type_descriptor->tags_count) + return type_descriptor->tags[0]; + + return type_descriptor->outmost_tag(type_descriptor, struct_ptr, 0, 0); +} + +/* + * Print the target language's structure in human readable form. + */ +int +asn_fprint(FILE *stream, asn_TYPE_descriptor_t *td, const void *struct_ptr) { + if(!stream) stream = stdout; + if(!td || !struct_ptr) { + errno = EINVAL; + return -1; + } + + /* Invoke type-specific printer */ + if(td->print_struct(td, struct_ptr, 1, _print2fp, stream)) + return -1; + + /* Terminate the output */ + if(_print2fp("\n", 1, stream)) + return -1; + + return fflush(stream); +} + +/* Dump the data into the specified stdio stream */ +static int +_print2fp(const void *buffer, size_t size, void *app_key) { + FILE *stream = (FILE *)app_key; + + if(fwrite(buffer, 1, size, stream) != size) + return -1; + + return 0; +} + + +/* + * Some compilers do not support variable args macros. + * This function is a replacement of ASN_DEBUG() macro. + */ +void ASN_DEBUG_f(const char *fmt, ...); +void ASN_DEBUG_f(const char *fmt, ...) { + va_list ap; + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + va_end(ap); +} diff --git a/src/cryptoconditions/src/asn/constr_TYPE.h b/src/cryptoconditions/src/asn/constr_TYPE.h new file mode 100644 index 00000000000..a9cd86dc3d6 --- /dev/null +++ b/src/cryptoconditions/src/asn/constr_TYPE.h @@ -0,0 +1,180 @@ +/*- + * Copyright (c) 2003, 2004, 2005, 2006 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +/* + * This file contains the declaration structure called "ASN.1 Type Definition", + * which holds all information necessary for encoding and decoding routines. + * This structure even contains pointer to these encoding and decoding routines + * for each defined ASN.1 type. + */ +#ifndef _CONSTR_TYPE_H_ +#define _CONSTR_TYPE_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ +struct asn_TYPE_member_s; /* Forward declaration */ + +/* + * This type provides the context information for various ASN.1 routines, + * primarily ones doing decoding. A member _asn_ctx of this type must be + * included into certain target language's structures, such as compound types. + */ +typedef struct asn_struct_ctx_s { + short phase; /* Decoding phase */ + short step; /* Elementary step of a phase */ + int context; /* Other context information */ + void *ptr; /* Decoder-specific stuff (stack elements) */ + ber_tlv_len_t left; /* Number of bytes left, -1 for indefinite */ +} asn_struct_ctx_t; + +#include /* Basic Encoding Rules decoder */ +#include /* Distinguished Encoding Rules encoder */ +#include /* Decoder of XER (XML, text) */ +#include /* Encoder into XER (XML, text) */ +#include /* Packet Encoding Rules decoder */ +#include /* Packet Encoding Rules encoder */ +#include /* Subtype constraints support */ + +/* + * Free the structure according to its specification. + * If (free_contents_only) is set, the wrapper structure itself (struct_ptr) + * will not be freed. (It may be useful in case the structure is allocated + * statically or arranged on the stack, yet its elements are allocated + * dynamically.) + */ +typedef void (asn_struct_free_f)( + struct asn_TYPE_descriptor_s *type_descriptor, + void *struct_ptr, int free_contents_only); +#define ASN_STRUCT_FREE(asn_DEF, ptr) (asn_DEF).free_struct(&(asn_DEF),ptr,0) +#define ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF, ptr) \ + (asn_DEF).free_struct(&(asn_DEF),ptr,1) + +/* + * Print the structure according to its specification. + */ +typedef int (asn_struct_print_f)( + struct asn_TYPE_descriptor_s *type_descriptor, + const void *struct_ptr, + int level, /* Indentation level */ + asn_app_consume_bytes_f *callback, void *app_key); + +/* + * Return the outmost tag of the type. + * If the type is untagged CHOICE, the dynamic operation is performed. + * NOTE: This function pointer type is only useful internally. + * Do not use it in your application. + */ +typedef ber_tlv_tag_t (asn_outmost_tag_f)( + const struct asn_TYPE_descriptor_s *type_descriptor, + const void *struct_ptr, int tag_mode, ber_tlv_tag_t tag); +/* The instance of the above function type; used internally. */ +asn_outmost_tag_f asn_TYPE_outmost_tag; + + +/* + * The definitive description of the destination language's structure. + */ +typedef struct asn_TYPE_descriptor_s { + const char *name; /* A name of the ASN.1 type. "" in some cases. */ + const char *xml_tag; /* Name used in XML tag */ + + /* + * Generalized functions for dealing with the specific type. + * May be directly invoked by applications. + */ + asn_struct_free_f *free_struct; /* Free the structure */ + asn_struct_print_f *print_struct; /* Human readable output */ + asn_constr_check_f *check_constraints; /* Constraints validator */ + ber_type_decoder_f *ber_decoder; /* Generic BER decoder */ + der_type_encoder_f *der_encoder; /* Canonical DER encoder */ + xer_type_decoder_f *xer_decoder; /* Generic XER decoder */ + xer_type_encoder_f *xer_encoder; /* [Canonical] XER encoder */ + per_type_decoder_f *uper_decoder; /* Unaligned PER decoder */ + per_type_encoder_f *uper_encoder; /* Unaligned PER encoder */ + + /*********************************************************************** + * Internally useful members. Not to be used by applications directly. * + **********************************************************************/ + + /* + * Tags that are expected to occur. + */ + asn_outmost_tag_f *outmost_tag; /* */ + const ber_tlv_tag_t *tags; /* Effective tags sequence for this type */ + int tags_count; /* Number of tags which are expected */ + const ber_tlv_tag_t *all_tags; /* Every tag for BER/containment */ + int all_tags_count; /* Number of tags */ + + asn_per_constraints_t *per_constraints; /* PER compiled constraints */ + + /* + * An ASN.1 production type members (members of SEQUENCE, SET, CHOICE). + */ + struct asn_TYPE_member_s *elements; + int elements_count; + + /* + * Additional information describing the type, used by appropriate + * functions above. + */ + const void *specifics; +} asn_TYPE_descriptor_t; + +/* + * This type describes an element of the constructed type, + * i.e. SEQUENCE, SET, CHOICE, etc. + */ + enum asn_TYPE_flags_e { + ATF_NOFLAGS, + ATF_POINTER = 0x01, /* Represented by the pointer */ + ATF_OPEN_TYPE = 0x02 /* ANY type, without meaningful tag */ + }; +typedef struct asn_TYPE_member_s { + enum asn_TYPE_flags_e flags; /* Element's presentation flags */ + int optional; /* Following optional members, including current */ + int memb_offset; /* Offset of the element */ + ber_tlv_tag_t tag; /* Outmost (most immediate) tag */ + int tag_mode; /* IMPLICIT/no/EXPLICIT tag at current level */ + asn_TYPE_descriptor_t *type; /* Member type descriptor */ + asn_constr_check_f *memb_constraints; /* Constraints validator */ + asn_per_constraints_t *per_constraints; /* PER compiled constraints */ + int (*default_value)(int setval, void **sptr); /* DEFAULT */ + const char *name; /* ASN.1 identifier of the element */ +} asn_TYPE_member_t; + +/* + * BER tag to element number mapping. + */ +typedef struct asn_TYPE_tag2member_s { + ber_tlv_tag_t el_tag; /* Outmost tag of the member */ + int el_no; /* Index of the associated member, base 0 */ + int toff_first; /* First occurence of the el_tag, relative */ + int toff_last; /* Last occurence of the el_tag, relatvie */ +} asn_TYPE_tag2member_t; + +/* + * This function is a wrapper around (td)->print_struct, which prints out + * the contents of the target language's structure (struct_ptr) into the + * file pointer (stream) in human readable form. + * RETURN VALUES: + * 0: The structure is printed. + * -1: Problem dumping the structure. + * (See also xer_fprint() in xer_encoder.h) + */ +int asn_fprint(FILE *stream, /* Destination stream descriptor */ + asn_TYPE_descriptor_t *td, /* ASN.1 type descriptor */ + const void *struct_ptr); /* Structure to be printed */ + +#ifdef __cplusplus +} +#endif + +#endif /* _CONSTR_TYPE_H_ */ diff --git a/src/cryptoconditions/src/asn/constraints.c b/src/cryptoconditions/src/asn/constraints.c new file mode 100644 index 00000000000..1bdda73e5d6 --- /dev/null +++ b/src/cryptoconditions/src/asn/constraints.c @@ -0,0 +1,93 @@ +#include "asn_internal.h" +#include "constraints.h" + +int +asn_generic_no_constraint(asn_TYPE_descriptor_t *type_descriptor, + const void *struct_ptr, asn_app_constraint_failed_f *cb, void *key) { + + (void)type_descriptor; /* Unused argument */ + (void)struct_ptr; /* Unused argument */ + (void)cb; /* Unused argument */ + (void)key; /* Unused argument */ + + /* Nothing to check */ + return 0; +} + +int +asn_generic_unknown_constraint(asn_TYPE_descriptor_t *type_descriptor, + const void *struct_ptr, asn_app_constraint_failed_f *cb, void *key) { + + (void)type_descriptor; /* Unused argument */ + (void)struct_ptr; /* Unused argument */ + (void)cb; /* Unused argument */ + (void)key; /* Unused argument */ + + /* Unknown how to check */ + return 0; +} + +struct errbufDesc { + asn_TYPE_descriptor_t *failed_type; + const void *failed_struct_ptr; + char *errbuf; + size_t errlen; +}; + +static void +_asn_i_ctfailcb(void *key, asn_TYPE_descriptor_t *td, const void *sptr, const char *fmt, ...) { + struct errbufDesc *arg = key; + va_list ap; + ssize_t vlen; + ssize_t maxlen; + + arg->failed_type = td; + arg->failed_struct_ptr = sptr; + + maxlen = arg->errlen; + if(maxlen <= 0) + return; + + va_start(ap, fmt); + vlen = vsnprintf(arg->errbuf, maxlen, fmt, ap); + va_end(ap); + if(vlen >= maxlen) { + arg->errbuf[maxlen-1] = '\0'; /* Ensuring libc correctness */ + arg->errlen = maxlen - 1; /* Not counting termination */ + return; + } else if(vlen >= 0) { + arg->errbuf[vlen] = '\0'; /* Ensuring libc correctness */ + arg->errlen = vlen; /* Not counting termination */ + } else { + /* + * The libc on this system is broken. + */ + vlen = sizeof("") - 1; + maxlen--; + arg->errlen = vlen < maxlen ? vlen : maxlen; + memcpy(arg->errbuf, "", arg->errlen); + arg->errbuf[arg->errlen] = 0; + } + + return; +} + +int +asn_check_constraints(asn_TYPE_descriptor_t *type_descriptor, + const void *struct_ptr, char *errbuf, size_t *errlen) { + struct errbufDesc arg; + int ret; + + arg.failed_type = 0; + arg.failed_struct_ptr = 0; + arg.errbuf = errbuf; + arg.errlen = errlen ? *errlen : 0; + + ret = type_descriptor->check_constraints(type_descriptor, + struct_ptr, _asn_i_ctfailcb, &arg); + if(ret == -1 && errlen) + *errlen = arg.errlen; + + return ret; +} + diff --git a/src/cryptoconditions/src/asn/constraints.h b/src/cryptoconditions/src/asn/constraints.h new file mode 100644 index 00000000000..48d49e246a3 --- /dev/null +++ b/src/cryptoconditions/src/asn/constraints.h @@ -0,0 +1,63 @@ +/*- + * Copyright (c) 2004, 2006 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef ASN1_CONSTRAINTS_VALIDATOR_H +#define ASN1_CONSTRAINTS_VALIDATOR_H + +#include /* Platform-dependent types */ + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* + * Validate the structure according to the ASN.1 constraints. + * If errbuf and errlen are given, they shall be pointing to the appropriate + * buffer space and its length before calling this function. Alternatively, + * they could be passed as NULL's. If constraints validation fails, + * errlen will contain the actual number of bytes taken from the errbuf + * to encode an error message (properly 0-terminated). + * + * RETURN VALUES: + * This function returns 0 in case all ASN.1 constraints are met + * and -1 if one or more constraints were failed. + */ +int +asn_check_constraints(struct asn_TYPE_descriptor_s *type_descriptor, + const void *struct_ptr, /* Target language's structure */ + char *errbuf, /* Returned error description */ + size_t *errlen /* Length of the error description */ + ); + + +/* + * Generic type for constraint checking callback, + * associated with every type descriptor. + */ +typedef int (asn_constr_check_f)( + struct asn_TYPE_descriptor_s *type_descriptor, + const void *struct_ptr, + asn_app_constraint_failed_f *optional_callback, /* Log the error */ + void *optional_app_key /* Opaque key passed to a callback */ + ); + +/******************************* + * INTERNALLY USEFUL FUNCTIONS * + *******************************/ + +asn_constr_check_f asn_generic_no_constraint; /* No constraint whatsoever */ +asn_constr_check_f asn_generic_unknown_constraint; /* Not fully supported */ + +/* + * Invoke the callback with a complete error message. + */ +#define ASN__CTFAIL if(ctfailcb) ctfailcb + +#ifdef __cplusplus +} +#endif + +#endif /* ASN1_CONSTRAINTS_VALIDATOR_H */ diff --git a/src/cryptoconditions/src/asn/der_encoder.c b/src/cryptoconditions/src/asn/der_encoder.c new file mode 100644 index 00000000000..1c014802a8e --- /dev/null +++ b/src/cryptoconditions/src/asn/der_encoder.c @@ -0,0 +1,201 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +static ssize_t der_write_TL(ber_tlv_tag_t tag, ber_tlv_len_t len, + asn_app_consume_bytes_f *cb, void *app_key, int constructed); + +/* + * The DER encoder of any type. + */ +asn_enc_rval_t +der_encode(asn_TYPE_descriptor_t *type_descriptor, void *struct_ptr, + asn_app_consume_bytes_f *consume_bytes, void *app_key) { + + ASN_DEBUG("DER encoder invoked for %s", + type_descriptor->name); + + /* + * Invoke type-specific encoder. + */ + return type_descriptor->der_encoder(type_descriptor, + struct_ptr, /* Pointer to the destination structure */ + 0, 0, + consume_bytes, app_key); +} + +/* + * Argument type and callback necessary for der_encode_to_buffer(). + */ +typedef struct enc_to_buf_arg { + void *buffer; + size_t left; +} enc_to_buf_arg; +static int encode_to_buffer_cb(const void *buffer, size_t size, void *key) { + enc_to_buf_arg *arg = (enc_to_buf_arg *)key; + + if(arg->left < size) + return -1; /* Data exceeds the available buffer size */ + + memcpy(arg->buffer, buffer, size); + arg->buffer = ((char *)arg->buffer) + size; + arg->left -= size; + + return 0; +} + +/* + * A variant of the der_encode() which encodes the data into the provided buffer + */ +asn_enc_rval_t +der_encode_to_buffer(asn_TYPE_descriptor_t *type_descriptor, void *struct_ptr, + void *buffer, size_t buffer_size) { + enc_to_buf_arg arg; + asn_enc_rval_t ec; + + arg.buffer = buffer; + arg.left = buffer_size; + + ec = type_descriptor->der_encoder(type_descriptor, + struct_ptr, /* Pointer to the destination structure */ + 0, 0, encode_to_buffer_cb, &arg); + if(ec.encoded != -1) { + assert(ec.encoded == (ssize_t)(buffer_size - arg.left)); + /* Return the encoded contents size */ + } + return ec; +} + + +/* + * Write out leading TL[v] sequence according to the type definition. + */ +ssize_t +der_write_tags(asn_TYPE_descriptor_t *sd, + size_t struct_length, + int tag_mode, int last_tag_form, + ber_tlv_tag_t tag, /* EXPLICIT or IMPLICIT tag */ + asn_app_consume_bytes_f *cb, + void *app_key) { + const ber_tlv_tag_t *tags; /* Copy of tags stream */ + int tags_count; /* Number of tags */ + size_t overall_length; + ssize_t *lens; + int i; + + ASN_DEBUG("Writing tags (%s, tm=%d, tc=%d, tag=%s, mtc=%d)", + sd->name, tag_mode, sd->tags_count, + ber_tlv_tag_string(tag), + tag_mode + ?(sd->tags_count+1 + -((tag_mode == -1) && sd->tags_count)) + :sd->tags_count + ); + + if(tag_mode) { + /* + * Instead of doing shaman dance like we do in ber_check_tags(), + * allocate a small array on the stack + * and initialize it appropriately. + */ + int stag_offset; + ber_tlv_tag_t *tags_buf; + tags_buf = (ber_tlv_tag_t *)alloca((sd->tags_count + 1) * sizeof(ber_tlv_tag_t)); + if(!tags_buf) { /* Can fail on !x86 */ + errno = ENOMEM; + return -1; + } + tags_count = sd->tags_count + + 1 /* EXPLICIT or IMPLICIT tag is given */ + - ((tag_mode == -1) && sd->tags_count); + /* Copy tags over */ + tags_buf[0] = tag; + stag_offset = -1 + ((tag_mode == -1) && sd->tags_count); + for(i = 1; i < tags_count; i++) + tags_buf[i] = sd->tags[i + stag_offset]; + tags = tags_buf; + } else { + tags = sd->tags; + tags_count = sd->tags_count; + } + + /* No tags to write */ + if(tags_count == 0) + return 0; + + lens = (ssize_t *)alloca(tags_count * sizeof(lens[0])); + if(!lens) { + errno = ENOMEM; + return -1; + } + + /* + * Array of tags is initialized. + * Now, compute the size of the TLV pairs, from right to left. + */ + overall_length = struct_length; + for(i = tags_count - 1; i >= 0; --i) { + lens[i] = der_write_TL(tags[i], overall_length, 0, 0, 0); + if(lens[i] == -1) return -1; + overall_length += lens[i]; + lens[i] = overall_length - lens[i]; + } + + if(!cb) return overall_length - struct_length; + + ASN_DEBUG("%s %s TL sequence (%d elements)", + cb?"Encoding":"Estimating", sd->name, tags_count); + + /* + * Encode the TL sequence for real. + */ + for(i = 0; i < tags_count; i++) { + ssize_t len; + int _constr; + + /* Check if this tag happens to be constructed */ + _constr = (last_tag_form || i < (tags_count - 1)); + + len = der_write_TL(tags[i], lens[i], cb, app_key, _constr); + if(len == -1) return -1; + } + + return overall_length - struct_length; +} + +static ssize_t +der_write_TL(ber_tlv_tag_t tag, ber_tlv_len_t len, + asn_app_consume_bytes_f *cb, void *app_key, + int constructed) { + uint8_t buf[32]; + size_t size = 0; + int buf_size = cb?sizeof(buf):0; + ssize_t tmp; + + /* Serialize tag (T from TLV) into possibly zero-length buffer */ + tmp = ber_tlv_tag_serialize(tag, buf, buf_size); + if(tmp == -1 || tmp > (ssize_t)sizeof(buf)) return -1; + size += tmp; + + /* Serialize length (L from TLV) into possibly zero-length buffer */ + tmp = der_tlv_length_serialize(len, buf+size, buf_size?buf_size-size:0); + if(tmp == -1) return -1; + size += tmp; + + if(size > sizeof(buf)) + return -1; + + /* + * If callback is specified, invoke it, and check its return value. + */ + if(cb) { + if(constructed) *buf |= 0x20; + if(cb(buf, size, app_key) < 0) + return -1; + } + + return size; +} diff --git a/src/cryptoconditions/src/asn/der_encoder.h b/src/cryptoconditions/src/asn/der_encoder.h new file mode 100644 index 00000000000..61431c6dbdc --- /dev/null +++ b/src/cryptoconditions/src/asn/der_encoder.h @@ -0,0 +1,68 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _DER_ENCODER_H_ +#define _DER_ENCODER_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* + * The DER encoder of any type. May be invoked by the application. + * The ber_decode() function (ber_decoder.h) is an opposite of der_encode(). + */ +asn_enc_rval_t der_encode(struct asn_TYPE_descriptor_s *type_descriptor, + void *struct_ptr, /* Structure to be encoded */ + asn_app_consume_bytes_f *consume_bytes_cb, + void *app_key /* Arbitrary callback argument */ + ); + +/* A variant of der_encode() which encodes data into the pre-allocated buffer */ +asn_enc_rval_t der_encode_to_buffer( + struct asn_TYPE_descriptor_s *type_descriptor, + void *struct_ptr, /* Structure to be encoded */ + void *buffer, /* Pre-allocated buffer */ + size_t buffer_size /* Initial buffer size (maximum) */ + ); + +/* + * Type of the generic DER encoder. + */ +typedef asn_enc_rval_t (der_type_encoder_f)( + struct asn_TYPE_descriptor_s *type_descriptor, + void *struct_ptr, /* Structure to be encoded */ + int tag_mode, /* {-1,0,1}: IMPLICIT, no, EXPLICIT */ + ber_tlv_tag_t tag, + asn_app_consume_bytes_f *consume_bytes_cb, /* Callback */ + void *app_key /* Arbitrary callback argument */ + ); + + +/******************************* + * INTERNALLY USEFUL FUNCTIONS * + *******************************/ + +/* + * Write out leading TL[v] sequence according to the type definition. + */ +ssize_t der_write_tags( + struct asn_TYPE_descriptor_s *type_descriptor, + size_t struct_length, + int tag_mode, /* {-1,0,1}: IMPLICIT, no, EXPLICIT */ + int last_tag_form, /* {0,!0}: prim, constructed */ + ber_tlv_tag_t tag, + asn_app_consume_bytes_f *consume_bytes_cb, + void *app_key + ); + +#ifdef __cplusplus +} +#endif + +#endif /* _DER_ENCODER_H_ */ diff --git a/src/cryptoconditions/src/asn/per_decoder.c b/src/cryptoconditions/src/asn/per_decoder.c new file mode 100644 index 00000000000..461b7262f1d --- /dev/null +++ b/src/cryptoconditions/src/asn/per_decoder.c @@ -0,0 +1,93 @@ +#include +#include +#include + +/* + * Decode a "Production of a complete encoding", X.691#10.1. + * The complete encoding contains at least one byte, and is an integral + * multiple of 8 bytes. + */ +asn_dec_rval_t +uper_decode_complete(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const void *buffer, size_t size) { + asn_dec_rval_t rval; + + rval = uper_decode(opt_codec_ctx, td, sptr, buffer, size, 0, 0); + if(rval.consumed) { + /* + * We've always given 8-aligned data, + * so convert bits to integral bytes. + */ + rval.consumed += 7; + rval.consumed >>= 3; + } else if(rval.code == RC_OK) { + if(size) { + if(((const uint8_t *)buffer)[0] == 0) { + rval.consumed = 1; /* 1 byte */ + } else { + ASN_DEBUG("Expecting single zeroed byte"); + rval.code = RC_FAIL; + } + } else { + /* Must contain at least 8 bits. */ + rval.code = RC_WMORE; + } + } + + return rval; +} + +asn_dec_rval_t +uper_decode(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, void **sptr, const void *buffer, size_t size, int skip_bits, int unused_bits) { + asn_codec_ctx_t s_codec_ctx; + asn_dec_rval_t rval; + asn_per_data_t pd; + + if(skip_bits < 0 || skip_bits > 7 + || unused_bits < 0 || unused_bits > 7 + || (unused_bits > 0 && !size)) + ASN__DECODE_FAILED; + + /* + * Stack checker requires that the codec context + * must be allocated on the stack. + */ + if(opt_codec_ctx) { + if(opt_codec_ctx->max_stack_size) { + s_codec_ctx = *opt_codec_ctx; + opt_codec_ctx = &s_codec_ctx; + } + } else { + /* If context is not given, be security-conscious anyway */ + memset(&s_codec_ctx, 0, sizeof(s_codec_ctx)); + s_codec_ctx.max_stack_size = ASN__DEFAULT_STACK_MAX; + opt_codec_ctx = &s_codec_ctx; + } + + /* Fill in the position indicator */ + memset(&pd, 0, sizeof(pd)); + pd.buffer = (const uint8_t *)buffer; + pd.nboff = skip_bits; + pd.nbits = 8 * size - unused_bits; /* 8 is CHAR_BIT from */ + if(pd.nboff > pd.nbits) + ASN__DECODE_FAILED; + + /* + * Invoke type-specific decoder. + */ + if(!td->uper_decoder) + ASN__DECODE_FAILED; /* PER is not compiled in */ + rval = td->uper_decoder(opt_codec_ctx, td, 0, sptr, &pd); + if(rval.code == RC_OK) { + /* Return the number of consumed bits */ + rval.consumed = ((pd.buffer - (const uint8_t *)buffer) << 3) + + pd.nboff - skip_bits; + ASN_DEBUG("PER decoding consumed %ld, counted %ld", + (long)rval.consumed, (long)pd.moved); + assert(rval.consumed == pd.moved); + } else { + /* PER codec is not a restartable */ + rval.consumed = 0; + } + return rval; +} + diff --git a/src/cryptoconditions/src/asn/per_decoder.h b/src/cryptoconditions/src/asn/per_decoder.h new file mode 100644 index 00000000000..8397a545fb9 --- /dev/null +++ b/src/cryptoconditions/src/asn/per_decoder.h @@ -0,0 +1,56 @@ +/*- + * Copyright (c) 2005, 2007 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _PER_DECODER_H_ +#define _PER_DECODER_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* + * Unaligned PER decoder of a "complete encoding" as per X.691#10.1. + * On success, this call always returns (.consumed >= 1), as per X.691#10.1.3. + */ +asn_dec_rval_t uper_decode_complete(struct asn_codec_ctx_s *opt_codec_ctx, + struct asn_TYPE_descriptor_s *type_descriptor, /* Type to decode */ + void **struct_ptr, /* Pointer to a target structure's pointer */ + const void *buffer, /* Data to be decoded */ + size_t size /* Size of data buffer */ + ); + +/* + * Unaligned PER decoder of any ASN.1 type. May be invoked by the application. + * WARNING: This call returns the number of BITS read from the stream. Beware. + */ +asn_dec_rval_t uper_decode(struct asn_codec_ctx_s *opt_codec_ctx, + struct asn_TYPE_descriptor_s *type_descriptor, /* Type to decode */ + void **struct_ptr, /* Pointer to a target structure's pointer */ + const void *buffer, /* Data to be decoded */ + size_t size, /* Size of data buffer */ + int skip_bits, /* Number of unused leading bits, 0..7 */ + int unused_bits /* Number of unused tailing bits, 0..7 */ + ); + + +/* + * Type of the type-specific PER decoder function. + */ +typedef asn_dec_rval_t (per_type_decoder_f)(asn_codec_ctx_t *opt_codec_ctx, + struct asn_TYPE_descriptor_s *type_descriptor, + asn_per_constraints_t *constraints, + void **struct_ptr, + asn_per_data_t *per_data + ); + +#ifdef __cplusplus +} +#endif + +#endif /* _PER_DECODER_H_ */ diff --git a/src/cryptoconditions/src/asn/per_encoder.c b/src/cryptoconditions/src/asn/per_encoder.c new file mode 100644 index 00000000000..47f3c916dac --- /dev/null +++ b/src/cryptoconditions/src/asn/per_encoder.c @@ -0,0 +1,151 @@ +#include +#include +#include + +static asn_enc_rval_t uper_encode_internal(asn_TYPE_descriptor_t *td, asn_per_constraints_t *, void *sptr, asn_app_consume_bytes_f *cb, void *app_key); + +asn_enc_rval_t +uper_encode(asn_TYPE_descriptor_t *td, void *sptr, asn_app_consume_bytes_f *cb, void *app_key) { + return uper_encode_internal(td, 0, sptr, cb, app_key); +} + +/* + * Argument type and callback necessary for uper_encode_to_buffer(). + */ +typedef struct enc_to_buf_arg { + void *buffer; + size_t left; +} enc_to_buf_arg; +static int encode_to_buffer_cb(const void *buffer, size_t size, void *key) { + enc_to_buf_arg *arg = (enc_to_buf_arg *)key; + + if(arg->left < size) + return -1; /* Data exceeds the available buffer size */ + + memcpy(arg->buffer, buffer, size); + arg->buffer = ((char *)arg->buffer) + size; + arg->left -= size; + + return 0; +} + +asn_enc_rval_t +uper_encode_to_buffer(asn_TYPE_descriptor_t *td, void *sptr, void *buffer, size_t buffer_size) { + enc_to_buf_arg key; + + key.buffer = buffer; + key.left = buffer_size; + + if(td) ASN_DEBUG("Encoding \"%s\" using UNALIGNED PER", td->name); + + return uper_encode_internal(td, 0, sptr, encode_to_buffer_cb, &key); +} + +typedef struct enc_dyn_arg { + void *buffer; + size_t length; + size_t allocated; +} enc_dyn_arg; +static int +encode_dyn_cb(const void *buffer, size_t size, void *key) { + enc_dyn_arg *arg = key; + if(arg->length + size >= arg->allocated) { + void *p; + arg->allocated = arg->allocated ? (arg->allocated << 2) : size; + p = REALLOC(arg->buffer, arg->allocated); + if(!p) { + FREEMEM(arg->buffer); + memset(arg, 0, sizeof(*arg)); + return -1; + } + arg->buffer = p; + } + memcpy(((char *)arg->buffer) + arg->length, buffer, size); + arg->length += size; + return 0; +} +ssize_t +uper_encode_to_new_buffer(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, void **buffer_r) { + asn_enc_rval_t er; + enc_dyn_arg key; + + memset(&key, 0, sizeof(key)); + + er = uper_encode_internal(td, constraints, sptr, encode_dyn_cb, &key); + switch(er.encoded) { + case -1: + FREEMEM(key.buffer); + return -1; + case 0: + FREEMEM(key.buffer); + key.buffer = MALLOC(1); + if(key.buffer) { + *(char *)key.buffer = '\0'; + *buffer_r = key.buffer; + return 1; + } else { + return -1; + } + default: + *buffer_r = key.buffer; + ASN_DEBUG("Complete encoded in %ld bits", (long)er.encoded); + return ((er.encoded + 7) >> 3); + } +} + +/* + * Internally useful functions. + */ + +/* Flush partially filled buffer */ +static int +_uper_encode_flush_outp(asn_per_outp_t *po) { + uint8_t *buf; + + if(po->nboff == 0 && po->buffer == po->tmpspace) + return 0; + + buf = po->buffer + (po->nboff >> 3); + /* Make sure we account for the last, partially filled */ + if(po->nboff & 0x07) { + buf[0] &= 0xff << (8 - (po->nboff & 0x07)); + buf++; + } + + return po->outper(po->tmpspace, buf - po->tmpspace, po->op_key); +} + +static asn_enc_rval_t +uper_encode_internal(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_app_consume_bytes_f *cb, void *app_key) { + asn_per_outp_t po; + asn_enc_rval_t er; + + /* + * Invoke type-specific encoder. + */ + if(!td || !td->uper_encoder) + ASN__ENCODE_FAILED; /* PER is not compiled in */ + + po.buffer = po.tmpspace; + po.nboff = 0; + po.nbits = 8 * sizeof(po.tmpspace); + po.outper = cb; + po.op_key = app_key; + po.flushed_bytes = 0; + + er = td->uper_encoder(td, constraints, sptr, &po); + if(er.encoded != -1) { + size_t bits_to_flush; + + bits_to_flush = ((po.buffer - po.tmpspace) << 3) + po.nboff; + + /* Set number of bits encoded to a firm value */ + er.encoded = (po.flushed_bytes << 3) + bits_to_flush; + + if(_uper_encode_flush_outp(&po)) + ASN__ENCODE_FAILED; + } + + return er; +} + diff --git a/src/cryptoconditions/src/asn/per_encoder.h b/src/cryptoconditions/src/asn/per_encoder.h new file mode 100644 index 00000000000..95a6506e47b --- /dev/null +++ b/src/cryptoconditions/src/asn/per_encoder.h @@ -0,0 +1,69 @@ +/*- + * Copyright (c) 2006, 2007 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _PER_ENCODER_H_ +#define _PER_ENCODER_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* + * Unaligned PER encoder of any ASN.1 type. May be invoked by the application. + * WARNING: This function returns the number of encoded bits in the .encoded + * field of the return value. Use the following formula to convert to bytes: + * bytes = ((.encoded + 7) / 8) + */ +asn_enc_rval_t uper_encode(struct asn_TYPE_descriptor_s *type_descriptor, + void *struct_ptr, /* Structure to be encoded */ + asn_app_consume_bytes_f *consume_bytes_cb, /* Data collector */ + void *app_key /* Arbitrary callback argument */ +); + +/* + * A variant of uper_encode() which encodes data into the existing buffer + * WARNING: This function returns the number of encoded bits in the .encoded + * field of the return value. + */ +asn_enc_rval_t uper_encode_to_buffer( + struct asn_TYPE_descriptor_s *type_descriptor, + void *struct_ptr, /* Structure to be encoded */ + void *buffer, /* Pre-allocated buffer */ + size_t buffer_size /* Initial buffer size (max) */ +); + +/* + * A variant of uper_encode_to_buffer() which allocates buffer itself. + * Returns the number of bytes in the buffer or -1 in case of failure. + * WARNING: This function produces a "Production of the complete encoding", + * with length of at least one octet. Contrast this to precise bit-packing + * encoding of uper_encode() and uper_encode_to_buffer(). + */ +ssize_t uper_encode_to_new_buffer( + struct asn_TYPE_descriptor_s *type_descriptor, + asn_per_constraints_t *constraints, + void *struct_ptr, /* Structure to be encoded */ + void **buffer_r /* Buffer allocated and returned */ +); + +/* + * Type of the generic PER encoder function. + */ +typedef asn_enc_rval_t (per_type_encoder_f)( + struct asn_TYPE_descriptor_s *type_descriptor, + asn_per_constraints_t *constraints, + void *struct_ptr, + asn_per_outp_t *per_output +); + +#ifdef __cplusplus +} +#endif + +#endif /* _PER_ENCODER_H_ */ diff --git a/src/cryptoconditions/src/asn/per_opentype.c b/src/cryptoconditions/src/asn/per_opentype.c new file mode 100644 index 00000000000..404aa726455 --- /dev/null +++ b/src/cryptoconditions/src/asn/per_opentype.c @@ -0,0 +1,378 @@ +/* + * Copyright (c) 2007 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include +#include + +typedef struct uper_ugot_key { + asn_per_data_t oldpd; /* Old per data source */ + size_t unclaimed; + size_t ot_moved; /* Number of bits moved by OT processing */ + int repeat; +} uper_ugot_key; + +static int uper_ugot_refill(asn_per_data_t *pd); +static int per_skip_bits(asn_per_data_t *pd, int skip_nbits); +static asn_dec_rval_t uper_sot_suck(asn_codec_ctx_t *, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd); + +/* + * Encode an "open type field". + * #10.1, #10.2 + */ +int +uper_open_type_put(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po) { + void *buf; + void *bptr; + ssize_t size; + size_t toGo; + + ASN_DEBUG("Open type put %s ...", td->name); + + size = uper_encode_to_new_buffer(td, constraints, sptr, &buf); + if(size <= 0) return -1; + + for(bptr = buf, toGo = size; toGo;) { + ssize_t maySave = uper_put_length(po, toGo); + ASN_DEBUG("Prepending length %d to %s and allowing to save %d", + (int)size, td->name, (int)maySave); + if(maySave < 0) break; + if(per_put_many_bits(po, bptr, maySave * 8)) break; + bptr = (char *)bptr + maySave; + toGo -= maySave; + } + + FREEMEM(buf); + if(toGo) return -1; + + ASN_DEBUG("Open type put %s of length %ld + overhead (1byte?)", + td->name, (long)size); + + return 0; +} + +static asn_dec_rval_t +uper_open_type_get_simple(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + asn_dec_rval_t rv; + ssize_t chunk_bytes; + int repeat; + uint8_t *buf = 0; + size_t bufLen = 0; + size_t bufSize = 0; + asn_per_data_t spd; + size_t padding; + + ASN__STACK_OVERFLOW_CHECK(ctx); + + ASN_DEBUG("Getting open type %s...", td->name); + + do { + chunk_bytes = uper_get_length(pd, -1, &repeat); + if(chunk_bytes < 0) { + FREEMEM(buf); + ASN__DECODE_STARVED; + } + if(bufLen + chunk_bytes > bufSize) { + void *ptr; + bufSize = chunk_bytes + (bufSize << 2); + ptr = REALLOC(buf, bufSize); + if(!ptr) { + FREEMEM(buf); + ASN__DECODE_FAILED; + } + buf = ptr; + } + if(per_get_many_bits(pd, buf + bufLen, 0, chunk_bytes << 3)) { + FREEMEM(buf); + ASN__DECODE_STARVED; + } + bufLen += chunk_bytes; + } while(repeat); + + ASN_DEBUG("Getting open type %s encoded in %ld bytes", td->name, + (long)bufLen); + + memset(&spd, 0, sizeof(spd)); + spd.buffer = buf; + spd.nbits = bufLen << 3; + + ASN_DEBUG_INDENT_ADD(+4); + rv = td->uper_decoder(ctx, td, constraints, sptr, &spd); + ASN_DEBUG_INDENT_ADD(-4); + + if(rv.code == RC_OK) { + /* Check padding validity */ + padding = spd.nbits - spd.nboff; + if ((padding < 8 || + /* X.691#10.1.3 */ + (spd.nboff == 0 && spd.nbits == 8 && spd.buffer == buf)) && + per_get_few_bits(&spd, padding) == 0) { + /* Everything is cool */ + FREEMEM(buf); + return rv; + } + FREEMEM(buf); + if(padding >= 8) { + ASN_DEBUG("Too large padding %d in open type", (int)padding); + ASN__DECODE_FAILED; + } else { + ASN_DEBUG("Non-zero padding"); + ASN__DECODE_FAILED; + } + } else { + FREEMEM(buf); + /* rv.code could be RC_WMORE, nonsense in this context */ + rv.code = RC_FAIL; /* Noone would give us more */ + } + + return rv; +} + +static asn_dec_rval_t GCC_NOTUSED +uper_open_type_get_complex(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + uper_ugot_key arg; + asn_dec_rval_t rv; + ssize_t padding; + + ASN__STACK_OVERFLOW_CHECK(ctx); + + ASN_DEBUG("Getting open type %s from %s", td->name, + per_data_string(pd)); + arg.oldpd = *pd; + arg.unclaimed = 0; + arg.ot_moved = 0; + arg.repeat = 1; + pd->refill = uper_ugot_refill; + pd->refill_key = &arg; + pd->nbits = pd->nboff; /* 0 good bits at this point, will refill */ + pd->moved = 0; /* This now counts the open type size in bits */ + + ASN_DEBUG_INDENT_ADD(+4); + rv = td->uper_decoder(ctx, td, constraints, sptr, pd); + ASN_DEBUG_INDENT_ADD(-4); + +#define UPDRESTOREPD do { \ + /* buffer and nboff are valid, preserve them. */ \ + pd->nbits = arg.oldpd.nbits - (pd->moved - arg.ot_moved); \ + pd->moved = arg.oldpd.moved + (pd->moved - arg.ot_moved); \ + pd->refill = arg.oldpd.refill; \ + pd->refill_key = arg.oldpd.refill_key; \ + } while(0) + + if(rv.code != RC_OK) { + UPDRESTOREPD; + return rv; + } + + ASN_DEBUG("OpenType %s pd%s old%s unclaimed=%d, repeat=%d", td->name, + per_data_string(pd), + per_data_string(&arg.oldpd), + (int)arg.unclaimed, (int)arg.repeat); + + padding = pd->moved % 8; + if(padding) { + int32_t pvalue; + if(padding > 7) { + ASN_DEBUG("Too large padding %d in open type", + (int)padding); + rv.code = RC_FAIL; + UPDRESTOREPD; + return rv; + } + padding = 8 - padding; + ASN_DEBUG("Getting padding of %d bits", (int)padding); + pvalue = per_get_few_bits(pd, padding); + switch(pvalue) { + case -1: + ASN_DEBUG("Padding skip failed"); + UPDRESTOREPD; + ASN__DECODE_STARVED; + case 0: break; + default: + ASN_DEBUG("Non-blank padding (%d bits 0x%02x)", + (int)padding, (int)pvalue); + UPDRESTOREPD; + ASN__DECODE_FAILED; + } + } + if(pd->nboff != pd->nbits) { + ASN_DEBUG("Open type %s overhead pd%s old%s", td->name, + per_data_string(pd), per_data_string(&arg.oldpd)); + if(1) { + UPDRESTOREPD; + ASN__DECODE_FAILED; + } else { + arg.unclaimed += pd->nbits - pd->nboff; + } + } + + /* Adjust pd back so it points to original data */ + UPDRESTOREPD; + + /* Skip data not consumed by the decoder */ + if(arg.unclaimed) { + ASN_DEBUG("Getting unclaimed %d", (int)arg.unclaimed); + switch(per_skip_bits(pd, arg.unclaimed)) { + case -1: + ASN_DEBUG("Claim of %d failed", (int)arg.unclaimed); + ASN__DECODE_STARVED; + case 0: + ASN_DEBUG("Got claim of %d", (int)arg.unclaimed); + break; + default: + /* Padding must be blank */ + ASN_DEBUG("Non-blank unconsumed padding"); + ASN__DECODE_FAILED; + } + arg.unclaimed = 0; + } + + if(arg.repeat) { + ASN_DEBUG("Not consumed the whole thing"); + rv.code = RC_FAIL; + return rv; + } + + return rv; +} + + +asn_dec_rval_t +uper_open_type_get(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + + return uper_open_type_get_simple(ctx, td, constraints, sptr, pd); +} + +int +uper_open_type_skip(asn_codec_ctx_t *ctx, asn_per_data_t *pd) { + asn_TYPE_descriptor_t s_td; + asn_dec_rval_t rv; + + s_td.name = ""; + s_td.uper_decoder = uper_sot_suck; + + rv = uper_open_type_get(ctx, &s_td, 0, 0, pd); + if(rv.code != RC_OK) + return -1; + else + return 0; +} + +/* + * Internal functions. + */ + +static asn_dec_rval_t +uper_sot_suck(asn_codec_ctx_t *ctx, asn_TYPE_descriptor_t *td, + asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd) { + asn_dec_rval_t rv; + + (void)ctx; + (void)td; + (void)constraints; + (void)sptr; + + while(per_get_few_bits(pd, 24) >= 0); + + rv.code = RC_OK; + rv.consumed = pd->moved; + + return rv; +} + +static int +uper_ugot_refill(asn_per_data_t *pd) { + uper_ugot_key *arg = pd->refill_key; + ssize_t next_chunk_bytes, next_chunk_bits; + ssize_t avail; + + asn_per_data_t *oldpd = &arg->oldpd; + + ASN_DEBUG("REFILLING pd->moved=%ld, oldpd->moved=%ld", + (long)pd->moved, (long)oldpd->moved); + + /* Advance our position to where pd is */ + oldpd->buffer = pd->buffer; + oldpd->nboff = pd->nboff; + oldpd->nbits -= pd->moved - arg->ot_moved; + oldpd->moved += pd->moved - arg->ot_moved; + arg->ot_moved = pd->moved; + + if(arg->unclaimed) { + /* Refill the container */ + if(per_get_few_bits(oldpd, 1)) + return -1; + if(oldpd->nboff == 0) { + assert(0); + return -1; + } + pd->buffer = oldpd->buffer; + pd->nboff = oldpd->nboff - 1; + pd->nbits = oldpd->nbits; + ASN_DEBUG("UNCLAIMED <- return from (pd->moved=%ld)", + (long)pd->moved); + return 0; + } + + if(!arg->repeat) { + ASN_DEBUG("Want more but refill doesn't have it"); + return -1; + } + + next_chunk_bytes = uper_get_length(oldpd, -1, &arg->repeat); + ASN_DEBUG("Open type LENGTH %ld bytes at off %ld, repeat %ld", + (long)next_chunk_bytes, (long)oldpd->moved, (long)arg->repeat); + if(next_chunk_bytes < 0) return -1; + if(next_chunk_bytes == 0) { + pd->refill = 0; /* No more refills, naturally */ + assert(!arg->repeat); /* Implementation guarantee */ + } + next_chunk_bits = next_chunk_bytes << 3; + avail = oldpd->nbits - oldpd->nboff; + if(avail >= next_chunk_bits) { + pd->nbits = oldpd->nboff + next_chunk_bits; + arg->unclaimed = 0; + ASN_DEBUG("!+Parent frame %ld bits, alloting %ld [%ld..%ld] (%ld)", + (long)next_chunk_bits, (long)oldpd->moved, + (long)oldpd->nboff, (long)oldpd->nbits, + (long)(oldpd->nbits - oldpd->nboff)); + } else { + pd->nbits = oldpd->nbits; + arg->unclaimed = next_chunk_bits - avail; + ASN_DEBUG("!-Parent frame %ld, require %ld, will claim %ld", + (long)avail, (long)next_chunk_bits, + (long)arg->unclaimed); + } + pd->buffer = oldpd->buffer; + pd->nboff = oldpd->nboff; + ASN_DEBUG("Refilled pd%s old%s", + per_data_string(pd), per_data_string(oldpd)); + return 0; +} + +static int +per_skip_bits(asn_per_data_t *pd, int skip_nbits) { + int hasNonZeroBits = 0; + while(skip_nbits > 0) { + int skip; + + /* per_get_few_bits() is more efficient when nbits <= 24 */ + if(skip_nbits < 24) + skip = skip_nbits; + else + skip = 24; + skip_nbits -= skip; + + switch(per_get_few_bits(pd, skip)) { + case -1: return -1; /* Starving */ + case 0: continue; /* Skipped empty space */ + default: hasNonZeroBits = 1; continue; + } + } + return hasNonZeroBits; +} diff --git a/src/cryptoconditions/src/asn/per_opentype.h b/src/cryptoconditions/src/asn/per_opentype.h new file mode 100644 index 00000000000..facfaa6377b --- /dev/null +++ b/src/cryptoconditions/src/asn/per_opentype.h @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2007 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _PER_OPENTYPE_H_ +#define _PER_OPENTYPE_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +asn_dec_rval_t uper_open_type_get(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void **sptr, asn_per_data_t *pd); + +int uper_open_type_skip(asn_codec_ctx_t *opt_codec_ctx, asn_per_data_t *pd); + +int uper_open_type_put(asn_TYPE_descriptor_t *td, asn_per_constraints_t *constraints, void *sptr, asn_per_outp_t *po); + +#ifdef __cplusplus +} +#endif + +#endif /* _PER_OPENTYPE_H_ */ diff --git a/src/cryptoconditions/src/asn/per_support.c b/src/cryptoconditions/src/asn/per_support.c new file mode 100644 index 00000000000..14b4c4c76be --- /dev/null +++ b/src/cryptoconditions/src/asn/per_support.c @@ -0,0 +1,483 @@ +/* + * Copyright (c) 2005-2014 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +char * +per_data_string(asn_per_data_t *pd) { + static char buf[2][32]; + static int n; + n = (n+1) % 2; + snprintf(buf[n], sizeof(buf[n]), + "{m=%ld span %+ld[%d..%d] (%d)}", + (long)pd->moved, + (((long)pd->buffer) & 0xf), + (int)pd->nboff, (int)pd->nbits, + (int)(pd->nbits - pd->nboff)); + return buf[n]; +} + +void +per_get_undo(asn_per_data_t *pd, int nbits) { + if((ssize_t)pd->nboff < nbits) { + assert((ssize_t)pd->nboff < nbits); + } else { + pd->nboff -= nbits; + pd->moved -= nbits; + } +} + +/* + * Extract a small number of bits (<= 31) from the specified PER data pointer. + */ +int32_t +per_get_few_bits(asn_per_data_t *pd, int nbits) { + size_t off; /* Next after last bit offset */ + ssize_t nleft; /* Number of bits left in this stream */ + uint32_t accum; + const uint8_t *buf; + + if(nbits < 0) + return -1; + + nleft = pd->nbits - pd->nboff; + if(nbits > nleft) { + int32_t tailv, vhead; + if(!pd->refill || nbits > 31) return -1; + /* Accumulate unused bytes before refill */ + ASN_DEBUG("Obtain the rest %d bits (want %d)", + (int)nleft, (int)nbits); + tailv = per_get_few_bits(pd, nleft); + if(tailv < 0) return -1; + /* Refill (replace pd contents with new data) */ + if(pd->refill(pd)) + return -1; + nbits -= nleft; + vhead = per_get_few_bits(pd, nbits); + /* Combine the rest of previous pd with the head of new one */ + tailv = (tailv << nbits) | vhead; /* Could == -1 */ + return tailv; + } + + /* + * Normalize position indicator. + */ + if(pd->nboff >= 8) { + pd->buffer += (pd->nboff >> 3); + pd->nbits -= (pd->nboff & ~0x07); + pd->nboff &= 0x07; + } + pd->moved += nbits; + pd->nboff += nbits; + off = pd->nboff; + buf = pd->buffer; + + /* + * Extract specified number of bits. + */ + if(off <= 8) + accum = nbits ? (buf[0]) >> (8 - off) : 0; + else if(off <= 16) + accum = ((buf[0] << 8) + buf[1]) >> (16 - off); + else if(off <= 24) + accum = ((buf[0] << 16) + (buf[1] << 8) + buf[2]) >> (24 - off); + else if(off <= 31) + accum = ((buf[0] << 24) + (buf[1] << 16) + + (buf[2] << 8) + (buf[3])) >> (32 - off); + else if(nbits <= 31) { + asn_per_data_t tpd = *pd; + /* Here are we with our 31-bits limit plus 1..7 bits offset. */ + per_get_undo(&tpd, nbits); + /* The number of available bits in the stream allow + * for the following operations to take place without + * invoking the ->refill() function */ + accum = per_get_few_bits(&tpd, nbits - 24) << 24; + accum |= per_get_few_bits(&tpd, 24); + } else { + per_get_undo(pd, nbits); + return -1; + } + + accum &= (((uint32_t)1 << nbits) - 1); + + ASN_DEBUG(" [PER got %2d<=%2d bits => span %d %+ld[%d..%d]:%02x (%d) => 0x%x]", + (int)nbits, (int)nleft, + (int)pd->moved, + (((long)pd->buffer) & 0xf), + (int)pd->nboff, (int)pd->nbits, + ((pd->buffer != NULL)?pd->buffer[0]:0), + (int)(pd->nbits - pd->nboff), + (int)accum); + + return accum; +} + +/* + * Extract a large number of bits from the specified PER data pointer. + */ +int +per_get_many_bits(asn_per_data_t *pd, uint8_t *dst, int alright, int nbits) { + int32_t value; + + if(alright && (nbits & 7)) { + /* Perform right alignment of a first few bits */ + value = per_get_few_bits(pd, nbits & 0x07); + if(value < 0) return -1; + *dst++ = value; /* value is already right-aligned */ + nbits &= ~7; + } + + while(nbits) { + if(nbits >= 24) { + value = per_get_few_bits(pd, 24); + if(value < 0) return -1; + *(dst++) = value >> 16; + *(dst++) = value >> 8; + *(dst++) = value; + nbits -= 24; + } else { + value = per_get_few_bits(pd, nbits); + if(value < 0) return -1; + if(nbits & 7) { /* implies left alignment */ + value <<= 8 - (nbits & 7), + nbits += 8 - (nbits & 7); + if(nbits > 24) + *dst++ = value >> 24; + } + if(nbits > 16) + *dst++ = value >> 16; + if(nbits > 8) + *dst++ = value >> 8; + *dst++ = value; + break; + } + } + + return 0; +} + +/* + * Get the length "n" from the stream. + */ +ssize_t +uper_get_length(asn_per_data_t *pd, int ebits, int *repeat) { + ssize_t value; + + *repeat = 0; + + if(ebits >= 0) return per_get_few_bits(pd, ebits); + + value = per_get_few_bits(pd, 8); + if(value < 0) return -1; + if((value & 128) == 0) /* #10.9.3.6 */ + return (value & 0x7F); + if((value & 64) == 0) { /* #10.9.3.7 */ + value = ((value & 63) << 8) | per_get_few_bits(pd, 8); + if(value < 0) return -1; + return value; + } + value &= 63; /* this is "m" from X.691, #10.9.3.8 */ + if(value < 1 || value > 4) + return -1; + *repeat = 1; + return (16384 * value); +} + +/* + * Get the normally small length "n". + * This procedure used to decode length of extensions bit-maps + * for SET and SEQUENCE types. + */ +ssize_t +uper_get_nslength(asn_per_data_t *pd) { + ssize_t length; + + ASN_DEBUG("Getting normally small length"); + + if(per_get_few_bits(pd, 1) == 0) { + length = per_get_few_bits(pd, 6) + 1; + if(length <= 0) return -1; + ASN_DEBUG("l=%d", (int)length); + return length; + } else { + int repeat; + length = uper_get_length(pd, -1, &repeat); + if(length >= 0 && !repeat) return length; + return -1; /* Error, or do not support >16K extensions */ + } +} + +/* + * Get the normally small non-negative whole number. + * X.691, #10.6 + */ +ssize_t +uper_get_nsnnwn(asn_per_data_t *pd) { + ssize_t value; + + value = per_get_few_bits(pd, 7); + if(value & 64) { /* implicit (value < 0) */ + value &= 63; + value <<= 2; + value |= per_get_few_bits(pd, 2); + if(value & 128) /* implicit (value < 0) */ + return -1; + if(value == 0) + return 0; + if(value >= 3) + return -1; + value = per_get_few_bits(pd, 8 * value); + return value; + } + + return value; +} + +/* + * X.691-11/2008, #11.6 + * Encoding of a normally small non-negative whole number + */ +int +uper_put_nsnnwn(asn_per_outp_t *po, int n) { + int bytes; + + if(n <= 63) { + if(n < 0) return -1; + return per_put_few_bits(po, n, 7); + } + if(n < 256) + bytes = 1; + else if(n < 65536) + bytes = 2; + else if(n < 256 * 65536) + bytes = 3; + else + return -1; /* This is not a "normally small" value */ + if(per_put_few_bits(po, bytes, 8)) + return -1; + + return per_put_few_bits(po, n, 8 * bytes); +} + + +/* X.691-2008/11, #11.5.6 -> #11.3 */ +int uper_get_constrained_whole_number(asn_per_data_t *pd, unsigned long *out_value, int nbits) { + unsigned long lhalf; /* Lower half of the number*/ + long half; + + if(nbits <= 31) { + half = per_get_few_bits(pd, nbits); + if(half < 0) return -1; + *out_value = half; + return 0; + } + + if((size_t)nbits > 8 * sizeof(*out_value)) + return -1; /* RANGE */ + + half = per_get_few_bits(pd, 31); + if(half < 0) return -1; + + if(uper_get_constrained_whole_number(pd, &lhalf, nbits - 31)) + return -1; + + *out_value = ((unsigned long)half << (nbits - 31)) | lhalf; + return 0; +} + + +/* X.691-2008/11, #11.5.6 -> #11.3 */ +int uper_put_constrained_whole_number_s(asn_per_outp_t *po, long v, int nbits) { + /* + * Assume signed number can be safely coerced into + * unsigned of the same range. + * The following testing code will likely be optimized out + * by compiler if it is true. + */ + unsigned long uvalue1 = ULONG_MAX; + long svalue = uvalue1; + unsigned long uvalue2 = svalue; + assert(uvalue1 == uvalue2); + return uper_put_constrained_whole_number_u(po, v, nbits); +} + +int uper_put_constrained_whole_number_u(asn_per_outp_t *po, unsigned long v, int nbits) { + if(nbits <= 31) { + return per_put_few_bits(po, v, nbits); + } else { + /* Put higher portion first, followed by lower 31-bit */ + if(uper_put_constrained_whole_number_u(po, v >> 31, nbits - 31)) + return -1; + return per_put_few_bits(po, v, 31); + } +} + +/* + * Put a small number of bits (<= 31). + */ +int +per_put_few_bits(asn_per_outp_t *po, uint32_t bits, int obits) { + size_t off; /* Next after last bit offset */ + size_t omsk; /* Existing last byte meaningful bits mask */ + uint8_t *buf; + + if(obits <= 0 || obits >= 32) return obits ? -1 : 0; + + ASN_DEBUG("[PER put %d bits %x to %p+%d bits]", + obits, (int)bits, po->buffer, (int)po->nboff); + + /* + * Normalize position indicator. + */ + if(po->nboff >= 8) { + po->buffer += (po->nboff >> 3); + po->nbits -= (po->nboff & ~0x07); + po->nboff &= 0x07; + } + + /* + * Flush whole-bytes output, if necessary. + */ + if(po->nboff + obits > po->nbits) { + int complete_bytes = (po->buffer - po->tmpspace); + ASN_DEBUG("[PER output %ld complete + %ld]", + (long)complete_bytes, (long)po->flushed_bytes); + if(po->outper(po->tmpspace, complete_bytes, po->op_key) < 0) + return -1; + if(po->nboff) + po->tmpspace[0] = po->buffer[0]; + po->buffer = po->tmpspace; + po->nbits = 8 * sizeof(po->tmpspace); + po->flushed_bytes += complete_bytes; + } + + /* + * Now, due to sizeof(tmpspace), we are guaranteed large enough space. + */ + buf = po->buffer; + omsk = ~((1 << (8 - po->nboff)) - 1); + off = (po->nboff + obits); + + /* Clear data of debris before meaningful bits */ + bits &= (((uint32_t)1 << obits) - 1); + + ASN_DEBUG("[PER out %d %u/%x (t=%d,o=%d) %x&%x=%x]", obits, + (int)bits, (int)bits, + (int)po->nboff, (int)off, + buf[0], (int)(omsk&0xff), + (int)(buf[0] & omsk)); + + if(off <= 8) /* Completely within 1 byte */ + po->nboff = off, + bits <<= (8 - off), + buf[0] = (buf[0] & omsk) | bits; + else if(off <= 16) + po->nboff = off, + bits <<= (16 - off), + buf[0] = (buf[0] & omsk) | (bits >> 8), + buf[1] = bits; + else if(off <= 24) + po->nboff = off, + bits <<= (24 - off), + buf[0] = (buf[0] & omsk) | (bits >> 16), + buf[1] = bits >> 8, + buf[2] = bits; + else if(off <= 31) + po->nboff = off, + bits <<= (32 - off), + buf[0] = (buf[0] & omsk) | (bits >> 24), + buf[1] = bits >> 16, + buf[2] = bits >> 8, + buf[3] = bits; + else { + per_put_few_bits(po, bits >> (obits - 24), 24); + per_put_few_bits(po, bits, obits - 24); + } + + ASN_DEBUG("[PER out %u/%x => %02x buf+%ld]", + (int)bits, (int)bits, buf[0], + (long)(po->buffer - po->tmpspace)); + + return 0; +} + + +/* + * Output a large number of bits. + */ +int +per_put_many_bits(asn_per_outp_t *po, const uint8_t *src, int nbits) { + + while(nbits) { + uint32_t value; + + if(nbits >= 24) { + value = (src[0] << 16) | (src[1] << 8) | src[2]; + src += 3; + nbits -= 24; + if(per_put_few_bits(po, value, 24)) + return -1; + } else { + value = src[0]; + if(nbits > 8) + value = (value << 8) | src[1]; + if(nbits > 16) + value = (value << 8) | src[2]; + if(nbits & 0x07) + value >>= (8 - (nbits & 0x07)); + if(per_put_few_bits(po, value, nbits)) + return -1; + break; + } + } + + return 0; +} + +/* + * Put the length "n" (or part of it) into the stream. + */ +ssize_t +uper_put_length(asn_per_outp_t *po, size_t length) { + + if(length <= 127) /* #10.9.3.6 */ + return per_put_few_bits(po, length, 8) + ? -1 : (ssize_t)length; + else if(length < 16384) /* #10.9.3.7 */ + return per_put_few_bits(po, length|0x8000, 16) + ? -1 : (ssize_t)length; + + length >>= 14; + if(length > 4) length = 4; + + return per_put_few_bits(po, 0xC0 | length, 8) + ? -1 : (ssize_t)(length << 14); +} + + +/* + * Put the normally small length "n" into the stream. + * This procedure used to encode length of extensions bit-maps + * for SET and SEQUENCE types. + */ +int +uper_put_nslength(asn_per_outp_t *po, size_t length) { + + if(length <= 64) { + /* #10.9.3.4 */ + if(length == 0) return -1; + return per_put_few_bits(po, length-1, 7) ? -1 : 0; + } else { + if(uper_put_length(po, length) != (ssize_t)length) { + /* This might happen in case of >16K extensions */ + return -1; + } + } + + return 0; +} + diff --git a/src/cryptoconditions/src/asn/per_support.h b/src/cryptoconditions/src/asn/per_support.h new file mode 100644 index 00000000000..a75ac94fc4a --- /dev/null +++ b/src/cryptoconditions/src/asn/per_support.h @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2005-2014 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _PER_SUPPORT_H_ +#define _PER_SUPPORT_H_ + +#include /* Platform-specific types */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Pre-computed PER constraints. + */ +typedef const struct asn_per_constraint_s { + enum asn_per_constraint_flags { + APC_UNCONSTRAINED = 0x0, /* No PER visible constraints */ + APC_SEMI_CONSTRAINED = 0x1, /* Constrained at "lb" */ + APC_CONSTRAINED = 0x2, /* Fully constrained */ + APC_EXTENSIBLE = 0x4 /* May have extension */ + } flags; + int range_bits; /* Full number of bits in the range */ + int effective_bits; /* Effective bits */ + long lower_bound; /* "lb" value */ + long upper_bound; /* "ub" value */ +} asn_per_constraint_t; +typedef const struct asn_per_constraints_s { + struct asn_per_constraint_s value; + struct asn_per_constraint_s size; + int (*value2code)(unsigned int value); + int (*code2value)(unsigned int code); +} asn_per_constraints_t; + +/* + * This structure describes a position inside an incoming PER bit stream. + */ +typedef struct asn_per_data_s { + const uint8_t *buffer; /* Pointer to the octet stream */ + size_t nboff; /* Bit offset to the meaningful bit */ + size_t nbits; /* Number of bits in the stream */ + size_t moved; /* Number of bits moved through this bit stream */ + int (*refill)(struct asn_per_data_s *); + void *refill_key; +} asn_per_data_t; + +/* + * Extract a small number of bits (<= 31) from the specified PER data pointer. + * This function returns -1 if the specified number of bits could not be + * extracted due to EOD or other conditions. + */ +int32_t per_get_few_bits(asn_per_data_t *per_data, int get_nbits); + +/* Undo the immediately preceeding "get_few_bits" operation */ +void per_get_undo(asn_per_data_t *per_data, int get_nbits); + +/* + * Extract a large number of bits from the specified PER data pointer. + * This function returns -1 if the specified number of bits could not be + * extracted due to EOD or other conditions. + */ +int per_get_many_bits(asn_per_data_t *pd, uint8_t *dst, int right_align, + int get_nbits); + +/* + * Get the length "n" from the Unaligned PER stream. + */ +ssize_t uper_get_length(asn_per_data_t *pd, + int effective_bound_bits, + int *repeat); + +/* + * Get the normally small length "n". + */ +ssize_t uper_get_nslength(asn_per_data_t *pd); + +/* + * Get the normally small non-negative whole number. + */ +ssize_t uper_get_nsnnwn(asn_per_data_t *pd); + +/* X.691-2008/11, #11.5.6 */ +int uper_get_constrained_whole_number(asn_per_data_t *pd, unsigned long *v, int nbits); + +/* Non-thread-safe debugging function, don't use it */ +char *per_data_string(asn_per_data_t *pd); + +/* + * This structure supports forming PER output. + */ +typedef struct asn_per_outp_s { + uint8_t *buffer; /* Pointer into the (tmpspace) */ + size_t nboff; /* Bit offset to the meaningful bit */ + size_t nbits; /* Number of bits left in (tmpspace) */ + uint8_t tmpspace[32]; /* Preliminary storage to hold data */ + int (*outper)(const void *data, size_t size, void *op_key); + void *op_key; /* Key for (outper) data callback */ + size_t flushed_bytes; /* Bytes already flushed through (outper) */ +} asn_per_outp_t; + +/* Output a small number of bits (<= 31) */ +int per_put_few_bits(asn_per_outp_t *per_data, uint32_t bits, int obits); + +/* Output a large number of bits */ +int per_put_many_bits(asn_per_outp_t *po, const uint8_t *src, int put_nbits); + +/* X.691-2008/11, #11.5 */ +int uper_put_constrained_whole_number_s(asn_per_outp_t *po, long v, int nbits); +int uper_put_constrained_whole_number_u(asn_per_outp_t *po, unsigned long v, int nbits); + +/* + * Put the length "n" to the Unaligned PER stream. + * This function returns the number of units which may be flushed + * in the next units saving iteration. + */ +ssize_t uper_put_length(asn_per_outp_t *po, size_t whole_length); + +/* + * Put the normally small length "n" to the Unaligned PER stream. + * Returns 0 or -1. + */ +int uper_put_nslength(asn_per_outp_t *po, size_t length); + +/* + * Put the normally small non-negative whole number. + */ +int uper_put_nsnnwn(asn_per_outp_t *po, int n); + +#ifdef __cplusplus +} +#endif + +#endif /* _PER_SUPPORT_H_ */ diff --git a/src/cryptoconditions/src/asn/xer_decoder.c b/src/cryptoconditions/src/asn/xer_decoder.c new file mode 100644 index 00000000000..299a7c1eed8 --- /dev/null +++ b/src/cryptoconditions/src/asn/xer_decoder.c @@ -0,0 +1,368 @@ +/* + * Copyright (c) 2004, 2005 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include /* XER/XML parsing support */ + + +/* + * Decode the XER encoding of a given type. + */ +asn_dec_rval_t +xer_decode(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td, + void **struct_ptr, const void *buffer, size_t size) { + asn_codec_ctx_t s_codec_ctx; + + /* + * Stack checker requires that the codec context + * must be allocated on the stack. + */ + if(opt_codec_ctx) { + if(opt_codec_ctx->max_stack_size) { + s_codec_ctx = *opt_codec_ctx; + opt_codec_ctx = &s_codec_ctx; + } + } else { + /* If context is not given, be security-conscious anyway */ + memset(&s_codec_ctx, 0, sizeof(s_codec_ctx)); + s_codec_ctx.max_stack_size = ASN__DEFAULT_STACK_MAX; + opt_codec_ctx = &s_codec_ctx; + } + + /* + * Invoke type-specific decoder. + */ + return td->xer_decoder(opt_codec_ctx, td, struct_ptr, 0, buffer, size); +} + + + +struct xer__cb_arg { + pxml_chunk_type_e chunk_type; + size_t chunk_size; + const void *chunk_buf; + int callback_not_invoked; +}; + +static int +xer__token_cb(pxml_chunk_type_e type, const void *_chunk_data, size_t _chunk_size, void *key) { + struct xer__cb_arg *arg = (struct xer__cb_arg *)key; + arg->chunk_type = type; + arg->chunk_size = _chunk_size; + arg->chunk_buf = _chunk_data; + arg->callback_not_invoked = 0; + return -1; /* Terminate the XML parsing */ +} + +/* + * Fetch the next token from the XER/XML stream. + */ +ssize_t +xer_next_token(int *stateContext, const void *buffer, size_t size, pxer_chunk_type_e *ch_type) { + struct xer__cb_arg arg; + int new_stateContext = *stateContext; + ssize_t ret; + + arg.callback_not_invoked = 1; + ret = pxml_parse(&new_stateContext, buffer, size, xer__token_cb, &arg); + if(ret < 0) return -1; + if(arg.callback_not_invoked) { + assert(ret == 0); /* No data was consumed */ + *ch_type = PXER_WMORE; + return 0; /* Try again with more data */ + } else { + assert(arg.chunk_size); + assert(arg.chunk_buf == buffer); + } + + /* + * Translate the XML chunk types into more convenient ones. + */ + switch(arg.chunk_type) { + case PXML_TEXT: + *ch_type = PXER_TEXT; + break; + case PXML_TAG: + *ch_type = PXER_WMORE; + return 0; /* Want more */ + case PXML_TAG_END: + *ch_type = PXER_TAG; + break; + case PXML_COMMENT: + case PXML_COMMENT_END: + *ch_type = PXER_COMMENT; + break; + } + + *stateContext = new_stateContext; + return arg.chunk_size; +} + +#define CSLASH 0x2f /* '/' */ +#define LANGLE 0x3c /* '<' */ +#define RANGLE 0x3e /* '>' */ + +xer_check_tag_e +xer_check_tag(const void *buf_ptr, int size, const char *need_tag) { + const char *buf = (const char *)buf_ptr; + const char *end; + xer_check_tag_e ct = XCT_OPENING; + + if(size < 2 || buf[0] != LANGLE || buf[size-1] != RANGLE) { + if(size >= 2) + ASN_DEBUG("Broken XML tag: \"%c...%c\"", + buf[0], buf[size - 1]); + return XCT_BROKEN; + } + + /* + * Determine the tag class. + */ + if(buf[1] == CSLASH) { + buf += 2; /* advance past "" */ + ct = XCT_CLOSING; + if(size > 0 && buf[size-1] == CSLASH) + return XCT_BROKEN; /* */ + } else { + buf++; /* advance past "<" */ + size -= 2; /* strip "<" and ">" */ + if(size > 0 && buf[size-1] == CSLASH) { + ct = XCT_BOTH; + size--; /* One more, for "/" */ + } + } + + /* Sometimes we don't care about the tag */ + if(!need_tag || !*need_tag) + return (xer_check_tag_e)(XCT__UNK__MASK | ct); + + /* + * Determine the tag name. + */ + for(end = buf + size; buf < end; buf++, need_tag++) { + int b = *buf, n = *need_tag; + if(b != n) { + if(n == 0) { + switch(b) { + case 0x09: case 0x0a: case 0x0c: case 0x0d: + case 0x20: + /* "": whitespace is normal */ + return ct; + } + } + return (xer_check_tag_e)(XCT__UNK__MASK | ct); + } + if(b == 0) + return XCT_BROKEN; /* Embedded 0 in buf?! */ + } + if(*need_tag) + return (xer_check_tag_e)(XCT__UNK__MASK | ct); + + return ct; +} + + +#undef ADVANCE +#define ADVANCE(num_bytes) do { \ + size_t num = (num_bytes); \ + buf_ptr = ((const char *)buf_ptr) + num; \ + size -= num; \ + consumed_myself += num; \ + } while(0) + +#undef RETURN +#define RETURN(_code) do { \ + rval.code = _code; \ + rval.consumed = consumed_myself; \ + if(rval.code != RC_OK) \ + ASN_DEBUG("Failed with %d", rval.code); \ + return rval; \ + } while(0) + +#define XER_GOT_BODY(chunk_buf, chunk_size, size) do { \ + ssize_t converted_size = body_receiver \ + (struct_key, chunk_buf, chunk_size, \ + (size_t)chunk_size < size); \ + if(converted_size == -1) RETURN(RC_FAIL); \ + if(converted_size == 0 \ + && size == (size_t)chunk_size) \ + RETURN(RC_WMORE); \ + chunk_size = converted_size; \ + } while(0) +#define XER_GOT_EMPTY() do { \ + if(body_receiver(struct_key, 0, 0, size > 0) == -1) \ + RETURN(RC_FAIL); \ + } while(0) + +/* + * Generalized function for decoding the primitive values. + */ +asn_dec_rval_t +xer_decode_general(asn_codec_ctx_t *opt_codec_ctx, + asn_struct_ctx_t *ctx, /* Type decoder context */ + void *struct_key, + const char *xml_tag, /* Expected XML tag */ + const void *buf_ptr, size_t size, + int (*opt_unexpected_tag_decoder) + (void *struct_key, const void *chunk_buf, size_t chunk_size), + ssize_t (*body_receiver) + (void *struct_key, const void *chunk_buf, size_t chunk_size, + int have_more) + ) { + + asn_dec_rval_t rval; + ssize_t consumed_myself = 0; + + (void)opt_codec_ctx; + + /* + * Phases of XER/XML processing: + * Phase 0: Check that the opening tag matches our expectations. + * Phase 1: Processing body and reacting on closing tag. + */ + if(ctx->phase > 1) RETURN(RC_FAIL); + for(;;) { + pxer_chunk_type_e ch_type; /* XER chunk type */ + ssize_t ch_size; /* Chunk size */ + xer_check_tag_e tcv; /* Tag check value */ + + /* + * Get the next part of the XML stream. + */ + ch_size = xer_next_token(&ctx->context, buf_ptr, size, + &ch_type); + if(ch_size == -1) { + RETURN(RC_FAIL); + } else { + switch(ch_type) { + case PXER_WMORE: + RETURN(RC_WMORE); + case PXER_COMMENT: /* Got XML comment */ + ADVANCE(ch_size); /* Skip silently */ + continue; + case PXER_TEXT: + if(ctx->phase == 0) { + /* + * We have to ignore whitespace here, + * but in order to be forward compatible + * with EXTENDED-XER (EMBED-VALUES, #25) + * any text is just ignored here. + */ + } else { + XER_GOT_BODY(buf_ptr, ch_size, size); + } + ADVANCE(ch_size); + continue; + case PXER_TAG: + break; /* Check the rest down there */ + } + } + + assert(ch_type == PXER_TAG && size); + + tcv = xer_check_tag(buf_ptr, ch_size, xml_tag); + /* + * Phase 0: + * Expecting the opening tag + * for the type being processed. + * Phase 1: + * Waiting for the closing XML tag. + */ + switch(tcv) { + case XCT_BOTH: + if(ctx->phase) break; + /* Finished decoding of an empty element */ + XER_GOT_EMPTY(); + ADVANCE(ch_size); + ctx->phase = 2; /* Phase out */ + RETURN(RC_OK); + case XCT_OPENING: + if(ctx->phase) break; + ADVANCE(ch_size); + ctx->phase = 1; /* Processing body phase */ + continue; + case XCT_CLOSING: + if(!ctx->phase) break; + ADVANCE(ch_size); + ctx->phase = 2; /* Phase out */ + RETURN(RC_OK); + case XCT_UNKNOWN_BO: + /* + * Certain tags in the body may be expected. + */ + if(opt_unexpected_tag_decoder + && opt_unexpected_tag_decoder(struct_key, + buf_ptr, ch_size) >= 0) { + /* Tag's processed fine */ + ADVANCE(ch_size); + if(!ctx->phase) { + /* We are not expecting + * the closing tag anymore. */ + ctx->phase = 2; /* Phase out */ + RETURN(RC_OK); + } + continue; + } + /* Fall through */ + default: + break; /* Unexpected tag */ + } + + ASN_DEBUG("Unexpected XML tag (expected \"%s\")", xml_tag); + break; /* Dark and mysterious things have just happened */ + } + + RETURN(RC_FAIL); +} + + +size_t +xer_whitespace_span(const void *chunk_buf, size_t chunk_size) { + const char *p = (const char *)chunk_buf; + const char *pend = p + chunk_size; + + for(; p < pend; p++) { + switch(*p) { + /* X.693, #8.1.4 + * HORISONTAL TAB (9) + * LINE FEED (10) + * CARRIAGE RETURN (13) + * SPACE (32) + */ + case 0x09: case 0x0a: case 0x0d: case 0x20: + continue; + default: + break; + } + break; + } + return (p - (const char *)chunk_buf); +} + +/* + * This is a vastly simplified, non-validating XML tree skipper. + */ +int +xer_skip_unknown(xer_check_tag_e tcv, ber_tlv_len_t *depth) { + assert(*depth > 0); + switch(tcv) { + case XCT_BOTH: + case XCT_UNKNOWN_BO: + /* These negate each other. */ + return 0; + case XCT_OPENING: + case XCT_UNKNOWN_OP: + ++(*depth); + return 0; + case XCT_CLOSING: + case XCT_UNKNOWN_CL: + if(--(*depth) == 0) + return (tcv == XCT_CLOSING) ? 2 : 1; + return 0; + default: + return -1; + } +} diff --git a/src/cryptoconditions/src/asn/xer_decoder.h b/src/cryptoconditions/src/asn/xer_decoder.h new file mode 100644 index 00000000000..301b613cf4b --- /dev/null +++ b/src/cryptoconditions/src/asn/xer_decoder.h @@ -0,0 +1,106 @@ +/*- + * Copyright (c) 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _XER_DECODER_H_ +#define _XER_DECODER_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* + * The XER decoder of any ASN.1 type. May be invoked by the application. + */ +asn_dec_rval_t xer_decode(struct asn_codec_ctx_s *opt_codec_ctx, + struct asn_TYPE_descriptor_s *type_descriptor, + void **struct_ptr, /* Pointer to a target structure's pointer */ + const void *buffer, /* Data to be decoded */ + size_t size /* Size of data buffer */ + ); + +/* + * Type of the type-specific XER decoder function. + */ +typedef asn_dec_rval_t (xer_type_decoder_f)(asn_codec_ctx_t *opt_codec_ctx, + struct asn_TYPE_descriptor_s *type_descriptor, + void **struct_ptr, + const char *opt_mname, /* Member name */ + const void *buf_ptr, size_t size + ); + +/******************************* + * INTERNALLY USEFUL FUNCTIONS * + *******************************/ + +/* + * Generalized function for decoding the primitive values. + * Used by more specialized functions, such as OCTET_STRING_decode_xer_utf8 + * and others. This function should not be used by applications, as its API + * is subject to changes. + */ +asn_dec_rval_t xer_decode_general(asn_codec_ctx_t *opt_codec_ctx, + asn_struct_ctx_t *ctx, /* Type decoder context */ + void *struct_key, /* Treated as opaque pointer */ + const char *xml_tag, /* Expected XML tag name */ + const void *buf_ptr, size_t size, + int (*opt_unexpected_tag_decoder) + (void *struct_key, const void *chunk_buf, size_t chunk_size), + ssize_t (*body_receiver) + (void *struct_key, const void *chunk_buf, size_t chunk_size, + int have_more) + ); + + +/* + * Fetch the next XER (XML) token from the stream. + * The function returns the number of bytes occupied by the chunk type, + * returned in the _ch_type. The _ch_type is only set (and valid) when + * the return value is >= 0. + */ + typedef enum pxer_chunk_type { + PXER_WMORE, /* Chunk type is not clear, more data expected. */ + PXER_TAG, /* Complete XER tag */ + PXER_TEXT, /* Plain text between XER tags */ + PXER_COMMENT /* A comment, may be part of */ + } pxer_chunk_type_e; +ssize_t xer_next_token(int *stateContext, + const void *buffer, size_t size, pxer_chunk_type_e *_ch_type); + +/* + * This function checks the buffer against the tag name is expected to occur. + */ + typedef enum xer_check_tag { + XCT_BROKEN = 0, /* The tag is broken */ + XCT_OPENING = 1, /* This is the tag */ + XCT_CLOSING = 2, /* This is the tag */ + XCT_BOTH = 3, /* This is the tag */ + XCT__UNK__MASK = 4, /* Mask of everything unexpected */ + XCT_UNKNOWN_OP = 5, /* Unexpected tag */ + XCT_UNKNOWN_CL = 6, /* Unexpected tag */ + XCT_UNKNOWN_BO = 7 /* Unexpected tag */ + } xer_check_tag_e; +xer_check_tag_e xer_check_tag(const void *buf_ptr, int size, + const char *need_tag); + +/* + * Get the number of bytes consisting entirely of XER whitespace characters. + * RETURN VALUES: + * >=0: Number of whitespace characters in the string. + */ +size_t xer_whitespace_span(const void *chunk_buf, size_t chunk_size); + +/* + * Skip the series of anticipated extensions. + */ +int xer_skip_unknown(xer_check_tag_e tcv, ber_tlv_len_t *depth); + +#ifdef __cplusplus +} +#endif + +#endif /* _XER_DECODER_H_ */ diff --git a/src/cryptoconditions/src/asn/xer_encoder.c b/src/cryptoconditions/src/asn/xer_encoder.c new file mode 100644 index 00000000000..4606575800d --- /dev/null +++ b/src/cryptoconditions/src/asn/xer_encoder.c @@ -0,0 +1,67 @@ +/*- + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include +#include + +/* + * The XER encoder of any type. May be invoked by the application. + */ +asn_enc_rval_t +xer_encode(asn_TYPE_descriptor_t *td, void *sptr, + enum xer_encoder_flags_e xer_flags, + asn_app_consume_bytes_f *cb, void *app_key) { + asn_enc_rval_t er, tmper; + const char *mname; + size_t mlen; + int xcan = (xer_flags & XER_F_CANONICAL) ? 1 : 2; + + if(!td || !sptr) goto cb_failed; + + mname = td->xml_tag; + mlen = strlen(mname); + + ASN__CALLBACK3("<", 1, mname, mlen, ">", 1); + + tmper = td->xer_encoder(td, sptr, 1, xer_flags, cb, app_key); + if(tmper.encoded == -1) return tmper; + + ASN__CALLBACK3("\n", xcan); + + er.encoded = 4 + xcan + (2 * mlen) + tmper.encoded; + + ASN__ENCODED_OK(er); +cb_failed: + ASN__ENCODE_FAILED; +} + +/* + * This is a helper function for xer_fprint, which directs all incoming data + * into the provided file descriptor. + */ +static int +xer__print2fp(const void *buffer, size_t size, void *app_key) { + FILE *stream = (FILE *)app_key; + + if(fwrite(buffer, 1, size, stream) != size) + return -1; + + return 0; +} + +int +xer_fprint(FILE *stream, asn_TYPE_descriptor_t *td, void *sptr) { + asn_enc_rval_t er; + + if(!stream) stream = stdout; + if(!td || !sptr) + return -1; + + er = xer_encode(td, sptr, XER_F_BASIC, xer__print2fp, stream); + if(er.encoded == -1) + return -1; + + return fflush(stream); +} diff --git a/src/cryptoconditions/src/asn/xer_encoder.h b/src/cryptoconditions/src/asn/xer_encoder.h new file mode 100644 index 00000000000..055e73c0c8b --- /dev/null +++ b/src/cryptoconditions/src/asn/xer_encoder.h @@ -0,0 +1,59 @@ +/*- + * Copyright (c) 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _XER_ENCODER_H_ +#define _XER_ENCODER_H_ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct asn_TYPE_descriptor_s; /* Forward declaration */ + +/* Flags used by the xer_encode() and (*xer_type_encoder_f), defined below */ +enum xer_encoder_flags_e { + /* Mode of encoding */ + XER_F_BASIC = 0x01, /* BASIC-XER (pretty-printing) */ + XER_F_CANONICAL = 0x02 /* Canonical XER (strict rules) */ +}; + +/* + * The XER encoder of any type. May be invoked by the application. + */ +asn_enc_rval_t xer_encode(struct asn_TYPE_descriptor_s *type_descriptor, + void *struct_ptr, /* Structure to be encoded */ + enum xer_encoder_flags_e xer_flags, + asn_app_consume_bytes_f *consume_bytes_cb, + void *app_key /* Arbitrary callback argument */ + ); + +/* + * The variant of the above function which dumps the BASIC-XER (XER_F_BASIC) + * output into the chosen file pointer. + * RETURN VALUES: + * 0: The structure is printed. + * -1: Problem printing the structure. + * WARNING: No sensible errno value is returned. + */ +int xer_fprint(FILE *stream, struct asn_TYPE_descriptor_s *td, void *sptr); + +/* + * Type of the generic XER encoder. + */ +typedef asn_enc_rval_t (xer_type_encoder_f)( + struct asn_TYPE_descriptor_s *type_descriptor, + void *struct_ptr, /* Structure to be encoded */ + int ilevel, /* Level of indentation */ + enum xer_encoder_flags_e xer_flags, + asn_app_consume_bytes_f *consume_bytes_cb, /* Callback */ + void *app_key /* Arbitrary callback argument */ + ); + +#ifdef __cplusplus +} +#endif + +#endif /* _XER_ENCODER_H_ */ diff --git a/src/cryptoconditions/src/asn/xer_support.c b/src/cryptoconditions/src/asn/xer_support.c new file mode 100644 index 00000000000..36b4bfbfc07 --- /dev/null +++ b/src/cryptoconditions/src/asn/xer_support.c @@ -0,0 +1,227 @@ +/* + * Copyright (c) 2003, 2004 X/IO Labs, xiolabs.com. + * Copyright (c) 2003, 2004, 2005 Lev Walkin . + * All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#include +#include + +/* Parser states */ +typedef enum { + ST_TEXT, + ST_TAG_START, + ST_TAG_BODY, + ST_TAG_QUOTE_WAIT, + ST_TAG_QUOTED_STRING, + ST_TAG_UNQUOTED_STRING, + ST_COMMENT_WAIT_DASH1, /* ""[0] */ + ST_COMMENT_CLO_RT /* "-->"[1] */ +} pstate_e; + +static const int +_charclass[256] = { + 0,0,0,0,0,0,0,0, 0,1,1,0,1,1,0,0, + 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + 1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, + 2,2,2,2,2,2,2,2, 2,2,0,0,0,0,0,0, /* 01234567 89 */ + 0,3,3,3,3,3,3,3, 3,3,3,3,3,3,3,3, /* ABCDEFG HIJKLMNO */ + 3,3,3,3,3,3,3,3, 3,3,3,0,0,0,0,0, /* PQRSTUVW XYZ */ + 0,3,3,3,3,3,3,3, 3,3,3,3,3,3,3,3, /* abcdefg hijklmno */ + 3,3,3,3,3,3,3,3, 3,3,3,0,0,0,0,0 /* pqrstuvw xyz */ +}; +#define WHITESPACE(c) (_charclass[(unsigned char)(c)] == 1) +#define ALNUM(c) (_charclass[(unsigned char)(c)] >= 2) +#define ALPHA(c) (_charclass[(unsigned char)(c)] == 3) + +/* Aliases for characters, ASCII/UTF-8 */ +#define EXCLAM 0x21 /* '!' */ +#define CQUOTE 0x22 /* '"' */ +#define CDASH 0x2d /* '-' */ +#define CSLASH 0x2f /* '/' */ +#define LANGLE 0x3c /* '<' */ +#define CEQUAL 0x3d /* '=' */ +#define RANGLE 0x3e /* '>' */ +#define CQUEST 0x3f /* '?' */ + +/* Invoke token callback */ +#define TOKEN_CB_CALL(type, _ns, _current_too, _final) do { \ + int _ret; \ + pstate_e ns = _ns; \ + ssize_t _sz = (p - chunk_start) + _current_too; \ + if (!_sz) { \ + /* Shortcut */ \ + state = _ns; \ + break; \ + } \ + _ret = cb(type, chunk_start, _sz, key); \ + if(_ret < _sz) { \ + if(_current_too && _ret == -1) \ + state = ns; \ + goto finish; \ + } \ + chunk_start = p + _current_too; \ + state = ns; \ + } while(0) + +#define TOKEN_CB(_type, _ns, _current_too) \ + TOKEN_CB_CALL(_type, _ns, _current_too, 0) + +#define PXML_TAG_FINAL_CHUNK_TYPE PXML_TAG_END +#define PXML_COMMENT_FINAL_CHUNK_TYPE PXML_COMMENT_END + +#define TOKEN_CB_FINAL(_type, _ns, _current_too) \ + TOKEN_CB_CALL( _type ## _FINAL_CHUNK_TYPE , _ns, _current_too, 1) + +/* + * Parser itself + */ +ssize_t pxml_parse(int *stateContext, const void *xmlbuf, size_t size, pxml_callback_f *cb, void *key) { + pstate_e state = (pstate_e)*stateContext; + const char *chunk_start = (const char *)xmlbuf; + const char *p = chunk_start; + const char *end = p + size; + + for(; p < end; p++) { + int C = *(const unsigned char *)p; + switch(state) { + case ST_TEXT: + /* + * Initial state: we're in the middle of some text, + * or just have started. + */ + if (C == LANGLE) + /* We're now in the tag, probably */ + TOKEN_CB(PXML_TEXT, ST_TAG_START, 0); + break; + case ST_TAG_START: + if (ALPHA(C) || (C == CSLASH)) + state = ST_TAG_BODY; + else if (C == EXCLAM) + state = ST_COMMENT_WAIT_DASH1; + else + /* + * Not characters and not whitespace. + * Must be something like "3 < 4". + */ + TOKEN_CB(PXML_TEXT, ST_TEXT, 1);/* Flush as data */ + break; + case ST_TAG_BODY: + switch(C) { + case RANGLE: + /* End of the tag */ + TOKEN_CB_FINAL(PXML_TAG, ST_TEXT, 1); + break; + case LANGLE: + /* + * The previous tag wasn't completed, but still + * recognized as valid. (Mozilla-compatible) + */ + TOKEN_CB_FINAL(PXML_TAG, ST_TAG_START, 0); + break; + case CEQUAL: + state = ST_TAG_QUOTE_WAIT; + break; + } + break; + case ST_TAG_QUOTE_WAIT: + /* + * State after the equal sign ("=") in the tag. + */ + switch(C) { + case CQUOTE: + state = ST_TAG_QUOTED_STRING; + break; + case RANGLE: + /* End of the tag */ + TOKEN_CB_FINAL(PXML_TAG, ST_TEXT, 1); + break; + default: + if(!WHITESPACE(C)) + /* Unquoted string value */ + state = ST_TAG_UNQUOTED_STRING; + } + break; + case ST_TAG_QUOTED_STRING: + /* + * Tag attribute's string value in quotes. + */ + if(C == CQUOTE) { + /* Return back to the tag state */ + state = ST_TAG_BODY; + } + break; + case ST_TAG_UNQUOTED_STRING: + if(C == RANGLE) { + /* End of the tag */ + TOKEN_CB_FINAL(PXML_TAG, ST_TEXT, 1); + } else if(WHITESPACE(C)) { + /* Return back to the tag state */ + state = ST_TAG_BODY; + } + break; + case ST_COMMENT_WAIT_DASH1: + if(C == CDASH) { + state = ST_COMMENT_WAIT_DASH2; + } else { + /* Some ordinary tag. */ + state = ST_TAG_BODY; + } + break; + case ST_COMMENT_WAIT_DASH2: + if(C == CDASH) { + /* Seen "<--" */ + state = ST_COMMENT; + } else { + /* Some ordinary tag */ + state = ST_TAG_BODY; + } + break; + case ST_COMMENT: + if(C == CDASH) { + state = ST_COMMENT_CLO_DASH2; + } + break; + case ST_COMMENT_CLO_DASH2: + if(C == CDASH) { + state = ST_COMMENT_CLO_RT; + } else { + /* This is not an end of a comment */ + state = ST_COMMENT; + } + break; + case ST_COMMENT_CLO_RT: + if(C == RANGLE) { + TOKEN_CB_FINAL(PXML_COMMENT, ST_TEXT, 1); + } else if(C == CDASH) { + /* Maintain current state, still waiting for '>' */ + } else { + state = ST_COMMENT; + } + break; + } /* switch(*ptr) */ + } /* for() */ + + /* + * Flush the partially processed chunk, state permitting. + */ + if(p - chunk_start) { + switch (state) { + case ST_COMMENT: + TOKEN_CB(PXML_COMMENT, state, 0); + break; + case ST_TEXT: + TOKEN_CB(PXML_TEXT, state, 0); + break; + default: break; /* a no-op */ + } + } + +finish: + *stateContext = (int)state; + return chunk_start - (const char *)xmlbuf; +} + diff --git a/src/cryptoconditions/src/asn/xer_support.h b/src/cryptoconditions/src/asn/xer_support.h new file mode 100644 index 00000000000..8b01944ab58 --- /dev/null +++ b/src/cryptoconditions/src/asn/xer_support.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2003, 2004 X/IO Labs, xiolabs.com. + * Copyright (c) 2003, 2004 Lev Walkin . All rights reserved. + * Redistribution and modifications are permitted subject to BSD license. + */ +#ifndef _XER_SUPPORT_H_ +#define _XER_SUPPORT_H_ + +#include /* Platform-specific types */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Types of data transferred to the application. + */ +typedef enum { + PXML_TEXT, /* Plain text between XML tags. */ + PXML_TAG, /* A tag, starting with '<'. */ + PXML_COMMENT, /* An XML comment, including "". */ + /* + * The following chunk types are reported if the chunk + * terminates the specified XML element. + */ + PXML_TAG_END, /* Tag ended */ + PXML_COMMENT_END /* Comment ended */ +} pxml_chunk_type_e; + +/* + * Callback function that is called by the parser when parsed data is + * available. The _opaque is the pointer to a field containing opaque user + * data specified in pxml_create() call. The chunk type is _type and the text + * data is the piece of buffer identified by _bufid (as supplied to + * pxml_feed() call) starting at offset _offset and of _size bytes size. + * The chunk is NOT '\0'-terminated. + */ +typedef int (pxml_callback_f)(pxml_chunk_type_e _type, + const void *_chunk_data, size_t _chunk_size, void *_key); + +/* + * Parse the given buffer as it were a chunk of XML data. + * Invoke the specified callback each time the meaninful data is found. + * This function returns number of bytes consumed from the bufer. + * It will always be lesser than or equal to the specified _size. + * The next invocation of this function must account the difference. + */ +ssize_t pxml_parse(int *_stateContext, const void *_buf, size_t _size, + pxml_callback_f *cb, void *_key); + +#ifdef __cplusplus +} +#endif + +#endif /* _XER_SUPPORT_H_ */ diff --git a/src/cryptoconditions/src/cryptoconditions-config.h.in b/src/cryptoconditions/src/cryptoconditions-config.h.in new file mode 100644 index 00000000000..72f0d216bd4 --- /dev/null +++ b/src/cryptoconditions/src/cryptoconditions-config.h.in @@ -0,0 +1,176 @@ +/* src/cryptoconditions-config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. + */ +#undef CRAY_STACKSEG_END + +/* Define to 1 if using `alloca.c'. */ +#undef C_ALLOCA + +/* Define to 1 if you have `alloca', as a function or macro. */ +#undef HAVE_ALLOCA + +/* Define to 1 if you have and it should be used (not on Ultrix). + */ +#undef HAVE_ALLOCA_H + +/* 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_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_FLOAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIMITS_H + +/* Define to 1 if you have the `localeconv' function. */ +#undef HAVE_LOCALECONV + +/* Define to 1 if you have the header file. */ +#undef HAVE_LOCALE_H + +/* Define to 1 if your system has a GNU libc compatible `malloc' function, and + to 0 otherwise. */ +#undef HAVE_MALLOC + +/* Define to 1 if you have the header file. */ +#undef HAVE_MALLOC_H + +/* Define to 1 if you have the `memchr' function. */ +#undef HAVE_MEMCHR + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `memset' function. */ +#undef HAVE_MEMSET + +/* Define to 1 if you have the header file. */ +#undef HAVE_NETINET_IN_H + +/* Define to 1 if the system has the type `ptrdiff_t'. */ +#undef HAVE_PTRDIFF_T + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDDEF_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if the system has the type `_Bool'. */ +#undef HAVE__BOOL + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#undef LT_OBJDIR + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at runtime. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +#undef STACK_DIRECTION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Version number of package */ +#undef VERSION + +/* Define for Solaris 2.5.1 so the uint32_t typedef from , + , or is not used. If the typedef were allowed, the + #define below would cause a syntax error. */ +#undef _UINT32_T + +/* Define for Solaris 2.5.1 so the uint64_t typedef from , + , or is not used. If the typedef were allowed, the + #define below would cause a syntax error. */ +#undef _UINT64_T + +/* Define for Solaris 2.5.1 so the uint8_t typedef from , + , or is not used. If the typedef were allowed, the + #define below would cause a syntax error. */ +#undef _UINT8_T + +/* Define to the type of a signed integer type of width exactly 16 bits if + such a type exists and the standard includes do not define it. */ +#undef int16_t + +/* Define to the type of a signed integer type of width exactly 32 bits if + such a type exists and the standard includes do not define it. */ +#undef int32_t + +/* Define to the type of a signed integer type of width exactly 8 bits if such + a type exists and the standard includes do not define it. */ +#undef int8_t + +/* Define to rpl_malloc if the replacement function should be used. */ +#undef malloc + +/* Define to `unsigned int' if does not define. */ +#undef size_t + +/* Define to `int' if does not define. */ +#undef ssize_t + +/* Define to the type of an unsigned integer type of width exactly 16 bits if + such a type exists and the standard includes do not define it. */ +#undef uint16_t + +/* Define to the type of an unsigned integer type of width exactly 32 bits if + such a type exists and the standard includes do not define it. */ +#undef uint32_t + +/* Define to the type of an unsigned integer type of width exactly 64 bits if + such a type exists and the standard includes do not define it. */ +#undef uint64_t + +/* Define to the type of an unsigned integer type of width exactly 8 bits if + such a type exists and the standard includes do not define it. */ +#undef uint8_t diff --git a/src/cryptoconditions/src/cryptoconditions.c b/src/cryptoconditions/src/cryptoconditions.c new file mode 100644 index 00000000000..147cbb33476 --- /dev/null +++ b/src/cryptoconditions/src/cryptoconditions.c @@ -0,0 +1,267 @@ +#include "strings.h" +#include "asn/Condition.h" +#include "asn/Fulfillment.h" +#include "asn/OCTET_STRING.h" +#include "cryptoconditions.h" +#include "src/internal.h" +#include "src/threshold.c" +#include "src/prefix.c" +#include "src/preimage.c" +#include "src/ed25519.c" +#include "src/secp256k1.c" +#include "src/anon.c" +#include "src/eval.c" +#include "src/json_rpc.c" +#include "src/utils.c" +#include +#include + + +static struct CCType *typeRegistry[] = { + &cc_preimageType, + &cc_prefixType, + &cc_thresholdType, + NULL, /* &cc_rsaType */ + &cc_ed25519Type, + &cc_secp256k1Type, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 6-14 unused */ + &cc_evalType +}; + + +static int typeRegistryLength = sizeof(typeRegistry) / sizeof(typeRegistry[0]); + + +void appendUriSubtypes(uint32_t mask, unsigned char *buf) { + int append = 0; + for (int i=0; i<32; i++) { + if (mask & 1 << i) { + if (append) { + strcat(buf, ","); + strcat(buf, typeRegistry[i]->name); + } else { + strcat(buf, "&subtypes="); + strcat(buf, typeRegistry[i]->name); + } + append = 1; + } + } +} + + +unsigned char *cc_conditionUri(const CC *cond) { + unsigned char *fp = cond->type->fingerprint(cond); + if (!fp) return NULL; + + unsigned char *encoded = base64_encode(fp, 32); + + unsigned char *out = calloc(1, 1000); + sprintf(out, "ni:///sha-256;%s?fpt=%s&cost=%lu", + encoded, cond->type->name, cc_getCost(cond)); + + if (cond->type->hasSubtypes) { + appendUriSubtypes(cond->type->getSubtypes(cond), out); + } + + free(fp); + free(encoded); + + return out; +} + + +static uint32_t getSubtypes(CC *cond) { + uint32_t mask = 1 << cond->type->typeId; + if (cond->type->hasSubtypes) { + mask |= cond->type->getSubtypes(cond); + } + return mask; +} + + +static ConditionTypes_t asnSubtypes(uint32_t mask) { + ConditionTypes_t types; + uint8_t buf[4] = {0,0,0,0}; + int maxId = 0; + + for (int i=0; i<32; i++) { + if (mask & (1<> 3] |= 1 << (7 - i % 8); + } + } + + types.size = 1 + (maxId >> 3); + types.buf = calloc(1, types.size); + memcpy(types.buf, &buf, types.size); + types.bits_unused = 7 - maxId % 8; + return types; +} + + +static uint32_t fromAsnSubtypes(const ConditionTypes_t types) { + uint32_t mask = 0; + for (int i=0; i> 3] & (1 << (7 - i % 8))) { + mask |= 1 << i; + } + } + return mask; +} + + +size_t cc_conditionBinary(const CC *cond, unsigned char *buf) { + Condition_t *asn = calloc(1, sizeof(Condition_t)); + asnCondition(cond, asn); + asn_enc_rval_t rc = der_encode_to_buffer(&asn_DEF_Condition, asn, buf, 1000); + if (rc.encoded == -1) { + printf("CONDITION NOT ENCODED\n"); + return 0; + } + ASN_STRUCT_FREE(asn_DEF_Condition, asn); + return rc.encoded; +} + + +size_t cc_fulfillmentBinary(const CC *cond, unsigned char *buf, size_t length) { + Fulfillment_t *ffill = asnFulfillmentNew(cond); + asn_enc_rval_t rc = der_encode_to_buffer(&asn_DEF_Fulfillment, ffill, buf, length); + if (rc.encoded == -1) { + printf("FULFILLMENT NOT ENCODED\n"); + return 0; + } + ASN_STRUCT_FREE(asn_DEF_Fulfillment, ffill); + return rc.encoded; +} + + +static void asnCondition(const CC *cond, Condition_t *asn) { + asn->present = cond->type->asnType; + + // This may look a little weird - we dont have a reference here to the correct + // union choice for the condition type, so we just assign everything to the threshold + // type. This works out nicely since the union choices have the same binary interface. + + CompoundSha256Condition_t *choice = &asn->choice.thresholdSha256; + choice->cost = cc_getCost(cond); + choice->fingerprint.buf = cond->type->fingerprint(cond); + choice->fingerprint.size = 32; + choice->subtypes = asnSubtypes(cond->type->getSubtypes(cond)); +} + + +static Condition_t *asnConditionNew(const CC *cond) { + Condition_t *asn = calloc(1, sizeof(Condition_t)); + asnCondition(cond, asn); + return asn; +} + + +static Fulfillment_t *asnFulfillmentNew(const CC *cond) { + return cond->type->toFulfillment(cond); +} + + +unsigned long cc_getCost(const CC *cond) { + return cond->type->getCost(cond); +} + + +CCType *getTypeByAsnEnum(Condition_PR present) { + for (int i=0; iasnType == present) { + return typeRegistry[i]; + } + } + return NULL; +} + + +static CC *fulfillmentToCC(Fulfillment_t *ffill) { + CCType *type = getTypeByAsnEnum(ffill->present); + if (!type) { + fprintf(stderr, "Unknown fulfillment type: %i\n", ffill->present); + return 0; + } + return type->fromFulfillment(ffill); +} + + +CC *cc_readFulfillmentBinary(unsigned char *ffill_bin, size_t ffill_bin_len) { + Fulfillment_t *ffill = 0; + CC *cond = 0; + asn_dec_rval_t rval = ber_decode(0, &asn_DEF_Fulfillment, (void **)&ffill, ffill_bin, ffill_bin_len); + if (rval.code == RC_OK) { + cond = fulfillmentToCC(ffill); + ASN_STRUCT_FREE(asn_DEF_Fulfillment, ffill); + } + return cond; +} + + +int cc_visit(CC *cond, CCVisitor visitor) { + int out = visitor.visit(cond, visitor); + if (out && cond->type->visitChildren) { + out = cond->type->visitChildren(cond, visitor); + } + return out; +} + + +int cc_verify(const struct CC *cond, const unsigned char *msg, size_t msgLength, int doHashMsg, + const unsigned char *condBin, size_t condBinLength, + VerifyEval verifyEval, void *evalContext) { + unsigned char targetBinary[1000]; + const size_t binLength = cc_conditionBinary(cond, targetBinary); + if (0 != memcmp(condBin, targetBinary, binLength)) { + return 0; + } + + if (!cc_ed25519VerifyTree(cond, msg, msgLength)) { + return 0; + } + + unsigned char msgHash[32]; + if (doHashMsg) sha256(msg, msgLength, msgHash); + else memcpy(msgHash, msg, 32); + if (!cc_secp256k1VerifyTreeMsg32(cond, msgHash)) { + return 0; + } + + if (!cc_verifyEval(cond, verifyEval, evalContext)) { + return 0; + } + return 1; +} + + +CC *cc_readConditionBinary(unsigned char *cond_bin, size_t length) { + Condition_t *asnCond = 0; + asn_dec_rval_t rval; + rval = ber_decode(0, &asn_DEF_Condition, (void **)&asnCond, cond_bin, length); + if (rval.code != RC_OK) { + printf("Failed reading condition binary\n"); + return NULL; + } + CC *cond = mkAnon(asnCond); + ASN_STRUCT_FREE(asn_DEF_Condition, asnCond); + return cond; +} + + +enum CCTypeId cc_typeId(const CC *cond) { + return cond->type->typeId; +} + + +int cc_isFulfilled(const CC *cond) { + return cond->type->isFulfilled(cond); +} + + +void cc_free(CC *cond) { + if (cond) + cond->type->free(cond); +} + + diff --git a/src/cryptoconditions/src/ed25519.c b/src/cryptoconditions/src/ed25519.c new file mode 100644 index 00000000000..85655c2dc29 --- /dev/null +++ b/src/cryptoconditions/src/ed25519.c @@ -0,0 +1,170 @@ +#include "asn/Condition.h" +#include "asn/Fulfillment.h" +#include "asn/Ed25519FingerprintContents.h" +#include "asn/OCTET_STRING.h" +#include "include/cJSON.h" +#include "include/ed25519/src/ed25519.h" +#include "cryptoconditions.h" + + +struct CCType cc_ed25519Type; + + +static unsigned char *ed25519Fingerprint(const CC *cond) { + Ed25519FingerprintContents_t *fp = calloc(1, sizeof(Ed25519FingerprintContents_t)); + OCTET_STRING_fromBuf(&fp->publicKey, cond->publicKey, 32); + return hashFingerprintContents(&asn_DEF_Ed25519FingerprintContents, fp); +} + + +int ed25519Verify(CC *cond, CCVisitor visitor) { + if (cond->type->typeId != cc_ed25519Type.typeId) return 1; + // TODO: test failure mode: empty sig / null pointer + return ed25519_verify(cond->signature, visitor.msg, visitor.msgLength, cond->publicKey); +} + + +static int cc_ed25519VerifyTree(const CC *cond, const unsigned char *msg, size_t msgLength) { + CCVisitor visitor = {&ed25519Verify, msg, msgLength, NULL}; + return cc_visit((CC*) cond, visitor); +} + + +/* + * Signing data + */ +typedef struct CCEd25519SigningData { + unsigned char *pk; + unsigned char *skpk; + int nSigned; +} CCEd25519SigningData; + + +/* + * Visitor that signs an ed25519 condition if it has a matching public key + */ +static int ed25519Sign(CC *cond, CCVisitor visitor) { + if (cond->type->typeId != cc_ed25519Type.typeId) return 1; + CCEd25519SigningData *signing = (CCEd25519SigningData*) visitor.context; + if (0 != memcmp(cond->publicKey, signing->pk, 32)) return 1; + if (!cond->signature) cond->signature = malloc(64); + ed25519_sign(cond->signature, visitor.msg, visitor.msgLength, + signing->pk, signing->skpk); + signing->nSigned++; + return 1; +} + + +/* + * Sign ed25519 conditions in a tree + */ +int cc_signTreeEd25519(CC *cond, const unsigned char *privateKey, const unsigned char *msg, size_t msgLength) { + unsigned char pk[32], skpk[64]; + ed25519_create_keypair(pk, skpk, privateKey); + + CCEd25519SigningData signing = {pk, skpk, 0}; + CCVisitor visitor = {&ed25519Sign, (unsigned char*)msg, msgLength, &signing}; + cc_visit(cond, visitor); + return signing.nSigned; +} + + +static unsigned long ed25519Cost(const CC *cond) { + return 131072; +} + + +static CC *ed25519FromJSON(const cJSON *params, unsigned char *err) { + size_t binsz; + + cJSON *pk_item = cJSON_GetObjectItem(params, "publicKey"); + if (!cJSON_IsString(pk_item)) { + strcpy(err, "publicKey must be a string"); + return NULL; + } + unsigned char *pk = base64_decode(pk_item->valuestring, &binsz); + if (32 != binsz) { + strcpy(err, "publicKey has incorrect length"); + free(pk); + return NULL; + } + + cJSON *signature_item = cJSON_GetObjectItem(params, "signature"); + unsigned char *sig = NULL; + if (signature_item && !cJSON_IsNull(signature_item)) { + if (!cJSON_IsString(signature_item)) { + strcpy(err, "signature must be null or a string"); + return NULL; + } + sig = base64_decode(signature_item->valuestring, &binsz); + if (64 != binsz) { + strcpy(err, "signature has incorrect length"); + free(sig); + return NULL; + } + } + + CC *cond = calloc(1, sizeof(CC)); + cond->type = &cc_ed25519Type; + cond->publicKey = pk; + cond->signature = sig; + return cond; +} + + +static void ed25519ToJSON(const CC *cond, cJSON *params) { + unsigned char *b64 = base64_encode(cond->publicKey, 32); + cJSON_AddItemToObject(params, "publicKey", cJSON_CreateString(b64)); + free(b64); + if (cond->signature) { + b64 = base64_encode(cond->signature, 64); + cJSON_AddItemToObject(params, "signature", cJSON_CreateString(b64)); + free(b64); + } +} + + +static CC *ed25519FromFulfillment(const Fulfillment_t *ffill) { + CC *cond = calloc(1, sizeof(CC)); + cond->type = &cc_ed25519Type; + cond->publicKey = malloc(32); + memcpy(cond->publicKey, ffill->choice.ed25519Sha256.publicKey.buf, 32); + cond->signature = malloc(64); + memcpy(cond->signature, ffill->choice.ed25519Sha256.signature.buf, 64); + return cond; +} + + +static Fulfillment_t *ed25519ToFulfillment(const CC *cond) { + if (!cond->signature) { + return NULL; + } + Fulfillment_t *ffill = calloc(1, sizeof(Fulfillment_t)); + ffill->present = Fulfillment_PR_ed25519Sha256; + Ed25519Sha512Fulfillment_t *ed2 = &ffill->choice.ed25519Sha256; + OCTET_STRING_fromBuf(&ed2->publicKey, cond->publicKey, 32); + OCTET_STRING_fromBuf(&ed2->signature, cond->signature, 64); + return ffill; +} + + +int ed25519IsFulfilled(const CC *cond) { + return cond->signature > 0; +} + + +static void ed25519Free(CC *cond) { + free(cond->publicKey); + if (cond->signature) { + free(cond->signature); + } + free(cond); +} + + +static uint32_t ed25519Subtypes(const CC *cond) { + return 0; +} + + +struct CCType cc_ed25519Type = { 4, "ed25519-sha-256", Condition_PR_ed25519Sha256, 0, 0, &ed25519Fingerprint, &ed25519Cost, &ed25519Subtypes, &ed25519FromJSON, &ed25519ToJSON, &ed25519FromFulfillment, &ed25519ToFulfillment, &ed25519IsFulfilled, &ed25519Free }; diff --git a/src/cryptoconditions/src/eval.c b/src/cryptoconditions/src/eval.c new file mode 100644 index 00000000000..976af32d74a --- /dev/null +++ b/src/cryptoconditions/src/eval.c @@ -0,0 +1,142 @@ +#include "asn/Condition.h" +#include "asn/Fulfillment.h" +#include "asn/EvalFulfillment.h" +#include "asn/EvalFingerprintContents.h" +#include "asn/OCTET_STRING.h" +#include "cryptoconditions.h" +#include "internal.h" +#include "include/cJSON.h" + + +struct CCType cc_evalType; + + +static unsigned char *evalFingerprint(const CC *cond) { + EvalFingerprintContents_t *fp = calloc(1, sizeof(EvalFingerprintContents_t)); + OCTET_STRING_fromBuf(&fp->method, cond->method, strlen(cond->method)); + OCTET_STRING_fromBuf(&fp->paramsBin, cond->paramsBin, cond->paramsBinLength); + return hashFingerprintContents(&asn_DEF_EvalFingerprintContents, fp); +} + + +static unsigned long evalCost(const CC *cond) { + return 1048576; // Pretty high +} + + +static CC *evalFromJSON(const cJSON *params, unsigned char *err) { + size_t paramsBinLength; + unsigned char *paramsBin = 0; + + cJSON *method_item = cJSON_GetObjectItem(params, "method"); + if (!checkString(method_item, "method", err)) { + return NULL; + } + + if (strlen(method_item->valuestring) > 64) { + strcpy(err, "method must be less than or equal to 64 bytes"); + return NULL; + } + + if (!jsonGetBase64(params, "params", err, ¶msBin, ¶msBinLength)) { + return NULL; + } + + CC *cond = calloc(1, sizeof(CC)); + strcpy(cond->method, method_item->valuestring); + cond->paramsBin = paramsBin; + cond->paramsBinLength = paramsBinLength; + cond->type = &cc_evalType; + return cond; +} + + +static void evalToJSON(const CC *cond, cJSON *params) { + + // add method + cJSON_AddItemToObject(params, "method", cJSON_CreateString(cond->method)); + + // add params + unsigned char *b64 = base64_encode(cond->paramsBin, cond->paramsBinLength); + cJSON_AddItemToObject(params, "params", cJSON_CreateString(b64)); + free(b64); +} + + +static CC *evalFromFulfillment(const Fulfillment_t *ffill) { + CC *cond = calloc(1, sizeof(CC)); + cond->type = &cc_evalType; + + EvalFulfillment_t *eval = &ffill->choice.evalSha256; + + memcpy(cond->method, eval->method.buf, eval->method.size); + cond->method[eval->method.size] = 0; + + OCTET_STRING_t octets = eval->paramsBin; + cond->paramsBinLength = octets.size; + cond->paramsBin = malloc(octets.size); + memcpy(cond->paramsBin, octets.buf, octets.size); + + return cond; +} + + +static Fulfillment_t *evalToFulfillment(const CC *cond) { + Fulfillment_t *ffill = calloc(1, sizeof(Fulfillment_t)); + ffill->present = Fulfillment_PR_evalSha256; + EvalFulfillment_t *eval = &ffill->choice.evalSha256; + OCTET_STRING_fromBuf(&eval->method, cond->method, strlen(cond->method)); + OCTET_STRING_fromBuf(&eval->paramsBin, cond->paramsBin, cond->paramsBinLength); + return ffill; +} + + +int evalIsFulfilled(const CC *cond) { + return 1; +} + + +static void evalFree(CC *cond) { + free(cond->paramsBin); + free(cond); +} + + +static uint32_t evalSubtypes(const CC *cond) { + return 0; +} + + +/* + * The JSON api doesn't contain custom verifiers, so a stub method is provided suitable for testing + */ +int jsonVerifyEval(CC *cond, void *context) { + if (strcmp(cond->method, "testEval") == 0) { + return memcmp(cond->paramsBin, "testEval", cond->paramsBinLength) == 0; + } + fprintf(stderr, "Cannot verify eval; user function unknown\n"); + return 0; +} + + +typedef struct CCEvalVerifyData { + VerifyEval verify; + void *context; +} CCEvalVerifyData; + + +int evalVisit(CC *cond, CCVisitor visitor) { + if (cond->type->typeId != cc_evalType.typeId) return 1; + CCEvalVerifyData *evalData = visitor.context; + return evalData->verify(cond, evalData->context); +} + + +int cc_verifyEval(const CC *cond, VerifyEval verify, void *context) { + CCEvalVerifyData evalData = {verify, context}; + CCVisitor visitor = {&evalVisit, "", 0, &evalData}; + return cc_visit(cond, visitor); +} + + +struct CCType cc_evalType = { 15, "eval-sha-256", Condition_PR_evalSha256, 0, 0, &evalFingerprint, &evalCost, &evalSubtypes, &evalFromJSON, &evalToJSON, &evalFromFulfillment, &evalToFulfillment, &evalIsFulfilled, &evalFree }; diff --git a/src/cryptoconditions/src/include/cJSON.c b/src/cryptoconditions/src/include/cJSON.c new file mode 100644 index 00000000000..306bb5b0df3 --- /dev/null +++ b/src/cryptoconditions/src/include/cJSON.c @@ -0,0 +1,2699 @@ +/* + Copyright (c) 2009-2017 Dave Gamble and cJSON contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +/* cJSON */ +/* JSON parser in C. */ + +#ifdef __GNUC__ +#pragma GCC visibility push(default) +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __GNUC__ +#pragma GCC visibility pop +#endif + +#include "cJSON.h" + +/* define our own boolean type */ +#define true ((cJSON_bool)1) +#define false ((cJSON_bool)0) + +typedef struct { + const unsigned char *json; + size_t position; +} error; +static error global_error = { NULL, 0 }; + +CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void) +{ + return (const char*) (global_error.json + global_error.position); +} + +/* This is a safeguard to prevent copy-pasters from using incompatible C and header files */ +#if (CJSON_VERSION_MAJOR != 1) || (CJSON_VERSION_MINOR != 5) || (CJSON_VERSION_PATCH != 9) + #error cJSON.h and cJSON.c have different versions. Make sure that both have the same. +#endif + +CJSON_PUBLIC(const char*) cJSON_Version(void) +{ + static char version[15]; + sprintf(version, "%i.%i.%i", CJSON_VERSION_MAJOR, CJSON_VERSION_MINOR, CJSON_VERSION_PATCH); + + return version; +} + +/* Case insensitive string comparison, doesn't consider two NULL pointers equal though */ +static int case_insensitive_strcmp(const unsigned char *string1, const unsigned char *string2) +{ + if ((string1 == NULL) || (string2 == NULL)) + { + return 1; + } + + if (string1 == string2) + { + return 0; + } + + for(; tolower(*string1) == tolower(*string2); (void)string1++, string2++) + { + if (*string1 == '\0') + { + return 0; + } + } + + return tolower(*string1) - tolower(*string2); +} + +typedef struct internal_hooks +{ + void *(*allocate)(size_t size); + void (*deallocate)(void *pointer); + void *(*reallocate)(void *pointer, size_t size); +} internal_hooks; + +static internal_hooks global_hooks = { malloc, free, realloc }; + +static unsigned char* cJSON_strdup(const unsigned char* string, const internal_hooks * const hooks) +{ + size_t length = 0; + unsigned char *copy = NULL; + + if (string == NULL) + { + return NULL; + } + + length = strlen((const char*)string) + sizeof(""); + if (!(copy = (unsigned char*)hooks->allocate(length))) + { + return NULL; + } + memcpy(copy, string, length); + + return copy; +} + +CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks) +{ + if (hooks == NULL) + { + /* Reset hooks */ + global_hooks.allocate = malloc; + global_hooks.deallocate = free; + global_hooks.reallocate = realloc; + return; + } + + global_hooks.allocate = malloc; + if (hooks->malloc_fn != NULL) + { + global_hooks.allocate = hooks->malloc_fn; + } + + global_hooks.deallocate = free; + if (hooks->free_fn != NULL) + { + global_hooks.deallocate = hooks->free_fn; + } + + /* use realloc only if both free and malloc are used */ + global_hooks.reallocate = NULL; + if ((global_hooks.allocate == malloc) && (global_hooks.deallocate == free)) + { + global_hooks.reallocate = realloc; + } +} + +/* Internal constructor. */ +static cJSON *cJSON_New_Item(const internal_hooks * const hooks) +{ + cJSON* node = (cJSON*)hooks->allocate(sizeof(cJSON)); + if (node) + { + memset(node, '\0', sizeof(cJSON)); + } + + return node; +} + +/* Delete a cJSON structure. */ +CJSON_PUBLIC(void) cJSON_Delete(cJSON *item) +{ + cJSON *next = NULL; + while (item != NULL) + { + next = item->next; + if (!(item->type & cJSON_IsReference) && (item->child != NULL)) + { + cJSON_Delete(item->child); + } + if (!(item->type & cJSON_IsReference) && (item->valuestring != NULL)) + { + global_hooks.deallocate(item->valuestring); + } + if (!(item->type & cJSON_StringIsConst) && (item->string != NULL)) + { + global_hooks.deallocate(item->string); + } + global_hooks.deallocate(item); + item = next; + } +} + +/* get the decimal point character of the current locale */ +static unsigned char get_decimal_point(void) +{ + struct lconv *lconv = localeconv(); + return (unsigned char) lconv->decimal_point[0]; +} + +typedef struct +{ + const unsigned char *content; + size_t length; + size_t offset; + size_t depth; /* How deeply nested (in arrays/objects) is the input at the current offset. */ + internal_hooks hooks; +} parse_buffer; + +/* check if the given size is left to read in a given parse buffer (starting with 1) */ +#define can_read(buffer, size) ((buffer != NULL) && (((buffer)->offset + size) <= (buffer)->length)) +#define cannot_read(buffer, size) (!can_read(buffer, size)) +/* check if the buffer can be accessed at the given index (starting with 0) */ +#define can_access_at_index(buffer, index) ((buffer != NULL) && (((buffer)->offset + index) < (buffer)->length)) +#define cannot_access_at_index(buffer, index) (!can_access_at_index(buffer, index)) +/* get a pointer to the buffer at the position */ +#define buffer_at_offset(buffer) ((buffer)->content + (buffer)->offset) + +/* Parse the input text to generate a number, and populate the result into item. */ +static cJSON_bool parse_number(cJSON * const item, parse_buffer * const input_buffer) +{ + double number = 0; + unsigned char *after_end = NULL; + unsigned char number_c_string[64]; + unsigned char decimal_point = get_decimal_point(); + size_t i = 0; + + if ((input_buffer == NULL) || (input_buffer->content == NULL)) + { + return false; + } + + /* copy the number into a temporary buffer and replace '.' with the decimal point + * of the current locale (for strtod) + * This also takes care of '\0' not necessarily being available for marking the end of the input */ + for (i = 0; (i < (sizeof(number_c_string) - 1)) && can_access_at_index(input_buffer, i); i++) + { + switch (buffer_at_offset(input_buffer)[i]) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '+': + case '-': + case 'e': + case 'E': + number_c_string[i] = buffer_at_offset(input_buffer)[i]; + break; + + case '.': + number_c_string[i] = decimal_point; + break; + + default: + goto loop_end; + } + } +loop_end: + number_c_string[i] = '\0'; + + number = strtod((const char*)number_c_string, (char**)&after_end); + if (number_c_string == after_end) + { + return false; /* parse_error */ + } + + item->valuedouble = number; + + /* use saturation in case of overflow */ + if (number >= INT_MAX) + { + item->valueint = INT_MAX; + } + else if (number <= INT_MIN) + { + item->valueint = INT_MIN; + } + else + { + item->valueint = (int)number; + } + + item->type = cJSON_Number; + + input_buffer->offset += (size_t)(after_end - number_c_string); + return true; +} + +/* don't ask me, but the original cJSON_SetNumberValue returns an integer or double */ +CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number) +{ + if (number >= INT_MAX) + { + object->valueint = INT_MAX; + } + else if (number <= INT_MIN) + { + object->valueint = INT_MIN; + } + else + { + object->valueint = (int)number; + } + + return object->valuedouble = number; +} + +typedef struct +{ + unsigned char *buffer; + size_t length; + size_t offset; + size_t depth; /* current nesting depth (for formatted printing) */ + cJSON_bool noalloc; + cJSON_bool format; /* is this print a formatted print */ + internal_hooks hooks; +} printbuffer; + +/* realloc printbuffer if necessary to have at least "needed" bytes more */ +static unsigned char* ensure(printbuffer * const p, size_t needed) +{ + unsigned char *newbuffer = NULL; + size_t newsize = 0; + + if ((p == NULL) || (p->buffer == NULL)) + { + return NULL; + } + + if ((p->length > 0) && (p->offset >= p->length)) + { + /* make sure that offset is valid */ + return NULL; + } + + if (needed > INT_MAX) + { + /* sizes bigger than INT_MAX are currently not supported */ + return NULL; + } + + needed += p->offset + 1; + if (needed <= p->length) + { + return p->buffer + p->offset; + } + + if (p->noalloc) { + return NULL; + } + + /* calculate new buffer size */ + if (needed > (INT_MAX / 2)) + { + /* overflow of int, use INT_MAX if possible */ + if (needed <= INT_MAX) + { + newsize = INT_MAX; + } + else + { + return NULL; + } + } + else + { + newsize = needed * 2; + } + + if (p->hooks.reallocate != NULL) + { + /* reallocate with realloc if available */ + newbuffer = (unsigned char*)p->hooks.reallocate(p->buffer, newsize); + if (newbuffer == NULL) + { + p->hooks.deallocate(p->buffer); + p->length = 0; + p->buffer = NULL; + + return NULL; + } + } + else + { + /* otherwise reallocate manually */ + newbuffer = (unsigned char*)p->hooks.allocate(newsize); + if (!newbuffer) + { + p->hooks.deallocate(p->buffer); + p->length = 0; + p->buffer = NULL; + + return NULL; + } + if (newbuffer) + { + memcpy(newbuffer, p->buffer, p->offset + 1); + } + p->hooks.deallocate(p->buffer); + } + p->length = newsize; + p->buffer = newbuffer; + + return newbuffer + p->offset; +} + +/* calculate the new length of the string in a printbuffer and update the offset */ +static void update_offset(printbuffer * const buffer) +{ + const unsigned char *buffer_pointer = NULL; + if ((buffer == NULL) || (buffer->buffer == NULL)) + { + return; + } + buffer_pointer = buffer->buffer + buffer->offset; + + buffer->offset += strlen((const char*)buffer_pointer); +} + +/* Render the number nicely from the given item into a string. */ +static cJSON_bool print_number(const cJSON * const item, printbuffer * const output_buffer) +{ + unsigned char *output_pointer = NULL; + double d = item->valuedouble; + int length = 0; + size_t i = 0; + unsigned char number_buffer[26]; /* temporary buffer to print the number into */ + unsigned char decimal_point = get_decimal_point(); + double test; + + if (output_buffer == NULL) + { + return false; + } + + /* This checks for NaN and Infinity */ + if ((d * 0) != 0) + { + length = sprintf((char*)number_buffer, "null"); + } + else + { + /* Try 15 decimal places of precision to avoid nonsignificant nonzero digits */ + length = sprintf((char*)number_buffer, "%1.15g", d); + + /* Check whether the original double can be recovered */ + if ((sscanf((char*)number_buffer, "%lg", &test) != 1) || ((double)test != d)) + { + /* If not, print with 17 decimal places of precision */ + length = sprintf((char*)number_buffer, "%1.17g", d); + } + } + + /* sprintf failed or buffer overrun occured */ + if ((length < 0) || (length > (int)(sizeof(number_buffer) - 1))) + { + return false; + } + + /* reserve appropriate space in the output */ + output_pointer = ensure(output_buffer, (size_t)length); + if (output_pointer == NULL) + { + return false; + } + + /* copy the printed number to the output and replace locale + * dependent decimal point with '.' */ + for (i = 0; i < ((size_t)length); i++) + { + if (number_buffer[i] == decimal_point) + { + output_pointer[i] = '.'; + continue; + } + + output_pointer[i] = number_buffer[i]; + } + output_pointer[i] = '\0'; + + output_buffer->offset += (size_t)length; + + return true; +} + +/* parse 4 digit hexadecimal number */ +static unsigned parse_hex4(const unsigned char * const input) +{ + unsigned int h = 0; + size_t i = 0; + + for (i = 0; i < 4; i++) + { + /* parse digit */ + if ((input[i] >= '0') && (input[i] <= '9')) + { + h += (unsigned int) input[i] - '0'; + } + else if ((input[i] >= 'A') && (input[i] <= 'F')) + { + h += (unsigned int) 10 + input[i] - 'A'; + } + else if ((input[i] >= 'a') && (input[i] <= 'f')) + { + h += (unsigned int) 10 + input[i] - 'a'; + } + else /* invalid */ + { + return 0; + } + + if (i < 3) + { + /* shift left to make place for the next nibble */ + h = h << 4; + } + } + + return h; +} + +/* converts a UTF-16 literal to UTF-8 + * A literal can be one or two sequences of the form \uXXXX */ +static unsigned char utf16_literal_to_utf8(const unsigned char * const input_pointer, const unsigned char * const input_end, unsigned char **output_pointer) +{ + long unsigned int codepoint = 0; + unsigned int first_code = 0; + const unsigned char *first_sequence = input_pointer; + unsigned char utf8_length = 0; + unsigned char utf8_position = 0; + unsigned char sequence_length = 0; + unsigned char first_byte_mark = 0; + + if ((input_end - first_sequence) < 6) + { + /* input ends unexpectedly */ + goto fail; + } + + /* get the first utf16 sequence */ + first_code = parse_hex4(first_sequence + 2); + + /* check that the code is valid */ + if (((first_code >= 0xDC00) && (first_code <= 0xDFFF))) + { + goto fail; + } + + /* UTF16 surrogate pair */ + if ((first_code >= 0xD800) && (first_code <= 0xDBFF)) + { + const unsigned char *second_sequence = first_sequence + 6; + unsigned int second_code = 0; + sequence_length = 12; /* \uXXXX\uXXXX */ + + if ((input_end - second_sequence) < 6) + { + /* input ends unexpectedly */ + goto fail; + } + + if ((second_sequence[0] != '\\') || (second_sequence[1] != 'u')) + { + /* missing second half of the surrogate pair */ + goto fail; + } + + /* get the second utf16 sequence */ + second_code = parse_hex4(second_sequence + 2); + /* check that the code is valid */ + if ((second_code < 0xDC00) || (second_code > 0xDFFF)) + { + /* invalid second half of the surrogate pair */ + goto fail; + } + + + /* calculate the unicode codepoint from the surrogate pair */ + codepoint = 0x10000 + (((first_code & 0x3FF) << 10) | (second_code & 0x3FF)); + } + else + { + sequence_length = 6; /* \uXXXX */ + codepoint = first_code; + } + + /* encode as UTF-8 + * takes at maximum 4 bytes to encode: + * 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ + if (codepoint < 0x80) + { + /* normal ascii, encoding 0xxxxxxx */ + utf8_length = 1; + } + else if (codepoint < 0x800) + { + /* two bytes, encoding 110xxxxx 10xxxxxx */ + utf8_length = 2; + first_byte_mark = 0xC0; /* 11000000 */ + } + else if (codepoint < 0x10000) + { + /* three bytes, encoding 1110xxxx 10xxxxxx 10xxxxxx */ + utf8_length = 3; + first_byte_mark = 0xE0; /* 11100000 */ + } + else if (codepoint <= 0x10FFFF) + { + /* four bytes, encoding 1110xxxx 10xxxxxx 10xxxxxx 10xxxxxx */ + utf8_length = 4; + first_byte_mark = 0xF0; /* 11110000 */ + } + else + { + /* invalid unicode codepoint */ + goto fail; + } + + /* encode as utf8 */ + for (utf8_position = (unsigned char)(utf8_length - 1); utf8_position > 0; utf8_position--) + { + /* 10xxxxxx */ + (*output_pointer)[utf8_position] = (unsigned char)((codepoint | 0x80) & 0xBF); + codepoint >>= 6; + } + /* encode first byte */ + if (utf8_length > 1) + { + (*output_pointer)[0] = (unsigned char)((codepoint | first_byte_mark) & 0xFF); + } + else + { + (*output_pointer)[0] = (unsigned char)(codepoint & 0x7F); + } + + *output_pointer += utf8_length; + + return sequence_length; + +fail: + return 0; +} + +/* Parse the input text into an unescaped cinput, and populate item. */ +static cJSON_bool parse_string(cJSON * const item, parse_buffer * const input_buffer) +{ + const unsigned char *input_pointer = buffer_at_offset(input_buffer) + 1; + const unsigned char *input_end = buffer_at_offset(input_buffer) + 1; + unsigned char *output_pointer = NULL; + unsigned char *output = NULL; + + /* not a string */ + if (buffer_at_offset(input_buffer)[0] != '\"') + { + goto fail; + } + + { + /* calculate approximate size of the output (overestimate) */ + size_t allocation_length = 0; + size_t skipped_bytes = 0; + while (((size_t)(input_end - input_buffer->content) < input_buffer->length) && (*input_end != '\"')) + { + /* is escape sequence */ + if (input_end[0] == '\\') + { + if ((size_t)(input_end + 1 - input_buffer->content) >= input_buffer->length) + { + /* prevent buffer overflow when last input character is a backslash */ + goto fail; + } + skipped_bytes++; + input_end++; + } + input_end++; + } + if (((size_t)(input_end - input_buffer->content) >= input_buffer->length) || (*input_end != '\"')) + { + goto fail; /* string ended unexpectedly */ + } + + /* This is at most how much we need for the output */ + allocation_length = (size_t) (input_end - buffer_at_offset(input_buffer)) - skipped_bytes; + output = (unsigned char*)input_buffer->hooks.allocate(allocation_length + sizeof("")); + if (output == NULL) + { + goto fail; /* allocation failure */ + } + } + + output_pointer = output; + /* loop through the string literal */ + while (input_pointer < input_end) + { + if (*input_pointer != '\\') + { + *output_pointer++ = *input_pointer++; + } + /* escape sequence */ + else + { + unsigned char sequence_length = 2; + if ((input_end - input_pointer) < 1) + { + goto fail; + } + + switch (input_pointer[1]) + { + case 'b': + *output_pointer++ = '\b'; + break; + case 'f': + *output_pointer++ = '\f'; + break; + case 'n': + *output_pointer++ = '\n'; + break; + case 'r': + *output_pointer++ = '\r'; + break; + case 't': + *output_pointer++ = '\t'; + break; + case '\"': + case '\\': + case '/': + *output_pointer++ = input_pointer[1]; + break; + + /* UTF-16 literal */ + case 'u': + sequence_length = utf16_literal_to_utf8(input_pointer, input_end, &output_pointer); + if (sequence_length == 0) + { + /* failed to convert UTF16-literal to UTF-8 */ + goto fail; + } + break; + + default: + goto fail; + } + input_pointer += sequence_length; + } + } + + /* zero terminate the output */ + *output_pointer = '\0'; + + item->type = cJSON_String; + item->valuestring = (char*)output; + + input_buffer->offset = (size_t) (input_end - input_buffer->content); + input_buffer->offset++; + + return true; + +fail: + if (output != NULL) + { + input_buffer->hooks.deallocate(output); + } + + if (input_pointer != NULL) + { + input_buffer->offset = (size_t)(input_pointer - input_buffer->content); + } + + return false; +} + +/* Render the cstring provided to an escaped version that can be printed. */ +static cJSON_bool print_string_ptr(const unsigned char * const input, printbuffer * const output_buffer) +{ + const unsigned char *input_pointer = NULL; + unsigned char *output = NULL; + unsigned char *output_pointer = NULL; + size_t output_length = 0; + /* numbers of additional characters needed for escaping */ + size_t escape_characters = 0; + + if (output_buffer == NULL) + { + return false; + } + + /* empty string */ + if (input == NULL) + { + output = ensure(output_buffer, sizeof("\"\"")); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "\"\""); + + return true; + } + + /* set "flag" to 1 if something needs to be escaped */ + for (input_pointer = input; *input_pointer; input_pointer++) + { + switch (*input_pointer) + { + case '\"': + case '\\': + case '\b': + case '\f': + case '\n': + case '\r': + case '\t': + /* one character escape sequence */ + escape_characters++; + break; + default: + if (*input_pointer < 32) + { + /* UTF-16 escape sequence uXXXX */ + escape_characters += 5; + } + break; + } + } + output_length = (size_t)(input_pointer - input) + escape_characters; + + output = ensure(output_buffer, output_length + sizeof("\"\"")); + if (output == NULL) + { + return false; + } + + /* no characters have to be escaped */ + if (escape_characters == 0) + { + output[0] = '\"'; + memcpy(output + 1, input, output_length); + output[output_length + 1] = '\"'; + output[output_length + 2] = '\0'; + + return true; + } + + output[0] = '\"'; + output_pointer = output + 1; + /* copy the string */ + for (input_pointer = input; *input_pointer != '\0'; (void)input_pointer++, output_pointer++) + { + if ((*input_pointer > 31) && (*input_pointer != '\"') && (*input_pointer != '\\')) + { + /* normal character, copy */ + *output_pointer = *input_pointer; + } + else + { + /* character needs to be escaped */ + *output_pointer++ = '\\'; + switch (*input_pointer) + { + case '\\': + *output_pointer = '\\'; + break; + case '\"': + *output_pointer = '\"'; + break; + case '\b': + *output_pointer = 'b'; + break; + case '\f': + *output_pointer = 'f'; + break; + case '\n': + *output_pointer = 'n'; + break; + case '\r': + *output_pointer = 'r'; + break; + case '\t': + *output_pointer = 't'; + break; + default: + /* escape and print as unicode codepoint */ + sprintf((char*)output_pointer, "u%04x", *input_pointer); + output_pointer += 4; + break; + } + } + } + output[output_length + 1] = '\"'; + output[output_length + 2] = '\0'; + + return true; +} + +/* Invoke print_string_ptr (which is useful) on an item. */ +static cJSON_bool print_string(const cJSON * const item, printbuffer * const p) +{ + return print_string_ptr((unsigned char*)item->valuestring, p); +} + +/* Predeclare these prototypes. */ +static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer); +static cJSON_bool print_value(const cJSON * const item, printbuffer * const output_buffer); +static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer); +static cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer); +static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer); +static cJSON_bool print_object(const cJSON * const item, printbuffer * const output_buffer); + +/* Utility to jump whitespace and cr/lf */ +static parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer) +{ + if ((buffer == NULL) || (buffer->content == NULL)) + { + return NULL; + } + + while (can_access_at_index(buffer, 0) && (buffer_at_offset(buffer)[0] <= 32)) + { + buffer->offset++; + } + + if (buffer->offset == buffer->length) + { + buffer->offset--; + } + + return buffer; +} + +/* Parse an object - create a new root, and populate. */ +CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated) +{ + parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } }; + cJSON *item = NULL; + + /* reset error position */ + global_error.json = NULL; + global_error.position = 0; + + if (value == NULL) + { + goto fail; + } + + buffer.content = (const unsigned char*)value; + buffer.length = strlen((const char*)value) + sizeof(""); + buffer.offset = 0; + buffer.hooks = global_hooks; + + item = cJSON_New_Item(&global_hooks); + if (item == NULL) /* memory fail */ + { + goto fail; + } + + if (!parse_value(item, buffer_skip_whitespace(&buffer))) + { + /* parse failure. ep is set. */ + goto fail; + } + + /* if we require null-terminated JSON without appended garbage, skip and then check for a null terminator */ + if (require_null_terminated) + { + buffer_skip_whitespace(&buffer); + if ((buffer.offset >= buffer.length) || buffer_at_offset(&buffer)[0] != '\0') + { + goto fail; + } + } + if (return_parse_end) + { + *return_parse_end = (const char*)buffer_at_offset(&buffer); + } + + return item; + +fail: + if (item != NULL) + { + cJSON_Delete(item); + } + + if (value != NULL) + { + error local_error; + local_error.json = (const unsigned char*)value; + local_error.position = 0; + + if (buffer.offset < buffer.length) + { + local_error.position = buffer.offset; + } + else if (buffer.length > 0) + { + local_error.position = buffer.length - 1; + } + + if (return_parse_end != NULL) + { + *return_parse_end = (const char*)local_error.json + local_error.position; + } + + global_error = local_error; + } + + return NULL; +} + +/* Default options for cJSON_Parse */ +CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value) +{ + return cJSON_ParseWithOpts(value, 0, 0); +} + +#define cjson_min(a, b) ((a < b) ? a : b) + +static unsigned char *print(const cJSON * const item, cJSON_bool format, const internal_hooks * const hooks) +{ + printbuffer buffer[1]; + unsigned char *printed = NULL; + + memset(buffer, 0, sizeof(buffer)); + + /* create buffer */ + buffer->buffer = (unsigned char*) hooks->allocate(256); + buffer->format = format; + buffer->hooks = *hooks; + if (buffer->buffer == NULL) + { + goto fail; + } + + /* print the value */ + if (!print_value(item, buffer)) + { + goto fail; + } + update_offset(buffer); + + /* check if reallocate is available */ + if (hooks->reallocate != NULL) + { + printed = (unsigned char*) hooks->reallocate(buffer->buffer, buffer->length); + buffer->buffer = NULL; + if (printed == NULL) { + goto fail; + } + } + else /* otherwise copy the JSON over to a new buffer */ + { + printed = (unsigned char*) hooks->allocate(buffer->offset + 1); + if (printed == NULL) + { + goto fail; + } + memcpy(printed, buffer->buffer, cjson_min(buffer->length, buffer->offset + 1)); + printed[buffer->offset] = '\0'; /* just to be sure */ + + /* free the buffer */ + hooks->deallocate(buffer->buffer); + } + + return printed; + +fail: + if (buffer->buffer != NULL) + { + hooks->deallocate(buffer->buffer); + } + + if (printed != NULL) + { + hooks->deallocate(printed); + } + + return NULL; +} + +/* Render a cJSON item/entity/structure to text. */ +CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item) +{ + return (char*)print(item, true, &global_hooks); +} + +CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item) +{ + return (char*)print(item, false, &global_hooks); +} + +CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt) +{ + printbuffer p = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; + + if (prebuffer < 0) + { + return NULL; + } + + p.buffer = (unsigned char*)global_hooks.allocate((size_t)prebuffer); + if (!p.buffer) + { + return NULL; + } + + p.length = (size_t)prebuffer; + p.offset = 0; + p.noalloc = false; + p.format = fmt; + p.hooks = global_hooks; + + if (!print_value(item, &p)) + { + global_hooks.deallocate(p.buffer); + return NULL; + } + + return (char*)p.buffer; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buf, const int len, const cJSON_bool fmt) +{ + printbuffer p = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } }; + + if ((len < 0) || (buf == NULL)) + { + return false; + } + + p.buffer = (unsigned char*)buf; + p.length = (size_t)len; + p.offset = 0; + p.noalloc = true; + p.format = fmt; + p.hooks = global_hooks; + + return print_value(item, &p); +} + +/* Parser core - when encountering text, process appropriately. */ +static cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer) +{ + if ((input_buffer == NULL) || (input_buffer->content == NULL)) + { + return false; /* no input */ + } + + /* parse the different types of values */ + /* null */ + if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "null", 4) == 0)) + { + item->type = cJSON_NULL; + input_buffer->offset += 4; + return true; + } + /* false */ + if (can_read(input_buffer, 5) && (strncmp((const char*)buffer_at_offset(input_buffer), "false", 5) == 0)) + { + item->type = cJSON_False; + input_buffer->offset += 5; + return true; + } + /* true */ + if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), "true", 4) == 0)) + { + item->type = cJSON_True; + item->valueint = 1; + input_buffer->offset += 4; + return true; + } + /* string */ + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '\"')) + { + return parse_string(item, input_buffer); + } + /* number */ + if (can_access_at_index(input_buffer, 0) && ((buffer_at_offset(input_buffer)[0] == '-') || ((buffer_at_offset(input_buffer)[0] >= '0') && (buffer_at_offset(input_buffer)[0] <= '9')))) + { + return parse_number(item, input_buffer); + } + /* array */ + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '[')) + { + return parse_array(item, input_buffer); + } + /* object */ + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '{')) + { + return parse_object(item, input_buffer); + } + + + return false; +} + +/* Render a value to text. */ +static cJSON_bool print_value(const cJSON * const item, printbuffer * const output_buffer) +{ + unsigned char *output = NULL; + + if ((item == NULL) || (output_buffer == NULL)) + { + return false; + } + + switch ((item->type) & 0xFF) + { + case cJSON_NULL: + output = ensure(output_buffer, 5); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "null"); + return true; + + case cJSON_False: + output = ensure(output_buffer, 6); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "false"); + return true; + + case cJSON_True: + output = ensure(output_buffer, 5); + if (output == NULL) + { + return false; + } + strcpy((char*)output, "true"); + return true; + + case cJSON_Number: + return print_number(item, output_buffer); + + case cJSON_Raw: + { + size_t raw_length = 0; + if (item->valuestring == NULL) + { + if (!output_buffer->noalloc) + { + output_buffer->hooks.deallocate(output_buffer->buffer); + } + return false; + } + + raw_length = strlen(item->valuestring) + sizeof(""); + output = ensure(output_buffer, raw_length); + if (output == NULL) + { + return false; + } + memcpy(output, item->valuestring, raw_length); + return true; + } + + case cJSON_String: + return print_string(item, output_buffer); + + case cJSON_Array: + return print_array(item, output_buffer); + + case cJSON_Object: + return print_object(item, output_buffer); + + default: + return false; + } +} + +/* Build an array from input text. */ +static cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer) +{ + cJSON *head = NULL; /* head of the linked list */ + cJSON *current_item = NULL; + + if (input_buffer->depth >= CJSON_NESTING_LIMIT) + { + return false; /* to deeply nested */ + } + input_buffer->depth++; + + if (buffer_at_offset(input_buffer)[0] != '[') + { + /* not an array */ + goto fail; + } + + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ']')) + { + /* empty array */ + goto success; + } + + /* check if we skipped to the end of the buffer */ + if (cannot_access_at_index(input_buffer, 0)) + { + input_buffer->offset--; + goto fail; + } + + /* step back to character in front of the first element */ + input_buffer->offset--; + /* loop through the comma separated array elements */ + do + { + /* allocate next item */ + cJSON *new_item = cJSON_New_Item(&(input_buffer->hooks)); + if (new_item == NULL) + { + goto fail; /* allocation failure */ + } + + /* attach next item to list */ + if (head == NULL) + { + /* start the linked list */ + current_item = head = new_item; + } + else + { + /* add to the end and advance */ + current_item->next = new_item; + new_item->prev = current_item; + current_item = new_item; + } + + /* parse next value */ + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (!parse_value(current_item, input_buffer)) + { + goto fail; /* failed to parse value */ + } + buffer_skip_whitespace(input_buffer); + } + while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ',')); + + if (cannot_access_at_index(input_buffer, 0) || buffer_at_offset(input_buffer)[0] != ']') + { + goto fail; /* expected end of array */ + } + +success: + input_buffer->depth--; + + item->type = cJSON_Array; + item->child = head; + + input_buffer->offset++; + + return true; + +fail: + if (head != NULL) + { + cJSON_Delete(head); + } + + return false; +} + +/* Render an array to text */ +static cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer) +{ + unsigned char *output_pointer = NULL; + size_t length = 0; + cJSON *current_element = item->child; + + if (output_buffer == NULL) + { + return false; + } + + /* Compose the output array. */ + /* opening square bracket */ + output_pointer = ensure(output_buffer, 1); + if (output_pointer == NULL) + { + return false; + } + + *output_pointer = '['; + output_buffer->offset++; + output_buffer->depth++; + + while (current_element != NULL) + { + if (!print_value(current_element, output_buffer)) + { + return false; + } + update_offset(output_buffer); + if (current_element->next) + { + length = (size_t) (output_buffer->format ? 2 : 1); + output_pointer = ensure(output_buffer, length + 1); + if (output_pointer == NULL) + { + return false; + } + *output_pointer++ = ','; + if(output_buffer->format) + { + *output_pointer++ = ' '; + } + *output_pointer = '\0'; + output_buffer->offset += length; + } + current_element = current_element->next; + } + + output_pointer = ensure(output_buffer, 2); + if (output_pointer == NULL) + { + return false; + } + *output_pointer++ = ']'; + *output_pointer = '\0'; + output_buffer->depth--; + + return true; +} + +/* Build an object from the text. */ +static cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer) +{ + cJSON *head = NULL; /* linked list head */ + cJSON *current_item = NULL; + + if (input_buffer->depth >= CJSON_NESTING_LIMIT) + { + return false; /* to deeply nested */ + } + input_buffer->depth++; + + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '{')) + { + goto fail; /* not an object */ + } + + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '}')) + { + goto success; /* empty object */ + } + + /* check if we skipped to the end of the buffer */ + if (cannot_access_at_index(input_buffer, 0)) + { + input_buffer->offset--; + goto fail; + } + + /* step back to character in front of the first element */ + input_buffer->offset--; + /* loop through the comma separated array elements */ + do + { + /* allocate next item */ + cJSON *new_item = cJSON_New_Item(&(input_buffer->hooks)); + if (new_item == NULL) + { + goto fail; /* allocation failure */ + } + + /* attach next item to list */ + if (head == NULL) + { + /* start the linked list */ + current_item = head = new_item; + } + else + { + /* add to the end and advance */ + current_item->next = new_item; + new_item->prev = current_item; + current_item = new_item; + } + + /* parse the name of the child */ + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (!parse_string(current_item, input_buffer)) + { + goto fail; /* faile to parse name */ + } + buffer_skip_whitespace(input_buffer); + + /* swap valuestring and string, because we parsed the name */ + current_item->string = current_item->valuestring; + current_item->valuestring = NULL; + + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != ':')) + { + goto fail; /* invalid object */ + } + + /* parse the value */ + input_buffer->offset++; + buffer_skip_whitespace(input_buffer); + if (!parse_value(current_item, input_buffer)) + { + goto fail; /* failed to parse value */ + } + buffer_skip_whitespace(input_buffer); + } + while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ',')); + + if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '}')) + { + goto fail; /* expected end of object */ + } + +success: + input_buffer->depth--; + + item->type = cJSON_Object; + item->child = head; + + input_buffer->offset++; + return true; + +fail: + if (head != NULL) + { + cJSON_Delete(head); + } + + return false; +} + +/* Render an object to text. */ +static cJSON_bool print_object(const cJSON * const item, printbuffer * const output_buffer) +{ + unsigned char *output_pointer = NULL; + size_t length = 0; + cJSON *current_item = item->child; + + if (output_buffer == NULL) + { + return false; + } + + /* Compose the output: */ + length = (size_t) (output_buffer->format ? 2 : 1); /* fmt: {\n */ + output_pointer = ensure(output_buffer, length + 1); + if (output_pointer == NULL) + { + return false; + } + + *output_pointer++ = '{'; + output_buffer->depth++; + if (output_buffer->format) + { + *output_pointer++ = '\n'; + } + output_buffer->offset += length; + + while (current_item) + { + if (output_buffer->format) + { + size_t i; + output_pointer = ensure(output_buffer, output_buffer->depth); + if (output_pointer == NULL) + { + return false; + } + for (i = 0; i < output_buffer->depth; i++) + { + *output_pointer++ = '\t'; + } + output_buffer->offset += output_buffer->depth; + } + + /* print key */ + if (!print_string_ptr((unsigned char*)current_item->string, output_buffer)) + { + return false; + } + update_offset(output_buffer); + + length = (size_t) (output_buffer->format ? 2 : 1); + output_pointer = ensure(output_buffer, length); + if (output_pointer == NULL) + { + return false; + } + *output_pointer++ = ':'; + if (output_buffer->format) + { + *output_pointer++ = '\t'; + } + output_buffer->offset += length; + + /* print value */ + if (!print_value(current_item, output_buffer)) + { + return false; + } + update_offset(output_buffer); + + /* print comma if not last */ + length = (size_t) ((output_buffer->format ? 1 : 0) + (current_item->next ? 1 : 0)); + output_pointer = ensure(output_buffer, length + 1); + if (output_pointer == NULL) + { + return false; + } + if (current_item->next) + { + *output_pointer++ = ','; + } + + if (output_buffer->format) + { + *output_pointer++ = '\n'; + } + *output_pointer = '\0'; + output_buffer->offset += length; + + current_item = current_item->next; + } + + output_pointer = ensure(output_buffer, output_buffer->format ? (output_buffer->depth + 1) : 2); + if (output_pointer == NULL) + { + return false; + } + if (output_buffer->format) + { + size_t i; + for (i = 0; i < (output_buffer->depth - 1); i++) + { + *output_pointer++ = '\t'; + } + } + *output_pointer++ = '}'; + *output_pointer = '\0'; + output_buffer->depth--; + + return true; +} + +/* Get Array size/item / object item. */ +CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array) +{ + cJSON *child = NULL; + size_t size = 0; + + if (array == NULL) + { + return 0; + } + + child = array->child; + + while(child != NULL) + { + size++; + child = child->next; + } + + /* FIXME: Can overflow here. Cannot be fixed without breaking the API */ + + return (int)size; +} + +static cJSON* get_array_item(const cJSON *array, size_t index) +{ + cJSON *current_child = NULL; + + if (array == NULL) + { + return NULL; + } + + current_child = array->child; + while ((current_child != NULL) && (index > 0)) + { + index--; + current_child = current_child->next; + } + + return current_child; +} + +CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index) +{ + if (index < 0) + { + return NULL; + } + + return get_array_item(array, (size_t)index); +} + +static cJSON *get_object_item(const cJSON * const object, const char * const name, const cJSON_bool case_sensitive) +{ + cJSON *current_element = NULL; + + if ((object == NULL) || (name == NULL)) + { + return NULL; + } + + current_element = object->child; + if (case_sensitive) + { + while ((current_element != NULL) && (strcmp(name, current_element->string) != 0)) + { + current_element = current_element->next; + } + } + else + { + while ((current_element != NULL) && (case_insensitive_strcmp((const unsigned char*)name, (const unsigned char*)(current_element->string)) != 0)) + { + current_element = current_element->next; + } + } + + return current_element; +} + +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string) +{ + return get_object_item(object, string, false); +} + +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string) +{ + return get_object_item(object, string, true); +} + +CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string) +{ + return cJSON_GetObjectItem(object, string) ? 1 : 0; +} + +/* Utility for array list handling. */ +static void suffix_object(cJSON *prev, cJSON *item) +{ + prev->next = item; + item->prev = prev; +} + +/* Utility for handling references. */ +static cJSON *create_reference(const cJSON *item, const internal_hooks * const hooks) +{ + cJSON *reference = NULL; + if (item == NULL) + { + return NULL; + } + + reference = cJSON_New_Item(hooks); + if (reference == NULL) + { + return NULL; + } + + memcpy(reference, item, sizeof(cJSON)); + reference->string = NULL; + reference->type |= cJSON_IsReference; + reference->next = reference->prev = NULL; + return reference; +} + +/* Add item to array/object. */ +CJSON_PUBLIC(void) cJSON_AddItemToArray(cJSON *array, cJSON *item) +{ + cJSON *child = NULL; + + if ((item == NULL) || (array == NULL)) + { + return; + } + + child = array->child; + + if (child == NULL) + { + /* list is empty, start new one */ + array->child = item; + } + else + { + /* append to the end */ + while (child->next) + { + child = child->next; + } + suffix_object(child, item); + } +} + +CJSON_PUBLIC(void) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item) +{ + if (item == NULL) + { + return; + } + + /* call cJSON_AddItemToObjectCS for code reuse */ + cJSON_AddItemToObjectCS(object, (char*)cJSON_strdup((const unsigned char*)string, &global_hooks), item); + /* remove cJSON_StringIsConst flag */ + item->type &= ~cJSON_StringIsConst; +} + +#if defined (__clang__) || ((__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))) + #pragma GCC diagnostic push +#endif +#ifdef __GNUC__ +#pragma GCC diagnostic ignored "-Wcast-qual" +#endif + +/* Add an item to an object with constant string as key */ +CJSON_PUBLIC(void) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item) +{ + if ((item == NULL) || (string == NULL)) + { + return; + } + if (!(item->type & cJSON_StringIsConst) && item->string) + { + global_hooks.deallocate(item->string); + } + item->string = (char*)string; + item->type |= cJSON_StringIsConst; + cJSON_AddItemToArray(object, item); +} +#if defined (__clang__) || ((__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5)))) + #pragma GCC diagnostic pop +#endif + +CJSON_PUBLIC(void) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item) +{ + if (array == NULL) + { + return; + } + + cJSON_AddItemToArray(array, create_reference(item, &global_hooks)); +} + +CJSON_PUBLIC(void) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item) +{ + if ((object == NULL) || (string == NULL)) + { + return; + } + + cJSON_AddItemToObject(object, string, create_reference(item, &global_hooks)); +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item) +{ + if ((parent == NULL) || (item == NULL)) + { + return NULL; + } + + if (item->prev != NULL) + { + /* not the first element */ + item->prev->next = item->next; + } + if (item->next != NULL) + { + /* not the last element */ + item->next->prev = item->prev; + } + + if (item == parent->child) + { + /* first element */ + parent->child = item->next; + } + /* make sure the detached item doesn't point anywhere anymore */ + item->prev = NULL; + item->next = NULL; + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which) +{ + if (which < 0) + { + return NULL; + } + + return cJSON_DetachItemViaPointer(array, get_array_item(array, (size_t)which)); +} + +CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which) +{ + cJSON_Delete(cJSON_DetachItemFromArray(array, which)); +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string) +{ + cJSON *to_detach = cJSON_GetObjectItem(object, string); + + return cJSON_DetachItemViaPointer(object, to_detach); +} + +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string) +{ + cJSON *to_detach = cJSON_GetObjectItemCaseSensitive(object, string); + + return cJSON_DetachItemViaPointer(object, to_detach); +} + +CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string) +{ + cJSON_Delete(cJSON_DetachItemFromObject(object, string)); +} + +CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string) +{ + cJSON_Delete(cJSON_DetachItemFromObjectCaseSensitive(object, string)); +} + +/* Replace array/object items with new ones. */ +CJSON_PUBLIC(void) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem) +{ + cJSON *after_inserted = NULL; + + if (which < 0) + { + return; + } + + after_inserted = get_array_item(array, (size_t)which); + if (after_inserted == NULL) + { + cJSON_AddItemToArray(array, newitem); + return; + } + + newitem->next = after_inserted; + newitem->prev = after_inserted->prev; + after_inserted->prev = newitem; + if (after_inserted == array->child) + { + array->child = newitem; + } + else + { + newitem->prev->next = newitem; + } +} + +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement) +{ + if ((parent == NULL) || (replacement == NULL) || (item == NULL)) + { + return false; + } + + if (replacement == item) + { + return true; + } + + replacement->next = item->next; + replacement->prev = item->prev; + + if (replacement->next != NULL) + { + replacement->next->prev = replacement; + } + if (replacement->prev != NULL) + { + replacement->prev->next = replacement; + } + if (parent->child == item) + { + parent->child = replacement; + } + + item->next = NULL; + item->prev = NULL; + cJSON_Delete(item); + + return true; +} + +CJSON_PUBLIC(void) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem) +{ + if (which < 0) + { + return; + } + + cJSON_ReplaceItemViaPointer(array, get_array_item(array, (size_t)which), newitem); +} + +static cJSON_bool replace_item_in_object(cJSON *object, const char *string, cJSON *replacement, cJSON_bool case_sensitive) +{ + if ((replacement == NULL) || (string == NULL)) + { + return false; + } + + /* replace the name in the replacement */ + if (!(replacement->type & cJSON_StringIsConst) && (replacement->string != NULL)) + { + cJSON_free(replacement->string); + } + replacement->string = (char*)cJSON_strdup((const unsigned char*)string, &global_hooks); + replacement->type &= ~cJSON_StringIsConst; + + cJSON_ReplaceItemViaPointer(object, get_object_item(object, string, case_sensitive), replacement); + + return true; +} + +CJSON_PUBLIC(void) cJSON_ReplaceItemInObject(cJSON *object, const char *string, cJSON *newitem) +{ + replace_item_in_object(object, string, newitem, false); +} + +CJSON_PUBLIC(void) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object, const char *string, cJSON *newitem) +{ + replace_item_in_object(object, string, newitem, true); +} + +/* Create basic types: */ +CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_NULL; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_True; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_False; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool b) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = b ? cJSON_True : cJSON_False; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_Number; + item->valuedouble = num; + + /* use saturation in case of overflow */ + if (num >= INT_MAX) + { + item->valueint = INT_MAX; + } + else if (num <= INT_MIN) + { + item->valueint = INT_MIN; + } + else + { + item->valueint = (int)num; + } + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_String; + item->valuestring = (char*)cJSON_strdup((const unsigned char*)string, &global_hooks); + if(!item->valuestring) + { + cJSON_Delete(item); + return NULL; + } + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type = cJSON_Raw; + item->valuestring = (char*)cJSON_strdup((const unsigned char*)raw, &global_hooks); + if(!item->valuestring) + { + cJSON_Delete(item); + return NULL; + } + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if(item) + { + item->type=cJSON_Array; + } + + return item; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void) +{ + cJSON *item = cJSON_New_Item(&global_hooks); + if (item) + { + item->type = cJSON_Object; + } + + return item; +} + +/* Create Arrays: */ +CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count) +{ + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (numbers == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + for(i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateNumber(numbers[i]); + if (!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; + } + + return a; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count) +{ + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (numbers == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for(i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateNumber((double)numbers[i]); + if(!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; + } + + return a; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count) +{ + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (numbers == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for(i = 0;a && (i < (size_t)count); i++) + { + n = cJSON_CreateNumber(numbers[i]); + if(!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p, n); + } + p = n; + } + + return a; +} + +CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char **strings, int count) +{ + size_t i = 0; + cJSON *n = NULL; + cJSON *p = NULL; + cJSON *a = NULL; + + if ((count < 0) || (strings == NULL)) + { + return NULL; + } + + a = cJSON_CreateArray(); + + for (i = 0; a && (i < (size_t)count); i++) + { + n = cJSON_CreateString(strings[i]); + if(!n) + { + cJSON_Delete(a); + return NULL; + } + if(!i) + { + a->child = n; + } + else + { + suffix_object(p,n); + } + p = n; + } + + return a; +} + +/* Duplication */ +CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse) +{ + cJSON *newitem = NULL; + cJSON *child = NULL; + cJSON *next = NULL; + cJSON *newchild = NULL; + + /* Bail on bad ptr */ + if (!item) + { + goto fail; + } + /* Create new item */ + newitem = cJSON_New_Item(&global_hooks); + if (!newitem) + { + goto fail; + } + /* Copy over all vars */ + newitem->type = item->type & (~cJSON_IsReference); + newitem->valueint = item->valueint; + newitem->valuedouble = item->valuedouble; + if (item->valuestring) + { + newitem->valuestring = (char*)cJSON_strdup((unsigned char*)item->valuestring, &global_hooks); + if (!newitem->valuestring) + { + goto fail; + } + } + if (item->string) + { + newitem->string = (item->type&cJSON_StringIsConst) ? item->string : (char*)cJSON_strdup((unsigned char*)item->string, &global_hooks); + if (!newitem->string) + { + goto fail; + } + } + /* If non-recursive, then we're done! */ + if (!recurse) + { + return newitem; + } + /* Walk the ->next chain for the child. */ + child = item->child; + while (child != NULL) + { + newchild = cJSON_Duplicate(child, true); /* Duplicate (with recurse) each item in the ->next chain */ + if (!newchild) + { + goto fail; + } + if (next != NULL) + { + /* If newitem->child already set, then crosswire ->prev and ->next and move on */ + next->next = newchild; + newchild->prev = next; + next = newchild; + } + else + { + /* Set newitem->child and move to it */ + newitem->child = newchild; + next = newchild; + } + child = child->next; + } + + return newitem; + +fail: + if (newitem != NULL) + { + cJSON_Delete(newitem); + } + + return NULL; +} + +CJSON_PUBLIC(void) cJSON_Minify(char *json) +{ + unsigned char *into = (unsigned char*)json; + + if (json == NULL) + { + return; + } + + while (*json) + { + if (*json == ' ') + { + json++; + } + else if (*json == '\t') + { + /* Whitespace characters. */ + json++; + } + else if (*json == '\r') + { + json++; + } + else if (*json=='\n') + { + json++; + } + else if ((*json == '/') && (json[1] == '/')) + { + /* double-slash comments, to end of line. */ + while (*json && (*json != '\n')) + { + json++; + } + } + else if ((*json == '/') && (json[1] == '*')) + { + /* multiline comments. */ + while (*json && !((*json == '*') && (json[1] == '/'))) + { + json++; + } + json += 2; + } + else if (*json == '\"') + { + /* string literals, which are \" sensitive. */ + *into++ = (unsigned char)*json++; + while (*json && (*json != '\"')) + { + if (*json == '\\') + { + *into++ = (unsigned char)*json++; + } + *into++ = (unsigned char)*json++; + } + *into++ = (unsigned char)*json++; + } + else + { + /* All other characters. */ + *into++ = (unsigned char)*json++; + } + } + + /* and null-terminate. */ + *into = '\0'; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Invalid; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_False; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xff) == cJSON_True; +} + + +CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & (cJSON_True | cJSON_False)) != 0; +} +CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_NULL; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Number; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_String; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Array; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Object; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item) +{ + if (item == NULL) + { + return false; + } + + return (item->type & 0xFF) == cJSON_Raw; +} + +CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive) +{ + if ((a == NULL) || (b == NULL) || ((a->type & 0xFF) != (b->type & 0xFF)) || cJSON_IsInvalid(a)) + { + return false; + } + + /* check if type is valid */ + switch (a->type & 0xFF) + { + case cJSON_False: + case cJSON_True: + case cJSON_NULL: + case cJSON_Number: + case cJSON_String: + case cJSON_Raw: + case cJSON_Array: + case cJSON_Object: + break; + + default: + return false; + } + + /* identical objects are equal */ + if (a == b) + { + return true; + } + + switch (a->type & 0xFF) + { + /* in these cases and equal type is enough */ + case cJSON_False: + case cJSON_True: + case cJSON_NULL: + return true; + + case cJSON_Number: + if (a->valuedouble == b->valuedouble) + { + return true; + } + return false; + + case cJSON_String: + case cJSON_Raw: + if ((a->valuestring == NULL) || (b->valuestring == NULL)) + { + return false; + } + if (strcmp(a->valuestring, b->valuestring) == 0) + { + return true; + } + + return false; + + case cJSON_Array: + { + cJSON *a_element = a->child; + cJSON *b_element = b->child; + + for (; (a_element != NULL) && (b_element != NULL);) + { + if (!cJSON_Compare(a_element, b_element, case_sensitive)) + { + return false; + } + + a_element = a_element->next; + b_element = b_element->next; + } + + /* one of the arrays is longer than the other */ + if (a_element != b_element) { + return false; + } + + return true; + } + + case cJSON_Object: + { + cJSON *a_element = NULL; + cJSON *b_element = NULL; + cJSON_ArrayForEach(a_element, a) + { + /* TODO This has O(n^2) runtime, which is horrible! */ + b_element = get_object_item(b, a_element->string, case_sensitive); + if (b_element == NULL) + { + return false; + } + + if (!cJSON_Compare(a_element, b_element, case_sensitive)) + { + return false; + } + } + + /* doing this twice, once on a and b to prevent true comparison if a subset of b + * TODO: Do this the proper way, this is just a fix for now */ + cJSON_ArrayForEach(b_element, b) + { + a_element = get_object_item(a, b_element->string, case_sensitive); + if (a_element == NULL) + { + return false; + } + + if (!cJSON_Compare(b_element, a_element, case_sensitive)) + { + return false; + } + } + + return true; + } + + default: + return false; + } +} + +CJSON_PUBLIC(void *) cJSON_malloc(size_t size) +{ + return global_hooks.allocate(size); +} + +CJSON_PUBLIC(void) cJSON_free(void *object) +{ + global_hooks.deallocate(object); +} diff --git a/src/cryptoconditions/src/include/cJSON.h b/src/cryptoconditions/src/include/cJSON.h new file mode 100644 index 00000000000..1e388137e73 --- /dev/null +++ b/src/cryptoconditions/src/include/cJSON.h @@ -0,0 +1,263 @@ +/* + Copyright (c) 2009-2017 Dave Gamble and cJSON contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#ifndef cJSON__h +#define cJSON__h + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* project version */ +#define CJSON_VERSION_MAJOR 1 +#define CJSON_VERSION_MINOR 5 +#define CJSON_VERSION_PATCH 9 + +#include + +/* cJSON Types: */ +#define cJSON_Invalid (0) +#define cJSON_False (1 << 0) +#define cJSON_True (1 << 1) +#define cJSON_NULL (1 << 2) +#define cJSON_Number (1 << 3) +#define cJSON_String (1 << 4) +#define cJSON_Array (1 << 5) +#define cJSON_Object (1 << 6) +#define cJSON_Raw (1 << 7) /* raw json */ + +#define cJSON_IsReference 256 +#define cJSON_StringIsConst 512 + +/* The cJSON structure: */ +typedef struct cJSON +{ + /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */ + struct cJSON *next; + struct cJSON *prev; + /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */ + struct cJSON *child; + + /* The type of the item, as above. */ + int type; + + /* The item's string, if type==cJSON_String and type == cJSON_Raw */ + char *valuestring; + /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */ + int valueint; + /* The item's number, if type==cJSON_Number */ + double valuedouble; + + /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */ + char *string; +} cJSON; + +typedef struct cJSON_Hooks +{ + void *(*malloc_fn)(size_t sz); + void (*free_fn)(void *ptr); +} cJSON_Hooks; + +typedef int cJSON_bool; + +#if !defined(__WINDOWS__) && (defined(WIN32) || defined(WIN64) || defined(_MSC_VER) || defined(_WIN32)) +#define __WINDOWS__ +#endif +#ifdef __WINDOWS__ + +/* When compiling for windows, we specify a specific calling convention to avoid issues where we are being called from a project with a different default calling convention. For windows you have 2 define options: + +CJSON_HIDE_SYMBOLS - Define this in the case where you don't want to ever dllexport symbols +CJSON_EXPORT_SYMBOLS - Define this on library build when you want to dllexport symbols (default) +CJSON_IMPORT_SYMBOLS - Define this if you want to dllimport symbol + +For *nix builds that support visibility attribute, you can define similar behavior by + +setting default visibility to hidden by adding +-fvisibility=hidden (for gcc) +or +-xldscope=hidden (for sun cc) +to CFLAGS + +then using the CJSON_API_VISIBILITY flag to "export" the same symbols the way CJSON_EXPORT_SYMBOLS does + +*/ + +/* export symbols by default, this is necessary for copy pasting the C and header file */ +#if !defined(CJSON_HIDE_SYMBOLS) && !defined(CJSON_IMPORT_SYMBOLS) && !defined(CJSON_EXPORT_SYMBOLS) +#define CJSON_EXPORT_SYMBOLS +#endif + +#if defined(CJSON_HIDE_SYMBOLS) +#define CJSON_PUBLIC(type) type __stdcall +#elif defined(CJSON_EXPORT_SYMBOLS) +#define CJSON_PUBLIC(type) __declspec(dllexport) type __stdcall +#elif defined(CJSON_IMPORT_SYMBOLS) +#define CJSON_PUBLIC(type) __declspec(dllimport) type __stdcall +#endif +#else /* !WIN32 */ +#if (defined(__GNUC__) || defined(__SUNPRO_CC) || defined (__SUNPRO_C)) && defined(CJSON_API_VISIBILITY) +#define CJSON_PUBLIC(type) __attribute__((visibility("default"))) type +#else +#define CJSON_PUBLIC(type) type +#endif +#endif + +/* Limits how deeply nested arrays/objects can be before cJSON rejects to parse them. + * This is to prevent stack overflows. */ +#ifndef CJSON_NESTING_LIMIT +#define CJSON_NESTING_LIMIT 1000 +#endif + +/* returns the version of cJSON as a string */ +CJSON_PUBLIC(const char*) cJSON_Version(void); + +/* Supply malloc, realloc and free functions to cJSON */ +CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks); + +/* Memory Management: the caller is always responsible to free the results from all variants of cJSON_Parse (with cJSON_Delete) and cJSON_Print (with stdlib free, cJSON_Hooks.free_fn, or cJSON_free as appropriate). The exception is cJSON_PrintPreallocated, where the caller has full responsibility of the buffer. */ +/* Supply a block of JSON, and this returns a cJSON object you can interrogate. */ +CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value); +/* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */ +/* If you supply a ptr in return_parse_end and parsing fails, then return_parse_end will contain a pointer to the error so will match cJSON_GetErrorPtr(). */ +CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated); + +/* Render a cJSON entity to text for transfer/storage. */ +CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item); +/* Render a cJSON entity to text for transfer/storage without any formatting. */ +CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item); +/* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess at the final size. guessing well reduces reallocation. fmt=0 gives unformatted, =1 gives formatted */ +CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt); +/* Render a cJSON entity to text using a buffer already allocated in memory with given length. Returns 1 on success and 0 on failure. */ +/* NOTE: cJSON is not always 100% accurate in estimating how much memory it will use, so to be safe allocate 5 bytes more than you actually need */ +CJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format); +/* Delete a cJSON entity and all subentities. */ +CJSON_PUBLIC(void) cJSON_Delete(cJSON *c); + +/* Returns the number of items in an array (or object). */ +CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array); +/* Retrieve item number "item" from array "array". Returns NULL if unsuccessful. */ +CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index); +/* Get item "string" from object. Case insensitive. */ +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string); +CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string); +CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string); +/* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */ +CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void); + +/* These functions check the type of an item */ +CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item); +CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item); + +/* These calls create a cJSON item of the appropriate type. */ +CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool boolean); +CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num); +CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string); +/* raw json */ +CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw); +CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void); +CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void); + +/* These utilities create an Array of count items. */ +CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count); +CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count); +CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count); +CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char **strings, int count); + +/* Append item to the specified array/object. */ +CJSON_PUBLIC(void) cJSON_AddItemToArray(cJSON *array, cJSON *item); +CJSON_PUBLIC(void) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item); +/* Use this when string is definitely const (i.e. a literal, or as good as), and will definitely survive the cJSON object. + * WARNING: When this function was used, make sure to always check that (item->type & cJSON_StringIsConst) is zero before + * writing to `item->string` */ +CJSON_PUBLIC(void) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item); +/* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */ +CJSON_PUBLIC(void) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item); +CJSON_PUBLIC(void) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item); + +/* Remove/Detatch items from Arrays/Objects. */ +CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item); +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which); +CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which); +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string); +CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string); +CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string); +CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string); + +/* Update array items. */ +CJSON_PUBLIC(void) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem); /* Shifts pre-existing items to the right. */ +CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement); +CJSON_PUBLIC(void) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem); +CJSON_PUBLIC(void) cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem); +CJSON_PUBLIC(void) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object,const char *string,cJSON *newitem); + +/* Duplicate a cJSON item */ +CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse); +/* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will +need to be released. With recurse!=0, it will duplicate any children connected to the item. +The item->next and ->prev pointers are always zero on return from Duplicate. */ +/* Recursively compare two cJSON items for equality. If either a or b is NULL or invalid, they will be considered unequal. + * case_sensitive determines if object keys are treated case sensitive (1) or case insensitive (0) */ +CJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive); + + +CJSON_PUBLIC(void) cJSON_Minify(char *json); + +/* Macros for creating things quickly. */ +#define cJSON_AddNullToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateNull()) +#define cJSON_AddTrueToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateTrue()) +#define cJSON_AddFalseToObject(object,name) cJSON_AddItemToObject(object, name, cJSON_CreateFalse()) +#define cJSON_AddBoolToObject(object,name,b) cJSON_AddItemToObject(object, name, cJSON_CreateBool(b)) +#define cJSON_AddNumberToObject(object,name,n) cJSON_AddItemToObject(object, name, cJSON_CreateNumber(n)) +#define cJSON_AddStringToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateString(s)) +#define cJSON_AddRawToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateRaw(s)) + +/* When assigning an integer value, it needs to be propagated to valuedouble too. */ +#define cJSON_SetIntValue(object, number) ((object) ? (object)->valueint = (object)->valuedouble = (number) : (number)) +/* helper for the cJSON_SetNumberValue macro */ +CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number); +#define cJSON_SetNumberValue(object, number) ((object != NULL) ? cJSON_SetNumberHelper(object, (double)number) : (number)) + +/* Macro for iterating over an array or object */ +#define cJSON_ArrayForEach(element, array) for(element = (array != NULL) ? (array)->child : NULL; element != NULL; element = element->next) + +/* malloc/free objects using the malloc/free functions that have been set with cJSON_InitHooks */ +CJSON_PUBLIC(void *) cJSON_malloc(size_t size); +CJSON_PUBLIC(void) cJSON_free(void *object); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/cryptoconditions/src/include/ed25519/license.txt b/src/cryptoconditions/src/include/ed25519/license.txt new file mode 100644 index 00000000000..c1503f91211 --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/license.txt @@ -0,0 +1,16 @@ +Copyright (c) 2015 Orson Peters + +This software is provided 'as-is', without any express or implied warranty. In no event will the +authors be held liable for any damages arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, including commercial +applications, and to alter it and redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the + original software. If you use this software in a product, an acknowledgment in the product + documentation would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and must not be misrepresented as + being the original software. + +3. This notice may not be removed or altered from any source distribution. diff --git a/src/cryptoconditions/src/include/ed25519/readme.md b/src/cryptoconditions/src/include/ed25519/readme.md new file mode 100644 index 00000000000..89329bbe406 --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/readme.md @@ -0,0 +1,166 @@ +Ed25519 +======= + +This is a portable implementation of [Ed25519](http://ed25519.cr.yp.to/) based +on the SUPERCOP "ref10" implementation. Additionally there is key exchanging +and scalar addition included to further aid building a PKI using Ed25519. All +code is licensed under the permissive zlib license. + +All code is pure ANSI C without any dependencies, except for the random seed +generation which uses standard OS cryptography APIs (`CryptGenRandom` on +Windows, `/dev/urandom` on nix). If you wish to be entirely portable define +`ED25519_NO_SEED`. This disables the `ed25519_create_seed` function, so if your +application requires key generation you must supply your own seeding function +(which is simply a 256 bit (32 byte) cryptographic random number generator). + + +Performance +----------- + +On a Windows machine with an Intel Pentium B970 @ 2.3GHz I got the following +speeds (running on only one a single core): + + Seed generation: 64us (15625 per second) + Key generation: 88us (11364 per second) + Message signing (short message): 87us (11494 per second) + Message verifying (short message): 228us (4386 per second) + Scalar addition: 100us (10000 per second) + Key exchange: 220us (4545 per second) + +The speeds on other machines may vary. Sign/verify times will be higher with +longer messages. The implementation significantly benefits from 64 bit +architectures, if possible compile as 64 bit. + + +Usage +----- + +Simply add all .c and .h files in the `src/` folder to your project and include +`ed25519.h` in any file you want to use the API. If you prefer to use a shared +library, only copy `ed25519.h` and define `ED25519_DLL` before importing. A +windows DLL is pre-built. + +There are no defined types for seeds, private keys, public keys, shared secrets +or signatures. Instead simple `unsigned char` buffers are used with the +following sizes: + +```c +unsigned char seed[32]; +unsigned char signature[64]; +unsigned char public_key[32]; +unsigned char private_key[64]; +unsigned char scalar[32]; +unsigned char shared_secret[32]; +``` + +API +--- + +```c +int ed25519_create_seed(unsigned char *seed); +``` + +Creates a 32 byte random seed in `seed` for key generation. `seed` must be a +writable 32 byte buffer. Returns 0 on success, and nonzero on failure. + +```c +void ed25519_create_keypair(unsigned char *public_key, unsigned char *private_key, + const unsigned char *seed); +``` + +Creates a new key pair from the given seed. `public_key` must be a writable 32 +byte buffer, `private_key` must be a writable 64 byte buffer and `seed` must be +a 32 byte buffer. + +```c +void ed25519_sign(unsigned char *signature, + const unsigned char *message, size_t message_len, + const unsigned char *public_key, const unsigned char *private_key); +``` + +Creates a signature of the given message with the given key pair. `signature` +must be a writable 64 byte buffer. `message` must have at least `message_len` +bytes to be read. + +```c +int ed25519_verify(const unsigned char *signature, + const unsigned char *message, size_t message_len, + const unsigned char *public_key); +``` + +Verifies the signature on the given message using `public_key`. `signature` +must be a readable 64 byte buffer. `message` must have at least `message_len` +bytes to be read. Returns 1 if the signature matches, 0 otherwise. + +```c +void ed25519_add_scalar(unsigned char *public_key, unsigned char *private_key, + const unsigned char *scalar); +``` + +Adds `scalar` to the given key pair where scalar is a 32 byte buffer (possibly +generated with `ed25519_create_seed`), generating a new key pair. You can +calculate the public key sum without knowing the private key and vice versa by +passing in `NULL` for the key you don't know. This is useful for enforcing +randomness on a key pair by a third party while only knowing the public key, +among other things. Warning: the last bit of the scalar is ignored - if +comparing scalars make sure to clear it with `scalar[31] &= 127`. + + +```c +void ed25519_key_exchange(unsigned char *shared_secret, + const unsigned char *public_key, const unsigned char *private_key); +``` + +Performs a key exchange on the given public key and private key, producing a +shared secret. It is recommended to hash the shared secret before using it. +`shared_secret` must be a 32 byte writable buffer where the shared secret will +be stored. + +Example +------- + +```c +unsigned char seed[32], public_key[32], private_key[64], signature[64]; +unsigned char other_public_key[32], other_private_key[64], shared_secret[32]; +const unsigned char message[] = "TEST MESSAGE"; + +/* create a random seed, and a key pair out of that seed */ +if (ed25519_create_seed(seed)) { + printf("error while generating seed\n"); + exit(1); +} + +ed25519_create_keypair(public_key, private_key, seed); + +/* create signature on the message with the key pair */ +ed25519_sign(signature, message, strlen(message), public_key, private_key); + +/* verify the signature */ +if (ed25519_verify(signature, message, strlen(message), public_key)) { + printf("valid signature\n"); +} else { + printf("invalid signature\n"); +} + +/* create a dummy keypair to use for a key exchange, normally you'd only have +the public key and receive it through some communication channel */ +if (ed25519_create_seed(seed)) { + printf("error while generating seed\n"); + exit(1); +} + +ed25519_create_keypair(other_public_key, other_private_key, seed); + +/* do a key exchange with other_public_key */ +ed25519_key_exchange(shared_secret, other_public_key, private_key); + +/* + the magic here is that ed25519_key_exchange(shared_secret, public_key, + other_private_key); would result in the same shared_secret +*/ + +``` + +License +------- +All code is released under the zlib license. See license.txt for details. diff --git a/src/cryptoconditions/src/include/ed25519/src/add_scalar.c b/src/cryptoconditions/src/include/ed25519/src/add_scalar.c new file mode 100644 index 00000000000..7528a7a4a21 --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/add_scalar.c @@ -0,0 +1,69 @@ +#include "ed25519.h" +#include "ge.h" +#include "sc.h" +#include "sha512.h" + + +/* see http://crypto.stackexchange.com/a/6215/4697 */ +void ed25519_add_scalar(unsigned char *public_key, unsigned char *private_key, const unsigned char *scalar) { + const unsigned char SC_1[32] = {1}; /* scalar with value 1 */ + + unsigned char n[32]; + ge_p3 nB; + ge_p1p1 A_p1p1; + ge_p3 A; + ge_p3 public_key_unpacked; + ge_cached T; + + sha512_context hash; + unsigned char hashbuf[64]; + + int i; + + /* copy the scalar and clear highest bit */ + for (i = 0; i < 31; ++i) { + n[i] = scalar[i]; + } + n[31] = scalar[31] & 127; + + /* private key: a = n + t */ + if (private_key) { + sc_muladd(private_key, SC_1, n, private_key); + + // https://github.com/orlp/ed25519/issues/3 + sha512_init(&hash); + sha512_update(&hash, private_key + 32, 32); + sha512_update(&hash, scalar, 32); + sha512_final(&hash, hashbuf); + for (i = 0; i < 32; ++i) { + private_key[32 + i] = hashbuf[i]; + } + } + + /* public key: A = nB + T */ + if (public_key) { + /* if we know the private key we don't need a point addition, which is faster */ + /* using a "timing attack" you could find out wether or not we know the private + key, but this information seems rather useless - if this is important pass + public_key and private_key seperately in 2 function calls */ + if (private_key) { + ge_scalarmult_base(&A, private_key); + } else { + /* unpack public key into T */ + ge_frombytes_negate_vartime(&public_key_unpacked, public_key); + fe_neg(public_key_unpacked.X, public_key_unpacked.X); /* undo negate */ + fe_neg(public_key_unpacked.T, public_key_unpacked.T); /* undo negate */ + ge_p3_to_cached(&T, &public_key_unpacked); + + /* calculate n*B */ + ge_scalarmult_base(&nB, n); + + /* A = n*B + T */ + ge_add(&A_p1p1, &nB, &T); + ge_p1p1_to_p3(&A, &A_p1p1); + } + + /* pack public key */ + ge_p3_tobytes(public_key, &A); + } +} diff --git a/src/cryptoconditions/src/include/ed25519/src/ed25519.h b/src/cryptoconditions/src/include/ed25519/src/ed25519.h new file mode 100644 index 00000000000..8924659fa39 --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/ed25519.h @@ -0,0 +1,38 @@ +#ifndef ED25519_H +#define ED25519_H + +#include + +#if defined(_WIN32) + #if defined(ED25519_BUILD_DLL) + #define ED25519_DECLSPEC __declspec(dllexport) + #elif defined(ED25519_DLL) + #define ED25519_DECLSPEC __declspec(dllimport) + #else + #define ED25519_DECLSPEC + #endif +#else + #define ED25519_DECLSPEC +#endif + + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef ED25519_NO_SEED +int ED25519_DECLSPEC ed25519_create_seed(unsigned char *seed); +#endif + +void ED25519_DECLSPEC ed25519_create_keypair(unsigned char *public_key, unsigned char *private_key, const unsigned char *seed); +void ED25519_DECLSPEC ed25519_sign(unsigned char *signature, const unsigned char *message, size_t message_len, const unsigned char *public_key, const unsigned char *private_key); +int ED25519_DECLSPEC ed25519_verify(const unsigned char *signature, const unsigned char *message, size_t message_len, const unsigned char *public_key); +void ED25519_DECLSPEC ed25519_add_scalar(unsigned char *public_key, unsigned char *private_key, const unsigned char *scalar); +void ED25519_DECLSPEC ed25519_key_exchange(unsigned char *shared_secret, const unsigned char *public_key, const unsigned char *private_key); + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/cryptoconditions/src/include/ed25519/src/fe.c b/src/cryptoconditions/src/include/ed25519/src/fe.c new file mode 100644 index 00000000000..2105eb7b2c5 --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/fe.c @@ -0,0 +1,1491 @@ +#include "fixedint.h" +#include "fe.h" + + +/* + helper functions +*/ +static uint64_t load_3(const unsigned char *in) { + uint64_t result; + + result = (uint64_t) in[0]; + result |= ((uint64_t) in[1]) << 8; + result |= ((uint64_t) in[2]) << 16; + + return result; +} + +static uint64_t load_4(const unsigned char *in) { + uint64_t result; + + result = (uint64_t) in[0]; + result |= ((uint64_t) in[1]) << 8; + result |= ((uint64_t) in[2]) << 16; + result |= ((uint64_t) in[3]) << 24; + + return result; +} + + + +/* + h = 0 +*/ + +void fe_0(fe h) { + h[0] = 0; + h[1] = 0; + h[2] = 0; + h[3] = 0; + h[4] = 0; + h[5] = 0; + h[6] = 0; + h[7] = 0; + h[8] = 0; + h[9] = 0; +} + + + +/* + h = 1 +*/ + +void fe_1(fe h) { + h[0] = 1; + h[1] = 0; + h[2] = 0; + h[3] = 0; + h[4] = 0; + h[5] = 0; + h[6] = 0; + h[7] = 0; + h[8] = 0; + h[9] = 0; +} + + + +/* + h = f + g + Can overlap h with f or g. + + Preconditions: + |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + + Postconditions: + |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +*/ + +void fe_add(fe h, const fe f, const fe g) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int32_t g0 = g[0]; + int32_t g1 = g[1]; + int32_t g2 = g[2]; + int32_t g3 = g[3]; + int32_t g4 = g[4]; + int32_t g5 = g[5]; + int32_t g6 = g[6]; + int32_t g7 = g[7]; + int32_t g8 = g[8]; + int32_t g9 = g[9]; + int32_t h0 = f0 + g0; + int32_t h1 = f1 + g1; + int32_t h2 = f2 + g2; + int32_t h3 = f3 + g3; + int32_t h4 = f4 + g4; + int32_t h5 = f5 + g5; + int32_t h6 = f6 + g6; + int32_t h7 = f7 + g7; + int32_t h8 = f8 + g8; + int32_t h9 = f9 + g9; + + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} + + + +/* + Replace (f,g) with (g,g) if b == 1; + replace (f,g) with (f,g) if b == 0. + + Preconditions: b in {0,1}. +*/ + +void fe_cmov(fe f, const fe g, unsigned int b) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int32_t g0 = g[0]; + int32_t g1 = g[1]; + int32_t g2 = g[2]; + int32_t g3 = g[3]; + int32_t g4 = g[4]; + int32_t g5 = g[5]; + int32_t g6 = g[6]; + int32_t g7 = g[7]; + int32_t g8 = g[8]; + int32_t g9 = g[9]; + int32_t x0 = f0 ^ g0; + int32_t x1 = f1 ^ g1; + int32_t x2 = f2 ^ g2; + int32_t x3 = f3 ^ g3; + int32_t x4 = f4 ^ g4; + int32_t x5 = f5 ^ g5; + int32_t x6 = f6 ^ g6; + int32_t x7 = f7 ^ g7; + int32_t x8 = f8 ^ g8; + int32_t x9 = f9 ^ g9; + + b = (unsigned int) (- (int) b); /* silence warning */ + x0 &= b; + x1 &= b; + x2 &= b; + x3 &= b; + x4 &= b; + x5 &= b; + x6 &= b; + x7 &= b; + x8 &= b; + x9 &= b; + + f[0] = f0 ^ x0; + f[1] = f1 ^ x1; + f[2] = f2 ^ x2; + f[3] = f3 ^ x3; + f[4] = f4 ^ x4; + f[5] = f5 ^ x5; + f[6] = f6 ^ x6; + f[7] = f7 ^ x7; + f[8] = f8 ^ x8; + f[9] = f9 ^ x9; +} + +/* + Replace (f,g) with (g,f) if b == 1; + replace (f,g) with (f,g) if b == 0. + + Preconditions: b in {0,1}. +*/ + +void fe_cswap(fe f,fe g,unsigned int b) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int32_t g0 = g[0]; + int32_t g1 = g[1]; + int32_t g2 = g[2]; + int32_t g3 = g[3]; + int32_t g4 = g[4]; + int32_t g5 = g[5]; + int32_t g6 = g[6]; + int32_t g7 = g[7]; + int32_t g8 = g[8]; + int32_t g9 = g[9]; + int32_t x0 = f0 ^ g0; + int32_t x1 = f1 ^ g1; + int32_t x2 = f2 ^ g2; + int32_t x3 = f3 ^ g3; + int32_t x4 = f4 ^ g4; + int32_t x5 = f5 ^ g5; + int32_t x6 = f6 ^ g6; + int32_t x7 = f7 ^ g7; + int32_t x8 = f8 ^ g8; + int32_t x9 = f9 ^ g9; + b = (unsigned int) (- (int) b); /* silence warning */ + x0 &= b; + x1 &= b; + x2 &= b; + x3 &= b; + x4 &= b; + x5 &= b; + x6 &= b; + x7 &= b; + x8 &= b; + x9 &= b; + f[0] = f0 ^ x0; + f[1] = f1 ^ x1; + f[2] = f2 ^ x2; + f[3] = f3 ^ x3; + f[4] = f4 ^ x4; + f[5] = f5 ^ x5; + f[6] = f6 ^ x6; + f[7] = f7 ^ x7; + f[8] = f8 ^ x8; + f[9] = f9 ^ x9; + g[0] = g0 ^ x0; + g[1] = g1 ^ x1; + g[2] = g2 ^ x2; + g[3] = g3 ^ x3; + g[4] = g4 ^ x4; + g[5] = g5 ^ x5; + g[6] = g6 ^ x6; + g[7] = g7 ^ x7; + g[8] = g8 ^ x8; + g[9] = g9 ^ x9; +} + + + +/* + h = f +*/ + +void fe_copy(fe h, const fe f) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + + h[0] = f0; + h[1] = f1; + h[2] = f2; + h[3] = f3; + h[4] = f4; + h[5] = f5; + h[6] = f6; + h[7] = f7; + h[8] = f8; + h[9] = f9; +} + + + +/* + Ignores top bit of h. +*/ + +void fe_frombytes(fe h, const unsigned char *s) { + int64_t h0 = load_4(s); + int64_t h1 = load_3(s + 4) << 6; + int64_t h2 = load_3(s + 7) << 5; + int64_t h3 = load_3(s + 10) << 3; + int64_t h4 = load_3(s + 13) << 2; + int64_t h5 = load_4(s + 16); + int64_t h6 = load_3(s + 20) << 7; + int64_t h7 = load_3(s + 23) << 5; + int64_t h8 = load_3(s + 26) << 4; + int64_t h9 = (load_3(s + 29) & 8388607) << 2; + int64_t carry0; + int64_t carry1; + int64_t carry2; + int64_t carry3; + int64_t carry4; + int64_t carry5; + int64_t carry6; + int64_t carry7; + int64_t carry8; + int64_t carry9; + + carry9 = (h9 + (int64_t) (1 << 24)) >> 25; + h0 += carry9 * 19; + h9 -= carry9 << 25; + carry1 = (h1 + (int64_t) (1 << 24)) >> 25; + h2 += carry1; + h1 -= carry1 << 25; + carry3 = (h3 + (int64_t) (1 << 24)) >> 25; + h4 += carry3; + h3 -= carry3 << 25; + carry5 = (h5 + (int64_t) (1 << 24)) >> 25; + h6 += carry5; + h5 -= carry5 << 25; + carry7 = (h7 + (int64_t) (1 << 24)) >> 25; + h8 += carry7; + h7 -= carry7 << 25; + carry0 = (h0 + (int64_t) (1 << 25)) >> 26; + h1 += carry0; + h0 -= carry0 << 26; + carry2 = (h2 + (int64_t) (1 << 25)) >> 26; + h3 += carry2; + h2 -= carry2 << 26; + carry4 = (h4 + (int64_t) (1 << 25)) >> 26; + h5 += carry4; + h4 -= carry4 << 26; + carry6 = (h6 + (int64_t) (1 << 25)) >> 26; + h7 += carry6; + h6 -= carry6 << 26; + carry8 = (h8 + (int64_t) (1 << 25)) >> 26; + h9 += carry8; + h8 -= carry8 << 26; + + h[0] = (int32_t) h0; + h[1] = (int32_t) h1; + h[2] = (int32_t) h2; + h[3] = (int32_t) h3; + h[4] = (int32_t) h4; + h[5] = (int32_t) h5; + h[6] = (int32_t) h6; + h[7] = (int32_t) h7; + h[8] = (int32_t) h8; + h[9] = (int32_t) h9; +} + + + +void fe_invert(fe out, const fe z) { + fe t0; + fe t1; + fe t2; + fe t3; + int i; + + fe_sq(t0, z); + + for (i = 1; i < 1; ++i) { + fe_sq(t0, t0); + } + + fe_sq(t1, t0); + + for (i = 1; i < 2; ++i) { + fe_sq(t1, t1); + } + + fe_mul(t1, z, t1); + fe_mul(t0, t0, t1); + fe_sq(t2, t0); + + for (i = 1; i < 1; ++i) { + fe_sq(t2, t2); + } + + fe_mul(t1, t1, t2); + fe_sq(t2, t1); + + for (i = 1; i < 5; ++i) { + fe_sq(t2, t2); + } + + fe_mul(t1, t2, t1); + fe_sq(t2, t1); + + for (i = 1; i < 10; ++i) { + fe_sq(t2, t2); + } + + fe_mul(t2, t2, t1); + fe_sq(t3, t2); + + for (i = 1; i < 20; ++i) { + fe_sq(t3, t3); + } + + fe_mul(t2, t3, t2); + fe_sq(t2, t2); + + for (i = 1; i < 10; ++i) { + fe_sq(t2, t2); + } + + fe_mul(t1, t2, t1); + fe_sq(t2, t1); + + for (i = 1; i < 50; ++i) { + fe_sq(t2, t2); + } + + fe_mul(t2, t2, t1); + fe_sq(t3, t2); + + for (i = 1; i < 100; ++i) { + fe_sq(t3, t3); + } + + fe_mul(t2, t3, t2); + fe_sq(t2, t2); + + for (i = 1; i < 50; ++i) { + fe_sq(t2, t2); + } + + fe_mul(t1, t2, t1); + fe_sq(t1, t1); + + for (i = 1; i < 5; ++i) { + fe_sq(t1, t1); + } + + fe_mul(out, t1, t0); +} + + + +/* + return 1 if f is in {1,3,5,...,q-2} + return 0 if f is in {0,2,4,...,q-1} + + Preconditions: + |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +*/ + +int fe_isnegative(const fe f) { + unsigned char s[32]; + + fe_tobytes(s, f); + + return s[0] & 1; +} + + + +/* + return 1 if f == 0 + return 0 if f != 0 + + Preconditions: + |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +*/ + +int fe_isnonzero(const fe f) { + unsigned char s[32]; + unsigned char r; + + fe_tobytes(s, f); + + r = s[0]; + #define F(i) r |= s[i] + F(1); + F(2); + F(3); + F(4); + F(5); + F(6); + F(7); + F(8); + F(9); + F(10); + F(11); + F(12); + F(13); + F(14); + F(15); + F(16); + F(17); + F(18); + F(19); + F(20); + F(21); + F(22); + F(23); + F(24); + F(25); + F(26); + F(27); + F(28); + F(29); + F(30); + F(31); + #undef F + + return r != 0; +} + + + +/* + h = f * g + Can overlap h with f or g. + + Preconditions: + |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. + |g| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. + + Postconditions: + |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. + */ + + /* + Notes on implementation strategy: + + Using schoolbook multiplication. + Karatsuba would save a little in some cost models. + + Most multiplications by 2 and 19 are 32-bit precomputations; + cheaper than 64-bit postcomputations. + + There is one remaining multiplication by 19 in the carry chain; + one *19 precomputation can be merged into this, + but the resulting data flow is considerably less clean. + + There are 12 carries below. + 10 of them are 2-way parallelizable and vectorizable. + Can get away with 11 carries, but then data flow is much deeper. + + With tighter constraints on inputs can squeeze carries into int32. +*/ + +void fe_mul(fe h, const fe f, const fe g) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int32_t g0 = g[0]; + int32_t g1 = g[1]; + int32_t g2 = g[2]; + int32_t g3 = g[3]; + int32_t g4 = g[4]; + int32_t g5 = g[5]; + int32_t g6 = g[6]; + int32_t g7 = g[7]; + int32_t g8 = g[8]; + int32_t g9 = g[9]; + int32_t g1_19 = 19 * g1; /* 1.959375*2^29 */ + int32_t g2_19 = 19 * g2; /* 1.959375*2^30; still ok */ + int32_t g3_19 = 19 * g3; + int32_t g4_19 = 19 * g4; + int32_t g5_19 = 19 * g5; + int32_t g6_19 = 19 * g6; + int32_t g7_19 = 19 * g7; + int32_t g8_19 = 19 * g8; + int32_t g9_19 = 19 * g9; + int32_t f1_2 = 2 * f1; + int32_t f3_2 = 2 * f3; + int32_t f5_2 = 2 * f5; + int32_t f7_2 = 2 * f7; + int32_t f9_2 = 2 * f9; + int64_t f0g0 = f0 * (int64_t) g0; + int64_t f0g1 = f0 * (int64_t) g1; + int64_t f0g2 = f0 * (int64_t) g2; + int64_t f0g3 = f0 * (int64_t) g3; + int64_t f0g4 = f0 * (int64_t) g4; + int64_t f0g5 = f0 * (int64_t) g5; + int64_t f0g6 = f0 * (int64_t) g6; + int64_t f0g7 = f0 * (int64_t) g7; + int64_t f0g8 = f0 * (int64_t) g8; + int64_t f0g9 = f0 * (int64_t) g9; + int64_t f1g0 = f1 * (int64_t) g0; + int64_t f1g1_2 = f1_2 * (int64_t) g1; + int64_t f1g2 = f1 * (int64_t) g2; + int64_t f1g3_2 = f1_2 * (int64_t) g3; + int64_t f1g4 = f1 * (int64_t) g4; + int64_t f1g5_2 = f1_2 * (int64_t) g5; + int64_t f1g6 = f1 * (int64_t) g6; + int64_t f1g7_2 = f1_2 * (int64_t) g7; + int64_t f1g8 = f1 * (int64_t) g8; + int64_t f1g9_38 = f1_2 * (int64_t) g9_19; + int64_t f2g0 = f2 * (int64_t) g0; + int64_t f2g1 = f2 * (int64_t) g1; + int64_t f2g2 = f2 * (int64_t) g2; + int64_t f2g3 = f2 * (int64_t) g3; + int64_t f2g4 = f2 * (int64_t) g4; + int64_t f2g5 = f2 * (int64_t) g5; + int64_t f2g6 = f2 * (int64_t) g6; + int64_t f2g7 = f2 * (int64_t) g7; + int64_t f2g8_19 = f2 * (int64_t) g8_19; + int64_t f2g9_19 = f2 * (int64_t) g9_19; + int64_t f3g0 = f3 * (int64_t) g0; + int64_t f3g1_2 = f3_2 * (int64_t) g1; + int64_t f3g2 = f3 * (int64_t) g2; + int64_t f3g3_2 = f3_2 * (int64_t) g3; + int64_t f3g4 = f3 * (int64_t) g4; + int64_t f3g5_2 = f3_2 * (int64_t) g5; + int64_t f3g6 = f3 * (int64_t) g6; + int64_t f3g7_38 = f3_2 * (int64_t) g7_19; + int64_t f3g8_19 = f3 * (int64_t) g8_19; + int64_t f3g9_38 = f3_2 * (int64_t) g9_19; + int64_t f4g0 = f4 * (int64_t) g0; + int64_t f4g1 = f4 * (int64_t) g1; + int64_t f4g2 = f4 * (int64_t) g2; + int64_t f4g3 = f4 * (int64_t) g3; + int64_t f4g4 = f4 * (int64_t) g4; + int64_t f4g5 = f4 * (int64_t) g5; + int64_t f4g6_19 = f4 * (int64_t) g6_19; + int64_t f4g7_19 = f4 * (int64_t) g7_19; + int64_t f4g8_19 = f4 * (int64_t) g8_19; + int64_t f4g9_19 = f4 * (int64_t) g9_19; + int64_t f5g0 = f5 * (int64_t) g0; + int64_t f5g1_2 = f5_2 * (int64_t) g1; + int64_t f5g2 = f5 * (int64_t) g2; + int64_t f5g3_2 = f5_2 * (int64_t) g3; + int64_t f5g4 = f5 * (int64_t) g4; + int64_t f5g5_38 = f5_2 * (int64_t) g5_19; + int64_t f5g6_19 = f5 * (int64_t) g6_19; + int64_t f5g7_38 = f5_2 * (int64_t) g7_19; + int64_t f5g8_19 = f5 * (int64_t) g8_19; + int64_t f5g9_38 = f5_2 * (int64_t) g9_19; + int64_t f6g0 = f6 * (int64_t) g0; + int64_t f6g1 = f6 * (int64_t) g1; + int64_t f6g2 = f6 * (int64_t) g2; + int64_t f6g3 = f6 * (int64_t) g3; + int64_t f6g4_19 = f6 * (int64_t) g4_19; + int64_t f6g5_19 = f6 * (int64_t) g5_19; + int64_t f6g6_19 = f6 * (int64_t) g6_19; + int64_t f6g7_19 = f6 * (int64_t) g7_19; + int64_t f6g8_19 = f6 * (int64_t) g8_19; + int64_t f6g9_19 = f6 * (int64_t) g9_19; + int64_t f7g0 = f7 * (int64_t) g0; + int64_t f7g1_2 = f7_2 * (int64_t) g1; + int64_t f7g2 = f7 * (int64_t) g2; + int64_t f7g3_38 = f7_2 * (int64_t) g3_19; + int64_t f7g4_19 = f7 * (int64_t) g4_19; + int64_t f7g5_38 = f7_2 * (int64_t) g5_19; + int64_t f7g6_19 = f7 * (int64_t) g6_19; + int64_t f7g7_38 = f7_2 * (int64_t) g7_19; + int64_t f7g8_19 = f7 * (int64_t) g8_19; + int64_t f7g9_38 = f7_2 * (int64_t) g9_19; + int64_t f8g0 = f8 * (int64_t) g0; + int64_t f8g1 = f8 * (int64_t) g1; + int64_t f8g2_19 = f8 * (int64_t) g2_19; + int64_t f8g3_19 = f8 * (int64_t) g3_19; + int64_t f8g4_19 = f8 * (int64_t) g4_19; + int64_t f8g5_19 = f8 * (int64_t) g5_19; + int64_t f8g6_19 = f8 * (int64_t) g6_19; + int64_t f8g7_19 = f8 * (int64_t) g7_19; + int64_t f8g8_19 = f8 * (int64_t) g8_19; + int64_t f8g9_19 = f8 * (int64_t) g9_19; + int64_t f9g0 = f9 * (int64_t) g0; + int64_t f9g1_38 = f9_2 * (int64_t) g1_19; + int64_t f9g2_19 = f9 * (int64_t) g2_19; + int64_t f9g3_38 = f9_2 * (int64_t) g3_19; + int64_t f9g4_19 = f9 * (int64_t) g4_19; + int64_t f9g5_38 = f9_2 * (int64_t) g5_19; + int64_t f9g6_19 = f9 * (int64_t) g6_19; + int64_t f9g7_38 = f9_2 * (int64_t) g7_19; + int64_t f9g8_19 = f9 * (int64_t) g8_19; + int64_t f9g9_38 = f9_2 * (int64_t) g9_19; + int64_t h0 = f0g0 + f1g9_38 + f2g8_19 + f3g7_38 + f4g6_19 + f5g5_38 + f6g4_19 + f7g3_38 + f8g2_19 + f9g1_38; + int64_t h1 = f0g1 + f1g0 + f2g9_19 + f3g8_19 + f4g7_19 + f5g6_19 + f6g5_19 + f7g4_19 + f8g3_19 + f9g2_19; + int64_t h2 = f0g2 + f1g1_2 + f2g0 + f3g9_38 + f4g8_19 + f5g7_38 + f6g6_19 + f7g5_38 + f8g4_19 + f9g3_38; + int64_t h3 = f0g3 + f1g2 + f2g1 + f3g0 + f4g9_19 + f5g8_19 + f6g7_19 + f7g6_19 + f8g5_19 + f9g4_19; + int64_t h4 = f0g4 + f1g3_2 + f2g2 + f3g1_2 + f4g0 + f5g9_38 + f6g8_19 + f7g7_38 + f8g6_19 + f9g5_38; + int64_t h5 = f0g5 + f1g4 + f2g3 + f3g2 + f4g1 + f5g0 + f6g9_19 + f7g8_19 + f8g7_19 + f9g6_19; + int64_t h6 = f0g6 + f1g5_2 + f2g4 + f3g3_2 + f4g2 + f5g1_2 + f6g0 + f7g9_38 + f8g8_19 + f9g7_38; + int64_t h7 = f0g7 + f1g6 + f2g5 + f3g4 + f4g3 + f5g2 + f6g1 + f7g0 + f8g9_19 + f9g8_19; + int64_t h8 = f0g8 + f1g7_2 + f2g6 + f3g5_2 + f4g4 + f5g3_2 + f6g2 + f7g1_2 + f8g0 + f9g9_38; + int64_t h9 = f0g9 + f1g8 + f2g7 + f3g6 + f4g5 + f5g4 + f6g3 + f7g2 + f8g1 + f9g0 ; + int64_t carry0; + int64_t carry1; + int64_t carry2; + int64_t carry3; + int64_t carry4; + int64_t carry5; + int64_t carry6; + int64_t carry7; + int64_t carry8; + int64_t carry9; + + carry0 = (h0 + (int64_t) (1 << 25)) >> 26; + h1 += carry0; + h0 -= carry0 << 26; + carry4 = (h4 + (int64_t) (1 << 25)) >> 26; + h5 += carry4; + h4 -= carry4 << 26; + + carry1 = (h1 + (int64_t) (1 << 24)) >> 25; + h2 += carry1; + h1 -= carry1 << 25; + carry5 = (h5 + (int64_t) (1 << 24)) >> 25; + h6 += carry5; + h5 -= carry5 << 25; + + carry2 = (h2 + (int64_t) (1 << 25)) >> 26; + h3 += carry2; + h2 -= carry2 << 26; + carry6 = (h6 + (int64_t) (1 << 25)) >> 26; + h7 += carry6; + h6 -= carry6 << 26; + + carry3 = (h3 + (int64_t) (1 << 24)) >> 25; + h4 += carry3; + h3 -= carry3 << 25; + carry7 = (h7 + (int64_t) (1 << 24)) >> 25; + h8 += carry7; + h7 -= carry7 << 25; + + carry4 = (h4 + (int64_t) (1 << 25)) >> 26; + h5 += carry4; + h4 -= carry4 << 26; + carry8 = (h8 + (int64_t) (1 << 25)) >> 26; + h9 += carry8; + h8 -= carry8 << 26; + + carry9 = (h9 + (int64_t) (1 << 24)) >> 25; + h0 += carry9 * 19; + h9 -= carry9 << 25; + + carry0 = (h0 + (int64_t) (1 << 25)) >> 26; + h1 += carry0; + h0 -= carry0 << 26; + + h[0] = (int32_t) h0; + h[1] = (int32_t) h1; + h[2] = (int32_t) h2; + h[3] = (int32_t) h3; + h[4] = (int32_t) h4; + h[5] = (int32_t) h5; + h[6] = (int32_t) h6; + h[7] = (int32_t) h7; + h[8] = (int32_t) h8; + h[9] = (int32_t) h9; +} + + +/* +h = f * 121666 +Can overlap h with f. + +Preconditions: + |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. + +Postconditions: + |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. +*/ + +void fe_mul121666(fe h, fe f) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int64_t h0 = f0 * (int64_t) 121666; + int64_t h1 = f1 * (int64_t) 121666; + int64_t h2 = f2 * (int64_t) 121666; + int64_t h3 = f3 * (int64_t) 121666; + int64_t h4 = f4 * (int64_t) 121666; + int64_t h5 = f5 * (int64_t) 121666; + int64_t h6 = f6 * (int64_t) 121666; + int64_t h7 = f7 * (int64_t) 121666; + int64_t h8 = f8 * (int64_t) 121666; + int64_t h9 = f9 * (int64_t) 121666; + int64_t carry0; + int64_t carry1; + int64_t carry2; + int64_t carry3; + int64_t carry4; + int64_t carry5; + int64_t carry6; + int64_t carry7; + int64_t carry8; + int64_t carry9; + + carry9 = (h9 + (int64_t) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25; + carry1 = (h1 + (int64_t) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25; + carry3 = (h3 + (int64_t) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25; + carry5 = (h5 + (int64_t) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25; + carry7 = (h7 + (int64_t) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25; + + carry0 = (h0 + (int64_t) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26; + carry2 = (h2 + (int64_t) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26; + carry4 = (h4 + (int64_t) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26; + carry6 = (h6 + (int64_t) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26; + carry8 = (h8 + (int64_t) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26; + + h[0] = (int32_t) h0; + h[1] = (int32_t) h1; + h[2] = (int32_t) h2; + h[3] = (int32_t) h3; + h[4] = (int32_t) h4; + h[5] = (int32_t) h5; + h[6] = (int32_t) h6; + h[7] = (int32_t) h7; + h[8] = (int32_t) h8; + h[9] = (int32_t) h9; +} + + +/* +h = -f + +Preconditions: + |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + +Postconditions: + |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. +*/ + +void fe_neg(fe h, const fe f) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int32_t h0 = -f0; + int32_t h1 = -f1; + int32_t h2 = -f2; + int32_t h3 = -f3; + int32_t h4 = -f4; + int32_t h5 = -f5; + int32_t h6 = -f6; + int32_t h7 = -f7; + int32_t h8 = -f8; + int32_t h9 = -f9; + + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} + + +void fe_pow22523(fe out, const fe z) { + fe t0; + fe t1; + fe t2; + int i; + fe_sq(t0, z); + + for (i = 1; i < 1; ++i) { + fe_sq(t0, t0); + } + + fe_sq(t1, t0); + + for (i = 1; i < 2; ++i) { + fe_sq(t1, t1); + } + + fe_mul(t1, z, t1); + fe_mul(t0, t0, t1); + fe_sq(t0, t0); + + for (i = 1; i < 1; ++i) { + fe_sq(t0, t0); + } + + fe_mul(t0, t1, t0); + fe_sq(t1, t0); + + for (i = 1; i < 5; ++i) { + fe_sq(t1, t1); + } + + fe_mul(t0, t1, t0); + fe_sq(t1, t0); + + for (i = 1; i < 10; ++i) { + fe_sq(t1, t1); + } + + fe_mul(t1, t1, t0); + fe_sq(t2, t1); + + for (i = 1; i < 20; ++i) { + fe_sq(t2, t2); + } + + fe_mul(t1, t2, t1); + fe_sq(t1, t1); + + for (i = 1; i < 10; ++i) { + fe_sq(t1, t1); + } + + fe_mul(t0, t1, t0); + fe_sq(t1, t0); + + for (i = 1; i < 50; ++i) { + fe_sq(t1, t1); + } + + fe_mul(t1, t1, t0); + fe_sq(t2, t1); + + for (i = 1; i < 100; ++i) { + fe_sq(t2, t2); + } + + fe_mul(t1, t2, t1); + fe_sq(t1, t1); + + for (i = 1; i < 50; ++i) { + fe_sq(t1, t1); + } + + fe_mul(t0, t1, t0); + fe_sq(t0, t0); + + for (i = 1; i < 2; ++i) { + fe_sq(t0, t0); + } + + fe_mul(out, t0, z); + return; +} + + +/* +h = f * f +Can overlap h with f. + +Preconditions: + |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. + +Postconditions: + |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. +*/ + +/* +See fe_mul.c for discussion of implementation strategy. +*/ + +void fe_sq(fe h, const fe f) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int32_t f0_2 = 2 * f0; + int32_t f1_2 = 2 * f1; + int32_t f2_2 = 2 * f2; + int32_t f3_2 = 2 * f3; + int32_t f4_2 = 2 * f4; + int32_t f5_2 = 2 * f5; + int32_t f6_2 = 2 * f6; + int32_t f7_2 = 2 * f7; + int32_t f5_38 = 38 * f5; /* 1.959375*2^30 */ + int32_t f6_19 = 19 * f6; /* 1.959375*2^30 */ + int32_t f7_38 = 38 * f7; /* 1.959375*2^30 */ + int32_t f8_19 = 19 * f8; /* 1.959375*2^30 */ + int32_t f9_38 = 38 * f9; /* 1.959375*2^30 */ + int64_t f0f0 = f0 * (int64_t) f0; + int64_t f0f1_2 = f0_2 * (int64_t) f1; + int64_t f0f2_2 = f0_2 * (int64_t) f2; + int64_t f0f3_2 = f0_2 * (int64_t) f3; + int64_t f0f4_2 = f0_2 * (int64_t) f4; + int64_t f0f5_2 = f0_2 * (int64_t) f5; + int64_t f0f6_2 = f0_2 * (int64_t) f6; + int64_t f0f7_2 = f0_2 * (int64_t) f7; + int64_t f0f8_2 = f0_2 * (int64_t) f8; + int64_t f0f9_2 = f0_2 * (int64_t) f9; + int64_t f1f1_2 = f1_2 * (int64_t) f1; + int64_t f1f2_2 = f1_2 * (int64_t) f2; + int64_t f1f3_4 = f1_2 * (int64_t) f3_2; + int64_t f1f4_2 = f1_2 * (int64_t) f4; + int64_t f1f5_4 = f1_2 * (int64_t) f5_2; + int64_t f1f6_2 = f1_2 * (int64_t) f6; + int64_t f1f7_4 = f1_2 * (int64_t) f7_2; + int64_t f1f8_2 = f1_2 * (int64_t) f8; + int64_t f1f9_76 = f1_2 * (int64_t) f9_38; + int64_t f2f2 = f2 * (int64_t) f2; + int64_t f2f3_2 = f2_2 * (int64_t) f3; + int64_t f2f4_2 = f2_2 * (int64_t) f4; + int64_t f2f5_2 = f2_2 * (int64_t) f5; + int64_t f2f6_2 = f2_2 * (int64_t) f6; + int64_t f2f7_2 = f2_2 * (int64_t) f7; + int64_t f2f8_38 = f2_2 * (int64_t) f8_19; + int64_t f2f9_38 = f2 * (int64_t) f9_38; + int64_t f3f3_2 = f3_2 * (int64_t) f3; + int64_t f3f4_2 = f3_2 * (int64_t) f4; + int64_t f3f5_4 = f3_2 * (int64_t) f5_2; + int64_t f3f6_2 = f3_2 * (int64_t) f6; + int64_t f3f7_76 = f3_2 * (int64_t) f7_38; + int64_t f3f8_38 = f3_2 * (int64_t) f8_19; + int64_t f3f9_76 = f3_2 * (int64_t) f9_38; + int64_t f4f4 = f4 * (int64_t) f4; + int64_t f4f5_2 = f4_2 * (int64_t) f5; + int64_t f4f6_38 = f4_2 * (int64_t) f6_19; + int64_t f4f7_38 = f4 * (int64_t) f7_38; + int64_t f4f8_38 = f4_2 * (int64_t) f8_19; + int64_t f4f9_38 = f4 * (int64_t) f9_38; + int64_t f5f5_38 = f5 * (int64_t) f5_38; + int64_t f5f6_38 = f5_2 * (int64_t) f6_19; + int64_t f5f7_76 = f5_2 * (int64_t) f7_38; + int64_t f5f8_38 = f5_2 * (int64_t) f8_19; + int64_t f5f9_76 = f5_2 * (int64_t) f9_38; + int64_t f6f6_19 = f6 * (int64_t) f6_19; + int64_t f6f7_38 = f6 * (int64_t) f7_38; + int64_t f6f8_38 = f6_2 * (int64_t) f8_19; + int64_t f6f9_38 = f6 * (int64_t) f9_38; + int64_t f7f7_38 = f7 * (int64_t) f7_38; + int64_t f7f8_38 = f7_2 * (int64_t) f8_19; + int64_t f7f9_76 = f7_2 * (int64_t) f9_38; + int64_t f8f8_19 = f8 * (int64_t) f8_19; + int64_t f8f9_38 = f8 * (int64_t) f9_38; + int64_t f9f9_38 = f9 * (int64_t) f9_38; + int64_t h0 = f0f0 + f1f9_76 + f2f8_38 + f3f7_76 + f4f6_38 + f5f5_38; + int64_t h1 = f0f1_2 + f2f9_38 + f3f8_38 + f4f7_38 + f5f6_38; + int64_t h2 = f0f2_2 + f1f1_2 + f3f9_76 + f4f8_38 + f5f7_76 + f6f6_19; + int64_t h3 = f0f3_2 + f1f2_2 + f4f9_38 + f5f8_38 + f6f7_38; + int64_t h4 = f0f4_2 + f1f3_4 + f2f2 + f5f9_76 + f6f8_38 + f7f7_38; + int64_t h5 = f0f5_2 + f1f4_2 + f2f3_2 + f6f9_38 + f7f8_38; + int64_t h6 = f0f6_2 + f1f5_4 + f2f4_2 + f3f3_2 + f7f9_76 + f8f8_19; + int64_t h7 = f0f7_2 + f1f6_2 + f2f5_2 + f3f4_2 + f8f9_38; + int64_t h8 = f0f8_2 + f1f7_4 + f2f6_2 + f3f5_4 + f4f4 + f9f9_38; + int64_t h9 = f0f9_2 + f1f8_2 + f2f7_2 + f3f6_2 + f4f5_2; + int64_t carry0; + int64_t carry1; + int64_t carry2; + int64_t carry3; + int64_t carry4; + int64_t carry5; + int64_t carry6; + int64_t carry7; + int64_t carry8; + int64_t carry9; + carry0 = (h0 + (int64_t) (1 << 25)) >> 26; + h1 += carry0; + h0 -= carry0 << 26; + carry4 = (h4 + (int64_t) (1 << 25)) >> 26; + h5 += carry4; + h4 -= carry4 << 26; + carry1 = (h1 + (int64_t) (1 << 24)) >> 25; + h2 += carry1; + h1 -= carry1 << 25; + carry5 = (h5 + (int64_t) (1 << 24)) >> 25; + h6 += carry5; + h5 -= carry5 << 25; + carry2 = (h2 + (int64_t) (1 << 25)) >> 26; + h3 += carry2; + h2 -= carry2 << 26; + carry6 = (h6 + (int64_t) (1 << 25)) >> 26; + h7 += carry6; + h6 -= carry6 << 26; + carry3 = (h3 + (int64_t) (1 << 24)) >> 25; + h4 += carry3; + h3 -= carry3 << 25; + carry7 = (h7 + (int64_t) (1 << 24)) >> 25; + h8 += carry7; + h7 -= carry7 << 25; + carry4 = (h4 + (int64_t) (1 << 25)) >> 26; + h5 += carry4; + h4 -= carry4 << 26; + carry8 = (h8 + (int64_t) (1 << 25)) >> 26; + h9 += carry8; + h8 -= carry8 << 26; + carry9 = (h9 + (int64_t) (1 << 24)) >> 25; + h0 += carry9 * 19; + h9 -= carry9 << 25; + carry0 = (h0 + (int64_t) (1 << 25)) >> 26; + h1 += carry0; + h0 -= carry0 << 26; + h[0] = (int32_t) h0; + h[1] = (int32_t) h1; + h[2] = (int32_t) h2; + h[3] = (int32_t) h3; + h[4] = (int32_t) h4; + h[5] = (int32_t) h5; + h[6] = (int32_t) h6; + h[7] = (int32_t) h7; + h[8] = (int32_t) h8; + h[9] = (int32_t) h9; +} + + +/* +h = 2 * f * f +Can overlap h with f. + +Preconditions: + |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. + +Postconditions: + |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. +*/ + +/* +See fe_mul.c for discussion of implementation strategy. +*/ + +void fe_sq2(fe h, const fe f) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int32_t f0_2 = 2 * f0; + int32_t f1_2 = 2 * f1; + int32_t f2_2 = 2 * f2; + int32_t f3_2 = 2 * f3; + int32_t f4_2 = 2 * f4; + int32_t f5_2 = 2 * f5; + int32_t f6_2 = 2 * f6; + int32_t f7_2 = 2 * f7; + int32_t f5_38 = 38 * f5; /* 1.959375*2^30 */ + int32_t f6_19 = 19 * f6; /* 1.959375*2^30 */ + int32_t f7_38 = 38 * f7; /* 1.959375*2^30 */ + int32_t f8_19 = 19 * f8; /* 1.959375*2^30 */ + int32_t f9_38 = 38 * f9; /* 1.959375*2^30 */ + int64_t f0f0 = f0 * (int64_t) f0; + int64_t f0f1_2 = f0_2 * (int64_t) f1; + int64_t f0f2_2 = f0_2 * (int64_t) f2; + int64_t f0f3_2 = f0_2 * (int64_t) f3; + int64_t f0f4_2 = f0_2 * (int64_t) f4; + int64_t f0f5_2 = f0_2 * (int64_t) f5; + int64_t f0f6_2 = f0_2 * (int64_t) f6; + int64_t f0f7_2 = f0_2 * (int64_t) f7; + int64_t f0f8_2 = f0_2 * (int64_t) f8; + int64_t f0f9_2 = f0_2 * (int64_t) f9; + int64_t f1f1_2 = f1_2 * (int64_t) f1; + int64_t f1f2_2 = f1_2 * (int64_t) f2; + int64_t f1f3_4 = f1_2 * (int64_t) f3_2; + int64_t f1f4_2 = f1_2 * (int64_t) f4; + int64_t f1f5_4 = f1_2 * (int64_t) f5_2; + int64_t f1f6_2 = f1_2 * (int64_t) f6; + int64_t f1f7_4 = f1_2 * (int64_t) f7_2; + int64_t f1f8_2 = f1_2 * (int64_t) f8; + int64_t f1f9_76 = f1_2 * (int64_t) f9_38; + int64_t f2f2 = f2 * (int64_t) f2; + int64_t f2f3_2 = f2_2 * (int64_t) f3; + int64_t f2f4_2 = f2_2 * (int64_t) f4; + int64_t f2f5_2 = f2_2 * (int64_t) f5; + int64_t f2f6_2 = f2_2 * (int64_t) f6; + int64_t f2f7_2 = f2_2 * (int64_t) f7; + int64_t f2f8_38 = f2_2 * (int64_t) f8_19; + int64_t f2f9_38 = f2 * (int64_t) f9_38; + int64_t f3f3_2 = f3_2 * (int64_t) f3; + int64_t f3f4_2 = f3_2 * (int64_t) f4; + int64_t f3f5_4 = f3_2 * (int64_t) f5_2; + int64_t f3f6_2 = f3_2 * (int64_t) f6; + int64_t f3f7_76 = f3_2 * (int64_t) f7_38; + int64_t f3f8_38 = f3_2 * (int64_t) f8_19; + int64_t f3f9_76 = f3_2 * (int64_t) f9_38; + int64_t f4f4 = f4 * (int64_t) f4; + int64_t f4f5_2 = f4_2 * (int64_t) f5; + int64_t f4f6_38 = f4_2 * (int64_t) f6_19; + int64_t f4f7_38 = f4 * (int64_t) f7_38; + int64_t f4f8_38 = f4_2 * (int64_t) f8_19; + int64_t f4f9_38 = f4 * (int64_t) f9_38; + int64_t f5f5_38 = f5 * (int64_t) f5_38; + int64_t f5f6_38 = f5_2 * (int64_t) f6_19; + int64_t f5f7_76 = f5_2 * (int64_t) f7_38; + int64_t f5f8_38 = f5_2 * (int64_t) f8_19; + int64_t f5f9_76 = f5_2 * (int64_t) f9_38; + int64_t f6f6_19 = f6 * (int64_t) f6_19; + int64_t f6f7_38 = f6 * (int64_t) f7_38; + int64_t f6f8_38 = f6_2 * (int64_t) f8_19; + int64_t f6f9_38 = f6 * (int64_t) f9_38; + int64_t f7f7_38 = f7 * (int64_t) f7_38; + int64_t f7f8_38 = f7_2 * (int64_t) f8_19; + int64_t f7f9_76 = f7_2 * (int64_t) f9_38; + int64_t f8f8_19 = f8 * (int64_t) f8_19; + int64_t f8f9_38 = f8 * (int64_t) f9_38; + int64_t f9f9_38 = f9 * (int64_t) f9_38; + int64_t h0 = f0f0 + f1f9_76 + f2f8_38 + f3f7_76 + f4f6_38 + f5f5_38; + int64_t h1 = f0f1_2 + f2f9_38 + f3f8_38 + f4f7_38 + f5f6_38; + int64_t h2 = f0f2_2 + f1f1_2 + f3f9_76 + f4f8_38 + f5f7_76 + f6f6_19; + int64_t h3 = f0f3_2 + f1f2_2 + f4f9_38 + f5f8_38 + f6f7_38; + int64_t h4 = f0f4_2 + f1f3_4 + f2f2 + f5f9_76 + f6f8_38 + f7f7_38; + int64_t h5 = f0f5_2 + f1f4_2 + f2f3_2 + f6f9_38 + f7f8_38; + int64_t h6 = f0f6_2 + f1f5_4 + f2f4_2 + f3f3_2 + f7f9_76 + f8f8_19; + int64_t h7 = f0f7_2 + f1f6_2 + f2f5_2 + f3f4_2 + f8f9_38; + int64_t h8 = f0f8_2 + f1f7_4 + f2f6_2 + f3f5_4 + f4f4 + f9f9_38; + int64_t h9 = f0f9_2 + f1f8_2 + f2f7_2 + f3f6_2 + f4f5_2; + int64_t carry0; + int64_t carry1; + int64_t carry2; + int64_t carry3; + int64_t carry4; + int64_t carry5; + int64_t carry6; + int64_t carry7; + int64_t carry8; + int64_t carry9; + h0 += h0; + h1 += h1; + h2 += h2; + h3 += h3; + h4 += h4; + h5 += h5; + h6 += h6; + h7 += h7; + h8 += h8; + h9 += h9; + carry0 = (h0 + (int64_t) (1 << 25)) >> 26; + h1 += carry0; + h0 -= carry0 << 26; + carry4 = (h4 + (int64_t) (1 << 25)) >> 26; + h5 += carry4; + h4 -= carry4 << 26; + carry1 = (h1 + (int64_t) (1 << 24)) >> 25; + h2 += carry1; + h1 -= carry1 << 25; + carry5 = (h5 + (int64_t) (1 << 24)) >> 25; + h6 += carry5; + h5 -= carry5 << 25; + carry2 = (h2 + (int64_t) (1 << 25)) >> 26; + h3 += carry2; + h2 -= carry2 << 26; + carry6 = (h6 + (int64_t) (1 << 25)) >> 26; + h7 += carry6; + h6 -= carry6 << 26; + carry3 = (h3 + (int64_t) (1 << 24)) >> 25; + h4 += carry3; + h3 -= carry3 << 25; + carry7 = (h7 + (int64_t) (1 << 24)) >> 25; + h8 += carry7; + h7 -= carry7 << 25; + carry4 = (h4 + (int64_t) (1 << 25)) >> 26; + h5 += carry4; + h4 -= carry4 << 26; + carry8 = (h8 + (int64_t) (1 << 25)) >> 26; + h9 += carry8; + h8 -= carry8 << 26; + carry9 = (h9 + (int64_t) (1 << 24)) >> 25; + h0 += carry9 * 19; + h9 -= carry9 << 25; + carry0 = (h0 + (int64_t) (1 << 25)) >> 26; + h1 += carry0; + h0 -= carry0 << 26; + h[0] = (int32_t) h0; + h[1] = (int32_t) h1; + h[2] = (int32_t) h2; + h[3] = (int32_t) h3; + h[4] = (int32_t) h4; + h[5] = (int32_t) h5; + h[6] = (int32_t) h6; + h[7] = (int32_t) h7; + h[8] = (int32_t) h8; + h[9] = (int32_t) h9; +} + + +/* +h = f - g +Can overlap h with f or g. + +Preconditions: + |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. + +Postconditions: + |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. +*/ + +void fe_sub(fe h, const fe f, const fe g) { + int32_t f0 = f[0]; + int32_t f1 = f[1]; + int32_t f2 = f[2]; + int32_t f3 = f[3]; + int32_t f4 = f[4]; + int32_t f5 = f[5]; + int32_t f6 = f[6]; + int32_t f7 = f[7]; + int32_t f8 = f[8]; + int32_t f9 = f[9]; + int32_t g0 = g[0]; + int32_t g1 = g[1]; + int32_t g2 = g[2]; + int32_t g3 = g[3]; + int32_t g4 = g[4]; + int32_t g5 = g[5]; + int32_t g6 = g[6]; + int32_t g7 = g[7]; + int32_t g8 = g[8]; + int32_t g9 = g[9]; + int32_t h0 = f0 - g0; + int32_t h1 = f1 - g1; + int32_t h2 = f2 - g2; + int32_t h3 = f3 - g3; + int32_t h4 = f4 - g4; + int32_t h5 = f5 - g5; + int32_t h6 = f6 - g6; + int32_t h7 = f7 - g7; + int32_t h8 = f8 - g8; + int32_t h9 = f9 - g9; + + h[0] = h0; + h[1] = h1; + h[2] = h2; + h[3] = h3; + h[4] = h4; + h[5] = h5; + h[6] = h6; + h[7] = h7; + h[8] = h8; + h[9] = h9; +} + + + +/* +Preconditions: + |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. + +Write p=2^255-19; q=floor(h/p). +Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))). + +Proof: + Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4. + Also have |h-2^230 h9|<2^231 so |19 2^(-255)(h-2^230 h9)|<1/4. + + Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9). + Then 0> 25; + q = (h0 + q) >> 26; + q = (h1 + q) >> 25; + q = (h2 + q) >> 26; + q = (h3 + q) >> 25; + q = (h4 + q) >> 26; + q = (h5 + q) >> 25; + q = (h6 + q) >> 26; + q = (h7 + q) >> 25; + q = (h8 + q) >> 26; + q = (h9 + q) >> 25; + /* Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20. */ + h0 += 19 * q; + /* Goal: Output h-2^255 q, which is between 0 and 2^255-20. */ + carry0 = h0 >> 26; + h1 += carry0; + h0 -= carry0 << 26; + carry1 = h1 >> 25; + h2 += carry1; + h1 -= carry1 << 25; + carry2 = h2 >> 26; + h3 += carry2; + h2 -= carry2 << 26; + carry3 = h3 >> 25; + h4 += carry3; + h3 -= carry3 << 25; + carry4 = h4 >> 26; + h5 += carry4; + h4 -= carry4 << 26; + carry5 = h5 >> 25; + h6 += carry5; + h5 -= carry5 << 25; + carry6 = h6 >> 26; + h7 += carry6; + h6 -= carry6 << 26; + carry7 = h7 >> 25; + h8 += carry7; + h7 -= carry7 << 25; + carry8 = h8 >> 26; + h9 += carry8; + h8 -= carry8 << 26; + carry9 = h9 >> 25; + h9 -= carry9 << 25; + + /* h10 = carry9 */ + /* + Goal: Output h0+...+2^255 h10-2^255 q, which is between 0 and 2^255-20. + Have h0+...+2^230 h9 between 0 and 2^255-1; + evidently 2^255 h10-2^255 q = 0. + Goal: Output h0+...+2^230 h9. + */ + s[0] = (unsigned char) (h0 >> 0); + s[1] = (unsigned char) (h0 >> 8); + s[2] = (unsigned char) (h0 >> 16); + s[3] = (unsigned char) ((h0 >> 24) | (h1 << 2)); + s[4] = (unsigned char) (h1 >> 6); + s[5] = (unsigned char) (h1 >> 14); + s[6] = (unsigned char) ((h1 >> 22) | (h2 << 3)); + s[7] = (unsigned char) (h2 >> 5); + s[8] = (unsigned char) (h2 >> 13); + s[9] = (unsigned char) ((h2 >> 21) | (h3 << 5)); + s[10] = (unsigned char) (h3 >> 3); + s[11] = (unsigned char) (h3 >> 11); + s[12] = (unsigned char) ((h3 >> 19) | (h4 << 6)); + s[13] = (unsigned char) (h4 >> 2); + s[14] = (unsigned char) (h4 >> 10); + s[15] = (unsigned char) (h4 >> 18); + s[16] = (unsigned char) (h5 >> 0); + s[17] = (unsigned char) (h5 >> 8); + s[18] = (unsigned char) (h5 >> 16); + s[19] = (unsigned char) ((h5 >> 24) | (h6 << 1)); + s[20] = (unsigned char) (h6 >> 7); + s[21] = (unsigned char) (h6 >> 15); + s[22] = (unsigned char) ((h6 >> 23) | (h7 << 3)); + s[23] = (unsigned char) (h7 >> 5); + s[24] = (unsigned char) (h7 >> 13); + s[25] = (unsigned char) ((h7 >> 21) | (h8 << 4)); + s[26] = (unsigned char) (h8 >> 4); + s[27] = (unsigned char) (h8 >> 12); + s[28] = (unsigned char) ((h8 >> 20) | (h9 << 6)); + s[29] = (unsigned char) (h9 >> 2); + s[30] = (unsigned char) (h9 >> 10); + s[31] = (unsigned char) (h9 >> 18); +} diff --git a/src/cryptoconditions/src/include/ed25519/src/fe.h b/src/cryptoconditions/src/include/ed25519/src/fe.h new file mode 100644 index 00000000000..b4b62d28284 --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/fe.h @@ -0,0 +1,41 @@ +#ifndef FE_H +#define FE_H + +#include "fixedint.h" + + +/* + fe means field element. + Here the field is \Z/(2^255-19). + An element t, entries t[0]...t[9], represents the integer + t[0]+2^26 t[1]+2^51 t[2]+2^77 t[3]+2^102 t[4]+...+2^230 t[9]. + Bounds on each t[i] vary depending on context. +*/ + + +typedef int32_t fe[10]; + + +void fe_0(fe h); +void fe_1(fe h); + +void fe_frombytes(fe h, const unsigned char *s); +void fe_tobytes(unsigned char *s, const fe h); + +void fe_copy(fe h, const fe f); +int fe_isnegative(const fe f); +int fe_isnonzero(const fe f); +void fe_cmov(fe f, const fe g, unsigned int b); +void fe_cswap(fe f, fe g, unsigned int b); + +void fe_neg(fe h, const fe f); +void fe_add(fe h, const fe f, const fe g); +void fe_invert(fe out, const fe z); +void fe_sq(fe h, const fe f); +void fe_sq2(fe h, const fe f); +void fe_mul(fe h, const fe f, const fe g); +void fe_mul121666(fe h, fe f); +void fe_pow22523(fe out, const fe z); +void fe_sub(fe h, const fe f, const fe g); + +#endif diff --git a/src/cryptoconditions/src/include/ed25519/src/fixedint.h b/src/cryptoconditions/src/include/ed25519/src/fixedint.h new file mode 100644 index 00000000000..1a8745b1ea4 --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/fixedint.h @@ -0,0 +1,72 @@ +/* + Portable header to provide the 32 and 64 bits type. + + Not a compatible replacement for , do not blindly use it as such. +*/ + +#if ((defined(__STDC__) && __STDC__ && __STDC_VERSION__ >= 199901L) || (defined(__WATCOMC__) && (defined(_STDINT_H_INCLUDED) || __WATCOMC__ >= 1250)) || (defined(__GNUC__) && (defined(_STDINT_H) || defined(_STDINT_H_) || defined(__UINT_FAST64_TYPE__)) )) && !defined(FIXEDINT_H_INCLUDED) + #include + #define FIXEDINT_H_INCLUDED + + #if defined(__WATCOMC__) && __WATCOMC__ >= 1250 && !defined(UINT64_C) + #include + #define UINT64_C(x) (x + (UINT64_MAX - UINT64_MAX)) + #endif +#endif + + +#ifndef FIXEDINT_H_INCLUDED + #define FIXEDINT_H_INCLUDED + + #include + + /* (u)int32_t */ + #ifndef uint32_t + #if (ULONG_MAX == 0xffffffffUL) + typedef unsigned long uint32_t; + #elif (UINT_MAX == 0xffffffffUL) + typedef unsigned int uint32_t; + #elif (USHRT_MAX == 0xffffffffUL) + typedef unsigned short uint32_t; + #endif + #endif + + + #ifndef int32_t + #if (LONG_MAX == 0x7fffffffL) + typedef signed long int32_t; + #elif (INT_MAX == 0x7fffffffL) + typedef signed int int32_t; + #elif (SHRT_MAX == 0x7fffffffL) + typedef signed short int32_t; + #endif + #endif + + + /* (u)int64_t */ + #if (defined(__STDC__) && defined(__STDC_VERSION__) && __STDC__ && __STDC_VERSION__ >= 199901L) + typedef long long int64_t; + typedef unsigned long long uint64_t; + + #define UINT64_C(v) v ##ULL + #define INT64_C(v) v ##LL + #elif defined(__GNUC__) + __extension__ typedef long long int64_t; + __extension__ typedef unsigned long long uint64_t; + + #define UINT64_C(v) v ##ULL + #define INT64_C(v) v ##LL + #elif defined(__MWERKS__) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) || defined(__APPLE_CC__) || defined(_LONG_LONG) || defined(_CRAYC) + typedef long long int64_t; + typedef unsigned long long uint64_t; + + #define UINT64_C(v) v ##ULL + #define INT64_C(v) v ##LL + #elif (defined(__WATCOMC__) && defined(__WATCOM_INT64__)) || (defined(_MSC_VER) && _INTEGRAL_MAX_BITS >= 64) || (defined(__BORLANDC__) && __BORLANDC__ > 0x460) || defined(__alpha) || defined(__DECC) + typedef __int64 int64_t; + typedef unsigned __int64 uint64_t; + + #define UINT64_C(v) v ##UI64 + #define INT64_C(v) v ##I64 + #endif +#endif diff --git a/src/cryptoconditions/src/include/ed25519/src/ge.c b/src/cryptoconditions/src/include/ed25519/src/ge.c new file mode 100644 index 00000000000..87c691bff55 --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/ge.c @@ -0,0 +1,467 @@ +#include "ge.h" +#include "precomp_data.h" + + +/* +r = p + q +*/ + +void ge_add(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q) { + fe t0; + fe_add(r->X, p->Y, p->X); + fe_sub(r->Y, p->Y, p->X); + fe_mul(r->Z, r->X, q->YplusX); + fe_mul(r->Y, r->Y, q->YminusX); + fe_mul(r->T, q->T2d, p->T); + fe_mul(r->X, p->Z, q->Z); + fe_add(t0, r->X, r->X); + fe_sub(r->X, r->Z, r->Y); + fe_add(r->Y, r->Z, r->Y); + fe_add(r->Z, t0, r->T); + fe_sub(r->T, t0, r->T); +} + + +static void slide(signed char *r, const unsigned char *a) { + int i; + int b; + int k; + + for (i = 0; i < 256; ++i) { + r[i] = 1 & (a[i >> 3] >> (i & 7)); + } + + for (i = 0; i < 256; ++i) + if (r[i]) { + for (b = 1; b <= 6 && i + b < 256; ++b) { + if (r[i + b]) { + if (r[i] + (r[i + b] << b) <= 15) { + r[i] += r[i + b] << b; + r[i + b] = 0; + } else if (r[i] - (r[i + b] << b) >= -15) { + r[i] -= r[i + b] << b; + + for (k = i + b; k < 256; ++k) { + if (!r[k]) { + r[k] = 1; + break; + } + + r[k] = 0; + } + } else { + break; + } + } + } + } +} + +/* +r = a * A + b * B +where a = a[0]+256*a[1]+...+256^31 a[31]. +and b = b[0]+256*b[1]+...+256^31 b[31]. +B is the Ed25519 base point (x,4/5) with x positive. +*/ + +void ge_double_scalarmult_vartime(ge_p2 *r, const unsigned char *a, const ge_p3 *A, const unsigned char *b) { + signed char aslide[256]; + signed char bslide[256]; + ge_cached Ai[8]; /* A,3A,5A,7A,9A,11A,13A,15A */ + ge_p1p1 t; + ge_p3 u; + ge_p3 A2; + int i; + slide(aslide, a); + slide(bslide, b); + ge_p3_to_cached(&Ai[0], A); + ge_p3_dbl(&t, A); + ge_p1p1_to_p3(&A2, &t); + ge_add(&t, &A2, &Ai[0]); + ge_p1p1_to_p3(&u, &t); + ge_p3_to_cached(&Ai[1], &u); + ge_add(&t, &A2, &Ai[1]); + ge_p1p1_to_p3(&u, &t); + ge_p3_to_cached(&Ai[2], &u); + ge_add(&t, &A2, &Ai[2]); + ge_p1p1_to_p3(&u, &t); + ge_p3_to_cached(&Ai[3], &u); + ge_add(&t, &A2, &Ai[3]); + ge_p1p1_to_p3(&u, &t); + ge_p3_to_cached(&Ai[4], &u); + ge_add(&t, &A2, &Ai[4]); + ge_p1p1_to_p3(&u, &t); + ge_p3_to_cached(&Ai[5], &u); + ge_add(&t, &A2, &Ai[5]); + ge_p1p1_to_p3(&u, &t); + ge_p3_to_cached(&Ai[6], &u); + ge_add(&t, &A2, &Ai[6]); + ge_p1p1_to_p3(&u, &t); + ge_p3_to_cached(&Ai[7], &u); + ge_p2_0(r); + + for (i = 255; i >= 0; --i) { + if (aslide[i] || bslide[i]) { + break; + } + } + + for (; i >= 0; --i) { + ge_p2_dbl(&t, r); + + if (aslide[i] > 0) { + ge_p1p1_to_p3(&u, &t); + ge_add(&t, &u, &Ai[aslide[i] / 2]); + } else if (aslide[i] < 0) { + ge_p1p1_to_p3(&u, &t); + ge_sub(&t, &u, &Ai[(-aslide[i]) / 2]); + } + + if (bslide[i] > 0) { + ge_p1p1_to_p3(&u, &t); + ge_madd(&t, &u, &Bi[bslide[i] / 2]); + } else if (bslide[i] < 0) { + ge_p1p1_to_p3(&u, &t); + ge_msub(&t, &u, &Bi[(-bslide[i]) / 2]); + } + + ge_p1p1_to_p2(r, &t); + } +} + + +static const fe d = { + -10913610, 13857413, -15372611, 6949391, 114729, -8787816, -6275908, -3247719, -18696448, -12055116 +}; + +static const fe sqrtm1 = { + -32595792, -7943725, 9377950, 3500415, 12389472, -272473, -25146209, -2005654, 326686, 11406482 +}; + +int ge_frombytes_negate_vartime(ge_p3 *h, const unsigned char *s) { + fe u; + fe v; + fe v3; + fe vxx; + fe check; + fe_frombytes(h->Y, s); + fe_1(h->Z); + fe_sq(u, h->Y); + fe_mul(v, u, d); + fe_sub(u, u, h->Z); /* u = y^2-1 */ + fe_add(v, v, h->Z); /* v = dy^2+1 */ + fe_sq(v3, v); + fe_mul(v3, v3, v); /* v3 = v^3 */ + fe_sq(h->X, v3); + fe_mul(h->X, h->X, v); + fe_mul(h->X, h->X, u); /* x = uv^7 */ + fe_pow22523(h->X, h->X); /* x = (uv^7)^((q-5)/8) */ + fe_mul(h->X, h->X, v3); + fe_mul(h->X, h->X, u); /* x = uv^3(uv^7)^((q-5)/8) */ + fe_sq(vxx, h->X); + fe_mul(vxx, vxx, v); + fe_sub(check, vxx, u); /* vx^2-u */ + + if (fe_isnonzero(check)) { + fe_add(check, vxx, u); /* vx^2+u */ + + if (fe_isnonzero(check)) { + return -1; + } + + fe_mul(h->X, h->X, sqrtm1); + } + + if (fe_isnegative(h->X) == (s[31] >> 7)) { + fe_neg(h->X, h->X); + } + + fe_mul(h->T, h->X, h->Y); + return 0; +} + + +/* +r = p + q +*/ + +void ge_madd(ge_p1p1 *r, const ge_p3 *p, const ge_precomp *q) { + fe t0; + fe_add(r->X, p->Y, p->X); + fe_sub(r->Y, p->Y, p->X); + fe_mul(r->Z, r->X, q->yplusx); + fe_mul(r->Y, r->Y, q->yminusx); + fe_mul(r->T, q->xy2d, p->T); + fe_add(t0, p->Z, p->Z); + fe_sub(r->X, r->Z, r->Y); + fe_add(r->Y, r->Z, r->Y); + fe_add(r->Z, t0, r->T); + fe_sub(r->T, t0, r->T); +} + + +/* +r = p - q +*/ + +void ge_msub(ge_p1p1 *r, const ge_p3 *p, const ge_precomp *q) { + fe t0; + + fe_add(r->X, p->Y, p->X); + fe_sub(r->Y, p->Y, p->X); + fe_mul(r->Z, r->X, q->yminusx); + fe_mul(r->Y, r->Y, q->yplusx); + fe_mul(r->T, q->xy2d, p->T); + fe_add(t0, p->Z, p->Z); + fe_sub(r->X, r->Z, r->Y); + fe_add(r->Y, r->Z, r->Y); + fe_sub(r->Z, t0, r->T); + fe_add(r->T, t0, r->T); +} + + +/* +r = p +*/ + +void ge_p1p1_to_p2(ge_p2 *r, const ge_p1p1 *p) { + fe_mul(r->X, p->X, p->T); + fe_mul(r->Y, p->Y, p->Z); + fe_mul(r->Z, p->Z, p->T); +} + + + +/* +r = p +*/ + +void ge_p1p1_to_p3(ge_p3 *r, const ge_p1p1 *p) { + fe_mul(r->X, p->X, p->T); + fe_mul(r->Y, p->Y, p->Z); + fe_mul(r->Z, p->Z, p->T); + fe_mul(r->T, p->X, p->Y); +} + + +void ge_p2_0(ge_p2 *h) { + fe_0(h->X); + fe_1(h->Y); + fe_1(h->Z); +} + + + +/* +r = 2 * p +*/ + +void ge_p2_dbl(ge_p1p1 *r, const ge_p2 *p) { + fe t0; + + fe_sq(r->X, p->X); + fe_sq(r->Z, p->Y); + fe_sq2(r->T, p->Z); + fe_add(r->Y, p->X, p->Y); + fe_sq(t0, r->Y); + fe_add(r->Y, r->Z, r->X); + fe_sub(r->Z, r->Z, r->X); + fe_sub(r->X, t0, r->Y); + fe_sub(r->T, r->T, r->Z); +} + + +void ge_p3_0(ge_p3 *h) { + fe_0(h->X); + fe_1(h->Y); + fe_1(h->Z); + fe_0(h->T); +} + + +/* +r = 2 * p +*/ + +void ge_p3_dbl(ge_p1p1 *r, const ge_p3 *p) { + ge_p2 q; + ge_p3_to_p2(&q, p); + ge_p2_dbl(r, &q); +} + + + +/* +r = p +*/ + +static const fe d2 = { + -21827239, -5839606, -30745221, 13898782, 229458, 15978800, -12551817, -6495438, 29715968, 9444199 +}; + +void ge_p3_to_cached(ge_cached *r, const ge_p3 *p) { + fe_add(r->YplusX, p->Y, p->X); + fe_sub(r->YminusX, p->Y, p->X); + fe_copy(r->Z, p->Z); + fe_mul(r->T2d, p->T, d2); +} + + +/* +r = p +*/ + +void ge_p3_to_p2(ge_p2 *r, const ge_p3 *p) { + fe_copy(r->X, p->X); + fe_copy(r->Y, p->Y); + fe_copy(r->Z, p->Z); +} + + +void ge_p3_tobytes(unsigned char *s, const ge_p3 *h) { + fe recip; + fe x; + fe y; + fe_invert(recip, h->Z); + fe_mul(x, h->X, recip); + fe_mul(y, h->Y, recip); + fe_tobytes(s, y); + s[31] ^= fe_isnegative(x) << 7; +} + + +static unsigned char equal(signed char b, signed char c) { + unsigned char ub = b; + unsigned char uc = c; + unsigned char x = ub ^ uc; /* 0: yes; 1..255: no */ + uint64_t y = x; /* 0: yes; 1..255: no */ + y -= 1; /* large: yes; 0..254: no */ + y >>= 63; /* 1: yes; 0: no */ + return (unsigned char) y; +} + +static unsigned char negative(signed char b) { + uint64_t x = b; /* 18446744073709551361..18446744073709551615: yes; 0..255: no */ + x >>= 63; /* 1: yes; 0: no */ + return (unsigned char) x; +} + +static void cmov(ge_precomp *t, const ge_precomp *u, unsigned char b) { + fe_cmov(t->yplusx, u->yplusx, b); + fe_cmov(t->yminusx, u->yminusx, b); + fe_cmov(t->xy2d, u->xy2d, b); +} + + +static void select(ge_precomp *t, int pos, signed char b) { + ge_precomp minust; + unsigned char bnegative = negative(b); + unsigned char babs = b - (((-bnegative) & b) << 1); + fe_1(t->yplusx); + fe_1(t->yminusx); + fe_0(t->xy2d); + cmov(t, &base[pos][0], equal(babs, 1)); + cmov(t, &base[pos][1], equal(babs, 2)); + cmov(t, &base[pos][2], equal(babs, 3)); + cmov(t, &base[pos][3], equal(babs, 4)); + cmov(t, &base[pos][4], equal(babs, 5)); + cmov(t, &base[pos][5], equal(babs, 6)); + cmov(t, &base[pos][6], equal(babs, 7)); + cmov(t, &base[pos][7], equal(babs, 8)); + fe_copy(minust.yplusx, t->yminusx); + fe_copy(minust.yminusx, t->yplusx); + fe_neg(minust.xy2d, t->xy2d); + cmov(t, &minust, bnegative); +} + +/* +h = a * B +where a = a[0]+256*a[1]+...+256^31 a[31] +B is the Ed25519 base point (x,4/5) with x positive. + +Preconditions: + a[31] <= 127 +*/ + +void ge_scalarmult_base(ge_p3 *h, const unsigned char *a) { + signed char e[64]; + signed char carry; + ge_p1p1 r; + ge_p2 s; + ge_precomp t; + int i; + + for (i = 0; i < 32; ++i) { + e[2 * i + 0] = (a[i] >> 0) & 15; + e[2 * i + 1] = (a[i] >> 4) & 15; + } + + /* each e[i] is between 0 and 15 */ + /* e[63] is between 0 and 7 */ + carry = 0; + + for (i = 0; i < 63; ++i) { + e[i] += carry; + carry = e[i] + 8; + carry >>= 4; + e[i] -= carry << 4; + } + + e[63] += carry; + /* each e[i] is between -8 and 8 */ + ge_p3_0(h); + + for (i = 1; i < 64; i += 2) { + select(&t, i / 2, e[i]); + ge_madd(&r, h, &t); + ge_p1p1_to_p3(h, &r); + } + + ge_p3_dbl(&r, h); + ge_p1p1_to_p2(&s, &r); + ge_p2_dbl(&r, &s); + ge_p1p1_to_p2(&s, &r); + ge_p2_dbl(&r, &s); + ge_p1p1_to_p2(&s, &r); + ge_p2_dbl(&r, &s); + ge_p1p1_to_p3(h, &r); + + for (i = 0; i < 64; i += 2) { + select(&t, i / 2, e[i]); + ge_madd(&r, h, &t); + ge_p1p1_to_p3(h, &r); + } +} + + +/* +r = p - q +*/ + +void ge_sub(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q) { + fe t0; + + fe_add(r->X, p->Y, p->X); + fe_sub(r->Y, p->Y, p->X); + fe_mul(r->Z, r->X, q->YminusX); + fe_mul(r->Y, r->Y, q->YplusX); + fe_mul(r->T, q->T2d, p->T); + fe_mul(r->X, p->Z, q->Z); + fe_add(t0, r->X, r->X); + fe_sub(r->X, r->Z, r->Y); + fe_add(r->Y, r->Z, r->Y); + fe_sub(r->Z, t0, r->T); + fe_add(r->T, t0, r->T); +} + + +void ge_tobytes(unsigned char *s, const ge_p2 *h) { + fe recip; + fe x; + fe y; + fe_invert(recip, h->Z); + fe_mul(x, h->X, recip); + fe_mul(y, h->Y, recip); + fe_tobytes(s, y); + s[31] ^= fe_isnegative(x) << 7; +} diff --git a/src/cryptoconditions/src/include/ed25519/src/ge.h b/src/cryptoconditions/src/include/ed25519/src/ge.h new file mode 100644 index 00000000000..17fde2df1ff --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/ge.h @@ -0,0 +1,74 @@ +#ifndef GE_H +#define GE_H + +#include "fe.h" + + +/* +ge means group element. + +Here the group is the set of pairs (x,y) of field elements (see fe.h) +satisfying -x^2 + y^2 = 1 + d x^2y^2 +where d = -121665/121666. + +Representations: + ge_p2 (projective): (X:Y:Z) satisfying x=X/Z, y=Y/Z + ge_p3 (extended): (X:Y:Z:T) satisfying x=X/Z, y=Y/Z, XY=ZT + ge_p1p1 (completed): ((X:Z),(Y:T)) satisfying x=X/Z, y=Y/T + ge_precomp (Duif): (y+x,y-x,2dxy) +*/ + +typedef struct { + fe X; + fe Y; + fe Z; +} ge_p2; + +typedef struct { + fe X; + fe Y; + fe Z; + fe T; +} ge_p3; + +typedef struct { + fe X; + fe Y; + fe Z; + fe T; +} ge_p1p1; + +typedef struct { + fe yplusx; + fe yminusx; + fe xy2d; +} ge_precomp; + +typedef struct { + fe YplusX; + fe YminusX; + fe Z; + fe T2d; +} ge_cached; + +void ge_p3_tobytes(unsigned char *s, const ge_p3 *h); +void ge_tobytes(unsigned char *s, const ge_p2 *h); +int ge_frombytes_negate_vartime(ge_p3 *h, const unsigned char *s); + +void ge_add(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q); +void ge_sub(ge_p1p1 *r, const ge_p3 *p, const ge_cached *q); +void ge_double_scalarmult_vartime(ge_p2 *r, const unsigned char *a, const ge_p3 *A, const unsigned char *b); +void ge_madd(ge_p1p1 *r, const ge_p3 *p, const ge_precomp *q); +void ge_msub(ge_p1p1 *r, const ge_p3 *p, const ge_precomp *q); +void ge_scalarmult_base(ge_p3 *h, const unsigned char *a); + +void ge_p1p1_to_p2(ge_p2 *r, const ge_p1p1 *p); +void ge_p1p1_to_p3(ge_p3 *r, const ge_p1p1 *p); +void ge_p2_0(ge_p2 *h); +void ge_p2_dbl(ge_p1p1 *r, const ge_p2 *p); +void ge_p3_0(ge_p3 *h); +void ge_p3_dbl(ge_p1p1 *r, const ge_p3 *p); +void ge_p3_to_cached(ge_cached *r, const ge_p3 *p); +void ge_p3_to_p2(ge_p2 *r, const ge_p3 *p); + +#endif diff --git a/src/cryptoconditions/src/include/ed25519/src/key_exchange.c b/src/cryptoconditions/src/include/ed25519/src/key_exchange.c new file mode 100644 index 00000000000..abd75da2c21 --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/key_exchange.c @@ -0,0 +1,79 @@ +#include "ed25519.h" +#include "fe.h" + +void ed25519_key_exchange(unsigned char *shared_secret, const unsigned char *public_key, const unsigned char *private_key) { + unsigned char e[32]; + unsigned int i; + + fe x1; + fe x2; + fe z2; + fe x3; + fe z3; + fe tmp0; + fe tmp1; + + int pos; + unsigned int swap; + unsigned int b; + + /* copy the private key and make sure it's valid */ + for (i = 0; i < 32; ++i) { + e[i] = private_key[i]; + } + + e[0] &= 248; + e[31] &= 63; + e[31] |= 64; + + /* unpack the public key and convert edwards to montgomery */ + /* due to CodesInChaos: montgomeryX = (edwardsY + 1)*inverse(1 - edwardsY) mod p */ + fe_frombytes(x1, public_key); + fe_1(tmp1); + fe_add(tmp0, x1, tmp1); + fe_sub(tmp1, tmp1, x1); + fe_invert(tmp1, tmp1); + fe_mul(x1, tmp0, tmp1); + + fe_1(x2); + fe_0(z2); + fe_copy(x3, x1); + fe_1(z3); + + swap = 0; + for (pos = 254; pos >= 0; --pos) { + b = e[pos / 8] >> (pos & 7); + b &= 1; + swap ^= b; + fe_cswap(x2, x3, swap); + fe_cswap(z2, z3, swap); + swap = b; + + /* from montgomery.h */ + fe_sub(tmp0, x3, z3); + fe_sub(tmp1, x2, z2); + fe_add(x2, x2, z2); + fe_add(z2, x3, z3); + fe_mul(z3, tmp0, x2); + fe_mul(z2, z2, tmp1); + fe_sq(tmp0, tmp1); + fe_sq(tmp1, x2); + fe_add(x3, z3, z2); + fe_sub(z2, z3, z2); + fe_mul(x2, tmp1, tmp0); + fe_sub(tmp1, tmp1, tmp0); + fe_sq(z2, z2); + fe_mul121666(z3, tmp1); + fe_sq(x3, x3); + fe_add(tmp0, tmp0, z3); + fe_mul(z3, x1, z2); + fe_mul(z2, tmp1, tmp0); + } + + fe_cswap(x2, x3, swap); + fe_cswap(z2, z3, swap); + + fe_invert(z2, z2); + fe_mul(x2, x2, z2); + fe_tobytes(shared_secret, x2); +} diff --git a/src/cryptoconditions/src/include/ed25519/src/keypair.c b/src/cryptoconditions/src/include/ed25519/src/keypair.c new file mode 100644 index 00000000000..dc1b8eccc28 --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/keypair.c @@ -0,0 +1,16 @@ +#include "ed25519.h" +#include "sha512.h" +#include "ge.h" + + +void ed25519_create_keypair(unsigned char *public_key, unsigned char *private_key, const unsigned char *seed) { + ge_p3 A; + + sha512(seed, 32, private_key); + private_key[0] &= 248; + private_key[31] &= 63; + private_key[31] |= 64; + + ge_scalarmult_base(&A, private_key); + ge_p3_tobytes(public_key, &A); +} diff --git a/src/cryptoconditions/src/include/ed25519/src/precomp_data.h b/src/cryptoconditions/src/include/ed25519/src/precomp_data.h new file mode 100644 index 00000000000..ff23986c398 --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/precomp_data.h @@ -0,0 +1,1391 @@ +static const ge_precomp Bi[8] = { + { + { 25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605 }, + { -12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378 }, + { -8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546 }, + }, + { + { 15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024 }, + { 16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574 }, + { 30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357 }, + }, + { + { 10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380 }, + { 4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306 }, + { 19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942 }, + }, + { + { 5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766 }, + { -30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701 }, + { 28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300 }, + }, + { + { -22518993, -6692182, 14201702, -8745502, -23510406, 8844726, 18474211, -1361450, -13062696, 13821877 }, + { -6455177, -7839871, 3374702, -4740862, -27098617, -10571707, 31655028, -7212327, 18853322, -14220951 }, + { 4566830, -12963868, -28974889, -12240689, -7602672, -2830569, -8514358, -10431137, 2207753, -3209784 }, + }, + { + { -25154831, -4185821, 29681144, 7868801, -6854661, -9423865, -12437364, -663000, -31111463, -16132436 }, + { 25576264, -2703214, 7349804, -11814844, 16472782, 9300885, 3844789, 15725684, 171356, 6466918 }, + { 23103977, 13316479, 9739013, -16149481, 817875, -15038942, 8965339, -14088058, -30714912, 16193877 }, + }, + { + { -33521811, 3180713, -2394130, 14003687, -16903474, -16270840, 17238398, 4729455, -18074513, 9256800 }, + { -25182317, -4174131, 32336398, 5036987, -21236817, 11360617, 22616405, 9761698, -19827198, 630305 }, + { -13720693, 2639453, -24237460, -7406481, 9494427, -5774029, -6554551, -15960994, -2449256, -14291300 }, + }, + { + { -3151181, -5046075, 9282714, 6866145, -31907062, -863023, -18940575, 15033784, 25105118, -7894876 }, + { -24326370, 15950226, -31801215, -14592823, -11662737, -5090925, 1573892, -2625887, 2198790, -15804619 }, + { -3099351, 10324967, -2241613, 7453183, -5446979, -2735503, -13812022, -16236442, -32461234, -12290683 }, + }, +}; + + +/* base[i][j] = (j+1)*256^i*B */ +static const ge_precomp base[32][8] = { + { + { + { 25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605 }, + { -12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378 }, + { -8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546 }, + }, + { + { -12815894, -12976347, -21581243, 11784320, -25355658, -2750717, -11717903, -3814571, -358445, -10211303 }, + { -21703237, 6903825, 27185491, 6451973, -29577724, -9554005, -15616551, 11189268, -26829678, -5319081 }, + { 26966642, 11152617, 32442495, 15396054, 14353839, -12752335, -3128826, -9541118, -15472047, -4166697 }, + }, + { + { 15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024 }, + { 16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574 }, + { 30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357 }, + }, + { + { -17036878, 13921892, 10945806, -6033431, 27105052, -16084379, -28926210, 15006023, 3284568, -6276540 }, + { 23599295, -8306047, -11193664, -7687416, 13236774, 10506355, 7464579, 9656445, 13059162, 10374397 }, + { 7798556, 16710257, 3033922, 2874086, 28997861, 2835604, 32406664, -3839045, -641708, -101325 }, + }, + { + { 10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380 }, + { 4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306 }, + { 19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942 }, + }, + { + { -15371964, -12862754, 32573250, 4720197, -26436522, 5875511, -19188627, -15224819, -9818940, -12085777 }, + { -8549212, 109983, 15149363, 2178705, 22900618, 4543417, 3044240, -15689887, 1762328, 14866737 }, + { -18199695, -15951423, -10473290, 1707278, -17185920, 3916101, -28236412, 3959421, 27914454, 4383652 }, + }, + { + { 5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766 }, + { -30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701 }, + { 28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300 }, + }, + { + { 14499471, -2729599, -33191113, -4254652, 28494862, 14271267, 30290735, 10876454, -33154098, 2381726 }, + { -7195431, -2655363, -14730155, 462251, -27724326, 3941372, -6236617, 3696005, -32300832, 15351955 }, + { 27431194, 8222322, 16448760, -3907995, -18707002, 11938355, -32961401, -2970515, 29551813, 10109425 }, + }, + }, + { + { + { -13657040, -13155431, -31283750, 11777098, 21447386, 6519384, -2378284, -1627556, 10092783, -4764171 }, + { 27939166, 14210322, 4677035, 16277044, -22964462, -12398139, -32508754, 12005538, -17810127, 12803510 }, + { 17228999, -15661624, -1233527, 300140, -1224870, -11714777, 30364213, -9038194, 18016357, 4397660 }, + }, + { + { -10958843, -7690207, 4776341, -14954238, 27850028, -15602212, -26619106, 14544525, -17477504, 982639 }, + { 29253598, 15796703, -2863982, -9908884, 10057023, 3163536, 7332899, -4120128, -21047696, 9934963 }, + { 5793303, 16271923, -24131614, -10116404, 29188560, 1206517, -14747930, 4559895, -30123922, -10897950 }, + }, + { + { -27643952, -11493006, 16282657, -11036493, 28414021, -15012264, 24191034, 4541697, -13338309, 5500568 }, + { 12650548, -1497113, 9052871, 11355358, -17680037, -8400164, -17430592, 12264343, 10874051, 13524335 }, + { 25556948, -3045990, 714651, 2510400, 23394682, -10415330, 33119038, 5080568, -22528059, 5376628 }, + }, + { + { -26088264, -4011052, -17013699, -3537628, -6726793, 1920897, -22321305, -9447443, 4535768, 1569007 }, + { -2255422, 14606630, -21692440, -8039818, 28430649, 8775819, -30494562, 3044290, 31848280, 12543772 }, + { -22028579, 2943893, -31857513, 6777306, 13784462, -4292203, -27377195, -2062731, 7718482, 14474653 }, + }, + { + { 2385315, 2454213, -22631320, 46603, -4437935, -15680415, 656965, -7236665, 24316168, -5253567 }, + { 13741529, 10911568, -33233417, -8603737, -20177830, -1033297, 33040651, -13424532, -20729456, 8321686 }, + { 21060490, -2212744, 15712757, -4336099, 1639040, 10656336, 23845965, -11874838, -9984458, 608372 }, + }, + { + { -13672732, -15087586, -10889693, -7557059, -6036909, 11305547, 1123968, -6780577, 27229399, 23887 }, + { -23244140, -294205, -11744728, 14712571, -29465699, -2029617, 12797024, -6440308, -1633405, 16678954 }, + { -29500620, 4770662, -16054387, 14001338, 7830047, 9564805, -1508144, -4795045, -17169265, 4904953 }, + }, + { + { 24059557, 14617003, 19037157, -15039908, 19766093, -14906429, 5169211, 16191880, 2128236, -4326833 }, + { -16981152, 4124966, -8540610, -10653797, 30336522, -14105247, -29806336, 916033, -6882542, -2986532 }, + { -22630907, 12419372, -7134229, -7473371, -16478904, 16739175, 285431, 2763829, 15736322, 4143876 }, + }, + { + { 2379352, 11839345, -4110402, -5988665, 11274298, 794957, 212801, -14594663, 23527084, -16458268 }, + { 33431127, -11130478, -17838966, -15626900, 8909499, 8376530, -32625340, 4087881, -15188911, -14416214 }, + { 1767683, 7197987, -13205226, -2022635, -13091350, 448826, 5799055, 4357868, -4774191, -16323038 }, + }, + }, + { + { + { 6721966, 13833823, -23523388, -1551314, 26354293, -11863321, 23365147, -3949732, 7390890, 2759800 }, + { 4409041, 2052381, 23373853, 10530217, 7676779, -12885954, 21302353, -4264057, 1244380, -12919645 }, + { -4421239, 7169619, 4982368, -2957590, 30256825, -2777540, 14086413, 9208236, 15886429, 16489664 }, + }, + { + { 1996075, 10375649, 14346367, 13311202, -6874135, -16438411, -13693198, 398369, -30606455, -712933 }, + { -25307465, 9795880, -2777414, 14878809, -33531835, 14780363, 13348553, 12076947, -30836462, 5113182 }, + { -17770784, 11797796, 31950843, 13929123, -25888302, 12288344, -30341101, -7336386, 13847711, 5387222 }, + }, + { + { -18582163, -3416217, 17824843, -2340966, 22744343, -10442611, 8763061, 3617786, -19600662, 10370991 }, + { 20246567, -14369378, 22358229, -543712, 18507283, -10413996, 14554437, -8746092, 32232924, 16763880 }, + { 9648505, 10094563, 26416693, 14745928, -30374318, -6472621, 11094161, 15689506, 3140038, -16510092 }, + }, + { + { -16160072, 5472695, 31895588, 4744994, 8823515, 10365685, -27224800, 9448613, -28774454, 366295 }, + { 19153450, 11523972, -11096490, -6503142, -24647631, 5420647, 28344573, 8041113, 719605, 11671788 }, + { 8678025, 2694440, -6808014, 2517372, 4964326, 11152271, -15432916, -15266516, 27000813, -10195553 }, + }, + { + { -15157904, 7134312, 8639287, -2814877, -7235688, 10421742, 564065, 5336097, 6750977, -14521026 }, + { 11836410, -3979488, 26297894, 16080799, 23455045, 15735944, 1695823, -8819122, 8169720, 16220347 }, + { -18115838, 8653647, 17578566, -6092619, -8025777, -16012763, -11144307, -2627664, -5990708, -14166033 }, + }, + { + { -23308498, -10968312, 15213228, -10081214, -30853605, -11050004, 27884329, 2847284, 2655861, 1738395 }, + { -27537433, -14253021, -25336301, -8002780, -9370762, 8129821, 21651608, -3239336, -19087449, -11005278 }, + { 1533110, 3437855, 23735889, 459276, 29970501, 11335377, 26030092, 5821408, 10478196, 8544890 }, + }, + { + { 32173121, -16129311, 24896207, 3921497, 22579056, -3410854, 19270449, 12217473, 17789017, -3395995 }, + { -30552961, -2228401, -15578829, -10147201, 13243889, 517024, 15479401, -3853233, 30460520, 1052596 }, + { -11614875, 13323618, 32618793, 8175907, -15230173, 12596687, 27491595, -4612359, 3179268, -9478891 }, + }, + { + { 31947069, -14366651, -4640583, -15339921, -15125977, -6039709, -14756777, -16411740, 19072640, -9511060 }, + { 11685058, 11822410, 3158003, -13952594, 33402194, -4165066, 5977896, -5215017, 473099, 5040608 }, + { -20290863, 8198642, -27410132, 11602123, 1290375, -2799760, 28326862, 1721092, -19558642, -3131606 }, + }, + }, + { + { + { 7881532, 10687937, 7578723, 7738378, -18951012, -2553952, 21820786, 8076149, -27868496, 11538389 }, + { -19935666, 3899861, 18283497, -6801568, -15728660, -11249211, 8754525, 7446702, -5676054, 5797016 }, + { -11295600, -3793569, -15782110, -7964573, 12708869, -8456199, 2014099, -9050574, -2369172, -5877341 }, + }, + { + { -22472376, -11568741, -27682020, 1146375, 18956691, 16640559, 1192730, -3714199, 15123619, 10811505 }, + { 14352098, -3419715, -18942044, 10822655, 32750596, 4699007, -70363, 15776356, -28886779, -11974553 }, + { -28241164, -8072475, -4978962, -5315317, 29416931, 1847569, -20654173, -16484855, 4714547, -9600655 }, + }, + { + { 15200332, 8368572, 19679101, 15970074, -31872674, 1959451, 24611599, -4543832, -11745876, 12340220 }, + { 12876937, -10480056, 33134381, 6590940, -6307776, 14872440, 9613953, 8241152, 15370987, 9608631 }, + { -4143277, -12014408, 8446281, -391603, 4407738, 13629032, -7724868, 15866074, -28210621, -8814099 }, + }, + { + { 26660628, -15677655, 8393734, 358047, -7401291, 992988, -23904233, 858697, 20571223, 8420556 }, + { 14620715, 13067227, -15447274, 8264467, 14106269, 15080814, 33531827, 12516406, -21574435, -12476749 }, + { 236881, 10476226, 57258, -14677024, 6472998, 2466984, 17258519, 7256740, 8791136, 15069930 }, + }, + { + { 1276410, -9371918, 22949635, -16322807, -23493039, -5702186, 14711875, 4874229, -30663140, -2331391 }, + { 5855666, 4990204, -13711848, 7294284, -7804282, 1924647, -1423175, -7912378, -33069337, 9234253 }, + { 20590503, -9018988, 31529744, -7352666, -2706834, 10650548, 31559055, -11609587, 18979186, 13396066 }, + }, + { + { 24474287, 4968103, 22267082, 4407354, 24063882, -8325180, -18816887, 13594782, 33514650, 7021958 }, + { -11566906, -6565505, -21365085, 15928892, -26158305, 4315421, -25948728, -3916677, -21480480, 12868082 }, + { -28635013, 13504661, 19988037, -2132761, 21078225, 6443208, -21446107, 2244500, -12455797, -8089383 }, + }, + { + { -30595528, 13793479, -5852820, 319136, -25723172, -6263899, 33086546, 8957937, -15233648, 5540521 }, + { -11630176, -11503902, -8119500, -7643073, 2620056, 1022908, -23710744, -1568984, -16128528, -14962807 }, + { 23152971, 775386, 27395463, 14006635, -9701118, 4649512, 1689819, 892185, -11513277, -15205948 }, + }, + { + { 9770129, 9586738, 26496094, 4324120, 1556511, -3550024, 27453819, 4763127, -19179614, 5867134 }, + { -32765025, 1927590, 31726409, -4753295, 23962434, -16019500, 27846559, 5931263, -29749703, -16108455 }, + { 27461885, -2977536, 22380810, 1815854, -23033753, -3031938, 7283490, -15148073, -19526700, 7734629 }, + }, + }, + { + { + { -8010264, -9590817, -11120403, 6196038, 29344158, -13430885, 7585295, -3176626, 18549497, 15302069 }, + { -32658337, -6171222, -7672793, -11051681, 6258878, 13504381, 10458790, -6418461, -8872242, 8424746 }, + { 24687205, 8613276, -30667046, -3233545, 1863892, -1830544, 19206234, 7134917, -11284482, -828919 }, + }, + { + { 11334899, -9218022, 8025293, 12707519, 17523892, -10476071, 10243738, -14685461, -5066034, 16498837 }, + { 8911542, 6887158, -9584260, -6958590, 11145641, -9543680, 17303925, -14124238, 6536641, 10543906 }, + { -28946384, 15479763, -17466835, 568876, -1497683, 11223454, -2669190, -16625574, -27235709, 8876771 }, + }, + { + { -25742899, -12566864, -15649966, -846607, -33026686, -796288, -33481822, 15824474, -604426, -9039817 }, + { 10330056, 70051, 7957388, -9002667, 9764902, 15609756, 27698697, -4890037, 1657394, 3084098 }, + { 10477963, -7470260, 12119566, -13250805, 29016247, -5365589, 31280319, 14396151, -30233575, 15272409 }, + }, + { + { -12288309, 3169463, 28813183, 16658753, 25116432, -5630466, -25173957, -12636138, -25014757, 1950504 }, + { -26180358, 9489187, 11053416, -14746161, -31053720, 5825630, -8384306, -8767532, 15341279, 8373727 }, + { 28685821, 7759505, -14378516, -12002860, -31971820, 4079242, 298136, -10232602, -2878207, 15190420 }, + }, + { + { -32932876, 13806336, -14337485, -15794431, -24004620, 10940928, 8669718, 2742393, -26033313, -6875003 }, + { -1580388, -11729417, -25979658, -11445023, -17411874, -10912854, 9291594, -16247779, -12154742, 6048605 }, + { -30305315, 14843444, 1539301, 11864366, 20201677, 1900163, 13934231, 5128323, 11213262, 9168384 }, + }, + { + { -26280513, 11007847, 19408960, -940758, -18592965, -4328580, -5088060, -11105150, 20470157, -16398701 }, + { -23136053, 9282192, 14855179, -15390078, -7362815, -14408560, -22783952, 14461608, 14042978, 5230683 }, + { 29969567, -2741594, -16711867, -8552442, 9175486, -2468974, 21556951, 3506042, -5933891, -12449708 }, + }, + { + { -3144746, 8744661, 19704003, 4581278, -20430686, 6830683, -21284170, 8971513, -28539189, 15326563 }, + { -19464629, 10110288, -17262528, -3503892, -23500387, 1355669, -15523050, 15300988, -20514118, 9168260 }, + { -5353335, 4488613, -23803248, 16314347, 7780487, -15638939, -28948358, 9601605, 33087103, -9011387 }, + }, + { + { -19443170, -15512900, -20797467, -12445323, -29824447, 10229461, -27444329, -15000531, -5996870, 15664672 }, + { 23294591, -16632613, -22650781, -8470978, 27844204, 11461195, 13099750, -2460356, 18151676, 13417686 }, + { -24722913, -4176517, -31150679, 5988919, -26858785, 6685065, 1661597, -12551441, 15271676, -15452665 }, + }, + }, + { + { + { 11433042, -13228665, 8239631, -5279517, -1985436, -725718, -18698764, 2167544, -6921301, -13440182 }, + { -31436171, 15575146, 30436815, 12192228, -22463353, 9395379, -9917708, -8638997, 12215110, 12028277 }, + { 14098400, 6555944, 23007258, 5757252, -15427832, -12950502, 30123440, 4617780, -16900089, -655628 }, + }, + { + { -4026201, -15240835, 11893168, 13718664, -14809462, 1847385, -15819999, 10154009, 23973261, -12684474 }, + { -26531820, -3695990, -1908898, 2534301, -31870557, -16550355, 18341390, -11419951, 32013174, -10103539 }, + { -25479301, 10876443, -11771086, -14625140, -12369567, 1838104, 21911214, 6354752, 4425632, -837822 }, + }, + { + { -10433389, -14612966, 22229858, -3091047, -13191166, 776729, -17415375, -12020462, 4725005, 14044970 }, + { 19268650, -7304421, 1555349, 8692754, -21474059, -9910664, 6347390, -1411784, -19522291, -16109756 }, + { -24864089, 12986008, -10898878, -5558584, -11312371, -148526, 19541418, 8180106, 9282262, 10282508 }, + }, + { + { -26205082, 4428547, -8661196, -13194263, 4098402, -14165257, 15522535, 8372215, 5542595, -10702683 }, + { -10562541, 14895633, 26814552, -16673850, -17480754, -2489360, -2781891, 6993761, -18093885, 10114655 }, + { -20107055, -929418, 31422704, 10427861, -7110749, 6150669, -29091755, -11529146, 25953725, -106158 }, + }, + { + { -4234397, -8039292, -9119125, 3046000, 2101609, -12607294, 19390020, 6094296, -3315279, 12831125 }, + { -15998678, 7578152, 5310217, 14408357, -33548620, -224739, 31575954, 6326196, 7381791, -2421839 }, + { -20902779, 3296811, 24736065, -16328389, 18374254, 7318640, 6295303, 8082724, -15362489, 12339664 }, + }, + { + { 27724736, 2291157, 6088201, -14184798, 1792727, 5857634, 13848414, 15768922, 25091167, 14856294 }, + { -18866652, 8331043, 24373479, 8541013, -701998, -9269457, 12927300, -12695493, -22182473, -9012899 }, + { -11423429, -5421590, 11632845, 3405020, 30536730, -11674039, -27260765, 13866390, 30146206, 9142070 }, + }, + { + { 3924129, -15307516, -13817122, -10054960, 12291820, -668366, -27702774, 9326384, -8237858, 4171294 }, + { -15921940, 16037937, 6713787, 16606682, -21612135, 2790944, 26396185, 3731949, 345228, -5462949 }, + { -21327538, 13448259, 25284571, 1143661, 20614966, -8849387, 2031539, -12391231, -16253183, -13582083 }, + }, + { + { 31016211, -16722429, 26371392, -14451233, -5027349, 14854137, 17477601, 3842657, 28012650, -16405420 }, + { -5075835, 9368966, -8562079, -4600902, -15249953, 6970560, -9189873, 16292057, -8867157, 3507940 }, + { 29439664, 3537914, 23333589, 6997794, -17555561, -11018068, -15209202, -15051267, -9164929, 6580396 }, + }, + }, + { + { + { -12185861, -7679788, 16438269, 10826160, -8696817, -6235611, 17860444, -9273846, -2095802, 9304567 }, + { 20714564, -4336911, 29088195, 7406487, 11426967, -5095705, 14792667, -14608617, 5289421, -477127 }, + { -16665533, -10650790, -6160345, -13305760, 9192020, -1802462, 17271490, 12349094, 26939669, -3752294 }, + }, + { + { -12889898, 9373458, 31595848, 16374215, 21471720, 13221525, -27283495, -12348559, -3698806, 117887 }, + { 22263325, -6560050, 3984570, -11174646, -15114008, -566785, 28311253, 5358056, -23319780, 541964 }, + { 16259219, 3261970, 2309254, -15534474, -16885711, -4581916, 24134070, -16705829, -13337066, -13552195 }, + }, + { + { 9378160, -13140186, -22845982, -12745264, 28198281, -7244098, -2399684, -717351, 690426, 14876244 }, + { 24977353, -314384, -8223969, -13465086, 28432343, -1176353, -13068804, -12297348, -22380984, 6618999 }, + { -1538174, 11685646, 12944378, 13682314, -24389511, -14413193, 8044829, -13817328, 32239829, -5652762 }, + }, + { + { -18603066, 4762990, -926250, 8885304, -28412480, -3187315, 9781647, -10350059, 32779359, 5095274 }, + { -33008130, -5214506, -32264887, -3685216, 9460461, -9327423, -24601656, 14506724, 21639561, -2630236 }, + { -16400943, -13112215, 25239338, 15531969, 3987758, -4499318, -1289502, -6863535, 17874574, 558605 }, + }, + { + { -13600129, 10240081, 9171883, 16131053, -20869254, 9599700, 33499487, 5080151, 2085892, 5119761 }, + { -22205145, -2519528, -16381601, 414691, -25019550, 2170430, 30634760, -8363614, -31999993, -5759884 }, + { -6845704, 15791202, 8550074, -1312654, 29928809, -12092256, 27534430, -7192145, -22351378, 12961482 }, + }, + { + { -24492060, -9570771, 10368194, 11582341, -23397293, -2245287, 16533930, 8206996, -30194652, -5159638 }, + { -11121496, -3382234, 2307366, 6362031, -135455, 8868177, -16835630, 7031275, 7589640, 8945490 }, + { -32152748, 8917967, 6661220, -11677616, -1192060, -15793393, 7251489, -11182180, 24099109, -14456170 }, + }, + { + { 5019558, -7907470, 4244127, -14714356, -26933272, 6453165, -19118182, -13289025, -6231896, -10280736 }, + { 10853594, 10721687, 26480089, 5861829, -22995819, 1972175, -1866647, -10557898, -3363451, -6441124 }, + { -17002408, 5906790, 221599, -6563147, 7828208, -13248918, 24362661, -2008168, -13866408, 7421392 }, + }, + { + { 8139927, -6546497, 32257646, -5890546, 30375719, 1886181, -21175108, 15441252, 28826358, -4123029 }, + { 6267086, 9695052, 7709135, -16603597, -32869068, -1886135, 14795160, -7840124, 13746021, -1742048 }, + { 28584902, 7787108, -6732942, -15050729, 22846041, -7571236, -3181936, -363524, 4771362, -8419958 }, + }, + }, + { + { + { 24949256, 6376279, -27466481, -8174608, -18646154, -9930606, 33543569, -12141695, 3569627, 11342593 }, + { 26514989, 4740088, 27912651, 3697550, 19331575, -11472339, 6809886, 4608608, 7325975, -14801071 }, + { -11618399, -14554430, -24321212, 7655128, -1369274, 5214312, -27400540, 10258390, -17646694, -8186692 }, + }, + { + { 11431204, 15823007, 26570245, 14329124, 18029990, 4796082, -31446179, 15580664, 9280358, -3973687 }, + { -160783, -10326257, -22855316, -4304997, -20861367, -13621002, -32810901, -11181622, -15545091, 4387441 }, + { -20799378, 12194512, 3937617, -5805892, -27154820, 9340370, -24513992, 8548137, 20617071, -7482001 }, + }, + { + { -938825, -3930586, -8714311, 16124718, 24603125, -6225393, -13775352, -11875822, 24345683, 10325460 }, + { -19855277, -1568885, -22202708, 8714034, 14007766, 6928528, 16318175, -1010689, 4766743, 3552007 }, + { -21751364, -16730916, 1351763, -803421, -4009670, 3950935, 3217514, 14481909, 10988822, -3994762 }, + }, + { + { 15564307, -14311570, 3101243, 5684148, 30446780, -8051356, 12677127, -6505343, -8295852, 13296005 }, + { -9442290, 6624296, -30298964, -11913677, -4670981, -2057379, 31521204, 9614054, -30000824, 12074674 }, + { 4771191, -135239, 14290749, -13089852, 27992298, 14998318, -1413936, -1556716, 29832613, -16391035 }, + }, + { + { 7064884, -7541174, -19161962, -5067537, -18891269, -2912736, 25825242, 5293297, -27122660, 13101590 }, + { -2298563, 2439670, -7466610, 1719965, -27267541, -16328445, 32512469, -5317593, -30356070, -4190957 }, + { -30006540, 10162316, -33180176, 3981723, -16482138, -13070044, 14413974, 9515896, 19568978, 9628812 }, + }, + { + { 33053803, 199357, 15894591, 1583059, 27380243, -4580435, -17838894, -6106839, -6291786, 3437740 }, + { -18978877, 3884493, 19469877, 12726490, 15913552, 13614290, -22961733, 70104, 7463304, 4176122 }, + { -27124001, 10659917, 11482427, -16070381, 12771467, -6635117, -32719404, -5322751, 24216882, 5944158 }, + }, + { + { 8894125, 7450974, -2664149, -9765752, -28080517, -12389115, 19345746, 14680796, 11632993, 5847885 }, + { 26942781, -2315317, 9129564, -4906607, 26024105, 11769399, -11518837, 6367194, -9727230, 4782140 }, + { 19916461, -4828410, -22910704, -11414391, 25606324, -5972441, 33253853, 8220911, 6358847, -1873857 }, + }, + { + { 801428, -2081702, 16569428, 11065167, 29875704, 96627, 7908388, -4480480, -13538503, 1387155 }, + { 19646058, 5720633, -11416706, 12814209, 11607948, 12749789, 14147075, 15156355, -21866831, 11835260 }, + { 19299512, 1155910, 28703737, 14890794, 2925026, 7269399, 26121523, 15467869, -26560550, 5052483 }, + }, + }, + { + { + { -3017432, 10058206, 1980837, 3964243, 22160966, 12322533, -6431123, -12618185, 12228557, -7003677 }, + { 32944382, 14922211, -22844894, 5188528, 21913450, -8719943, 4001465, 13238564, -6114803, 8653815 }, + { 22865569, -4652735, 27603668, -12545395, 14348958, 8234005, 24808405, 5719875, 28483275, 2841751 }, + }, + { + { -16420968, -1113305, -327719, -12107856, 21886282, -15552774, -1887966, -315658, 19932058, -12739203 }, + { -11656086, 10087521, -8864888, -5536143, -19278573, -3055912, 3999228, 13239134, -4777469, -13910208 }, + { 1382174, -11694719, 17266790, 9194690, -13324356, 9720081, 20403944, 11284705, -14013818, 3093230 }, + }, + { + { 16650921, -11037932, -1064178, 1570629, -8329746, 7352753, -302424, 16271225, -24049421, -6691850 }, + { -21911077, -5927941, -4611316, -5560156, -31744103, -10785293, 24123614, 15193618, -21652117, -16739389 }, + { -9935934, -4289447, -25279823, 4372842, 2087473, 10399484, 31870908, 14690798, 17361620, 11864968 }, + }, + { + { -11307610, 6210372, 13206574, 5806320, -29017692, -13967200, -12331205, -7486601, -25578460, -16240689 }, + { 14668462, -12270235, 26039039, 15305210, 25515617, 4542480, 10453892, 6577524, 9145645, -6443880 }, + { 5974874, 3053895, -9433049, -10385191, -31865124, 3225009, -7972642, 3936128, -5652273, -3050304 }, + }, + { + { 30625386, -4729400, -25555961, -12792866, -20484575, 7695099, 17097188, -16303496, -27999779, 1803632 }, + { -3553091, 9865099, -5228566, 4272701, -5673832, -16689700, 14911344, 12196514, -21405489, 7047412 }, + { 20093277, 9920966, -11138194, -5343857, 13161587, 12044805, -32856851, 4124601, -32343828, -10257566 }, + }, + { + { -20788824, 14084654, -13531713, 7842147, 19119038, -13822605, 4752377, -8714640, -21679658, 2288038 }, + { -26819236, -3283715, 29965059, 3039786, -14473765, 2540457, 29457502, 14625692, -24819617, 12570232 }, + { -1063558, -11551823, 16920318, 12494842, 1278292, -5869109, -21159943, -3498680, -11974704, 4724943 }, + }, + { + { 17960970, -11775534, -4140968, -9702530, -8876562, -1410617, -12907383, -8659932, -29576300, 1903856 }, + { 23134274, -14279132, -10681997, -1611936, 20684485, 15770816, -12989750, 3190296, 26955097, 14109738 }, + { 15308788, 5320727, -30113809, -14318877, 22902008, 7767164, 29425325, -11277562, 31960942, 11934971 }, + }, + { + { -27395711, 8435796, 4109644, 12222639, -24627868, 14818669, 20638173, 4875028, 10491392, 1379718 }, + { -13159415, 9197841, 3875503, -8936108, -1383712, -5879801, 33518459, 16176658, 21432314, 12180697 }, + { -11787308, 11500838, 13787581, -13832590, -22430679, 10140205, 1465425, 12689540, -10301319, -13872883 }, + }, + }, + { + { + { 5414091, -15386041, -21007664, 9643570, 12834970, 1186149, -2622916, -1342231, 26128231, 6032912 }, + { -26337395, -13766162, 32496025, -13653919, 17847801, -12669156, 3604025, 8316894, -25875034, -10437358 }, + { 3296484, 6223048, 24680646, -12246460, -23052020, 5903205, -8862297, -4639164, 12376617, 3188849 }, + }, + { + { 29190488, -14659046, 27549113, -1183516, 3520066, -10697301, 32049515, -7309113, -16109234, -9852307 }, + { -14744486, -9309156, 735818, -598978, -20407687, -5057904, 25246078, -15795669, 18640741, -960977 }, + { -6928835, -16430795, 10361374, 5642961, 4910474, 12345252, -31638386, -494430, 10530747, 1053335 }, + }, + { + { -29265967, -14186805, -13538216, -12117373, -19457059, -10655384, -31462369, -2948985, 24018831, 15026644 }, + { -22592535, -3145277, -2289276, 5953843, -13440189, 9425631, 25310643, 13003497, -2314791, -15145616 }, + { -27419985, -603321, -8043984, -1669117, -26092265, 13987819, -27297622, 187899, -23166419, -2531735 }, + }, + { + { -21744398, -13810475, 1844840, 5021428, -10434399, -15911473, 9716667, 16266922, -5070217, 726099 }, + { 29370922, -6053998, 7334071, -15342259, 9385287, 2247707, -13661962, -4839461, 30007388, -15823341 }, + { -936379, 16086691, 23751945, -543318, -1167538, -5189036, 9137109, 730663, 9835848, 4555336 }, + }, + { + { -23376435, 1410446, -22253753, -12899614, 30867635, 15826977, 17693930, 544696, -11985298, 12422646 }, + { 31117226, -12215734, -13502838, 6561947, -9876867, -12757670, -5118685, -4096706, 29120153, 13924425 }, + { -17400879, -14233209, 19675799, -2734756, -11006962, -5858820, -9383939, -11317700, 7240931, -237388 }, + }, + { + { -31361739, -11346780, -15007447, -5856218, -22453340, -12152771, 1222336, 4389483, 3293637, -15551743 }, + { -16684801, -14444245, 11038544, 11054958, -13801175, -3338533, -24319580, 7733547, 12796905, -6335822 }, + { -8759414, -10817836, -25418864, 10783769, -30615557, -9746811, -28253339, 3647836, 3222231, -11160462 }, + }, + { + { 18606113, 1693100, -25448386, -15170272, 4112353, 10045021, 23603893, -2048234, -7550776, 2484985 }, + { 9255317, -3131197, -12156162, -1004256, 13098013, -9214866, 16377220, -2102812, -19802075, -3034702 }, + { -22729289, 7496160, -5742199, 11329249, 19991973, -3347502, -31718148, 9936966, -30097688, -10618797 }, + }, + { + { 21878590, -5001297, 4338336, 13643897, -3036865, 13160960, 19708896, 5415497, -7360503, -4109293 }, + { 27736861, 10103576, 12500508, 8502413, -3413016, -9633558, 10436918, -1550276, -23659143, -8132100 }, + { 19492550, -12104365, -29681976, -852630, -3208171, 12403437, 30066266, 8367329, 13243957, 8709688 }, + }, + }, + { + { + { 12015105, 2801261, 28198131, 10151021, 24818120, -4743133, -11194191, -5645734, 5150968, 7274186 }, + { 2831366, -12492146, 1478975, 6122054, 23825128, -12733586, 31097299, 6083058, 31021603, -9793610 }, + { -2529932, -2229646, 445613, 10720828, -13849527, -11505937, -23507731, 16354465, 15067285, -14147707 }, + }, + { + { 7840942, 14037873, -33364863, 15934016, -728213, -3642706, 21403988, 1057586, -19379462, -12403220 }, + { 915865, -16469274, 15608285, -8789130, -24357026, 6060030, -17371319, 8410997, -7220461, 16527025 }, + { 32922597, -556987, 20336074, -16184568, 10903705, -5384487, 16957574, 52992, 23834301, 6588044 }, + }, + { + { 32752030, 11232950, 3381995, -8714866, 22652988, -10744103, 17159699, 16689107, -20314580, -1305992 }, + { -4689649, 9166776, -25710296, -10847306, 11576752, 12733943, 7924251, -2752281, 1976123, -7249027 }, + { 21251222, 16309901, -2983015, -6783122, 30810597, 12967303, 156041, -3371252, 12331345, -8237197 }, + }, + { + { 8651614, -4477032, -16085636, -4996994, 13002507, 2950805, 29054427, -5106970, 10008136, -4667901 }, + { 31486080, 15114593, -14261250, 12951354, 14369431, -7387845, 16347321, -13662089, 8684155, -10532952 }, + { 19443825, 11385320, 24468943, -9659068, -23919258, 2187569, -26263207, -6086921, 31316348, 14219878 }, + }, + { + { -28594490, 1193785, 32245219, 11392485, 31092169, 15722801, 27146014, 6992409, 29126555, 9207390 }, + { 32382935, 1110093, 18477781, 11028262, -27411763, -7548111, -4980517, 10843782, -7957600, -14435730 }, + { 2814918, 7836403, 27519878, -7868156, -20894015, -11553689, -21494559, 8550130, 28346258, 1994730 }, + }, + { + { -19578299, 8085545, -14000519, -3948622, 2785838, -16231307, -19516951, 7174894, 22628102, 8115180 }, + { -30405132, 955511, -11133838, -15078069, -32447087, -13278079, -25651578, 3317160, -9943017, 930272 }, + { -15303681, -6833769, 28856490, 1357446, 23421993, 1057177, 24091212, -1388970, -22765376, -10650715 }, + }, + { + { -22751231, -5303997, -12907607, -12768866, -15811511, -7797053, -14839018, -16554220, -1867018, 8398970 }, + { -31969310, 2106403, -4736360, 1362501, 12813763, 16200670, 22981545, -6291273, 18009408, -15772772 }, + { -17220923, -9545221, -27784654, 14166835, 29815394, 7444469, 29551787, -3727419, 19288549, 1325865 }, + }, + { + { 15100157, -15835752, -23923978, -1005098, -26450192, 15509408, 12376730, -3479146, 33166107, -8042750 }, + { 20909231, 13023121, -9209752, 16251778, -5778415, -8094914, 12412151, 10018715, 2213263, -13878373 }, + { 32529814, -11074689, 30361439, -16689753, -9135940, 1513226, 22922121, 6382134, -5766928, 8371348 }, + }, + }, + { + { + { 9923462, 11271500, 12616794, 3544722, -29998368, -1721626, 12891687, -8193132, -26442943, 10486144 }, + { -22597207, -7012665, 8587003, -8257861, 4084309, -12970062, 361726, 2610596, -23921530, -11455195 }, + { 5408411, -1136691, -4969122, 10561668, 24145918, 14240566, 31319731, -4235541, 19985175, -3436086 }, + }, + { + { -13994457, 16616821, 14549246, 3341099, 32155958, 13648976, -17577068, 8849297, 65030, 8370684 }, + { -8320926, -12049626, 31204563, 5839400, -20627288, -1057277, -19442942, 6922164, 12743482, -9800518 }, + { -2361371, 12678785, 28815050, 4759974, -23893047, 4884717, 23783145, 11038569, 18800704, 255233 }, + }, + { + { -5269658, -1773886, 13957886, 7990715, 23132995, 728773, 13393847, 9066957, 19258688, -14753793 }, + { -2936654, -10827535, -10432089, 14516793, -3640786, 4372541, -31934921, 2209390, -1524053, 2055794 }, + { 580882, 16705327, 5468415, -2683018, -30926419, -14696000, -7203346, -8994389, -30021019, 7394435 }, + }, + { + { 23838809, 1822728, -15738443, 15242727, 8318092, -3733104, -21672180, -3492205, -4821741, 14799921 }, + { 13345610, 9759151, 3371034, -16137791, 16353039, 8577942, 31129804, 13496856, -9056018, 7402518 }, + { 2286874, -4435931, -20042458, -2008336, -13696227, 5038122, 11006906, -15760352, 8205061, 1607563 }, + }, + { + { 14414086, -8002132, 3331830, -3208217, 22249151, -5594188, 18364661, -2906958, 30019587, -9029278 }, + { -27688051, 1585953, -10775053, 931069, -29120221, -11002319, -14410829, 12029093, 9944378, 8024 }, + { 4368715, -3709630, 29874200, -15022983, -20230386, -11410704, -16114594, -999085, -8142388, 5640030 }, + }, + { + { 10299610, 13746483, 11661824, 16234854, 7630238, 5998374, 9809887, -16694564, 15219798, -14327783 }, + { 27425505, -5719081, 3055006, 10660664, 23458024, 595578, -15398605, -1173195, -18342183, 9742717 }, + { 6744077, 2427284, 26042789, 2720740, -847906, 1118974, 32324614, 7406442, 12420155, 1994844 }, + }, + { + { 14012521, -5024720, -18384453, -9578469, -26485342, -3936439, -13033478, -10909803, 24319929, -6446333 }, + { 16412690, -4507367, 10772641, 15929391, -17068788, -4658621, 10555945, -10484049, -30102368, -4739048 }, + { 22397382, -7767684, -9293161, -12792868, 17166287, -9755136, -27333065, 6199366, 21880021, -12250760 }, + }, + { + { -4283307, 5368523, -31117018, 8163389, -30323063, 3209128, 16557151, 8890729, 8840445, 4957760 }, + { -15447727, 709327, -6919446, -10870178, -29777922, 6522332, -21720181, 12130072, -14796503, 5005757 }, + { -2114751, -14308128, 23019042, 15765735, -25269683, 6002752, 10183197, -13239326, -16395286, -2176112 }, + }, + }, + { + { + { -19025756, 1632005, 13466291, -7995100, -23640451, 16573537, -32013908, -3057104, 22208662, 2000468 }, + { 3065073, -1412761, -25598674, -361432, -17683065, -5703415, -8164212, 11248527, -3691214, -7414184 }, + { 10379208, -6045554, 8877319, 1473647, -29291284, -12507580, 16690915, 2553332, -3132688, 16400289 }, + }, + { + { 15716668, 1254266, -18472690, 7446274, -8448918, 6344164, -22097271, -7285580, 26894937, 9132066 }, + { 24158887, 12938817, 11085297, -8177598, -28063478, -4457083, -30576463, 64452, -6817084, -2692882 }, + { 13488534, 7794716, 22236231, 5989356, 25426474, -12578208, 2350710, -3418511, -4688006, 2364226 }, + }, + { + { 16335052, 9132434, 25640582, 6678888, 1725628, 8517937, -11807024, -11697457, 15445875, -7798101 }, + { 29004207, -7867081, 28661402, -640412, -12794003, -7943086, 31863255, -4135540, -278050, -15759279 }, + { -6122061, -14866665, -28614905, 14569919, -10857999, -3591829, 10343412, -6976290, -29828287, -10815811 }, + }, + { + { 27081650, 3463984, 14099042, -4517604, 1616303, -6205604, 29542636, 15372179, 17293797, 960709 }, + { 20263915, 11434237, -5765435, 11236810, 13505955, -10857102, -16111345, 6493122, -19384511, 7639714 }, + { -2830798, -14839232, 25403038, -8215196, -8317012, -16173699, 18006287, -16043750, 29994677, -15808121 }, + }, + { + { 9769828, 5202651, -24157398, -13631392, -28051003, -11561624, -24613141, -13860782, -31184575, 709464 }, + { 12286395, 13076066, -21775189, -1176622, -25003198, 4057652, -32018128, -8890874, 16102007, 13205847 }, + { 13733362, 5599946, 10557076, 3195751, -5557991, 8536970, -25540170, 8525972, 10151379, 10394400 }, + }, + { + { 4024660, -16137551, 22436262, 12276534, -9099015, -2686099, 19698229, 11743039, -33302334, 8934414 }, + { -15879800, -4525240, -8580747, -2934061, 14634845, -698278, -9449077, 3137094, -11536886, 11721158 }, + { 17555939, -5013938, 8268606, 2331751, -22738815, 9761013, 9319229, 8835153, -9205489, -1280045 }, + }, + { + { -461409, -7830014, 20614118, 16688288, -7514766, -4807119, 22300304, 505429, 6108462, -6183415 }, + { -5070281, 12367917, -30663534, 3234473, 32617080, -8422642, 29880583, -13483331, -26898490, -7867459 }, + { -31975283, 5726539, 26934134, 10237677, -3173717, -605053, 24199304, 3795095, 7592688, -14992079 }, + }, + { + { 21594432, -14964228, 17466408, -4077222, 32537084, 2739898, 6407723, 12018833, -28256052, 4298412 }, + { -20650503, -11961496, -27236275, 570498, 3767144, -1717540, 13891942, -1569194, 13717174, 10805743 }, + { -14676630, -15644296, 15287174, 11927123, 24177847, -8175568, -796431, 14860609, -26938930, -5863836 }, + }, + }, + { + { + { 12962541, 5311799, -10060768, 11658280, 18855286, -7954201, 13286263, -12808704, -4381056, 9882022 }, + { 18512079, 11319350, -20123124, 15090309, 18818594, 5271736, -22727904, 3666879, -23967430, -3299429 }, + { -6789020, -3146043, 16192429, 13241070, 15898607, -14206114, -10084880, -6661110, -2403099, 5276065 }, + }, + { + { 30169808, -5317648, 26306206, -11750859, 27814964, 7069267, 7152851, 3684982, 1449224, 13082861 }, + { 10342826, 3098505, 2119311, 193222, 25702612, 12233820, 23697382, 15056736, -21016438, -8202000 }, + { -33150110, 3261608, 22745853, 7948688, 19370557, -15177665, -26171976, 6482814, -10300080, -11060101 }, + }, + { + { 32869458, -5408545, 25609743, 15678670, -10687769, -15471071, 26112421, 2521008, -22664288, 6904815 }, + { 29506923, 4457497, 3377935, -9796444, -30510046, 12935080, 1561737, 3841096, -29003639, -6657642 }, + { 10340844, -6630377, -18656632, -2278430, 12621151, -13339055, 30878497, -11824370, -25584551, 5181966 }, + }, + { + { 25940115, -12658025, 17324188, -10307374, -8671468, 15029094, 24396252, -16450922, -2322852, -12388574 }, + { -21765684, 9916823, -1300409, 4079498, -1028346, 11909559, 1782390, 12641087, 20603771, -6561742 }, + { -18882287, -11673380, 24849422, 11501709, 13161720, -4768874, 1925523, 11914390, 4662781, 7820689 }, + }, + { + { 12241050, -425982, 8132691, 9393934, 32846760, -1599620, 29749456, 12172924, 16136752, 15264020 }, + { -10349955, -14680563, -8211979, 2330220, -17662549, -14545780, 10658213, 6671822, 19012087, 3772772 }, + { 3753511, -3421066, 10617074, 2028709, 14841030, -6721664, 28718732, -15762884, 20527771, 12988982 }, + }, + { + { -14822485, -5797269, -3707987, 12689773, -898983, -10914866, -24183046, -10564943, 3299665, -12424953 }, + { -16777703, -15253301, -9642417, 4978983, 3308785, 8755439, 6943197, 6461331, -25583147, 8991218 }, + { -17226263, 1816362, -1673288, -6086439, 31783888, -8175991, -32948145, 7417950, -30242287, 1507265 }, + }, + { + { 29692663, 6829891, -10498800, 4334896, 20945975, -11906496, -28887608, 8209391, 14606362, -10647073 }, + { -3481570, 8707081, 32188102, 5672294, 22096700, 1711240, -33020695, 9761487, 4170404, -2085325 }, + { -11587470, 14855945, -4127778, -1531857, -26649089, 15084046, 22186522, 16002000, -14276837, -8400798 }, + }, + { + { -4811456, 13761029, -31703877, -2483919, -3312471, 7869047, -7113572, -9620092, 13240845, 10965870 }, + { -7742563, -8256762, -14768334, -13656260, -23232383, 12387166, 4498947, 14147411, 29514390, 4302863 }, + { -13413405, -12407859, 20757302, -13801832, 14785143, 8976368, -5061276, -2144373, 17846988, -13971927 }, + }, + }, + { + { + { -2244452, -754728, -4597030, -1066309, -6247172, 1455299, -21647728, -9214789, -5222701, 12650267 }, + { -9906797, -16070310, 21134160, 12198166, -27064575, 708126, 387813, 13770293, -19134326, 10958663 }, + { 22470984, 12369526, 23446014, -5441109, -21520802, -9698723, -11772496, -11574455, -25083830, 4271862 }, + }, + { + { -25169565, -10053642, -19909332, 15361595, -5984358, 2159192, 75375, -4278529, -32526221, 8469673 }, + { 15854970, 4148314, -8893890, 7259002, 11666551, 13824734, -30531198, 2697372, 24154791, -9460943 }, + { 15446137, -15806644, 29759747, 14019369, 30811221, -9610191, -31582008, 12840104, 24913809, 9815020 }, + }, + { + { -4709286, -5614269, -31841498, -12288893, -14443537, 10799414, -9103676, 13438769, 18735128, 9466238 }, + { 11933045, 9281483, 5081055, -5183824, -2628162, -4905629, -7727821, -10896103, -22728655, 16199064 }, + { 14576810, 379472, -26786533, -8317236, -29426508, -10812974, -102766, 1876699, 30801119, 2164795 }, + }, + { + { 15995086, 3199873, 13672555, 13712240, -19378835, -4647646, -13081610, -15496269, -13492807, 1268052 }, + { -10290614, -3659039, -3286592, 10948818, 23037027, 3794475, -3470338, -12600221, -17055369, 3565904 }, + { 29210088, -9419337, -5919792, -4952785, 10834811, -13327726, -16512102, -10820713, -27162222, -14030531 }, + }, + { + { -13161890, 15508588, 16663704, -8156150, -28349942, 9019123, -29183421, -3769423, 2244111, -14001979 }, + { -5152875, -3800936, -9306475, -6071583, 16243069, 14684434, -25673088, -16180800, 13491506, 4641841 }, + { 10813417, 643330, -19188515, -728916, 30292062, -16600078, 27548447, -7721242, 14476989, -12767431 }, + }, + { + { 10292079, 9984945, 6481436, 8279905, -7251514, 7032743, 27282937, -1644259, -27912810, 12651324 }, + { -31185513, -813383, 22271204, 11835308, 10201545, 15351028, 17099662, 3988035, 21721536, -3148940 }, + { 10202177, -6545839, -31373232, -9574638, -32150642, -8119683, -12906320, 3852694, 13216206, 14842320 }, + }, + { + { -15815640, -10601066, -6538952, -7258995, -6984659, -6581778, -31500847, 13765824, -27434397, 9900184 }, + { 14465505, -13833331, -32133984, -14738873, -27443187, 12990492, 33046193, 15796406, -7051866, -8040114 }, + { 30924417, -8279620, 6359016, -12816335, 16508377, 9071735, -25488601, 15413635, 9524356, -7018878 }, + }, + { + { 12274201, -13175547, 32627641, -1785326, 6736625, 13267305, 5237659, -5109483, 15663516, 4035784 }, + { -2951309, 8903985, 17349946, 601635, -16432815, -4612556, -13732739, -15889334, -22258478, 4659091 }, + { -16916263, -4952973, -30393711, -15158821, 20774812, 15897498, 5736189, 15026997, -2178256, -13455585 }, + }, + }, + { + { + { -8858980, -2219056, 28571666, -10155518, -474467, -10105698, -3801496, 278095, 23440562, -290208 }, + { 10226241, -5928702, 15139956, 120818, -14867693, 5218603, 32937275, 11551483, -16571960, -7442864 }, + { 17932739, -12437276, -24039557, 10749060, 11316803, 7535897, 22503767, 5561594, -3646624, 3898661 }, + }, + { + { 7749907, -969567, -16339731, -16464, -25018111, 15122143, -1573531, 7152530, 21831162, 1245233 }, + { 26958459, -14658026, 4314586, 8346991, -5677764, 11960072, -32589295, -620035, -30402091, -16716212 }, + { -12165896, 9166947, 33491384, 13673479, 29787085, 13096535, 6280834, 14587357, -22338025, 13987525 }, + }, + { + { -24349909, 7778775, 21116000, 15572597, -4833266, -5357778, -4300898, -5124639, -7469781, -2858068 }, + { 9681908, -6737123, -31951644, 13591838, -6883821, 386950, 31622781, 6439245, -14581012, 4091397 }, + { -8426427, 1470727, -28109679, -1596990, 3978627, -5123623, -19622683, 12092163, 29077877, -14741988 }, + }, + { + { 5269168, -6859726, -13230211, -8020715, 25932563, 1763552, -5606110, -5505881, -20017847, 2357889 }, + { 32264008, -15407652, -5387735, -1160093, -2091322, -3946900, 23104804, -12869908, 5727338, 189038 }, + { 14609123, -8954470, -6000566, -16622781, -14577387, -7743898, -26745169, 10942115, -25888931, -14884697 }, + }, + { + { 20513500, 5557931, -15604613, 7829531, 26413943, -2019404, -21378968, 7471781, 13913677, -5137875 }, + { -25574376, 11967826, 29233242, 12948236, -6754465, 4713227, -8940970, 14059180, 12878652, 8511905 }, + { -25656801, 3393631, -2955415, -7075526, -2250709, 9366908, -30223418, 6812974, 5568676, -3127656 }, + }, + { + { 11630004, 12144454, 2116339, 13606037, 27378885, 15676917, -17408753, -13504373, -14395196, 8070818 }, + { 27117696, -10007378, -31282771, -5570088, 1127282, 12772488, -29845906, 10483306, -11552749, -1028714 }, + { 10637467, -5688064, 5674781, 1072708, -26343588, -6982302, -1683975, 9177853, -27493162, 15431203 }, + }, + { + { 20525145, 10892566, -12742472, 12779443, -29493034, 16150075, -28240519, 14943142, -15056790, -7935931 }, + { -30024462, 5626926, -551567, -9981087, 753598, 11981191, 25244767, -3239766, -3356550, 9594024 }, + { -23752644, 2636870, -5163910, -10103818, 585134, 7877383, 11345683, -6492290, 13352335, -10977084 }, + }, + { + { -1931799, -5407458, 3304649, -12884869, 17015806, -4877091, -29783850, -7752482, -13215537, -319204 }, + { 20239939, 6607058, 6203985, 3483793, -18386976, -779229, -20723742, 15077870, -22750759, 14523817 }, + { 27406042, -6041657, 27423596, -4497394, 4996214, 10002360, -28842031, -4545494, -30172742, -4805667 }, + }, + }, + { + { + { 11374242, 12660715, 17861383, -12540833, 10935568, 1099227, -13886076, -9091740, -27727044, 11358504 }, + { -12730809, 10311867, 1510375, 10778093, -2119455, -9145702, 32676003, 11149336, -26123651, 4985768 }, + { -19096303, 341147, -6197485, -239033, 15756973, -8796662, -983043, 13794114, -19414307, -15621255 }, + }, + { + { 6490081, 11940286, 25495923, -7726360, 8668373, -8751316, 3367603, 6970005, -1691065, -9004790 }, + { 1656497, 13457317, 15370807, 6364910, 13605745, 8362338, -19174622, -5475723, -16796596, -5031438 }, + { -22273315, -13524424, -64685, -4334223, -18605636, -10921968, -20571065, -7007978, -99853, -10237333 }, + }, + { + { 17747465, 10039260, 19368299, -4050591, -20630635, -16041286, 31992683, -15857976, -29260363, -5511971 }, + { 31932027, -4986141, -19612382, 16366580, 22023614, 88450, 11371999, -3744247, 4882242, -10626905 }, + { 29796507, 37186, 19818052, 10115756, -11829032, 3352736, 18551198, 3272828, -5190932, -4162409 }, + }, + { + { 12501286, 4044383, -8612957, -13392385, -32430052, 5136599, -19230378, -3529697, 330070, -3659409 }, + { 6384877, 2899513, 17807477, 7663917, -2358888, 12363165, 25366522, -8573892, -271295, 12071499 }, + { -8365515, -4042521, 25133448, -4517355, -6211027, 2265927, -32769618, 1936675, -5159697, 3829363 }, + }, + { + { 28425966, -5835433, -577090, -4697198, -14217555, 6870930, 7921550, -6567787, 26333140, 14267664 }, + { -11067219, 11871231, 27385719, -10559544, -4585914, -11189312, 10004786, -8709488, -21761224, 8930324 }, + { -21197785, -16396035, 25654216, -1725397, 12282012, 11008919, 1541940, 4757911, -26491501, -16408940 }, + }, + { + { 13537262, -7759490, -20604840, 10961927, -5922820, -13218065, -13156584, 6217254, -15943699, 13814990 }, + { -17422573, 15157790, 18705543, 29619, 24409717, -260476, 27361681, 9257833, -1956526, -1776914 }, + { -25045300, -10191966, 15366585, 15166509, -13105086, 8423556, -29171540, 12361135, -18685978, 4578290 }, + }, + { + { 24579768, 3711570, 1342322, -11180126, -27005135, 14124956, -22544529, 14074919, 21964432, 8235257 }, + { -6528613, -2411497, 9442966, -5925588, 12025640, -1487420, -2981514, -1669206, 13006806, 2355433 }, + { -16304899, -13605259, -6632427, -5142349, 16974359, -10911083, 27202044, 1719366, 1141648, -12796236 }, + }, + { + { -12863944, -13219986, -8318266, -11018091, -6810145, -4843894, 13475066, -3133972, 32674895, 13715045 }, + { 11423335, -5468059, 32344216, 8962751, 24989809, 9241752, -13265253, 16086212, -28740881, -15642093 }, + { -1409668, 12530728, -6368726, 10847387, 19531186, -14132160, -11709148, 7791794, -27245943, 4383347 }, + }, + }, + { + { + { -28970898, 5271447, -1266009, -9736989, -12455236, 16732599, -4862407, -4906449, 27193557, 6245191 }, + { -15193956, 5362278, -1783893, 2695834, 4960227, 12840725, 23061898, 3260492, 22510453, 8577507 }, + { -12632451, 11257346, -32692994, 13548177, -721004, 10879011, 31168030, 13952092, -29571492, -3635906 }, + }, + { + { 3877321, -9572739, 32416692, 5405324, -11004407, -13656635, 3759769, 11935320, 5611860, 8164018 }, + { -16275802, 14667797, 15906460, 12155291, -22111149, -9039718, 32003002, -8832289, 5773085, -8422109 }, + { -23788118, -8254300, 1950875, 8937633, 18686727, 16459170, -905725, 12376320, 31632953, 190926 }, + }, + { + { -24593607, -16138885, -8423991, 13378746, 14162407, 6901328, -8288749, 4508564, -25341555, -3627528 }, + { 8884438, -5884009, 6023974, 10104341, -6881569, -4941533, 18722941, -14786005, -1672488, 827625 }, + { -32720583, -16289296, -32503547, 7101210, 13354605, 2659080, -1800575, -14108036, -24878478, 1541286 }, + }, + { + { 2901347, -1117687, 3880376, -10059388, -17620940, -3612781, -21802117, -3567481, 20456845, -1885033 }, + { 27019610, 12299467, -13658288, -1603234, -12861660, -4861471, -19540150, -5016058, 29439641, 15138866 }, + { 21536104, -6626420, -32447818, -10690208, -22408077, 5175814, -5420040, -16361163, 7779328, 109896 }, + }, + { + { 30279744, 14648750, -8044871, 6425558, 13639621, -743509, 28698390, 12180118, 23177719, -554075 }, + { 26572847, 3405927, -31701700, 12890905, -19265668, 5335866, -6493768, 2378492, 4439158, -13279347 }, + { -22716706, 3489070, -9225266, -332753, 18875722, -1140095, 14819434, -12731527, -17717757, -5461437 }, + }, + { + { -5056483, 16566551, 15953661, 3767752, -10436499, 15627060, -820954, 2177225, 8550082, -15114165 }, + { -18473302, 16596775, -381660, 15663611, 22860960, 15585581, -27844109, -3582739, -23260460, -8428588 }, + { -32480551, 15707275, -8205912, -5652081, 29464558, 2713815, -22725137, 15860482, -21902570, 1494193 }, + }, + { + { -19562091, -14087393, -25583872, -9299552, 13127842, 759709, 21923482, 16529112, 8742704, 12967017 }, + { -28464899, 1553205, 32536856, -10473729, -24691605, -406174, -8914625, -2933896, -29903758, 15553883 }, + { 21877909, 3230008, 9881174, 10539357, -4797115, 2841332, 11543572, 14513274, 19375923, -12647961 }, + }, + { + { 8832269, -14495485, 13253511, 5137575, 5037871, 4078777, 24880818, -6222716, 2862653, 9455043 }, + { 29306751, 5123106, 20245049, -14149889, 9592566, 8447059, -2077124, -2990080, 15511449, 4789663 }, + { -20679756, 7004547, 8824831, -9434977, -4045704, -3750736, -5754762, 108893, 23513200, 16652362 }, + }, + }, + { + { + { -33256173, 4144782, -4476029, -6579123, 10770039, -7155542, -6650416, -12936300, -18319198, 10212860 }, + { 2756081, 8598110, 7383731, -6859892, 22312759, -1105012, 21179801, 2600940, -9988298, -12506466 }, + { -24645692, 13317462, -30449259, -15653928, 21365574, -10869657, 11344424, 864440, -2499677, -16710063 }, + }, + { + { -26432803, 6148329, -17184412, -14474154, 18782929, -275997, -22561534, 211300, 2719757, 4940997 }, + { -1323882, 3911313, -6948744, 14759765, -30027150, 7851207, 21690126, 8518463, 26699843, 5276295 }, + { -13149873, -6429067, 9396249, 365013, 24703301, -10488939, 1321586, 149635, -15452774, 7159369 }, + }, + { + { 9987780, -3404759, 17507962, 9505530, 9731535, -2165514, 22356009, 8312176, 22477218, -8403385 }, + { 18155857, -16504990, 19744716, 9006923, 15154154, -10538976, 24256460, -4864995, -22548173, 9334109 }, + { 2986088, -4911893, 10776628, -3473844, 10620590, -7083203, -21413845, 14253545, -22587149, 536906 }, + }, + { + { 4377756, 8115836, 24567078, 15495314, 11625074, 13064599, 7390551, 10589625, 10838060, -15420424 }, + { -19342404, 867880, 9277171, -3218459, -14431572, -1986443, 19295826, -15796950, 6378260, 699185 }, + { 7895026, 4057113, -7081772, -13077756, -17886831, -323126, -716039, 15693155, -5045064, -13373962 }, + }, + { + { -7737563, -5869402, -14566319, -7406919, 11385654, 13201616, 31730678, -10962840, -3918636, -9669325 }, + { 10188286, -15770834, -7336361, 13427543, 22223443, 14896287, 30743455, 7116568, -21786507, 5427593 }, + { 696102, 13206899, 27047647, -10632082, 15285305, -9853179, 10798490, -4578720, 19236243, 12477404 }, + }, + { + { -11229439, 11243796, -17054270, -8040865, -788228, -8167967, -3897669, 11180504, -23169516, 7733644 }, + { 17800790, -14036179, -27000429, -11766671, 23887827, 3149671, 23466177, -10538171, 10322027, 15313801 }, + { 26246234, 11968874, 32263343, -5468728, 6830755, -13323031, -15794704, -101982, -24449242, 10890804 }, + }, + { + { -31365647, 10271363, -12660625, -6267268, 16690207, -13062544, -14982212, 16484931, 25180797, -5334884 }, + { -586574, 10376444, -32586414, -11286356, 19801893, 10997610, 2276632, 9482883, 316878, 13820577 }, + { -9882808, -4510367, -2115506, 16457136, -11100081, 11674996, 30756178, -7515054, 30696930, -3712849 }, + }, + { + { 32988917, -9603412, 12499366, 7910787, -10617257, -11931514, -7342816, -9985397, -32349517, 7392473 }, + { -8855661, 15927861, 9866406, -3649411, -2396914, -16655781, -30409476, -9134995, 25112947, -2926644 }, + { -2504044, -436966, 25621774, -5678772, 15085042, -5479877, -24884878, -13526194, 5537438, -13914319 }, + }, + }, + { + { + { -11225584, 2320285, -9584280, 10149187, -33444663, 5808648, -14876251, -1729667, 31234590, 6090599 }, + { -9633316, 116426, 26083934, 2897444, -6364437, -2688086, 609721, 15878753, -6970405, -9034768 }, + { -27757857, 247744, -15194774, -9002551, 23288161, -10011936, -23869595, 6503646, 20650474, 1804084 }, + }, + { + { -27589786, 15456424, 8972517, 8469608, 15640622, 4439847, 3121995, -10329713, 27842616, -202328 }, + { -15306973, 2839644, 22530074, 10026331, 4602058, 5048462, 28248656, 5031932, -11375082, 12714369 }, + { 20807691, -7270825, 29286141, 11421711, -27876523, -13868230, -21227475, 1035546, -19733229, 12796920 }, + }, + { + { 12076899, -14301286, -8785001, -11848922, -25012791, 16400684, -17591495, -12899438, 3480665, -15182815 }, + { -32361549, 5457597, 28548107, 7833186, 7303070, -11953545, -24363064, -15921875, -33374054, 2771025 }, + { -21389266, 421932, 26597266, 6860826, 22486084, -6737172, -17137485, -4210226, -24552282, 15673397 }, + }, + { + { -20184622, 2338216, 19788685, -9620956, -4001265, -8740893, -20271184, 4733254, 3727144, -12934448 }, + { 6120119, 814863, -11794402, -622716, 6812205, -15747771, 2019594, 7975683, 31123697, -10958981 }, + { 30069250, -11435332, 30434654, 2958439, 18399564, -976289, 12296869, 9204260, -16432438, 9648165 }, + }, + { + { 32705432, -1550977, 30705658, 7451065, -11805606, 9631813, 3305266, 5248604, -26008332, -11377501 }, + { 17219865, 2375039, -31570947, -5575615, -19459679, 9219903, 294711, 15298639, 2662509, -16297073 }, + { -1172927, -7558695, -4366770, -4287744, -21346413, -8434326, 32087529, -1222777, 32247248, -14389861 }, + }, + { + { 14312628, 1221556, 17395390, -8700143, -4945741, -8684635, -28197744, -9637817, -16027623, -13378845 }, + { -1428825, -9678990, -9235681, 6549687, -7383069, -468664, 23046502, 9803137, 17597934, 2346211 }, + { 18510800, 15337574, 26171504, 981392, -22241552, 7827556, -23491134, -11323352, 3059833, -11782870 }, + }, + { + { 10141598, 6082907, 17829293, -1947643, 9830092, 13613136, -25556636, -5544586, -33502212, 3592096 }, + { 33114168, -15889352, -26525686, -13343397, 33076705, 8716171, 1151462, 1521897, -982665, -6837803 }, + { -32939165, -4255815, 23947181, -324178, -33072974, -12305637, -16637686, 3891704, 26353178, 693168 }, + }, + { + { 30374239, 1595580, -16884039, 13186931, 4600344, 406904, 9585294, -400668, 31375464, 14369965 }, + { -14370654, -7772529, 1510301, 6434173, -18784789, -6262728, 32732230, -13108839, 17901441, 16011505 }, + { 18171223, -11934626, -12500402, 15197122, -11038147, -15230035, -19172240, -16046376, 8764035, 12309598 }, + }, + }, + { + { + { 5975908, -5243188, -19459362, -9681747, -11541277, 14015782, -23665757, 1228319, 17544096, -10593782 }, + { 5811932, -1715293, 3442887, -2269310, -18367348, -8359541, -18044043, -15410127, -5565381, 12348900 }, + { -31399660, 11407555, 25755363, 6891399, -3256938, 14872274, -24849353, 8141295, -10632534, -585479 }, + }, + { + { -12675304, 694026, -5076145, 13300344, 14015258, -14451394, -9698672, -11329050, 30944593, 1130208 }, + { 8247766, -6710942, -26562381, -7709309, -14401939, -14648910, 4652152, 2488540, 23550156, -271232 }, + { 17294316, -3788438, 7026748, 15626851, 22990044, 113481, 2267737, -5908146, -408818, -137719 }, + }, + { + { 16091085, -16253926, 18599252, 7340678, 2137637, -1221657, -3364161, 14550936, 3260525, -7166271 }, + { -4910104, -13332887, 18550887, 10864893, -16459325, -7291596, -23028869, -13204905, -12748722, 2701326 }, + { -8574695, 16099415, 4629974, -16340524, -20786213, -6005432, -10018363, 9276971, 11329923, 1862132 }, + }, + { + { 14763076, -15903608, -30918270, 3689867, 3511892, 10313526, -21951088, 12219231, -9037963, -940300 }, + { 8894987, -3446094, 6150753, 3013931, 301220, 15693451, -31981216, -2909717, -15438168, 11595570 }, + { 15214962, 3537601, -26238722, -14058872, 4418657, -15230761, 13947276, 10730794, -13489462, -4363670 }, + }, + { + { -2538306, 7682793, 32759013, 263109, -29984731, -7955452, -22332124, -10188635, 977108, 699994 }, + { -12466472, 4195084, -9211532, 550904, -15565337, 12917920, 19118110, -439841, -30534533, -14337913 }, + { 31788461, -14507657, 4799989, 7372237, 8808585, -14747943, 9408237, -10051775, 12493932, -5409317 }, + }, + { + { -25680606, 5260744, -19235809, -6284470, -3695942, 16566087, 27218280, 2607121, 29375955, 6024730 }, + { 842132, -2794693, -4763381, -8722815, 26332018, -12405641, 11831880, 6985184, -9940361, 2854096 }, + { -4847262, -7969331, 2516242, -5847713, 9695691, -7221186, 16512645, 960770, 12121869, 16648078 }, + }, + { + { -15218652, 14667096, -13336229, 2013717, 30598287, -464137, -31504922, -7882064, 20237806, 2838411 }, + { -19288047, 4453152, 15298546, -16178388, 22115043, -15972604, 12544294, -13470457, 1068881, -12499905 }, + { -9558883, -16518835, 33238498, 13506958, 30505848, -1114596, -8486907, -2630053, 12521378, 4845654 }, + }, + { + { -28198521, 10744108, -2958380, 10199664, 7759311, -13088600, 3409348, -873400, -6482306, -12885870 }, + { -23561822, 6230156, -20382013, 10655314, -24040585, -11621172, 10477734, -1240216, -3113227, 13974498 }, + { 12966261, 15550616, -32038948, -1615346, 21025980, -629444, 5642325, 7188737, 18895762, 12629579 }, + }, + }, + { + { + { 14741879, -14946887, 22177208, -11721237, 1279741, 8058600, 11758140, 789443, 32195181, 3895677 }, + { 10758205, 15755439, -4509950, 9243698, -4879422, 6879879, -2204575, -3566119, -8982069, 4429647 }, + { -2453894, 15725973, -20436342, -10410672, -5803908, -11040220, -7135870, -11642895, 18047436, -15281743 }, + }, + { + { -25173001, -11307165, 29759956, 11776784, -22262383, -15820455, 10993114, -12850837, -17620701, -9408468 }, + { 21987233, 700364, -24505048, 14972008, -7774265, -5718395, 32155026, 2581431, -29958985, 8773375 }, + { -25568350, 454463, -13211935, 16126715, 25240068, 8594567, 20656846, 12017935, -7874389, -13920155 }, + }, + { + { 6028182, 6263078, -31011806, -11301710, -818919, 2461772, -31841174, -5468042, -1721788, -2776725 }, + { -12278994, 16624277, 987579, -5922598, 32908203, 1248608, 7719845, -4166698, 28408820, 6816612 }, + { -10358094, -8237829, 19549651, -12169222, 22082623, 16147817, 20613181, 13982702, -10339570, 5067943 }, + }, + { + { -30505967, -3821767, 12074681, 13582412, -19877972, 2443951, -19719286, 12746132, 5331210, -10105944 }, + { 30528811, 3601899, -1957090, 4619785, -27361822, -15436388, 24180793, -12570394, 27679908, -1648928 }, + { 9402404, -13957065, 32834043, 10838634, -26580150, -13237195, 26653274, -8685565, 22611444, -12715406 }, + }, + { + { 22190590, 1118029, 22736441, 15130463, -30460692, -5991321, 19189625, -4648942, 4854859, 6622139 }, + { -8310738, -2953450, -8262579, -3388049, -10401731, -271929, 13424426, -3567227, 26404409, 13001963 }, + { -31241838, -15415700, -2994250, 8939346, 11562230, -12840670, -26064365, -11621720, -15405155, 11020693 }, + }, + { + { 1866042, -7949489, -7898649, -10301010, 12483315, 13477547, 3175636, -12424163, 28761762, 1406734 }, + { -448555, -1777666, 13018551, 3194501, -9580420, -11161737, 24760585, -4347088, 25577411, -13378680 }, + { -24290378, 4759345, -690653, -1852816, 2066747, 10693769, -29595790, 9884936, -9368926, 4745410 }, + }, + { + { -9141284, 6049714, -19531061, -4341411, -31260798, 9944276, -15462008, -11311852, 10931924, -11931931 }, + { -16561513, 14112680, -8012645, 4817318, -8040464, -11414606, -22853429, 10856641, -20470770, 13434654 }, + { 22759489, -10073434, -16766264, -1871422, 13637442, -10168091, 1765144, -12654326, 28445307, -5364710 }, + }, + { + { 29875063, 12493613, 2795536, -3786330, 1710620, 15181182, -10195717, -8788675, 9074234, 1167180 }, + { -26205683, 11014233, -9842651, -2635485, -26908120, 7532294, -18716888, -9535498, 3843903, 9367684 }, + { -10969595, -6403711, 9591134, 9582310, 11349256, 108879, 16235123, 8601684, -139197, 4242895 }, + }, + }, + { + { + { 22092954, -13191123, -2042793, -11968512, 32186753, -11517388, -6574341, 2470660, -27417366, 16625501 }, + { -11057722, 3042016, 13770083, -9257922, 584236, -544855, -7770857, 2602725, -27351616, 14247413 }, + { 6314175, -10264892, -32772502, 15957557, -10157730, 168750, -8618807, 14290061, 27108877, -1180880 }, + }, + { + { -8586597, -7170966, 13241782, 10960156, -32991015, -13794596, 33547976, -11058889, -27148451, 981874 }, + { 22833440, 9293594, -32649448, -13618667, -9136966, 14756819, -22928859, -13970780, -10479804, -16197962 }, + { -7768587, 3326786, -28111797, 10783824, 19178761, 14905060, 22680049, 13906969, -15933690, 3797899 }, + }, + { + { 21721356, -4212746, -12206123, 9310182, -3882239, -13653110, 23740224, -2709232, 20491983, -8042152 }, + { 9209270, -15135055, -13256557, -6167798, -731016, 15289673, 25947805, 15286587, 30997318, -6703063 }, + { 7392032, 16618386, 23946583, -8039892, -13265164, -1533858, -14197445, -2321576, 17649998, -250080 }, + }, + { + { -9301088, -14193827, 30609526, -3049543, -25175069, -1283752, -15241566, -9525724, -2233253, 7662146 }, + { -17558673, 1763594, -33114336, 15908610, -30040870, -12174295, 7335080, -8472199, -3174674, 3440183 }, + { -19889700, -5977008, -24111293, -9688870, 10799743, -16571957, 40450, -4431835, 4862400, 1133 }, + }, + { + { -32856209, -7873957, -5422389, 14860950, -16319031, 7956142, 7258061, 311861, -30594991, -7379421 }, + { -3773428, -1565936, 28985340, 7499440, 24445838, 9325937, 29727763, 16527196, 18278453, 15405622 }, + { -4381906, 8508652, -19898366, -3674424, -5984453, 15149970, -13313598, 843523, -21875062, 13626197 }, + }, + { + { 2281448, -13487055, -10915418, -2609910, 1879358, 16164207, -10783882, 3953792, 13340839, 15928663 }, + { 31727126, -7179855, -18437503, -8283652, 2875793, -16390330, -25269894, -7014826, -23452306, 5964753 }, + { 4100420, -5959452, -17179337, 6017714, -18705837, 12227141, -26684835, 11344144, 2538215, -7570755 }, + }, + { + { -9433605, 6123113, 11159803, -2156608, 30016280, 14966241, -20474983, 1485421, -629256, -15958862 }, + { -26804558, 4260919, 11851389, 9658551, -32017107, 16367492, -20205425, -13191288, 11659922, -11115118 }, + { 26180396, 10015009, -30844224, -8581293, 5418197, 9480663, 2231568, -10170080, 33100372, -1306171 }, + }, + { + { 15121113, -5201871, -10389905, 15427821, -27509937, -15992507, 21670947, 4486675, -5931810, -14466380 }, + { 16166486, -9483733, -11104130, 6023908, -31926798, -1364923, 2340060, -16254968, -10735770, -10039824 }, + { 28042865, -3557089, -12126526, 12259706, -3717498, -6945899, 6766453, -8689599, 18036436, 5803270 }, + }, + }, + { + { + { -817581, 6763912, 11803561, 1585585, 10958447, -2671165, 23855391, 4598332, -6159431, -14117438 }, + { -31031306, -14256194, 17332029, -2383520, 31312682, -5967183, 696309, 50292, -20095739, 11763584 }, + { -594563, -2514283, -32234153, 12643980, 12650761, 14811489, 665117, -12613632, -19773211, -10713562 }, + }, + { + { 30464590, -11262872, -4127476, -12734478, 19835327, -7105613, -24396175, 2075773, -17020157, 992471 }, + { 18357185, -6994433, 7766382, 16342475, -29324918, 411174, 14578841, 8080033, -11574335, -10601610 }, + { 19598397, 10334610, 12555054, 2555664, 18821899, -10339780, 21873263, 16014234, 26224780, 16452269 }, + }, + { + { -30223925, 5145196, 5944548, 16385966, 3976735, 2009897, -11377804, -7618186, -20533829, 3698650 }, + { 14187449, 3448569, -10636236, -10810935, -22663880, -3433596, 7268410, -10890444, 27394301, 12015369 }, + { 19695761, 16087646, 28032085, 12999827, 6817792, 11427614, 20244189, -1312777, -13259127, -3402461 }, + }, + { + { 30860103, 12735208, -1888245, -4699734, -16974906, 2256940, -8166013, 12298312, -8550524, -10393462 }, + { -5719826, -11245325, -1910649, 15569035, 26642876, -7587760, -5789354, -15118654, -4976164, 12651793 }, + { -2848395, 9953421, 11531313, -5282879, 26895123, -12697089, -13118820, -16517902, 9768698, -2533218 }, + }, + { + { -24719459, 1894651, -287698, -4704085, 15348719, -8156530, 32767513, 12765450, 4940095, 10678226 }, + { 18860224, 15980149, -18987240, -1562570, -26233012, -11071856, -7843882, 13944024, -24372348, 16582019 }, + { -15504260, 4970268, -29893044, 4175593, -20993212, -2199756, -11704054, 15444560, -11003761, 7989037 }, + }, + { + { 31490452, 5568061, -2412803, 2182383, -32336847, 4531686, -32078269, 6200206, -19686113, -14800171 }, + { -17308668, -15879940, -31522777, -2831, -32887382, 16375549, 8680158, -16371713, 28550068, -6857132 }, + { -28126887, -5688091, 16837845, -1820458, -6850681, 12700016, -30039981, 4364038, 1155602, 5988841 }, + }, + { + { 21890435, -13272907, -12624011, 12154349, -7831873, 15300496, 23148983, -4470481, 24618407, 8283181 }, + { -33136107, -10512751, 9975416, 6841041, -31559793, 16356536, 3070187, -7025928, 1466169, 10740210 }, + { -1509399, -15488185, -13503385, -10655916, 32799044, 909394, -13938903, -5779719, -32164649, -15327040 }, + }, + { + { 3960823, -14267803, -28026090, -15918051, -19404858, 13146868, 15567327, 951507, -3260321, -573935 }, + { 24740841, 5052253, -30094131, 8961361, 25877428, 6165135, -24368180, 14397372, -7380369, -6144105 }, + { -28888365, 3510803, -28103278, -1158478, -11238128, -10631454, -15441463, -14453128, -1625486, -6494814 }, + }, + }, + { + { + { 793299, -9230478, 8836302, -6235707, -27360908, -2369593, 33152843, -4885251, -9906200, -621852 }, + { 5666233, 525582, 20782575, -8038419, -24538499, 14657740, 16099374, 1468826, -6171428, -15186581 }, + { -4859255, -3779343, -2917758, -6748019, 7778750, 11688288, -30404353, -9871238, -1558923, -9863646 }, + }, + { + { 10896332, -7719704, 824275, 472601, -19460308, 3009587, 25248958, 14783338, -30581476, -15757844 }, + { 10566929, 12612572, -31944212, 11118703, -12633376, 12362879, 21752402, 8822496, 24003793, 14264025 }, + { 27713862, -7355973, -11008240, 9227530, 27050101, 2504721, 23886875, -13117525, 13958495, -5732453 }, + }, + { + { -23481610, 4867226, -27247128, 3900521, 29838369, -8212291, -31889399, -10041781, 7340521, -15410068 }, + { 4646514, -8011124, -22766023, -11532654, 23184553, 8566613, 31366726, -1381061, -15066784, -10375192 }, + { -17270517, 12723032, -16993061, 14878794, 21619651, -6197576, 27584817, 3093888, -8843694, 3849921 }, + }, + { + { -9064912, 2103172, 25561640, -15125738, -5239824, 9582958, 32477045, -9017955, 5002294, -15550259 }, + { -12057553, -11177906, 21115585, -13365155, 8808712, -12030708, 16489530, 13378448, -25845716, 12741426 }, + { -5946367, 10645103, -30911586, 15390284, -3286982, -7118677, 24306472, 15852464, 28834118, -7646072 }, + }, + { + { -17335748, -9107057, -24531279, 9434953, -8472084, -583362, -13090771, 455841, 20461858, 5491305 }, + { 13669248, -16095482, -12481974, -10203039, -14569770, -11893198, -24995986, 11293807, -28588204, -9421832 }, + { 28497928, 6272777, -33022994, 14470570, 8906179, -1225630, 18504674, -14165166, 29867745, -8795943 }, + }, + { + { -16207023, 13517196, -27799630, -13697798, 24009064, -6373891, -6367600, -13175392, 22853429, -4012011 }, + { 24191378, 16712145, -13931797, 15217831, 14542237, 1646131, 18603514, -11037887, 12876623, -2112447 }, + { 17902668, 4518229, -411702, -2829247, 26878217, 5258055, -12860753, 608397, 16031844, 3723494 }, + }, + { + { -28632773, 12763728, -20446446, 7577504, 33001348, -13017745, 17558842, -7872890, 23896954, -4314245 }, + { -20005381, -12011952, 31520464, 605201, 2543521, 5991821, -2945064, 7229064, -9919646, -8826859 }, + { 28816045, 298879, -28165016, -15920938, 19000928, -1665890, -12680833, -2949325, -18051778, -2082915 }, + }, + { + { 16000882, -344896, 3493092, -11447198, -29504595, -13159789, 12577740, 16041268, -19715240, 7847707 }, + { 10151868, 10572098, 27312476, 7922682, 14825339, 4723128, -32855931, -6519018, -10020567, 3852848 }, + { -11430470, 15697596, -21121557, -4420647, 5386314, 15063598, 16514493, -15932110, 29330899, -15076224 }, + }, + }, + { + { + { -25499735, -4378794, -15222908, -6901211, 16615731, 2051784, 3303702, 15490, -27548796, 12314391 }, + { 15683520, -6003043, 18109120, -9980648, 15337968, -5997823, -16717435, 15921866, 16103996, -3731215 }, + { -23169824, -10781249, 13588192, -1628807, -3798557, -1074929, -19273607, 5402699, -29815713, -9841101 }, + }, + { + { 23190676, 2384583, -32714340, 3462154, -29903655, -1529132, -11266856, 8911517, -25205859, 2739713 }, + { 21374101, -3554250, -33524649, 9874411, 15377179, 11831242, -33529904, 6134907, 4931255, 11987849 }, + { -7732, -2978858, -16223486, 7277597, 105524, -322051, -31480539, 13861388, -30076310, 10117930 }, + }, + { + { -29501170, -10744872, -26163768, 13051539, -25625564, 5089643, -6325503, 6704079, 12890019, 15728940 }, + { -21972360, -11771379, -951059, -4418840, 14704840, 2695116, 903376, -10428139, 12885167, 8311031 }, + { -17516482, 5352194, 10384213, -13811658, 7506451, 13453191, 26423267, 4384730, 1888765, -5435404 }, + }, + { + { -25817338, -3107312, -13494599, -3182506, 30896459, -13921729, -32251644, -12707869, -19464434, -3340243 }, + { -23607977, -2665774, -526091, 4651136, 5765089, 4618330, 6092245, 14845197, 17151279, -9854116 }, + { -24830458, -12733720, -15165978, 10367250, -29530908, -265356, 22825805, -7087279, -16866484, 16176525 }, + }, + { + { -23583256, 6564961, 20063689, 3798228, -4740178, 7359225, 2006182, -10363426, -28746253, -10197509 }, + { -10626600, -4486402, -13320562, -5125317, 3432136, -6393229, 23632037, -1940610, 32808310, 1099883 }, + { 15030977, 5768825, -27451236, -2887299, -6427378, -15361371, -15277896, -6809350, 2051441, -15225865 }, + }, + { + { -3362323, -7239372, 7517890, 9824992, 23555850, 295369, 5148398, -14154188, -22686354, 16633660 }, + { 4577086, -16752288, 13249841, -15304328, 19958763, -14537274, 18559670, -10759549, 8402478, -9864273 }, + { -28406330, -1051581, -26790155, -907698, -17212414, -11030789, 9453451, -14980072, 17983010, 9967138 }, + }, + { + { -25762494, 6524722, 26585488, 9969270, 24709298, 1220360, -1677990, 7806337, 17507396, 3651560 }, + { -10420457, -4118111, 14584639, 15971087, -15768321, 8861010, 26556809, -5574557, -18553322, -11357135 }, + { 2839101, 14284142, 4029895, 3472686, 14402957, 12689363, -26642121, 8459447, -5605463, -7621941 }, + }, + { + { -4839289, -3535444, 9744961, 2871048, 25113978, 3187018, -25110813, -849066, 17258084, -7977739 }, + { 18164541, -10595176, -17154882, -1542417, 19237078, -9745295, 23357533, -15217008, 26908270, 12150756 }, + { -30264870, -7647865, 5112249, -7036672, -1499807, -6974257, 43168, -5537701, -32302074, 16215819 }, + }, + }, + { + { + { -6898905, 9824394, -12304779, -4401089, -31397141, -6276835, 32574489, 12532905, -7503072, -8675347 }, + { -27343522, -16515468, -27151524, -10722951, 946346, 16291093, 254968, 7168080, 21676107, -1943028 }, + { 21260961, -8424752, -16831886, -11920822, -23677961, 3968121, -3651949, -6215466, -3556191, -7913075 }, + }, + { + { 16544754, 13250366, -16804428, 15546242, -4583003, 12757258, -2462308, -8680336, -18907032, -9662799 }, + { -2415239, -15577728, 18312303, 4964443, -15272530, -12653564, 26820651, 16690659, 25459437, -4564609 }, + { -25144690, 11425020, 28423002, -11020557, -6144921, -15826224, 9142795, -2391602, -6432418, -1644817 }, + }, + { + { -23104652, 6253476, 16964147, -3768872, -25113972, -12296437, -27457225, -16344658, 6335692, 7249989 }, + { -30333227, 13979675, 7503222, -12368314, -11956721, -4621693, -30272269, 2682242, 25993170, -12478523 }, + { 4364628, 5930691, 32304656, -10044554, -8054781, 15091131, 22857016, -10598955, 31820368, 15075278 }, + }, + { + { 31879134, -8918693, 17258761, 90626, -8041836, -4917709, 24162788, -9650886, -17970238, 12833045 }, + { 19073683, 14851414, -24403169, -11860168, 7625278, 11091125, -19619190, 2074449, -9413939, 14905377 }, + { 24483667, -11935567, -2518866, -11547418, -1553130, 15355506, -25282080, 9253129, 27628530, -7555480 }, + }, + { + { 17597607, 8340603, 19355617, 552187, 26198470, -3176583, 4593324, -9157582, -14110875, 15297016 }, + { 510886, 14337390, -31785257, 16638632, 6328095, 2713355, -20217417, -11864220, 8683221, 2921426 }, + { 18606791, 11874196, 27155355, -5281482, -24031742, 6265446, -25178240, -1278924, 4674690, 13890525 }, + }, + { + { 13609624, 13069022, -27372361, -13055908, 24360586, 9592974, 14977157, 9835105, 4389687, 288396 }, + { 9922506, -519394, 13613107, 5883594, -18758345, -434263, -12304062, 8317628, 23388070, 16052080 }, + { 12720016, 11937594, -31970060, -5028689, 26900120, 8561328, -20155687, -11632979, -14754271, -10812892 }, + }, + { + { 15961858, 14150409, 26716931, -665832, -22794328, 13603569, 11829573, 7467844, -28822128, 929275 }, + { 11038231, -11582396, -27310482, -7316562, -10498527, -16307831, -23479533, -9371869, -21393143, 2465074 }, + { 20017163, -4323226, 27915242, 1529148, 12396362, 15675764, 13817261, -9658066, 2463391, -4622140 }, + }, + { + { -16358878, -12663911, -12065183, 4996454, -1256422, 1073572, 9583558, 12851107, 4003896, 12673717 }, + { -1731589, -15155870, -3262930, 16143082, 19294135, 13385325, 14741514, -9103726, 7903886, 2348101 }, + { 24536016, -16515207, 12715592, -3862155, 1511293, 10047386, -3842346, -7129159, -28377538, 10048127 }, + }, + }, + { + { + { -12622226, -6204820, 30718825, 2591312, -10617028, 12192840, 18873298, -7297090, -32297756, 15221632 }, + { -26478122, -11103864, 11546244, -1852483, 9180880, 7656409, -21343950, 2095755, 29769758, 6593415 }, + { -31994208, -2907461, 4176912, 3264766, 12538965, -868111, 26312345, -6118678, 30958054, 8292160 }, + }, + { + { 31429822, -13959116, 29173532, 15632448, 12174511, -2760094, 32808831, 3977186, 26143136, -3148876 }, + { 22648901, 1402143, -22799984, 13746059, 7936347, 365344, -8668633, -1674433, -3758243, -2304625 }, + { -15491917, 8012313, -2514730, -12702462, -23965846, -10254029, -1612713, -1535569, -16664475, 8194478 }, + }, + { + { 27338066, -7507420, -7414224, 10140405, -19026427, -6589889, 27277191, 8855376, 28572286, 3005164 }, + { 26287124, 4821776, 25476601, -4145903, -3764513, -15788984, -18008582, 1182479, -26094821, -13079595 }, + { -7171154, 3178080, 23970071, 6201893, -17195577, -4489192, -21876275, -13982627, 32208683, -1198248 }, + }, + { + { -16657702, 2817643, -10286362, 14811298, 6024667, 13349505, -27315504, -10497842, -27672585, -11539858 }, + { 15941029, -9405932, -21367050, 8062055, 31876073, -238629, -15278393, -1444429, 15397331, -4130193 }, + { 8934485, -13485467, -23286397, -13423241, -32446090, 14047986, 31170398, -1441021, -27505566, 15087184 }, + }, + { + { -18357243, -2156491, 24524913, -16677868, 15520427, -6360776, -15502406, 11461896, 16788528, -5868942 }, + { -1947386, 16013773, 21750665, 3714552, -17401782, -16055433, -3770287, -10323320, 31322514, -11615635 }, + { 21426655, -5650218, -13648287, -5347537, -28812189, -4920970, -18275391, -14621414, 13040862, -12112948 }, + }, + { + { 11293895, 12478086, -27136401, 15083750, -29307421, 14748872, 14555558, -13417103, 1613711, 4896935 }, + { -25894883, 15323294, -8489791, -8057900, 25967126, -13425460, 2825960, -4897045, -23971776, -11267415 }, + { -15924766, -5229880, -17443532, 6410664, 3622847, 10243618, 20615400, 12405433, -23753030, -8436416 }, + }, + { + { -7091295, 12556208, -20191352, 9025187, -17072479, 4333801, 4378436, 2432030, 23097949, -566018 }, + { 4565804, -16025654, 20084412, -7842817, 1724999, 189254, 24767264, 10103221, -18512313, 2424778 }, + { 366633, -11976806, 8173090, -6890119, 30788634, 5745705, -7168678, 1344109, -3642553, 12412659 }, + }, + { + { -24001791, 7690286, 14929416, -168257, -32210835, -13412986, 24162697, -15326504, -3141501, 11179385 }, + { 18289522, -14724954, 8056945, 16430056, -21729724, 7842514, -6001441, -1486897, -18684645, -11443503 }, + { 476239, 6601091, -6152790, -9723375, 17503545, -4863900, 27672959, 13403813, 11052904, 5219329 }, + }, + }, + { + { + { 20678546, -8375738, -32671898, 8849123, -5009758, 14574752, 31186971, -3973730, 9014762, -8579056 }, + { -13644050, -10350239, -15962508, 5075808, -1514661, -11534600, -33102500, 9160280, 8473550, -3256838 }, + { 24900749, 14435722, 17209120, -15292541, -22592275, 9878983, -7689309, -16335821, -24568481, 11788948 }, + }, + { + { -3118155, -11395194, -13802089, 14797441, 9652448, -6845904, -20037437, 10410733, -24568470, -1458691 }, + { -15659161, 16736706, -22467150, 10215878, -9097177, 7563911, 11871841, -12505194, -18513325, 8464118 }, + { -23400612, 8348507, -14585951, -861714, -3950205, -6373419, 14325289, 8628612, 33313881, -8370517 }, + }, + { + { -20186973, -4967935, 22367356, 5271547, -1097117, -4788838, -24805667, -10236854, -8940735, -5818269 }, + { -6948785, -1795212, -32625683, -16021179, 32635414, -7374245, 15989197, -12838188, 28358192, -4253904 }, + { -23561781, -2799059, -32351682, -1661963, -9147719, 10429267, -16637684, 4072016, -5351664, 5596589 }, + }, + { + { -28236598, -3390048, 12312896, 6213178, 3117142, 16078565, 29266239, 2557221, 1768301, 15373193 }, + { -7243358, -3246960, -4593467, -7553353, -127927, -912245, -1090902, -4504991, -24660491, 3442910 }, + { -30210571, 5124043, 14181784, 8197961, 18964734, -11939093, 22597931, 7176455, -18585478, 13365930 }, + }, + { + { -7877390, -1499958, 8324673, 4690079, 6261860, 890446, 24538107, -8570186, -9689599, -3031667 }, + { 25008904, -10771599, -4305031, -9638010, 16265036, 15721635, 683793, -11823784, 15723479, -15163481 }, + { -9660625, 12374379, -27006999, -7026148, -7724114, -12314514, 11879682, 5400171, 519526, -1235876 }, + }, + { + { 22258397, -16332233, -7869817, 14613016, -22520255, -2950923, -20353881, 7315967, 16648397, 7605640 }, + { -8081308, -8464597, -8223311, 9719710, 19259459, -15348212, 23994942, -5281555, -9468848, 4763278 }, + { -21699244, 9220969, -15730624, 1084137, -25476107, -2852390, 31088447, -7764523, -11356529, 728112 }, + }, + { + { 26047220, -11751471, -6900323, -16521798, 24092068, 9158119, -4273545, -12555558, -29365436, -5498272 }, + { 17510331, -322857, 5854289, 8403524, 17133918, -3112612, -28111007, 12327945, 10750447, 10014012 }, + { -10312768, 3936952, 9156313, -8897683, 16498692, -994647, -27481051, -666732, 3424691, 7540221 }, + }, + { + { 30322361, -6964110, 11361005, -4143317, 7433304, 4989748, -7071422, -16317219, -9244265, 15258046 }, + { 13054562, -2779497, 19155474, 469045, -12482797, 4566042, 5631406, 2711395, 1062915, -5136345 }, + { -19240248, -11254599, -29509029, -7499965, -5835763, 13005411, -6066489, 12194497, 32960380, 1459310 }, + }, + }, + { + { + { 19852034, 7027924, 23669353, 10020366, 8586503, -6657907, 394197, -6101885, 18638003, -11174937 }, + { 31395534, 15098109, 26581030, 8030562, -16527914, -5007134, 9012486, -7584354, -6643087, -5442636 }, + { -9192165, -2347377, -1997099, 4529534, 25766844, 607986, -13222, 9677543, -32294889, -6456008 }, + }, + { + { -2444496, -149937, 29348902, 8186665, 1873760, 12489863, -30934579, -7839692, -7852844, -8138429 }, + { -15236356, -15433509, 7766470, 746860, 26346930, -10221762, -27333451, 10754588, -9431476, 5203576 }, + { 31834314, 14135496, -770007, 5159118, 20917671, -16768096, -7467973, -7337524, 31809243, 7347066 }, + }, + { + { -9606723, -11874240, 20414459, 13033986, 13716524, -11691881, 19797970, -12211255, 15192876, -2087490 }, + { -12663563, -2181719, 1168162, -3804809, 26747877, -14138091, 10609330, 12694420, 33473243, -13382104 }, + { 33184999, 11180355, 15832085, -11385430, -1633671, 225884, 15089336, -11023903, -6135662, 14480053 }, + }, + { + { 31308717, -5619998, 31030840, -1897099, 15674547, -6582883, 5496208, 13685227, 27595050, 8737275 }, + { -20318852, -15150239, 10933843, -16178022, 8335352, -7546022, -31008351, -12610604, 26498114, 66511 }, + { 22644454, -8761729, -16671776, 4884562, -3105614, -13559366, 30540766, -4286747, -13327787, -7515095 }, + }, + { + { -28017847, 9834845, 18617207, -2681312, -3401956, -13307506, 8205540, 13585437, -17127465, 15115439 }, + { 23711543, -672915, 31206561, -8362711, 6164647, -9709987, -33535882, -1426096, 8236921, 16492939 }, + { -23910559, -13515526, -26299483, -4503841, 25005590, -7687270, 19574902, 10071562, 6708380, -6222424 }, + }, + { + { 2101391, -4930054, 19702731, 2367575, -15427167, 1047675, 5301017, 9328700, 29955601, -11678310 }, + { 3096359, 9271816, -21620864, -15521844, -14847996, -7592937, -25892142, -12635595, -9917575, 6216608 }, + { -32615849, 338663, -25195611, 2510422, -29213566, -13820213, 24822830, -6146567, -26767480, 7525079 }, + }, + { + { -23066649, -13985623, 16133487, -7896178, -3389565, 778788, -910336, -2782495, -19386633, 11994101 }, + { 21691500, -13624626, -641331, -14367021, 3285881, -3483596, -25064666, 9718258, -7477437, 13381418 }, + { 18445390, -4202236, 14979846, 11622458, -1727110, -3582980, 23111648, -6375247, 28535282, 15779576 }, + }, + { + { 30098053, 3089662, -9234387, 16662135, -21306940, 11308411, -14068454, 12021730, 9955285, -16303356 }, + { 9734894, -14576830, -7473633, -9138735, 2060392, 11313496, -18426029, 9924399, 20194861, 13380996 }, + { -26378102, -7965207, -22167821, 15789297, -18055342, -6168792, -1984914, 15707771, 26342023, 10146099 }, + }, + }, + { + { + { -26016874, -219943, 21339191, -41388, 19745256, -2878700, -29637280, 2227040, 21612326, -545728 }, + { -13077387, 1184228, 23562814, -5970442, -20351244, -6348714, 25764461, 12243797, -20856566, 11649658 }, + { -10031494, 11262626, 27384172, 2271902, 26947504, -15997771, 39944, 6114064, 33514190, 2333242 }, + }, + { + { -21433588, -12421821, 8119782, 7219913, -21830522, -9016134, -6679750, -12670638, 24350578, -13450001 }, + { -4116307, -11271533, -23886186, 4843615, -30088339, 690623, -31536088, -10406836, 8317860, 12352766 }, + { 18200138, -14475911, -33087759, -2696619, -23702521, -9102511, -23552096, -2287550, 20712163, 6719373 }, + }, + { + { 26656208, 6075253, -7858556, 1886072, -28344043, 4262326, 11117530, -3763210, 26224235, -3297458 }, + { -17168938, -14854097, -3395676, -16369877, -19954045, 14050420, 21728352, 9493610, 18620611, -16428628 }, + { -13323321, 13325349, 11432106, 5964811, 18609221, 6062965, -5269471, -9725556, -30701573, -16479657 }, + }, + { + { -23860538, -11233159, 26961357, 1640861, -32413112, -16737940, 12248509, -5240639, 13735342, 1934062 }, + { 25089769, 6742589, 17081145, -13406266, 21909293, -16067981, -15136294, -3765346, -21277997, 5473616 }, + { 31883677, -7961101, 1083432, -11572403, 22828471, 13290673, -7125085, 12469656, 29111212, -5451014 }, + }, + { + { 24244947, -15050407, -26262976, 2791540, -14997599, 16666678, 24367466, 6388839, -10295587, 452383 }, + { -25640782, -3417841, 5217916, 16224624, 19987036, -4082269, -24236251, -5915248, 15766062, 8407814 }, + { -20406999, 13990231, 15495425, 16395525, 5377168, 15166495, -8917023, -4388953, -8067909, 2276718 }, + }, + { + { 30157918, 12924066, -17712050, 9245753, 19895028, 3368142, -23827587, 5096219, 22740376, -7303417 }, + { 2041139, -14256350, 7783687, 13876377, -25946985, -13352459, 24051124, 13742383, -15637599, 13295222 }, + { 33338237, -8505733, 12532113, 7977527, 9106186, -1715251, -17720195, -4612972, -4451357, -14669444 }, + }, + { + { -20045281, 5454097, -14346548, 6447146, 28862071, 1883651, -2469266, -4141880, 7770569, 9620597 }, + { 23208068, 7979712, 33071466, 8149229, 1758231, -10834995, 30945528, -1694323, -33502340, -14767970 }, + { 1439958, -16270480, -1079989, -793782, 4625402, 10647766, -5043801, 1220118, 30494170, -11440799 }, + }, + { + { -5037580, -13028295, -2970559, -3061767, 15640974, -6701666, -26739026, 926050, -1684339, -13333647 }, + { 13908495, -3549272, 30919928, -6273825, -21521863, 7989039, 9021034, 9078865, 3353509, 4033511 }, + { -29663431, -15113610, 32259991, -344482, 24295849, -12912123, 23161163, 8839127, 27485041, 7356032 }, + }, + }, + { + { + { 9661027, 705443, 11980065, -5370154, -1628543, 14661173, -6346142, 2625015, 28431036, -16771834 }, + { -23839233, -8311415, -25945511, 7480958, -17681669, -8354183, -22545972, 14150565, 15970762, 4099461 }, + { 29262576, 16756590, 26350592, -8793563, 8529671, -11208050, 13617293, -9937143, 11465739, 8317062 }, + }, + { + { -25493081, -6962928, 32500200, -9419051, -23038724, -2302222, 14898637, 3848455, 20969334, -5157516 }, + { -20384450, -14347713, -18336405, 13884722, -33039454, 2842114, -21610826, -3649888, 11177095, 14989547 }, + { -24496721, -11716016, 16959896, 2278463, 12066309, 10137771, 13515641, 2581286, -28487508, 9930240 }, + }, + { + { -17751622, -2097826, 16544300, -13009300, -15914807, -14949081, 18345767, -13403753, 16291481, -5314038 }, + { -33229194, 2553288, 32678213, 9875984, 8534129, 6889387, -9676774, 6957617, 4368891, 9788741 }, + { 16660756, 7281060, -10830758, 12911820, 20108584, -8101676, -21722536, -8613148, 16250552, -11111103 }, + }, + { + { -19765507, 2390526, -16551031, 14161980, 1905286, 6414907, 4689584, 10604807, -30190403, 4782747 }, + { -1354539, 14736941, -7367442, -13292886, 7710542, -14155590, -9981571, 4383045, 22546403, 437323 }, + { 31665577, -12180464, -16186830, 1491339, -18368625, 3294682, 27343084, 2786261, -30633590, -14097016 }, + }, + { + { -14467279, -683715, -33374107, 7448552, 19294360, 14334329, -19690631, 2355319, -19284671, -6114373 }, + { 15121312, -15796162, 6377020, -6031361, -10798111, -12957845, 18952177, 15496498, -29380133, 11754228 }, + { -2637277, -13483075, 8488727, -14303896, 12728761, -1622493, 7141596, 11724556, 22761615, -10134141 }, + }, + { + { 16918416, 11729663, -18083579, 3022987, -31015732, -13339659, -28741185, -12227393, 32851222, 11717399 }, + { 11166634, 7338049, -6722523, 4531520, -29468672, -7302055, 31474879, 3483633, -1193175, -4030831 }, + { -185635, 9921305, 31456609, -13536438, -12013818, 13348923, 33142652, 6546660, -19985279, -3948376 }, + }, + { + { -32460596, 11266712, -11197107, -7899103, 31703694, 3855903, -8537131, -12833048, -30772034, -15486313 }, + { -18006477, 12709068, 3991746, -6479188, -21491523, -10550425, -31135347, -16049879, 10928917, 3011958 }, + { -6957757, -15594337, 31696059, 334240, 29576716, 14796075, -30831056, -12805180, 18008031, 10258577 }, + }, + { + { -22448644, 15655569, 7018479, -4410003, -30314266, -1201591, -1853465, 1367120, 25127874, 6671743 }, + { 29701166, -14373934, -10878120, 9279288, -17568, 13127210, 21382910, 11042292, 25838796, 4642684 }, + { -20430234, 14955537, -24126347, 8124619, -5369288, -5990470, 30468147, -13900640, 18423289, 4177476 }, + }, + }, +}; diff --git a/src/cryptoconditions/src/include/ed25519/src/sc.c b/src/cryptoconditions/src/include/ed25519/src/sc.c new file mode 100644 index 00000000000..ca5bad2ca04 --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/sc.c @@ -0,0 +1,809 @@ +#include "fixedint.h" +#include "sc.h" + +static uint64_t load_3(const unsigned char *in) { + uint64_t result; + + result = (uint64_t) in[0]; + result |= ((uint64_t) in[1]) << 8; + result |= ((uint64_t) in[2]) << 16; + + return result; +} + +static uint64_t load_4(const unsigned char *in) { + uint64_t result; + + result = (uint64_t) in[0]; + result |= ((uint64_t) in[1]) << 8; + result |= ((uint64_t) in[2]) << 16; + result |= ((uint64_t) in[3]) << 24; + + return result; +} + +/* +Input: + s[0]+256*s[1]+...+256^63*s[63] = s + +Output: + s[0]+256*s[1]+...+256^31*s[31] = s mod l + where l = 2^252 + 27742317777372353535851937790883648493. + Overwrites s in place. +*/ + +void sc_reduce(unsigned char *s) { + int64_t s0 = 2097151 & load_3(s); + int64_t s1 = 2097151 & (load_4(s + 2) >> 5); + int64_t s2 = 2097151 & (load_3(s + 5) >> 2); + int64_t s3 = 2097151 & (load_4(s + 7) >> 7); + int64_t s4 = 2097151 & (load_4(s + 10) >> 4); + int64_t s5 = 2097151 & (load_3(s + 13) >> 1); + int64_t s6 = 2097151 & (load_4(s + 15) >> 6); + int64_t s7 = 2097151 & (load_3(s + 18) >> 3); + int64_t s8 = 2097151 & load_3(s + 21); + int64_t s9 = 2097151 & (load_4(s + 23) >> 5); + int64_t s10 = 2097151 & (load_3(s + 26) >> 2); + int64_t s11 = 2097151 & (load_4(s + 28) >> 7); + int64_t s12 = 2097151 & (load_4(s + 31) >> 4); + int64_t s13 = 2097151 & (load_3(s + 34) >> 1); + int64_t s14 = 2097151 & (load_4(s + 36) >> 6); + int64_t s15 = 2097151 & (load_3(s + 39) >> 3); + int64_t s16 = 2097151 & load_3(s + 42); + int64_t s17 = 2097151 & (load_4(s + 44) >> 5); + int64_t s18 = 2097151 & (load_3(s + 47) >> 2); + int64_t s19 = 2097151 & (load_4(s + 49) >> 7); + int64_t s20 = 2097151 & (load_4(s + 52) >> 4); + int64_t s21 = 2097151 & (load_3(s + 55) >> 1); + int64_t s22 = 2097151 & (load_4(s + 57) >> 6); + int64_t s23 = (load_4(s + 60) >> 3); + int64_t carry0; + int64_t carry1; + int64_t carry2; + int64_t carry3; + int64_t carry4; + int64_t carry5; + int64_t carry6; + int64_t carry7; + int64_t carry8; + int64_t carry9; + int64_t carry10; + int64_t carry11; + int64_t carry12; + int64_t carry13; + int64_t carry14; + int64_t carry15; + int64_t carry16; + + s11 += s23 * 666643; + s12 += s23 * 470296; + s13 += s23 * 654183; + s14 -= s23 * 997805; + s15 += s23 * 136657; + s16 -= s23 * 683901; + s23 = 0; + s10 += s22 * 666643; + s11 += s22 * 470296; + s12 += s22 * 654183; + s13 -= s22 * 997805; + s14 += s22 * 136657; + s15 -= s22 * 683901; + s22 = 0; + s9 += s21 * 666643; + s10 += s21 * 470296; + s11 += s21 * 654183; + s12 -= s21 * 997805; + s13 += s21 * 136657; + s14 -= s21 * 683901; + s21 = 0; + s8 += s20 * 666643; + s9 += s20 * 470296; + s10 += s20 * 654183; + s11 -= s20 * 997805; + s12 += s20 * 136657; + s13 -= s20 * 683901; + s20 = 0; + s7 += s19 * 666643; + s8 += s19 * 470296; + s9 += s19 * 654183; + s10 -= s19 * 997805; + s11 += s19 * 136657; + s12 -= s19 * 683901; + s19 = 0; + s6 += s18 * 666643; + s7 += s18 * 470296; + s8 += s18 * 654183; + s9 -= s18 * 997805; + s10 += s18 * 136657; + s11 -= s18 * 683901; + s18 = 0; + carry6 = (s6 + (1 << 20)) >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry8 = (s8 + (1 << 20)) >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry10 = (s10 + (1 << 20)) >> 21; + s11 += carry10; + s10 -= carry10 << 21; + carry12 = (s12 + (1 << 20)) >> 21; + s13 += carry12; + s12 -= carry12 << 21; + carry14 = (s14 + (1 << 20)) >> 21; + s15 += carry14; + s14 -= carry14 << 21; + carry16 = (s16 + (1 << 20)) >> 21; + s17 += carry16; + s16 -= carry16 << 21; + carry7 = (s7 + (1 << 20)) >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry9 = (s9 + (1 << 20)) >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry11 = (s11 + (1 << 20)) >> 21; + s12 += carry11; + s11 -= carry11 << 21; + carry13 = (s13 + (1 << 20)) >> 21; + s14 += carry13; + s13 -= carry13 << 21; + carry15 = (s15 + (1 << 20)) >> 21; + s16 += carry15; + s15 -= carry15 << 21; + s5 += s17 * 666643; + s6 += s17 * 470296; + s7 += s17 * 654183; + s8 -= s17 * 997805; + s9 += s17 * 136657; + s10 -= s17 * 683901; + s17 = 0; + s4 += s16 * 666643; + s5 += s16 * 470296; + s6 += s16 * 654183; + s7 -= s16 * 997805; + s8 += s16 * 136657; + s9 -= s16 * 683901; + s16 = 0; + s3 += s15 * 666643; + s4 += s15 * 470296; + s5 += s15 * 654183; + s6 -= s15 * 997805; + s7 += s15 * 136657; + s8 -= s15 * 683901; + s15 = 0; + s2 += s14 * 666643; + s3 += s14 * 470296; + s4 += s14 * 654183; + s5 -= s14 * 997805; + s6 += s14 * 136657; + s7 -= s14 * 683901; + s14 = 0; + s1 += s13 * 666643; + s2 += s13 * 470296; + s3 += s13 * 654183; + s4 -= s13 * 997805; + s5 += s13 * 136657; + s6 -= s13 * 683901; + s13 = 0; + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + carry0 = (s0 + (1 << 20)) >> 21; + s1 += carry0; + s0 -= carry0 << 21; + carry2 = (s2 + (1 << 20)) >> 21; + s3 += carry2; + s2 -= carry2 << 21; + carry4 = (s4 + (1 << 20)) >> 21; + s5 += carry4; + s4 -= carry4 << 21; + carry6 = (s6 + (1 << 20)) >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry8 = (s8 + (1 << 20)) >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry10 = (s10 + (1 << 20)) >> 21; + s11 += carry10; + s10 -= carry10 << 21; + carry1 = (s1 + (1 << 20)) >> 21; + s2 += carry1; + s1 -= carry1 << 21; + carry3 = (s3 + (1 << 20)) >> 21; + s4 += carry3; + s3 -= carry3 << 21; + carry5 = (s5 + (1 << 20)) >> 21; + s6 += carry5; + s5 -= carry5 << 21; + carry7 = (s7 + (1 << 20)) >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry9 = (s9 + (1 << 20)) >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry11 = (s11 + (1 << 20)) >> 21; + s12 += carry11; + s11 -= carry11 << 21; + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + carry0 = s0 >> 21; + s1 += carry0; + s0 -= carry0 << 21; + carry1 = s1 >> 21; + s2 += carry1; + s1 -= carry1 << 21; + carry2 = s2 >> 21; + s3 += carry2; + s2 -= carry2 << 21; + carry3 = s3 >> 21; + s4 += carry3; + s3 -= carry3 << 21; + carry4 = s4 >> 21; + s5 += carry4; + s4 -= carry4 << 21; + carry5 = s5 >> 21; + s6 += carry5; + s5 -= carry5 << 21; + carry6 = s6 >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry7 = s7 >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry8 = s8 >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry9 = s9 >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry10 = s10 >> 21; + s11 += carry10; + s10 -= carry10 << 21; + carry11 = s11 >> 21; + s12 += carry11; + s11 -= carry11 << 21; + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + carry0 = s0 >> 21; + s1 += carry0; + s0 -= carry0 << 21; + carry1 = s1 >> 21; + s2 += carry1; + s1 -= carry1 << 21; + carry2 = s2 >> 21; + s3 += carry2; + s2 -= carry2 << 21; + carry3 = s3 >> 21; + s4 += carry3; + s3 -= carry3 << 21; + carry4 = s4 >> 21; + s5 += carry4; + s4 -= carry4 << 21; + carry5 = s5 >> 21; + s6 += carry5; + s5 -= carry5 << 21; + carry6 = s6 >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry7 = s7 >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry8 = s8 >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry9 = s9 >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry10 = s10 >> 21; + s11 += carry10; + s10 -= carry10 << 21; + + s[0] = (unsigned char) (s0 >> 0); + s[1] = (unsigned char) (s0 >> 8); + s[2] = (unsigned char) ((s0 >> 16) | (s1 << 5)); + s[3] = (unsigned char) (s1 >> 3); + s[4] = (unsigned char) (s1 >> 11); + s[5] = (unsigned char) ((s1 >> 19) | (s2 << 2)); + s[6] = (unsigned char) (s2 >> 6); + s[7] = (unsigned char) ((s2 >> 14) | (s3 << 7)); + s[8] = (unsigned char) (s3 >> 1); + s[9] = (unsigned char) (s3 >> 9); + s[10] = (unsigned char) ((s3 >> 17) | (s4 << 4)); + s[11] = (unsigned char) (s4 >> 4); + s[12] = (unsigned char) (s4 >> 12); + s[13] = (unsigned char) ((s4 >> 20) | (s5 << 1)); + s[14] = (unsigned char) (s5 >> 7); + s[15] = (unsigned char) ((s5 >> 15) | (s6 << 6)); + s[16] = (unsigned char) (s6 >> 2); + s[17] = (unsigned char) (s6 >> 10); + s[18] = (unsigned char) ((s6 >> 18) | (s7 << 3)); + s[19] = (unsigned char) (s7 >> 5); + s[20] = (unsigned char) (s7 >> 13); + s[21] = (unsigned char) (s8 >> 0); + s[22] = (unsigned char) (s8 >> 8); + s[23] = (unsigned char) ((s8 >> 16) | (s9 << 5)); + s[24] = (unsigned char) (s9 >> 3); + s[25] = (unsigned char) (s9 >> 11); + s[26] = (unsigned char) ((s9 >> 19) | (s10 << 2)); + s[27] = (unsigned char) (s10 >> 6); + s[28] = (unsigned char) ((s10 >> 14) | (s11 << 7)); + s[29] = (unsigned char) (s11 >> 1); + s[30] = (unsigned char) (s11 >> 9); + s[31] = (unsigned char) (s11 >> 17); +} + + + +/* +Input: + a[0]+256*a[1]+...+256^31*a[31] = a + b[0]+256*b[1]+...+256^31*b[31] = b + c[0]+256*c[1]+...+256^31*c[31] = c + +Output: + s[0]+256*s[1]+...+256^31*s[31] = (ab+c) mod l + where l = 2^252 + 27742317777372353535851937790883648493. +*/ + +void sc_muladd(unsigned char *s, const unsigned char *a, const unsigned char *b, const unsigned char *c) { + int64_t a0 = 2097151 & load_3(a); + int64_t a1 = 2097151 & (load_4(a + 2) >> 5); + int64_t a2 = 2097151 & (load_3(a + 5) >> 2); + int64_t a3 = 2097151 & (load_4(a + 7) >> 7); + int64_t a4 = 2097151 & (load_4(a + 10) >> 4); + int64_t a5 = 2097151 & (load_3(a + 13) >> 1); + int64_t a6 = 2097151 & (load_4(a + 15) >> 6); + int64_t a7 = 2097151 & (load_3(a + 18) >> 3); + int64_t a8 = 2097151 & load_3(a + 21); + int64_t a9 = 2097151 & (load_4(a + 23) >> 5); + int64_t a10 = 2097151 & (load_3(a + 26) >> 2); + int64_t a11 = (load_4(a + 28) >> 7); + int64_t b0 = 2097151 & load_3(b); + int64_t b1 = 2097151 & (load_4(b + 2) >> 5); + int64_t b2 = 2097151 & (load_3(b + 5) >> 2); + int64_t b3 = 2097151 & (load_4(b + 7) >> 7); + int64_t b4 = 2097151 & (load_4(b + 10) >> 4); + int64_t b5 = 2097151 & (load_3(b + 13) >> 1); + int64_t b6 = 2097151 & (load_4(b + 15) >> 6); + int64_t b7 = 2097151 & (load_3(b + 18) >> 3); + int64_t b8 = 2097151 & load_3(b + 21); + int64_t b9 = 2097151 & (load_4(b + 23) >> 5); + int64_t b10 = 2097151 & (load_3(b + 26) >> 2); + int64_t b11 = (load_4(b + 28) >> 7); + int64_t c0 = 2097151 & load_3(c); + int64_t c1 = 2097151 & (load_4(c + 2) >> 5); + int64_t c2 = 2097151 & (load_3(c + 5) >> 2); + int64_t c3 = 2097151 & (load_4(c + 7) >> 7); + int64_t c4 = 2097151 & (load_4(c + 10) >> 4); + int64_t c5 = 2097151 & (load_3(c + 13) >> 1); + int64_t c6 = 2097151 & (load_4(c + 15) >> 6); + int64_t c7 = 2097151 & (load_3(c + 18) >> 3); + int64_t c8 = 2097151 & load_3(c + 21); + int64_t c9 = 2097151 & (load_4(c + 23) >> 5); + int64_t c10 = 2097151 & (load_3(c + 26) >> 2); + int64_t c11 = (load_4(c + 28) >> 7); + int64_t s0; + int64_t s1; + int64_t s2; + int64_t s3; + int64_t s4; + int64_t s5; + int64_t s6; + int64_t s7; + int64_t s8; + int64_t s9; + int64_t s10; + int64_t s11; + int64_t s12; + int64_t s13; + int64_t s14; + int64_t s15; + int64_t s16; + int64_t s17; + int64_t s18; + int64_t s19; + int64_t s20; + int64_t s21; + int64_t s22; + int64_t s23; + int64_t carry0; + int64_t carry1; + int64_t carry2; + int64_t carry3; + int64_t carry4; + int64_t carry5; + int64_t carry6; + int64_t carry7; + int64_t carry8; + int64_t carry9; + int64_t carry10; + int64_t carry11; + int64_t carry12; + int64_t carry13; + int64_t carry14; + int64_t carry15; + int64_t carry16; + int64_t carry17; + int64_t carry18; + int64_t carry19; + int64_t carry20; + int64_t carry21; + int64_t carry22; + + s0 = c0 + a0 * b0; + s1 = c1 + a0 * b1 + a1 * b0; + s2 = c2 + a0 * b2 + a1 * b1 + a2 * b0; + s3 = c3 + a0 * b3 + a1 * b2 + a2 * b1 + a3 * b0; + s4 = c4 + a0 * b4 + a1 * b3 + a2 * b2 + a3 * b1 + a4 * b0; + s5 = c5 + a0 * b5 + a1 * b4 + a2 * b3 + a3 * b2 + a4 * b1 + a5 * b0; + s6 = c6 + a0 * b6 + a1 * b5 + a2 * b4 + a3 * b3 + a4 * b2 + a5 * b1 + a6 * b0; + s7 = c7 + a0 * b7 + a1 * b6 + a2 * b5 + a3 * b4 + a4 * b3 + a5 * b2 + a6 * b1 + a7 * b0; + s8 = c8 + a0 * b8 + a1 * b7 + a2 * b6 + a3 * b5 + a4 * b4 + a5 * b3 + a6 * b2 + a7 * b1 + a8 * b0; + s9 = c9 + a0 * b9 + a1 * b8 + a2 * b7 + a3 * b6 + a4 * b5 + a5 * b4 + a6 * b3 + a7 * b2 + a8 * b1 + a9 * b0; + s10 = c10 + a0 * b10 + a1 * b9 + a2 * b8 + a3 * b7 + a4 * b6 + a5 * b5 + a6 * b4 + a7 * b3 + a8 * b2 + a9 * b1 + a10 * b0; + s11 = c11 + a0 * b11 + a1 * b10 + a2 * b9 + a3 * b8 + a4 * b7 + a5 * b6 + a6 * b5 + a7 * b4 + a8 * b3 + a9 * b2 + a10 * b1 + a11 * b0; + s12 = a1 * b11 + a2 * b10 + a3 * b9 + a4 * b8 + a5 * b7 + a6 * b6 + a7 * b5 + a8 * b4 + a9 * b3 + a10 * b2 + a11 * b1; + s13 = a2 * b11 + a3 * b10 + a4 * b9 + a5 * b8 + a6 * b7 + a7 * b6 + a8 * b5 + a9 * b4 + a10 * b3 + a11 * b2; + s14 = a3 * b11 + a4 * b10 + a5 * b9 + a6 * b8 + a7 * b7 + a8 * b6 + a9 * b5 + a10 * b4 + a11 * b3; + s15 = a4 * b11 + a5 * b10 + a6 * b9 + a7 * b8 + a8 * b7 + a9 * b6 + a10 * b5 + a11 * b4; + s16 = a5 * b11 + a6 * b10 + a7 * b9 + a8 * b8 + a9 * b7 + a10 * b6 + a11 * b5; + s17 = a6 * b11 + a7 * b10 + a8 * b9 + a9 * b8 + a10 * b7 + a11 * b6; + s18 = a7 * b11 + a8 * b10 + a9 * b9 + a10 * b8 + a11 * b7; + s19 = a8 * b11 + a9 * b10 + a10 * b9 + a11 * b8; + s20 = a9 * b11 + a10 * b10 + a11 * b9; + s21 = a10 * b11 + a11 * b10; + s22 = a11 * b11; + s23 = 0; + carry0 = (s0 + (1 << 20)) >> 21; + s1 += carry0; + s0 -= carry0 << 21; + carry2 = (s2 + (1 << 20)) >> 21; + s3 += carry2; + s2 -= carry2 << 21; + carry4 = (s4 + (1 << 20)) >> 21; + s5 += carry4; + s4 -= carry4 << 21; + carry6 = (s6 + (1 << 20)) >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry8 = (s8 + (1 << 20)) >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry10 = (s10 + (1 << 20)) >> 21; + s11 += carry10; + s10 -= carry10 << 21; + carry12 = (s12 + (1 << 20)) >> 21; + s13 += carry12; + s12 -= carry12 << 21; + carry14 = (s14 + (1 << 20)) >> 21; + s15 += carry14; + s14 -= carry14 << 21; + carry16 = (s16 + (1 << 20)) >> 21; + s17 += carry16; + s16 -= carry16 << 21; + carry18 = (s18 + (1 << 20)) >> 21; + s19 += carry18; + s18 -= carry18 << 21; + carry20 = (s20 + (1 << 20)) >> 21; + s21 += carry20; + s20 -= carry20 << 21; + carry22 = (s22 + (1 << 20)) >> 21; + s23 += carry22; + s22 -= carry22 << 21; + carry1 = (s1 + (1 << 20)) >> 21; + s2 += carry1; + s1 -= carry1 << 21; + carry3 = (s3 + (1 << 20)) >> 21; + s4 += carry3; + s3 -= carry3 << 21; + carry5 = (s5 + (1 << 20)) >> 21; + s6 += carry5; + s5 -= carry5 << 21; + carry7 = (s7 + (1 << 20)) >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry9 = (s9 + (1 << 20)) >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry11 = (s11 + (1 << 20)) >> 21; + s12 += carry11; + s11 -= carry11 << 21; + carry13 = (s13 + (1 << 20)) >> 21; + s14 += carry13; + s13 -= carry13 << 21; + carry15 = (s15 + (1 << 20)) >> 21; + s16 += carry15; + s15 -= carry15 << 21; + carry17 = (s17 + (1 << 20)) >> 21; + s18 += carry17; + s17 -= carry17 << 21; + carry19 = (s19 + (1 << 20)) >> 21; + s20 += carry19; + s19 -= carry19 << 21; + carry21 = (s21 + (1 << 20)) >> 21; + s22 += carry21; + s21 -= carry21 << 21; + s11 += s23 * 666643; + s12 += s23 * 470296; + s13 += s23 * 654183; + s14 -= s23 * 997805; + s15 += s23 * 136657; + s16 -= s23 * 683901; + s23 = 0; + s10 += s22 * 666643; + s11 += s22 * 470296; + s12 += s22 * 654183; + s13 -= s22 * 997805; + s14 += s22 * 136657; + s15 -= s22 * 683901; + s22 = 0; + s9 += s21 * 666643; + s10 += s21 * 470296; + s11 += s21 * 654183; + s12 -= s21 * 997805; + s13 += s21 * 136657; + s14 -= s21 * 683901; + s21 = 0; + s8 += s20 * 666643; + s9 += s20 * 470296; + s10 += s20 * 654183; + s11 -= s20 * 997805; + s12 += s20 * 136657; + s13 -= s20 * 683901; + s20 = 0; + s7 += s19 * 666643; + s8 += s19 * 470296; + s9 += s19 * 654183; + s10 -= s19 * 997805; + s11 += s19 * 136657; + s12 -= s19 * 683901; + s19 = 0; + s6 += s18 * 666643; + s7 += s18 * 470296; + s8 += s18 * 654183; + s9 -= s18 * 997805; + s10 += s18 * 136657; + s11 -= s18 * 683901; + s18 = 0; + carry6 = (s6 + (1 << 20)) >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry8 = (s8 + (1 << 20)) >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry10 = (s10 + (1 << 20)) >> 21; + s11 += carry10; + s10 -= carry10 << 21; + carry12 = (s12 + (1 << 20)) >> 21; + s13 += carry12; + s12 -= carry12 << 21; + carry14 = (s14 + (1 << 20)) >> 21; + s15 += carry14; + s14 -= carry14 << 21; + carry16 = (s16 + (1 << 20)) >> 21; + s17 += carry16; + s16 -= carry16 << 21; + carry7 = (s7 + (1 << 20)) >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry9 = (s9 + (1 << 20)) >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry11 = (s11 + (1 << 20)) >> 21; + s12 += carry11; + s11 -= carry11 << 21; + carry13 = (s13 + (1 << 20)) >> 21; + s14 += carry13; + s13 -= carry13 << 21; + carry15 = (s15 + (1 << 20)) >> 21; + s16 += carry15; + s15 -= carry15 << 21; + s5 += s17 * 666643; + s6 += s17 * 470296; + s7 += s17 * 654183; + s8 -= s17 * 997805; + s9 += s17 * 136657; + s10 -= s17 * 683901; + s17 = 0; + s4 += s16 * 666643; + s5 += s16 * 470296; + s6 += s16 * 654183; + s7 -= s16 * 997805; + s8 += s16 * 136657; + s9 -= s16 * 683901; + s16 = 0; + s3 += s15 * 666643; + s4 += s15 * 470296; + s5 += s15 * 654183; + s6 -= s15 * 997805; + s7 += s15 * 136657; + s8 -= s15 * 683901; + s15 = 0; + s2 += s14 * 666643; + s3 += s14 * 470296; + s4 += s14 * 654183; + s5 -= s14 * 997805; + s6 += s14 * 136657; + s7 -= s14 * 683901; + s14 = 0; + s1 += s13 * 666643; + s2 += s13 * 470296; + s3 += s13 * 654183; + s4 -= s13 * 997805; + s5 += s13 * 136657; + s6 -= s13 * 683901; + s13 = 0; + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + carry0 = (s0 + (1 << 20)) >> 21; + s1 += carry0; + s0 -= carry0 << 21; + carry2 = (s2 + (1 << 20)) >> 21; + s3 += carry2; + s2 -= carry2 << 21; + carry4 = (s4 + (1 << 20)) >> 21; + s5 += carry4; + s4 -= carry4 << 21; + carry6 = (s6 + (1 << 20)) >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry8 = (s8 + (1 << 20)) >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry10 = (s10 + (1 << 20)) >> 21; + s11 += carry10; + s10 -= carry10 << 21; + carry1 = (s1 + (1 << 20)) >> 21; + s2 += carry1; + s1 -= carry1 << 21; + carry3 = (s3 + (1 << 20)) >> 21; + s4 += carry3; + s3 -= carry3 << 21; + carry5 = (s5 + (1 << 20)) >> 21; + s6 += carry5; + s5 -= carry5 << 21; + carry7 = (s7 + (1 << 20)) >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry9 = (s9 + (1 << 20)) >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry11 = (s11 + (1 << 20)) >> 21; + s12 += carry11; + s11 -= carry11 << 21; + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + carry0 = s0 >> 21; + s1 += carry0; + s0 -= carry0 << 21; + carry1 = s1 >> 21; + s2 += carry1; + s1 -= carry1 << 21; + carry2 = s2 >> 21; + s3 += carry2; + s2 -= carry2 << 21; + carry3 = s3 >> 21; + s4 += carry3; + s3 -= carry3 << 21; + carry4 = s4 >> 21; + s5 += carry4; + s4 -= carry4 << 21; + carry5 = s5 >> 21; + s6 += carry5; + s5 -= carry5 << 21; + carry6 = s6 >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry7 = s7 >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry8 = s8 >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry9 = s9 >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry10 = s10 >> 21; + s11 += carry10; + s10 -= carry10 << 21; + carry11 = s11 >> 21; + s12 += carry11; + s11 -= carry11 << 21; + s0 += s12 * 666643; + s1 += s12 * 470296; + s2 += s12 * 654183; + s3 -= s12 * 997805; + s4 += s12 * 136657; + s5 -= s12 * 683901; + s12 = 0; + carry0 = s0 >> 21; + s1 += carry0; + s0 -= carry0 << 21; + carry1 = s1 >> 21; + s2 += carry1; + s1 -= carry1 << 21; + carry2 = s2 >> 21; + s3 += carry2; + s2 -= carry2 << 21; + carry3 = s3 >> 21; + s4 += carry3; + s3 -= carry3 << 21; + carry4 = s4 >> 21; + s5 += carry4; + s4 -= carry4 << 21; + carry5 = s5 >> 21; + s6 += carry5; + s5 -= carry5 << 21; + carry6 = s6 >> 21; + s7 += carry6; + s6 -= carry6 << 21; + carry7 = s7 >> 21; + s8 += carry7; + s7 -= carry7 << 21; + carry8 = s8 >> 21; + s9 += carry8; + s8 -= carry8 << 21; + carry9 = s9 >> 21; + s10 += carry9; + s9 -= carry9 << 21; + carry10 = s10 >> 21; + s11 += carry10; + s10 -= carry10 << 21; + + s[0] = (unsigned char) (s0 >> 0); + s[1] = (unsigned char) (s0 >> 8); + s[2] = (unsigned char) ((s0 >> 16) | (s1 << 5)); + s[3] = (unsigned char) (s1 >> 3); + s[4] = (unsigned char) (s1 >> 11); + s[5] = (unsigned char) ((s1 >> 19) | (s2 << 2)); + s[6] = (unsigned char) (s2 >> 6); + s[7] = (unsigned char) ((s2 >> 14) | (s3 << 7)); + s[8] = (unsigned char) (s3 >> 1); + s[9] = (unsigned char) (s3 >> 9); + s[10] = (unsigned char) ((s3 >> 17) | (s4 << 4)); + s[11] = (unsigned char) (s4 >> 4); + s[12] = (unsigned char) (s4 >> 12); + s[13] = (unsigned char) ((s4 >> 20) | (s5 << 1)); + s[14] = (unsigned char) (s5 >> 7); + s[15] = (unsigned char) ((s5 >> 15) | (s6 << 6)); + s[16] = (unsigned char) (s6 >> 2); + s[17] = (unsigned char) (s6 >> 10); + s[18] = (unsigned char) ((s6 >> 18) | (s7 << 3)); + s[19] = (unsigned char) (s7 >> 5); + s[20] = (unsigned char) (s7 >> 13); + s[21] = (unsigned char) (s8 >> 0); + s[22] = (unsigned char) (s8 >> 8); + s[23] = (unsigned char) ((s8 >> 16) | (s9 << 5)); + s[24] = (unsigned char) (s9 >> 3); + s[25] = (unsigned char) (s9 >> 11); + s[26] = (unsigned char) ((s9 >> 19) | (s10 << 2)); + s[27] = (unsigned char) (s10 >> 6); + s[28] = (unsigned char) ((s10 >> 14) | (s11 << 7)); + s[29] = (unsigned char) (s11 >> 1); + s[30] = (unsigned char) (s11 >> 9); + s[31] = (unsigned char) (s11 >> 17); +} diff --git a/src/cryptoconditions/src/include/ed25519/src/sc.h b/src/cryptoconditions/src/include/ed25519/src/sc.h new file mode 100644 index 00000000000..e29e7fa5af2 --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/sc.h @@ -0,0 +1,12 @@ +#ifndef SC_H +#define SC_H + +/* +The set of scalars is \Z/l +where l = 2^252 + 27742317777372353535851937790883648493. +*/ + +void sc_reduce(unsigned char *s); +void sc_muladd(unsigned char *s, const unsigned char *a, const unsigned char *b, const unsigned char *c); + +#endif diff --git a/src/cryptoconditions/src/include/ed25519/src/seed.c b/src/cryptoconditions/src/include/ed25519/src/seed.c new file mode 100644 index 00000000000..11a2e3ec460 --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/seed.c @@ -0,0 +1,40 @@ +#include "ed25519.h" + +#ifndef ED25519_NO_SEED + +#ifdef _WIN32 +#include +#include +#else +#include +#endif + +int ed25519_create_seed(unsigned char *seed) { +#ifdef _WIN32 + HCRYPTPROV prov; + + if (!CryptAcquireContext(&prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { + return 1; + } + + if (!CryptGenRandom(prov, 32, seed)) { + CryptReleaseContext(prov, 0); + return 1; + } + + CryptReleaseContext(prov, 0); +#else + FILE *f = fopen("/dev/urandom", "rb"); + + if (f == NULL) { + return 1; + } + + fread(seed, 1, 32, f); + fclose(f); +#endif + + return 0; +} + +#endif diff --git a/src/cryptoconditions/src/include/ed25519/src/sha512.c b/src/cryptoconditions/src/include/ed25519/src/sha512.c new file mode 100644 index 00000000000..cb8ae717539 --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/sha512.c @@ -0,0 +1,275 @@ +/* LibTomCrypt, modular cryptographic library -- Tom St Denis + * + * LibTomCrypt is a library that provides various cryptographic + * algorithms in a highly modular and flexible manner. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +#include "fixedint.h" +#include "sha512.h" + +/* the K array */ +static const uint64_t K[80] = { + UINT64_C(0x428a2f98d728ae22), UINT64_C(0x7137449123ef65cd), + UINT64_C(0xb5c0fbcfec4d3b2f), UINT64_C(0xe9b5dba58189dbbc), + UINT64_C(0x3956c25bf348b538), UINT64_C(0x59f111f1b605d019), + UINT64_C(0x923f82a4af194f9b), UINT64_C(0xab1c5ed5da6d8118), + UINT64_C(0xd807aa98a3030242), UINT64_C(0x12835b0145706fbe), + UINT64_C(0x243185be4ee4b28c), UINT64_C(0x550c7dc3d5ffb4e2), + UINT64_C(0x72be5d74f27b896f), UINT64_C(0x80deb1fe3b1696b1), + UINT64_C(0x9bdc06a725c71235), UINT64_C(0xc19bf174cf692694), + UINT64_C(0xe49b69c19ef14ad2), UINT64_C(0xefbe4786384f25e3), + UINT64_C(0x0fc19dc68b8cd5b5), UINT64_C(0x240ca1cc77ac9c65), + UINT64_C(0x2de92c6f592b0275), UINT64_C(0x4a7484aa6ea6e483), + UINT64_C(0x5cb0a9dcbd41fbd4), UINT64_C(0x76f988da831153b5), + UINT64_C(0x983e5152ee66dfab), UINT64_C(0xa831c66d2db43210), + UINT64_C(0xb00327c898fb213f), UINT64_C(0xbf597fc7beef0ee4), + UINT64_C(0xc6e00bf33da88fc2), UINT64_C(0xd5a79147930aa725), + UINT64_C(0x06ca6351e003826f), UINT64_C(0x142929670a0e6e70), + UINT64_C(0x27b70a8546d22ffc), UINT64_C(0x2e1b21385c26c926), + UINT64_C(0x4d2c6dfc5ac42aed), UINT64_C(0x53380d139d95b3df), + UINT64_C(0x650a73548baf63de), UINT64_C(0x766a0abb3c77b2a8), + UINT64_C(0x81c2c92e47edaee6), UINT64_C(0x92722c851482353b), + UINT64_C(0xa2bfe8a14cf10364), UINT64_C(0xa81a664bbc423001), + UINT64_C(0xc24b8b70d0f89791), UINT64_C(0xc76c51a30654be30), + UINT64_C(0xd192e819d6ef5218), UINT64_C(0xd69906245565a910), + UINT64_C(0xf40e35855771202a), UINT64_C(0x106aa07032bbd1b8), + UINT64_C(0x19a4c116b8d2d0c8), UINT64_C(0x1e376c085141ab53), + UINT64_C(0x2748774cdf8eeb99), UINT64_C(0x34b0bcb5e19b48a8), + UINT64_C(0x391c0cb3c5c95a63), UINT64_C(0x4ed8aa4ae3418acb), + UINT64_C(0x5b9cca4f7763e373), UINT64_C(0x682e6ff3d6b2b8a3), + UINT64_C(0x748f82ee5defb2fc), UINT64_C(0x78a5636f43172f60), + UINT64_C(0x84c87814a1f0ab72), UINT64_C(0x8cc702081a6439ec), + UINT64_C(0x90befffa23631e28), UINT64_C(0xa4506cebde82bde9), + UINT64_C(0xbef9a3f7b2c67915), UINT64_C(0xc67178f2e372532b), + UINT64_C(0xca273eceea26619c), UINT64_C(0xd186b8c721c0c207), + UINT64_C(0xeada7dd6cde0eb1e), UINT64_C(0xf57d4f7fee6ed178), + UINT64_C(0x06f067aa72176fba), UINT64_C(0x0a637dc5a2c898a6), + UINT64_C(0x113f9804bef90dae), UINT64_C(0x1b710b35131c471b), + UINT64_C(0x28db77f523047d84), UINT64_C(0x32caab7b40c72493), + UINT64_C(0x3c9ebe0a15c9bebc), UINT64_C(0x431d67c49c100d4c), + UINT64_C(0x4cc5d4becb3e42b6), UINT64_C(0x597f299cfc657e2a), + UINT64_C(0x5fcb6fab3ad6faec), UINT64_C(0x6c44198c4a475817) +}; + +/* Various logical functions */ + +#define ROR64c(x, y) \ + ( ((((x)&UINT64_C(0xFFFFFFFFFFFFFFFF))>>((uint64_t)(y)&UINT64_C(63))) | \ + ((x)<<((uint64_t)(64-((y)&UINT64_C(63)))))) & UINT64_C(0xFFFFFFFFFFFFFFFF)) + +#define STORE64H(x, y) \ + { (y)[0] = (unsigned char)(((x)>>56)&255); (y)[1] = (unsigned char)(((x)>>48)&255); \ + (y)[2] = (unsigned char)(((x)>>40)&255); (y)[3] = (unsigned char)(((x)>>32)&255); \ + (y)[4] = (unsigned char)(((x)>>24)&255); (y)[5] = (unsigned char)(((x)>>16)&255); \ + (y)[6] = (unsigned char)(((x)>>8)&255); (y)[7] = (unsigned char)((x)&255); } + +#define LOAD64H(x, y) \ + { x = (((uint64_t)((y)[0] & 255))<<56)|(((uint64_t)((y)[1] & 255))<<48) | \ + (((uint64_t)((y)[2] & 255))<<40)|(((uint64_t)((y)[3] & 255))<<32) | \ + (((uint64_t)((y)[4] & 255))<<24)|(((uint64_t)((y)[5] & 255))<<16) | \ + (((uint64_t)((y)[6] & 255))<<8)|(((uint64_t)((y)[7] & 255))); } + + +#define Ch(x,y,z) (z ^ (x & (y ^ z))) +#define Maj(x,y,z) (((x | y) & z) | (x & y)) +#define S(x, n) ROR64c(x, n) +#define R(x, n) (((x) &UINT64_C(0xFFFFFFFFFFFFFFFF))>>((uint64_t)n)) +#define Sigma0(x) (S(x, 28) ^ S(x, 34) ^ S(x, 39)) +#define Sigma1(x) (S(x, 14) ^ S(x, 18) ^ S(x, 41)) +#define Gamma0(x) (S(x, 1) ^ S(x, 8) ^ R(x, 7)) +#define Gamma1(x) (S(x, 19) ^ S(x, 61) ^ R(x, 6)) +#ifndef MIN + #define MIN(x, y) ( ((x)<(y))?(x):(y) ) +#endif + +/* compress 1024-bits */ +static int sha512_compress(sha512_context *md, unsigned char *buf) +{ + uint64_t S[8], W[80], t0, t1; + int i; + + /* copy state into S */ + for (i = 0; i < 8; i++) { + S[i] = md->state[i]; + } + + /* copy the state into 1024-bits into W[0..15] */ + for (i = 0; i < 16; i++) { + LOAD64H(W[i], buf + (8*i)); + } + + /* fill W[16..79] */ + for (i = 16; i < 80; i++) { + W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16]; + } + +/* Compress */ + #define RND(a,b,c,d,e,f,g,h,i) \ + t0 = h + Sigma1(e) + Ch(e, f, g) + K[i] + W[i]; \ + t1 = Sigma0(a) + Maj(a, b, c);\ + d += t0; \ + h = t0 + t1; + + for (i = 0; i < 80; i += 8) { + RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],i+0); + RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],i+1); + RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],i+2); + RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],i+3); + RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],i+4); + RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],i+5); + RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],i+6); + RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],i+7); + } + + #undef RND + + + + /* feedback */ + for (i = 0; i < 8; i++) { + md->state[i] = md->state[i] + S[i]; + } + + return 0; +} + + +/** + Initialize the hash state + @param md The hash state you wish to initialize + @return 0 if successful +*/ +int sha512_init(sha512_context * md) { + if (md == NULL) return 1; + + md->curlen = 0; + md->length = 0; + md->state[0] = UINT64_C(0x6a09e667f3bcc908); + md->state[1] = UINT64_C(0xbb67ae8584caa73b); + md->state[2] = UINT64_C(0x3c6ef372fe94f82b); + md->state[3] = UINT64_C(0xa54ff53a5f1d36f1); + md->state[4] = UINT64_C(0x510e527fade682d1); + md->state[5] = UINT64_C(0x9b05688c2b3e6c1f); + md->state[6] = UINT64_C(0x1f83d9abfb41bd6b); + md->state[7] = UINT64_C(0x5be0cd19137e2179); + + return 0; +} + +/** + Process a block of memory though the hash + @param md The hash state + @param in The data to hash + @param inlen The length of the data (octets) + @return 0 if successful +*/ +int sha512_update (sha512_context * md, const unsigned char *in, size_t inlen) +{ + size_t n; + size_t i; + int err; + if (md == NULL) return 1; + if (in == NULL) return 1; + if (md->curlen > sizeof(md->buf)) { + return 1; + } + while (inlen > 0) { + if (md->curlen == 0 && inlen >= 128) { + if ((err = sha512_compress (md, (unsigned char *)in)) != 0) { + return err; + } + md->length += 128 * 8; + in += 128; + inlen -= 128; + } else { + n = MIN(inlen, (128 - md->curlen)); + + for (i = 0; i < n; i++) { + md->buf[i + md->curlen] = in[i]; + } + + + md->curlen += n; + in += n; + inlen -= n; + if (md->curlen == 128) { + if ((err = sha512_compress (md, md->buf)) != 0) { + return err; + } + md->length += 8*128; + md->curlen = 0; + } + } + } + return 0; +} + +/** + Terminate the hash to get the digest + @param md The hash state + @param out [out] The destination of the hash (64 bytes) + @return 0 if successful +*/ + int sha512_final(sha512_context * md, unsigned char *out) + { + int i; + + if (md == NULL) return 1; + if (out == NULL) return 1; + + if (md->curlen >= sizeof(md->buf)) { + return 1; + } + + /* increase the length of the message */ + md->length += md->curlen * UINT64_C(8); + + /* append the '1' bit */ + md->buf[md->curlen++] = (unsigned char)0x80; + + /* if the length is currently above 112 bytes we append zeros + * then compress. Then we can fall back to padding zeros and length + * encoding like normal. + */ + if (md->curlen > 112) { + while (md->curlen < 128) { + md->buf[md->curlen++] = (unsigned char)0; + } + sha512_compress(md, md->buf); + md->curlen = 0; + } + + /* pad upto 120 bytes of zeroes + * note: that from 112 to 120 is the 64 MSB of the length. We assume that you won't hash + * > 2^64 bits of data... :-) + */ +while (md->curlen < 120) { + md->buf[md->curlen++] = (unsigned char)0; +} + + /* store length */ +STORE64H(md->length, md->buf+120); +sha512_compress(md, md->buf); + + /* copy output */ +for (i = 0; i < 8; i++) { + STORE64H(md->state[i], out+(8*i)); +} + +return 0; +} + +int sha512(const unsigned char *message, size_t message_len, unsigned char *out) +{ + sha512_context ctx; + int ret; + if ((ret = sha512_init(&ctx))) return ret; + if ((ret = sha512_update(&ctx, message, message_len))) return ret; + if ((ret = sha512_final(&ctx, out))) return ret; + return 0; +} diff --git a/src/cryptoconditions/src/include/ed25519/src/sha512.h b/src/cryptoconditions/src/include/ed25519/src/sha512.h new file mode 100644 index 00000000000..a34dd5e429e --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/sha512.h @@ -0,0 +1,21 @@ +#ifndef SHA512_H +#define SHA512_H + +#include + +#include "fixedint.h" + +/* state */ +typedef struct sha512_context_ { + uint64_t length, state[8]; + size_t curlen; + unsigned char buf[128]; +} sha512_context; + + +int sha512_init(sha512_context * md); +int sha512_final(sha512_context * md, unsigned char *out); +int sha512_update(sha512_context * md, const unsigned char *in, size_t inlen); +int sha512(const unsigned char *message, size_t message_len, unsigned char *out); + +#endif diff --git a/src/cryptoconditions/src/include/ed25519/src/sign.c b/src/cryptoconditions/src/include/ed25519/src/sign.c new file mode 100644 index 00000000000..199a8393b2b --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/sign.c @@ -0,0 +1,31 @@ +#include "ed25519.h" +#include "sha512.h" +#include "ge.h" +#include "sc.h" + + +void ed25519_sign(unsigned char *signature, const unsigned char *message, size_t message_len, const unsigned char *public_key, const unsigned char *private_key) { + sha512_context hash; + unsigned char hram[64]; + unsigned char r[64]; + ge_p3 R; + + + sha512_init(&hash); + sha512_update(&hash, private_key + 32, 32); + sha512_update(&hash, message, message_len); + sha512_final(&hash, r); + + sc_reduce(r); + ge_scalarmult_base(&R, r); + ge_p3_tobytes(signature, &R); + + sha512_init(&hash); + sha512_update(&hash, signature, 32); + sha512_update(&hash, public_key, 32); + sha512_update(&hash, message, message_len); + sha512_final(&hash, hram); + + sc_reduce(hram); + sc_muladd(signature + 32, hram, private_key, r); +} diff --git a/src/cryptoconditions/src/include/ed25519/src/verify.c b/src/cryptoconditions/src/include/ed25519/src/verify.c new file mode 100644 index 00000000000..32f988edc8b --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/src/verify.c @@ -0,0 +1,77 @@ +#include "ed25519.h" +#include "sha512.h" +#include "ge.h" +#include "sc.h" + +static int consttime_equal(const unsigned char *x, const unsigned char *y) { + unsigned char r = 0; + + r = x[0] ^ y[0]; + #define F(i) r |= x[i] ^ y[i] + F(1); + F(2); + F(3); + F(4); + F(5); + F(6); + F(7); + F(8); + F(9); + F(10); + F(11); + F(12); + F(13); + F(14); + F(15); + F(16); + F(17); + F(18); + F(19); + F(20); + F(21); + F(22); + F(23); + F(24); + F(25); + F(26); + F(27); + F(28); + F(29); + F(30); + F(31); + #undef F + + return !r; +} + +int ed25519_verify(const unsigned char *signature, const unsigned char *message, size_t message_len, const unsigned char *public_key) { + unsigned char h[64]; + unsigned char checker[32]; + sha512_context hash; + ge_p3 A; + ge_p2 R; + + if (signature[63] & 224) { + return 0; + } + + if (ge_frombytes_negate_vartime(&A, public_key) != 0) { + return 0; + } + + sha512_init(&hash); + sha512_update(&hash, signature, 32); + sha512_update(&hash, public_key, 32); + sha512_update(&hash, message, message_len); + sha512_final(&hash, h); + + sc_reduce(h); + ge_double_scalarmult_vartime(&R, h, &A, signature + 32); + ge_tobytes(checker, &R); + + if (!consttime_equal(checker, signature)) { + return 0; + } + + return 1; +} diff --git a/src/cryptoconditions/src/include/ed25519/test.c b/src/cryptoconditions/src/include/ed25519/test.c new file mode 100644 index 00000000000..e2159a9af82 --- /dev/null +++ b/src/cryptoconditions/src/include/ed25519/test.c @@ -0,0 +1,150 @@ +#include +#include +#include +#include + +/* #define ED25519_DLL */ +#include "src/ed25519.h" + +#include "src/ge.h" +#include "src/sc.h" + + +int main() { + unsigned char public_key[32], private_key[64], seed[32], scalar[32]; + unsigned char other_public_key[32], other_private_key[64]; + unsigned char shared_secret[32], other_shared_secret[32]; + unsigned char signature[64]; + + clock_t start; + clock_t end; + int i; + + const unsigned char message[] = "Hello, world!"; + const int message_len = strlen((char*) message); + + /* create a random seed, and a keypair out of that seed */ + ed25519_create_seed(seed); + ed25519_create_keypair(public_key, private_key, seed); + + /* create signature on the message with the keypair */ + ed25519_sign(signature, message, message_len, public_key, private_key); + + /* verify the signature */ + if (ed25519_verify(signature, message, message_len, public_key)) { + printf("valid signature\n"); + } else { + printf("invalid signature\n"); + } + + /* create scalar and add it to the keypair */ + ed25519_create_seed(scalar); + ed25519_add_scalar(public_key, private_key, scalar); + + /* create signature with the new keypair */ + ed25519_sign(signature, message, message_len, public_key, private_key); + + /* verify the signature with the new keypair */ + if (ed25519_verify(signature, message, message_len, public_key)) { + printf("valid signature\n"); + } else { + printf("invalid signature\n"); + } + + /* make a slight adjustment and verify again */ + signature[44] ^= 0x10; + if (ed25519_verify(signature, message, message_len, public_key)) { + printf("did not detect signature change\n"); + } else { + printf("correctly detected signature change\n"); + } + + /* generate two keypairs for testing key exchange */ + ed25519_create_seed(seed); + ed25519_create_keypair(public_key, private_key, seed); + ed25519_create_seed(seed); + ed25519_create_keypair(other_public_key, other_private_key, seed); + + /* create two shared secrets - from both perspectives - and check if they're equal */ + ed25519_key_exchange(shared_secret, other_public_key, private_key); + ed25519_key_exchange(other_shared_secret, public_key, other_private_key); + + for (i = 0; i < 32; ++i) { + if (shared_secret[i] != other_shared_secret[i]) { + printf("key exchange was incorrect\n"); + break; + } + } + + if (i == 32) { + printf("key exchange was correct\n"); + } + + /* test performance */ + printf("testing seed generation performance: "); + start = clock(); + for (i = 0; i < 10000; ++i) { + ed25519_create_seed(seed); + } + end = clock(); + + printf("%fus per seed\n", ((double) ((end - start) * 1000)) / CLOCKS_PER_SEC / i * 1000); + + + printf("testing key generation performance: "); + start = clock(); + for (i = 0; i < 10000; ++i) { + ed25519_create_keypair(public_key, private_key, seed); + } + end = clock(); + + printf("%fus per keypair\n", ((double) ((end - start) * 1000)) / CLOCKS_PER_SEC / i * 1000); + + printf("testing sign performance: "); + start = clock(); + for (i = 0; i < 10000; ++i) { + ed25519_sign(signature, message, message_len, public_key, private_key); + } + end = clock(); + + printf("%fus per signature\n", ((double) ((end - start) * 1000)) / CLOCKS_PER_SEC / i * 1000); + + printf("testing verify performance: "); + start = clock(); + for (i = 0; i < 10000; ++i) { + ed25519_verify(signature, message, message_len, public_key); + } + end = clock(); + + printf("%fus per signature\n", ((double) ((end - start) * 1000)) / CLOCKS_PER_SEC / i * 1000); + + + printf("testing keypair scalar addition performance: "); + start = clock(); + for (i = 0; i < 10000; ++i) { + ed25519_add_scalar(public_key, private_key, scalar); + } + end = clock(); + + printf("%fus per keypair\n", ((double) ((end - start) * 1000)) / CLOCKS_PER_SEC / i * 1000); + + printf("testing public key scalar addition performance: "); + start = clock(); + for (i = 0; i < 10000; ++i) { + ed25519_add_scalar(public_key, NULL, scalar); + } + end = clock(); + + printf("%fus per key\n", ((double) ((end - start) * 1000)) / CLOCKS_PER_SEC / i * 1000); + + printf("testing key exchange performance: "); + start = clock(); + for (i = 0; i < 10000; ++i) { + ed25519_key_exchange(shared_secret, other_public_key, private_key); + } + end = clock(); + + printf("%fus per shared secret\n", ((double) ((end - start) * 1000)) / CLOCKS_PER_SEC / i * 1000); + + return 0; +} diff --git a/src/cryptoconditions/src/include/libbase58.h b/src/cryptoconditions/src/include/libbase58.h new file mode 100644 index 00000000000..fafe6539fc9 --- /dev/null +++ b/src/cryptoconditions/src/include/libbase58.h @@ -0,0 +1,23 @@ +#ifndef LIBBASE58_H +#define LIBBASE58_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern bool (*b58_sha256_impl)(void *, const void *, size_t); + +extern bool b58tobin(void *bin, size_t *binsz, const char *b58, size_t b58sz); +extern int b58check(const void *bin, size_t binsz, const char *b58, size_t b58sz); + +extern bool b58enc(char *b58, size_t *b58sz, const void *bin, size_t binsz); +extern bool b58check_enc(char *b58c, size_t *b58c_sz, uint8_t ver, const void *data, size_t datasz); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/.gitignore b/src/cryptoconditions/src/include/secp256k1/.gitignore new file mode 100644 index 00000000000..076ff1295f2 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/.gitignore @@ -0,0 +1,37 @@ +bench_inv +bench_sign +bench_verify +bench_recover +bench_internal +tests +*.exe +*.so +*.a +!.gitignore + +Makefile +configure +.libs/ +Makefile.in +aclocal.m4 +autom4te.cache/ +config.log +config.status +*.tar.gz +*.la +libtool +.deps/ +.dirstamp +build-aux/ +*.lo +*.o +*~ +src/libsecp256k1-config.h +src/libsecp256k1-config.h.in +m4/libtool.m4 +m4/ltoptions.m4 +m4/ltsugar.m4 +m4/ltversion.m4 +m4/lt~obsolete.m4 +src/stamp-h1 +libsecp256k1.pc diff --git a/src/cryptoconditions/src/include/secp256k1/.travis.yml b/src/cryptoconditions/src/include/secp256k1/.travis.yml new file mode 100644 index 00000000000..0d8089cfe4e --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/.travis.yml @@ -0,0 +1,59 @@ +language: c +sudo: false +addons: + apt: + packages: libgmp-dev +compiler: + - clang + - gcc +env: + global: + - FIELD=auto BIGNUM=auto SCALAR=auto ENDOMORPHISM=no ASM=no BUILD=check EXTRAFLAGS= HOST= + matrix: + - SCALAR=32bit + - SCALAR=64bit + - FIELD=64bit + - FIELD=64bit ENDOMORPHISM=yes + - FIELD=64bit ASM=x86_64 + - FIELD=64bit ENDOMORPHISM=yes ASM=x86_64 + - FIELD=32bit + - FIELD=32bit ENDOMORPHISM=yes + - BIGNUM=no + - BIGNUM=no ENDOMORPHISM=yes + - BUILD=distcheck + - EXTRAFLAGS=CFLAGS=-DDETERMINISTIC +matrix: + fast_finish: true + include: + - compiler: clang + env: HOST=i686-linux-gnu ENDOMORPHISM=yes + addons: + apt: + packages: + - gcc-multilib + - libgmp-dev:i386 + - compiler: clang + env: HOST=i686-linux-gnu + addons: + apt: + packages: + - gcc-multilib + - compiler: gcc + env: HOST=i686-linux-gnu ENDOMORPHISM=yes + addons: + apt: + packages: + - gcc-multilib + - compiler: gcc + env: HOST=i686-linux-gnu + addons: + apt: + packages: + - gcc-multilib + - libgmp-dev:i386 +before_script: ./autogen.sh +script: + - if [ -n "$HOST" ]; then export USE_HOST="--host=$HOST"; fi + - if [ "x$HOST" = "xi686-linux-gnu" ]; then export CC="$CC -m32"; fi + - ./configure --enable-endomorphism=$ENDOMORPHISM --with-field=$FIELD --with-bignum=$BIGNUM --with-scalar=$SCALAR $EXTRAFLAGS $USE_HOST && make -j2 $BUILD +os: linux diff --git a/src/cryptoconditions/src/include/secp256k1/COPYING b/src/cryptoconditions/src/include/secp256k1/COPYING new file mode 100644 index 00000000000..4522a5990e2 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/COPYING @@ -0,0 +1,19 @@ +Copyright (c) 2013 Pieter Wuille + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/src/cryptoconditions/src/include/secp256k1/Makefile.am b/src/cryptoconditions/src/include/secp256k1/Makefile.am new file mode 100644 index 00000000000..5f388f3fd79 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/Makefile.am @@ -0,0 +1,77 @@ +ACLOCAL_AMFLAGS = -I build-aux/m4 + +lib_LTLIBRARIES = libsecp256k1.la +include_HEADERS = include/secp256k1.h +noinst_HEADERS = +noinst_HEADERS += src/scalar.h +noinst_HEADERS += src/scalar_4x64.h +noinst_HEADERS += src/scalar_8x32.h +noinst_HEADERS += src/scalar_impl.h +noinst_HEADERS += src/scalar_4x64_impl.h +noinst_HEADERS += src/scalar_8x32_impl.h +noinst_HEADERS += src/group.h +noinst_HEADERS += src/group_impl.h +noinst_HEADERS += src/num_gmp.h +noinst_HEADERS += src/num_gmp_impl.h +noinst_HEADERS += src/ecdsa.h +noinst_HEADERS += src/ecdsa_impl.h +noinst_HEADERS += src/eckey.h +noinst_HEADERS += src/eckey_impl.h +noinst_HEADERS += src/ecmult.h +noinst_HEADERS += src/ecmult_impl.h +noinst_HEADERS += src/ecmult_gen.h +noinst_HEADERS += src/ecmult_gen_impl.h +noinst_HEADERS += src/num.h +noinst_HEADERS += src/num_impl.h +noinst_HEADERS += src/field_10x26.h +noinst_HEADERS += src/field_10x26_impl.h +noinst_HEADERS += src/field_5x52.h +noinst_HEADERS += src/field_5x52_impl.h +noinst_HEADERS += src/field_5x52_int128_impl.h +noinst_HEADERS += src/field_5x52_asm_impl.h +noinst_HEADERS += src/java/org_bitcoin_NativeSecp256k1.h +noinst_HEADERS += src/util.h +noinst_HEADERS += src/testrand.h +noinst_HEADERS += src/testrand_impl.h +noinst_HEADERS += src/hash.h +noinst_HEADERS += src/hash_impl.h +noinst_HEADERS += src/field.h +noinst_HEADERS += src/field_impl.h +noinst_HEADERS += src/bench.h + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = libsecp256k1.pc + +libsecp256k1_la_SOURCES = src/secp256k1.c +libsecp256k1_la_CPPFLAGS = -I$(top_srcdir)/include $(SECP_INCLUDES) +libsecp256k1_la_LIBADD = $(SECP_LIBS) + + +noinst_PROGRAMS = +if USE_BENCHMARK +noinst_PROGRAMS += bench_verify bench_recover bench_sign bench_internal +bench_verify_SOURCES = src/bench_verify.c +bench_verify_LDADD = libsecp256k1.la $(SECP_LIBS) +bench_verify_LDFLAGS = -static +bench_recover_SOURCES = src/bench_recover.c +bench_recover_LDADD = libsecp256k1.la $(SECP_LIBS) +bench_recover_LDFLAGS = -static +bench_sign_SOURCES = src/bench_sign.c +bench_sign_LDADD = libsecp256k1.la $(SECP_LIBS) +bench_sign_LDFLAGS = -static +bench_internal_SOURCES = src/bench_internal.c +bench_internal_LDADD = $(SECP_LIBS) +bench_internal_LDFLAGS = -static +bench_internal_CPPFLAGS = $(SECP_INCLUDES) +endif + +if USE_TESTS +noinst_PROGRAMS += tests +tests_SOURCES = src/tests.c +tests_CPPFLAGS = -DVERIFY $(SECP_INCLUDES) $(SECP_TEST_INCLUDES) +tests_LDADD = $(SECP_LIBS) $(SECP_TEST_LIBS) +tests_LDFLAGS = -static -pthread +TESTS = tests +endif + +EXTRA_DIST = autogen.sh diff --git a/src/cryptoconditions/src/include/secp256k1/README.md b/src/cryptoconditions/src/include/secp256k1/README.md new file mode 100644 index 00000000000..6095db42205 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/README.md @@ -0,0 +1,61 @@ +libsecp256k1 +============ + +[![Build Status](https://travis-ci.org/bitcoin/secp256k1.svg?branch=master)](https://travis-ci.org/bitcoin/secp256k1) + +Optimized C library for EC operations on curve secp256k1. + +This library is a work in progress and is being used to research best practices. Use at your own risk. + +Features: +* secp256k1 ECDSA signing/verification and key generation. +* Adding/multiplying private/public keys. +* Serialization/parsing of private keys, public keys, signatures. +* Constant time, constant memory access signing and pubkey generation. +* Derandomized DSA (via RFC6979 or with a caller provided function.) +* Very efficient implementation. + +Implementation details +---------------------- + +* General + * No runtime heap allocation. + * Extensive testing infrastructure. + * Structured to facilitate review and analysis. + * Intended to be portable to any system with a C89 compiler and uint64_t support. + * Expose only higher level interfaces to minimize the API surface and improve application security. ("Be difficult to use insecurely.") +* Field operations + * Optimized implementation of arithmetic modulo the curve's field size (2^256 - 0x1000003D1). + * Using 5 52-bit limbs (including hand-optimized assembly for x86_64, by Diederik Huys). + * Using 10 26-bit limbs. + * Field inverses and square roots using a sliding window over blocks of 1s (by Peter Dettman). +* Scalar operations + * Optimized implementation without data-dependent branches of arithmetic modulo the curve's order. + * Using 4 64-bit limbs (relying on __int128 support in the compiler). + * Using 8 32-bit limbs. +* Group operations + * Point addition formula specifically simplified for the curve equation (y^2 = x^3 + 7). + * Use addition between points in Jacobian and affine coordinates where possible. + * Use a unified addition/doubling formula where necessary to avoid data-dependent branches. + * Point/x comparison without a field inversion by comparison in the Jacobian coordinate space. +* Point multiplication for verification (a*P + b*G). + * Use wNAF notation for point multiplicands. + * Use a much larger window for multiples of G, using precomputed multiples. + * Use Shamir's trick to do the multiplication with the public key and the generator simultaneously. + * Optionally (off by default) use secp256k1's efficiently-computable endomorphism to split the P multiplicand into 2 half-sized ones. +* Point multiplication for signing + * Use a precomputed table of multiples of powers of 16 multiplied with the generator, so general multiplication becomes a series of additions. + * Access the table with branch-free conditional moves so memory access is uniform. + * No data-dependent branches + * The precomputed tables add and eventually subtract points for which no known scalar (private key) is known, preventing even an attacker with control over the private key used to control the data internally. + +Build steps +----------- + +libsecp256k1 is built using autotools: + + $ ./autogen.sh + $ ./configure + $ make + $ ./tests + $ sudo make install # optional diff --git a/src/cryptoconditions/src/include/secp256k1/TODO b/src/cryptoconditions/src/include/secp256k1/TODO new file mode 100644 index 00000000000..a300e1c5eb9 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/TODO @@ -0,0 +1,3 @@ +* Unit tests for fieldelem/groupelem, including ones intended to + trigger fieldelem's boundary cases. +* Complete constant-time operations for signing/keygen diff --git a/src/cryptoconditions/src/include/secp256k1/autogen.sh b/src/cryptoconditions/src/include/secp256k1/autogen.sh new file mode 100755 index 00000000000..65286b93530 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/autogen.sh @@ -0,0 +1,3 @@ +#!/bin/sh +set -e +autoreconf -if --warnings=all diff --git a/src/cryptoconditions/src/include/secp256k1/configure.ac b/src/cryptoconditions/src/include/secp256k1/configure.ac new file mode 100644 index 00000000000..3dc1829516e --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/configure.ac @@ -0,0 +1,330 @@ +AC_PREREQ([2.60]) +AC_INIT([libsecp256k1],[0.1]) +AC_CONFIG_AUX_DIR([build-aux]) +AC_CONFIG_MACRO_DIR([build-aux/m4]) +AC_CANONICAL_HOST +AH_TOP([#ifndef LIBSECP256K1_CONFIG_H]) +AH_TOP([#define LIBSECP256K1_CONFIG_H]) +AH_BOTTOM([#endif /*LIBSECP256K1_CONFIG_H*/]) +AM_INIT_AUTOMAKE([foreign subdir-objects]) +LT_INIT + +dnl make the compilation flags quiet unless V=1 is used +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) + +PKG_PROG_PKG_CONFIG + +AC_PATH_TOOL(AR, ar) +AC_PATH_TOOL(RANLIB, ranlib) +AC_PATH_TOOL(STRIP, strip) + +if test "x$CFLAGS" = "x"; then + CFLAGS="-O3 -g" +fi + +AC_PROG_CC_C89 +if test x"$ac_cv_prog_cc_c89" = x"no"; then + AC_MSG_ERROR([c89 compiler support required]) +fi + +case $host in + *mingw*) + use_pkgconfig=no + ;; + *) + use_pkgconfig=yes + ;; +esac + +case $host_os in + *darwin*) + if test x$cross_compiling != xyes; then + AC_PATH_PROG([BREW],brew,) + if test x$BREW != x; then + dnl These Homebrew packages may be keg-only, meaning that they won't be found + dnl in expected paths because they may conflict with system files. Ask + dnl Homebrew where each one is located, then adjust paths accordingly. + + openssl_prefix=`$BREW --prefix openssl 2>/dev/null` + gmp_prefix=`$BREW --prefix gmp 2>/dev/null` + if test x$openssl_prefix != x; then + PKG_CONFIG_PATH="$openssl_prefix/lib/pkgconfig:$PKG_CONFIG_PATH" + export PKG_CONFIG_PATH + fi + if test x$gmp_prefix != x; then + GMP_CPPFLAGS="-I$gmp_prefix/include" + GMP_LIBS="-L$gmp_prefix/lib" + fi + else + AC_PATH_PROG([PORT],port,) + dnl if homebrew isn't installed and macports is, add the macports default paths + dnl as a last resort. + if test x$PORT != x; then + CPPFLAGS="$CPPFLAGS -isystem /opt/local/include" + LDFLAGS="$LDFLAGS -L/opt/local/lib" + fi + fi + fi + ;; +esac + +CFLAGS="$CFLAGS -W" + +warn_CFLAGS="-std=c89 -pedantic -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes -Wno-unused-function -Wno-long-long -Wno-overlength-strings" +saved_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $warn_CFLAGS" +AC_MSG_CHECKING([if ${CC} supports ${warn_CFLAGS}]) +AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])], + [ AC_MSG_RESULT([yes]) ], + [ AC_MSG_RESULT([no]) + CFLAGS="$saved_CFLAGS" + ]) + + +AC_ARG_ENABLE(benchmark, + AS_HELP_STRING([--enable-benchmark],[compile benchmark (default is no)]), + [use_benchmark=$enableval], + [use_benchmark=no]) + +AC_ARG_ENABLE(tests, + AS_HELP_STRING([--enable-tests],[compile tests (default is yes)]), + [use_tests=$enableval], + [use_tests=yes]) + +AC_ARG_ENABLE(endomorphism, + AS_HELP_STRING([--enable-endomorphism],[enable endomorphism (default is no)]), + [use_endomorphism=$enableval], + [use_endomorphism=no]) + +AC_ARG_WITH([field], [AS_HELP_STRING([--with-field=64bit|32bit|auto], +[Specify Field Implementation. Default is auto])],[req_field=$withval], [req_field=auto]) + +AC_ARG_WITH([bignum], [AS_HELP_STRING([--with-bignum=gmp|no|auto], +[Specify Bignum Implementation. Default is auto])],[req_bignum=$withval], [req_bignum=auto]) + +AC_ARG_WITH([scalar], [AS_HELP_STRING([--with-scalar=64bit|32bit|auto], +[Specify scalar implementation. Default is auto])],[req_scalar=$withval], [req_scalar=auto]) + +AC_ARG_WITH([asm], [AS_HELP_STRING([--with-asm=x86_64|no|auto] +[Specify assembly optimizations to use. Default is auto])],[req_asm=$withval], [req_asm=auto]) + +AC_CHECK_TYPES([__int128]) + +AC_MSG_CHECKING([for __builtin_expect]) +AC_COMPILE_IFELSE([AC_LANG_SOURCE([[void myfunc() {__builtin_expect(0,0);}]])], + [ AC_MSG_RESULT([yes]);AC_DEFINE(HAVE_BUILTIN_EXPECT,1,[Define this symbol if __builtin_expect is available]) ], + [ AC_MSG_RESULT([no]) + ]) + +if test x"$req_asm" = x"auto"; then + SECP_64BIT_ASM_CHECK + if test x"$has_64bit_asm" = x"yes"; then + set_asm=x86_64 + fi + if test x"$set_asm" = x; then + set_asm=no + fi +else + set_asm=$req_asm + case $set_asm in + x86_64) + SECP_64BIT_ASM_CHECK + if test x"$has_64bit_asm" != x"yes"; then + AC_MSG_ERROR([x86_64 assembly optimization requested but not available]) + fi + ;; + no) + ;; + *) + AC_MSG_ERROR([invalid assembly optimization selection]) + ;; + esac +fi + +if test x"$req_field" = x"auto"; then + if test x"set_asm" = x"x86_64"; then + set_field=64bit + fi + if test x"$set_field" = x; then + SECP_INT128_CHECK + if test x"$has_int128" = x"yes"; then + set_field=64bit + fi + fi + if test x"$set_field" = x; then + set_field=32bit + fi +else + set_field=$req_field + case $set_field in + 64bit) + if test x"$set_asm" != x"x86_64"; then + SECP_INT128_CHECK + if test x"$has_int128" != x"yes"; then + AC_MSG_ERROR([64bit field explicitly requested but neither __int128 support or x86_64 assembly available]) + fi + fi + ;; + 32bit) + ;; + *) + AC_MSG_ERROR([invalid field implementation selection]) + ;; + esac +fi + +if test x"$req_scalar" = x"auto"; then + SECP_INT128_CHECK + if test x"$has_int128" = x"yes"; then + set_scalar=64bit + fi + if test x"$set_scalar" = x; then + set_scalar=32bit + fi +else + set_scalar=$req_scalar + case $set_scalar in + 64bit) + SECP_INT128_CHECK + if test x"$has_int128" != x"yes"; then + AC_MSG_ERROR([64bit scalar explicitly requested but __int128 support not available]) + fi + ;; + 32bit) + ;; + *) + AC_MSG_ERROR([invalid scalar implementation selected]) + ;; + esac +fi + +if test x"$req_bignum" = x"auto"; then + SECP_GMP_CHECK + if test x"$has_gmp" = x"yes"; then + set_bignum=gmp + fi + + if test x"$set_bignum" = x; then + set_bignum=no + fi +else + set_bignum=$req_bignum + case $set_bignum in + gmp) + SECP_GMP_CHECK + if test x"$has_gmp" != x"yes"; then + AC_MSG_ERROR([gmp bignum explicitly requested but libgmp not available]) + fi + ;; + no) + ;; + *) + AC_MSG_ERROR([invalid bignum implementation selection]) + ;; + esac +fi + +# select assembly optimization +case $set_asm in +x86_64) + AC_DEFINE(USE_ASM_X86_64, 1, [Define this symbol to enable x86_64 assembly optimizations]) + ;; +no) + ;; +*) + AC_MSG_ERROR([invalid assembly optimizations]) + ;; +esac + +# select field implementation +case $set_field in +64bit) + AC_DEFINE(USE_FIELD_5X52, 1, [Define this symbol to use the FIELD_5X52 implementation]) + ;; +32bit) + AC_DEFINE(USE_FIELD_10X26, 1, [Define this symbol to use the FIELD_10X26 implementation]) + ;; +*) + AC_MSG_ERROR([invalid field implementation]) + ;; +esac + +# select bignum implementation +case $set_bignum in +gmp) + AC_DEFINE(HAVE_LIBGMP, 1, [Define this symbol if libgmp is installed]) + AC_DEFINE(USE_NUM_GMP, 1, [Define this symbol to use the gmp implementation for num]) + AC_DEFINE(USE_FIELD_INV_NUM, 1, [Define this symbol to use the num-based field inverse implementation]) + AC_DEFINE(USE_SCALAR_INV_NUM, 1, [Define this symbol to use the num-based scalar inverse implementation]) + ;; +no) + AC_DEFINE(USE_NUM_NONE, 1, [Define this symbol to use no num implementation]) + AC_DEFINE(USE_FIELD_INV_BUILTIN, 1, [Define this symbol to use the native field inverse implementation]) + AC_DEFINE(USE_SCALAR_INV_BUILTIN, 1, [Define this symbol to use the native scalar inverse implementation]) + ;; +*) + AC_MSG_ERROR([invalid bignum implementation]) + ;; +esac + +#select scalar implementation +case $set_scalar in +64bit) + AC_DEFINE(USE_SCALAR_4X64, 1, [Define this symbol to use the 4x64 scalar implementation]) + ;; +32bit) + AC_DEFINE(USE_SCALAR_8X32, 1, [Define this symbol to use the 8x32 scalar implementation]) + ;; +*) + AC_MSG_ERROR([invalid scalar implementation]) + ;; +esac + +if test x"$use_tests" = x"yes"; then + SECP_OPENSSL_CHECK + if test x"$has_openssl_ec" = x"yes"; then + AC_DEFINE(ENABLE_OPENSSL_TESTS, 1, [Define this symbol if OpenSSL EC functions are available]) + SECP_TEST_INCLUDES="$SSL_CFLAGS $CRYPTO_CFLAGS" + SECP_TEST_LIBS="$CRYPTO_LIBS" + + case $host in + *mingw*) + SECP_TEST_LIBS="$SECP_TEST_LIBS -lgdi32" + ;; + esac + + fi +fi + +if test x"$set_bignum" = x"gmp"; then + SECP_LIBS="$SECP_LIBS $GMP_LIBS" + SECP_INCLUDES="$SECP_INCLUDES $GMP_CPPFLAGS" +fi + +if test x"$use_endomorphism" = x"yes"; then + AC_DEFINE(USE_ENDOMORPHISM, 1, [Define this symbol to use endomorphism optimization]) +fi + +AC_C_BIGENDIAN() + +AC_MSG_NOTICE([Using assembly optimizations: $set_asm]) +AC_MSG_NOTICE([Using field implementation: $set_field]) +AC_MSG_NOTICE([Using bignum implementation: $set_bignum]) +AC_MSG_NOTICE([Using scalar implementation: $set_scalar]) +AC_MSG_NOTICE([Using endomorphism optimizations: $use_endomorphism]) + +AC_CONFIG_HEADERS([src/libsecp256k1-config.h]) +AC_CONFIG_FILES([Makefile libsecp256k1.pc]) +AC_SUBST(SECP_INCLUDES) +AC_SUBST(SECP_LIBS) +AC_SUBST(SECP_TEST_LIBS) +AC_SUBST(SECP_TEST_INCLUDES) +AM_CONDITIONAL([USE_TESTS], [test x"$use_tests" != x"no"]) +AM_CONDITIONAL([USE_BENCHMARK], [test x"$use_benchmark" = x"yes"]) + +dnl make sure nothing new is exported so that we don't break the cache +PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH" +unset PKG_CONFIG_PATH +PKG_CONFIG_PATH="$PKGCONFIG_PATH_TEMP" + +AC_OUTPUT diff --git a/src/cryptoconditions/src/include/secp256k1/include/secp256k1.h b/src/cryptoconditions/src/include/secp256k1/include/secp256k1.h new file mode 100644 index 00000000000..06afd4c65bc --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/include/secp256k1.h @@ -0,0 +1,347 @@ +#ifndef _SECP256K1_ +# define _SECP256K1_ + +# ifdef __cplusplus +extern "C" { +# endif + +# if !defined(SECP256K1_GNUC_PREREQ) +# if defined(__GNUC__)&&defined(__GNUC_MINOR__) +# define SECP256K1_GNUC_PREREQ(_maj,_min) \ + ((__GNUC__<<16)+__GNUC_MINOR__>=((_maj)<<16)+(_min)) +# else +# define SECP256K1_GNUC_PREREQ(_maj,_min) 0 +# endif +# endif + +# if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) ) +# if SECP256K1_GNUC_PREREQ(2,7) +# define SECP256K1_INLINE __inline__ +# elif (defined(_MSC_VER)) +# define SECP256K1_INLINE __inline +# else +# define SECP256K1_INLINE +# endif +# else +# define SECP256K1_INLINE inline +# endif + +/**Warning attributes + * NONNULL is not used if SECP256K1_BUILD is set to avoid the compiler optimizing out + * some paranoid null checks. */ +# if defined(__GNUC__) && SECP256K1_GNUC_PREREQ(3, 4) +# define SECP256K1_WARN_UNUSED_RESULT __attribute__ ((__warn_unused_result__)) +# else +# define SECP256K1_WARN_UNUSED_RESULT +# endif +# if !defined(SECP256K1_BUILD) && defined(__GNUC__) && SECP256K1_GNUC_PREREQ(3, 4) +# define SECP256K1_ARG_NONNULL(_x) __attribute__ ((__nonnull__(_x))) +# else +# define SECP256K1_ARG_NONNULL(_x) +# endif + +/** Opaque data structure that holds context information (precomputed tables etc.). + * Only functions that take a pointer to a non-const context require exclusive + * access to it. Multiple functions that take a pointer to a const context may + * run simultaneously. + */ +typedef struct secp256k1_context_struct secp256k1_context_t; + +/** Flags to pass to secp256k1_context_create. */ +# define SECP256K1_CONTEXT_VERIFY (1 << 0) +# define SECP256K1_CONTEXT_SIGN (1 << 1) + +/** Create a secp256k1 context object. + * Returns: a newly created context object. + * In: flags: which parts of the context to initialize. + */ +secp256k1_context_t* secp256k1_context_create( + int flags +) SECP256K1_WARN_UNUSED_RESULT; + +/** Copies a secp256k1 context object. + * Returns: a newly created context object. + * In: ctx: an existing context to copy + */ +secp256k1_context_t* secp256k1_context_clone( + const secp256k1_context_t* ctx +) SECP256K1_WARN_UNUSED_RESULT; + +/** Destroy a secp256k1 context object. + * The context pointer may not be used afterwards. + */ +void secp256k1_context_destroy( + secp256k1_context_t* ctx +) SECP256K1_ARG_NONNULL(1); + +/** Verify an ECDSA signature. + * Returns: 1: correct signature + * 0: incorrect signature + * -1: invalid public key + * -2: invalid signature + * In: ctx: a secp256k1 context object, initialized for verification. + * msg32: the 32-byte message hash being verified (cannot be NULL) + * sig: the signature being verified (cannot be NULL) + * siglen: the length of the signature + * pubkey: the public key to verify with (cannot be NULL) + * pubkeylen: the length of pubkey + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_verify( + const secp256k1_context_t* ctx, + const unsigned char *msg32, + const unsigned char *sig, + int siglen, + const unsigned char *pubkey, + int pubkeylen +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(5); + +/** A pointer to a function to deterministically generate a nonce. + * Returns: 1 if a nonce was successfully generated. 0 will cause signing to fail. + * In: msg32: the 32-byte message hash being verified (will not be NULL) + * key32: pointer to a 32-byte secret key (will not be NULL) + * attempt: how many iterations we have tried to find a nonce. + * This will almost always be 0, but different attempt values + * are required to result in a different nonce. + * data: Arbitrary data pointer that is passed through. + * Out: nonce32: pointer to a 32-byte array to be filled by the function. + * Except for test cases, this function should compute some cryptographic hash of + * the message, the key and the attempt. + */ +typedef int (*secp256k1_nonce_function_t)( + unsigned char *nonce32, + const unsigned char *msg32, + const unsigned char *key32, + unsigned int attempt, + const void *data +); + +/** An implementation of RFC6979 (using HMAC-SHA256) as nonce generation function. + * If a data pointer is passed, it is assumed to be a pointer to 32 bytes of + * extra entropy. + */ +extern const secp256k1_nonce_function_t secp256k1_nonce_function_rfc6979; + +/** A default safe nonce generation function (currently equal to secp256k1_nonce_function_rfc6979). */ +extern const secp256k1_nonce_function_t secp256k1_nonce_function_default; + + +/** Create an ECDSA signature. + * Returns: 1: signature created + * 0: the nonce generation function failed, the private key was invalid, or there is not + * enough space in the signature (as indicated by siglen). + * In: ctx: pointer to a context object, initialized for signing (cannot be NULL) + * msg32: the 32-byte message hash being signed (cannot be NULL) + * seckey: pointer to a 32-byte secret key (cannot be NULL) + * noncefp:pointer to a nonce generation function. If NULL, secp256k1_nonce_function_default is used + * ndata: pointer to arbitrary data used by the nonce generation function (can be NULL) + * Out: sig: pointer to an array where the signature will be placed (cannot be NULL) + * In/Out: siglen: pointer to an int with the length of sig, which will be updated + * to contain the actual signature length (<=72). + * + * The sig always has an s value in the lower half of the range (From 0x1 + * to 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, + * inclusive), unlike many other implementations. + * With ECDSA a third-party can can forge a second distinct signature + * of the same message given a single initial signature without knowing + * the key by setting s to its additive inverse mod-order, 'flipping' the + * sign of the random point R which is not included in the signature. + * Since the forgery is of the same message this isn't universally + * problematic, but in systems where message malleability or uniqueness + * of signatures is important this can cause issues. This forgery can be + * blocked by all verifiers forcing signers to use a canonical form. The + * lower-S form reduces the size of signatures slightly on average when + * variable length encodings (such as DER) are used and is cheap to + * verify, making it a good choice. Security of always using lower-S is + * assured because anyone can trivially modify a signature after the + * fact to enforce this property. Adjusting it inside the signing + * function avoids the need to re-serialize or have curve specific + * constants outside of the library. By always using a canonical form + * even in applications where it isn't needed it becomes possible to + * impose a requirement later if a need is discovered. + * No other forms of ECDSA malleability are known and none seem likely, + * but there is no formal proof that ECDSA, even with this additional + * restriction, is free of other malleability. Commonly used serialization + * schemes will also accept various non-unique encodings, so care should + * be taken when this property is required for an application. + */ +int secp256k1_ecdsa_sign( + const secp256k1_context_t* ctx, + const unsigned char *msg32, + unsigned char *sig, + int *siglen, + const unsigned char *seckey, + secp256k1_nonce_function_t noncefp, + const void *ndata +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4) SECP256K1_ARG_NONNULL(5); + +/** Create a compact ECDSA signature (64 byte + recovery id). + * Returns: 1: signature created + * 0: the nonce generation function failed, or the secret key was invalid. + * In: ctx: pointer to a context object, initialized for signing (cannot be NULL) + * msg32: the 32-byte message hash being signed (cannot be NULL) + * seckey: pointer to a 32-byte secret key (cannot be NULL) + * noncefp:pointer to a nonce generation function. If NULL, secp256k1_nonce_function_default is used + * ndata: pointer to arbitrary data used by the nonce generation function (can be NULL) + * Out: sig: pointer to a 64-byte array where the signature will be placed (cannot be NULL) + * In case 0 is returned, the returned signature length will be zero. + * recid: pointer to an int, which will be updated to contain the recovery id (can be NULL) + */ +int secp256k1_ecdsa_sign_compact( + const secp256k1_context_t* ctx, + const unsigned char *msg32, + unsigned char *sig64, + const unsigned char *seckey, + secp256k1_nonce_function_t noncefp, + const void *ndata, + int *recid +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); + +/** Recover an ECDSA public key from a compact signature. + * Returns: 1: public key successfully recovered (which guarantees a correct signature). + * 0: otherwise. + * In: ctx: pointer to a context object, initialized for verification (cannot be NULL) + * msg32: the 32-byte message hash assumed to be signed (cannot be NULL) + * sig64: signature as 64 byte array (cannot be NULL) + * compressed: whether to recover a compressed or uncompressed pubkey + * recid: the recovery id (0-3, as returned by ecdsa_sign_compact) + * Out: pubkey: pointer to a 33 or 65 byte array to put the pubkey (cannot be NULL) + * pubkeylen: pointer to an int that will contain the pubkey length (cannot be NULL) + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_recover_compact( + const secp256k1_context_t* ctx, + const unsigned char *msg32, + const unsigned char *sig64, + unsigned char *pubkey, + int *pubkeylen, + int compressed, + int recid +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4) SECP256K1_ARG_NONNULL(5); + +/** Verify an ECDSA secret key. + * Returns: 1: secret key is valid + * 0: secret key is invalid + * In: ctx: pointer to a context object (cannot be NULL) + * seckey: pointer to a 32-byte secret key (cannot be NULL) + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_seckey_verify( + const secp256k1_context_t* ctx, + const unsigned char *seckey +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2); + +/** Just validate a public key. + * Returns: 1: public key is valid + * 0: public key is invalid + * In: ctx: pointer to a context object (cannot be NULL) + * pubkey: pointer to a 33-byte or 65-byte public key (cannot be NULL). + * pubkeylen: length of pubkey + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_verify( + const secp256k1_context_t* ctx, + const unsigned char *pubkey, + int pubkeylen +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2); + +/** Compute the public key for a secret key. + * In: ctx: pointer to a context object, initialized for signing (cannot be NULL) + * compressed: whether the computed public key should be compressed + * seckey: pointer to a 32-byte private key (cannot be NULL) + * Out: pubkey: pointer to a 33-byte (if compressed) or 65-byte (if uncompressed) + * area to store the public key (cannot be NULL) + * pubkeylen: pointer to int that will be updated to contains the pubkey's + * length (cannot be NULL) + * Returns: 1: secret was valid, public key stores + * 0: secret was invalid, try again + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_create( + const secp256k1_context_t* ctx, + unsigned char *pubkey, + int *pubkeylen, + const unsigned char *seckey, + int compressed +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); + +/** Decompress a public key. + * In: ctx: pointer to a context object (cannot be NULL) + * In/Out: pubkey: pointer to a 65-byte array to put the decompressed public key. + * It must contain a 33-byte or 65-byte public key already (cannot be NULL) + * pubkeylen: pointer to the size of the public key pointed to by pubkey (cannot be NULL) + * It will be updated to reflect the new size. + * Returns: 0: pubkey was invalid + * 1: pubkey was valid, and was replaced with its decompressed version + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_decompress( + const secp256k1_context_t* ctx, + unsigned char *pubkey, + int *pubkeylen +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Export a private key in DER format. + * In: ctx: pointer to a context object, initialized for signing (cannot be NULL) + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_export( + const secp256k1_context_t* ctx, + const unsigned char *seckey, + unsigned char *privkey, + int *privkeylen, + int compressed +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4); + +/** Import a private key in DER format. */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_import( + const secp256k1_context_t* ctx, + unsigned char *seckey, + const unsigned char *privkey, + int privkeylen +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Tweak a private key by adding tweak to it. */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_add( + const secp256k1_context_t* ctx, + unsigned char *seckey, + const unsigned char *tweak +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Tweak a public key by adding tweak times the generator to it. + * In: ctx: pointer to a context object, initialized for verification (cannot be NULL) + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_add( + const secp256k1_context_t* ctx, + unsigned char *pubkey, + int pubkeylen, + const unsigned char *tweak +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(4); + +/** Tweak a private key by multiplying it with tweak. */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_mul( + const secp256k1_context_t* ctx, + unsigned char *seckey, + const unsigned char *tweak +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3); + +/** Tweak a public key by multiplying it with tweak. + * In: ctx: pointer to a context object, initialized for verification (cannot be NULL) + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_mul( + const secp256k1_context_t* ctx, + unsigned char *pubkey, + int pubkeylen, + const unsigned char *tweak +) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(4); + +/** Updates the context randomization. + * Returns: 1: randomization successfully updated + * 0: error + * In: ctx: pointer to a context object (cannot be NULL) + * seed32: pointer to a 32-byte random seed (NULL resets to initial state) + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_context_randomize( + secp256k1_context_t* ctx, + const unsigned char *seed32 +) SECP256K1_ARG_NONNULL(1); + + +# ifdef __cplusplus +} +# endif + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/libsecp256k1.pc.in b/src/cryptoconditions/src/include/secp256k1/libsecp256k1.pc.in new file mode 100644 index 00000000000..1c72dd00037 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/libsecp256k1.pc.in @@ -0,0 +1,13 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: libsecp256k1 +Description: Optimized C library for EC operations on curve secp256k1 +URL: https://github.com/bitcoin/secp256k1 +Version: @PACKAGE_VERSION@ +Cflags: -I${includedir} +Libs.private: @SECP_LIBS@ +Libs: -L${libdir} -lsecp256k1 + diff --git a/src/cryptoconditions/src/include/secp256k1/obj/.gitignore b/src/cryptoconditions/src/include/secp256k1/obj/.gitignore new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/cryptoconditions/src/include/secp256k1/src/bench.h b/src/cryptoconditions/src/include/secp256k1/src/bench.h new file mode 100644 index 00000000000..db5f68cee1f --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/bench.h @@ -0,0 +1,56 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_BENCH_H_ +#define _SECP256K1_BENCH_H_ + +#include +#include +#include "sys/time.h" + +static double gettimedouble(void) { + struct timeval tv; + gettimeofday(&tv, NULL); + return tv.tv_usec * 0.000001 + tv.tv_sec; +} + +void print_number(double x) { + double y = x; + int c = 0; + if (y < 0.0) y = -y; + while (y < 100.0) { + y *= 10.0; + c++; + } + printf("%.*f", c, x); +} + +void run_benchmark(char *name, void (*benchmark)(void*), void (*setup)(void*), void (*teardown)(void*), void* data, int count, int iter) { + int i; + double min = HUGE_VAL; + double sum = 0.0; + double max = 0.0; + for (i = 0; i < count; i++) { + double begin, total; + if (setup) setup(data); + begin = gettimedouble(); + benchmark(data); + total = gettimedouble() - begin; + if (teardown) teardown(data); + if (total < min) min = total; + if (total > max) max = total; + sum += total; + } + printf("%s: min ", name); + print_number(min * 1000000.0 / iter); + printf("us / avg "); + print_number((sum / count) * 1000000.0 / iter); + printf("us / max "); + print_number(max * 1000000.0 / iter); + printf("us\n"); +} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/bench_internal.c b/src/cryptoconditions/src/include/secp256k1/src/bench_internal.c new file mode 100644 index 00000000000..a960549b94f --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/bench_internal.c @@ -0,0 +1,318 @@ +/********************************************************************** + * Copyright (c) 2014-2015 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ +#include + +#include "include/secp256k1.h" + +#include "util.h" +#include "hash_impl.h" +#include "num_impl.h" +#include "field_impl.h" +#include "group_impl.h" +#include "scalar_impl.h" +#include "ecmult_impl.h" +#include "bench.h" + +typedef struct { + secp256k1_scalar_t scalar_x, scalar_y; + secp256k1_fe_t fe_x, fe_y; + secp256k1_ge_t ge_x, ge_y; + secp256k1_gej_t gej_x, gej_y; + unsigned char data[32]; + int wnaf[256]; +} bench_inv_t; + +void bench_setup(void* arg) { + bench_inv_t *data = (bench_inv_t*)arg; + + static const unsigned char init_x[32] = { + 0x02, 0x03, 0x05, 0x07, 0x0b, 0x0d, 0x11, 0x13, + 0x17, 0x1d, 0x1f, 0x25, 0x29, 0x2b, 0x2f, 0x35, + 0x3b, 0x3d, 0x43, 0x47, 0x49, 0x4f, 0x53, 0x59, + 0x61, 0x65, 0x67, 0x6b, 0x6d, 0x71, 0x7f, 0x83 + }; + + static const unsigned char init_y[32] = { + 0x82, 0x83, 0x85, 0x87, 0x8b, 0x8d, 0x81, 0x83, + 0x97, 0xad, 0xaf, 0xb5, 0xb9, 0xbb, 0xbf, 0xc5, + 0xdb, 0xdd, 0xe3, 0xe7, 0xe9, 0xef, 0xf3, 0xf9, + 0x11, 0x15, 0x17, 0x1b, 0x1d, 0xb1, 0xbf, 0xd3 + }; + + secp256k1_scalar_set_b32(&data->scalar_x, init_x, NULL); + secp256k1_scalar_set_b32(&data->scalar_y, init_y, NULL); + secp256k1_fe_set_b32(&data->fe_x, init_x); + secp256k1_fe_set_b32(&data->fe_y, init_y); + CHECK(secp256k1_ge_set_xo_var(&data->ge_x, &data->fe_x, 0)); + CHECK(secp256k1_ge_set_xo_var(&data->ge_y, &data->fe_y, 1)); + secp256k1_gej_set_ge(&data->gej_x, &data->ge_x); + secp256k1_gej_set_ge(&data->gej_y, &data->ge_y); + memcpy(data->data, init_x, 32); +} + +void bench_scalar_add(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 2000000; i++) { + secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); + } +} + +void bench_scalar_negate(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 2000000; i++) { + secp256k1_scalar_negate(&data->scalar_x, &data->scalar_x); + } +} + +void bench_scalar_sqr(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 200000; i++) { + secp256k1_scalar_sqr(&data->scalar_x, &data->scalar_x); + } +} + +void bench_scalar_mul(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 200000; i++) { + secp256k1_scalar_mul(&data->scalar_x, &data->scalar_x, &data->scalar_y); + } +} + +#ifdef USE_ENDOMORPHISM +void bench_scalar_split(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 20000; i++) { + secp256k1_scalar_t l, r; + secp256k1_scalar_split_lambda_var(&l, &r, &data->scalar_x); + secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); + } +} +#endif + +void bench_scalar_inverse(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 2000; i++) { + secp256k1_scalar_inverse(&data->scalar_x, &data->scalar_x); + secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); + } +} + +void bench_scalar_inverse_var(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 2000; i++) { + secp256k1_scalar_inverse_var(&data->scalar_x, &data->scalar_x); + secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); + } +} + +void bench_field_normalize(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 2000000; i++) { + secp256k1_fe_normalize(&data->fe_x); + } +} + +void bench_field_normalize_weak(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 2000000; i++) { + secp256k1_fe_normalize_weak(&data->fe_x); + } +} + +void bench_field_mul(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 200000; i++) { + secp256k1_fe_mul(&data->fe_x, &data->fe_x, &data->fe_y); + } +} + +void bench_field_sqr(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 200000; i++) { + secp256k1_fe_sqr(&data->fe_x, &data->fe_x); + } +} + +void bench_field_inverse(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 20000; i++) { + secp256k1_fe_inv(&data->fe_x, &data->fe_x); + secp256k1_fe_add(&data->fe_x, &data->fe_y); + } +} + +void bench_field_inverse_var(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 20000; i++) { + secp256k1_fe_inv_var(&data->fe_x, &data->fe_x); + secp256k1_fe_add(&data->fe_x, &data->fe_y); + } +} + +void bench_field_sqrt_var(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 20000; i++) { + secp256k1_fe_sqrt_var(&data->fe_x, &data->fe_x); + secp256k1_fe_add(&data->fe_x, &data->fe_y); + } +} + +void bench_group_double_var(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 200000; i++) { + secp256k1_gej_double_var(&data->gej_x, &data->gej_x); + } +} + +void bench_group_add_var(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 200000; i++) { + secp256k1_gej_add_var(&data->gej_x, &data->gej_x, &data->gej_y); + } +} + +void bench_group_add_affine(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 200000; i++) { + secp256k1_gej_add_ge(&data->gej_x, &data->gej_x, &data->ge_y); + } +} + +void bench_group_add_affine_var(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 200000; i++) { + secp256k1_gej_add_ge_var(&data->gej_x, &data->gej_x, &data->ge_y); + } +} + +void bench_ecmult_wnaf(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + + for (i = 0; i < 20000; i++) { + secp256k1_ecmult_wnaf(data->wnaf, &data->scalar_x, WINDOW_A); + secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y); + } +} + + +void bench_sha256(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + secp256k1_sha256_t sha; + + for (i = 0; i < 20000; i++) { + secp256k1_sha256_initialize(&sha); + secp256k1_sha256_write(&sha, data->data, 32); + secp256k1_sha256_finalize(&sha, data->data); + } +} + +void bench_hmac_sha256(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + secp256k1_hmac_sha256_t hmac; + + for (i = 0; i < 20000; i++) { + secp256k1_hmac_sha256_initialize(&hmac, data->data, 32); + secp256k1_hmac_sha256_write(&hmac, data->data, 32); + secp256k1_hmac_sha256_finalize(&hmac, data->data); + } +} + +void bench_rfc6979_hmac_sha256(void* arg) { + int i; + bench_inv_t *data = (bench_inv_t*)arg; + secp256k1_rfc6979_hmac_sha256_t rng; + + for (i = 0; i < 20000; i++) { + secp256k1_rfc6979_hmac_sha256_initialize(&rng, data->data, 32, data->data, 32, NULL, 0); + secp256k1_rfc6979_hmac_sha256_generate(&rng, data->data, 32); + } +} + + +int have_flag(int argc, char** argv, char *flag) { + char** argm = argv + argc; + argv++; + if (argv == argm) { + return 1; + } + while (argv != NULL && argv != argm) { + if (strcmp(*argv, flag) == 0) return 1; + argv++; + } + return 0; +} + +int main(int argc, char **argv) { + bench_inv_t data; + if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "add")) run_benchmark("scalar_add", bench_scalar_add, bench_setup, NULL, &data, 10, 2000000); + if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "negate")) run_benchmark("scalar_negate", bench_scalar_negate, bench_setup, NULL, &data, 10, 2000000); + if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "sqr")) run_benchmark("scalar_sqr", bench_scalar_sqr, bench_setup, NULL, &data, 10, 200000); + if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "mul")) run_benchmark("scalar_mul", bench_scalar_mul, bench_setup, NULL, &data, 10, 200000); +#ifdef USE_ENDOMORPHISM + if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "split")) run_benchmark("scalar_split", bench_scalar_split, bench_setup, NULL, &data, 10, 20000); +#endif + if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "inverse")) run_benchmark("scalar_inverse", bench_scalar_inverse, bench_setup, NULL, &data, 10, 2000); + if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "inverse")) run_benchmark("scalar_inverse_var", bench_scalar_inverse_var, bench_setup, NULL, &data, 10, 2000); + + if (have_flag(argc, argv, "field") || have_flag(argc, argv, "normalize")) run_benchmark("field_normalize", bench_field_normalize, bench_setup, NULL, &data, 10, 2000000); + if (have_flag(argc, argv, "field") || have_flag(argc, argv, "normalize")) run_benchmark("field_normalize_weak", bench_field_normalize_weak, bench_setup, NULL, &data, 10, 2000000); + if (have_flag(argc, argv, "field") || have_flag(argc, argv, "sqr")) run_benchmark("field_sqr", bench_field_sqr, bench_setup, NULL, &data, 10, 200000); + if (have_flag(argc, argv, "field") || have_flag(argc, argv, "mul")) run_benchmark("field_mul", bench_field_mul, bench_setup, NULL, &data, 10, 200000); + if (have_flag(argc, argv, "field") || have_flag(argc, argv, "inverse")) run_benchmark("field_inverse", bench_field_inverse, bench_setup, NULL, &data, 10, 20000); + if (have_flag(argc, argv, "field") || have_flag(argc, argv, "inverse")) run_benchmark("field_inverse_var", bench_field_inverse_var, bench_setup, NULL, &data, 10, 20000); + if (have_flag(argc, argv, "field") || have_flag(argc, argv, "sqrt")) run_benchmark("field_sqrt_var", bench_field_sqrt_var, bench_setup, NULL, &data, 10, 20000); + + if (have_flag(argc, argv, "group") || have_flag(argc, argv, "double")) run_benchmark("group_double_var", bench_group_double_var, bench_setup, NULL, &data, 10, 200000); + if (have_flag(argc, argv, "group") || have_flag(argc, argv, "add")) run_benchmark("group_add_var", bench_group_add_var, bench_setup, NULL, &data, 10, 200000); + if (have_flag(argc, argv, "group") || have_flag(argc, argv, "add")) run_benchmark("group_add_affine", bench_group_add_affine, bench_setup, NULL, &data, 10, 200000); + if (have_flag(argc, argv, "group") || have_flag(argc, argv, "add")) run_benchmark("group_add_affine_var", bench_group_add_affine_var, bench_setup, NULL, &data, 10, 200000); + + if (have_flag(argc, argv, "ecmult") || have_flag(argc, argv, "wnaf")) run_benchmark("ecmult_wnaf", bench_ecmult_wnaf, bench_setup, NULL, &data, 10, 20000); + + if (have_flag(argc, argv, "hash") || have_flag(argc, argv, "sha256")) run_benchmark("hash_sha256", bench_sha256, bench_setup, NULL, &data, 10, 20000); + if (have_flag(argc, argv, "hash") || have_flag(argc, argv, "hmac")) run_benchmark("hash_hmac_sha256", bench_hmac_sha256, bench_setup, NULL, &data, 10, 20000); + if (have_flag(argc, argv, "hash") || have_flag(argc, argv, "rng6979")) run_benchmark("hash_rfc6979_hmac_sha256", bench_rfc6979_hmac_sha256, bench_setup, NULL, &data, 10, 20000); + return 0; +} diff --git a/src/cryptoconditions/src/include/secp256k1/src/bench_recover.c b/src/cryptoconditions/src/include/secp256k1/src/bench_recover.c new file mode 100644 index 00000000000..56faed11a04 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/bench_recover.c @@ -0,0 +1,51 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#include "include/secp256k1.h" +#include "util.h" +#include "bench.h" + +typedef struct { + secp256k1_context_t *ctx; + unsigned char msg[32]; + unsigned char sig[64]; +} bench_recover_t; + +void bench_recover(void* arg) { + int i; + bench_recover_t *data = (bench_recover_t*)arg; + unsigned char pubkey[33]; + + for (i = 0; i < 20000; i++) { + int j; + int pubkeylen = 33; + CHECK(secp256k1_ecdsa_recover_compact(data->ctx, data->msg, data->sig, pubkey, &pubkeylen, 1, i % 2)); + for (j = 0; j < 32; j++) { + data->sig[j + 32] = data->msg[j]; /* Move former message to S. */ + data->msg[j] = data->sig[j]; /* Move former R to message. */ + data->sig[j] = pubkey[j + 1]; /* Move recovered pubkey X coordinate to R (which must be a valid X coordinate). */ + } + } +} + +void bench_recover_setup(void* arg) { + int i; + bench_recover_t *data = (bench_recover_t*)arg; + + for (i = 0; i < 32; i++) data->msg[i] = 1 + i; + for (i = 0; i < 64; i++) data->sig[i] = 65 + i; +} + +int main(void) { + bench_recover_t data; + + data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY); + + run_benchmark("ecdsa_recover", bench_recover, bench_recover_setup, NULL, &data, 10, 20000); + + secp256k1_context_destroy(data.ctx); + return 0; +} diff --git a/src/cryptoconditions/src/include/secp256k1/src/bench_sign.c b/src/cryptoconditions/src/include/secp256k1/src/bench_sign.c new file mode 100644 index 00000000000..072a37af516 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/bench_sign.c @@ -0,0 +1,50 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#include "include/secp256k1.h" +#include "util.h" +#include "bench.h" + +typedef struct { + secp256k1_context_t* ctx; + unsigned char msg[32]; + unsigned char key[32]; +} bench_sign_t; + +static void bench_sign_setup(void* arg) { + int i; + bench_sign_t *data = (bench_sign_t*)arg; + + for (i = 0; i < 32; i++) data->msg[i] = i + 1; + for (i = 0; i < 32; i++) data->key[i] = i + 65; +} + +static void bench_sign(void* arg) { + int i; + bench_sign_t *data = (bench_sign_t*)arg; + + unsigned char sig[64]; + for (i = 0; i < 20000; i++) { + int j; + int recid = 0; + CHECK(secp256k1_ecdsa_sign_compact(data->ctx, data->msg, sig, data->key, NULL, NULL, &recid)); + for (j = 0; j < 32; j++) { + data->msg[j] = sig[j]; /* Move former R to message. */ + data->key[j] = sig[j + 32]; /* Move former S to key. */ + } + } +} + +int main(void) { + bench_sign_t data; + + data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN); + + run_benchmark("ecdsa_sign", bench_sign, bench_sign_setup, NULL, &data, 10, 20000); + + secp256k1_context_destroy(data.ctx); + return 0; +} diff --git a/src/cryptoconditions/src/include/secp256k1/src/bench_verify.c b/src/cryptoconditions/src/include/secp256k1/src/bench_verify.c new file mode 100644 index 00000000000..c8c82752cec --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/bench_verify.c @@ -0,0 +1,56 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#include +#include + +#include "include/secp256k1.h" +#include "util.h" +#include "bench.h" + +typedef struct { + secp256k1_context_t *ctx; + unsigned char msg[32]; + unsigned char key[32]; + unsigned char sig[72]; + int siglen; + unsigned char pubkey[33]; + int pubkeylen; +} benchmark_verify_t; + +static void benchmark_verify(void* arg) { + int i; + benchmark_verify_t* data = (benchmark_verify_t*)arg; + + for (i = 0; i < 20000; i++) { + data->sig[data->siglen - 1] ^= (i & 0xFF); + data->sig[data->siglen - 2] ^= ((i >> 8) & 0xFF); + data->sig[data->siglen - 3] ^= ((i >> 16) & 0xFF); + CHECK(secp256k1_ecdsa_verify(data->ctx, data->msg, data->sig, data->siglen, data->pubkey, data->pubkeylen) == (i == 0)); + data->sig[data->siglen - 1] ^= (i & 0xFF); + data->sig[data->siglen - 2] ^= ((i >> 8) & 0xFF); + data->sig[data->siglen - 3] ^= ((i >> 16) & 0xFF); + } +} + +int main(void) { + int i; + benchmark_verify_t data; + + data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); + + for (i = 0; i < 32; i++) data.msg[i] = 1 + i; + for (i = 0; i < 32; i++) data.key[i] = 33 + i; + data.siglen = 72; + secp256k1_ecdsa_sign(data.ctx, data.msg, data.sig, &data.siglen, data.key, NULL, NULL); + data.pubkeylen = 33; + CHECK(secp256k1_ec_pubkey_create(data.ctx, data.pubkey, &data.pubkeylen, data.key, 1)); + + run_benchmark("ecdsa_verify", benchmark_verify, NULL, NULL, &data, 10, 20000); + + secp256k1_context_destroy(data.ctx); + return 0; +} diff --git a/src/cryptoconditions/src/include/secp256k1/src/ecdsa.h b/src/cryptoconditions/src/include/secp256k1/src/ecdsa.h new file mode 100644 index 00000000000..4ef78e8afb5 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/ecdsa.h @@ -0,0 +1,24 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_ECDSA_ +#define _SECP256K1_ECDSA_ + +#include "scalar.h" +#include "group.h" +#include "ecmult.h" + +typedef struct { + secp256k1_scalar_t r, s; +} secp256k1_ecdsa_sig_t; + +static int secp256k1_ecdsa_sig_parse(secp256k1_ecdsa_sig_t *r, const unsigned char *sig, int size); +static int secp256k1_ecdsa_sig_serialize(unsigned char *sig, int *size, const secp256k1_ecdsa_sig_t *a); +static int secp256k1_ecdsa_sig_verify(const secp256k1_ecmult_context_t *ctx, const secp256k1_ecdsa_sig_t *sig, const secp256k1_ge_t *pubkey, const secp256k1_scalar_t *message); +static int secp256k1_ecdsa_sig_sign(const secp256k1_ecmult_gen_context_t *ctx, secp256k1_ecdsa_sig_t *sig, const secp256k1_scalar_t *seckey, const secp256k1_scalar_t *message, const secp256k1_scalar_t *nonce, int *recid); +static int secp256k1_ecdsa_sig_recover(const secp256k1_ecmult_context_t *ctx, const secp256k1_ecdsa_sig_t *sig, secp256k1_ge_t *pubkey, const secp256k1_scalar_t *message, int recid); + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/ecdsa_impl.h b/src/cryptoconditions/src/include/secp256k1/src/ecdsa_impl.h new file mode 100644 index 00000000000..8d97db946cf --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/ecdsa_impl.h @@ -0,0 +1,271 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + + +#ifndef _SECP256K1_ECDSA_IMPL_H_ +#define _SECP256K1_ECDSA_IMPL_H_ + +#include "scalar.h" +#include "field.h" +#include "group.h" +#include "ecmult.h" +#include "ecmult_gen.h" +#include "ecdsa.h" + +/** Group order for secp256k1 defined as 'n' in "Standards for Efficient Cryptography" (SEC2) 2.7.1 + * sage: for t in xrange(1023, -1, -1): + * .. p = 2**256 - 2**32 - t + * .. if p.is_prime(): + * .. print '%x'%p + * .. break + * 'fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f' + * sage: a = 0 + * sage: b = 7 + * sage: F = FiniteField (p) + * sage: '%x' % (EllipticCurve ([F (a), F (b)]).order()) + * 'fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141' + */ +static const secp256k1_fe_t secp256k1_ecdsa_const_order_as_fe = SECP256K1_FE_CONST( + 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFEUL, + 0xBAAEDCE6UL, 0xAF48A03BUL, 0xBFD25E8CUL, 0xD0364141UL +); + +/** Difference between field and order, values 'p' and 'n' values defined in + * "Standards for Efficient Cryptography" (SEC2) 2.7.1. + * sage: p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F + * sage: a = 0 + * sage: b = 7 + * sage: F = FiniteField (p) + * sage: '%x' % (p - EllipticCurve ([F (a), F (b)]).order()) + * '14551231950b75fc4402da1722fc9baee' + */ +static const secp256k1_fe_t secp256k1_ecdsa_const_p_minus_order = SECP256K1_FE_CONST( + 0, 0, 0, 1, 0x45512319UL, 0x50B75FC4UL, 0x402DA172UL, 0x2FC9BAEEUL +); + +static int secp256k1_ecdsa_sig_parse(secp256k1_ecdsa_sig_t *r, const unsigned char *sig, int size) { + + /* libscott had to add this to get this version of the library to read compact sigs */ + int overflow = 0; + if (size == 64) { + secp256k1_scalar_set_b32(&r->r, sig, &overflow); + secp256k1_scalar_set_b32(&r->s, sig+32, &overflow); + return 1; + } + + unsigned char ra[32] = {0}, sa[32] = {0}; + const unsigned char *rp; + const unsigned char *sp; + int lenr; + int lens; + if (sig[0] != 0x30) { + return 0; + } + lenr = sig[3]; + if (5+lenr >= size) { + return 0; + } + lens = sig[lenr+5]; + if (sig[1] != lenr+lens+4) { + return 0; + } + if (lenr+lens+6 > size) { + return 0; + } + if (sig[2] != 0x02) { + return 0; + } + if (lenr == 0) { + return 0; + } + if (sig[lenr+4] != 0x02) { + return 0; + } + if (lens == 0) { + return 0; + } + sp = sig + 6 + lenr; + while (lens > 0 && sp[0] == 0) { + lens--; + sp++; + } + if (lens > 32) { + return 0; + } + rp = sig + 4; + while (lenr > 0 && rp[0] == 0) { + lenr--; + rp++; + } + if (lenr > 32) { + return 0; + } + memcpy(ra + 32 - lenr, rp, lenr); + memcpy(sa + 32 - lens, sp, lens); + overflow = 0; + secp256k1_scalar_set_b32(&r->r, ra, &overflow); + if (overflow) { + return 0; + } + secp256k1_scalar_set_b32(&r->s, sa, &overflow); + if (overflow) { + return 0; + } + return 1; +} + +static int secp256k1_ecdsa_sig_serialize(unsigned char *sig, int *size, const secp256k1_ecdsa_sig_t *a) { + unsigned char r[33] = {0}, s[33] = {0}; + unsigned char *rp = r, *sp = s; + int lenR = 33, lenS = 33; + secp256k1_scalar_get_b32(&r[1], &a->r); + secp256k1_scalar_get_b32(&s[1], &a->s); + while (lenR > 1 && rp[0] == 0 && rp[1] < 0x80) { lenR--; rp++; } + while (lenS > 1 && sp[0] == 0 && sp[1] < 0x80) { lenS--; sp++; } + if (*size < 6+lenS+lenR) { + return 0; + } + *size = 6 + lenS + lenR; + sig[0] = 0x30; + sig[1] = 4 + lenS + lenR; + sig[2] = 0x02; + sig[3] = lenR; + memcpy(sig+4, rp, lenR); + sig[4+lenR] = 0x02; + sig[5+lenR] = lenS; + memcpy(sig+lenR+6, sp, lenS); + return 1; +} + +static int secp256k1_ecdsa_sig_verify(const secp256k1_ecmult_context_t *ctx, const secp256k1_ecdsa_sig_t *sig, const secp256k1_ge_t *pubkey, const secp256k1_scalar_t *message) { + unsigned char c[32]; + secp256k1_scalar_t sn, u1, u2; + secp256k1_fe_t xr; + secp256k1_gej_t pubkeyj; + secp256k1_gej_t pr; + + if (secp256k1_scalar_is_zero(&sig->r) || secp256k1_scalar_is_zero(&sig->s)) { + return 0; + } + + secp256k1_scalar_inverse_var(&sn, &sig->s); + secp256k1_scalar_mul(&u1, &sn, message); + secp256k1_scalar_mul(&u2, &sn, &sig->r); + secp256k1_gej_set_ge(&pubkeyj, pubkey); + secp256k1_ecmult(ctx, &pr, &pubkeyj, &u2, &u1); + if (secp256k1_gej_is_infinity(&pr)) { + return 0; + } + secp256k1_scalar_get_b32(c, &sig->r); + secp256k1_fe_set_b32(&xr, c); + + /** We now have the recomputed R point in pr, and its claimed x coordinate (modulo n) + * in xr. Naively, we would extract the x coordinate from pr (requiring a inversion modulo p), + * compute the remainder modulo n, and compare it to xr. However: + * + * xr == X(pr) mod n + * <=> exists h. (xr + h * n < p && xr + h * n == X(pr)) + * [Since 2 * n > p, h can only be 0 or 1] + * <=> (xr == X(pr)) || (xr + n < p && xr + n == X(pr)) + * [In Jacobian coordinates, X(pr) is pr.x / pr.z^2 mod p] + * <=> (xr == pr.x / pr.z^2 mod p) || (xr + n < p && xr + n == pr.x / pr.z^2 mod p) + * [Multiplying both sides of the equations by pr.z^2 mod p] + * <=> (xr * pr.z^2 mod p == pr.x) || (xr + n < p && (xr + n) * pr.z^2 mod p == pr.x) + * + * Thus, we can avoid the inversion, but we have to check both cases separately. + * secp256k1_gej_eq_x implements the (xr * pr.z^2 mod p == pr.x) test. + */ + if (secp256k1_gej_eq_x_var(&xr, &pr)) { + /* xr.x == xr * xr.z^2 mod p, so the signature is valid. */ + return 1; + } + if (secp256k1_fe_cmp_var(&xr, &secp256k1_ecdsa_const_p_minus_order) >= 0) { + /* xr + p >= n, so we can skip testing the second case. */ + return 0; + } + secp256k1_fe_add(&xr, &secp256k1_ecdsa_const_order_as_fe); + if (secp256k1_gej_eq_x_var(&xr, &pr)) { + /* (xr + n) * pr.z^2 mod p == pr.x, so the signature is valid. */ + return 1; + } + return 0; +} + +static int secp256k1_ecdsa_sig_recover(const secp256k1_ecmult_context_t *ctx, const secp256k1_ecdsa_sig_t *sig, secp256k1_ge_t *pubkey, const secp256k1_scalar_t *message, int recid) { + unsigned char brx[32]; + secp256k1_fe_t fx; + secp256k1_ge_t x; + secp256k1_gej_t xj; + secp256k1_scalar_t rn, u1, u2; + secp256k1_gej_t qj; + + if (secp256k1_scalar_is_zero(&sig->r) || secp256k1_scalar_is_zero(&sig->s)) { + return 0; + } + + secp256k1_scalar_get_b32(brx, &sig->r); + VERIFY_CHECK(secp256k1_fe_set_b32(&fx, brx)); /* brx comes from a scalar, so is less than the order; certainly less than p */ + if (recid & 2) { + if (secp256k1_fe_cmp_var(&fx, &secp256k1_ecdsa_const_p_minus_order) >= 0) { + return 0; + } + secp256k1_fe_add(&fx, &secp256k1_ecdsa_const_order_as_fe); + } + if (!secp256k1_ge_set_xo_var(&x, &fx, recid & 1)) { + return 0; + } + secp256k1_gej_set_ge(&xj, &x); + secp256k1_scalar_inverse_var(&rn, &sig->r); + secp256k1_scalar_mul(&u1, &rn, message); + secp256k1_scalar_negate(&u1, &u1); + secp256k1_scalar_mul(&u2, &rn, &sig->s); + secp256k1_ecmult(ctx, &qj, &xj, &u2, &u1); + secp256k1_ge_set_gej_var(pubkey, &qj); + return !secp256k1_gej_is_infinity(&qj); +} + +static int secp256k1_ecdsa_sig_sign(const secp256k1_ecmult_gen_context_t *ctx, secp256k1_ecdsa_sig_t *sig, const secp256k1_scalar_t *seckey, const secp256k1_scalar_t *message, const secp256k1_scalar_t *nonce, int *recid) { + unsigned char b[32]; + secp256k1_gej_t rp; + secp256k1_ge_t r; + secp256k1_scalar_t n; + int overflow = 0; + + secp256k1_ecmult_gen(ctx, &rp, nonce); + secp256k1_ge_set_gej(&r, &rp); + secp256k1_fe_normalize(&r.x); + secp256k1_fe_normalize(&r.y); + secp256k1_fe_get_b32(b, &r.x); + secp256k1_scalar_set_b32(&sig->r, b, &overflow); + if (secp256k1_scalar_is_zero(&sig->r)) { + /* P.x = order is on the curve, so technically sig->r could end up zero, which would be an invalid signature. */ + secp256k1_gej_clear(&rp); + secp256k1_ge_clear(&r); + return 0; + } + if (recid) { + *recid = (overflow ? 2 : 0) | (secp256k1_fe_is_odd(&r.y) ? 1 : 0); + } + secp256k1_scalar_mul(&n, &sig->r, seckey); + secp256k1_scalar_add(&n, &n, message); + secp256k1_scalar_inverse(&sig->s, nonce); + secp256k1_scalar_mul(&sig->s, &sig->s, &n); + secp256k1_scalar_clear(&n); + secp256k1_gej_clear(&rp); + secp256k1_ge_clear(&r); + if (secp256k1_scalar_is_zero(&sig->s)) { + return 0; + } + if (secp256k1_scalar_is_high(&sig->s)) { + secp256k1_scalar_negate(&sig->s, &sig->s); + if (recid) { + *recid ^= 1; + } + } + return 1; +} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/eckey.h b/src/cryptoconditions/src/include/secp256k1/src/eckey.h new file mode 100644 index 00000000000..53b818485ed --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/eckey.h @@ -0,0 +1,26 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_ECKEY_ +#define _SECP256K1_ECKEY_ + +#include "group.h" +#include "scalar.h" +#include "ecmult.h" +#include "ecmult_gen.h" + +static int secp256k1_eckey_pubkey_parse(secp256k1_ge_t *elem, const unsigned char *pub, int size); +static int secp256k1_eckey_pubkey_serialize(secp256k1_ge_t *elem, unsigned char *pub, int *size, int compressed); + +static int secp256k1_eckey_privkey_parse(secp256k1_scalar_t *key, const unsigned char *privkey, int privkeylen); +static int secp256k1_eckey_privkey_serialize(const secp256k1_ecmult_gen_context_t *ctx, unsigned char *privkey, int *privkeylen, const secp256k1_scalar_t *key, int compressed); + +static int secp256k1_eckey_privkey_tweak_add(secp256k1_scalar_t *key, const secp256k1_scalar_t *tweak); +static int secp256k1_eckey_pubkey_tweak_add(const secp256k1_ecmult_context_t *ctx, secp256k1_ge_t *key, const secp256k1_scalar_t *tweak); +static int secp256k1_eckey_privkey_tweak_mul(secp256k1_scalar_t *key, const secp256k1_scalar_t *tweak); +static int secp256k1_eckey_pubkey_tweak_mul(const secp256k1_ecmult_context_t *ctx, secp256k1_ge_t *key, const secp256k1_scalar_t *tweak); + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/eckey_impl.h b/src/cryptoconditions/src/include/secp256k1/src/eckey_impl.h new file mode 100644 index 00000000000..a332bd34ecd --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/eckey_impl.h @@ -0,0 +1,202 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_ECKEY_IMPL_H_ +#define _SECP256K1_ECKEY_IMPL_H_ + +#include "eckey.h" + +#include "scalar.h" +#include "field.h" +#include "group.h" +#include "ecmult_gen.h" + +static int secp256k1_eckey_pubkey_parse(secp256k1_ge_t *elem, const unsigned char *pub, int size) { + if (size == 33 && (pub[0] == 0x02 || pub[0] == 0x03)) { + secp256k1_fe_t x; + return secp256k1_fe_set_b32(&x, pub+1) && secp256k1_ge_set_xo_var(elem, &x, pub[0] == 0x03); + } else if (size == 65 && (pub[0] == 0x04 || pub[0] == 0x06 || pub[0] == 0x07)) { + secp256k1_fe_t x, y; + if (!secp256k1_fe_set_b32(&x, pub+1) || !secp256k1_fe_set_b32(&y, pub+33)) { + return 0; + } + secp256k1_ge_set_xy(elem, &x, &y); + if ((pub[0] == 0x06 || pub[0] == 0x07) && secp256k1_fe_is_odd(&y) != (pub[0] == 0x07)) { + return 0; + } + return secp256k1_ge_is_valid_var(elem); + } else { + return 0; + } +} + +static int secp256k1_eckey_pubkey_serialize(secp256k1_ge_t *elem, unsigned char *pub, int *size, int compressed) { + if (secp256k1_ge_is_infinity(elem)) { + return 0; + } + secp256k1_fe_normalize_var(&elem->x); + secp256k1_fe_normalize_var(&elem->y); + secp256k1_fe_get_b32(&pub[1], &elem->x); + if (compressed) { + *size = 33; + pub[0] = 0x02 | (secp256k1_fe_is_odd(&elem->y) ? 0x01 : 0x00); + } else { + *size = 65; + pub[0] = 0x04; + secp256k1_fe_get_b32(&pub[33], &elem->y); + } + return 1; +} + +static int secp256k1_eckey_privkey_parse(secp256k1_scalar_t *key, const unsigned char *privkey, int privkeylen) { + unsigned char c[32] = {0}; + const unsigned char *end = privkey + privkeylen; + int lenb = 0; + int len = 0; + int overflow = 0; + /* sequence header */ + if (end < privkey+1 || *privkey != 0x30) { + return 0; + } + privkey++; + /* sequence length constructor */ + if (end < privkey+1 || !(*privkey & 0x80)) { + return 0; + } + lenb = *privkey & ~0x80; privkey++; + if (lenb < 1 || lenb > 2) { + return 0; + } + if (end < privkey+lenb) { + return 0; + } + /* sequence length */ + len = privkey[lenb-1] | (lenb > 1 ? privkey[lenb-2] << 8 : 0); + privkey += lenb; + if (end < privkey+len) { + return 0; + } + /* sequence element 0: version number (=1) */ + if (end < privkey+3 || privkey[0] != 0x02 || privkey[1] != 0x01 || privkey[2] != 0x01) { + return 0; + } + privkey += 3; + /* sequence element 1: octet string, up to 32 bytes */ + if (end < privkey+2 || privkey[0] != 0x04 || privkey[1] > 0x20 || end < privkey+2+privkey[1]) { + return 0; + } + memcpy(c + 32 - privkey[1], privkey + 2, privkey[1]); + secp256k1_scalar_set_b32(key, c, &overflow); + memset(c, 0, 32); + return !overflow; +} + +static int secp256k1_eckey_privkey_serialize(const secp256k1_ecmult_gen_context_t *ctx, unsigned char *privkey, int *privkeylen, const secp256k1_scalar_t *key, int compressed) { + secp256k1_gej_t rp; + secp256k1_ge_t r; + int pubkeylen = 0; + secp256k1_ecmult_gen(ctx, &rp, key); + secp256k1_ge_set_gej(&r, &rp); + if (compressed) { + static const unsigned char begin[] = { + 0x30,0x81,0xD3,0x02,0x01,0x01,0x04,0x20 + }; + static const unsigned char middle[] = { + 0xA0,0x81,0x85,0x30,0x81,0x82,0x02,0x01,0x01,0x30,0x2C,0x06,0x07,0x2A,0x86,0x48, + 0xCE,0x3D,0x01,0x01,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F,0x30,0x06,0x04,0x01,0x00,0x04,0x01,0x07,0x04, + 0x21,0x02,0x79,0xBE,0x66,0x7E,0xF9,0xDC,0xBB,0xAC,0x55,0xA0,0x62,0x95,0xCE,0x87, + 0x0B,0x07,0x02,0x9B,0xFC,0xDB,0x2D,0xCE,0x28,0xD9,0x59,0xF2,0x81,0x5B,0x16,0xF8, + 0x17,0x98,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,0xBF,0xD2,0x5E, + 0x8C,0xD0,0x36,0x41,0x41,0x02,0x01,0x01,0xA1,0x24,0x03,0x22,0x00 + }; + unsigned char *ptr = privkey; + memcpy(ptr, begin, sizeof(begin)); ptr += sizeof(begin); + secp256k1_scalar_get_b32(ptr, key); ptr += 32; + memcpy(ptr, middle, sizeof(middle)); ptr += sizeof(middle); + if (!secp256k1_eckey_pubkey_serialize(&r, ptr, &pubkeylen, 1)) { + return 0; + } + ptr += pubkeylen; + *privkeylen = ptr - privkey; + } else { + static const unsigned char begin[] = { + 0x30,0x82,0x01,0x13,0x02,0x01,0x01,0x04,0x20 + }; + static const unsigned char middle[] = { + 0xA0,0x81,0xA5,0x30,0x81,0xA2,0x02,0x01,0x01,0x30,0x2C,0x06,0x07,0x2A,0x86,0x48, + 0xCE,0x3D,0x01,0x01,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F,0x30,0x06,0x04,0x01,0x00,0x04,0x01,0x07,0x04, + 0x41,0x04,0x79,0xBE,0x66,0x7E,0xF9,0xDC,0xBB,0xAC,0x55,0xA0,0x62,0x95,0xCE,0x87, + 0x0B,0x07,0x02,0x9B,0xFC,0xDB,0x2D,0xCE,0x28,0xD9,0x59,0xF2,0x81,0x5B,0x16,0xF8, + 0x17,0x98,0x48,0x3A,0xDA,0x77,0x26,0xA3,0xC4,0x65,0x5D,0xA4,0xFB,0xFC,0x0E,0x11, + 0x08,0xA8,0xFD,0x17,0xB4,0x48,0xA6,0x85,0x54,0x19,0x9C,0x47,0xD0,0x8F,0xFB,0x10, + 0xD4,0xB8,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFE,0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,0xBF,0xD2,0x5E, + 0x8C,0xD0,0x36,0x41,0x41,0x02,0x01,0x01,0xA1,0x44,0x03,0x42,0x00 + }; + unsigned char *ptr = privkey; + memcpy(ptr, begin, sizeof(begin)); ptr += sizeof(begin); + secp256k1_scalar_get_b32(ptr, key); ptr += 32; + memcpy(ptr, middle, sizeof(middle)); ptr += sizeof(middle); + if (!secp256k1_eckey_pubkey_serialize(&r, ptr, &pubkeylen, 0)) { + return 0; + } + ptr += pubkeylen; + *privkeylen = ptr - privkey; + } + return 1; +} + +static int secp256k1_eckey_privkey_tweak_add(secp256k1_scalar_t *key, const secp256k1_scalar_t *tweak) { + secp256k1_scalar_add(key, key, tweak); + if (secp256k1_scalar_is_zero(key)) { + return 0; + } + return 1; +} + +static int secp256k1_eckey_pubkey_tweak_add(const secp256k1_ecmult_context_t *ctx, secp256k1_ge_t *key, const secp256k1_scalar_t *tweak) { + secp256k1_gej_t pt; + secp256k1_scalar_t one; + secp256k1_gej_set_ge(&pt, key); + secp256k1_scalar_set_int(&one, 1); + secp256k1_ecmult(ctx, &pt, &pt, &one, tweak); + + if (secp256k1_gej_is_infinity(&pt)) { + return 0; + } + secp256k1_ge_set_gej(key, &pt); + return 1; +} + +static int secp256k1_eckey_privkey_tweak_mul(secp256k1_scalar_t *key, const secp256k1_scalar_t *tweak) { + if (secp256k1_scalar_is_zero(tweak)) { + return 0; + } + + secp256k1_scalar_mul(key, key, tweak); + return 1; +} + +static int secp256k1_eckey_pubkey_tweak_mul(const secp256k1_ecmult_context_t *ctx, secp256k1_ge_t *key, const secp256k1_scalar_t *tweak) { + secp256k1_scalar_t zero; + secp256k1_gej_t pt; + if (secp256k1_scalar_is_zero(tweak)) { + return 0; + } + + secp256k1_scalar_set_int(&zero, 0); + secp256k1_gej_set_ge(&pt, key); + secp256k1_ecmult(ctx, &pt, &pt, tweak, &zero); + secp256k1_ge_set_gej(key, &pt); + return 1; +} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/ecmult.h b/src/cryptoconditions/src/include/secp256k1/src/ecmult.h new file mode 100644 index 00000000000..bab9e4ef522 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/ecmult.h @@ -0,0 +1,31 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_ECMULT_ +#define _SECP256K1_ECMULT_ + +#include "num.h" +#include "group.h" + +typedef struct { + /* For accelerating the computation of a*P + b*G: */ + secp256k1_ge_storage_t (*pre_g)[]; /* odd multiples of the generator */ +#ifdef USE_ENDOMORPHISM + secp256k1_ge_storage_t (*pre_g_128)[]; /* odd multiples of 2^128*generator */ +#endif +} secp256k1_ecmult_context_t; + +static void secp256k1_ecmult_context_init(secp256k1_ecmult_context_t *ctx); +static void secp256k1_ecmult_context_build(secp256k1_ecmult_context_t *ctx); +static void secp256k1_ecmult_context_clone(secp256k1_ecmult_context_t *dst, + const secp256k1_ecmult_context_t *src); +static void secp256k1_ecmult_context_clear(secp256k1_ecmult_context_t *ctx); +static int secp256k1_ecmult_context_is_built(const secp256k1_ecmult_context_t *ctx); + +/** Double multiply: R = na*A + ng*G */ +static void secp256k1_ecmult(const secp256k1_ecmult_context_t *ctx, secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_scalar_t *na, const secp256k1_scalar_t *ng); + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/ecmult_gen.h b/src/cryptoconditions/src/include/secp256k1/src/ecmult_gen.h new file mode 100644 index 00000000000..3745633c47f --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/ecmult_gen.h @@ -0,0 +1,43 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_ECMULT_GEN_ +#define _SECP256K1_ECMULT_GEN_ + +#include "scalar.h" +#include "group.h" + +typedef struct { + /* For accelerating the computation of a*G: + * To harden against timing attacks, use the following mechanism: + * * Break up the multiplicand into groups of 4 bits, called n_0, n_1, n_2, ..., n_63. + * * Compute sum(n_i * 16^i * G + U_i, i=0..63), where: + * * U_i = U * 2^i (for i=0..62) + * * U_i = U * (1-2^63) (for i=63) + * where U is a point with no known corresponding scalar. Note that sum(U_i, i=0..63) = 0. + * For each i, and each of the 16 possible values of n_i, (n_i * 16^i * G + U_i) is + * precomputed (call it prec(i, n_i)). The formula now becomes sum(prec(i, n_i), i=0..63). + * None of the resulting prec group elements have a known scalar, and neither do any of + * the intermediate sums while computing a*G. + */ + secp256k1_ge_storage_t (*prec)[64][16]; /* prec[j][i] = 16^j * i * G + U_i */ + secp256k1_scalar_t blind; + secp256k1_gej_t initial; +} secp256k1_ecmult_gen_context_t; + +static void secp256k1_ecmult_gen_context_init(secp256k1_ecmult_gen_context_t* ctx); +static void secp256k1_ecmult_gen_context_build(secp256k1_ecmult_gen_context_t* ctx); +static void secp256k1_ecmult_gen_context_clone(secp256k1_ecmult_gen_context_t *dst, + const secp256k1_ecmult_gen_context_t* src); +static void secp256k1_ecmult_gen_context_clear(secp256k1_ecmult_gen_context_t* ctx); +static int secp256k1_ecmult_gen_context_is_built(const secp256k1_ecmult_gen_context_t* ctx); + +/** Multiply with the generator: R = a*G */ +static void secp256k1_ecmult_gen(const secp256k1_ecmult_gen_context_t* ctx, secp256k1_gej_t *r, const secp256k1_scalar_t *a); + +static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context_t *ctx, const unsigned char *seed32); + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/ecmult_gen_impl.h b/src/cryptoconditions/src/include/secp256k1/src/ecmult_gen_impl.h new file mode 100644 index 00000000000..4697753ac81 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/ecmult_gen_impl.h @@ -0,0 +1,184 @@ +/********************************************************************** + * Copyright (c) 2013, 2014, 2015 Pieter Wuille, Gregory Maxwell * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_ECMULT_GEN_IMPL_H_ +#define _SECP256K1_ECMULT_GEN_IMPL_H_ + +#include "scalar.h" +#include "group.h" +#include "ecmult_gen.h" +#include "hash_impl.h" + +static void secp256k1_ecmult_gen_context_init(secp256k1_ecmult_gen_context_t *ctx) { + ctx->prec = NULL; +} + +static void secp256k1_ecmult_gen_context_build(secp256k1_ecmult_gen_context_t *ctx) { + secp256k1_ge_t prec[1024]; + secp256k1_gej_t gj; + secp256k1_gej_t nums_gej; + int i, j; + + if (ctx->prec != NULL) { + return; + } + + ctx->prec = (secp256k1_ge_storage_t (*)[64][16])checked_malloc(sizeof(*ctx->prec)); + + /* get the generator */ + secp256k1_gej_set_ge(&gj, &secp256k1_ge_const_g); + + /* Construct a group element with no known corresponding scalar (nothing up my sleeve). */ + { + static const unsigned char nums_b32[33] = "The scalar for this x is unknown"; + secp256k1_fe_t nums_x; + secp256k1_ge_t nums_ge; + VERIFY_CHECK(secp256k1_fe_set_b32(&nums_x, nums_b32)); + VERIFY_CHECK(secp256k1_ge_set_xo_var(&nums_ge, &nums_x, 0)); + secp256k1_gej_set_ge(&nums_gej, &nums_ge); + /* Add G to make the bits in x uniformly distributed. */ + secp256k1_gej_add_ge_var(&nums_gej, &nums_gej, &secp256k1_ge_const_g); + } + + /* compute prec. */ + { + secp256k1_gej_t precj[1024]; /* Jacobian versions of prec. */ + secp256k1_gej_t gbase; + secp256k1_gej_t numsbase; + gbase = gj; /* 16^j * G */ + numsbase = nums_gej; /* 2^j * nums. */ + for (j = 0; j < 64; j++) { + /* Set precj[j*16 .. j*16+15] to (numsbase, numsbase + gbase, ..., numsbase + 15*gbase). */ + precj[j*16] = numsbase; + for (i = 1; i < 16; i++) { + secp256k1_gej_add_var(&precj[j*16 + i], &precj[j*16 + i - 1], &gbase); + } + /* Multiply gbase by 16. */ + for (i = 0; i < 4; i++) { + secp256k1_gej_double_var(&gbase, &gbase); + } + /* Multiply numbase by 2. */ + secp256k1_gej_double_var(&numsbase, &numsbase); + if (j == 62) { + /* In the last iteration, numsbase is (1 - 2^j) * nums instead. */ + secp256k1_gej_neg(&numsbase, &numsbase); + secp256k1_gej_add_var(&numsbase, &numsbase, &nums_gej); + } + } + secp256k1_ge_set_all_gej_var(1024, prec, precj); + } + for (j = 0; j < 64; j++) { + for (i = 0; i < 16; i++) { + secp256k1_ge_to_storage(&(*ctx->prec)[j][i], &prec[j*16 + i]); + } + } + secp256k1_ecmult_gen_blind(ctx, NULL); +} + +static int secp256k1_ecmult_gen_context_is_built(const secp256k1_ecmult_gen_context_t* ctx) { + return ctx->prec != NULL; +} + +static void secp256k1_ecmult_gen_context_clone(secp256k1_ecmult_gen_context_t *dst, + const secp256k1_ecmult_gen_context_t *src) { + if (src->prec == NULL) { + dst->prec = NULL; + } else { + dst->prec = (secp256k1_ge_storage_t (*)[64][16])checked_malloc(sizeof(*dst->prec)); + memcpy(dst->prec, src->prec, sizeof(*dst->prec)); + dst->initial = src->initial; + dst->blind = src->blind; + } +} + +static void secp256k1_ecmult_gen_context_clear(secp256k1_ecmult_gen_context_t *ctx) { + free(ctx->prec); + secp256k1_scalar_clear(&ctx->blind); + secp256k1_gej_clear(&ctx->initial); + ctx->prec = NULL; +} + +static void secp256k1_ecmult_gen(const secp256k1_ecmult_gen_context_t *ctx, secp256k1_gej_t *r, const secp256k1_scalar_t *gn) { + secp256k1_ge_t add; + secp256k1_ge_storage_t adds; + secp256k1_scalar_t gnb; + int bits; + int i, j; + memset(&adds, 0, sizeof(adds)); + *r = ctx->initial; + /* Blind scalar/point multiplication by computing (n-b)G + bG instead of nG. */ + secp256k1_scalar_add(&gnb, gn, &ctx->blind); + add.infinity = 0; + for (j = 0; j < 64; j++) { + bits = secp256k1_scalar_get_bits(&gnb, j * 4, 4); + for (i = 0; i < 16; i++) { + /** This uses a conditional move to avoid any secret data in array indexes. + * _Any_ use of secret indexes has been demonstrated to result in timing + * sidechannels, even when the cache-line access patterns are uniform. + * See also: + * "A word of warning", CHES 2013 Rump Session, by Daniel J. Bernstein and Peter Schwabe + * (https://cryptojedi.org/peter/data/chesrump-20130822.pdf) and + * "Cache Attacks and Countermeasures: the Case of AES", RSA 2006, + * by Dag Arne Osvik, Adi Shamir, and Eran Tromer + * (http://www.tau.ac.il/~tromer/papers/cache.pdf) + */ + secp256k1_ge_storage_cmov(&adds, &(*ctx->prec)[j][i], i == bits); + } + secp256k1_ge_from_storage(&add, &adds); + secp256k1_gej_add_ge(r, r, &add); + } + bits = 0; + secp256k1_ge_clear(&add); + secp256k1_scalar_clear(&gnb); +} + +/* Setup blinding values for secp256k1_ecmult_gen. */ +static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context_t *ctx, const unsigned char *seed32) { + secp256k1_scalar_t b; + secp256k1_gej_t gb; + secp256k1_fe_t s; + unsigned char nonce32[32]; + secp256k1_rfc6979_hmac_sha256_t rng; + int retry; + if (!seed32) { + /* When seed is NULL, reset the initial point and blinding value. */ + secp256k1_gej_set_ge(&ctx->initial, &secp256k1_ge_const_g); + secp256k1_gej_neg(&ctx->initial, &ctx->initial); + secp256k1_scalar_set_int(&ctx->blind, 1); + } + /* The prior blinding value (if not reset) is chained forward by including it in the hash. */ + secp256k1_scalar_get_b32(nonce32, &ctx->blind); + /** Using a CSPRNG allows a failure free interface, avoids needing large amounts of random data, + * and guards against weak or adversarial seeds. This is a simpler and safer interface than + * asking the caller for blinding values directly and expecting them to retry on failure. + */ + secp256k1_rfc6979_hmac_sha256_initialize(&rng, seed32 ? seed32 : nonce32, 32, nonce32, 32, NULL, 0); + /* Retry for out of range results to achieve uniformity. */ + do { + secp256k1_rfc6979_hmac_sha256_generate(&rng, nonce32, 32); + retry = !secp256k1_fe_set_b32(&s, nonce32); + retry |= secp256k1_fe_is_zero(&s); + } while (retry); + /* Randomize the projection to defend against multiplier sidechannels. */ + secp256k1_gej_rescale(&ctx->initial, &s); + secp256k1_fe_clear(&s); + do { + secp256k1_rfc6979_hmac_sha256_generate(&rng, nonce32, 32); + secp256k1_scalar_set_b32(&b, nonce32, &retry); + /* A blinding value of 0 works, but would undermine the projection hardening. */ + retry |= secp256k1_scalar_is_zero(&b); + } while (retry); + secp256k1_rfc6979_hmac_sha256_finalize(&rng); + memset(nonce32, 0, 32); + secp256k1_ecmult_gen(ctx, &gb, &b); + secp256k1_scalar_negate(&b, &b); + ctx->blind = b; + ctx->initial = gb; + secp256k1_scalar_clear(&b); + secp256k1_gej_clear(&gb); +} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/ecmult_impl.h b/src/cryptoconditions/src/include/secp256k1/src/ecmult_impl.h new file mode 100644 index 00000000000..1b2856f83df --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/ecmult_impl.h @@ -0,0 +1,317 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_ECMULT_IMPL_H_ +#define _SECP256K1_ECMULT_IMPL_H_ + +#include "group.h" +#include "scalar.h" +#include "ecmult.h" + +/* optimal for 128-bit and 256-bit exponents. */ +#define WINDOW_A 5 + +/** larger numbers may result in slightly better performance, at the cost of + exponentially larger precomputed tables. */ +#ifdef USE_ENDOMORPHISM +/** Two tables for window size 15: 1.375 MiB. */ +#define WINDOW_G 15 +#else +/** One table for window size 16: 1.375 MiB. */ +#define WINDOW_G 16 +#endif + +/** Fill a table 'pre' with precomputed odd multiples of a. W determines the size of the table. + * pre will contains the values [1*a,3*a,5*a,...,(2^(w-1)-1)*a], so it needs place for + * 2^(w-2) entries. + * + * There are two versions of this function: + * - secp256k1_ecmult_precomp_wnaf_gej, which operates on group elements in jacobian notation, + * fast to precompute, but slower to use in later additions. + * - secp256k1_ecmult_precomp_wnaf_ge, which operates on group elements in affine notations, + * (much) slower to precompute, but a bit faster to use in later additions. + * To compute a*P + b*G, we use the jacobian version for P, and the affine version for G, as + * G is constant, so it only needs to be done once in advance. + */ +static void secp256k1_ecmult_table_precomp_gej_var(secp256k1_gej_t *pre, const secp256k1_gej_t *a, int w) { + secp256k1_gej_t d; + int i; + pre[0] = *a; + secp256k1_gej_double_var(&d, &pre[0]); + for (i = 1; i < (1 << (w-2)); i++) { + secp256k1_gej_add_var(&pre[i], &d, &pre[i-1]); + } +} + +static void secp256k1_ecmult_table_precomp_ge_storage_var(secp256k1_ge_storage_t *pre, const secp256k1_gej_t *a, int w) { + secp256k1_gej_t d; + int i; + const int table_size = 1 << (w-2); + secp256k1_gej_t *prej = (secp256k1_gej_t *)checked_malloc(sizeof(secp256k1_gej_t) * table_size); + secp256k1_ge_t *prea = (secp256k1_ge_t *)checked_malloc(sizeof(secp256k1_ge_t) * table_size); + prej[0] = *a; + secp256k1_gej_double_var(&d, a); + for (i = 1; i < table_size; i++) { + secp256k1_gej_add_var(&prej[i], &d, &prej[i-1]); + } + secp256k1_ge_set_all_gej_var(table_size, prea, prej); + for (i = 0; i < table_size; i++) { + secp256k1_ge_to_storage(&pre[i], &prea[i]); + } + free(prej); + free(prea); +} + +/** The number of entries a table with precomputed multiples needs to have. */ +#define ECMULT_TABLE_SIZE(w) (1 << ((w)-2)) + +/** The following two macro retrieves a particular odd multiple from a table + * of precomputed multiples. */ +#define ECMULT_TABLE_GET_GEJ(r,pre,n,w) do { \ + VERIFY_CHECK(((n) & 1) == 1); \ + VERIFY_CHECK((n) >= -((1 << ((w)-1)) - 1)); \ + VERIFY_CHECK((n) <= ((1 << ((w)-1)) - 1)); \ + if ((n) > 0) { \ + *(r) = (pre)[((n)-1)/2]; \ + } else { \ + secp256k1_gej_neg((r), &(pre)[(-(n)-1)/2]); \ + } \ +} while(0) +#define ECMULT_TABLE_GET_GE_STORAGE(r,pre,n,w) do { \ + VERIFY_CHECK(((n) & 1) == 1); \ + VERIFY_CHECK((n) >= -((1 << ((w)-1)) - 1)); \ + VERIFY_CHECK((n) <= ((1 << ((w)-1)) - 1)); \ + if ((n) > 0) { \ + secp256k1_ge_from_storage((r), &(pre)[((n)-1)/2]); \ + } else { \ + secp256k1_ge_from_storage((r), &(pre)[(-(n)-1)/2]); \ + secp256k1_ge_neg((r), (r)); \ + } \ +} while(0) + +static void secp256k1_ecmult_context_init(secp256k1_ecmult_context_t *ctx) { + ctx->pre_g = NULL; +#ifdef USE_ENDOMORPHISM + ctx->pre_g_128 = NULL; +#endif +} + +static void secp256k1_ecmult_context_build(secp256k1_ecmult_context_t *ctx) { + secp256k1_gej_t gj; + + if (ctx->pre_g != NULL) { + return; + } + + /* get the generator */ + secp256k1_gej_set_ge(&gj, &secp256k1_ge_const_g); + + ctx->pre_g = (secp256k1_ge_storage_t (*)[])checked_malloc(sizeof((*ctx->pre_g)[0]) * ECMULT_TABLE_SIZE(WINDOW_G)); + + /* precompute the tables with odd multiples */ + secp256k1_ecmult_table_precomp_ge_storage_var(*ctx->pre_g, &gj, WINDOW_G); + +#ifdef USE_ENDOMORPHISM + { + secp256k1_gej_t g_128j; + int i; + + ctx->pre_g_128 = (secp256k1_ge_storage_t (*)[])checked_malloc(sizeof((*ctx->pre_g_128)[0]) * ECMULT_TABLE_SIZE(WINDOW_G)); + + /* calculate 2^128*generator */ + g_128j = gj; + for (i = 0; i < 128; i++) { + secp256k1_gej_double_var(&g_128j, &g_128j); + } + secp256k1_ecmult_table_precomp_ge_storage_var(*ctx->pre_g_128, &g_128j, WINDOW_G); + } +#endif +} + +static void secp256k1_ecmult_context_clone(secp256k1_ecmult_context_t *dst, + const secp256k1_ecmult_context_t *src) { + if (src->pre_g == NULL) { + dst->pre_g = NULL; + } else { + size_t size = sizeof((*dst->pre_g)[0]) * ECMULT_TABLE_SIZE(WINDOW_G); + dst->pre_g = (secp256k1_ge_storage_t (*)[])checked_malloc(size); + memcpy(dst->pre_g, src->pre_g, size); + } +#ifdef USE_ENDOMORPHISM + if (src->pre_g_128 == NULL) { + dst->pre_g_128 = NULL; + } else { + size_t size = sizeof((*dst->pre_g_128)[0]) * ECMULT_TABLE_SIZE(WINDOW_G); + dst->pre_g_128 = (secp256k1_ge_storage_t (*)[])checked_malloc(size); + memcpy(dst->pre_g_128, src->pre_g_128, size); + } +#endif +} + +static int secp256k1_ecmult_context_is_built(const secp256k1_ecmult_context_t *ctx) { + return ctx->pre_g != NULL; +} + +static void secp256k1_ecmult_context_clear(secp256k1_ecmult_context_t *ctx) { + free(ctx->pre_g); +#ifdef USE_ENDOMORPHISM + free(ctx->pre_g_128); +#endif + secp256k1_ecmult_context_init(ctx); +} + +/** Convert a number to WNAF notation. The number becomes represented by sum(2^i * wnaf[i], i=0..bits), + * with the following guarantees: + * - each wnaf[i] is either 0, or an odd integer between -(1<<(w-1) - 1) and (1<<(w-1) - 1) + * - two non-zero entries in wnaf are separated by at least w-1 zeroes. + * - the number of set values in wnaf is returned. This number is at most 256, and at most one more + * - than the number of bits in the (absolute value) of the input. + */ +static int secp256k1_ecmult_wnaf(int *wnaf, const secp256k1_scalar_t *a, int w) { + secp256k1_scalar_t s = *a; + int set_bits = 0; + int bit = 0; + int sign = 1; + + if (secp256k1_scalar_get_bits(&s, 255, 1)) { + secp256k1_scalar_negate(&s, &s); + sign = -1; + } + + while (bit < 256) { + int now; + int word; + if (secp256k1_scalar_get_bits(&s, bit, 1) == 0) { + bit++; + continue; + } + while (set_bits < bit) { + wnaf[set_bits++] = 0; + } + now = w; + if (bit + now > 256) { + now = 256 - bit; + } + word = secp256k1_scalar_get_bits_var(&s, bit, now); + if (word & (1 << (w-1))) { + secp256k1_scalar_add_bit(&s, bit + w); + wnaf[set_bits++] = sign * (word - (1 << w)); + } else { + wnaf[set_bits++] = sign * word; + } + bit += now; + } + return set_bits; +} + +static void secp256k1_ecmult(const secp256k1_ecmult_context_t *ctx, secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_scalar_t *na, const secp256k1_scalar_t *ng) { + secp256k1_gej_t tmpj; + secp256k1_gej_t pre_a[ECMULT_TABLE_SIZE(WINDOW_A)]; + secp256k1_ge_t tmpa; +#ifdef USE_ENDOMORPHISM + secp256k1_gej_t pre_a_lam[ECMULT_TABLE_SIZE(WINDOW_A)]; + secp256k1_scalar_t na_1, na_lam; + /* Splitted G factors. */ + secp256k1_scalar_t ng_1, ng_128; + int wnaf_na_1[130]; + int wnaf_na_lam[130]; + int bits_na_1; + int bits_na_lam; + int wnaf_ng_1[129]; + int bits_ng_1; + int wnaf_ng_128[129]; + int bits_ng_128; +#else + int wnaf_na[256]; + int bits_na; + int wnaf_ng[257]; + int bits_ng; +#endif + int i; + int bits; + +#ifdef USE_ENDOMORPHISM + /* split na into na_1 and na_lam (where na = na_1 + na_lam*lambda, and na_1 and na_lam are ~128 bit) */ + secp256k1_scalar_split_lambda_var(&na_1, &na_lam, na); + + /* build wnaf representation for na_1 and na_lam. */ + bits_na_1 = secp256k1_ecmult_wnaf(wnaf_na_1, &na_1, WINDOW_A); + bits_na_lam = secp256k1_ecmult_wnaf(wnaf_na_lam, &na_lam, WINDOW_A); + VERIFY_CHECK(bits_na_1 <= 130); + VERIFY_CHECK(bits_na_lam <= 130); + bits = bits_na_1; + if (bits_na_lam > bits) { + bits = bits_na_lam; + } +#else + /* build wnaf representation for na. */ + bits_na = secp256k1_ecmult_wnaf(wnaf_na, na, WINDOW_A); + bits = bits_na; +#endif + + /* calculate odd multiples of a */ + secp256k1_ecmult_table_precomp_gej_var(pre_a, a, WINDOW_A); + +#ifdef USE_ENDOMORPHISM + for (i = 0; i < ECMULT_TABLE_SIZE(WINDOW_A); i++) { + secp256k1_gej_mul_lambda(&pre_a_lam[i], &pre_a[i]); + } + + /* split ng into ng_1 and ng_128 (where gn = gn_1 + gn_128*2^128, and gn_1 and gn_128 are ~128 bit) */ + secp256k1_scalar_split_128(&ng_1, &ng_128, ng); + + /* Build wnaf representation for ng_1 and ng_128 */ + bits_ng_1 = secp256k1_ecmult_wnaf(wnaf_ng_1, &ng_1, WINDOW_G); + bits_ng_128 = secp256k1_ecmult_wnaf(wnaf_ng_128, &ng_128, WINDOW_G); + if (bits_ng_1 > bits) { + bits = bits_ng_1; + } + if (bits_ng_128 > bits) { + bits = bits_ng_128; + } +#else + bits_ng = secp256k1_ecmult_wnaf(wnaf_ng, ng, WINDOW_G); + if (bits_ng > bits) { + bits = bits_ng; + } +#endif + + secp256k1_gej_set_infinity(r); + + for (i = bits-1; i >= 0; i--) { + int n; + secp256k1_gej_double_var(r, r); +#ifdef USE_ENDOMORPHISM + if (i < bits_na_1 && (n = wnaf_na_1[i])) { + ECMULT_TABLE_GET_GEJ(&tmpj, pre_a, n, WINDOW_A); + secp256k1_gej_add_var(r, r, &tmpj); + } + if (i < bits_na_lam && (n = wnaf_na_lam[i])) { + ECMULT_TABLE_GET_GEJ(&tmpj, pre_a_lam, n, WINDOW_A); + secp256k1_gej_add_var(r, r, &tmpj); + } + if (i < bits_ng_1 && (n = wnaf_ng_1[i])) { + ECMULT_TABLE_GET_GE_STORAGE(&tmpa, *ctx->pre_g, n, WINDOW_G); + secp256k1_gej_add_ge_var(r, r, &tmpa); + } + if (i < bits_ng_128 && (n = wnaf_ng_128[i])) { + ECMULT_TABLE_GET_GE_STORAGE(&tmpa, *ctx->pre_g_128, n, WINDOW_G); + secp256k1_gej_add_ge_var(r, r, &tmpa); + } +#else + if (i < bits_na && (n = wnaf_na[i])) { + ECMULT_TABLE_GET_GEJ(&tmpj, pre_a, n, WINDOW_A); + secp256k1_gej_add_var(r, r, &tmpj); + } + if (i < bits_ng && (n = wnaf_ng[i])) { + ECMULT_TABLE_GET_GE_STORAGE(&tmpa, *ctx->pre_g, n, WINDOW_G); + secp256k1_gej_add_ge_var(r, r, &tmpa); + } +#endif + } +} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/field.h b/src/cryptoconditions/src/include/secp256k1/src/field.h new file mode 100644 index 00000000000..41b280892d9 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/field.h @@ -0,0 +1,119 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_FIELD_ +#define _SECP256K1_FIELD_ + +/** Field element module. + * + * Field elements can be represented in several ways, but code accessing + * it (and implementations) need to take certain properaties into account: + * - Each field element can be normalized or not. + * - Each field element has a magnitude, which represents how far away + * its representation is away from normalization. Normalized elements + * always have a magnitude of 1, but a magnitude of 1 doesn't imply + * normality. + */ + +#if defined HAVE_CONFIG_H +#include "libsecp256k1-config.h" +#endif + +#if defined(USE_FIELD_10X26) +#include "field_10x26.h" +#elif defined(USE_FIELD_5X52) +#include "field_5x52.h" +#else +#error "Please select field implementation" +#endif + +/** Normalize a field element. */ +static void secp256k1_fe_normalize(secp256k1_fe_t *r); + +/** Weakly normalize a field element: reduce it magnitude to 1, but don't fully normalize. */ +static void secp256k1_fe_normalize_weak(secp256k1_fe_t *r); + +/** Normalize a field element, without constant-time guarantee. */ +static void secp256k1_fe_normalize_var(secp256k1_fe_t *r); + +/** Verify whether a field element represents zero i.e. would normalize to a zero value. The field + * implementation may optionally normalize the input, but this should not be relied upon. */ +static int secp256k1_fe_normalizes_to_zero(secp256k1_fe_t *r); + +/** Verify whether a field element represents zero i.e. would normalize to a zero value. The field + * implementation may optionally normalize the input, but this should not be relied upon. */ +static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe_t *r); + +/** Set a field element equal to a small integer. Resulting field element is normalized. */ +static void secp256k1_fe_set_int(secp256k1_fe_t *r, int a); + +/** Verify whether a field element is zero. Requires the input to be normalized. */ +static int secp256k1_fe_is_zero(const secp256k1_fe_t *a); + +/** Check the "oddness" of a field element. Requires the input to be normalized. */ +static int secp256k1_fe_is_odd(const secp256k1_fe_t *a); + +/** Compare two field elements. Requires magnitude-1 inputs. */ +static int secp256k1_fe_equal_var(const secp256k1_fe_t *a, const secp256k1_fe_t *b); + +/** Compare two field elements. Requires both inputs to be normalized */ +static int secp256k1_fe_cmp_var(const secp256k1_fe_t *a, const secp256k1_fe_t *b); + +/** Set a field element equal to 32-byte big endian value. If succesful, the resulting field element is normalized. */ +static int secp256k1_fe_set_b32(secp256k1_fe_t *r, const unsigned char *a); + +/** Convert a field element to a 32-byte big endian value. Requires the input to be normalized */ +static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe_t *a); + +/** Set a field element equal to the additive inverse of another. Takes a maximum magnitude of the input + * as an argument. The magnitude of the output is one higher. */ +static void secp256k1_fe_negate(secp256k1_fe_t *r, const secp256k1_fe_t *a, int m); + +/** Multiplies the passed field element with a small integer constant. Multiplies the magnitude by that + * small integer. */ +static void secp256k1_fe_mul_int(secp256k1_fe_t *r, int a); + +/** Adds a field element to another. The result has the sum of the inputs' magnitudes as magnitude. */ +static void secp256k1_fe_add(secp256k1_fe_t *r, const secp256k1_fe_t *a); + +/** Sets a field element to be the product of two others. Requires the inputs' magnitudes to be at most 8. + * The output magnitude is 1 (but not guaranteed to be normalized). */ +static void secp256k1_fe_mul(secp256k1_fe_t *r, const secp256k1_fe_t *a, const secp256k1_fe_t * SECP256K1_RESTRICT b); + +/** Sets a field element to be the square of another. Requires the input's magnitude to be at most 8. + * The output magnitude is 1 (but not guaranteed to be normalized). */ +static void secp256k1_fe_sqr(secp256k1_fe_t *r, const secp256k1_fe_t *a); + +/** Sets a field element to be the (modular) square root (if any exist) of another. Requires the + * input's magnitude to be at most 8. The output magnitude is 1 (but not guaranteed to be + * normalized). Return value indicates whether a square root was found. */ +static int secp256k1_fe_sqrt_var(secp256k1_fe_t *r, const secp256k1_fe_t *a); + +/** Sets a field element to be the (modular) inverse of another. Requires the input's magnitude to be + * at most 8. The output magnitude is 1 (but not guaranteed to be normalized). */ +static void secp256k1_fe_inv(secp256k1_fe_t *r, const secp256k1_fe_t *a); + +/** Potentially faster version of secp256k1_fe_inv, without constant-time guarantee. */ +static void secp256k1_fe_inv_var(secp256k1_fe_t *r, const secp256k1_fe_t *a); + +/** Calculate the (modular) inverses of a batch of field elements. Requires the inputs' magnitudes to be + * at most 8. The output magnitudes are 1 (but not guaranteed to be normalized). The inputs and + * outputs must not overlap in memory. */ +static void secp256k1_fe_inv_all_var(size_t len, secp256k1_fe_t *r, const secp256k1_fe_t *a); + +/** Convert a field element to the storage type. */ +static void secp256k1_fe_to_storage(secp256k1_fe_storage_t *r, const secp256k1_fe_t*); + +/** Convert a field element back from the storage type. */ +static void secp256k1_fe_from_storage(secp256k1_fe_t *r, const secp256k1_fe_storage_t*); + +/** If flag is true, set *r equal to *a; otherwise leave it. Constant-time. */ +static void secp256k1_fe_storage_cmov(secp256k1_fe_storage_t *r, const secp256k1_fe_storage_t *a, int flag); + +/** If flag is true, set *r equal to *a; otherwise leave it. Constant-time. */ +static void secp256k1_fe_cmov(secp256k1_fe_t *r, const secp256k1_fe_t *a, int flag); + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/field_10x26.h b/src/cryptoconditions/src/include/secp256k1/src/field_10x26.h new file mode 100644 index 00000000000..44bce6525df --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/field_10x26.h @@ -0,0 +1,47 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_FIELD_REPR_ +#define _SECP256K1_FIELD_REPR_ + +#include + +typedef struct { + /* X = sum(i=0..9, elem[i]*2^26) mod n */ + uint32_t n[10]; +#ifdef VERIFY + int magnitude; + int normalized; +#endif +} secp256k1_fe_t; + +/* Unpacks a constant into a overlapping multi-limbed FE element. */ +#define SECP256K1_FE_CONST_INNER(d7, d6, d5, d4, d3, d2, d1, d0) { \ + (d0) & 0x3FFFFFFUL, \ + ((d0) >> 26) | ((d1) & 0xFFFFFUL) << 6, \ + ((d1) >> 20) | ((d2) & 0x3FFFUL) << 12, \ + ((d2) >> 14) | ((d3) & 0xFFUL) << 18, \ + ((d3) >> 8) | ((d4) & 0x3) << 24, \ + ((d4) >> 2) & 0x3FFFFFFUL, \ + ((d4) >> 28) | ((d5) & 0x3FFFFFUL) << 4, \ + ((d5) >> 22) | ((d6) & 0xFFFF) << 10, \ + ((d6) >> 16) | ((d7) & 0x3FF) << 16, \ + ((d7) >> 10) \ +} + +#ifdef VERIFY +#define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {SECP256K1_FE_CONST_INNER((d7), (d6), (d5), (d4), (d3), (d2), (d1), (d0)), 1, 1} +#else +#define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {SECP256K1_FE_CONST_INNER((d7), (d6), (d5), (d4), (d3), (d2), (d1), (d0))} +#endif + +typedef struct { + uint32_t n[8]; +} secp256k1_fe_storage_t; + +#define SECP256K1_FE_STORAGE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{ (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) }} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/field_10x26_impl.h b/src/cryptoconditions/src/include/secp256k1/src/field_10x26_impl.h new file mode 100644 index 00000000000..871b91f9123 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/field_10x26_impl.h @@ -0,0 +1,1136 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_FIELD_REPR_IMPL_H_ +#define _SECP256K1_FIELD_REPR_IMPL_H_ + +#include +#include +#include "util.h" +#include "num.h" +#include "field.h" + +#ifdef VERIFY +static void secp256k1_fe_verify(const secp256k1_fe_t *a) { + const uint32_t *d = a->n; + int m = a->normalized ? 1 : 2 * a->magnitude, r = 1; + r &= (d[0] <= 0x3FFFFFFUL * m); + r &= (d[1] <= 0x3FFFFFFUL * m); + r &= (d[2] <= 0x3FFFFFFUL * m); + r &= (d[3] <= 0x3FFFFFFUL * m); + r &= (d[4] <= 0x3FFFFFFUL * m); + r &= (d[5] <= 0x3FFFFFFUL * m); + r &= (d[6] <= 0x3FFFFFFUL * m); + r &= (d[7] <= 0x3FFFFFFUL * m); + r &= (d[8] <= 0x3FFFFFFUL * m); + r &= (d[9] <= 0x03FFFFFUL * m); + r &= (a->magnitude >= 0); + r &= (a->magnitude <= 32); + if (a->normalized) { + r &= (a->magnitude <= 1); + if (r && (d[9] == 0x03FFFFFUL)) { + uint32_t mid = d[8] & d[7] & d[6] & d[5] & d[4] & d[3] & d[2]; + if (mid == 0x3FFFFFFUL) { + r &= ((d[1] + 0x40UL + ((d[0] + 0x3D1UL) >> 26)) <= 0x3FFFFFFUL); + } + } + } + VERIFY_CHECK(r == 1); +} +#else +static void secp256k1_fe_verify(const secp256k1_fe_t *a) { + (void)a; +} +#endif + +static void secp256k1_fe_normalize(secp256k1_fe_t *r) { + uint32_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4], + t5 = r->n[5], t6 = r->n[6], t7 = r->n[7], t8 = r->n[8], t9 = r->n[9]; + + /* Reduce t9 at the start so there will be at most a single carry from the first pass */ + uint32_t m; + uint32_t x = t9 >> 22; t9 &= 0x03FFFFFUL; + + /* The first pass ensures the magnitude is 1, ... */ + t0 += x * 0x3D1UL; t1 += (x << 6); + t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL; + t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; + t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; m = t2; + t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; m &= t3; + t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; m &= t4; + t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; m &= t5; + t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; m &= t6; + t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; m &= t7; + t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; m &= t8; + + /* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */ + VERIFY_CHECK(t9 >> 23 == 0); + + /* At most a single final reduction is needed; check if the value is >= the field characteristic */ + x = (t9 >> 22) | ((t9 == 0x03FFFFFUL) & (m == 0x3FFFFFFUL) + & ((t1 + 0x40UL + ((t0 + 0x3D1UL) >> 26)) > 0x3FFFFFFUL)); + + /* Apply the final reduction (for constant-time behaviour, we do it always) */ + t0 += x * 0x3D1UL; t1 += (x << 6); + t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL; + t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; + t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; + t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; + t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; + t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; + t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; + t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; + t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; + + /* If t9 didn't carry to bit 22 already, then it should have after any final reduction */ + VERIFY_CHECK(t9 >> 22 == x); + + /* Mask off the possible multiple of 2^256 from the final reduction */ + t9 &= 0x03FFFFFUL; + + r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4; + r->n[5] = t5; r->n[6] = t6; r->n[7] = t7; r->n[8] = t8; r->n[9] = t9; + +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; + secp256k1_fe_verify(r); +#endif +} + +static void secp256k1_fe_normalize_weak(secp256k1_fe_t *r) { + uint32_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4], + t5 = r->n[5], t6 = r->n[6], t7 = r->n[7], t8 = r->n[8], t9 = r->n[9]; + + /* Reduce t9 at the start so there will be at most a single carry from the first pass */ + uint32_t x = t9 >> 22; t9 &= 0x03FFFFFUL; + + /* The first pass ensures the magnitude is 1, ... */ + t0 += x * 0x3D1UL; t1 += (x << 6); + t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL; + t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; + t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; + t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; + t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; + t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; + t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; + t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; + t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; + + /* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */ + VERIFY_CHECK(t9 >> 23 == 0); + + r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4; + r->n[5] = t5; r->n[6] = t6; r->n[7] = t7; r->n[8] = t8; r->n[9] = t9; + +#ifdef VERIFY + r->magnitude = 1; + secp256k1_fe_verify(r); +#endif +} + +static void secp256k1_fe_normalize_var(secp256k1_fe_t *r) { + uint32_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4], + t5 = r->n[5], t6 = r->n[6], t7 = r->n[7], t8 = r->n[8], t9 = r->n[9]; + + /* Reduce t9 at the start so there will be at most a single carry from the first pass */ + uint32_t m; + uint32_t x = t9 >> 22; t9 &= 0x03FFFFFUL; + + /* The first pass ensures the magnitude is 1, ... */ + t0 += x * 0x3D1UL; t1 += (x << 6); + t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL; + t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; + t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; m = t2; + t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; m &= t3; + t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; m &= t4; + t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; m &= t5; + t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; m &= t6; + t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; m &= t7; + t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; m &= t8; + + /* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */ + VERIFY_CHECK(t9 >> 23 == 0); + + /* At most a single final reduction is needed; check if the value is >= the field characteristic */ + x = (t9 >> 22) | ((t9 == 0x03FFFFFUL) & (m == 0x3FFFFFFUL) + & ((t1 + 0x40UL + ((t0 + 0x3D1UL) >> 26)) > 0x3FFFFFFUL)); + + if (x) { + t0 += 0x3D1UL; t1 += (x << 6); + t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL; + t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; + t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; + t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; + t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; + t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; + t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; + t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; + t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; + + /* If t9 didn't carry to bit 22 already, then it should have after any final reduction */ + VERIFY_CHECK(t9 >> 22 == x); + + /* Mask off the possible multiple of 2^256 from the final reduction */ + t9 &= 0x03FFFFFUL; + } + + r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4; + r->n[5] = t5; r->n[6] = t6; r->n[7] = t7; r->n[8] = t8; r->n[9] = t9; + +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; + secp256k1_fe_verify(r); +#endif +} + +static int secp256k1_fe_normalizes_to_zero(secp256k1_fe_t *r) { + uint32_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4], + t5 = r->n[5], t6 = r->n[6], t7 = r->n[7], t8 = r->n[8], t9 = r->n[9]; + + /* z0 tracks a possible raw value of 0, z1 tracks a possible raw value of P */ + uint32_t z0, z1; + + /* Reduce t9 at the start so there will be at most a single carry from the first pass */ + uint32_t x = t9 >> 22; t9 &= 0x03FFFFFUL; + + /* The first pass ensures the magnitude is 1, ... */ + t0 += x * 0x3D1UL; t1 += (x << 6); + t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL; z0 = t0; z1 = t0 ^ 0x3D0UL; + t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; z0 |= t1; z1 &= t1 ^ 0x40UL; + t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; z0 |= t2; z1 &= t2; + t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; z0 |= t3; z1 &= t3; + t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; z0 |= t4; z1 &= t4; + t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; z0 |= t5; z1 &= t5; + t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; z0 |= t6; z1 &= t6; + t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; z0 |= t7; z1 &= t7; + t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; z0 |= t8; z1 &= t8; + z0 |= t9; z1 &= t9 ^ 0x3C00000UL; + + /* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */ + VERIFY_CHECK(t9 >> 23 == 0); + + return (z0 == 0) | (z1 == 0x3FFFFFFUL); +} + +static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe_t *r) { + uint32_t t0, t1, t2, t3, t4, t5, t6, t7, t8, t9; + uint32_t z0, z1; + uint32_t x; + + t0 = r->n[0]; + t9 = r->n[9]; + + /* Reduce t9 at the start so there will be at most a single carry from the first pass */ + x = t9 >> 22; + + /* The first pass ensures the magnitude is 1, ... */ + t0 += x * 0x3D1UL; + + /* z0 tracks a possible raw value of 0, z1 tracks a possible raw value of P */ + z0 = t0 & 0x3FFFFFFUL; + z1 = z0 ^ 0x3D0UL; + + /* Fast return path should catch the majority of cases */ + if ((z0 != 0UL) & (z1 != 0x3FFFFFFUL)) { + return 0; + } + + t1 = r->n[1]; + t2 = r->n[2]; + t3 = r->n[3]; + t4 = r->n[4]; + t5 = r->n[5]; + t6 = r->n[6]; + t7 = r->n[7]; + t8 = r->n[8]; + + t9 &= 0x03FFFFFUL; + t1 += (x << 6); + + t1 += (t0 >> 26); t0 = z0; + t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL; z0 |= t1; z1 &= t1 ^ 0x40UL; + t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; z0 |= t2; z1 &= t2; + t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; z0 |= t3; z1 &= t3; + t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; z0 |= t4; z1 &= t4; + t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; z0 |= t5; z1 &= t5; + t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; z0 |= t6; z1 &= t6; + t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; z0 |= t7; z1 &= t7; + t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; z0 |= t8; z1 &= t8; + z0 |= t9; z1 &= t9 ^ 0x3C00000UL; + + /* ... except for a possible carry at bit 22 of t9 (i.e. bit 256 of the field element) */ + VERIFY_CHECK(t9 >> 23 == 0); + + return (z0 == 0) | (z1 == 0x3FFFFFFUL); +} + +SECP256K1_INLINE static void secp256k1_fe_set_int(secp256k1_fe_t *r, int a) { + r->n[0] = a; + r->n[1] = r->n[2] = r->n[3] = r->n[4] = r->n[5] = r->n[6] = r->n[7] = r->n[8] = r->n[9] = 0; +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; + secp256k1_fe_verify(r); +#endif +} + +SECP256K1_INLINE static int secp256k1_fe_is_zero(const secp256k1_fe_t *a) { + const uint32_t *t = a->n; +#ifdef VERIFY + VERIFY_CHECK(a->normalized); + secp256k1_fe_verify(a); +#endif + return (t[0] | t[1] | t[2] | t[3] | t[4] | t[5] | t[6] | t[7] | t[8] | t[9]) == 0; +} + +SECP256K1_INLINE static int secp256k1_fe_is_odd(const secp256k1_fe_t *a) { +#ifdef VERIFY + VERIFY_CHECK(a->normalized); + secp256k1_fe_verify(a); +#endif + return a->n[0] & 1; +} + +SECP256K1_INLINE static void secp256k1_fe_clear(secp256k1_fe_t *a) { + int i; +#ifdef VERIFY + a->magnitude = 0; + a->normalized = 1; +#endif + for (i=0; i<10; i++) { + a->n[i] = 0; + } +} + +static int secp256k1_fe_cmp_var(const secp256k1_fe_t *a, const secp256k1_fe_t *b) { + int i; +#ifdef VERIFY + VERIFY_CHECK(a->normalized); + VERIFY_CHECK(b->normalized); + secp256k1_fe_verify(a); + secp256k1_fe_verify(b); +#endif + for (i = 9; i >= 0; i--) { + if (a->n[i] > b->n[i]) { + return 1; + } + if (a->n[i] < b->n[i]) { + return -1; + } + } + return 0; +} + +static int secp256k1_fe_set_b32(secp256k1_fe_t *r, const unsigned char *a) { + int i; + r->n[0] = r->n[1] = r->n[2] = r->n[3] = r->n[4] = 0; + r->n[5] = r->n[6] = r->n[7] = r->n[8] = r->n[9] = 0; + for (i=0; i<32; i++) { + int j; + for (j=0; j<4; j++) { + int limb = (8*i+2*j)/26; + int shift = (8*i+2*j)%26; + r->n[limb] |= (uint32_t)((a[31-i] >> (2*j)) & 0x3) << shift; + } + } + if (r->n[9] == 0x3FFFFFUL && (r->n[8] & r->n[7] & r->n[6] & r->n[5] & r->n[4] & r->n[3] & r->n[2]) == 0x3FFFFFFUL && (r->n[1] + 0x40UL + ((r->n[0] + 0x3D1UL) >> 26)) > 0x3FFFFFFUL) { + return 0; + } +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; + secp256k1_fe_verify(r); +#endif + return 1; +} + +/** Convert a field element to a 32-byte big endian value. Requires the input to be normalized */ +static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe_t *a) { + int i; +#ifdef VERIFY + VERIFY_CHECK(a->normalized); + secp256k1_fe_verify(a); +#endif + for (i=0; i<32; i++) { + int j; + int c = 0; + for (j=0; j<4; j++) { + int limb = (8*i+2*j)/26; + int shift = (8*i+2*j)%26; + c |= ((a->n[limb] >> shift) & 0x3) << (2 * j); + } + r[31-i] = c; + } +} + +SECP256K1_INLINE static void secp256k1_fe_negate(secp256k1_fe_t *r, const secp256k1_fe_t *a, int m) { +#ifdef VERIFY + VERIFY_CHECK(a->magnitude <= m); + secp256k1_fe_verify(a); +#endif + r->n[0] = 0x3FFFC2FUL * 2 * (m + 1) - a->n[0]; + r->n[1] = 0x3FFFFBFUL * 2 * (m + 1) - a->n[1]; + r->n[2] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[2]; + r->n[3] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[3]; + r->n[4] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[4]; + r->n[5] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[5]; + r->n[6] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[6]; + r->n[7] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[7]; + r->n[8] = 0x3FFFFFFUL * 2 * (m + 1) - a->n[8]; + r->n[9] = 0x03FFFFFUL * 2 * (m + 1) - a->n[9]; +#ifdef VERIFY + r->magnitude = m + 1; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +SECP256K1_INLINE static void secp256k1_fe_mul_int(secp256k1_fe_t *r, int a) { + r->n[0] *= a; + r->n[1] *= a; + r->n[2] *= a; + r->n[3] *= a; + r->n[4] *= a; + r->n[5] *= a; + r->n[6] *= a; + r->n[7] *= a; + r->n[8] *= a; + r->n[9] *= a; +#ifdef VERIFY + r->magnitude *= a; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +SECP256K1_INLINE static void secp256k1_fe_add(secp256k1_fe_t *r, const secp256k1_fe_t *a) { +#ifdef VERIFY + secp256k1_fe_verify(a); +#endif + r->n[0] += a->n[0]; + r->n[1] += a->n[1]; + r->n[2] += a->n[2]; + r->n[3] += a->n[3]; + r->n[4] += a->n[4]; + r->n[5] += a->n[5]; + r->n[6] += a->n[6]; + r->n[7] += a->n[7]; + r->n[8] += a->n[8]; + r->n[9] += a->n[9]; +#ifdef VERIFY + r->magnitude += a->magnitude; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +#ifdef VERIFY +#define VERIFY_BITS(x, n) VERIFY_CHECK(((x) >> (n)) == 0) +#else +#define VERIFY_BITS(x, n) do { } while(0) +#endif + +SECP256K1_INLINE static void secp256k1_fe_mul_inner(uint32_t *r, const uint32_t *a, const uint32_t * SECP256K1_RESTRICT b) { + uint64_t c, d; + uint64_t u0, u1, u2, u3, u4, u5, u6, u7, u8; + uint32_t t9, t1, t0, t2, t3, t4, t5, t6, t7; + const uint32_t M = 0x3FFFFFFUL, R0 = 0x3D10UL, R1 = 0x400UL; + + VERIFY_BITS(a[0], 30); + VERIFY_BITS(a[1], 30); + VERIFY_BITS(a[2], 30); + VERIFY_BITS(a[3], 30); + VERIFY_BITS(a[4], 30); + VERIFY_BITS(a[5], 30); + VERIFY_BITS(a[6], 30); + VERIFY_BITS(a[7], 30); + VERIFY_BITS(a[8], 30); + VERIFY_BITS(a[9], 26); + VERIFY_BITS(b[0], 30); + VERIFY_BITS(b[1], 30); + VERIFY_BITS(b[2], 30); + VERIFY_BITS(b[3], 30); + VERIFY_BITS(b[4], 30); + VERIFY_BITS(b[5], 30); + VERIFY_BITS(b[6], 30); + VERIFY_BITS(b[7], 30); + VERIFY_BITS(b[8], 30); + VERIFY_BITS(b[9], 26); + + /** [... a b c] is a shorthand for ... + a<<52 + b<<26 + c<<0 mod n. + * px is a shorthand for sum(a[i]*b[x-i], i=0..x). + * Note that [x 0 0 0 0 0 0 0 0 0 0] = [x*R1 x*R0]. + */ + + d = (uint64_t)a[0] * b[9] + + (uint64_t)a[1] * b[8] + + (uint64_t)a[2] * b[7] + + (uint64_t)a[3] * b[6] + + (uint64_t)a[4] * b[5] + + (uint64_t)a[5] * b[4] + + (uint64_t)a[6] * b[3] + + (uint64_t)a[7] * b[2] + + (uint64_t)a[8] * b[1] + + (uint64_t)a[9] * b[0]; + /* VERIFY_BITS(d, 64); */ + /* [d 0 0 0 0 0 0 0 0 0] = [p9 0 0 0 0 0 0 0 0 0] */ + t9 = d & M; d >>= 26; + VERIFY_BITS(t9, 26); + VERIFY_BITS(d, 38); + /* [d t9 0 0 0 0 0 0 0 0 0] = [p9 0 0 0 0 0 0 0 0 0] */ + + c = (uint64_t)a[0] * b[0]; + VERIFY_BITS(c, 60); + /* [d t9 0 0 0 0 0 0 0 0 c] = [p9 0 0 0 0 0 0 0 0 p0] */ + d += (uint64_t)a[1] * b[9] + + (uint64_t)a[2] * b[8] + + (uint64_t)a[3] * b[7] + + (uint64_t)a[4] * b[6] + + (uint64_t)a[5] * b[5] + + (uint64_t)a[6] * b[4] + + (uint64_t)a[7] * b[3] + + (uint64_t)a[8] * b[2] + + (uint64_t)a[9] * b[1]; + VERIFY_BITS(d, 63); + /* [d t9 0 0 0 0 0 0 0 0 c] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ + u0 = d & M; d >>= 26; c += u0 * R0; + VERIFY_BITS(u0, 26); + VERIFY_BITS(d, 37); + VERIFY_BITS(c, 61); + /* [d u0 t9 0 0 0 0 0 0 0 0 c-u0*R0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ + t0 = c & M; c >>= 26; c += u0 * R1; + VERIFY_BITS(t0, 26); + VERIFY_BITS(c, 37); + /* [d u0 t9 0 0 0 0 0 0 0 c-u0*R1 t0-u0*R0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ + /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ + + c += (uint64_t)a[0] * b[1] + + (uint64_t)a[1] * b[0]; + VERIFY_BITS(c, 62); + /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p10 p9 0 0 0 0 0 0 0 p1 p0] */ + d += (uint64_t)a[2] * b[9] + + (uint64_t)a[3] * b[8] + + (uint64_t)a[4] * b[7] + + (uint64_t)a[5] * b[6] + + (uint64_t)a[6] * b[5] + + (uint64_t)a[7] * b[4] + + (uint64_t)a[8] * b[3] + + (uint64_t)a[9] * b[2]; + VERIFY_BITS(d, 63); + /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ + u1 = d & M; d >>= 26; c += u1 * R0; + VERIFY_BITS(u1, 26); + VERIFY_BITS(d, 37); + VERIFY_BITS(c, 63); + /* [d u1 0 t9 0 0 0 0 0 0 0 c-u1*R0 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ + t1 = c & M; c >>= 26; c += u1 * R1; + VERIFY_BITS(t1, 26); + VERIFY_BITS(c, 38); + /* [d u1 0 t9 0 0 0 0 0 0 c-u1*R1 t1-u1*R0 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ + /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ + + c += (uint64_t)a[0] * b[2] + + (uint64_t)a[1] * b[1] + + (uint64_t)a[2] * b[0]; + VERIFY_BITS(c, 62); + /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + d += (uint64_t)a[3] * b[9] + + (uint64_t)a[4] * b[8] + + (uint64_t)a[5] * b[7] + + (uint64_t)a[6] * b[6] + + (uint64_t)a[7] * b[5] + + (uint64_t)a[8] * b[4] + + (uint64_t)a[9] * b[3]; + VERIFY_BITS(d, 63); + /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + u2 = d & M; d >>= 26; c += u2 * R0; + VERIFY_BITS(u2, 26); + VERIFY_BITS(d, 37); + VERIFY_BITS(c, 63); + /* [d u2 0 0 t9 0 0 0 0 0 0 c-u2*R0 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + t2 = c & M; c >>= 26; c += u2 * R1; + VERIFY_BITS(t2, 26); + VERIFY_BITS(c, 38); + /* [d u2 0 0 t9 0 0 0 0 0 c-u2*R1 t2-u2*R0 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + + c += (uint64_t)a[0] * b[3] + + (uint64_t)a[1] * b[2] + + (uint64_t)a[2] * b[1] + + (uint64_t)a[3] * b[0]; + VERIFY_BITS(c, 63); + /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + d += (uint64_t)a[4] * b[9] + + (uint64_t)a[5] * b[8] + + (uint64_t)a[6] * b[7] + + (uint64_t)a[7] * b[6] + + (uint64_t)a[8] * b[5] + + (uint64_t)a[9] * b[4]; + VERIFY_BITS(d, 63); + /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + u3 = d & M; d >>= 26; c += u3 * R0; + VERIFY_BITS(u3, 26); + VERIFY_BITS(d, 37); + /* VERIFY_BITS(c, 64); */ + /* [d u3 0 0 0 t9 0 0 0 0 0 c-u3*R0 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + t3 = c & M; c >>= 26; c += u3 * R1; + VERIFY_BITS(t3, 26); + VERIFY_BITS(c, 39); + /* [d u3 0 0 0 t9 0 0 0 0 c-u3*R1 t3-u3*R0 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + + c += (uint64_t)a[0] * b[4] + + (uint64_t)a[1] * b[3] + + (uint64_t)a[2] * b[2] + + (uint64_t)a[3] * b[1] + + (uint64_t)a[4] * b[0]; + VERIFY_BITS(c, 63); + /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + d += (uint64_t)a[5] * b[9] + + (uint64_t)a[6] * b[8] + + (uint64_t)a[7] * b[7] + + (uint64_t)a[8] * b[6] + + (uint64_t)a[9] * b[5]; + VERIFY_BITS(d, 62); + /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + u4 = d & M; d >>= 26; c += u4 * R0; + VERIFY_BITS(u4, 26); + VERIFY_BITS(d, 36); + /* VERIFY_BITS(c, 64); */ + /* [d u4 0 0 0 0 t9 0 0 0 0 c-u4*R0 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + t4 = c & M; c >>= 26; c += u4 * R1; + VERIFY_BITS(t4, 26); + VERIFY_BITS(c, 39); + /* [d u4 0 0 0 0 t9 0 0 0 c-u4*R1 t4-u4*R0 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + + c += (uint64_t)a[0] * b[5] + + (uint64_t)a[1] * b[4] + + (uint64_t)a[2] * b[3] + + (uint64_t)a[3] * b[2] + + (uint64_t)a[4] * b[1] + + (uint64_t)a[5] * b[0]; + VERIFY_BITS(c, 63); + /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + d += (uint64_t)a[6] * b[9] + + (uint64_t)a[7] * b[8] + + (uint64_t)a[8] * b[7] + + (uint64_t)a[9] * b[6]; + VERIFY_BITS(d, 62); + /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + u5 = d & M; d >>= 26; c += u5 * R0; + VERIFY_BITS(u5, 26); + VERIFY_BITS(d, 36); + /* VERIFY_BITS(c, 64); */ + /* [d u5 0 0 0 0 0 t9 0 0 0 c-u5*R0 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + t5 = c & M; c >>= 26; c += u5 * R1; + VERIFY_BITS(t5, 26); + VERIFY_BITS(c, 39); + /* [d u5 0 0 0 0 0 t9 0 0 c-u5*R1 t5-u5*R0 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + + c += (uint64_t)a[0] * b[6] + + (uint64_t)a[1] * b[5] + + (uint64_t)a[2] * b[4] + + (uint64_t)a[3] * b[3] + + (uint64_t)a[4] * b[2] + + (uint64_t)a[5] * b[1] + + (uint64_t)a[6] * b[0]; + VERIFY_BITS(c, 63); + /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + d += (uint64_t)a[7] * b[9] + + (uint64_t)a[8] * b[8] + + (uint64_t)a[9] * b[7]; + VERIFY_BITS(d, 61); + /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + u6 = d & M; d >>= 26; c += u6 * R0; + VERIFY_BITS(u6, 26); + VERIFY_BITS(d, 35); + /* VERIFY_BITS(c, 64); */ + /* [d u6 0 0 0 0 0 0 t9 0 0 c-u6*R0 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + t6 = c & M; c >>= 26; c += u6 * R1; + VERIFY_BITS(t6, 26); + VERIFY_BITS(c, 39); + /* [d u6 0 0 0 0 0 0 t9 0 c-u6*R1 t6-u6*R0 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + + c += (uint64_t)a[0] * b[7] + + (uint64_t)a[1] * b[6] + + (uint64_t)a[2] * b[5] + + (uint64_t)a[3] * b[4] + + (uint64_t)a[4] * b[3] + + (uint64_t)a[5] * b[2] + + (uint64_t)a[6] * b[1] + + (uint64_t)a[7] * b[0]; + /* VERIFY_BITS(c, 64); */ + VERIFY_CHECK(c <= 0x8000007C00000007ULL); + /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + d += (uint64_t)a[8] * b[9] + + (uint64_t)a[9] * b[8]; + VERIFY_BITS(d, 58); + /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + u7 = d & M; d >>= 26; c += u7 * R0; + VERIFY_BITS(u7, 26); + VERIFY_BITS(d, 32); + /* VERIFY_BITS(c, 64); */ + VERIFY_CHECK(c <= 0x800001703FFFC2F7ULL); + /* [d u7 0 0 0 0 0 0 0 t9 0 c-u7*R0 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + t7 = c & M; c >>= 26; c += u7 * R1; + VERIFY_BITS(t7, 26); + VERIFY_BITS(c, 38); + /* [d u7 0 0 0 0 0 0 0 t9 c-u7*R1 t7-u7*R0 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + + c += (uint64_t)a[0] * b[8] + + (uint64_t)a[1] * b[7] + + (uint64_t)a[2] * b[6] + + (uint64_t)a[3] * b[5] + + (uint64_t)a[4] * b[4] + + (uint64_t)a[5] * b[3] + + (uint64_t)a[6] * b[2] + + (uint64_t)a[7] * b[1] + + (uint64_t)a[8] * b[0]; + /* VERIFY_BITS(c, 64); */ + VERIFY_CHECK(c <= 0x9000007B80000008ULL); + /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + d += (uint64_t)a[9] * b[9]; + VERIFY_BITS(d, 57); + /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + u8 = d & M; d >>= 26; c += u8 * R0; + VERIFY_BITS(u8, 26); + VERIFY_BITS(d, 31); + /* VERIFY_BITS(c, 64); */ + VERIFY_CHECK(c <= 0x9000016FBFFFC2F8ULL); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 t4 t3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + + r[3] = t3; + VERIFY_BITS(r[3], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 t4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[4] = t4; + VERIFY_BITS(r[4], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[5] = t5; + VERIFY_BITS(r[5], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[6] = t6; + VERIFY_BITS(r[6], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[7] = t7; + VERIFY_BITS(r[7], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + + r[8] = c & M; c >>= 26; c += u8 * R1; + VERIFY_BITS(r[8], 26); + VERIFY_BITS(c, 39); + /* [d u8 0 0 0 0 0 0 0 0 t9+c-u8*R1 r8-u8*R0 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 0 0 0 t9+c r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + c += d * R0 + t9; + VERIFY_BITS(c, 45); + /* [d 0 0 0 0 0 0 0 0 0 c-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[9] = c & (M >> 4); c >>= 22; c += d * (R1 << 4); + VERIFY_BITS(r[9], 22); + VERIFY_BITS(c, 46); + /* [d 0 0 0 0 0 0 0 0 r9+((c-d*R1<<4)<<22)-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 0 -d*R1 r9+(c<<22)-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + + d = c * (R0 >> 4) + t0; + VERIFY_BITS(d, 56); + /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1 d-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[0] = d & M; d >>= 26; + VERIFY_BITS(r[0], 26); + VERIFY_BITS(d, 30); + /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1+d r0-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + d += c * (R1 >> 4) + t1; + VERIFY_BITS(d, 53); + VERIFY_CHECK(d <= 0x10000003FFFFBFULL); + /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 d-c*R1>>4 r0-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [r9 r8 r7 r6 r5 r4 r3 t2 d r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[1] = d & M; d >>= 26; + VERIFY_BITS(r[1], 26); + VERIFY_BITS(d, 27); + VERIFY_CHECK(d <= 0x4000000ULL); + /* [r9 r8 r7 r6 r5 r4 r3 t2+d r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + d += t2; + VERIFY_BITS(d, 27); + /* [r9 r8 r7 r6 r5 r4 r3 d r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[2] = d; + VERIFY_BITS(r[2], 27); + /* [r9 r8 r7 r6 r5 r4 r3 r2 r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ +} + +SECP256K1_INLINE static void secp256k1_fe_sqr_inner(uint32_t *r, const uint32_t *a) { + uint64_t c, d; + uint64_t u0, u1, u2, u3, u4, u5, u6, u7, u8; + uint32_t t9, t0, t1, t2, t3, t4, t5, t6, t7; + const uint32_t M = 0x3FFFFFFUL, R0 = 0x3D10UL, R1 = 0x400UL; + + VERIFY_BITS(a[0], 30); + VERIFY_BITS(a[1], 30); + VERIFY_BITS(a[2], 30); + VERIFY_BITS(a[3], 30); + VERIFY_BITS(a[4], 30); + VERIFY_BITS(a[5], 30); + VERIFY_BITS(a[6], 30); + VERIFY_BITS(a[7], 30); + VERIFY_BITS(a[8], 30); + VERIFY_BITS(a[9], 26); + + /** [... a b c] is a shorthand for ... + a<<52 + b<<26 + c<<0 mod n. + * px is a shorthand for sum(a[i]*a[x-i], i=0..x). + * Note that [x 0 0 0 0 0 0 0 0 0 0] = [x*R1 x*R0]. + */ + + d = (uint64_t)(a[0]*2) * a[9] + + (uint64_t)(a[1]*2) * a[8] + + (uint64_t)(a[2]*2) * a[7] + + (uint64_t)(a[3]*2) * a[6] + + (uint64_t)(a[4]*2) * a[5]; + /* VERIFY_BITS(d, 64); */ + /* [d 0 0 0 0 0 0 0 0 0] = [p9 0 0 0 0 0 0 0 0 0] */ + t9 = d & M; d >>= 26; + VERIFY_BITS(t9, 26); + VERIFY_BITS(d, 38); + /* [d t9 0 0 0 0 0 0 0 0 0] = [p9 0 0 0 0 0 0 0 0 0] */ + + c = (uint64_t)a[0] * a[0]; + VERIFY_BITS(c, 60); + /* [d t9 0 0 0 0 0 0 0 0 c] = [p9 0 0 0 0 0 0 0 0 p0] */ + d += (uint64_t)(a[1]*2) * a[9] + + (uint64_t)(a[2]*2) * a[8] + + (uint64_t)(a[3]*2) * a[7] + + (uint64_t)(a[4]*2) * a[6] + + (uint64_t)a[5] * a[5]; + VERIFY_BITS(d, 63); + /* [d t9 0 0 0 0 0 0 0 0 c] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ + u0 = d & M; d >>= 26; c += u0 * R0; + VERIFY_BITS(u0, 26); + VERIFY_BITS(d, 37); + VERIFY_BITS(c, 61); + /* [d u0 t9 0 0 0 0 0 0 0 0 c-u0*R0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ + t0 = c & M; c >>= 26; c += u0 * R1; + VERIFY_BITS(t0, 26); + VERIFY_BITS(c, 37); + /* [d u0 t9 0 0 0 0 0 0 0 c-u0*R1 t0-u0*R0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ + /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p10 p9 0 0 0 0 0 0 0 0 p0] */ + + c += (uint64_t)(a[0]*2) * a[1]; + VERIFY_BITS(c, 62); + /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p10 p9 0 0 0 0 0 0 0 p1 p0] */ + d += (uint64_t)(a[2]*2) * a[9] + + (uint64_t)(a[3]*2) * a[8] + + (uint64_t)(a[4]*2) * a[7] + + (uint64_t)(a[5]*2) * a[6]; + VERIFY_BITS(d, 63); + /* [d 0 t9 0 0 0 0 0 0 0 c t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ + u1 = d & M; d >>= 26; c += u1 * R0; + VERIFY_BITS(u1, 26); + VERIFY_BITS(d, 37); + VERIFY_BITS(c, 63); + /* [d u1 0 t9 0 0 0 0 0 0 0 c-u1*R0 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ + t1 = c & M; c >>= 26; c += u1 * R1; + VERIFY_BITS(t1, 26); + VERIFY_BITS(c, 38); + /* [d u1 0 t9 0 0 0 0 0 0 c-u1*R1 t1-u1*R0 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ + /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p11 p10 p9 0 0 0 0 0 0 0 p1 p0] */ + + c += (uint64_t)(a[0]*2) * a[2] + + (uint64_t)a[1] * a[1]; + VERIFY_BITS(c, 62); + /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + d += (uint64_t)(a[3]*2) * a[9] + + (uint64_t)(a[4]*2) * a[8] + + (uint64_t)(a[5]*2) * a[7] + + (uint64_t)a[6] * a[6]; + VERIFY_BITS(d, 63); + /* [d 0 0 t9 0 0 0 0 0 0 c t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + u2 = d & M; d >>= 26; c += u2 * R0; + VERIFY_BITS(u2, 26); + VERIFY_BITS(d, 37); + VERIFY_BITS(c, 63); + /* [d u2 0 0 t9 0 0 0 0 0 0 c-u2*R0 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + t2 = c & M; c >>= 26; c += u2 * R1; + VERIFY_BITS(t2, 26); + VERIFY_BITS(c, 38); + /* [d u2 0 0 t9 0 0 0 0 0 c-u2*R1 t2-u2*R0 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 0 p2 p1 p0] */ + + c += (uint64_t)(a[0]*2) * a[3] + + (uint64_t)(a[1]*2) * a[2]; + VERIFY_BITS(c, 63); + /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + d += (uint64_t)(a[4]*2) * a[9] + + (uint64_t)(a[5]*2) * a[8] + + (uint64_t)(a[6]*2) * a[7]; + VERIFY_BITS(d, 63); + /* [d 0 0 0 t9 0 0 0 0 0 c t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + u3 = d & M; d >>= 26; c += u3 * R0; + VERIFY_BITS(u3, 26); + VERIFY_BITS(d, 37); + /* VERIFY_BITS(c, 64); */ + /* [d u3 0 0 0 t9 0 0 0 0 0 c-u3*R0 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + t3 = c & M; c >>= 26; c += u3 * R1; + VERIFY_BITS(t3, 26); + VERIFY_BITS(c, 39); + /* [d u3 0 0 0 t9 0 0 0 0 c-u3*R1 t3-u3*R0 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 0 p3 p2 p1 p0] */ + + c += (uint64_t)(a[0]*2) * a[4] + + (uint64_t)(a[1]*2) * a[3] + + (uint64_t)a[2] * a[2]; + VERIFY_BITS(c, 63); + /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + d += (uint64_t)(a[5]*2) * a[9] + + (uint64_t)(a[6]*2) * a[8] + + (uint64_t)a[7] * a[7]; + VERIFY_BITS(d, 62); + /* [d 0 0 0 0 t9 0 0 0 0 c t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + u4 = d & M; d >>= 26; c += u4 * R0; + VERIFY_BITS(u4, 26); + VERIFY_BITS(d, 36); + /* VERIFY_BITS(c, 64); */ + /* [d u4 0 0 0 0 t9 0 0 0 0 c-u4*R0 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + t4 = c & M; c >>= 26; c += u4 * R1; + VERIFY_BITS(t4, 26); + VERIFY_BITS(c, 39); + /* [d u4 0 0 0 0 t9 0 0 0 c-u4*R1 t4-u4*R0 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 0 p4 p3 p2 p1 p0] */ + + c += (uint64_t)(a[0]*2) * a[5] + + (uint64_t)(a[1]*2) * a[4] + + (uint64_t)(a[2]*2) * a[3]; + VERIFY_BITS(c, 63); + /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + d += (uint64_t)(a[6]*2) * a[9] + + (uint64_t)(a[7]*2) * a[8]; + VERIFY_BITS(d, 62); + /* [d 0 0 0 0 0 t9 0 0 0 c t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + u5 = d & M; d >>= 26; c += u5 * R0; + VERIFY_BITS(u5, 26); + VERIFY_BITS(d, 36); + /* VERIFY_BITS(c, 64); */ + /* [d u5 0 0 0 0 0 t9 0 0 0 c-u5*R0 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + t5 = c & M; c >>= 26; c += u5 * R1; + VERIFY_BITS(t5, 26); + VERIFY_BITS(c, 39); + /* [d u5 0 0 0 0 0 t9 0 0 c-u5*R1 t5-u5*R0 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 0 p5 p4 p3 p2 p1 p0] */ + + c += (uint64_t)(a[0]*2) * a[6] + + (uint64_t)(a[1]*2) * a[5] + + (uint64_t)(a[2]*2) * a[4] + + (uint64_t)a[3] * a[3]; + VERIFY_BITS(c, 63); + /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + d += (uint64_t)(a[7]*2) * a[9] + + (uint64_t)a[8] * a[8]; + VERIFY_BITS(d, 61); + /* [d 0 0 0 0 0 0 t9 0 0 c t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + u6 = d & M; d >>= 26; c += u6 * R0; + VERIFY_BITS(u6, 26); + VERIFY_BITS(d, 35); + /* VERIFY_BITS(c, 64); */ + /* [d u6 0 0 0 0 0 0 t9 0 0 c-u6*R0 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + t6 = c & M; c >>= 26; c += u6 * R1; + VERIFY_BITS(t6, 26); + VERIFY_BITS(c, 39); + /* [d u6 0 0 0 0 0 0 t9 0 c-u6*R1 t6-u6*R0 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 0 p6 p5 p4 p3 p2 p1 p0] */ + + c += (uint64_t)(a[0]*2) * a[7] + + (uint64_t)(a[1]*2) * a[6] + + (uint64_t)(a[2]*2) * a[5] + + (uint64_t)(a[3]*2) * a[4]; + /* VERIFY_BITS(c, 64); */ + VERIFY_CHECK(c <= 0x8000007C00000007ULL); + /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + d += (uint64_t)(a[8]*2) * a[9]; + VERIFY_BITS(d, 58); + /* [d 0 0 0 0 0 0 0 t9 0 c t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + u7 = d & M; d >>= 26; c += u7 * R0; + VERIFY_BITS(u7, 26); + VERIFY_BITS(d, 32); + /* VERIFY_BITS(c, 64); */ + VERIFY_CHECK(c <= 0x800001703FFFC2F7ULL); + /* [d u7 0 0 0 0 0 0 0 t9 0 c-u7*R0 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + t7 = c & M; c >>= 26; c += u7 * R1; + VERIFY_BITS(t7, 26); + VERIFY_BITS(c, 38); + /* [d u7 0 0 0 0 0 0 0 t9 c-u7*R1 t7-u7*R0 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 0 p7 p6 p5 p4 p3 p2 p1 p0] */ + + c += (uint64_t)(a[0]*2) * a[8] + + (uint64_t)(a[1]*2) * a[7] + + (uint64_t)(a[2]*2) * a[6] + + (uint64_t)(a[3]*2) * a[5] + + (uint64_t)a[4] * a[4]; + /* VERIFY_BITS(c, 64); */ + VERIFY_CHECK(c <= 0x9000007B80000008ULL); + /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + d += (uint64_t)a[9] * a[9]; + VERIFY_BITS(d, 57); + /* [d 0 0 0 0 0 0 0 0 t9 c t7 t6 t5 t4 t3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + u8 = d & M; d >>= 26; c += u8 * R0; + VERIFY_BITS(u8, 26); + VERIFY_BITS(d, 31); + /* VERIFY_BITS(c, 64); */ + VERIFY_CHECK(c <= 0x9000016FBFFFC2F8ULL); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 t4 t3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + + r[3] = t3; + VERIFY_BITS(r[3], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 t4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[4] = t4; + VERIFY_BITS(r[4], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 t5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[5] = t5; + VERIFY_BITS(r[5], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 t6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[6] = t6; + VERIFY_BITS(r[6], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 t7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[7] = t7; + VERIFY_BITS(r[7], 26); + /* [d u8 0 0 0 0 0 0 0 0 t9 c-u8*R0 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + + r[8] = c & M; c >>= 26; c += u8 * R1; + VERIFY_BITS(r[8], 26); + VERIFY_BITS(c, 39); + /* [d u8 0 0 0 0 0 0 0 0 t9+c-u8*R1 r8-u8*R0 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 0 0 0 t9+c r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + c += d * R0 + t9; + VERIFY_BITS(c, 45); + /* [d 0 0 0 0 0 0 0 0 0 c-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[9] = c & (M >> 4); c >>= 22; c += d * (R1 << 4); + VERIFY_BITS(r[9], 22); + VERIFY_BITS(c, 46); + /* [d 0 0 0 0 0 0 0 0 r9+((c-d*R1<<4)<<22)-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [d 0 0 0 0 0 0 0 -d*R1 r9+(c<<22)-d*R0 r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1 t0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + + d = c * (R0 >> 4) + t0; + VERIFY_BITS(d, 56); + /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1 d-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[0] = d & M; d >>= 26; + VERIFY_BITS(r[0], 26); + VERIFY_BITS(d, 30); + /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 t1+d r0-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + d += c * (R1 >> 4) + t1; + VERIFY_BITS(d, 53); + VERIFY_CHECK(d <= 0x10000003FFFFBFULL); + /* [r9+(c<<22) r8 r7 r6 r5 r4 r3 t2 d-c*R1>>4 r0-c*R0>>4] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + /* [r9 r8 r7 r6 r5 r4 r3 t2 d r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[1] = d & M; d >>= 26; + VERIFY_BITS(r[1], 26); + VERIFY_BITS(d, 27); + VERIFY_CHECK(d <= 0x4000000ULL); + /* [r9 r8 r7 r6 r5 r4 r3 t2+d r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + d += t2; + VERIFY_BITS(d, 27); + /* [r9 r8 r7 r6 r5 r4 r3 d r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[2] = d; + VERIFY_BITS(r[2], 27); + /* [r9 r8 r7 r6 r5 r4 r3 r2 r1 r0] = [p18 p17 p16 p15 p14 p13 p12 p11 p10 p9 p8 p7 p6 p5 p4 p3 p2 p1 p0] */ +} + + +static void secp256k1_fe_mul(secp256k1_fe_t *r, const secp256k1_fe_t *a, const secp256k1_fe_t * SECP256K1_RESTRICT b) { +#ifdef VERIFY + VERIFY_CHECK(a->magnitude <= 8); + VERIFY_CHECK(b->magnitude <= 8); + secp256k1_fe_verify(a); + secp256k1_fe_verify(b); + VERIFY_CHECK(r != b); +#endif + secp256k1_fe_mul_inner(r->n, a->n, b->n); +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +static void secp256k1_fe_sqr(secp256k1_fe_t *r, const secp256k1_fe_t *a) { +#ifdef VERIFY + VERIFY_CHECK(a->magnitude <= 8); + secp256k1_fe_verify(a); +#endif + secp256k1_fe_sqr_inner(r->n, a->n); +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +static SECP256K1_INLINE void secp256k1_fe_cmov(secp256k1_fe_t *r, const secp256k1_fe_t *a, int flag) { + uint32_t mask0, mask1; + mask0 = flag + ~((uint32_t)0); + mask1 = ~mask0; + r->n[0] = (r->n[0] & mask0) | (a->n[0] & mask1); + r->n[1] = (r->n[1] & mask0) | (a->n[1] & mask1); + r->n[2] = (r->n[2] & mask0) | (a->n[2] & mask1); + r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1); + r->n[4] = (r->n[4] & mask0) | (a->n[4] & mask1); + r->n[5] = (r->n[5] & mask0) | (a->n[5] & mask1); + r->n[6] = (r->n[6] & mask0) | (a->n[6] & mask1); + r->n[7] = (r->n[7] & mask0) | (a->n[7] & mask1); + r->n[8] = (r->n[8] & mask0) | (a->n[8] & mask1); + r->n[9] = (r->n[9] & mask0) | (a->n[9] & mask1); +#ifdef VERIFY + r->magnitude = (r->magnitude & mask0) | (a->magnitude & mask1); + r->normalized = (r->normalized & mask0) | (a->normalized & mask1); +#endif +} + +static SECP256K1_INLINE void secp256k1_fe_storage_cmov(secp256k1_fe_storage_t *r, const secp256k1_fe_storage_t *a, int flag) { + uint32_t mask0, mask1; + mask0 = flag + ~((uint32_t)0); + mask1 = ~mask0; + r->n[0] = (r->n[0] & mask0) | (a->n[0] & mask1); + r->n[1] = (r->n[1] & mask0) | (a->n[1] & mask1); + r->n[2] = (r->n[2] & mask0) | (a->n[2] & mask1); + r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1); + r->n[4] = (r->n[4] & mask0) | (a->n[4] & mask1); + r->n[5] = (r->n[5] & mask0) | (a->n[5] & mask1); + r->n[6] = (r->n[6] & mask0) | (a->n[6] & mask1); + r->n[7] = (r->n[7] & mask0) | (a->n[7] & mask1); +} + +static void secp256k1_fe_to_storage(secp256k1_fe_storage_t *r, const secp256k1_fe_t *a) { +#ifdef VERIFY + VERIFY_CHECK(a->normalized); +#endif + r->n[0] = a->n[0] | a->n[1] << 26; + r->n[1] = a->n[1] >> 6 | a->n[2] << 20; + r->n[2] = a->n[2] >> 12 | a->n[3] << 14; + r->n[3] = a->n[3] >> 18 | a->n[4] << 8; + r->n[4] = a->n[4] >> 24 | a->n[5] << 2 | a->n[6] << 28; + r->n[5] = a->n[6] >> 4 | a->n[7] << 22; + r->n[6] = a->n[7] >> 10 | a->n[8] << 16; + r->n[7] = a->n[8] >> 16 | a->n[9] << 10; +} + +static SECP256K1_INLINE void secp256k1_fe_from_storage(secp256k1_fe_t *r, const secp256k1_fe_storage_t *a) { + r->n[0] = a->n[0] & 0x3FFFFFFUL; + r->n[1] = a->n[0] >> 26 | ((a->n[1] << 6) & 0x3FFFFFFUL); + r->n[2] = a->n[1] >> 20 | ((a->n[2] << 12) & 0x3FFFFFFUL); + r->n[3] = a->n[2] >> 14 | ((a->n[3] << 18) & 0x3FFFFFFUL); + r->n[4] = a->n[3] >> 8 | ((a->n[4] << 24) & 0x3FFFFFFUL); + r->n[5] = (a->n[4] >> 2) & 0x3FFFFFFUL; + r->n[6] = a->n[4] >> 28 | ((a->n[5] << 4) & 0x3FFFFFFUL); + r->n[7] = a->n[5] >> 22 | ((a->n[6] << 10) & 0x3FFFFFFUL); + r->n[8] = a->n[6] >> 16 | ((a->n[7] << 16) & 0x3FFFFFFUL); + r->n[9] = a->n[7] >> 10; +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; +#endif +} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/field_5x52.h b/src/cryptoconditions/src/include/secp256k1/src/field_5x52.h new file mode 100644 index 00000000000..4513d36f49f --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/field_5x52.h @@ -0,0 +1,47 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_FIELD_REPR_ +#define _SECP256K1_FIELD_REPR_ + +#include + +typedef struct { + /* X = sum(i=0..4, elem[i]*2^52) mod n */ + uint64_t n[5]; +#ifdef VERIFY + int magnitude; + int normalized; +#endif +} secp256k1_fe_t; + +/* Unpacks a constant into a overlapping multi-limbed FE element. */ +#define SECP256K1_FE_CONST_INNER(d7, d6, d5, d4, d3, d2, d1, d0) { \ + (d0) | ((uint64_t)(d1) & 0xFFFFFUL) << 32, \ + ((d1) >> 20) | ((uint64_t)(d2)) << 12 | ((uint64_t)(d3) & 0xFFUL) << 44, \ + ((d3) >> 8) | ((uint64_t)(d4) & 0xFFFFFFFUL) << 24, \ + ((d4) >> 28) | ((uint64_t)(d5)) << 4 | ((uint64_t)(d6) & 0xFFFFUL) << 36, \ + ((d6) >> 16) | ((uint64_t)(d7)) << 16 \ +} + +#ifdef VERIFY +#define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {SECP256K1_FE_CONST_INNER((d7), (d6), (d5), (d4), (d3), (d2), (d1), (d0)), 1, 1} +#else +#define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {SECP256K1_FE_CONST_INNER((d7), (d6), (d5), (d4), (d3), (d2), (d1), (d0))} +#endif + +typedef struct { + uint64_t n[4]; +} secp256k1_fe_storage_t; + +#define SECP256K1_FE_STORAGE_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{ \ + (d0) | ((uint64_t)(d1)) << 32, \ + (d2) | ((uint64_t)(d3)) << 32, \ + (d4) | ((uint64_t)(d5)) << 32, \ + (d6) | ((uint64_t)(d7)) << 32 \ +}} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/field_5x52_asm_impl.h b/src/cryptoconditions/src/include/secp256k1/src/field_5x52_asm_impl.h new file mode 100644 index 00000000000..98cc004bf04 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/field_5x52_asm_impl.h @@ -0,0 +1,502 @@ +/********************************************************************** + * Copyright (c) 2013-2014 Diederik Huys, Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +/** + * Changelog: + * - March 2013, Diederik Huys: original version + * - November 2014, Pieter Wuille: updated to use Peter Dettman's parallel multiplication algorithm + * - December 2014, Pieter Wuille: converted from YASM to GCC inline assembly + */ + +#ifndef _SECP256K1_FIELD_INNER5X52_IMPL_H_ +#define _SECP256K1_FIELD_INNER5X52_IMPL_H_ + +SECP256K1_INLINE static void secp256k1_fe_mul_inner(uint64_t *r, const uint64_t *a, const uint64_t * SECP256K1_RESTRICT b) { +/** + * Registers: rdx:rax = multiplication accumulator + * r9:r8 = c + * r15:rcx = d + * r10-r14 = a0-a4 + * rbx = b + * rdi = r + * rsi = a / t? + */ + uint64_t tmp1, tmp2, tmp3; +__asm__ __volatile__( + "movq 0(%%rsi),%%r10\n" + "movq 8(%%rsi),%%r11\n" + "movq 16(%%rsi),%%r12\n" + "movq 24(%%rsi),%%r13\n" + "movq 32(%%rsi),%%r14\n" + + /* d += a3 * b0 */ + "movq 0(%%rbx),%%rax\n" + "mulq %%r13\n" + "movq %%rax,%%rcx\n" + "movq %%rdx,%%r15\n" + /* d += a2 * b1 */ + "movq 8(%%rbx),%%rax\n" + "mulq %%r12\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += a1 * b2 */ + "movq 16(%%rbx),%%rax\n" + "mulq %%r11\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d = a0 * b3 */ + "movq 24(%%rbx),%%rax\n" + "mulq %%r10\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* c = a4 * b4 */ + "movq 32(%%rbx),%%rax\n" + "mulq %%r14\n" + "movq %%rax,%%r8\n" + "movq %%rdx,%%r9\n" + /* d += (c & M) * R */ + "movq $0xfffffffffffff,%%rdx\n" + "andq %%rdx,%%rax\n" + "movq $0x1000003d10,%%rdx\n" + "mulq %%rdx\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* c >>= 52 (%%r8 only) */ + "shrdq $52,%%r9,%%r8\n" + /* t3 (tmp1) = d & M */ + "movq %%rcx,%%rsi\n" + "movq $0xfffffffffffff,%%rdx\n" + "andq %%rdx,%%rsi\n" + "movq %%rsi,%q1\n" + /* d >>= 52 */ + "shrdq $52,%%r15,%%rcx\n" + "xorq %%r15,%%r15\n" + /* d += a4 * b0 */ + "movq 0(%%rbx),%%rax\n" + "mulq %%r14\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += a3 * b1 */ + "movq 8(%%rbx),%%rax\n" + "mulq %%r13\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += a2 * b2 */ + "movq 16(%%rbx),%%rax\n" + "mulq %%r12\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += a1 * b3 */ + "movq 24(%%rbx),%%rax\n" + "mulq %%r11\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += a0 * b4 */ + "movq 32(%%rbx),%%rax\n" + "mulq %%r10\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += c * R */ + "movq %%r8,%%rax\n" + "movq $0x1000003d10,%%rdx\n" + "mulq %%rdx\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* t4 = d & M (%%rsi) */ + "movq %%rcx,%%rsi\n" + "movq $0xfffffffffffff,%%rdx\n" + "andq %%rdx,%%rsi\n" + /* d >>= 52 */ + "shrdq $52,%%r15,%%rcx\n" + "xorq %%r15,%%r15\n" + /* tx = t4 >> 48 (tmp3) */ + "movq %%rsi,%%rax\n" + "shrq $48,%%rax\n" + "movq %%rax,%q3\n" + /* t4 &= (M >> 4) (tmp2) */ + "movq $0xffffffffffff,%%rax\n" + "andq %%rax,%%rsi\n" + "movq %%rsi,%q2\n" + /* c = a0 * b0 */ + "movq 0(%%rbx),%%rax\n" + "mulq %%r10\n" + "movq %%rax,%%r8\n" + "movq %%rdx,%%r9\n" + /* d += a4 * b1 */ + "movq 8(%%rbx),%%rax\n" + "mulq %%r14\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += a3 * b2 */ + "movq 16(%%rbx),%%rax\n" + "mulq %%r13\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += a2 * b3 */ + "movq 24(%%rbx),%%rax\n" + "mulq %%r12\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += a1 * b4 */ + "movq 32(%%rbx),%%rax\n" + "mulq %%r11\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* u0 = d & M (%%rsi) */ + "movq %%rcx,%%rsi\n" + "movq $0xfffffffffffff,%%rdx\n" + "andq %%rdx,%%rsi\n" + /* d >>= 52 */ + "shrdq $52,%%r15,%%rcx\n" + "xorq %%r15,%%r15\n" + /* u0 = (u0 << 4) | tx (%%rsi) */ + "shlq $4,%%rsi\n" + "movq %q3,%%rax\n" + "orq %%rax,%%rsi\n" + /* c += u0 * (R >> 4) */ + "movq $0x1000003d1,%%rax\n" + "mulq %%rsi\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* r[0] = c & M */ + "movq %%r8,%%rax\n" + "movq $0xfffffffffffff,%%rdx\n" + "andq %%rdx,%%rax\n" + "movq %%rax,0(%%rdi)\n" + /* c >>= 52 */ + "shrdq $52,%%r9,%%r8\n" + "xorq %%r9,%%r9\n" + /* c += a1 * b0 */ + "movq 0(%%rbx),%%rax\n" + "mulq %%r11\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* c += a0 * b1 */ + "movq 8(%%rbx),%%rax\n" + "mulq %%r10\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* d += a4 * b2 */ + "movq 16(%%rbx),%%rax\n" + "mulq %%r14\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += a3 * b3 */ + "movq 24(%%rbx),%%rax\n" + "mulq %%r13\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += a2 * b4 */ + "movq 32(%%rbx),%%rax\n" + "mulq %%r12\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* c += (d & M) * R */ + "movq %%rcx,%%rax\n" + "movq $0xfffffffffffff,%%rdx\n" + "andq %%rdx,%%rax\n" + "movq $0x1000003d10,%%rdx\n" + "mulq %%rdx\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* d >>= 52 */ + "shrdq $52,%%r15,%%rcx\n" + "xorq %%r15,%%r15\n" + /* r[1] = c & M */ + "movq %%r8,%%rax\n" + "movq $0xfffffffffffff,%%rdx\n" + "andq %%rdx,%%rax\n" + "movq %%rax,8(%%rdi)\n" + /* c >>= 52 */ + "shrdq $52,%%r9,%%r8\n" + "xorq %%r9,%%r9\n" + /* c += a2 * b0 */ + "movq 0(%%rbx),%%rax\n" + "mulq %%r12\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* c += a1 * b1 */ + "movq 8(%%rbx),%%rax\n" + "mulq %%r11\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* c += a0 * b2 (last use of %%r10 = a0) */ + "movq 16(%%rbx),%%rax\n" + "mulq %%r10\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* fetch t3 (%%r10, overwrites a0), t4 (%%rsi) */ + "movq %q2,%%rsi\n" + "movq %q1,%%r10\n" + /* d += a4 * b3 */ + "movq 24(%%rbx),%%rax\n" + "mulq %%r14\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* d += a3 * b4 */ + "movq 32(%%rbx),%%rax\n" + "mulq %%r13\n" + "addq %%rax,%%rcx\n" + "adcq %%rdx,%%r15\n" + /* c += (d & M) * R */ + "movq %%rcx,%%rax\n" + "movq $0xfffffffffffff,%%rdx\n" + "andq %%rdx,%%rax\n" + "movq $0x1000003d10,%%rdx\n" + "mulq %%rdx\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* d >>= 52 (%%rcx only) */ + "shrdq $52,%%r15,%%rcx\n" + /* r[2] = c & M */ + "movq %%r8,%%rax\n" + "movq $0xfffffffffffff,%%rdx\n" + "andq %%rdx,%%rax\n" + "movq %%rax,16(%%rdi)\n" + /* c >>= 52 */ + "shrdq $52,%%r9,%%r8\n" + "xorq %%r9,%%r9\n" + /* c += t3 */ + "addq %%r10,%%r8\n" + /* c += d * R */ + "movq %%rcx,%%rax\n" + "movq $0x1000003d10,%%rdx\n" + "mulq %%rdx\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* r[3] = c & M */ + "movq %%r8,%%rax\n" + "movq $0xfffffffffffff,%%rdx\n" + "andq %%rdx,%%rax\n" + "movq %%rax,24(%%rdi)\n" + /* c >>= 52 (%%r8 only) */ + "shrdq $52,%%r9,%%r8\n" + /* c += t4 (%%r8 only) */ + "addq %%rsi,%%r8\n" + /* r[4] = c */ + "movq %%r8,32(%%rdi)\n" +: "+S"(a), "=m"(tmp1), "=m"(tmp2), "=m"(tmp3) +: "b"(b), "D"(r) +: "%rax", "%rcx", "%rdx", "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15", "cc", "memory" +); +} + +SECP256K1_INLINE static void secp256k1_fe_sqr_inner(uint64_t *r, const uint64_t *a) { +/** + * Registers: rdx:rax = multiplication accumulator + * r9:r8 = c + * rcx:rbx = d + * r10-r14 = a0-a4 + * r15 = M (0xfffffffffffff) + * rdi = r + * rsi = a / t? + */ + uint64_t tmp1, tmp2, tmp3; +__asm__ __volatile__( + "movq 0(%%rsi),%%r10\n" + "movq 8(%%rsi),%%r11\n" + "movq 16(%%rsi),%%r12\n" + "movq 24(%%rsi),%%r13\n" + "movq 32(%%rsi),%%r14\n" + "movq $0xfffffffffffff,%%r15\n" + + /* d = (a0*2) * a3 */ + "leaq (%%r10,%%r10,1),%%rax\n" + "mulq %%r13\n" + "movq %%rax,%%rbx\n" + "movq %%rdx,%%rcx\n" + /* d += (a1*2) * a2 */ + "leaq (%%r11,%%r11,1),%%rax\n" + "mulq %%r12\n" + "addq %%rax,%%rbx\n" + "adcq %%rdx,%%rcx\n" + /* c = a4 * a4 */ + "movq %%r14,%%rax\n" + "mulq %%r14\n" + "movq %%rax,%%r8\n" + "movq %%rdx,%%r9\n" + /* d += (c & M) * R */ + "andq %%r15,%%rax\n" + "movq $0x1000003d10,%%rdx\n" + "mulq %%rdx\n" + "addq %%rax,%%rbx\n" + "adcq %%rdx,%%rcx\n" + /* c >>= 52 (%%r8 only) */ + "shrdq $52,%%r9,%%r8\n" + /* t3 (tmp1) = d & M */ + "movq %%rbx,%%rsi\n" + "andq %%r15,%%rsi\n" + "movq %%rsi,%q1\n" + /* d >>= 52 */ + "shrdq $52,%%rcx,%%rbx\n" + "xorq %%rcx,%%rcx\n" + /* a4 *= 2 */ + "addq %%r14,%%r14\n" + /* d += a0 * a4 */ + "movq %%r10,%%rax\n" + "mulq %%r14\n" + "addq %%rax,%%rbx\n" + "adcq %%rdx,%%rcx\n" + /* d+= (a1*2) * a3 */ + "leaq (%%r11,%%r11,1),%%rax\n" + "mulq %%r13\n" + "addq %%rax,%%rbx\n" + "adcq %%rdx,%%rcx\n" + /* d += a2 * a2 */ + "movq %%r12,%%rax\n" + "mulq %%r12\n" + "addq %%rax,%%rbx\n" + "adcq %%rdx,%%rcx\n" + /* d += c * R */ + "movq %%r8,%%rax\n" + "movq $0x1000003d10,%%rdx\n" + "mulq %%rdx\n" + "addq %%rax,%%rbx\n" + "adcq %%rdx,%%rcx\n" + /* t4 = d & M (%%rsi) */ + "movq %%rbx,%%rsi\n" + "andq %%r15,%%rsi\n" + /* d >>= 52 */ + "shrdq $52,%%rcx,%%rbx\n" + "xorq %%rcx,%%rcx\n" + /* tx = t4 >> 48 (tmp3) */ + "movq %%rsi,%%rax\n" + "shrq $48,%%rax\n" + "movq %%rax,%q3\n" + /* t4 &= (M >> 4) (tmp2) */ + "movq $0xffffffffffff,%%rax\n" + "andq %%rax,%%rsi\n" + "movq %%rsi,%q2\n" + /* c = a0 * a0 */ + "movq %%r10,%%rax\n" + "mulq %%r10\n" + "movq %%rax,%%r8\n" + "movq %%rdx,%%r9\n" + /* d += a1 * a4 */ + "movq %%r11,%%rax\n" + "mulq %%r14\n" + "addq %%rax,%%rbx\n" + "adcq %%rdx,%%rcx\n" + /* d += (a2*2) * a3 */ + "leaq (%%r12,%%r12,1),%%rax\n" + "mulq %%r13\n" + "addq %%rax,%%rbx\n" + "adcq %%rdx,%%rcx\n" + /* u0 = d & M (%%rsi) */ + "movq %%rbx,%%rsi\n" + "andq %%r15,%%rsi\n" + /* d >>= 52 */ + "shrdq $52,%%rcx,%%rbx\n" + "xorq %%rcx,%%rcx\n" + /* u0 = (u0 << 4) | tx (%%rsi) */ + "shlq $4,%%rsi\n" + "movq %q3,%%rax\n" + "orq %%rax,%%rsi\n" + /* c += u0 * (R >> 4) */ + "movq $0x1000003d1,%%rax\n" + "mulq %%rsi\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* r[0] = c & M */ + "movq %%r8,%%rax\n" + "andq %%r15,%%rax\n" + "movq %%rax,0(%%rdi)\n" + /* c >>= 52 */ + "shrdq $52,%%r9,%%r8\n" + "xorq %%r9,%%r9\n" + /* a0 *= 2 */ + "addq %%r10,%%r10\n" + /* c += a0 * a1 */ + "movq %%r10,%%rax\n" + "mulq %%r11\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* d += a2 * a4 */ + "movq %%r12,%%rax\n" + "mulq %%r14\n" + "addq %%rax,%%rbx\n" + "adcq %%rdx,%%rcx\n" + /* d += a3 * a3 */ + "movq %%r13,%%rax\n" + "mulq %%r13\n" + "addq %%rax,%%rbx\n" + "adcq %%rdx,%%rcx\n" + /* c += (d & M) * R */ + "movq %%rbx,%%rax\n" + "andq %%r15,%%rax\n" + "movq $0x1000003d10,%%rdx\n" + "mulq %%rdx\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* d >>= 52 */ + "shrdq $52,%%rcx,%%rbx\n" + "xorq %%rcx,%%rcx\n" + /* r[1] = c & M */ + "movq %%r8,%%rax\n" + "andq %%r15,%%rax\n" + "movq %%rax,8(%%rdi)\n" + /* c >>= 52 */ + "shrdq $52,%%r9,%%r8\n" + "xorq %%r9,%%r9\n" + /* c += a0 * a2 (last use of %%r10) */ + "movq %%r10,%%rax\n" + "mulq %%r12\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* fetch t3 (%%r10, overwrites a0),t4 (%%rsi) */ + "movq %q2,%%rsi\n" + "movq %q1,%%r10\n" + /* c += a1 * a1 */ + "movq %%r11,%%rax\n" + "mulq %%r11\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* d += a3 * a4 */ + "movq %%r13,%%rax\n" + "mulq %%r14\n" + "addq %%rax,%%rbx\n" + "adcq %%rdx,%%rcx\n" + /* c += (d & M) * R */ + "movq %%rbx,%%rax\n" + "andq %%r15,%%rax\n" + "movq $0x1000003d10,%%rdx\n" + "mulq %%rdx\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* d >>= 52 (%%rbx only) */ + "shrdq $52,%%rcx,%%rbx\n" + /* r[2] = c & M */ + "movq %%r8,%%rax\n" + "andq %%r15,%%rax\n" + "movq %%rax,16(%%rdi)\n" + /* c >>= 52 */ + "shrdq $52,%%r9,%%r8\n" + "xorq %%r9,%%r9\n" + /* c += t3 */ + "addq %%r10,%%r8\n" + /* c += d * R */ + "movq %%rbx,%%rax\n" + "movq $0x1000003d10,%%rdx\n" + "mulq %%rdx\n" + "addq %%rax,%%r8\n" + "adcq %%rdx,%%r9\n" + /* r[3] = c & M */ + "movq %%r8,%%rax\n" + "andq %%r15,%%rax\n" + "movq %%rax,24(%%rdi)\n" + /* c >>= 52 (%%r8 only) */ + "shrdq $52,%%r9,%%r8\n" + /* c += t4 (%%r8 only) */ + "addq %%rsi,%%r8\n" + /* r[4] = c */ + "movq %%r8,32(%%rdi)\n" +: "+S"(a), "=m"(tmp1), "=m"(tmp2), "=m"(tmp3) +: "D"(r) +: "%rax", "%rbx", "%rcx", "%rdx", "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15", "cc", "memory" +); +} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/field_5x52_impl.h b/src/cryptoconditions/src/include/secp256k1/src/field_5x52_impl.h new file mode 100644 index 00000000000..bda4c3dfc2d --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/field_5x52_impl.h @@ -0,0 +1,454 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_FIELD_REPR_IMPL_H_ +#define _SECP256K1_FIELD_REPR_IMPL_H_ + +#if defined HAVE_CONFIG_H +#include "libsecp256k1-config.h" +#endif + +#include +#include "util.h" +#include "num.h" +#include "field.h" + +#if defined(USE_ASM_X86_64) +#include "field_5x52_asm_impl.h" +#else +#include "field_5x52_int128_impl.h" +#endif + +/** Implements arithmetic modulo FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F, + * represented as 5 uint64_t's in base 2^52. The values are allowed to contain >52 each. In particular, + * each FieldElem has a 'magnitude' associated with it. Internally, a magnitude M means each element + * is at most M*(2^53-1), except the most significant one, which is limited to M*(2^49-1). All operations + * accept any input with magnitude at most M, and have different rules for propagating magnitude to their + * output. + */ + +#ifdef VERIFY +static void secp256k1_fe_verify(const secp256k1_fe_t *a) { + const uint64_t *d = a->n; + int m = a->normalized ? 1 : 2 * a->magnitude, r = 1; + /* secp256k1 'p' value defined in "Standards for Efficient Cryptography" (SEC2) 2.7.1. */ + r &= (d[0] <= 0xFFFFFFFFFFFFFULL * m); + r &= (d[1] <= 0xFFFFFFFFFFFFFULL * m); + r &= (d[2] <= 0xFFFFFFFFFFFFFULL * m); + r &= (d[3] <= 0xFFFFFFFFFFFFFULL * m); + r &= (d[4] <= 0x0FFFFFFFFFFFFULL * m); + r &= (a->magnitude >= 0); + r &= (a->magnitude <= 2048); + if (a->normalized) { + r &= (a->magnitude <= 1); + if (r && (d[4] == 0x0FFFFFFFFFFFFULL) && ((d[3] & d[2] & d[1]) == 0xFFFFFFFFFFFFFULL)) { + r &= (d[0] < 0xFFFFEFFFFFC2FULL); + } + } + VERIFY_CHECK(r == 1); +} +#else +static void secp256k1_fe_verify(const secp256k1_fe_t *a) { + (void)a; +} +#endif + +static void secp256k1_fe_normalize(secp256k1_fe_t *r) { + uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4]; + + /* Reduce t4 at the start so there will be at most a single carry from the first pass */ + uint64_t m; + uint64_t x = t4 >> 48; t4 &= 0x0FFFFFFFFFFFFULL; + + /* The first pass ensures the magnitude is 1, ... */ + t0 += x * 0x1000003D1ULL; + t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; + t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; m = t1; + t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; m &= t2; + t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; m &= t3; + + /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */ + VERIFY_CHECK(t4 >> 49 == 0); + + /* At most a single final reduction is needed; check if the value is >= the field characteristic */ + x = (t4 >> 48) | ((t4 == 0x0FFFFFFFFFFFFULL) & (m == 0xFFFFFFFFFFFFFULL) + & (t0 >= 0xFFFFEFFFFFC2FULL)); + + /* Apply the final reduction (for constant-time behaviour, we do it always) */ + t0 += x * 0x1000003D1ULL; + t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; + t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; + t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; + t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; + + /* If t4 didn't carry to bit 48 already, then it should have after any final reduction */ + VERIFY_CHECK(t4 >> 48 == x); + + /* Mask off the possible multiple of 2^256 from the final reduction */ + t4 &= 0x0FFFFFFFFFFFFULL; + + r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4; + +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; + secp256k1_fe_verify(r); +#endif +} + +static void secp256k1_fe_normalize_weak(secp256k1_fe_t *r) { + uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4]; + + /* Reduce t4 at the start so there will be at most a single carry from the first pass */ + uint64_t x = t4 >> 48; t4 &= 0x0FFFFFFFFFFFFULL; + + /* The first pass ensures the magnitude is 1, ... */ + t0 += x * 0x1000003D1ULL; + t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; + t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; + t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; + t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; + + /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */ + VERIFY_CHECK(t4 >> 49 == 0); + + r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4; + +#ifdef VERIFY + r->magnitude = 1; + secp256k1_fe_verify(r); +#endif +} + +static void secp256k1_fe_normalize_var(secp256k1_fe_t *r) { + uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4]; + + /* Reduce t4 at the start so there will be at most a single carry from the first pass */ + uint64_t m; + uint64_t x = t4 >> 48; t4 &= 0x0FFFFFFFFFFFFULL; + + /* The first pass ensures the magnitude is 1, ... */ + t0 += x * 0x1000003D1ULL; + t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; + t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; m = t1; + t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; m &= t2; + t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; m &= t3; + + /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */ + VERIFY_CHECK(t4 >> 49 == 0); + + /* At most a single final reduction is needed; check if the value is >= the field characteristic */ + x = (t4 >> 48) | ((t4 == 0x0FFFFFFFFFFFFULL) & (m == 0xFFFFFFFFFFFFFULL) + & (t0 >= 0xFFFFEFFFFFC2FULL)); + + if (x) { + t0 += 0x1000003D1ULL; + t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; + t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; + t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; + t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; + + /* If t4 didn't carry to bit 48 already, then it should have after any final reduction */ + VERIFY_CHECK(t4 >> 48 == x); + + /* Mask off the possible multiple of 2^256 from the final reduction */ + t4 &= 0x0FFFFFFFFFFFFULL; + } + + r->n[0] = t0; r->n[1] = t1; r->n[2] = t2; r->n[3] = t3; r->n[4] = t4; + +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; + secp256k1_fe_verify(r); +#endif +} + +static int secp256k1_fe_normalizes_to_zero(secp256k1_fe_t *r) { + uint64_t t0 = r->n[0], t1 = r->n[1], t2 = r->n[2], t3 = r->n[3], t4 = r->n[4]; + + /* z0 tracks a possible raw value of 0, z1 tracks a possible raw value of P */ + uint64_t z0, z1; + + /* Reduce t4 at the start so there will be at most a single carry from the first pass */ + uint64_t x = t4 >> 48; t4 &= 0x0FFFFFFFFFFFFULL; + + /* The first pass ensures the magnitude is 1, ... */ + t0 += x * 0x1000003D1ULL; + t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL; z0 = t0; z1 = t0 ^ 0x1000003D0ULL; + t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; z0 |= t1; z1 &= t1; + t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; z0 |= t2; z1 &= t2; + t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; z0 |= t3; z1 &= t3; + z0 |= t4; z1 &= t4 ^ 0xF000000000000ULL; + + /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */ + VERIFY_CHECK(t4 >> 49 == 0); + + return (z0 == 0) | (z1 == 0xFFFFFFFFFFFFFULL); +} + +static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe_t *r) { + uint64_t t0, t1, t2, t3, t4; + uint64_t z0, z1; + uint64_t x; + + t0 = r->n[0]; + t4 = r->n[4]; + + /* Reduce t4 at the start so there will be at most a single carry from the first pass */ + x = t4 >> 48; + + /* The first pass ensures the magnitude is 1, ... */ + t0 += x * 0x1000003D1ULL; + + /* z0 tracks a possible raw value of 0, z1 tracks a possible raw value of P */ + z0 = t0 & 0xFFFFFFFFFFFFFULL; + z1 = z0 ^ 0x1000003D0ULL; + + /* Fast return path should catch the majority of cases */ + if ((z0 != 0ULL) & (z1 != 0xFFFFFFFFFFFFFULL)) { + return 0; + } + + t1 = r->n[1]; + t2 = r->n[2]; + t3 = r->n[3]; + + t4 &= 0x0FFFFFFFFFFFFULL; + + t1 += (t0 >> 52); t0 = z0; + t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; z0 |= t1; z1 &= t1; + t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; z0 |= t2; z1 &= t2; + t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; z0 |= t3; z1 &= t3; + z0 |= t4; z1 &= t4 ^ 0xF000000000000ULL; + + /* ... except for a possible carry at bit 48 of t4 (i.e. bit 256 of the field element) */ + VERIFY_CHECK(t4 >> 49 == 0); + + return (z0 == 0) | (z1 == 0xFFFFFFFFFFFFFULL); +} + +SECP256K1_INLINE static void secp256k1_fe_set_int(secp256k1_fe_t *r, int a) { + r->n[0] = a; + r->n[1] = r->n[2] = r->n[3] = r->n[4] = 0; +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; + secp256k1_fe_verify(r); +#endif +} + +SECP256K1_INLINE static int secp256k1_fe_is_zero(const secp256k1_fe_t *a) { + const uint64_t *t = a->n; +#ifdef VERIFY + VERIFY_CHECK(a->normalized); + secp256k1_fe_verify(a); +#endif + return (t[0] | t[1] | t[2] | t[3] | t[4]) == 0; +} + +SECP256K1_INLINE static int secp256k1_fe_is_odd(const secp256k1_fe_t *a) { +#ifdef VERIFY + VERIFY_CHECK(a->normalized); + secp256k1_fe_verify(a); +#endif + return a->n[0] & 1; +} + +SECP256K1_INLINE static void secp256k1_fe_clear(secp256k1_fe_t *a) { + int i; +#ifdef VERIFY + a->magnitude = 0; + a->normalized = 1; +#endif + for (i=0; i<5; i++) { + a->n[i] = 0; + } +} + +static int secp256k1_fe_cmp_var(const secp256k1_fe_t *a, const secp256k1_fe_t *b) { + int i; +#ifdef VERIFY + VERIFY_CHECK(a->normalized); + VERIFY_CHECK(b->normalized); + secp256k1_fe_verify(a); + secp256k1_fe_verify(b); +#endif + for (i = 4; i >= 0; i--) { + if (a->n[i] > b->n[i]) { + return 1; + } + if (a->n[i] < b->n[i]) { + return -1; + } + } + return 0; +} + +static int secp256k1_fe_set_b32(secp256k1_fe_t *r, const unsigned char *a) { + int i; + r->n[0] = r->n[1] = r->n[2] = r->n[3] = r->n[4] = 0; + for (i=0; i<32; i++) { + int j; + for (j=0; j<2; j++) { + int limb = (8*i+4*j)/52; + int shift = (8*i+4*j)%52; + r->n[limb] |= (uint64_t)((a[31-i] >> (4*j)) & 0xF) << shift; + } + } + if (r->n[4] == 0x0FFFFFFFFFFFFULL && (r->n[3] & r->n[2] & r->n[1]) == 0xFFFFFFFFFFFFFULL && r->n[0] >= 0xFFFFEFFFFFC2FULL) { + return 0; + } +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; + secp256k1_fe_verify(r); +#endif + return 1; +} + +/** Convert a field element to a 32-byte big endian value. Requires the input to be normalized */ +static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe_t *a) { + int i; +#ifdef VERIFY + VERIFY_CHECK(a->normalized); + secp256k1_fe_verify(a); +#endif + for (i=0; i<32; i++) { + int j; + int c = 0; + for (j=0; j<2; j++) { + int limb = (8*i+4*j)/52; + int shift = (8*i+4*j)%52; + c |= ((a->n[limb] >> shift) & 0xF) << (4 * j); + } + r[31-i] = c; + } +} + +SECP256K1_INLINE static void secp256k1_fe_negate(secp256k1_fe_t *r, const secp256k1_fe_t *a, int m) { +#ifdef VERIFY + VERIFY_CHECK(a->magnitude <= m); + secp256k1_fe_verify(a); +#endif + r->n[0] = 0xFFFFEFFFFFC2FULL * 2 * (m + 1) - a->n[0]; + r->n[1] = 0xFFFFFFFFFFFFFULL * 2 * (m + 1) - a->n[1]; + r->n[2] = 0xFFFFFFFFFFFFFULL * 2 * (m + 1) - a->n[2]; + r->n[3] = 0xFFFFFFFFFFFFFULL * 2 * (m + 1) - a->n[3]; + r->n[4] = 0x0FFFFFFFFFFFFULL * 2 * (m + 1) - a->n[4]; +#ifdef VERIFY + r->magnitude = m + 1; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +SECP256K1_INLINE static void secp256k1_fe_mul_int(secp256k1_fe_t *r, int a) { + r->n[0] *= a; + r->n[1] *= a; + r->n[2] *= a; + r->n[3] *= a; + r->n[4] *= a; +#ifdef VERIFY + r->magnitude *= a; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +SECP256K1_INLINE static void secp256k1_fe_add(secp256k1_fe_t *r, const secp256k1_fe_t *a) { +#ifdef VERIFY + secp256k1_fe_verify(a); +#endif + r->n[0] += a->n[0]; + r->n[1] += a->n[1]; + r->n[2] += a->n[2]; + r->n[3] += a->n[3]; + r->n[4] += a->n[4]; +#ifdef VERIFY + r->magnitude += a->magnitude; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +static void secp256k1_fe_mul(secp256k1_fe_t *r, const secp256k1_fe_t *a, const secp256k1_fe_t * SECP256K1_RESTRICT b) { +#ifdef VERIFY + VERIFY_CHECK(a->magnitude <= 8); + VERIFY_CHECK(b->magnitude <= 8); + secp256k1_fe_verify(a); + secp256k1_fe_verify(b); + VERIFY_CHECK(r != b); +#endif + secp256k1_fe_mul_inner(r->n, a->n, b->n); +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +static void secp256k1_fe_sqr(secp256k1_fe_t *r, const secp256k1_fe_t *a) { +#ifdef VERIFY + VERIFY_CHECK(a->magnitude <= 8); + secp256k1_fe_verify(a); +#endif + secp256k1_fe_sqr_inner(r->n, a->n); +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 0; + secp256k1_fe_verify(r); +#endif +} + +static SECP256K1_INLINE void secp256k1_fe_cmov(secp256k1_fe_t *r, const secp256k1_fe_t *a, int flag) { + uint64_t mask0, mask1; + mask0 = flag + ~((uint64_t)0); + mask1 = ~mask0; + r->n[0] = (r->n[0] & mask0) | (a->n[0] & mask1); + r->n[1] = (r->n[1] & mask0) | (a->n[1] & mask1); + r->n[2] = (r->n[2] & mask0) | (a->n[2] & mask1); + r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1); + r->n[4] = (r->n[4] & mask0) | (a->n[4] & mask1); +#ifdef VERIFY + r->magnitude = (r->magnitude & mask0) | (a->magnitude & mask1); + r->normalized = (r->normalized & mask0) | (a->normalized & mask1); +#endif +} + +static SECP256K1_INLINE void secp256k1_fe_storage_cmov(secp256k1_fe_storage_t *r, const secp256k1_fe_storage_t *a, int flag) { + uint64_t mask0, mask1; + mask0 = flag + ~((uint64_t)0); + mask1 = ~mask0; + r->n[0] = (r->n[0] & mask0) | (a->n[0] & mask1); + r->n[1] = (r->n[1] & mask0) | (a->n[1] & mask1); + r->n[2] = (r->n[2] & mask0) | (a->n[2] & mask1); + r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1); +} + +static void secp256k1_fe_to_storage(secp256k1_fe_storage_t *r, const secp256k1_fe_t *a) { +#ifdef VERIFY + VERIFY_CHECK(a->normalized); +#endif + r->n[0] = a->n[0] | a->n[1] << 52; + r->n[1] = a->n[1] >> 12 | a->n[2] << 40; + r->n[2] = a->n[2] >> 24 | a->n[3] << 28; + r->n[3] = a->n[3] >> 36 | a->n[4] << 16; +} + +static SECP256K1_INLINE void secp256k1_fe_from_storage(secp256k1_fe_t *r, const secp256k1_fe_storage_t *a) { + r->n[0] = a->n[0] & 0xFFFFFFFFFFFFFULL; + r->n[1] = a->n[0] >> 52 | ((a->n[1] << 12) & 0xFFFFFFFFFFFFFULL); + r->n[2] = a->n[1] >> 40 | ((a->n[2] << 24) & 0xFFFFFFFFFFFFFULL); + r->n[3] = a->n[2] >> 28 | ((a->n[3] << 36) & 0xFFFFFFFFFFFFFULL); + r->n[4] = a->n[3] >> 16; +#ifdef VERIFY + r->magnitude = 1; + r->normalized = 1; +#endif +} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/field_5x52_int128_impl.h b/src/cryptoconditions/src/include/secp256k1/src/field_5x52_int128_impl.h new file mode 100644 index 00000000000..9280bb5ea22 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/field_5x52_int128_impl.h @@ -0,0 +1,277 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_FIELD_INNER5X52_IMPL_H_ +#define _SECP256K1_FIELD_INNER5X52_IMPL_H_ + +#include + +#ifdef VERIFY +#define VERIFY_BITS(x, n) VERIFY_CHECK(((x) >> (n)) == 0) +#else +#define VERIFY_BITS(x, n) do { } while(0) +#endif + +SECP256K1_INLINE static void secp256k1_fe_mul_inner(uint64_t *r, const uint64_t *a, const uint64_t * SECP256K1_RESTRICT b) { + uint128_t c, d; + uint64_t t3, t4, tx, u0; + uint64_t a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4]; + const uint64_t M = 0xFFFFFFFFFFFFFULL, R = 0x1000003D10ULL; + + VERIFY_BITS(a[0], 56); + VERIFY_BITS(a[1], 56); + VERIFY_BITS(a[2], 56); + VERIFY_BITS(a[3], 56); + VERIFY_BITS(a[4], 52); + VERIFY_BITS(b[0], 56); + VERIFY_BITS(b[1], 56); + VERIFY_BITS(b[2], 56); + VERIFY_BITS(b[3], 56); + VERIFY_BITS(b[4], 52); + VERIFY_CHECK(r != b); + + /* [... a b c] is a shorthand for ... + a<<104 + b<<52 + c<<0 mod n. + * px is a shorthand for sum(a[i]*b[x-i], i=0..x). + * Note that [x 0 0 0 0 0] = [x*R]. + */ + + d = (uint128_t)a0 * b[3] + + (uint128_t)a1 * b[2] + + (uint128_t)a2 * b[1] + + (uint128_t)a3 * b[0]; + VERIFY_BITS(d, 114); + /* [d 0 0 0] = [p3 0 0 0] */ + c = (uint128_t)a4 * b[4]; + VERIFY_BITS(c, 112); + /* [c 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ + d += (c & M) * R; c >>= 52; + VERIFY_BITS(d, 115); + VERIFY_BITS(c, 60); + /* [c 0 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ + t3 = d & M; d >>= 52; + VERIFY_BITS(t3, 52); + VERIFY_BITS(d, 63); + /* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ + + d += (uint128_t)a0 * b[4] + + (uint128_t)a1 * b[3] + + (uint128_t)a2 * b[2] + + (uint128_t)a3 * b[1] + + (uint128_t)a4 * b[0]; + VERIFY_BITS(d, 115); + /* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ + d += c * R; + VERIFY_BITS(d, 116); + /* [d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ + t4 = d & M; d >>= 52; + VERIFY_BITS(t4, 52); + VERIFY_BITS(d, 64); + /* [d t4 t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ + tx = (t4 >> 48); t4 &= (M >> 4); + VERIFY_BITS(tx, 4); + VERIFY_BITS(t4, 48); + /* [d t4+(tx<<48) t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ + + c = (uint128_t)a0 * b[0]; + VERIFY_BITS(c, 112); + /* [d t4+(tx<<48) t3 0 0 c] = [p8 0 0 0 p4 p3 0 0 p0] */ + d += (uint128_t)a1 * b[4] + + (uint128_t)a2 * b[3] + + (uint128_t)a3 * b[2] + + (uint128_t)a4 * b[1]; + VERIFY_BITS(d, 115); + /* [d t4+(tx<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + u0 = d & M; d >>= 52; + VERIFY_BITS(u0, 52); + VERIFY_BITS(d, 63); + /* [d u0 t4+(tx<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + /* [d 0 t4+(tx<<48)+(u0<<52) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + u0 = (u0 << 4) | tx; + VERIFY_BITS(u0, 56); + /* [d 0 t4+(u0<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + c += (uint128_t)u0 * (R >> 4); + VERIFY_BITS(c, 115); + /* [d 0 t4 t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + r[0] = c & M; c >>= 52; + VERIFY_BITS(r[0], 52); + VERIFY_BITS(c, 61); + /* [d 0 t4 t3 0 c r0] = [p8 0 0 p5 p4 p3 0 0 p0] */ + + c += (uint128_t)a0 * b[1] + + (uint128_t)a1 * b[0]; + VERIFY_BITS(c, 114); + /* [d 0 t4 t3 0 c r0] = [p8 0 0 p5 p4 p3 0 p1 p0] */ + d += (uint128_t)a2 * b[4] + + (uint128_t)a3 * b[3] + + (uint128_t)a4 * b[2]; + VERIFY_BITS(d, 114); + /* [d 0 t4 t3 0 c r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ + c += (d & M) * R; d >>= 52; + VERIFY_BITS(c, 115); + VERIFY_BITS(d, 62); + /* [d 0 0 t4 t3 0 c r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ + r[1] = c & M; c >>= 52; + VERIFY_BITS(r[1], 52); + VERIFY_BITS(c, 63); + /* [d 0 0 t4 t3 c r1 r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ + + c += (uint128_t)a0 * b[2] + + (uint128_t)a1 * b[1] + + (uint128_t)a2 * b[0]; + VERIFY_BITS(c, 114); + /* [d 0 0 t4 t3 c r1 r0] = [p8 0 p6 p5 p4 p3 p2 p1 p0] */ + d += (uint128_t)a3 * b[4] + + (uint128_t)a4 * b[3]; + VERIFY_BITS(d, 114); + /* [d 0 0 t4 t3 c t1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + c += (d & M) * R; d >>= 52; + VERIFY_BITS(c, 115); + VERIFY_BITS(d, 62); + /* [d 0 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + + /* [d 0 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[2] = c & M; c >>= 52; + VERIFY_BITS(r[2], 52); + VERIFY_BITS(c, 63); + /* [d 0 0 0 t4 t3+c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + c += d * R + t3;; + VERIFY_BITS(c, 100); + /* [t4 c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[3] = c & M; c >>= 52; + VERIFY_BITS(r[3], 52); + VERIFY_BITS(c, 48); + /* [t4+c r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + c += t4; + VERIFY_BITS(c, 49); + /* [c r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[4] = c; + VERIFY_BITS(r[4], 49); + /* [r4 r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ +} + +SECP256K1_INLINE static void secp256k1_fe_sqr_inner(uint64_t *r, const uint64_t *a) { + uint128_t c, d; + uint64_t a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4]; + int64_t t3, t4, tx, u0; + const uint64_t M = 0xFFFFFFFFFFFFFULL, R = 0x1000003D10ULL; + + VERIFY_BITS(a[0], 56); + VERIFY_BITS(a[1], 56); + VERIFY_BITS(a[2], 56); + VERIFY_BITS(a[3], 56); + VERIFY_BITS(a[4], 52); + + /** [... a b c] is a shorthand for ... + a<<104 + b<<52 + c<<0 mod n. + * px is a shorthand for sum(a[i]*a[x-i], i=0..x). + * Note that [x 0 0 0 0 0] = [x*R]. + */ + + d = (uint128_t)(a0*2) * a3 + + (uint128_t)(a1*2) * a2; + VERIFY_BITS(d, 114); + /* [d 0 0 0] = [p3 0 0 0] */ + c = (uint128_t)a4 * a4; + VERIFY_BITS(c, 112); + /* [c 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ + d += (c & M) * R; c >>= 52; + VERIFY_BITS(d, 115); + VERIFY_BITS(c, 60); + /* [c 0 0 0 0 0 d 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ + t3 = d & M; d >>= 52; + VERIFY_BITS(t3, 52); + VERIFY_BITS(d, 63); + /* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 0 p3 0 0 0] */ + + a4 *= 2; + d += (uint128_t)a0 * a4 + + (uint128_t)(a1*2) * a3 + + (uint128_t)a2 * a2; + VERIFY_BITS(d, 115); + /* [c 0 0 0 0 d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ + d += c * R; + VERIFY_BITS(d, 116); + /* [d t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ + t4 = d & M; d >>= 52; + VERIFY_BITS(t4, 52); + VERIFY_BITS(d, 64); + /* [d t4 t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ + tx = (t4 >> 48); t4 &= (M >> 4); + VERIFY_BITS(tx, 4); + VERIFY_BITS(t4, 48); + /* [d t4+(tx<<48) t3 0 0 0] = [p8 0 0 0 p4 p3 0 0 0] */ + + c = (uint128_t)a0 * a0; + VERIFY_BITS(c, 112); + /* [d t4+(tx<<48) t3 0 0 c] = [p8 0 0 0 p4 p3 0 0 p0] */ + d += (uint128_t)a1 * a4 + + (uint128_t)(a2*2) * a3; + VERIFY_BITS(d, 114); + /* [d t4+(tx<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + u0 = d & M; d >>= 52; + VERIFY_BITS(u0, 52); + VERIFY_BITS(d, 62); + /* [d u0 t4+(tx<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + /* [d 0 t4+(tx<<48)+(u0<<52) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + u0 = (u0 << 4) | tx; + VERIFY_BITS(u0, 56); + /* [d 0 t4+(u0<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + c += (uint128_t)u0 * (R >> 4); + VERIFY_BITS(c, 113); + /* [d 0 t4 t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */ + r[0] = c & M; c >>= 52; + VERIFY_BITS(r[0], 52); + VERIFY_BITS(c, 61); + /* [d 0 t4 t3 0 c r0] = [p8 0 0 p5 p4 p3 0 0 p0] */ + + a0 *= 2; + c += (uint128_t)a0 * a1; + VERIFY_BITS(c, 114); + /* [d 0 t4 t3 0 c r0] = [p8 0 0 p5 p4 p3 0 p1 p0] */ + d += (uint128_t)a2 * a4 + + (uint128_t)a3 * a3; + VERIFY_BITS(d, 114); + /* [d 0 t4 t3 0 c r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ + c += (d & M) * R; d >>= 52; + VERIFY_BITS(c, 115); + VERIFY_BITS(d, 62); + /* [d 0 0 t4 t3 0 c r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ + r[1] = c & M; c >>= 52; + VERIFY_BITS(r[1], 52); + VERIFY_BITS(c, 63); + /* [d 0 0 t4 t3 c r1 r0] = [p8 0 p6 p5 p4 p3 0 p1 p0] */ + + c += (uint128_t)a0 * a2 + + (uint128_t)a1 * a1; + VERIFY_BITS(c, 114); + /* [d 0 0 t4 t3 c r1 r0] = [p8 0 p6 p5 p4 p3 p2 p1 p0] */ + d += (uint128_t)a3 * a4; + VERIFY_BITS(d, 114); + /* [d 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + c += (d & M) * R; d >>= 52; + VERIFY_BITS(c, 115); + VERIFY_BITS(d, 62); + /* [d 0 0 0 t4 t3 c r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[2] = c & M; c >>= 52; + VERIFY_BITS(r[2], 52); + VERIFY_BITS(c, 63); + /* [d 0 0 0 t4 t3+c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + + c += d * R + t3;; + VERIFY_BITS(c, 100); + /* [t4 c r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[3] = c & M; c >>= 52; + VERIFY_BITS(r[3], 52); + VERIFY_BITS(c, 48); + /* [t4+c r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + c += t4; + VERIFY_BITS(c, 49); + /* [c r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ + r[4] = c; + VERIFY_BITS(r[4], 49); + /* [r4 r3 r2 r1 r0] = [p8 p7 p6 p5 p4 p3 p2 p1 p0] */ +} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/field_impl.h b/src/cryptoconditions/src/include/secp256k1/src/field_impl.h new file mode 100644 index 00000000000..e6ec11e8f2c --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/field_impl.h @@ -0,0 +1,263 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_FIELD_IMPL_H_ +#define _SECP256K1_FIELD_IMPL_H_ + +#if defined HAVE_CONFIG_H +#include "libsecp256k1-config.h" +#endif + +#include "util.h" + +#if defined(USE_FIELD_10X26) +#include "field_10x26_impl.h" +#elif defined(USE_FIELD_5X52) +#include "field_5x52_impl.h" +#else +#error "Please select field implementation" +#endif + +SECP256K1_INLINE static int secp256k1_fe_equal_var(const secp256k1_fe_t *a, const secp256k1_fe_t *b) { + secp256k1_fe_t na; + secp256k1_fe_negate(&na, a, 1); + secp256k1_fe_add(&na, b); + return secp256k1_fe_normalizes_to_zero_var(&na); +} + +static int secp256k1_fe_sqrt_var(secp256k1_fe_t *r, const secp256k1_fe_t *a) { + secp256k1_fe_t x2, x3, x6, x9, x11, x22, x44, x88, x176, x220, x223, t1; + int j; + + /** The binary representation of (p + 1)/4 has 3 blocks of 1s, with lengths in + * { 2, 22, 223 }. Use an addition chain to calculate 2^n - 1 for each block: + * 1, [2], 3, 6, 9, 11, [22], 44, 88, 176, 220, [223] + */ + + secp256k1_fe_sqr(&x2, a); + secp256k1_fe_mul(&x2, &x2, a); + + secp256k1_fe_sqr(&x3, &x2); + secp256k1_fe_mul(&x3, &x3, a); + + x6 = x3; + for (j=0; j<3; j++) { + secp256k1_fe_sqr(&x6, &x6); + } + secp256k1_fe_mul(&x6, &x6, &x3); + + x9 = x6; + for (j=0; j<3; j++) { + secp256k1_fe_sqr(&x9, &x9); + } + secp256k1_fe_mul(&x9, &x9, &x3); + + x11 = x9; + for (j=0; j<2; j++) { + secp256k1_fe_sqr(&x11, &x11); + } + secp256k1_fe_mul(&x11, &x11, &x2); + + x22 = x11; + for (j=0; j<11; j++) { + secp256k1_fe_sqr(&x22, &x22); + } + secp256k1_fe_mul(&x22, &x22, &x11); + + x44 = x22; + for (j=0; j<22; j++) { + secp256k1_fe_sqr(&x44, &x44); + } + secp256k1_fe_mul(&x44, &x44, &x22); + + x88 = x44; + for (j=0; j<44; j++) { + secp256k1_fe_sqr(&x88, &x88); + } + secp256k1_fe_mul(&x88, &x88, &x44); + + x176 = x88; + for (j=0; j<88; j++) { + secp256k1_fe_sqr(&x176, &x176); + } + secp256k1_fe_mul(&x176, &x176, &x88); + + x220 = x176; + for (j=0; j<44; j++) { + secp256k1_fe_sqr(&x220, &x220); + } + secp256k1_fe_mul(&x220, &x220, &x44); + + x223 = x220; + for (j=0; j<3; j++) { + secp256k1_fe_sqr(&x223, &x223); + } + secp256k1_fe_mul(&x223, &x223, &x3); + + /* The final result is then assembled using a sliding window over the blocks. */ + + t1 = x223; + for (j=0; j<23; j++) { + secp256k1_fe_sqr(&t1, &t1); + } + secp256k1_fe_mul(&t1, &t1, &x22); + for (j=0; j<6; j++) { + secp256k1_fe_sqr(&t1, &t1); + } + secp256k1_fe_mul(&t1, &t1, &x2); + secp256k1_fe_sqr(&t1, &t1); + secp256k1_fe_sqr(r, &t1); + + /* Check that a square root was actually calculated */ + + secp256k1_fe_sqr(&t1, r); + return secp256k1_fe_equal_var(&t1, a); +} + +static void secp256k1_fe_inv(secp256k1_fe_t *r, const secp256k1_fe_t *a) { + secp256k1_fe_t x2, x3, x6, x9, x11, x22, x44, x88, x176, x220, x223, t1; + int j; + + /** The binary representation of (p - 2) has 5 blocks of 1s, with lengths in + * { 1, 2, 22, 223 }. Use an addition chain to calculate 2^n - 1 for each block: + * [1], [2], 3, 6, 9, 11, [22], 44, 88, 176, 220, [223] + */ + + secp256k1_fe_sqr(&x2, a); + secp256k1_fe_mul(&x2, &x2, a); + + secp256k1_fe_sqr(&x3, &x2); + secp256k1_fe_mul(&x3, &x3, a); + + x6 = x3; + for (j=0; j<3; j++) { + secp256k1_fe_sqr(&x6, &x6); + } + secp256k1_fe_mul(&x6, &x6, &x3); + + x9 = x6; + for (j=0; j<3; j++) { + secp256k1_fe_sqr(&x9, &x9); + } + secp256k1_fe_mul(&x9, &x9, &x3); + + x11 = x9; + for (j=0; j<2; j++) { + secp256k1_fe_sqr(&x11, &x11); + } + secp256k1_fe_mul(&x11, &x11, &x2); + + x22 = x11; + for (j=0; j<11; j++) { + secp256k1_fe_sqr(&x22, &x22); + } + secp256k1_fe_mul(&x22, &x22, &x11); + + x44 = x22; + for (j=0; j<22; j++) { + secp256k1_fe_sqr(&x44, &x44); + } + secp256k1_fe_mul(&x44, &x44, &x22); + + x88 = x44; + for (j=0; j<44; j++) { + secp256k1_fe_sqr(&x88, &x88); + } + secp256k1_fe_mul(&x88, &x88, &x44); + + x176 = x88; + for (j=0; j<88; j++) { + secp256k1_fe_sqr(&x176, &x176); + } + secp256k1_fe_mul(&x176, &x176, &x88); + + x220 = x176; + for (j=0; j<44; j++) { + secp256k1_fe_sqr(&x220, &x220); + } + secp256k1_fe_mul(&x220, &x220, &x44); + + x223 = x220; + for (j=0; j<3; j++) { + secp256k1_fe_sqr(&x223, &x223); + } + secp256k1_fe_mul(&x223, &x223, &x3); + + /* The final result is then assembled using a sliding window over the blocks. */ + + t1 = x223; + for (j=0; j<23; j++) { + secp256k1_fe_sqr(&t1, &t1); + } + secp256k1_fe_mul(&t1, &t1, &x22); + for (j=0; j<5; j++) { + secp256k1_fe_sqr(&t1, &t1); + } + secp256k1_fe_mul(&t1, &t1, a); + for (j=0; j<3; j++) { + secp256k1_fe_sqr(&t1, &t1); + } + secp256k1_fe_mul(&t1, &t1, &x2); + for (j=0; j<2; j++) { + secp256k1_fe_sqr(&t1, &t1); + } + secp256k1_fe_mul(r, a, &t1); +} + +static void secp256k1_fe_inv_var(secp256k1_fe_t *r, const secp256k1_fe_t *a) { +#if defined(USE_FIELD_INV_BUILTIN) + secp256k1_fe_inv(r, a); +#elif defined(USE_FIELD_INV_NUM) + secp256k1_num_t n, m; + /* secp256k1 field prime, value p defined in "Standards for Efficient Cryptography" (SEC2) 2.7.1. */ + static const unsigned char prime[32] = { + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F + }; + unsigned char b[32]; + secp256k1_fe_t c = *a; + secp256k1_fe_normalize_var(&c); + secp256k1_fe_get_b32(b, &c); + secp256k1_num_set_bin(&n, b, 32); + secp256k1_num_set_bin(&m, prime, 32); + secp256k1_num_mod_inverse(&n, &n, &m); + secp256k1_num_get_bin(b, 32, &n); + VERIFY_CHECK(secp256k1_fe_set_b32(r, b)); +#else +#error "Please select field inverse implementation" +#endif +} + +static void secp256k1_fe_inv_all_var(size_t len, secp256k1_fe_t *r, const secp256k1_fe_t *a) { + secp256k1_fe_t u; + size_t i; + if (len < 1) { + return; + } + + VERIFY_CHECK((r + len <= a) || (a + len <= r)); + + r[0] = a[0]; + + i = 0; + while (++i < len) { + secp256k1_fe_mul(&r[i], &r[i - 1], &a[i]); + } + + secp256k1_fe_inv_var(&u, &r[--i]); + + while (i > 0) { + int j = i--; + secp256k1_fe_mul(&r[j], &r[i], &u); + secp256k1_fe_mul(&u, &u, &a[j]); + } + + r[0] = u; +} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/group.h b/src/cryptoconditions/src/include/secp256k1/src/group.h new file mode 100644 index 00000000000..0b08b3b9910 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/group.h @@ -0,0 +1,121 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_GROUP_ +#define _SECP256K1_GROUP_ + +#include "num.h" +#include "field.h" + +/** A group element of the secp256k1 curve, in affine coordinates. */ +typedef struct { + secp256k1_fe_t x; + secp256k1_fe_t y; + int infinity; /* whether this represents the point at infinity */ +} secp256k1_ge_t; + +#define SECP256K1_GE_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) {SECP256K1_FE_CONST((a),(b),(c),(d),(e),(f),(g),(h)), SECP256K1_FE_CONST((i),(j),(k),(l),(m),(n),(o),(p)), 0} +#define SECP256K1_GE_CONST_INFINITY {SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), 1} + +/** A group element of the secp256k1 curve, in jacobian coordinates. */ +typedef struct { + secp256k1_fe_t x; /* actual X: x/z^2 */ + secp256k1_fe_t y; /* actual Y: y/z^3 */ + secp256k1_fe_t z; + int infinity; /* whether this represents the point at infinity */ +} secp256k1_gej_t; + +#define SECP256K1_GEJ_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) {SECP256K1_FE_CONST((a),(b),(c),(d),(e),(f),(g),(h)), SECP256K1_FE_CONST((i),(j),(k),(l),(m),(n),(o),(p)), SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1), 0} +#define SECP256K1_GEJ_CONST_INFINITY {SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 0), 1} + +typedef struct { + secp256k1_fe_storage_t x; + secp256k1_fe_storage_t y; +} secp256k1_ge_storage_t; + +#define SECP256K1_GE_STORAGE_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) {SECP256K1_FE_STORAGE_CONST((a),(b),(c),(d),(e),(f),(g),(h)), SECP256K1_FE_STORAGE_CONST((i),(j),(k),(l),(m),(n),(o),(p))} + +/** Set a group element equal to the point at infinity */ +static void secp256k1_ge_set_infinity(secp256k1_ge_t *r); + +/** Set a group element equal to the point with given X and Y coordinates */ +static void secp256k1_ge_set_xy(secp256k1_ge_t *r, const secp256k1_fe_t *x, const secp256k1_fe_t *y); + +/** Set a group element (affine) equal to the point with the given X coordinate, and given oddness + * for Y. Return value indicates whether the result is valid. */ +static int secp256k1_ge_set_xo_var(secp256k1_ge_t *r, const secp256k1_fe_t *x, int odd); + +/** Check whether a group element is the point at infinity. */ +static int secp256k1_ge_is_infinity(const secp256k1_ge_t *a); + +/** Check whether a group element is valid (i.e., on the curve). */ +static int secp256k1_ge_is_valid_var(const secp256k1_ge_t *a); + +static void secp256k1_ge_neg(secp256k1_ge_t *r, const secp256k1_ge_t *a); + +/** Set a group element equal to another which is given in jacobian coordinates */ +static void secp256k1_ge_set_gej(secp256k1_ge_t *r, secp256k1_gej_t *a); + +/** Set a batch of group elements equal to the inputs given in jacobian coordinates */ +static void secp256k1_ge_set_all_gej_var(size_t len, secp256k1_ge_t *r, const secp256k1_gej_t *a); + + +/** Set a group element (jacobian) equal to the point at infinity. */ +static void secp256k1_gej_set_infinity(secp256k1_gej_t *r); + +/** Set a group element (jacobian) equal to the point with given X and Y coordinates. */ +static void secp256k1_gej_set_xy(secp256k1_gej_t *r, const secp256k1_fe_t *x, const secp256k1_fe_t *y); + +/** Set a group element (jacobian) equal to another which is given in affine coordinates. */ +static void secp256k1_gej_set_ge(secp256k1_gej_t *r, const secp256k1_ge_t *a); + +/** Compare the X coordinate of a group element (jacobian). */ +static int secp256k1_gej_eq_x_var(const secp256k1_fe_t *x, const secp256k1_gej_t *a); + +/** Set r equal to the inverse of a (i.e., mirrored around the X axis) */ +static void secp256k1_gej_neg(secp256k1_gej_t *r, const secp256k1_gej_t *a); + +/** Check whether a group element is the point at infinity. */ +static int secp256k1_gej_is_infinity(const secp256k1_gej_t *a); + +/** Set r equal to the double of a. */ +static void secp256k1_gej_double_var(secp256k1_gej_t *r, const secp256k1_gej_t *a); + +/** Set r equal to the sum of a and b. */ +static void secp256k1_gej_add_var(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_gej_t *b); + +/** Set r equal to the sum of a and b (with b given in affine coordinates, and not infinity). */ +static void secp256k1_gej_add_ge(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_ge_t *b); + +/** Set r equal to the sum of a and b (with b given in affine coordinates). This is more efficient + than secp256k1_gej_add_var. It is identical to secp256k1_gej_add_ge but without constant-time + guarantee, and b is allowed to be infinity. */ +static void secp256k1_gej_add_ge_var(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_ge_t *b); + +#ifdef USE_ENDOMORPHISM +/** Set r to be equal to lambda times a, where lambda is chosen in a way such that this is very fast. */ +static void secp256k1_gej_mul_lambda(secp256k1_gej_t *r, const secp256k1_gej_t *a); +#endif + +/** Clear a secp256k1_gej_t to prevent leaking sensitive information. */ +static void secp256k1_gej_clear(secp256k1_gej_t *r); + +/** Clear a secp256k1_ge_t to prevent leaking sensitive information. */ +static void secp256k1_ge_clear(secp256k1_ge_t *r); + +/** Convert a group element to the storage type. */ +static void secp256k1_ge_to_storage(secp256k1_ge_storage_t *r, const secp256k1_ge_t*); + +/** Convert a group element back from the storage type. */ +static void secp256k1_ge_from_storage(secp256k1_ge_t *r, const secp256k1_ge_storage_t*); + +/** If flag is true, set *r equal to *a; otherwise leave it. Constant-time. */ +static void secp256k1_ge_storage_cmov(secp256k1_ge_storage_t *r, const secp256k1_ge_storage_t *a, int flag); + +/** Rescale a jacobian point by b which must be non-zero. Constant-time. */ +static void secp256k1_gej_rescale(secp256k1_gej_t *r, const secp256k1_fe_t *b); + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/group_impl.h b/src/cryptoconditions/src/include/secp256k1/src/group_impl.h new file mode 100644 index 00000000000..0f64576fbb5 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/group_impl.h @@ -0,0 +1,443 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_GROUP_IMPL_H_ +#define _SECP256K1_GROUP_IMPL_H_ + +#include + +#include "num.h" +#include "field.h" +#include "group.h" + +/** Generator for secp256k1, value 'g' defined in + * "Standards for Efficient Cryptography" (SEC2) 2.7.1. + */ +static const secp256k1_ge_t secp256k1_ge_const_g = SECP256K1_GE_CONST( + 0x79BE667EUL, 0xF9DCBBACUL, 0x55A06295UL, 0xCE870B07UL, + 0x029BFCDBUL, 0x2DCE28D9UL, 0x59F2815BUL, 0x16F81798UL, + 0x483ADA77UL, 0x26A3C465UL, 0x5DA4FBFCUL, 0x0E1108A8UL, + 0xFD17B448UL, 0xA6855419UL, 0x9C47D08FUL, 0xFB10D4B8UL +); + +static void secp256k1_ge_set_infinity(secp256k1_ge_t *r) { + r->infinity = 1; +} + +static void secp256k1_ge_set_xy(secp256k1_ge_t *r, const secp256k1_fe_t *x, const secp256k1_fe_t *y) { + r->infinity = 0; + r->x = *x; + r->y = *y; +} + +static int secp256k1_ge_is_infinity(const secp256k1_ge_t *a) { + return a->infinity; +} + +static void secp256k1_ge_neg(secp256k1_ge_t *r, const secp256k1_ge_t *a) { + *r = *a; + secp256k1_fe_normalize_weak(&r->y); + secp256k1_fe_negate(&r->y, &r->y, 1); +} + +static void secp256k1_ge_set_gej(secp256k1_ge_t *r, secp256k1_gej_t *a) { + secp256k1_fe_t z2, z3; + r->infinity = a->infinity; + secp256k1_fe_inv(&a->z, &a->z); + secp256k1_fe_sqr(&z2, &a->z); + secp256k1_fe_mul(&z3, &a->z, &z2); + secp256k1_fe_mul(&a->x, &a->x, &z2); + secp256k1_fe_mul(&a->y, &a->y, &z3); + secp256k1_fe_set_int(&a->z, 1); + r->x = a->x; + r->y = a->y; +} + +static void secp256k1_ge_set_gej_var(secp256k1_ge_t *r, secp256k1_gej_t *a) { + secp256k1_fe_t z2, z3; + r->infinity = a->infinity; + if (a->infinity) { + return; + } + secp256k1_fe_inv_var(&a->z, &a->z); + secp256k1_fe_sqr(&z2, &a->z); + secp256k1_fe_mul(&z3, &a->z, &z2); + secp256k1_fe_mul(&a->x, &a->x, &z2); + secp256k1_fe_mul(&a->y, &a->y, &z3); + secp256k1_fe_set_int(&a->z, 1); + r->x = a->x; + r->y = a->y; +} + +static void secp256k1_ge_set_all_gej_var(size_t len, secp256k1_ge_t *r, const secp256k1_gej_t *a) { + secp256k1_fe_t *az; + secp256k1_fe_t *azi; + size_t i; + size_t count = 0; + az = (secp256k1_fe_t *)checked_malloc(sizeof(secp256k1_fe_t) * len); + for (i = 0; i < len; i++) { + if (!a[i].infinity) { + az[count++] = a[i].z; + } + } + + azi = (secp256k1_fe_t *)checked_malloc(sizeof(secp256k1_fe_t) * count); + secp256k1_fe_inv_all_var(count, azi, az); + free(az); + + count = 0; + for (i = 0; i < len; i++) { + r[i].infinity = a[i].infinity; + if (!a[i].infinity) { + secp256k1_fe_t zi2, zi3; + secp256k1_fe_t *zi = &azi[count++]; + secp256k1_fe_sqr(&zi2, zi); + secp256k1_fe_mul(&zi3, &zi2, zi); + secp256k1_fe_mul(&r[i].x, &a[i].x, &zi2); + secp256k1_fe_mul(&r[i].y, &a[i].y, &zi3); + } + } + free(azi); +} + +static void secp256k1_gej_set_infinity(secp256k1_gej_t *r) { + r->infinity = 1; + secp256k1_fe_set_int(&r->x, 0); + secp256k1_fe_set_int(&r->y, 0); + secp256k1_fe_set_int(&r->z, 0); +} + +static void secp256k1_gej_set_xy(secp256k1_gej_t *r, const secp256k1_fe_t *x, const secp256k1_fe_t *y) { + r->infinity = 0; + r->x = *x; + r->y = *y; + secp256k1_fe_set_int(&r->z, 1); +} + +static void secp256k1_gej_clear(secp256k1_gej_t *r) { + r->infinity = 0; + secp256k1_fe_clear(&r->x); + secp256k1_fe_clear(&r->y); + secp256k1_fe_clear(&r->z); +} + +static void secp256k1_ge_clear(secp256k1_ge_t *r) { + r->infinity = 0; + secp256k1_fe_clear(&r->x); + secp256k1_fe_clear(&r->y); +} + +static int secp256k1_ge_set_xo_var(secp256k1_ge_t *r, const secp256k1_fe_t *x, int odd) { + secp256k1_fe_t x2, x3, c; + r->x = *x; + secp256k1_fe_sqr(&x2, x); + secp256k1_fe_mul(&x3, x, &x2); + r->infinity = 0; + secp256k1_fe_set_int(&c, 7); + secp256k1_fe_add(&c, &x3); + if (!secp256k1_fe_sqrt_var(&r->y, &c)) { + return 0; + } + secp256k1_fe_normalize_var(&r->y); + if (secp256k1_fe_is_odd(&r->y) != odd) { + secp256k1_fe_negate(&r->y, &r->y, 1); + } + return 1; +} + +static void secp256k1_gej_set_ge(secp256k1_gej_t *r, const secp256k1_ge_t *a) { + r->infinity = a->infinity; + r->x = a->x; + r->y = a->y; + secp256k1_fe_set_int(&r->z, 1); +} + +static int secp256k1_gej_eq_x_var(const secp256k1_fe_t *x, const secp256k1_gej_t *a) { + secp256k1_fe_t r, r2; + VERIFY_CHECK(!a->infinity); + secp256k1_fe_sqr(&r, &a->z); secp256k1_fe_mul(&r, &r, x); + r2 = a->x; secp256k1_fe_normalize_weak(&r2); + return secp256k1_fe_equal_var(&r, &r2); +} + +static void secp256k1_gej_neg(secp256k1_gej_t *r, const secp256k1_gej_t *a) { + r->infinity = a->infinity; + r->x = a->x; + r->y = a->y; + r->z = a->z; + secp256k1_fe_normalize_weak(&r->y); + secp256k1_fe_negate(&r->y, &r->y, 1); +} + +static int secp256k1_gej_is_infinity(const secp256k1_gej_t *a) { + return a->infinity; +} + +static int secp256k1_gej_is_valid_var(const secp256k1_gej_t *a) { + secp256k1_fe_t y2, x3, z2, z6; + if (a->infinity) { + return 0; + } + /** y^2 = x^3 + 7 + * (Y/Z^3)^2 = (X/Z^2)^3 + 7 + * Y^2 / Z^6 = X^3 / Z^6 + 7 + * Y^2 = X^3 + 7*Z^6 + */ + secp256k1_fe_sqr(&y2, &a->y); + secp256k1_fe_sqr(&x3, &a->x); secp256k1_fe_mul(&x3, &x3, &a->x); + secp256k1_fe_sqr(&z2, &a->z); + secp256k1_fe_sqr(&z6, &z2); secp256k1_fe_mul(&z6, &z6, &z2); + secp256k1_fe_mul_int(&z6, 7); + secp256k1_fe_add(&x3, &z6); + secp256k1_fe_normalize_weak(&x3); + return secp256k1_fe_equal_var(&y2, &x3); +} + +static int secp256k1_ge_is_valid_var(const secp256k1_ge_t *a) { + secp256k1_fe_t y2, x3, c; + if (a->infinity) { + return 0; + } + /* y^2 = x^3 + 7 */ + secp256k1_fe_sqr(&y2, &a->y); + secp256k1_fe_sqr(&x3, &a->x); secp256k1_fe_mul(&x3, &x3, &a->x); + secp256k1_fe_set_int(&c, 7); + secp256k1_fe_add(&x3, &c); + secp256k1_fe_normalize_weak(&x3); + return secp256k1_fe_equal_var(&y2, &x3); +} + +static void secp256k1_gej_double_var(secp256k1_gej_t *r, const secp256k1_gej_t *a) { + /* Operations: 3 mul, 4 sqr, 0 normalize, 12 mul_int/add/negate */ + secp256k1_fe_t t1,t2,t3,t4; + /** For secp256k1, 2Q is infinity if and only if Q is infinity. This is because if 2Q = infinity, + * Q must equal -Q, or that Q.y == -(Q.y), or Q.y is 0. For a point on y^2 = x^3 + 7 to have + * y=0, x^3 must be -7 mod p. However, -7 has no cube root mod p. + */ + r->infinity = a->infinity; + if (r->infinity) { + return; + } + + secp256k1_fe_mul(&r->z, &a->z, &a->y); + secp256k1_fe_mul_int(&r->z, 2); /* Z' = 2*Y*Z (2) */ + secp256k1_fe_sqr(&t1, &a->x); + secp256k1_fe_mul_int(&t1, 3); /* T1 = 3*X^2 (3) */ + secp256k1_fe_sqr(&t2, &t1); /* T2 = 9*X^4 (1) */ + secp256k1_fe_sqr(&t3, &a->y); + secp256k1_fe_mul_int(&t3, 2); /* T3 = 2*Y^2 (2) */ + secp256k1_fe_sqr(&t4, &t3); + secp256k1_fe_mul_int(&t4, 2); /* T4 = 8*Y^4 (2) */ + secp256k1_fe_mul(&t3, &t3, &a->x); /* T3 = 2*X*Y^2 (1) */ + r->x = t3; + secp256k1_fe_mul_int(&r->x, 4); /* X' = 8*X*Y^2 (4) */ + secp256k1_fe_negate(&r->x, &r->x, 4); /* X' = -8*X*Y^2 (5) */ + secp256k1_fe_add(&r->x, &t2); /* X' = 9*X^4 - 8*X*Y^2 (6) */ + secp256k1_fe_negate(&t2, &t2, 1); /* T2 = -9*X^4 (2) */ + secp256k1_fe_mul_int(&t3, 6); /* T3 = 12*X*Y^2 (6) */ + secp256k1_fe_add(&t3, &t2); /* T3 = 12*X*Y^2 - 9*X^4 (8) */ + secp256k1_fe_mul(&r->y, &t1, &t3); /* Y' = 36*X^3*Y^2 - 27*X^6 (1) */ + secp256k1_fe_negate(&t2, &t4, 2); /* T2 = -8*Y^4 (3) */ + secp256k1_fe_add(&r->y, &t2); /* Y' = 36*X^3*Y^2 - 27*X^6 - 8*Y^4 (4) */ +} + +static void secp256k1_gej_add_var(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_gej_t *b) { + /* Operations: 12 mul, 4 sqr, 2 normalize, 12 mul_int/add/negate */ + secp256k1_fe_t z22, z12, u1, u2, s1, s2, h, i, i2, h2, h3, t; + if (a->infinity) { + *r = *b; + return; + } + if (b->infinity) { + *r = *a; + return; + } + r->infinity = 0; + secp256k1_fe_sqr(&z22, &b->z); + secp256k1_fe_sqr(&z12, &a->z); + secp256k1_fe_mul(&u1, &a->x, &z22); + secp256k1_fe_mul(&u2, &b->x, &z12); + secp256k1_fe_mul(&s1, &a->y, &z22); secp256k1_fe_mul(&s1, &s1, &b->z); + secp256k1_fe_mul(&s2, &b->y, &z12); secp256k1_fe_mul(&s2, &s2, &a->z); + secp256k1_fe_negate(&h, &u1, 1); secp256k1_fe_add(&h, &u2); + secp256k1_fe_negate(&i, &s1, 1); secp256k1_fe_add(&i, &s2); + if (secp256k1_fe_normalizes_to_zero_var(&h)) { + if (secp256k1_fe_normalizes_to_zero_var(&i)) { + secp256k1_gej_double_var(r, a); + } else { + r->infinity = 1; + } + return; + } + secp256k1_fe_sqr(&i2, &i); + secp256k1_fe_sqr(&h2, &h); + secp256k1_fe_mul(&h3, &h, &h2); + secp256k1_fe_mul(&r->z, &a->z, &b->z); secp256k1_fe_mul(&r->z, &r->z, &h); + secp256k1_fe_mul(&t, &u1, &h2); + r->x = t; secp256k1_fe_mul_int(&r->x, 2); secp256k1_fe_add(&r->x, &h3); secp256k1_fe_negate(&r->x, &r->x, 3); secp256k1_fe_add(&r->x, &i2); + secp256k1_fe_negate(&r->y, &r->x, 5); secp256k1_fe_add(&r->y, &t); secp256k1_fe_mul(&r->y, &r->y, &i); + secp256k1_fe_mul(&h3, &h3, &s1); secp256k1_fe_negate(&h3, &h3, 1); + secp256k1_fe_add(&r->y, &h3); +} + +static void secp256k1_gej_add_ge_var(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_ge_t *b) { + /* 8 mul, 3 sqr, 4 normalize, 12 mul_int/add/negate */ + secp256k1_fe_t z12, u1, u2, s1, s2, h, i, i2, h2, h3, t; + if (a->infinity) { + r->infinity = b->infinity; + r->x = b->x; + r->y = b->y; + secp256k1_fe_set_int(&r->z, 1); + return; + } + if (b->infinity) { + *r = *a; + return; + } + r->infinity = 0; + secp256k1_fe_sqr(&z12, &a->z); + u1 = a->x; secp256k1_fe_normalize_weak(&u1); + secp256k1_fe_mul(&u2, &b->x, &z12); + s1 = a->y; secp256k1_fe_normalize_weak(&s1); + secp256k1_fe_mul(&s2, &b->y, &z12); secp256k1_fe_mul(&s2, &s2, &a->z); + secp256k1_fe_negate(&h, &u1, 1); secp256k1_fe_add(&h, &u2); + secp256k1_fe_negate(&i, &s1, 1); secp256k1_fe_add(&i, &s2); + if (secp256k1_fe_normalizes_to_zero_var(&h)) { + if (secp256k1_fe_normalizes_to_zero_var(&i)) { + secp256k1_gej_double_var(r, a); + } else { + r->infinity = 1; + } + return; + } + secp256k1_fe_sqr(&i2, &i); + secp256k1_fe_sqr(&h2, &h); + secp256k1_fe_mul(&h3, &h, &h2); + r->z = a->z; secp256k1_fe_mul(&r->z, &r->z, &h); + secp256k1_fe_mul(&t, &u1, &h2); + r->x = t; secp256k1_fe_mul_int(&r->x, 2); secp256k1_fe_add(&r->x, &h3); secp256k1_fe_negate(&r->x, &r->x, 3); secp256k1_fe_add(&r->x, &i2); + secp256k1_fe_negate(&r->y, &r->x, 5); secp256k1_fe_add(&r->y, &t); secp256k1_fe_mul(&r->y, &r->y, &i); + secp256k1_fe_mul(&h3, &h3, &s1); secp256k1_fe_negate(&h3, &h3, 1); + secp256k1_fe_add(&r->y, &h3); +} + +static void secp256k1_gej_add_ge(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_ge_t *b) { + /* Operations: 7 mul, 5 sqr, 5 normalize, 17 mul_int/add/negate/cmov */ + static const secp256k1_fe_t fe_1 = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1); + secp256k1_fe_t zz, u1, u2, s1, s2, z, t, m, n, q, rr; + int infinity; + VERIFY_CHECK(!b->infinity); + VERIFY_CHECK(a->infinity == 0 || a->infinity == 1); + + /** In: + * Eric Brier and Marc Joye, Weierstrass Elliptic Curves and Side-Channel Attacks. + * In D. Naccache and P. Paillier, Eds., Public Key Cryptography, vol. 2274 of Lecture Notes in Computer Science, pages 335-345. Springer-Verlag, 2002. + * we find as solution for a unified addition/doubling formula: + * lambda = ((x1 + x2)^2 - x1 * x2 + a) / (y1 + y2), with a = 0 for secp256k1's curve equation. + * x3 = lambda^2 - (x1 + x2) + * 2*y3 = lambda * (x1 + x2 - 2 * x3) - (y1 + y2). + * + * Substituting x_i = Xi / Zi^2 and yi = Yi / Zi^3, for i=1,2,3, gives: + * U1 = X1*Z2^2, U2 = X2*Z1^2 + * S1 = Y1*Z2^3, S2 = Y2*Z1^3 + * Z = Z1*Z2 + * T = U1+U2 + * M = S1+S2 + * Q = T*M^2 + * R = T^2-U1*U2 + * X3 = 4*(R^2-Q) + * Y3 = 4*(R*(3*Q-2*R^2)-M^4) + * Z3 = 2*M*Z + * (Note that the paper uses xi = Xi / Zi and yi = Yi / Zi instead.) + */ + + secp256k1_fe_sqr(&zz, &a->z); /* z = Z1^2 */ + u1 = a->x; secp256k1_fe_normalize_weak(&u1); /* u1 = U1 = X1*Z2^2 (1) */ + secp256k1_fe_mul(&u2, &b->x, &zz); /* u2 = U2 = X2*Z1^2 (1) */ + s1 = a->y; secp256k1_fe_normalize_weak(&s1); /* s1 = S1 = Y1*Z2^3 (1) */ + secp256k1_fe_mul(&s2, &b->y, &zz); /* s2 = Y2*Z2^2 (1) */ + secp256k1_fe_mul(&s2, &s2, &a->z); /* s2 = S2 = Y2*Z1^3 (1) */ + z = a->z; /* z = Z = Z1*Z2 (8) */ + t = u1; secp256k1_fe_add(&t, &u2); /* t = T = U1+U2 (2) */ + m = s1; secp256k1_fe_add(&m, &s2); /* m = M = S1+S2 (2) */ + secp256k1_fe_sqr(&n, &m); /* n = M^2 (1) */ + secp256k1_fe_mul(&q, &n, &t); /* q = Q = T*M^2 (1) */ + secp256k1_fe_sqr(&n, &n); /* n = M^4 (1) */ + secp256k1_fe_sqr(&rr, &t); /* rr = T^2 (1) */ + secp256k1_fe_mul(&t, &u1, &u2); secp256k1_fe_negate(&t, &t, 1); /* t = -U1*U2 (2) */ + secp256k1_fe_add(&rr, &t); /* rr = R = T^2-U1*U2 (3) */ + secp256k1_fe_sqr(&t, &rr); /* t = R^2 (1) */ + secp256k1_fe_mul(&r->z, &m, &z); /* r->z = M*Z (1) */ + infinity = secp256k1_fe_normalizes_to_zero(&r->z) * (1 - a->infinity); + secp256k1_fe_mul_int(&r->z, 2 * (1 - a->infinity)); /* r->z = Z3 = 2*M*Z (2) */ + r->x = t; /* r->x = R^2 (1) */ + secp256k1_fe_negate(&q, &q, 1); /* q = -Q (2) */ + secp256k1_fe_add(&r->x, &q); /* r->x = R^2-Q (3) */ + secp256k1_fe_normalize(&r->x); + secp256k1_fe_mul_int(&q, 3); /* q = -3*Q (6) */ + secp256k1_fe_mul_int(&t, 2); /* t = 2*R^2 (2) */ + secp256k1_fe_add(&t, &q); /* t = 2*R^2-3*Q (8) */ + secp256k1_fe_mul(&t, &t, &rr); /* t = R*(2*R^2-3*Q) (1) */ + secp256k1_fe_add(&t, &n); /* t = R*(2*R^2-3*Q)+M^4 (2) */ + secp256k1_fe_negate(&r->y, &t, 2); /* r->y = R*(3*Q-2*R^2)-M^4 (3) */ + secp256k1_fe_normalize_weak(&r->y); + secp256k1_fe_mul_int(&r->x, 4 * (1 - a->infinity)); /* r->x = X3 = 4*(R^2-Q) */ + secp256k1_fe_mul_int(&r->y, 4 * (1 - a->infinity)); /* r->y = Y3 = 4*R*(3*Q-2*R^2)-4*M^4 (4) */ + + /** In case a->infinity == 1, the above code results in r->x, r->y, and r->z all equal to 0. + * Replace r with b->x, b->y, 1 in that case. + */ + secp256k1_fe_cmov(&r->x, &b->x, a->infinity); + secp256k1_fe_cmov(&r->y, &b->y, a->infinity); + secp256k1_fe_cmov(&r->z, &fe_1, a->infinity); + r->infinity = infinity; +} + +static void secp256k1_gej_rescale(secp256k1_gej_t *r, const secp256k1_fe_t *s) { + /* Operations: 4 mul, 1 sqr */ + secp256k1_fe_t zz; + VERIFY_CHECK(!secp256k1_fe_is_zero(s)); + secp256k1_fe_sqr(&zz, s); + secp256k1_fe_mul(&r->x, &r->x, &zz); /* r->x *= s^2 */ + secp256k1_fe_mul(&r->y, &r->y, &zz); + secp256k1_fe_mul(&r->y, &r->y, s); /* r->y *= s^3 */ + secp256k1_fe_mul(&r->z, &r->z, s); /* r->z *= s */ +} + +static void secp256k1_ge_to_storage(secp256k1_ge_storage_t *r, const secp256k1_ge_t *a) { + secp256k1_fe_t x, y; + VERIFY_CHECK(!a->infinity); + x = a->x; + secp256k1_fe_normalize(&x); + y = a->y; + secp256k1_fe_normalize(&y); + secp256k1_fe_to_storage(&r->x, &x); + secp256k1_fe_to_storage(&r->y, &y); +} + +static void secp256k1_ge_from_storage(secp256k1_ge_t *r, const secp256k1_ge_storage_t *a) { + secp256k1_fe_from_storage(&r->x, &a->x); + secp256k1_fe_from_storage(&r->y, &a->y); + r->infinity = 0; +} + +static SECP256K1_INLINE void secp256k1_ge_storage_cmov(secp256k1_ge_storage_t *r, const secp256k1_ge_storage_t *a, int flag) { + secp256k1_fe_storage_cmov(&r->x, &a->x, flag); + secp256k1_fe_storage_cmov(&r->y, &a->y, flag); +} + +#ifdef USE_ENDOMORPHISM +static void secp256k1_gej_mul_lambda(secp256k1_gej_t *r, const secp256k1_gej_t *a) { + static const secp256k1_fe_t beta = SECP256K1_FE_CONST( + 0x7ae96a2bul, 0x657c0710ul, 0x6e64479eul, 0xac3434e9ul, + 0x9cf04975ul, 0x12f58995ul, 0xc1396c28ul, 0x719501eeul + ); + *r = *a; + secp256k1_fe_mul(&r->x, &r->x, &beta); +} +#endif + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/hash.h b/src/cryptoconditions/src/include/secp256k1/src/hash.h new file mode 100644 index 00000000000..843423d7f70 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/hash.h @@ -0,0 +1,41 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_HASH_ +#define _SECP256K1_HASH_ + +#include +#include + +typedef struct { + uint32_t s[32]; + uint32_t buf[16]; /* In big endian */ + size_t bytes; +} secp256k1_sha256_t; + +static void secp256k1_sha256_initialize(secp256k1_sha256_t *hash); +static void secp256k1_sha256_write(secp256k1_sha256_t *hash, const unsigned char *data, size_t size); +static void secp256k1_sha256_finalize(secp256k1_sha256_t *hash, unsigned char *out32); + +typedef struct { + secp256k1_sha256_t inner, outer; +} secp256k1_hmac_sha256_t; + +static void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256_t *hash, const unsigned char *key, size_t size); +static void secp256k1_hmac_sha256_write(secp256k1_hmac_sha256_t *hash, const unsigned char *data, size_t size); +static void secp256k1_hmac_sha256_finalize(secp256k1_hmac_sha256_t *hash, unsigned char *out32); + +typedef struct { + unsigned char v[32]; + unsigned char k[32]; + int retry; +} secp256k1_rfc6979_hmac_sha256_t; + +static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256_t *rng, const unsigned char *key, size_t keylen, const unsigned char *msg, size_t msglen, const unsigned char *rnd, size_t rndlen); +static void secp256k1_rfc6979_hmac_sha256_generate(secp256k1_rfc6979_hmac_sha256_t *rng, unsigned char *out, size_t outlen); +static void secp256k1_rfc6979_hmac_sha256_finalize(secp256k1_rfc6979_hmac_sha256_t *rng); + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/hash_impl.h b/src/cryptoconditions/src/include/secp256k1/src/hash_impl.h new file mode 100644 index 00000000000..9828827bcdb --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/hash_impl.h @@ -0,0 +1,293 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_HASH_IMPL_H_ +#define _SECP256K1_HASH_IMPL_H_ + +#include "hash.h" + +#include +#include +#include + +#define Ch(x,y,z) ((z) ^ ((x) & ((y) ^ (z)))) +#define Maj(x,y,z) (((x) & (y)) | ((z) & ((x) | (y)))) +#define Sigma0(x) (((x) >> 2 | (x) << 30) ^ ((x) >> 13 | (x) << 19) ^ ((x) >> 22 | (x) << 10)) +#define Sigma1(x) (((x) >> 6 | (x) << 26) ^ ((x) >> 11 | (x) << 21) ^ ((x) >> 25 | (x) << 7)) +#define sigma0(x) (((x) >> 7 | (x) << 25) ^ ((x) >> 18 | (x) << 14) ^ ((x) >> 3)) +#define sigma1(x) (((x) >> 17 | (x) << 15) ^ ((x) >> 19 | (x) << 13) ^ ((x) >> 10)) + +#define Round(a,b,c,d,e,f,g,h,k,w) do { \ + uint32_t t1 = (h) + Sigma1(e) + Ch((e), (f), (g)) + (k) + (w); \ + uint32_t t2 = Sigma0(a) + Maj((a), (b), (c)); \ + (d) += t1; \ + (h) = t1 + t2; \ +} while(0) + +#ifdef WORDS_BIGENDIAN +#define BE32(x) (x) +#else +#define BE32(p) ((((p) & 0xFF) << 24) | (((p) & 0xFF00) << 8) | (((p) & 0xFF0000) >> 8) | (((p) & 0xFF000000) >> 24)) +#endif + +static void secp256k1_sha256_initialize(secp256k1_sha256_t *hash) { + hash->s[0] = 0x6a09e667ul; + hash->s[1] = 0xbb67ae85ul; + hash->s[2] = 0x3c6ef372ul; + hash->s[3] = 0xa54ff53aul; + hash->s[4] = 0x510e527ful; + hash->s[5] = 0x9b05688cul; + hash->s[6] = 0x1f83d9abul; + hash->s[7] = 0x5be0cd19ul; + hash->bytes = 0; +} + +/** Perform one SHA-256 transformation, processing 16 big endian 32-bit words. */ +static void secp256k1_sha256_transform(uint32_t* s, const uint32_t* chunk) { + uint32_t a = s[0], b = s[1], c = s[2], d = s[3], e = s[4], f = s[5], g = s[6], h = s[7]; + uint32_t w0, w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12, w13, w14, w15; + + Round(a, b, c, d, e, f, g, h, 0x428a2f98, w0 = BE32(chunk[0])); + Round(h, a, b, c, d, e, f, g, 0x71374491, w1 = BE32(chunk[1])); + Round(g, h, a, b, c, d, e, f, 0xb5c0fbcf, w2 = BE32(chunk[2])); + Round(f, g, h, a, b, c, d, e, 0xe9b5dba5, w3 = BE32(chunk[3])); + Round(e, f, g, h, a, b, c, d, 0x3956c25b, w4 = BE32(chunk[4])); + Round(d, e, f, g, h, a, b, c, 0x59f111f1, w5 = BE32(chunk[5])); + Round(c, d, e, f, g, h, a, b, 0x923f82a4, w6 = BE32(chunk[6])); + Round(b, c, d, e, f, g, h, a, 0xab1c5ed5, w7 = BE32(chunk[7])); + Round(a, b, c, d, e, f, g, h, 0xd807aa98, w8 = BE32(chunk[8])); + Round(h, a, b, c, d, e, f, g, 0x12835b01, w9 = BE32(chunk[9])); + Round(g, h, a, b, c, d, e, f, 0x243185be, w10 = BE32(chunk[10])); + Round(f, g, h, a, b, c, d, e, 0x550c7dc3, w11 = BE32(chunk[11])); + Round(e, f, g, h, a, b, c, d, 0x72be5d74, w12 = BE32(chunk[12])); + Round(d, e, f, g, h, a, b, c, 0x80deb1fe, w13 = BE32(chunk[13])); + Round(c, d, e, f, g, h, a, b, 0x9bdc06a7, w14 = BE32(chunk[14])); + Round(b, c, d, e, f, g, h, a, 0xc19bf174, w15 = BE32(chunk[15])); + + Round(a, b, c, d, e, f, g, h, 0xe49b69c1, w0 += sigma1(w14) + w9 + sigma0(w1)); + Round(h, a, b, c, d, e, f, g, 0xefbe4786, w1 += sigma1(w15) + w10 + sigma0(w2)); + Round(g, h, a, b, c, d, e, f, 0x0fc19dc6, w2 += sigma1(w0) + w11 + sigma0(w3)); + Round(f, g, h, a, b, c, d, e, 0x240ca1cc, w3 += sigma1(w1) + w12 + sigma0(w4)); + Round(e, f, g, h, a, b, c, d, 0x2de92c6f, w4 += sigma1(w2) + w13 + sigma0(w5)); + Round(d, e, f, g, h, a, b, c, 0x4a7484aa, w5 += sigma1(w3) + w14 + sigma0(w6)); + Round(c, d, e, f, g, h, a, b, 0x5cb0a9dc, w6 += sigma1(w4) + w15 + sigma0(w7)); + Round(b, c, d, e, f, g, h, a, 0x76f988da, w7 += sigma1(w5) + w0 + sigma0(w8)); + Round(a, b, c, d, e, f, g, h, 0x983e5152, w8 += sigma1(w6) + w1 + sigma0(w9)); + Round(h, a, b, c, d, e, f, g, 0xa831c66d, w9 += sigma1(w7) + w2 + sigma0(w10)); + Round(g, h, a, b, c, d, e, f, 0xb00327c8, w10 += sigma1(w8) + w3 + sigma0(w11)); + Round(f, g, h, a, b, c, d, e, 0xbf597fc7, w11 += sigma1(w9) + w4 + sigma0(w12)); + Round(e, f, g, h, a, b, c, d, 0xc6e00bf3, w12 += sigma1(w10) + w5 + sigma0(w13)); + Round(d, e, f, g, h, a, b, c, 0xd5a79147, w13 += sigma1(w11) + w6 + sigma0(w14)); + Round(c, d, e, f, g, h, a, b, 0x06ca6351, w14 += sigma1(w12) + w7 + sigma0(w15)); + Round(b, c, d, e, f, g, h, a, 0x14292967, w15 += sigma1(w13) + w8 + sigma0(w0)); + + Round(a, b, c, d, e, f, g, h, 0x27b70a85, w0 += sigma1(w14) + w9 + sigma0(w1)); + Round(h, a, b, c, d, e, f, g, 0x2e1b2138, w1 += sigma1(w15) + w10 + sigma0(w2)); + Round(g, h, a, b, c, d, e, f, 0x4d2c6dfc, w2 += sigma1(w0) + w11 + sigma0(w3)); + Round(f, g, h, a, b, c, d, e, 0x53380d13, w3 += sigma1(w1) + w12 + sigma0(w4)); + Round(e, f, g, h, a, b, c, d, 0x650a7354, w4 += sigma1(w2) + w13 + sigma0(w5)); + Round(d, e, f, g, h, a, b, c, 0x766a0abb, w5 += sigma1(w3) + w14 + sigma0(w6)); + Round(c, d, e, f, g, h, a, b, 0x81c2c92e, w6 += sigma1(w4) + w15 + sigma0(w7)); + Round(b, c, d, e, f, g, h, a, 0x92722c85, w7 += sigma1(w5) + w0 + sigma0(w8)); + Round(a, b, c, d, e, f, g, h, 0xa2bfe8a1, w8 += sigma1(w6) + w1 + sigma0(w9)); + Round(h, a, b, c, d, e, f, g, 0xa81a664b, w9 += sigma1(w7) + w2 + sigma0(w10)); + Round(g, h, a, b, c, d, e, f, 0xc24b8b70, w10 += sigma1(w8) + w3 + sigma0(w11)); + Round(f, g, h, a, b, c, d, e, 0xc76c51a3, w11 += sigma1(w9) + w4 + sigma0(w12)); + Round(e, f, g, h, a, b, c, d, 0xd192e819, w12 += sigma1(w10) + w5 + sigma0(w13)); + Round(d, e, f, g, h, a, b, c, 0xd6990624, w13 += sigma1(w11) + w6 + sigma0(w14)); + Round(c, d, e, f, g, h, a, b, 0xf40e3585, w14 += sigma1(w12) + w7 + sigma0(w15)); + Round(b, c, d, e, f, g, h, a, 0x106aa070, w15 += sigma1(w13) + w8 + sigma0(w0)); + + Round(a, b, c, d, e, f, g, h, 0x19a4c116, w0 += sigma1(w14) + w9 + sigma0(w1)); + Round(h, a, b, c, d, e, f, g, 0x1e376c08, w1 += sigma1(w15) + w10 + sigma0(w2)); + Round(g, h, a, b, c, d, e, f, 0x2748774c, w2 += sigma1(w0) + w11 + sigma0(w3)); + Round(f, g, h, a, b, c, d, e, 0x34b0bcb5, w3 += sigma1(w1) + w12 + sigma0(w4)); + Round(e, f, g, h, a, b, c, d, 0x391c0cb3, w4 += sigma1(w2) + w13 + sigma0(w5)); + Round(d, e, f, g, h, a, b, c, 0x4ed8aa4a, w5 += sigma1(w3) + w14 + sigma0(w6)); + Round(c, d, e, f, g, h, a, b, 0x5b9cca4f, w6 += sigma1(w4) + w15 + sigma0(w7)); + Round(b, c, d, e, f, g, h, a, 0x682e6ff3, w7 += sigma1(w5) + w0 + sigma0(w8)); + Round(a, b, c, d, e, f, g, h, 0x748f82ee, w8 += sigma1(w6) + w1 + sigma0(w9)); + Round(h, a, b, c, d, e, f, g, 0x78a5636f, w9 += sigma1(w7) + w2 + sigma0(w10)); + Round(g, h, a, b, c, d, e, f, 0x84c87814, w10 += sigma1(w8) + w3 + sigma0(w11)); + Round(f, g, h, a, b, c, d, e, 0x8cc70208, w11 += sigma1(w9) + w4 + sigma0(w12)); + Round(e, f, g, h, a, b, c, d, 0x90befffa, w12 += sigma1(w10) + w5 + sigma0(w13)); + Round(d, e, f, g, h, a, b, c, 0xa4506ceb, w13 += sigma1(w11) + w6 + sigma0(w14)); + Round(c, d, e, f, g, h, a, b, 0xbef9a3f7, w14 + sigma1(w12) + w7 + sigma0(w15)); + Round(b, c, d, e, f, g, h, a, 0xc67178f2, w15 + sigma1(w13) + w8 + sigma0(w0)); + + s[0] += a; + s[1] += b; + s[2] += c; + s[3] += d; + s[4] += e; + s[5] += f; + s[6] += g; + s[7] += h; +} + +static void secp256k1_sha256_write(secp256k1_sha256_t *hash, const unsigned char *data, size_t len) { + size_t bufsize = hash->bytes & 0x3F; + hash->bytes += len; + while (bufsize + len >= 64) { + /* Fill the buffer, and process it. */ + memcpy(((unsigned char*)hash->buf) + bufsize, data, 64 - bufsize); + data += 64 - bufsize; + len -= 64 - bufsize; + secp256k1_sha256_transform(hash->s, hash->buf); + bufsize = 0; + } + if (len) { + /* Fill the buffer with what remains. */ + memcpy(((unsigned char*)hash->buf) + bufsize, data, len); + } +} + +static void secp256k1_sha256_finalize(secp256k1_sha256_t *hash, unsigned char *out32) { + static const unsigned char pad[64] = {0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + uint32_t sizedesc[2]; + uint32_t out[8]; + int i = 0; + sizedesc[0] = BE32(hash->bytes >> 29); + sizedesc[1] = BE32(hash->bytes << 3); + secp256k1_sha256_write(hash, pad, 1 + ((119 - (hash->bytes % 64)) % 64)); + secp256k1_sha256_write(hash, (const unsigned char*)sizedesc, 8); + for (i = 0; i < 8; i++) { + out[i] = BE32(hash->s[i]); + hash->s[i] = 0; + } + memcpy(out32, (const unsigned char*)out, 32); +} + +static void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256_t *hash, const unsigned char *key, size_t keylen) { + int n; + unsigned char rkey[64]; + if (keylen <= 64) { + memcpy(rkey, key, keylen); + memset(rkey + keylen, 0, 64 - keylen); + } else { + secp256k1_sha256_t sha256; + secp256k1_sha256_initialize(&sha256); + secp256k1_sha256_write(&sha256, key, keylen); + secp256k1_sha256_finalize(&sha256, rkey); + memset(rkey + 32, 0, 32); + } + + secp256k1_sha256_initialize(&hash->outer); + for (n = 0; n < 64; n++) { + rkey[n] ^= 0x5c; + } + secp256k1_sha256_write(&hash->outer, rkey, 64); + + secp256k1_sha256_initialize(&hash->inner); + for (n = 0; n < 64; n++) { + rkey[n] ^= 0x5c ^ 0x36; + } + secp256k1_sha256_write(&hash->inner, rkey, 64); + memset(rkey, 0, 64); +} + +static void secp256k1_hmac_sha256_write(secp256k1_hmac_sha256_t *hash, const unsigned char *data, size_t size) { + secp256k1_sha256_write(&hash->inner, data, size); +} + +static void secp256k1_hmac_sha256_finalize(secp256k1_hmac_sha256_t *hash, unsigned char *out32) { + unsigned char temp[32]; + secp256k1_sha256_finalize(&hash->inner, temp); + secp256k1_sha256_write(&hash->outer, temp, 32); + memset(temp, 0, 32); + secp256k1_sha256_finalize(&hash->outer, out32); +} + + +static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha256_t *rng, const unsigned char *key, size_t keylen, const unsigned char *msg, size_t msglen, const unsigned char *rnd, size_t rndlen) { + secp256k1_hmac_sha256_t hmac; + static const unsigned char zero[1] = {0x00}; + static const unsigned char one[1] = {0x01}; + + memset(rng->v, 0x01, 32); /* RFC6979 3.2.b. */ + memset(rng->k, 0x00, 32); /* RFC6979 3.2.c. */ + + /* RFC6979 3.2.d. */ + secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); + secp256k1_hmac_sha256_write(&hmac, rng->v, 32); + secp256k1_hmac_sha256_write(&hmac, zero, 1); + secp256k1_hmac_sha256_write(&hmac, key, keylen); + secp256k1_hmac_sha256_write(&hmac, msg, msglen); + if (rnd && rndlen) { + /* RFC6979 3.6 "Additional data". */ + secp256k1_hmac_sha256_write(&hmac, rnd, rndlen); + } + secp256k1_hmac_sha256_finalize(&hmac, rng->k); + secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); + secp256k1_hmac_sha256_write(&hmac, rng->v, 32); + secp256k1_hmac_sha256_finalize(&hmac, rng->v); + + /* RFC6979 3.2.f. */ + secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); + secp256k1_hmac_sha256_write(&hmac, rng->v, 32); + secp256k1_hmac_sha256_write(&hmac, one, 1); + secp256k1_hmac_sha256_write(&hmac, key, keylen); + secp256k1_hmac_sha256_write(&hmac, msg, msglen); + if (rnd && rndlen) { + /* RFC6979 3.6 "Additional data". */ + secp256k1_hmac_sha256_write(&hmac, rnd, rndlen); + } + secp256k1_hmac_sha256_finalize(&hmac, rng->k); + secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); + secp256k1_hmac_sha256_write(&hmac, rng->v, 32); + secp256k1_hmac_sha256_finalize(&hmac, rng->v); + rng->retry = 0; +} + +static void secp256k1_rfc6979_hmac_sha256_generate(secp256k1_rfc6979_hmac_sha256_t *rng, unsigned char *out, size_t outlen) { + /* RFC6979 3.2.h. */ + static const unsigned char zero[1] = {0x00}; + if (rng->retry) { + secp256k1_hmac_sha256_t hmac; + secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); + secp256k1_hmac_sha256_write(&hmac, rng->v, 32); + secp256k1_hmac_sha256_write(&hmac, zero, 1); + secp256k1_hmac_sha256_finalize(&hmac, rng->k); + secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); + secp256k1_hmac_sha256_write(&hmac, rng->v, 32); + secp256k1_hmac_sha256_finalize(&hmac, rng->v); + } + + while (outlen > 0) { + secp256k1_hmac_sha256_t hmac; + int now = outlen; + secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32); + secp256k1_hmac_sha256_write(&hmac, rng->v, 32); + secp256k1_hmac_sha256_finalize(&hmac, rng->v); + if (now > 32) { + now = 32; + } + memcpy(out, rng->v, now); + out += now; + outlen -= now; + } + + rng->retry = 1; +} + +static void secp256k1_rfc6979_hmac_sha256_finalize(secp256k1_rfc6979_hmac_sha256_t *rng) { + memset(rng->k, 0, 32); + memset(rng->v, 0, 32); + rng->retry = 0; +} + + +#undef Round +#undef sigma0 +#undef sigma1 +#undef Sigma0 +#undef Sigma1 +#undef Ch +#undef Maj +#undef ReadBE32 +#undef WriteBE32 + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/java/org/bitcoin/NativeSecp256k1.java b/src/cryptoconditions/src/include/secp256k1/src/java/org/bitcoin/NativeSecp256k1.java new file mode 100644 index 00000000000..90a498eaa2c --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/java/org/bitcoin/NativeSecp256k1.java @@ -0,0 +1,60 @@ +package org.bitcoin; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +import com.google.common.base.Preconditions; + + +/** + * This class holds native methods to handle ECDSA verification. + * You can find an example library that can be used for this at + * https://github.com/sipa/secp256k1 + */ +public class NativeSecp256k1 { + public static final boolean enabled; + static { + boolean isEnabled = true; + try { + System.loadLibrary("javasecp256k1"); + } catch (UnsatisfiedLinkError e) { + isEnabled = false; + } + enabled = isEnabled; + } + + private static ThreadLocal nativeECDSABuffer = new ThreadLocal(); + /** + * Verifies the given secp256k1 signature in native code. + * Calling when enabled == false is undefined (probably library not loaded) + * + * @param data The data which was signed, must be exactly 32 bytes + * @param signature The signature + * @param pub The public key which did the signing + */ + public static boolean verify(byte[] data, byte[] signature, byte[] pub) { + Preconditions.checkArgument(data.length == 32 && signature.length <= 520 && pub.length <= 520); + + ByteBuffer byteBuff = nativeECDSABuffer.get(); + if (byteBuff == null) { + byteBuff = ByteBuffer.allocateDirect(32 + 8 + 520 + 520); + byteBuff.order(ByteOrder.nativeOrder()); + nativeECDSABuffer.set(byteBuff); + } + byteBuff.rewind(); + byteBuff.put(data); + byteBuff.putInt(signature.length); + byteBuff.putInt(pub.length); + byteBuff.put(signature); + byteBuff.put(pub); + return secp256k1_ecdsa_verify(byteBuff) == 1; + } + + /** + * @param byteBuff signature format is byte[32] data, + * native-endian int signatureLength, native-endian int pubkeyLength, + * byte[signatureLength] signature, byte[pubkeyLength] pub + * @returns 1 for valid signature, anything else for invalid + */ + private static native int secp256k1_ecdsa_verify(ByteBuffer byteBuff); +} diff --git a/src/cryptoconditions/src/include/secp256k1/src/java/org_bitcoin_NativeSecp256k1.c b/src/cryptoconditions/src/include/secp256k1/src/java/org_bitcoin_NativeSecp256k1.c new file mode 100644 index 00000000000..bb4cd707280 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/java/org_bitcoin_NativeSecp256k1.c @@ -0,0 +1,23 @@ +#include "org_bitcoin_NativeSecp256k1.h" +#include "include/secp256k1.h" + +JNIEXPORT jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1verify + (JNIEnv* env, jclass classObject, jobject byteBufferObject) +{ + unsigned char* data = (unsigned char*) (*env)->GetDirectBufferAddress(env, byteBufferObject); + int sigLen = *((int*)(data + 32)); + int pubLen = *((int*)(data + 32 + 4)); + + return secp256k1_ecdsa_verify(data, 32, data+32+8, sigLen, data+32+8+sigLen, pubLen); +} + +static void __javasecp256k1_attach(void) __attribute__((constructor)); +static void __javasecp256k1_detach(void) __attribute__((destructor)); + +static void __javasecp256k1_attach(void) { + secp256k1_start(SECP256K1_START_VERIFY); +} + +static void __javasecp256k1_detach(void) { + secp256k1_stop(); +} diff --git a/src/cryptoconditions/src/include/secp256k1/src/java/org_bitcoin_NativeSecp256k1.h b/src/cryptoconditions/src/include/secp256k1/src/java/org_bitcoin_NativeSecp256k1.h new file mode 100644 index 00000000000..d7fb004fa84 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/java/org_bitcoin_NativeSecp256k1.h @@ -0,0 +1,21 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class org_bitcoin_NativeSecp256k1 */ + +#ifndef _Included_org_bitcoin_NativeSecp256k1 +#define _Included_org_bitcoin_NativeSecp256k1 +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_bitcoin_NativeSecp256k1 + * Method: secp256k1_ecdsa_verify + * Signature: (Ljava/nio/ByteBuffer;)I + */ +JNIEXPORT jint JNICALL Java_org_bitcoin_NativeSecp256k1_secp256k1_1ecdsa_1verify + (JNIEnv *, jclass, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/num.h b/src/cryptoconditions/src/include/secp256k1/src/num.h new file mode 100644 index 00000000000..339b6bb6ec2 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/num.h @@ -0,0 +1,68 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_NUM_ +#define _SECP256K1_NUM_ + +#ifndef USE_NUM_NONE + +#if defined HAVE_CONFIG_H +#include "libsecp256k1-config.h" +#endif + +#if defined(USE_NUM_GMP) +#include "num_gmp.h" +#else +#error "Please select num implementation" +#endif + +/** Copy a number. */ +static void secp256k1_num_copy(secp256k1_num_t *r, const secp256k1_num_t *a); + +/** Convert a number's absolute value to a binary big-endian string. + * There must be enough place. */ +static void secp256k1_num_get_bin(unsigned char *r, unsigned int rlen, const secp256k1_num_t *a); + +/** Set a number to the value of a binary big-endian string. */ +static void secp256k1_num_set_bin(secp256k1_num_t *r, const unsigned char *a, unsigned int alen); + +/** Compute a modular inverse. The input must be less than the modulus. */ +static void secp256k1_num_mod_inverse(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *m); + +/** Compare the absolute value of two numbers. */ +static int secp256k1_num_cmp(const secp256k1_num_t *a, const secp256k1_num_t *b); + +/** Test whether two number are equal (including sign). */ +static int secp256k1_num_eq(const secp256k1_num_t *a, const secp256k1_num_t *b); + +/** Add two (signed) numbers. */ +static void secp256k1_num_add(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b); + +/** Subtract two (signed) numbers. */ +static void secp256k1_num_sub(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b); + +/** Multiply two (signed) numbers. */ +static void secp256k1_num_mul(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b); + +/** Replace a number by its remainder modulo m. M's sign is ignored. The result is a number between 0 and m-1, + even if r was negative. */ +static void secp256k1_num_mod(secp256k1_num_t *r, const secp256k1_num_t *m); + +/** Right-shift the passed number by bits bits. */ +static void secp256k1_num_shift(secp256k1_num_t *r, int bits); + +/** Check whether a number is zero. */ +static int secp256k1_num_is_zero(const secp256k1_num_t *a); + +/** Check whether a number is strictly negative. */ +static int secp256k1_num_is_neg(const secp256k1_num_t *a); + +/** Change a number's sign. */ +static void secp256k1_num_negate(secp256k1_num_t *r); + +#endif + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/num_gmp.h b/src/cryptoconditions/src/include/secp256k1/src/num_gmp.h new file mode 100644 index 00000000000..baa1f2bf2e4 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/num_gmp.h @@ -0,0 +1,20 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_NUM_REPR_ +#define _SECP256K1_NUM_REPR_ + +#include + +#define NUM_LIMBS ((256+GMP_NUMB_BITS-1)/GMP_NUMB_BITS) + +typedef struct { + mp_limb_t data[2*NUM_LIMBS]; + int neg; + int limbs; +} secp256k1_num_t; + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/num_gmp_impl.h b/src/cryptoconditions/src/include/secp256k1/src/num_gmp_impl.h new file mode 100644 index 00000000000..dbbc458d5dd --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/num_gmp_impl.h @@ -0,0 +1,260 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_NUM_REPR_IMPL_H_ +#define _SECP256K1_NUM_REPR_IMPL_H_ + +#include +#include +#include + +#include "util.h" +#include "num.h" + +#ifdef VERIFY +static void secp256k1_num_sanity(const secp256k1_num_t *a) { + VERIFY_CHECK(a->limbs == 1 || (a->limbs > 1 && a->data[a->limbs-1] != 0)); +} +#else +#define secp256k1_num_sanity(a) do { } while(0) +#endif + +static void secp256k1_num_copy(secp256k1_num_t *r, const secp256k1_num_t *a) { + *r = *a; +} + +static void secp256k1_num_get_bin(unsigned char *r, unsigned int rlen, const secp256k1_num_t *a) { + unsigned char tmp[65]; + int len = 0; + int shift = 0; + if (a->limbs>1 || a->data[0] != 0) { + len = mpn_get_str(tmp, 256, (mp_limb_t*)a->data, a->limbs); + } + while (shift < len && tmp[shift] == 0) shift++; + VERIFY_CHECK(len-shift <= (int)rlen); + memset(r, 0, rlen - len + shift); + if (len > shift) { + memcpy(r + rlen - len + shift, tmp + shift, len - shift); + } + memset(tmp, 0, sizeof(tmp)); +} + +static void secp256k1_num_set_bin(secp256k1_num_t *r, const unsigned char *a, unsigned int alen) { + int len; + VERIFY_CHECK(alen > 0); + VERIFY_CHECK(alen <= 64); + len = mpn_set_str(r->data, a, alen, 256); + if (len == 0) { + r->data[0] = 0; + len = 1; + } + VERIFY_CHECK(len <= NUM_LIMBS*2); + r->limbs = len; + r->neg = 0; + while (r->limbs > 1 && r->data[r->limbs-1]==0) { + r->limbs--; + } +} + +static void secp256k1_num_add_abs(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b) { + mp_limb_t c = mpn_add(r->data, a->data, a->limbs, b->data, b->limbs); + r->limbs = a->limbs; + if (c != 0) { + VERIFY_CHECK(r->limbs < 2*NUM_LIMBS); + r->data[r->limbs++] = c; + } +} + +static void secp256k1_num_sub_abs(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b) { + mp_limb_t c = mpn_sub(r->data, a->data, a->limbs, b->data, b->limbs); + VERIFY_CHECK(c == 0); + r->limbs = a->limbs; + while (r->limbs > 1 && r->data[r->limbs-1]==0) { + r->limbs--; + } +} + +static void secp256k1_num_mod(secp256k1_num_t *r, const secp256k1_num_t *m) { + secp256k1_num_sanity(r); + secp256k1_num_sanity(m); + + if (r->limbs >= m->limbs) { + mp_limb_t t[2*NUM_LIMBS]; + mpn_tdiv_qr(t, r->data, 0, r->data, r->limbs, m->data, m->limbs); + memset(t, 0, sizeof(t)); + r->limbs = m->limbs; + while (r->limbs > 1 && r->data[r->limbs-1]==0) { + r->limbs--; + } + } + + if (r->neg && (r->limbs > 1 || r->data[0] != 0)) { + secp256k1_num_sub_abs(r, m, r); + r->neg = 0; + } +} + +static void secp256k1_num_mod_inverse(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *m) { + int i; + mp_limb_t g[NUM_LIMBS+1]; + mp_limb_t u[NUM_LIMBS+1]; + mp_limb_t v[NUM_LIMBS+1]; + mp_size_t sn; + mp_size_t gn; + secp256k1_num_sanity(a); + secp256k1_num_sanity(m); + + /** mpn_gcdext computes: (G,S) = gcdext(U,V), where + * * G = gcd(U,V) + * * G = U*S + V*T + * * U has equal or more limbs than V, and V has no padding + * If we set U to be (a padded version of) a, and V = m: + * G = a*S + m*T + * G = a*S mod m + * Assuming G=1: + * S = 1/a mod m + */ + VERIFY_CHECK(m->limbs <= NUM_LIMBS); + VERIFY_CHECK(m->data[m->limbs-1] != 0); + for (i = 0; i < m->limbs; i++) { + u[i] = (i < a->limbs) ? a->data[i] : 0; + v[i] = m->data[i]; + } + sn = NUM_LIMBS+1; + gn = mpn_gcdext(g, r->data, &sn, u, m->limbs, v, m->limbs); + VERIFY_CHECK(gn == 1); + VERIFY_CHECK(g[0] == 1); + r->neg = a->neg ^ m->neg; + if (sn < 0) { + mpn_sub(r->data, m->data, m->limbs, r->data, -sn); + r->limbs = m->limbs; + while (r->limbs > 1 && r->data[r->limbs-1]==0) { + r->limbs--; + } + } else { + r->limbs = sn; + } + memset(g, 0, sizeof(g)); + memset(u, 0, sizeof(u)); + memset(v, 0, sizeof(v)); +} + +static int secp256k1_num_is_zero(const secp256k1_num_t *a) { + return (a->limbs == 1 && a->data[0] == 0); +} + +static int secp256k1_num_is_neg(const secp256k1_num_t *a) { + return (a->limbs > 1 || a->data[0] != 0) && a->neg; +} + +static int secp256k1_num_cmp(const secp256k1_num_t *a, const secp256k1_num_t *b) { + if (a->limbs > b->limbs) { + return 1; + } + if (a->limbs < b->limbs) { + return -1; + } + return mpn_cmp(a->data, b->data, a->limbs); +} + +static int secp256k1_num_eq(const secp256k1_num_t *a, const secp256k1_num_t *b) { + if (a->limbs > b->limbs) { + return 0; + } + if (a->limbs < b->limbs) { + return 0; + } + if ((a->neg && !secp256k1_num_is_zero(a)) != (b->neg && !secp256k1_num_is_zero(b))) { + return 0; + } + return mpn_cmp(a->data, b->data, a->limbs) == 0; +} + +static void secp256k1_num_subadd(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b, int bneg) { + if (!(b->neg ^ bneg ^ a->neg)) { /* a and b have the same sign */ + r->neg = a->neg; + if (a->limbs >= b->limbs) { + secp256k1_num_add_abs(r, a, b); + } else { + secp256k1_num_add_abs(r, b, a); + } + } else { + if (secp256k1_num_cmp(a, b) > 0) { + r->neg = a->neg; + secp256k1_num_sub_abs(r, a, b); + } else { + r->neg = b->neg ^ bneg; + secp256k1_num_sub_abs(r, b, a); + } + } +} + +static void secp256k1_num_add(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b) { + secp256k1_num_sanity(a); + secp256k1_num_sanity(b); + secp256k1_num_subadd(r, a, b, 0); +} + +static void secp256k1_num_sub(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b) { + secp256k1_num_sanity(a); + secp256k1_num_sanity(b); + secp256k1_num_subadd(r, a, b, 1); +} + +static void secp256k1_num_mul(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b) { + mp_limb_t tmp[2*NUM_LIMBS+1]; + secp256k1_num_sanity(a); + secp256k1_num_sanity(b); + + VERIFY_CHECK(a->limbs + b->limbs <= 2*NUM_LIMBS+1); + if ((a->limbs==1 && a->data[0]==0) || (b->limbs==1 && b->data[0]==0)) { + r->limbs = 1; + r->neg = 0; + r->data[0] = 0; + return; + } + if (a->limbs >= b->limbs) { + mpn_mul(tmp, a->data, a->limbs, b->data, b->limbs); + } else { + mpn_mul(tmp, b->data, b->limbs, a->data, a->limbs); + } + r->limbs = a->limbs + b->limbs; + if (r->limbs > 1 && tmp[r->limbs - 1]==0) { + r->limbs--; + } + VERIFY_CHECK(r->limbs <= 2*NUM_LIMBS); + mpn_copyi(r->data, tmp, r->limbs); + r->neg = a->neg ^ b->neg; + memset(tmp, 0, sizeof(tmp)); +} + +static void secp256k1_num_shift(secp256k1_num_t *r, int bits) { + int i; + if (bits % GMP_NUMB_BITS) { + /* Shift within limbs. */ + mpn_rshift(r->data, r->data, r->limbs, bits % GMP_NUMB_BITS); + } + if (bits >= GMP_NUMB_BITS) { + /* Shift full limbs. */ + for (i = 0; i < r->limbs; i++) { + int index = i + (bits / GMP_NUMB_BITS); + if (index < r->limbs && index < 2*NUM_LIMBS) { + r->data[i] = r->data[index]; + } else { + r->data[i] = 0; + } + } + } + while (r->limbs>1 && r->data[r->limbs-1]==0) { + r->limbs--; + } +} + +static void secp256k1_num_negate(secp256k1_num_t *r) { + r->neg ^= 1; +} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/num_impl.h b/src/cryptoconditions/src/include/secp256k1/src/num_impl.h new file mode 100644 index 00000000000..0b0e3a072a1 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/num_impl.h @@ -0,0 +1,24 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_NUM_IMPL_H_ +#define _SECP256K1_NUM_IMPL_H_ + +#if defined HAVE_CONFIG_H +#include "libsecp256k1-config.h" +#endif + +#include "num.h" + +#if defined(USE_NUM_GMP) +#include "num_gmp_impl.h" +#elif defined(USE_NUM_NONE) +/* Nothing. */ +#else +#error "Please select num implementation" +#endif + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/scalar.h b/src/cryptoconditions/src/include/secp256k1/src/scalar.h new file mode 100644 index 00000000000..f5d09f8d474 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/scalar.h @@ -0,0 +1,93 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_SCALAR_ +#define _SECP256K1_SCALAR_ + +#include "num.h" + +#if defined HAVE_CONFIG_H +#include "libsecp256k1-config.h" +#endif + +#if defined(USE_SCALAR_4X64) +#include "scalar_4x64.h" +#elif defined(USE_SCALAR_8X32) +#include "scalar_8x32.h" +#else +#error "Please select scalar implementation" +#endif + +/** Clear a scalar to prevent the leak of sensitive data. */ +static void secp256k1_scalar_clear(secp256k1_scalar_t *r); + +/** Access bits from a scalar. All requested bits must belong to the same 32-bit limb. */ +static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar_t *a, unsigned int offset, unsigned int count); + +/** Access bits from a scalar. Not constant time. */ +static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar_t *a, unsigned int offset, unsigned int count); + +/** Set a scalar from a big endian byte array. */ +static void secp256k1_scalar_set_b32(secp256k1_scalar_t *r, const unsigned char *bin, int *overflow); + +/** Set a scalar to an unsigned integer. */ +static void secp256k1_scalar_set_int(secp256k1_scalar_t *r, unsigned int v); + +/** Convert a scalar to a byte array. */ +static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar_t* a); + +/** Add two scalars together (modulo the group order). Returns whether it overflowed. */ +static int secp256k1_scalar_add(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b); + +/** Add a power of two to a scalar. The result is not allowed to overflow. */ +static void secp256k1_scalar_add_bit(secp256k1_scalar_t *r, unsigned int bit); + +/** Multiply two scalars (modulo the group order). */ +static void secp256k1_scalar_mul(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b); + +/** Compute the square of a scalar (modulo the group order). */ +static void secp256k1_scalar_sqr(secp256k1_scalar_t *r, const secp256k1_scalar_t *a); + +/** Compute the inverse of a scalar (modulo the group order). */ +static void secp256k1_scalar_inverse(secp256k1_scalar_t *r, const secp256k1_scalar_t *a); + +/** Compute the inverse of a scalar (modulo the group order), without constant-time guarantee. */ +static void secp256k1_scalar_inverse_var(secp256k1_scalar_t *r, const secp256k1_scalar_t *a); + +/** Compute the complement of a scalar (modulo the group order). */ +static void secp256k1_scalar_negate(secp256k1_scalar_t *r, const secp256k1_scalar_t *a); + +/** Check whether a scalar equals zero. */ +static int secp256k1_scalar_is_zero(const secp256k1_scalar_t *a); + +/** Check whether a scalar equals one. */ +static int secp256k1_scalar_is_one(const secp256k1_scalar_t *a); + +/** Check whether a scalar is higher than the group order divided by 2. */ +static int secp256k1_scalar_is_high(const secp256k1_scalar_t *a); + +#ifndef USE_NUM_NONE +/** Convert a scalar to a number. */ +static void secp256k1_scalar_get_num(secp256k1_num_t *r, const secp256k1_scalar_t *a); + +/** Get the order of the group as a number. */ +static void secp256k1_scalar_order_get_num(secp256k1_num_t *r); +#endif + +/** Compare two scalars. */ +static int secp256k1_scalar_eq(const secp256k1_scalar_t *a, const secp256k1_scalar_t *b); + +#ifdef USE_ENDOMORPHISM +/** Find r1 and r2 such that r1+r2*2^128 = a. */ +static void secp256k1_scalar_split_128(secp256k1_scalar_t *r1, secp256k1_scalar_t *r2, const secp256k1_scalar_t *a); +/** Find r1 and r2 such that r1+r2*lambda = a, and r1 and r2 are maximum 128 bits long (see secp256k1_gej_mul_lambda). */ +static void secp256k1_scalar_split_lambda_var(secp256k1_scalar_t *r1, secp256k1_scalar_t *r2, const secp256k1_scalar_t *a); +#endif + +/** Multiply a and b (without taking the modulus!), divide by 2**shift, and round to the nearest integer. Shift must be at least 256. */ +static void secp256k1_scalar_mul_shift_var(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b, unsigned int shift); + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/scalar_4x64.h b/src/cryptoconditions/src/include/secp256k1/src/scalar_4x64.h new file mode 100644 index 00000000000..82899aa7b04 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/scalar_4x64.h @@ -0,0 +1,19 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_SCALAR_REPR_ +#define _SECP256K1_SCALAR_REPR_ + +#include + +/** A scalar modulo the group order of the secp256k1 curve. */ +typedef struct { + uint64_t d[4]; +} secp256k1_scalar_t; + +#define SECP256K1_SCALAR_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{((uint64_t)(d1)) << 32 | (d0), ((uint64_t)(d3)) << 32 | (d2), ((uint64_t)(d5)) << 32 | (d4), ((uint64_t)(d7)) << 32 | (d6)}} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/scalar_4x64_impl.h b/src/cryptoconditions/src/include/secp256k1/src/scalar_4x64_impl.h new file mode 100644 index 00000000000..ff365292f86 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/scalar_4x64_impl.h @@ -0,0 +1,920 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_SCALAR_REPR_IMPL_H_ +#define _SECP256K1_SCALAR_REPR_IMPL_H_ + +/* Limbs of the secp256k1 order. */ +#define SECP256K1_N_0 ((uint64_t)0xBFD25E8CD0364141ULL) +#define SECP256K1_N_1 ((uint64_t)0xBAAEDCE6AF48A03BULL) +#define SECP256K1_N_2 ((uint64_t)0xFFFFFFFFFFFFFFFEULL) +#define SECP256K1_N_3 ((uint64_t)0xFFFFFFFFFFFFFFFFULL) + +/* Limbs of 2^256 minus the secp256k1 order. */ +#define SECP256K1_N_C_0 (~SECP256K1_N_0 + 1) +#define SECP256K1_N_C_1 (~SECP256K1_N_1) +#define SECP256K1_N_C_2 (1) + +/* Limbs of half the secp256k1 order. */ +#define SECP256K1_N_H_0 ((uint64_t)0xDFE92F46681B20A0ULL) +#define SECP256K1_N_H_1 ((uint64_t)0x5D576E7357A4501DULL) +#define SECP256K1_N_H_2 ((uint64_t)0xFFFFFFFFFFFFFFFFULL) +#define SECP256K1_N_H_3 ((uint64_t)0x7FFFFFFFFFFFFFFFULL) + +SECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar_t *r) { + r->d[0] = 0; + r->d[1] = 0; + r->d[2] = 0; + r->d[3] = 0; +} + +SECP256K1_INLINE static void secp256k1_scalar_set_int(secp256k1_scalar_t *r, unsigned int v) { + r->d[0] = v; + r->d[1] = 0; + r->d[2] = 0; + r->d[3] = 0; +} + +SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar_t *a, unsigned int offset, unsigned int count) { + VERIFY_CHECK((offset + count - 1) >> 6 == offset >> 6); + return (a->d[offset >> 6] >> (offset & 0x3F)) & ((((uint64_t)1) << count) - 1); +} + +SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar_t *a, unsigned int offset, unsigned int count) { + VERIFY_CHECK(count < 32); + VERIFY_CHECK(offset + count <= 256); + if ((offset + count - 1) >> 6 == offset >> 6) { + return secp256k1_scalar_get_bits(a, offset, count); + } else { + VERIFY_CHECK((offset >> 6) + 1 < 4); + return ((a->d[offset >> 6] >> (offset & 0x3F)) | (a->d[(offset >> 6) + 1] << (64 - (offset & 0x3F)))) & ((((uint64_t)1) << count) - 1); + } +} + +SECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scalar_t *a) { + int yes = 0; + int no = 0; + no |= (a->d[3] < SECP256K1_N_3); /* No need for a > check. */ + no |= (a->d[2] < SECP256K1_N_2); + yes |= (a->d[2] > SECP256K1_N_2) & ~no; + no |= (a->d[1] < SECP256K1_N_1); + yes |= (a->d[1] > SECP256K1_N_1) & ~no; + yes |= (a->d[0] >= SECP256K1_N_0) & ~no; + return yes; +} + +SECP256K1_INLINE static int secp256k1_scalar_reduce(secp256k1_scalar_t *r, unsigned int overflow) { + uint128_t t; + VERIFY_CHECK(overflow <= 1); + t = (uint128_t)r->d[0] + overflow * SECP256K1_N_C_0; + r->d[0] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + t += (uint128_t)r->d[1] + overflow * SECP256K1_N_C_1; + r->d[1] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + t += (uint128_t)r->d[2] + overflow * SECP256K1_N_C_2; + r->d[2] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + t += (uint64_t)r->d[3]; + r->d[3] = t & 0xFFFFFFFFFFFFFFFFULL; + return overflow; +} + +static int secp256k1_scalar_add(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { + int overflow; + uint128_t t = (uint128_t)a->d[0] + b->d[0]; + r->d[0] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + t += (uint128_t)a->d[1] + b->d[1]; + r->d[1] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + t += (uint128_t)a->d[2] + b->d[2]; + r->d[2] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + t += (uint128_t)a->d[3] + b->d[3]; + r->d[3] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + overflow = t + secp256k1_scalar_check_overflow(r); + VERIFY_CHECK(overflow == 0 || overflow == 1); + secp256k1_scalar_reduce(r, overflow); + return overflow; +} + +static void secp256k1_scalar_add_bit(secp256k1_scalar_t *r, unsigned int bit) { + uint128_t t; + VERIFY_CHECK(bit < 256); + t = (uint128_t)r->d[0] + (((uint64_t)((bit >> 6) == 0)) << (bit & 0x3F)); + r->d[0] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + t += (uint128_t)r->d[1] + (((uint64_t)((bit >> 6) == 1)) << (bit & 0x3F)); + r->d[1] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + t += (uint128_t)r->d[2] + (((uint64_t)((bit >> 6) == 2)) << (bit & 0x3F)); + r->d[2] = t & 0xFFFFFFFFFFFFFFFFULL; t >>= 64; + t += (uint128_t)r->d[3] + (((uint64_t)((bit >> 6) == 3)) << (bit & 0x3F)); + r->d[3] = t & 0xFFFFFFFFFFFFFFFFULL; +#ifdef VERIFY + VERIFY_CHECK((t >> 64) == 0); + VERIFY_CHECK(secp256k1_scalar_check_overflow(r) == 0); +#endif +} + +static void secp256k1_scalar_set_b32(secp256k1_scalar_t *r, const unsigned char *b32, int *overflow) { + int over; + r->d[0] = (uint64_t)b32[31] | (uint64_t)b32[30] << 8 | (uint64_t)b32[29] << 16 | (uint64_t)b32[28] << 24 | (uint64_t)b32[27] << 32 | (uint64_t)b32[26] << 40 | (uint64_t)b32[25] << 48 | (uint64_t)b32[24] << 56; + r->d[1] = (uint64_t)b32[23] | (uint64_t)b32[22] << 8 | (uint64_t)b32[21] << 16 | (uint64_t)b32[20] << 24 | (uint64_t)b32[19] << 32 | (uint64_t)b32[18] << 40 | (uint64_t)b32[17] << 48 | (uint64_t)b32[16] << 56; + r->d[2] = (uint64_t)b32[15] | (uint64_t)b32[14] << 8 | (uint64_t)b32[13] << 16 | (uint64_t)b32[12] << 24 | (uint64_t)b32[11] << 32 | (uint64_t)b32[10] << 40 | (uint64_t)b32[9] << 48 | (uint64_t)b32[8] << 56; + r->d[3] = (uint64_t)b32[7] | (uint64_t)b32[6] << 8 | (uint64_t)b32[5] << 16 | (uint64_t)b32[4] << 24 | (uint64_t)b32[3] << 32 | (uint64_t)b32[2] << 40 | (uint64_t)b32[1] << 48 | (uint64_t)b32[0] << 56; + over = secp256k1_scalar_reduce(r, secp256k1_scalar_check_overflow(r)); + if (overflow) { + *overflow = over; + } +} + +static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar_t* a) { + bin[0] = a->d[3] >> 56; bin[1] = a->d[3] >> 48; bin[2] = a->d[3] >> 40; bin[3] = a->d[3] >> 32; bin[4] = a->d[3] >> 24; bin[5] = a->d[3] >> 16; bin[6] = a->d[3] >> 8; bin[7] = a->d[3]; + bin[8] = a->d[2] >> 56; bin[9] = a->d[2] >> 48; bin[10] = a->d[2] >> 40; bin[11] = a->d[2] >> 32; bin[12] = a->d[2] >> 24; bin[13] = a->d[2] >> 16; bin[14] = a->d[2] >> 8; bin[15] = a->d[2]; + bin[16] = a->d[1] >> 56; bin[17] = a->d[1] >> 48; bin[18] = a->d[1] >> 40; bin[19] = a->d[1] >> 32; bin[20] = a->d[1] >> 24; bin[21] = a->d[1] >> 16; bin[22] = a->d[1] >> 8; bin[23] = a->d[1]; + bin[24] = a->d[0] >> 56; bin[25] = a->d[0] >> 48; bin[26] = a->d[0] >> 40; bin[27] = a->d[0] >> 32; bin[28] = a->d[0] >> 24; bin[29] = a->d[0] >> 16; bin[30] = a->d[0] >> 8; bin[31] = a->d[0]; +} + +SECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar_t *a) { + return (a->d[0] | a->d[1] | a->d[2] | a->d[3]) == 0; +} + +static void secp256k1_scalar_negate(secp256k1_scalar_t *r, const secp256k1_scalar_t *a) { + uint64_t nonzero = 0xFFFFFFFFFFFFFFFFULL * (secp256k1_scalar_is_zero(a) == 0); + uint128_t t = (uint128_t)(~a->d[0]) + SECP256K1_N_0 + 1; + r->d[0] = t & nonzero; t >>= 64; + t += (uint128_t)(~a->d[1]) + SECP256K1_N_1; + r->d[1] = t & nonzero; t >>= 64; + t += (uint128_t)(~a->d[2]) + SECP256K1_N_2; + r->d[2] = t & nonzero; t >>= 64; + t += (uint128_t)(~a->d[3]) + SECP256K1_N_3; + r->d[3] = t & nonzero; +} + +SECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar_t *a) { + return ((a->d[0] ^ 1) | a->d[1] | a->d[2] | a->d[3]) == 0; +} + +static int secp256k1_scalar_is_high(const secp256k1_scalar_t *a) { + int yes = 0; + int no = 0; + no |= (a->d[3] < SECP256K1_N_H_3); + yes |= (a->d[3] > SECP256K1_N_H_3) & ~no; + no |= (a->d[2] < SECP256K1_N_H_2) & ~yes; /* No need for a > check. */ + no |= (a->d[1] < SECP256K1_N_H_1) & ~yes; + yes |= (a->d[1] > SECP256K1_N_H_1) & ~no; + yes |= (a->d[0] > SECP256K1_N_H_0) & ~no; + return yes; +} + +/* Inspired by the macros in OpenSSL's crypto/bn/asm/x86_64-gcc.c. */ + +/** Add a*b to the number defined by (c0,c1,c2). c2 must never overflow. */ +#define muladd(a,b) { \ + uint64_t tl, th; \ + { \ + uint128_t t = (uint128_t)a * b; \ + th = t >> 64; /* at most 0xFFFFFFFFFFFFFFFE */ \ + tl = t; \ + } \ + c0 += tl; /* overflow is handled on the next line */ \ + th += (c0 < tl) ? 1 : 0; /* at most 0xFFFFFFFFFFFFFFFF */ \ + c1 += th; /* overflow is handled on the next line */ \ + c2 += (c1 < th) ? 1 : 0; /* never overflows by contract (verified in the next line) */ \ + VERIFY_CHECK((c1 >= th) || (c2 != 0)); \ +} + +/** Add a*b to the number defined by (c0,c1). c1 must never overflow. */ +#define muladd_fast(a,b) { \ + uint64_t tl, th; \ + { \ + uint128_t t = (uint128_t)a * b; \ + th = t >> 64; /* at most 0xFFFFFFFFFFFFFFFE */ \ + tl = t; \ + } \ + c0 += tl; /* overflow is handled on the next line */ \ + th += (c0 < tl) ? 1 : 0; /* at most 0xFFFFFFFFFFFFFFFF */ \ + c1 += th; /* never overflows by contract (verified in the next line) */ \ + VERIFY_CHECK(c1 >= th); \ +} + +/** Add 2*a*b to the number defined by (c0,c1,c2). c2 must never overflow. */ +#define muladd2(a,b) { \ + uint64_t tl, th, th2, tl2; \ + { \ + uint128_t t = (uint128_t)a * b; \ + th = t >> 64; /* at most 0xFFFFFFFFFFFFFFFE */ \ + tl = t; \ + } \ + th2 = th + th; /* at most 0xFFFFFFFFFFFFFFFE (in case th was 0x7FFFFFFFFFFFFFFF) */ \ + c2 += (th2 < th) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ + VERIFY_CHECK((th2 >= th) || (c2 != 0)); \ + tl2 = tl + tl; /* at most 0xFFFFFFFFFFFFFFFE (in case the lowest 63 bits of tl were 0x7FFFFFFFFFFFFFFF) */ \ + th2 += (tl2 < tl) ? 1 : 0; /* at most 0xFFFFFFFFFFFFFFFF */ \ + c0 += tl2; /* overflow is handled on the next line */ \ + th2 += (c0 < tl2) ? 1 : 0; /* second overflow is handled on the next line */ \ + c2 += (c0 < tl2) & (th2 == 0); /* never overflows by contract (verified the next line) */ \ + VERIFY_CHECK((c0 >= tl2) || (th2 != 0) || (c2 != 0)); \ + c1 += th2; /* overflow is handled on the next line */ \ + c2 += (c1 < th2) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ + VERIFY_CHECK((c1 >= th2) || (c2 != 0)); \ +} + +/** Add a to the number defined by (c0,c1,c2). c2 must never overflow. */ +#define sumadd(a) { \ + unsigned int over; \ + c0 += (a); /* overflow is handled on the next line */ \ + over = (c0 < (a)) ? 1 : 0; \ + c1 += over; /* overflow is handled on the next line */ \ + c2 += (c1 < over) ? 1 : 0; /* never overflows by contract */ \ +} + +/** Add a to the number defined by (c0,c1). c1 must never overflow, c2 must be zero. */ +#define sumadd_fast(a) { \ + c0 += (a); /* overflow is handled on the next line */ \ + c1 += (c0 < (a)) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ + VERIFY_CHECK((c1 != 0) | (c0 >= (a))); \ + VERIFY_CHECK(c2 == 0); \ +} + +/** Extract the lowest 64 bits of (c0,c1,c2) into n, and left shift the number 64 bits. */ +#define extract(n) { \ + (n) = c0; \ + c0 = c1; \ + c1 = c2; \ + c2 = 0; \ +} + +/** Extract the lowest 64 bits of (c0,c1,c2) into n, and left shift the number 64 bits. c2 is required to be zero. */ +#define extract_fast(n) { \ + (n) = c0; \ + c0 = c1; \ + c1 = 0; \ + VERIFY_CHECK(c2 == 0); \ +} + +static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint64_t *l) { +#ifdef USE_ASM_X86_64 + /* Reduce 512 bits into 385. */ + uint64_t m0, m1, m2, m3, m4, m5, m6; + uint64_t p0, p1, p2, p3, p4; + uint64_t c; + + __asm__ __volatile__( + /* Preload. */ + "movq 32(%%rsi), %%r11\n" + "movq 40(%%rsi), %%r12\n" + "movq 48(%%rsi), %%r13\n" + "movq 56(%%rsi), %%r14\n" + /* Initialize r8,r9,r10 */ + "movq 0(%%rsi), %%r8\n" + "movq $0, %%r9\n" + "movq $0, %%r10\n" + /* (r8,r9) += n0 * c0 */ + "movq %8, %%rax\n" + "mulq %%r11\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + /* extract m0 */ + "movq %%r8, %q0\n" + "movq $0, %%r8\n" + /* (r9,r10) += l1 */ + "addq 8(%%rsi), %%r9\n" + "adcq $0, %%r10\n" + /* (r9,r10,r8) += n1 * c0 */ + "movq %8, %%rax\n" + "mulq %%r12\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* (r9,r10,r8) += n0 * c1 */ + "movq %9, %%rax\n" + "mulq %%r11\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* extract m1 */ + "movq %%r9, %q1\n" + "movq $0, %%r9\n" + /* (r10,r8,r9) += l2 */ + "addq 16(%%rsi), %%r10\n" + "adcq $0, %%r8\n" + "adcq $0, %%r9\n" + /* (r10,r8,r9) += n2 * c0 */ + "movq %8, %%rax\n" + "mulq %%r13\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + /* (r10,r8,r9) += n1 * c1 */ + "movq %9, %%rax\n" + "mulq %%r12\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + /* (r10,r8,r9) += n0 */ + "addq %%r11, %%r10\n" + "adcq $0, %%r8\n" + "adcq $0, %%r9\n" + /* extract m2 */ + "movq %%r10, %q2\n" + "movq $0, %%r10\n" + /* (r8,r9,r10) += l3 */ + "addq 24(%%rsi), %%r8\n" + "adcq $0, %%r9\n" + "adcq $0, %%r10\n" + /* (r8,r9,r10) += n3 * c0 */ + "movq %8, %%rax\n" + "mulq %%r14\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + /* (r8,r9,r10) += n2 * c1 */ + "movq %9, %%rax\n" + "mulq %%r13\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + /* (r8,r9,r10) += n1 */ + "addq %%r12, %%r8\n" + "adcq $0, %%r9\n" + "adcq $0, %%r10\n" + /* extract m3 */ + "movq %%r8, %q3\n" + "movq $0, %%r8\n" + /* (r9,r10,r8) += n3 * c1 */ + "movq %9, %%rax\n" + "mulq %%r14\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* (r9,r10,r8) += n2 */ + "addq %%r13, %%r9\n" + "adcq $0, %%r10\n" + "adcq $0, %%r8\n" + /* extract m4 */ + "movq %%r9, %q4\n" + /* (r10,r8) += n3 */ + "addq %%r14, %%r10\n" + "adcq $0, %%r8\n" + /* extract m5 */ + "movq %%r10, %q5\n" + /* extract m6 */ + "movq %%r8, %q6\n" + : "=g"(m0), "=g"(m1), "=g"(m2), "=g"(m3), "=g"(m4), "=g"(m5), "=g"(m6) + : "S"(l), "n"(SECP256K1_N_C_0), "n"(SECP256K1_N_C_1) + : "rax", "rdx", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "cc"); + + /* Reduce 385 bits into 258. */ + __asm__ __volatile__( + /* Preload */ + "movq %q9, %%r11\n" + "movq %q10, %%r12\n" + "movq %q11, %%r13\n" + /* Initialize (r8,r9,r10) */ + "movq %q5, %%r8\n" + "movq $0, %%r9\n" + "movq $0, %%r10\n" + /* (r8,r9) += m4 * c0 */ + "movq %12, %%rax\n" + "mulq %%r11\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + /* extract p0 */ + "movq %%r8, %q0\n" + "movq $0, %%r8\n" + /* (r9,r10) += m1 */ + "addq %q6, %%r9\n" + "adcq $0, %%r10\n" + /* (r9,r10,r8) += m5 * c0 */ + "movq %12, %%rax\n" + "mulq %%r12\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* (r9,r10,r8) += m4 * c1 */ + "movq %13, %%rax\n" + "mulq %%r11\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* extract p1 */ + "movq %%r9, %q1\n" + "movq $0, %%r9\n" + /* (r10,r8,r9) += m2 */ + "addq %q7, %%r10\n" + "adcq $0, %%r8\n" + "adcq $0, %%r9\n" + /* (r10,r8,r9) += m6 * c0 */ + "movq %12, %%rax\n" + "mulq %%r13\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + /* (r10,r8,r9) += m5 * c1 */ + "movq %13, %%rax\n" + "mulq %%r12\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + /* (r10,r8,r9) += m4 */ + "addq %%r11, %%r10\n" + "adcq $0, %%r8\n" + "adcq $0, %%r9\n" + /* extract p2 */ + "movq %%r10, %q2\n" + /* (r8,r9) += m3 */ + "addq %q8, %%r8\n" + "adcq $0, %%r9\n" + /* (r8,r9) += m6 * c1 */ + "movq %13, %%rax\n" + "mulq %%r13\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + /* (r8,r9) += m5 */ + "addq %%r12, %%r8\n" + "adcq $0, %%r9\n" + /* extract p3 */ + "movq %%r8, %q3\n" + /* (r9) += m6 */ + "addq %%r13, %%r9\n" + /* extract p4 */ + "movq %%r9, %q4\n" + : "=&g"(p0), "=&g"(p1), "=&g"(p2), "=g"(p3), "=g"(p4) + : "g"(m0), "g"(m1), "g"(m2), "g"(m3), "g"(m4), "g"(m5), "g"(m6), "n"(SECP256K1_N_C_0), "n"(SECP256K1_N_C_1) + : "rax", "rdx", "r8", "r9", "r10", "r11", "r12", "r13", "cc"); + + /* Reduce 258 bits into 256. */ + __asm__ __volatile__( + /* Preload */ + "movq %q5, %%r10\n" + /* (rax,rdx) = p4 * c0 */ + "movq %7, %%rax\n" + "mulq %%r10\n" + /* (rax,rdx) += p0 */ + "addq %q1, %%rax\n" + "adcq $0, %%rdx\n" + /* extract r0 */ + "movq %%rax, 0(%q6)\n" + /* Move to (r8,r9) */ + "movq %%rdx, %%r8\n" + "movq $0, %%r9\n" + /* (r8,r9) += p1 */ + "addq %q2, %%r8\n" + "adcq $0, %%r9\n" + /* (r8,r9) += p4 * c1 */ + "movq %8, %%rax\n" + "mulq %%r10\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + /* Extract r1 */ + "movq %%r8, 8(%q6)\n" + "movq $0, %%r8\n" + /* (r9,r8) += p4 */ + "addq %%r10, %%r9\n" + "adcq $0, %%r8\n" + /* (r9,r8) += p2 */ + "addq %q3, %%r9\n" + "adcq $0, %%r8\n" + /* Extract r2 */ + "movq %%r9, 16(%q6)\n" + "movq $0, %%r9\n" + /* (r8,r9) += p3 */ + "addq %q4, %%r8\n" + "adcq $0, %%r9\n" + /* Extract r3 */ + "movq %%r8, 24(%q6)\n" + /* Extract c */ + "movq %%r9, %q0\n" + : "=g"(c) + : "g"(p0), "g"(p1), "g"(p2), "g"(p3), "g"(p4), "D"(r), "n"(SECP256K1_N_C_0), "n"(SECP256K1_N_C_1) + : "rax", "rdx", "r8", "r9", "r10", "cc", "memory"); +#else + uint128_t c; + uint64_t c0, c1, c2; + uint64_t n0 = l[4], n1 = l[5], n2 = l[6], n3 = l[7]; + uint64_t m0, m1, m2, m3, m4, m5; + uint32_t m6; + uint64_t p0, p1, p2, p3; + uint32_t p4; + + /* Reduce 512 bits into 385. */ + /* m[0..6] = l[0..3] + n[0..3] * SECP256K1_N_C. */ + c0 = l[0]; c1 = 0; c2 = 0; + muladd_fast(n0, SECP256K1_N_C_0); + extract_fast(m0); + sumadd_fast(l[1]); + muladd(n1, SECP256K1_N_C_0); + muladd(n0, SECP256K1_N_C_1); + extract(m1); + sumadd(l[2]); + muladd(n2, SECP256K1_N_C_0); + muladd(n1, SECP256K1_N_C_1); + sumadd(n0); + extract(m2); + sumadd(l[3]); + muladd(n3, SECP256K1_N_C_0); + muladd(n2, SECP256K1_N_C_1); + sumadd(n1); + extract(m3); + muladd(n3, SECP256K1_N_C_1); + sumadd(n2); + extract(m4); + sumadd_fast(n3); + extract_fast(m5); + VERIFY_CHECK(c0 <= 1); + m6 = c0; + + /* Reduce 385 bits into 258. */ + /* p[0..4] = m[0..3] + m[4..6] * SECP256K1_N_C. */ + c0 = m0; c1 = 0; c2 = 0; + muladd_fast(m4, SECP256K1_N_C_0); + extract_fast(p0); + sumadd_fast(m1); + muladd(m5, SECP256K1_N_C_0); + muladd(m4, SECP256K1_N_C_1); + extract(p1); + sumadd(m2); + muladd(m6, SECP256K1_N_C_0); + muladd(m5, SECP256K1_N_C_1); + sumadd(m4); + extract(p2); + sumadd_fast(m3); + muladd_fast(m6, SECP256K1_N_C_1); + sumadd_fast(m5); + extract_fast(p3); + p4 = c0 + m6; + VERIFY_CHECK(p4 <= 2); + + /* Reduce 258 bits into 256. */ + /* r[0..3] = p[0..3] + p[4] * SECP256K1_N_C. */ + c = p0 + (uint128_t)SECP256K1_N_C_0 * p4; + r->d[0] = c & 0xFFFFFFFFFFFFFFFFULL; c >>= 64; + c += p1 + (uint128_t)SECP256K1_N_C_1 * p4; + r->d[1] = c & 0xFFFFFFFFFFFFFFFFULL; c >>= 64; + c += p2 + (uint128_t)p4; + r->d[2] = c & 0xFFFFFFFFFFFFFFFFULL; c >>= 64; + c += p3; + r->d[3] = c & 0xFFFFFFFFFFFFFFFFULL; c >>= 64; +#endif + + /* Final reduction of r. */ + secp256k1_scalar_reduce(r, c + secp256k1_scalar_check_overflow(r)); +} + +static void secp256k1_scalar_mul_512(uint64_t l[8], const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { +#ifdef USE_ASM_X86_64 + const uint64_t *pb = b->d; + __asm__ __volatile__( + /* Preload */ + "movq 0(%%rdi), %%r15\n" + "movq 8(%%rdi), %%rbx\n" + "movq 16(%%rdi), %%rcx\n" + "movq 0(%%rdx), %%r11\n" + "movq 8(%%rdx), %%r12\n" + "movq 16(%%rdx), %%r13\n" + "movq 24(%%rdx), %%r14\n" + /* (rax,rdx) = a0 * b0 */ + "movq %%r15, %%rax\n" + "mulq %%r11\n" + /* Extract l0 */ + "movq %%rax, 0(%%rsi)\n" + /* (r8,r9,r10) = (rdx) */ + "movq %%rdx, %%r8\n" + "xorq %%r9, %%r9\n" + "xorq %%r10, %%r10\n" + /* (r8,r9,r10) += a0 * b1 */ + "movq %%r15, %%rax\n" + "mulq %%r12\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + /* (r8,r9,r10) += a1 * b0 */ + "movq %%rbx, %%rax\n" + "mulq %%r11\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + /* Extract l1 */ + "movq %%r8, 8(%%rsi)\n" + "xorq %%r8, %%r8\n" + /* (r9,r10,r8) += a0 * b2 */ + "movq %%r15, %%rax\n" + "mulq %%r13\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* (r9,r10,r8) += a1 * b1 */ + "movq %%rbx, %%rax\n" + "mulq %%r12\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* (r9,r10,r8) += a2 * b0 */ + "movq %%rcx, %%rax\n" + "mulq %%r11\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* Extract l2 */ + "movq %%r9, 16(%%rsi)\n" + "xorq %%r9, %%r9\n" + /* (r10,r8,r9) += a0 * b3 */ + "movq %%r15, %%rax\n" + "mulq %%r14\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + /* Preload a3 */ + "movq 24(%%rdi), %%r15\n" + /* (r10,r8,r9) += a1 * b2 */ + "movq %%rbx, %%rax\n" + "mulq %%r13\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + /* (r10,r8,r9) += a2 * b1 */ + "movq %%rcx, %%rax\n" + "mulq %%r12\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + /* (r10,r8,r9) += a3 * b0 */ + "movq %%r15, %%rax\n" + "mulq %%r11\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + /* Extract l3 */ + "movq %%r10, 24(%%rsi)\n" + "xorq %%r10, %%r10\n" + /* (r8,r9,r10) += a1 * b3 */ + "movq %%rbx, %%rax\n" + "mulq %%r14\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + /* (r8,r9,r10) += a2 * b2 */ + "movq %%rcx, %%rax\n" + "mulq %%r13\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + /* (r8,r9,r10) += a3 * b1 */ + "movq %%r15, %%rax\n" + "mulq %%r12\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + /* Extract l4 */ + "movq %%r8, 32(%%rsi)\n" + "xorq %%r8, %%r8\n" + /* (r9,r10,r8) += a2 * b3 */ + "movq %%rcx, %%rax\n" + "mulq %%r14\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* (r9,r10,r8) += a3 * b2 */ + "movq %%r15, %%rax\n" + "mulq %%r13\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* Extract l5 */ + "movq %%r9, 40(%%rsi)\n" + /* (r10,r8) += a3 * b3 */ + "movq %%r15, %%rax\n" + "mulq %%r14\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + /* Extract l6 */ + "movq %%r10, 48(%%rsi)\n" + /* Extract l7 */ + "movq %%r8, 56(%%rsi)\n" + : "+d"(pb) + : "S"(l), "D"(a->d) + : "rax", "rbx", "rcx", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", "cc", "memory"); +#else + /* 160 bit accumulator. */ + uint64_t c0 = 0, c1 = 0; + uint32_t c2 = 0; + + /* l[0..7] = a[0..3] * b[0..3]. */ + muladd_fast(a->d[0], b->d[0]); + extract_fast(l[0]); + muladd(a->d[0], b->d[1]); + muladd(a->d[1], b->d[0]); + extract(l[1]); + muladd(a->d[0], b->d[2]); + muladd(a->d[1], b->d[1]); + muladd(a->d[2], b->d[0]); + extract(l[2]); + muladd(a->d[0], b->d[3]); + muladd(a->d[1], b->d[2]); + muladd(a->d[2], b->d[1]); + muladd(a->d[3], b->d[0]); + extract(l[3]); + muladd(a->d[1], b->d[3]); + muladd(a->d[2], b->d[2]); + muladd(a->d[3], b->d[1]); + extract(l[4]); + muladd(a->d[2], b->d[3]); + muladd(a->d[3], b->d[2]); + extract(l[5]); + muladd_fast(a->d[3], b->d[3]); + extract_fast(l[6]); + VERIFY_CHECK(c1 <= 0); + l[7] = c0; +#endif +} + +static void secp256k1_scalar_sqr_512(uint64_t l[8], const secp256k1_scalar_t *a) { +#ifdef USE_ASM_X86_64 + __asm__ __volatile__( + /* Preload */ + "movq 0(%%rdi), %%r11\n" + "movq 8(%%rdi), %%r12\n" + "movq 16(%%rdi), %%r13\n" + "movq 24(%%rdi), %%r14\n" + /* (rax,rdx) = a0 * a0 */ + "movq %%r11, %%rax\n" + "mulq %%r11\n" + /* Extract l0 */ + "movq %%rax, 0(%%rsi)\n" + /* (r8,r9,r10) = (rdx,0) */ + "movq %%rdx, %%r8\n" + "xorq %%r9, %%r9\n" + "xorq %%r10, %%r10\n" + /* (r8,r9,r10) += 2 * a0 * a1 */ + "movq %%r11, %%rax\n" + "mulq %%r12\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + /* Extract l1 */ + "movq %%r8, 8(%%rsi)\n" + "xorq %%r8, %%r8\n" + /* (r9,r10,r8) += 2 * a0 * a2 */ + "movq %%r11, %%rax\n" + "mulq %%r13\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* (r9,r10,r8) += a1 * a1 */ + "movq %%r12, %%rax\n" + "mulq %%r12\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* Extract l2 */ + "movq %%r9, 16(%%rsi)\n" + "xorq %%r9, %%r9\n" + /* (r10,r8,r9) += 2 * a0 * a3 */ + "movq %%r11, %%rax\n" + "mulq %%r14\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + /* (r10,r8,r9) += 2 * a1 * a2 */ + "movq %%r12, %%rax\n" + "mulq %%r13\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + "adcq $0, %%r9\n" + /* Extract l3 */ + "movq %%r10, 24(%%rsi)\n" + "xorq %%r10, %%r10\n" + /* (r8,r9,r10) += 2 * a1 * a3 */ + "movq %%r12, %%rax\n" + "mulq %%r14\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + /* (r8,r9,r10) += a2 * a2 */ + "movq %%r13, %%rax\n" + "mulq %%r13\n" + "addq %%rax, %%r8\n" + "adcq %%rdx, %%r9\n" + "adcq $0, %%r10\n" + /* Extract l4 */ + "movq %%r8, 32(%%rsi)\n" + "xorq %%r8, %%r8\n" + /* (r9,r10,r8) += 2 * a2 * a3 */ + "movq %%r13, %%rax\n" + "mulq %%r14\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + "addq %%rax, %%r9\n" + "adcq %%rdx, %%r10\n" + "adcq $0, %%r8\n" + /* Extract l5 */ + "movq %%r9, 40(%%rsi)\n" + /* (r10,r8) += a3 * a3 */ + "movq %%r14, %%rax\n" + "mulq %%r14\n" + "addq %%rax, %%r10\n" + "adcq %%rdx, %%r8\n" + /* Extract l6 */ + "movq %%r10, 48(%%rsi)\n" + /* Extract l7 */ + "movq %%r8, 56(%%rsi)\n" + : + : "S"(l), "D"(a->d) + : "rax", "rdx", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "cc", "memory"); +#else + /* 160 bit accumulator. */ + uint64_t c0 = 0, c1 = 0; + uint32_t c2 = 0; + + /* l[0..7] = a[0..3] * b[0..3]. */ + muladd_fast(a->d[0], a->d[0]); + extract_fast(l[0]); + muladd2(a->d[0], a->d[1]); + extract(l[1]); + muladd2(a->d[0], a->d[2]); + muladd(a->d[1], a->d[1]); + extract(l[2]); + muladd2(a->d[0], a->d[3]); + muladd2(a->d[1], a->d[2]); + extract(l[3]); + muladd2(a->d[1], a->d[3]); + muladd(a->d[2], a->d[2]); + extract(l[4]); + muladd2(a->d[2], a->d[3]); + extract(l[5]); + muladd_fast(a->d[3], a->d[3]); + extract_fast(l[6]); + VERIFY_CHECK(c1 == 0); + l[7] = c0; +#endif +} + +#undef sumadd +#undef sumadd_fast +#undef muladd +#undef muladd_fast +#undef muladd2 +#undef extract +#undef extract_fast + +static void secp256k1_scalar_mul(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { + uint64_t l[8]; + secp256k1_scalar_mul_512(l, a, b); + secp256k1_scalar_reduce_512(r, l); +} + +static void secp256k1_scalar_sqr(secp256k1_scalar_t *r, const secp256k1_scalar_t *a) { + uint64_t l[8]; + secp256k1_scalar_sqr_512(l, a); + secp256k1_scalar_reduce_512(r, l); +} + +static void secp256k1_scalar_split_128(secp256k1_scalar_t *r1, secp256k1_scalar_t *r2, const secp256k1_scalar_t *a) { + r1->d[0] = a->d[0]; + r1->d[1] = a->d[1]; + r1->d[2] = 0; + r1->d[3] = 0; + r2->d[0] = a->d[2]; + r2->d[1] = a->d[3]; + r2->d[2] = 0; + r2->d[3] = 0; +} + +SECP256K1_INLINE static int secp256k1_scalar_eq(const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { + return ((a->d[0] ^ b->d[0]) | (a->d[1] ^ b->d[1]) | (a->d[2] ^ b->d[2]) | (a->d[3] ^ b->d[3])) == 0; +} + +SECP256K1_INLINE static void secp256k1_scalar_mul_shift_var(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b, unsigned int shift) { + uint64_t l[8]; + unsigned int shiftlimbs; + unsigned int shiftlow; + unsigned int shifthigh; + VERIFY_CHECK(shift >= 256); + secp256k1_scalar_mul_512(l, a, b); + shiftlimbs = shift >> 6; + shiftlow = shift & 0x3F; + shifthigh = 64 - shiftlow; + r->d[0] = shift < 512 ? (l[0 + shiftlimbs] >> shiftlow | (shift < 448 && shiftlow ? (l[1 + shiftlimbs] << shifthigh) : 0)) : 0; + r->d[1] = shift < 448 ? (l[1 + shiftlimbs] >> shiftlow | (shift < 384 && shiftlow ? (l[2 + shiftlimbs] << shifthigh) : 0)) : 0; + r->d[2] = shift < 384 ? (l[2 + shiftlimbs] >> shiftlow | (shift < 320 && shiftlow ? (l[3 + shiftlimbs] << shifthigh) : 0)) : 0; + r->d[3] = shift < 320 ? (l[3 + shiftlimbs] >> shiftlow) : 0; + if ((l[(shift - 1) >> 6] >> ((shift - 1) & 0x3f)) & 1) { + secp256k1_scalar_add_bit(r, 0); + } +} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/scalar_8x32.h b/src/cryptoconditions/src/include/secp256k1/src/scalar_8x32.h new file mode 100644 index 00000000000..f17017e24e2 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/scalar_8x32.h @@ -0,0 +1,19 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_SCALAR_REPR_ +#define _SECP256K1_SCALAR_REPR_ + +#include + +/** A scalar modulo the group order of the secp256k1 curve. */ +typedef struct { + uint32_t d[8]; +} secp256k1_scalar_t; + +#define SECP256K1_SCALAR_CONST(d7, d6, d5, d4, d3, d2, d1, d0) {{(d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7)}} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/scalar_8x32_impl.h b/src/cryptoconditions/src/include/secp256k1/src/scalar_8x32_impl.h new file mode 100644 index 00000000000..22b31d41125 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/scalar_8x32_impl.h @@ -0,0 +1,681 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_SCALAR_REPR_IMPL_H_ +#define _SECP256K1_SCALAR_REPR_IMPL_H_ + +/* Limbs of the secp256k1 order. */ +#define SECP256K1_N_0 ((uint32_t)0xD0364141UL) +#define SECP256K1_N_1 ((uint32_t)0xBFD25E8CUL) +#define SECP256K1_N_2 ((uint32_t)0xAF48A03BUL) +#define SECP256K1_N_3 ((uint32_t)0xBAAEDCE6UL) +#define SECP256K1_N_4 ((uint32_t)0xFFFFFFFEUL) +#define SECP256K1_N_5 ((uint32_t)0xFFFFFFFFUL) +#define SECP256K1_N_6 ((uint32_t)0xFFFFFFFFUL) +#define SECP256K1_N_7 ((uint32_t)0xFFFFFFFFUL) + +/* Limbs of 2^256 minus the secp256k1 order. */ +#define SECP256K1_N_C_0 (~SECP256K1_N_0 + 1) +#define SECP256K1_N_C_1 (~SECP256K1_N_1) +#define SECP256K1_N_C_2 (~SECP256K1_N_2) +#define SECP256K1_N_C_3 (~SECP256K1_N_3) +#define SECP256K1_N_C_4 (1) + +/* Limbs of half the secp256k1 order. */ +#define SECP256K1_N_H_0 ((uint32_t)0x681B20A0UL) +#define SECP256K1_N_H_1 ((uint32_t)0xDFE92F46UL) +#define SECP256K1_N_H_2 ((uint32_t)0x57A4501DUL) +#define SECP256K1_N_H_3 ((uint32_t)0x5D576E73UL) +#define SECP256K1_N_H_4 ((uint32_t)0xFFFFFFFFUL) +#define SECP256K1_N_H_5 ((uint32_t)0xFFFFFFFFUL) +#define SECP256K1_N_H_6 ((uint32_t)0xFFFFFFFFUL) +#define SECP256K1_N_H_7 ((uint32_t)0x7FFFFFFFUL) + +SECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar_t *r) { + r->d[0] = 0; + r->d[1] = 0; + r->d[2] = 0; + r->d[3] = 0; + r->d[4] = 0; + r->d[5] = 0; + r->d[6] = 0; + r->d[7] = 0; +} + +SECP256K1_INLINE static void secp256k1_scalar_set_int(secp256k1_scalar_t *r, unsigned int v) { + r->d[0] = v; + r->d[1] = 0; + r->d[2] = 0; + r->d[3] = 0; + r->d[4] = 0; + r->d[5] = 0; + r->d[6] = 0; + r->d[7] = 0; +} + +SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar_t *a, unsigned int offset, unsigned int count) { + VERIFY_CHECK((offset + count - 1) >> 5 == offset >> 5); + return (a->d[offset >> 5] >> (offset & 0x1F)) & ((1 << count) - 1); +} + +SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar_t *a, unsigned int offset, unsigned int count) { + VERIFY_CHECK(count < 32); + VERIFY_CHECK(offset + count <= 256); + if ((offset + count - 1) >> 5 == offset >> 5) { + return secp256k1_scalar_get_bits(a, offset, count); + } else { + VERIFY_CHECK((offset >> 5) + 1 < 8); + return ((a->d[offset >> 5] >> (offset & 0x1F)) | (a->d[(offset >> 5) + 1] << (32 - (offset & 0x1F)))) & ((((uint32_t)1) << count) - 1); + } +} + +SECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scalar_t *a) { + int yes = 0; + int no = 0; + no |= (a->d[7] < SECP256K1_N_7); /* No need for a > check. */ + no |= (a->d[6] < SECP256K1_N_6); /* No need for a > check. */ + no |= (a->d[5] < SECP256K1_N_5); /* No need for a > check. */ + no |= (a->d[4] < SECP256K1_N_4); + yes |= (a->d[4] > SECP256K1_N_4) & ~no; + no |= (a->d[3] < SECP256K1_N_3) & ~yes; + yes |= (a->d[3] > SECP256K1_N_3) & ~no; + no |= (a->d[2] < SECP256K1_N_2) & ~yes; + yes |= (a->d[2] > SECP256K1_N_2) & ~no; + no |= (a->d[1] < SECP256K1_N_1) & ~yes; + yes |= (a->d[1] > SECP256K1_N_1) & ~no; + yes |= (a->d[0] >= SECP256K1_N_0) & ~no; + return yes; +} + +SECP256K1_INLINE static int secp256k1_scalar_reduce(secp256k1_scalar_t *r, uint32_t overflow) { + uint64_t t; + VERIFY_CHECK(overflow <= 1); + t = (uint64_t)r->d[0] + overflow * SECP256K1_N_C_0; + r->d[0] = t & 0xFFFFFFFFUL; t >>= 32; + t += (uint64_t)r->d[1] + overflow * SECP256K1_N_C_1; + r->d[1] = t & 0xFFFFFFFFUL; t >>= 32; + t += (uint64_t)r->d[2] + overflow * SECP256K1_N_C_2; + r->d[2] = t & 0xFFFFFFFFUL; t >>= 32; + t += (uint64_t)r->d[3] + overflow * SECP256K1_N_C_3; + r->d[3] = t & 0xFFFFFFFFUL; t >>= 32; + t += (uint64_t)r->d[4] + overflow * SECP256K1_N_C_4; + r->d[4] = t & 0xFFFFFFFFUL; t >>= 32; + t += (uint64_t)r->d[5]; + r->d[5] = t & 0xFFFFFFFFUL; t >>= 32; + t += (uint64_t)r->d[6]; + r->d[6] = t & 0xFFFFFFFFUL; t >>= 32; + t += (uint64_t)r->d[7]; + r->d[7] = t & 0xFFFFFFFFUL; + return overflow; +} + +static int secp256k1_scalar_add(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { + int overflow; + uint64_t t = (uint64_t)a->d[0] + b->d[0]; + r->d[0] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)a->d[1] + b->d[1]; + r->d[1] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)a->d[2] + b->d[2]; + r->d[2] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)a->d[3] + b->d[3]; + r->d[3] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)a->d[4] + b->d[4]; + r->d[4] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)a->d[5] + b->d[5]; + r->d[5] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)a->d[6] + b->d[6]; + r->d[6] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)a->d[7] + b->d[7]; + r->d[7] = t & 0xFFFFFFFFULL; t >>= 32; + overflow = t + secp256k1_scalar_check_overflow(r); + VERIFY_CHECK(overflow == 0 || overflow == 1); + secp256k1_scalar_reduce(r, overflow); + return overflow; +} + +static void secp256k1_scalar_add_bit(secp256k1_scalar_t *r, unsigned int bit) { + uint64_t t; + VERIFY_CHECK(bit < 256); + t = (uint64_t)r->d[0] + (((uint32_t)((bit >> 5) == 0)) << (bit & 0x1F)); + r->d[0] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)r->d[1] + (((uint32_t)((bit >> 5) == 1)) << (bit & 0x1F)); + r->d[1] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)r->d[2] + (((uint32_t)((bit >> 5) == 2)) << (bit & 0x1F)); + r->d[2] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)r->d[3] + (((uint32_t)((bit >> 5) == 3)) << (bit & 0x1F)); + r->d[3] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)r->d[4] + (((uint32_t)((bit >> 5) == 4)) << (bit & 0x1F)); + r->d[4] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)r->d[5] + (((uint32_t)((bit >> 5) == 5)) << (bit & 0x1F)); + r->d[5] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)r->d[6] + (((uint32_t)((bit >> 5) == 6)) << (bit & 0x1F)); + r->d[6] = t & 0xFFFFFFFFULL; t >>= 32; + t += (uint64_t)r->d[7] + (((uint32_t)((bit >> 5) == 7)) << (bit & 0x1F)); + r->d[7] = t & 0xFFFFFFFFULL; +#ifdef VERIFY + VERIFY_CHECK((t >> 32) == 0); + VERIFY_CHECK(secp256k1_scalar_check_overflow(r) == 0); +#endif +} + +static void secp256k1_scalar_set_b32(secp256k1_scalar_t *r, const unsigned char *b32, int *overflow) { + int over; + r->d[0] = (uint32_t)b32[31] | (uint32_t)b32[30] << 8 | (uint32_t)b32[29] << 16 | (uint32_t)b32[28] << 24; + r->d[1] = (uint32_t)b32[27] | (uint32_t)b32[26] << 8 | (uint32_t)b32[25] << 16 | (uint32_t)b32[24] << 24; + r->d[2] = (uint32_t)b32[23] | (uint32_t)b32[22] << 8 | (uint32_t)b32[21] << 16 | (uint32_t)b32[20] << 24; + r->d[3] = (uint32_t)b32[19] | (uint32_t)b32[18] << 8 | (uint32_t)b32[17] << 16 | (uint32_t)b32[16] << 24; + r->d[4] = (uint32_t)b32[15] | (uint32_t)b32[14] << 8 | (uint32_t)b32[13] << 16 | (uint32_t)b32[12] << 24; + r->d[5] = (uint32_t)b32[11] | (uint32_t)b32[10] << 8 | (uint32_t)b32[9] << 16 | (uint32_t)b32[8] << 24; + r->d[6] = (uint32_t)b32[7] | (uint32_t)b32[6] << 8 | (uint32_t)b32[5] << 16 | (uint32_t)b32[4] << 24; + r->d[7] = (uint32_t)b32[3] | (uint32_t)b32[2] << 8 | (uint32_t)b32[1] << 16 | (uint32_t)b32[0] << 24; + over = secp256k1_scalar_reduce(r, secp256k1_scalar_check_overflow(r)); + if (overflow) { + *overflow = over; + } +} + +static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar_t* a) { + bin[0] = a->d[7] >> 24; bin[1] = a->d[7] >> 16; bin[2] = a->d[7] >> 8; bin[3] = a->d[7]; + bin[4] = a->d[6] >> 24; bin[5] = a->d[6] >> 16; bin[6] = a->d[6] >> 8; bin[7] = a->d[6]; + bin[8] = a->d[5] >> 24; bin[9] = a->d[5] >> 16; bin[10] = a->d[5] >> 8; bin[11] = a->d[5]; + bin[12] = a->d[4] >> 24; bin[13] = a->d[4] >> 16; bin[14] = a->d[4] >> 8; bin[15] = a->d[4]; + bin[16] = a->d[3] >> 24; bin[17] = a->d[3] >> 16; bin[18] = a->d[3] >> 8; bin[19] = a->d[3]; + bin[20] = a->d[2] >> 24; bin[21] = a->d[2] >> 16; bin[22] = a->d[2] >> 8; bin[23] = a->d[2]; + bin[24] = a->d[1] >> 24; bin[25] = a->d[1] >> 16; bin[26] = a->d[1] >> 8; bin[27] = a->d[1]; + bin[28] = a->d[0] >> 24; bin[29] = a->d[0] >> 16; bin[30] = a->d[0] >> 8; bin[31] = a->d[0]; +} + +SECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar_t *a) { + return (a->d[0] | a->d[1] | a->d[2] | a->d[3] | a->d[4] | a->d[5] | a->d[6] | a->d[7]) == 0; +} + +static void secp256k1_scalar_negate(secp256k1_scalar_t *r, const secp256k1_scalar_t *a) { + uint32_t nonzero = 0xFFFFFFFFUL * (secp256k1_scalar_is_zero(a) == 0); + uint64_t t = (uint64_t)(~a->d[0]) + SECP256K1_N_0 + 1; + r->d[0] = t & nonzero; t >>= 32; + t += (uint64_t)(~a->d[1]) + SECP256K1_N_1; + r->d[1] = t & nonzero; t >>= 32; + t += (uint64_t)(~a->d[2]) + SECP256K1_N_2; + r->d[2] = t & nonzero; t >>= 32; + t += (uint64_t)(~a->d[3]) + SECP256K1_N_3; + r->d[3] = t & nonzero; t >>= 32; + t += (uint64_t)(~a->d[4]) + SECP256K1_N_4; + r->d[4] = t & nonzero; t >>= 32; + t += (uint64_t)(~a->d[5]) + SECP256K1_N_5; + r->d[5] = t & nonzero; t >>= 32; + t += (uint64_t)(~a->d[6]) + SECP256K1_N_6; + r->d[6] = t & nonzero; t >>= 32; + t += (uint64_t)(~a->d[7]) + SECP256K1_N_7; + r->d[7] = t & nonzero; +} + +SECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar_t *a) { + return ((a->d[0] ^ 1) | a->d[1] | a->d[2] | a->d[3] | a->d[4] | a->d[5] | a->d[6] | a->d[7]) == 0; +} + +static int secp256k1_scalar_is_high(const secp256k1_scalar_t *a) { + int yes = 0; + int no = 0; + no |= (a->d[7] < SECP256K1_N_H_7); + yes |= (a->d[7] > SECP256K1_N_H_7) & ~no; + no |= (a->d[6] < SECP256K1_N_H_6) & ~yes; /* No need for a > check. */ + no |= (a->d[5] < SECP256K1_N_H_5) & ~yes; /* No need for a > check. */ + no |= (a->d[4] < SECP256K1_N_H_4) & ~yes; /* No need for a > check. */ + no |= (a->d[3] < SECP256K1_N_H_3) & ~yes; + yes |= (a->d[3] > SECP256K1_N_H_3) & ~no; + no |= (a->d[2] < SECP256K1_N_H_2) & ~yes; + yes |= (a->d[2] > SECP256K1_N_H_2) & ~no; + no |= (a->d[1] < SECP256K1_N_H_1) & ~yes; + yes |= (a->d[1] > SECP256K1_N_H_1) & ~no; + yes |= (a->d[0] > SECP256K1_N_H_0) & ~no; + return yes; +} + +/* Inspired by the macros in OpenSSL's crypto/bn/asm/x86_64-gcc.c. */ + +/** Add a*b to the number defined by (c0,c1,c2). c2 must never overflow. */ +#define muladd(a,b) { \ + uint32_t tl, th; \ + { \ + uint64_t t = (uint64_t)a * b; \ + th = t >> 32; /* at most 0xFFFFFFFE */ \ + tl = t; \ + } \ + c0 += tl; /* overflow is handled on the next line */ \ + th += (c0 < tl) ? 1 : 0; /* at most 0xFFFFFFFF */ \ + c1 += th; /* overflow is handled on the next line */ \ + c2 += (c1 < th) ? 1 : 0; /* never overflows by contract (verified in the next line) */ \ + VERIFY_CHECK((c1 >= th) || (c2 != 0)); \ +} + +/** Add a*b to the number defined by (c0,c1). c1 must never overflow. */ +#define muladd_fast(a,b) { \ + uint32_t tl, th; \ + { \ + uint64_t t = (uint64_t)a * b; \ + th = t >> 32; /* at most 0xFFFFFFFE */ \ + tl = t; \ + } \ + c0 += tl; /* overflow is handled on the next line */ \ + th += (c0 < tl) ? 1 : 0; /* at most 0xFFFFFFFF */ \ + c1 += th; /* never overflows by contract (verified in the next line) */ \ + VERIFY_CHECK(c1 >= th); \ +} + +/** Add 2*a*b to the number defined by (c0,c1,c2). c2 must never overflow. */ +#define muladd2(a,b) { \ + uint32_t tl, th, th2, tl2; \ + { \ + uint64_t t = (uint64_t)a * b; \ + th = t >> 32; /* at most 0xFFFFFFFE */ \ + tl = t; \ + } \ + th2 = th + th; /* at most 0xFFFFFFFE (in case th was 0x7FFFFFFF) */ \ + c2 += (th2 < th) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ + VERIFY_CHECK((th2 >= th) || (c2 != 0)); \ + tl2 = tl + tl; /* at most 0xFFFFFFFE (in case the lowest 63 bits of tl were 0x7FFFFFFF) */ \ + th2 += (tl2 < tl) ? 1 : 0; /* at most 0xFFFFFFFF */ \ + c0 += tl2; /* overflow is handled on the next line */ \ + th2 += (c0 < tl2) ? 1 : 0; /* second overflow is handled on the next line */ \ + c2 += (c0 < tl2) & (th2 == 0); /* never overflows by contract (verified the next line) */ \ + VERIFY_CHECK((c0 >= tl2) || (th2 != 0) || (c2 != 0)); \ + c1 += th2; /* overflow is handled on the next line */ \ + c2 += (c1 < th2) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ + VERIFY_CHECK((c1 >= th2) || (c2 != 0)); \ +} + +/** Add a to the number defined by (c0,c1,c2). c2 must never overflow. */ +#define sumadd(a) { \ + unsigned int over; \ + c0 += (a); /* overflow is handled on the next line */ \ + over = (c0 < (a)) ? 1 : 0; \ + c1 += over; /* overflow is handled on the next line */ \ + c2 += (c1 < over) ? 1 : 0; /* never overflows by contract */ \ +} + +/** Add a to the number defined by (c0,c1). c1 must never overflow, c2 must be zero. */ +#define sumadd_fast(a) { \ + c0 += (a); /* overflow is handled on the next line */ \ + c1 += (c0 < (a)) ? 1 : 0; /* never overflows by contract (verified the next line) */ \ + VERIFY_CHECK((c1 != 0) | (c0 >= (a))); \ + VERIFY_CHECK(c2 == 0); \ +} + +/** Extract the lowest 32 bits of (c0,c1,c2) into n, and left shift the number 32 bits. */ +#define extract(n) { \ + (n) = c0; \ + c0 = c1; \ + c1 = c2; \ + c2 = 0; \ +} + +/** Extract the lowest 32 bits of (c0,c1,c2) into n, and left shift the number 32 bits. c2 is required to be zero. */ +#define extract_fast(n) { \ + (n) = c0; \ + c0 = c1; \ + c1 = 0; \ + VERIFY_CHECK(c2 == 0); \ +} + +static void secp256k1_scalar_reduce_512(secp256k1_scalar_t *r, const uint32_t *l) { + uint64_t c; + uint32_t n0 = l[8], n1 = l[9], n2 = l[10], n3 = l[11], n4 = l[12], n5 = l[13], n6 = l[14], n7 = l[15]; + uint32_t m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12; + uint32_t p0, p1, p2, p3, p4, p5, p6, p7, p8; + + /* 96 bit accumulator. */ + uint32_t c0, c1, c2; + + /* Reduce 512 bits into 385. */ + /* m[0..12] = l[0..7] + n[0..7] * SECP256K1_N_C. */ + c0 = l[0]; c1 = 0; c2 = 0; + muladd_fast(n0, SECP256K1_N_C_0); + extract_fast(m0); + sumadd_fast(l[1]); + muladd(n1, SECP256K1_N_C_0); + muladd(n0, SECP256K1_N_C_1); + extract(m1); + sumadd(l[2]); + muladd(n2, SECP256K1_N_C_0); + muladd(n1, SECP256K1_N_C_1); + muladd(n0, SECP256K1_N_C_2); + extract(m2); + sumadd(l[3]); + muladd(n3, SECP256K1_N_C_0); + muladd(n2, SECP256K1_N_C_1); + muladd(n1, SECP256K1_N_C_2); + muladd(n0, SECP256K1_N_C_3); + extract(m3); + sumadd(l[4]); + muladd(n4, SECP256K1_N_C_0); + muladd(n3, SECP256K1_N_C_1); + muladd(n2, SECP256K1_N_C_2); + muladd(n1, SECP256K1_N_C_3); + sumadd(n0); + extract(m4); + sumadd(l[5]); + muladd(n5, SECP256K1_N_C_0); + muladd(n4, SECP256K1_N_C_1); + muladd(n3, SECP256K1_N_C_2); + muladd(n2, SECP256K1_N_C_3); + sumadd(n1); + extract(m5); + sumadd(l[6]); + muladd(n6, SECP256K1_N_C_0); + muladd(n5, SECP256K1_N_C_1); + muladd(n4, SECP256K1_N_C_2); + muladd(n3, SECP256K1_N_C_3); + sumadd(n2); + extract(m6); + sumadd(l[7]); + muladd(n7, SECP256K1_N_C_0); + muladd(n6, SECP256K1_N_C_1); + muladd(n5, SECP256K1_N_C_2); + muladd(n4, SECP256K1_N_C_3); + sumadd(n3); + extract(m7); + muladd(n7, SECP256K1_N_C_1); + muladd(n6, SECP256K1_N_C_2); + muladd(n5, SECP256K1_N_C_3); + sumadd(n4); + extract(m8); + muladd(n7, SECP256K1_N_C_2); + muladd(n6, SECP256K1_N_C_3); + sumadd(n5); + extract(m9); + muladd(n7, SECP256K1_N_C_3); + sumadd(n6); + extract(m10); + sumadd_fast(n7); + extract_fast(m11); + VERIFY_CHECK(c0 <= 1); + m12 = c0; + + /* Reduce 385 bits into 258. */ + /* p[0..8] = m[0..7] + m[8..12] * SECP256K1_N_C. */ + c0 = m0; c1 = 0; c2 = 0; + muladd_fast(m8, SECP256K1_N_C_0); + extract_fast(p0); + sumadd_fast(m1); + muladd(m9, SECP256K1_N_C_0); + muladd(m8, SECP256K1_N_C_1); + extract(p1); + sumadd(m2); + muladd(m10, SECP256K1_N_C_0); + muladd(m9, SECP256K1_N_C_1); + muladd(m8, SECP256K1_N_C_2); + extract(p2); + sumadd(m3); + muladd(m11, SECP256K1_N_C_0); + muladd(m10, SECP256K1_N_C_1); + muladd(m9, SECP256K1_N_C_2); + muladd(m8, SECP256K1_N_C_3); + extract(p3); + sumadd(m4); + muladd(m12, SECP256K1_N_C_0); + muladd(m11, SECP256K1_N_C_1); + muladd(m10, SECP256K1_N_C_2); + muladd(m9, SECP256K1_N_C_3); + sumadd(m8); + extract(p4); + sumadd(m5); + muladd(m12, SECP256K1_N_C_1); + muladd(m11, SECP256K1_N_C_2); + muladd(m10, SECP256K1_N_C_3); + sumadd(m9); + extract(p5); + sumadd(m6); + muladd(m12, SECP256K1_N_C_2); + muladd(m11, SECP256K1_N_C_3); + sumadd(m10); + extract(p6); + sumadd_fast(m7); + muladd_fast(m12, SECP256K1_N_C_3); + sumadd_fast(m11); + extract_fast(p7); + p8 = c0 + m12; + VERIFY_CHECK(p8 <= 2); + + /* Reduce 258 bits into 256. */ + /* r[0..7] = p[0..7] + p[8] * SECP256K1_N_C. */ + c = p0 + (uint64_t)SECP256K1_N_C_0 * p8; + r->d[0] = c & 0xFFFFFFFFUL; c >>= 32; + c += p1 + (uint64_t)SECP256K1_N_C_1 * p8; + r->d[1] = c & 0xFFFFFFFFUL; c >>= 32; + c += p2 + (uint64_t)SECP256K1_N_C_2 * p8; + r->d[2] = c & 0xFFFFFFFFUL; c >>= 32; + c += p3 + (uint64_t)SECP256K1_N_C_3 * p8; + r->d[3] = c & 0xFFFFFFFFUL; c >>= 32; + c += p4 + (uint64_t)p8; + r->d[4] = c & 0xFFFFFFFFUL; c >>= 32; + c += p5; + r->d[5] = c & 0xFFFFFFFFUL; c >>= 32; + c += p6; + r->d[6] = c & 0xFFFFFFFFUL; c >>= 32; + c += p7; + r->d[7] = c & 0xFFFFFFFFUL; c >>= 32; + + /* Final reduction of r. */ + secp256k1_scalar_reduce(r, c + secp256k1_scalar_check_overflow(r)); +} + +static void secp256k1_scalar_mul_512(uint32_t *l, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { + /* 96 bit accumulator. */ + uint32_t c0 = 0, c1 = 0, c2 = 0; + + /* l[0..15] = a[0..7] * b[0..7]. */ + muladd_fast(a->d[0], b->d[0]); + extract_fast(l[0]); + muladd(a->d[0], b->d[1]); + muladd(a->d[1], b->d[0]); + extract(l[1]); + muladd(a->d[0], b->d[2]); + muladd(a->d[1], b->d[1]); + muladd(a->d[2], b->d[0]); + extract(l[2]); + muladd(a->d[0], b->d[3]); + muladd(a->d[1], b->d[2]); + muladd(a->d[2], b->d[1]); + muladd(a->d[3], b->d[0]); + extract(l[3]); + muladd(a->d[0], b->d[4]); + muladd(a->d[1], b->d[3]); + muladd(a->d[2], b->d[2]); + muladd(a->d[3], b->d[1]); + muladd(a->d[4], b->d[0]); + extract(l[4]); + muladd(a->d[0], b->d[5]); + muladd(a->d[1], b->d[4]); + muladd(a->d[2], b->d[3]); + muladd(a->d[3], b->d[2]); + muladd(a->d[4], b->d[1]); + muladd(a->d[5], b->d[0]); + extract(l[5]); + muladd(a->d[0], b->d[6]); + muladd(a->d[1], b->d[5]); + muladd(a->d[2], b->d[4]); + muladd(a->d[3], b->d[3]); + muladd(a->d[4], b->d[2]); + muladd(a->d[5], b->d[1]); + muladd(a->d[6], b->d[0]); + extract(l[6]); + muladd(a->d[0], b->d[7]); + muladd(a->d[1], b->d[6]); + muladd(a->d[2], b->d[5]); + muladd(a->d[3], b->d[4]); + muladd(a->d[4], b->d[3]); + muladd(a->d[5], b->d[2]); + muladd(a->d[6], b->d[1]); + muladd(a->d[7], b->d[0]); + extract(l[7]); + muladd(a->d[1], b->d[7]); + muladd(a->d[2], b->d[6]); + muladd(a->d[3], b->d[5]); + muladd(a->d[4], b->d[4]); + muladd(a->d[5], b->d[3]); + muladd(a->d[6], b->d[2]); + muladd(a->d[7], b->d[1]); + extract(l[8]); + muladd(a->d[2], b->d[7]); + muladd(a->d[3], b->d[6]); + muladd(a->d[4], b->d[5]); + muladd(a->d[5], b->d[4]); + muladd(a->d[6], b->d[3]); + muladd(a->d[7], b->d[2]); + extract(l[9]); + muladd(a->d[3], b->d[7]); + muladd(a->d[4], b->d[6]); + muladd(a->d[5], b->d[5]); + muladd(a->d[6], b->d[4]); + muladd(a->d[7], b->d[3]); + extract(l[10]); + muladd(a->d[4], b->d[7]); + muladd(a->d[5], b->d[6]); + muladd(a->d[6], b->d[5]); + muladd(a->d[7], b->d[4]); + extract(l[11]); + muladd(a->d[5], b->d[7]); + muladd(a->d[6], b->d[6]); + muladd(a->d[7], b->d[5]); + extract(l[12]); + muladd(a->d[6], b->d[7]); + muladd(a->d[7], b->d[6]); + extract(l[13]); + muladd_fast(a->d[7], b->d[7]); + extract_fast(l[14]); + VERIFY_CHECK(c1 == 0); + l[15] = c0; +} + +static void secp256k1_scalar_sqr_512(uint32_t *l, const secp256k1_scalar_t *a) { + /* 96 bit accumulator. */ + uint32_t c0 = 0, c1 = 0, c2 = 0; + + /* l[0..15] = a[0..7]^2. */ + muladd_fast(a->d[0], a->d[0]); + extract_fast(l[0]); + muladd2(a->d[0], a->d[1]); + extract(l[1]); + muladd2(a->d[0], a->d[2]); + muladd(a->d[1], a->d[1]); + extract(l[2]); + muladd2(a->d[0], a->d[3]); + muladd2(a->d[1], a->d[2]); + extract(l[3]); + muladd2(a->d[0], a->d[4]); + muladd2(a->d[1], a->d[3]); + muladd(a->d[2], a->d[2]); + extract(l[4]); + muladd2(a->d[0], a->d[5]); + muladd2(a->d[1], a->d[4]); + muladd2(a->d[2], a->d[3]); + extract(l[5]); + muladd2(a->d[0], a->d[6]); + muladd2(a->d[1], a->d[5]); + muladd2(a->d[2], a->d[4]); + muladd(a->d[3], a->d[3]); + extract(l[6]); + muladd2(a->d[0], a->d[7]); + muladd2(a->d[1], a->d[6]); + muladd2(a->d[2], a->d[5]); + muladd2(a->d[3], a->d[4]); + extract(l[7]); + muladd2(a->d[1], a->d[7]); + muladd2(a->d[2], a->d[6]); + muladd2(a->d[3], a->d[5]); + muladd(a->d[4], a->d[4]); + extract(l[8]); + muladd2(a->d[2], a->d[7]); + muladd2(a->d[3], a->d[6]); + muladd2(a->d[4], a->d[5]); + extract(l[9]); + muladd2(a->d[3], a->d[7]); + muladd2(a->d[4], a->d[6]); + muladd(a->d[5], a->d[5]); + extract(l[10]); + muladd2(a->d[4], a->d[7]); + muladd2(a->d[5], a->d[6]); + extract(l[11]); + muladd2(a->d[5], a->d[7]); + muladd(a->d[6], a->d[6]); + extract(l[12]); + muladd2(a->d[6], a->d[7]); + extract(l[13]); + muladd_fast(a->d[7], a->d[7]); + extract_fast(l[14]); + VERIFY_CHECK(c1 == 0); + l[15] = c0; +} + +#undef sumadd +#undef sumadd_fast +#undef muladd +#undef muladd_fast +#undef muladd2 +#undef extract +#undef extract_fast + +static void secp256k1_scalar_mul(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { + uint32_t l[16]; + secp256k1_scalar_mul_512(l, a, b); + secp256k1_scalar_reduce_512(r, l); +} + +static void secp256k1_scalar_sqr(secp256k1_scalar_t *r, const secp256k1_scalar_t *a) { + uint32_t l[16]; + secp256k1_scalar_sqr_512(l, a); + secp256k1_scalar_reduce_512(r, l); +} + +#ifdef USE_ENDOMORPHISM +static void secp256k1_scalar_split_128(secp256k1_scalar_t *r1, secp256k1_scalar_t *r2, const secp256k1_scalar_t *a) { + r1->d[0] = a->d[0]; + r1->d[1] = a->d[1]; + r1->d[2] = a->d[2]; + r1->d[3] = a->d[3]; + r1->d[4] = 0; + r1->d[5] = 0; + r1->d[6] = 0; + r1->d[7] = 0; + r2->d[0] = a->d[4]; + r2->d[1] = a->d[5]; + r2->d[2] = a->d[6]; + r2->d[3] = a->d[7]; + r2->d[4] = 0; + r2->d[5] = 0; + r2->d[6] = 0; + r2->d[7] = 0; +} +#endif + +SECP256K1_INLINE static int secp256k1_scalar_eq(const secp256k1_scalar_t *a, const secp256k1_scalar_t *b) { + return ((a->d[0] ^ b->d[0]) | (a->d[1] ^ b->d[1]) | (a->d[2] ^ b->d[2]) | (a->d[3] ^ b->d[3]) | (a->d[4] ^ b->d[4]) | (a->d[5] ^ b->d[5]) | (a->d[6] ^ b->d[6]) | (a->d[7] ^ b->d[7])) == 0; +} + +SECP256K1_INLINE static void secp256k1_scalar_mul_shift_var(secp256k1_scalar_t *r, const secp256k1_scalar_t *a, const secp256k1_scalar_t *b, unsigned int shift) { + uint32_t l[16]; + unsigned int shiftlimbs; + unsigned int shiftlow; + unsigned int shifthigh; + VERIFY_CHECK(shift >= 256); + secp256k1_scalar_mul_512(l, a, b); + shiftlimbs = shift >> 5; + shiftlow = shift & 0x1F; + shifthigh = 32 - shiftlow; + r->d[0] = shift < 512 ? (l[0 + shiftlimbs] >> shiftlow | (shift < 480 && shiftlow ? (l[1 + shiftlimbs] << shifthigh) : 0)) : 0; + r->d[1] = shift < 480 ? (l[1 + shiftlimbs] >> shiftlow | (shift < 448 && shiftlow ? (l[2 + shiftlimbs] << shifthigh) : 0)) : 0; + r->d[2] = shift < 448 ? (l[2 + shiftlimbs] >> shiftlow | (shift < 416 && shiftlow ? (l[3 + shiftlimbs] << shifthigh) : 0)) : 0; + r->d[3] = shift < 416 ? (l[3 + shiftlimbs] >> shiftlow | (shift < 384 && shiftlow ? (l[4 + shiftlimbs] << shifthigh) : 0)) : 0; + r->d[4] = shift < 384 ? (l[4 + shiftlimbs] >> shiftlow | (shift < 352 && shiftlow ? (l[5 + shiftlimbs] << shifthigh) : 0)) : 0; + r->d[5] = shift < 352 ? (l[5 + shiftlimbs] >> shiftlow | (shift < 320 && shiftlow ? (l[6 + shiftlimbs] << shifthigh) : 0)) : 0; + r->d[6] = shift < 320 ? (l[6 + shiftlimbs] >> shiftlow | (shift < 288 && shiftlow ? (l[7 + shiftlimbs] << shifthigh) : 0)) : 0; + r->d[7] = shift < 288 ? (l[7 + shiftlimbs] >> shiftlow) : 0; + if ((l[(shift - 1) >> 5] >> ((shift - 1) & 0x1f)) & 1) { + secp256k1_scalar_add_bit(r, 0); + } +} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/scalar_impl.h b/src/cryptoconditions/src/include/secp256k1/src/scalar_impl.h new file mode 100644 index 00000000000..33824983e4d --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/scalar_impl.h @@ -0,0 +1,327 @@ +/********************************************************************** + * Copyright (c) 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_SCALAR_IMPL_H_ +#define _SECP256K1_SCALAR_IMPL_H_ + +#include + +#include "group.h" +#include "scalar.h" + +#if defined HAVE_CONFIG_H +#include "libsecp256k1-config.h" +#endif + +#if defined(USE_SCALAR_4X64) +#include "scalar_4x64_impl.h" +#elif defined(USE_SCALAR_8X32) +#include "scalar_8x32_impl.h" +#else +#error "Please select scalar implementation" +#endif + +#ifndef USE_NUM_NONE +static void secp256k1_scalar_get_num(secp256k1_num_t *r, const secp256k1_scalar_t *a) { + unsigned char c[32]; + secp256k1_scalar_get_b32(c, a); + secp256k1_num_set_bin(r, c, 32); +} + +/** secp256k1 curve order, see secp256k1_ecdsa_const_order_as_fe in ecdsa_impl.h */ +static void secp256k1_scalar_order_get_num(secp256k1_num_t *r) { + static const unsigned char order[32] = { + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B, + 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x41 + }; + secp256k1_num_set_bin(r, order, 32); +} +#endif + +static void secp256k1_scalar_inverse(secp256k1_scalar_t *r, const secp256k1_scalar_t *x) { + secp256k1_scalar_t *t; + int i; + /* First compute x ^ (2^N - 1) for some values of N. */ + secp256k1_scalar_t x2, x3, x4, x6, x7, x8, x15, x30, x60, x120, x127; + + secp256k1_scalar_sqr(&x2, x); + secp256k1_scalar_mul(&x2, &x2, x); + + secp256k1_scalar_sqr(&x3, &x2); + secp256k1_scalar_mul(&x3, &x3, x); + + secp256k1_scalar_sqr(&x4, &x3); + secp256k1_scalar_mul(&x4, &x4, x); + + secp256k1_scalar_sqr(&x6, &x4); + secp256k1_scalar_sqr(&x6, &x6); + secp256k1_scalar_mul(&x6, &x6, &x2); + + secp256k1_scalar_sqr(&x7, &x6); + secp256k1_scalar_mul(&x7, &x7, x); + + secp256k1_scalar_sqr(&x8, &x7); + secp256k1_scalar_mul(&x8, &x8, x); + + secp256k1_scalar_sqr(&x15, &x8); + for (i = 0; i < 6; i++) { + secp256k1_scalar_sqr(&x15, &x15); + } + secp256k1_scalar_mul(&x15, &x15, &x7); + + secp256k1_scalar_sqr(&x30, &x15); + for (i = 0; i < 14; i++) { + secp256k1_scalar_sqr(&x30, &x30); + } + secp256k1_scalar_mul(&x30, &x30, &x15); + + secp256k1_scalar_sqr(&x60, &x30); + for (i = 0; i < 29; i++) { + secp256k1_scalar_sqr(&x60, &x60); + } + secp256k1_scalar_mul(&x60, &x60, &x30); + + secp256k1_scalar_sqr(&x120, &x60); + for (i = 0; i < 59; i++) { + secp256k1_scalar_sqr(&x120, &x120); + } + secp256k1_scalar_mul(&x120, &x120, &x60); + + secp256k1_scalar_sqr(&x127, &x120); + for (i = 0; i < 6; i++) { + secp256k1_scalar_sqr(&x127, &x127); + } + secp256k1_scalar_mul(&x127, &x127, &x7); + + /* Then accumulate the final result (t starts at x127). */ + t = &x127; + for (i = 0; i < 2; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 4; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x3); /* 111 */ + for (i = 0; i < 2; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 2; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 2; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 4; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x3); /* 111 */ + for (i = 0; i < 3; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x2); /* 11 */ + for (i = 0; i < 4; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x3); /* 111 */ + for (i = 0; i < 5; i++) { /* 00 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x3); /* 111 */ + for (i = 0; i < 4; i++) { /* 00 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x2); /* 11 */ + for (i = 0; i < 2; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 2; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 5; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x4); /* 1111 */ + for (i = 0; i < 2; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 3; i++) { /* 00 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 4; i++) { /* 000 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 2; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 10; i++) { /* 0000000 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x3); /* 111 */ + for (i = 0; i < 4; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x3); /* 111 */ + for (i = 0; i < 9; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x8); /* 11111111 */ + for (i = 0; i < 2; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 3; i++) { /* 00 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 3; i++) { /* 00 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 5; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x4); /* 1111 */ + for (i = 0; i < 2; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 5; i++) { /* 000 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x2); /* 11 */ + for (i = 0; i < 4; i++) { /* 00 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x2); /* 11 */ + for (i = 0; i < 2; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 8; i++) { /* 000000 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x2); /* 11 */ + for (i = 0; i < 3; i++) { /* 0 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, &x2); /* 11 */ + for (i = 0; i < 3; i++) { /* 00 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 6; i++) { /* 00000 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(t, t, x); /* 1 */ + for (i = 0; i < 8; i++) { /* 00 */ + secp256k1_scalar_sqr(t, t); + } + secp256k1_scalar_mul(r, t, &x6); /* 111111 */ +} + +static void secp256k1_scalar_inverse_var(secp256k1_scalar_t *r, const secp256k1_scalar_t *x) { +#if defined(USE_SCALAR_INV_BUILTIN) + secp256k1_scalar_inverse(r, x); +#elif defined(USE_SCALAR_INV_NUM) + unsigned char b[32]; + secp256k1_num_t n, m; + secp256k1_scalar_get_b32(b, x); + secp256k1_num_set_bin(&n, b, 32); + secp256k1_scalar_order_get_num(&m); + secp256k1_num_mod_inverse(&n, &n, &m); + secp256k1_num_get_bin(b, 32, &n); + secp256k1_scalar_set_b32(r, b, NULL); +#else +#error "Please select scalar inverse implementation" +#endif +} + +#ifdef USE_ENDOMORPHISM +/** + * The Secp256k1 curve has an endomorphism, where lambda * (x, y) = (beta * x, y), where + * lambda is {0x53,0x63,0xad,0x4c,0xc0,0x5c,0x30,0xe0,0xa5,0x26,0x1c,0x02,0x88,0x12,0x64,0x5a, + * 0x12,0x2e,0x22,0xea,0x20,0x81,0x66,0x78,0xdf,0x02,0x96,0x7c,0x1b,0x23,0xbd,0x72} + * + * "Guide to Elliptic Curve Cryptography" (Hankerson, Menezes, Vanstone) gives an algorithm + * (algorithm 3.74) to find k1 and k2 given k, such that k1 + k2 * lambda == k mod n, and k1 + * and k2 have a small size. + * It relies on constants a1, b1, a2, b2. These constants for the value of lambda above are: + * + * - a1 = {0x30,0x86,0xd2,0x21,0xa7,0xd4,0x6b,0xcd,0xe8,0x6c,0x90,0xe4,0x92,0x84,0xeb,0x15} + * - b1 = -{0xe4,0x43,0x7e,0xd6,0x01,0x0e,0x88,0x28,0x6f,0x54,0x7f,0xa9,0x0a,0xbf,0xe4,0xc3} + * - a2 = {0x01,0x14,0xca,0x50,0xf7,0xa8,0xe2,0xf3,0xf6,0x57,0xc1,0x10,0x8d,0x9d,0x44,0xcf,0xd8} + * - b2 = {0x30,0x86,0xd2,0x21,0xa7,0xd4,0x6b,0xcd,0xe8,0x6c,0x90,0xe4,0x92,0x84,0xeb,0x15} + * + * The algorithm then computes c1 = round(b1 * k / n) and c2 = round(b2 * k / n), and gives + * k1 = k - (c1*a1 + c2*a2) and k2 = -(c1*b1 + c2*b2). Instead, we use modular arithmetic, and + * compute k1 as k - k2 * lambda, avoiding the need for constants a1 and a2. + * + * g1, g2 are precomputed constants used to replace division with a rounded multiplication + * when decomposing the scalar for an endomorphism-based point multiplication. + * + * The possibility of using precomputed estimates is mentioned in "Guide to Elliptic Curve + * Cryptography" (Hankerson, Menezes, Vanstone) in section 3.5. + * + * The derivation is described in the paper "Efficient Software Implementation of Public-Key + * Cryptography on Sensor Networks Using the MSP430X Microcontroller" (Gouvea, Oliveira, Lopez), + * Section 4.3 (here we use a somewhat higher-precision estimate): + * d = a1*b2 - b1*a2 + * g1 = round((2^272)*b2/d) + * g2 = round((2^272)*b1/d) + * + * (Note that 'd' is also equal to the curve order here because [a1,b1] and [a2,b2] are found + * as outputs of the Extended Euclidean Algorithm on inputs 'order' and 'lambda'). + * + * The function below splits a in r1 and r2, such that r1 + lambda * r2 == a (mod order). + */ + +static void secp256k1_scalar_split_lambda_var(secp256k1_scalar_t *r1, secp256k1_scalar_t *r2, const secp256k1_scalar_t *a) { + secp256k1_scalar_t c1, c2; + static const secp256k1_scalar_t minus_lambda = SECP256K1_SCALAR_CONST( + 0xAC9C52B3UL, 0x3FA3CF1FUL, 0x5AD9E3FDUL, 0x77ED9BA4UL, + 0xA880B9FCUL, 0x8EC739C2UL, 0xE0CFC810UL, 0xB51283CFUL + ); + static const secp256k1_scalar_t minus_b1 = SECP256K1_SCALAR_CONST( + 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00000000UL, + 0xE4437ED6UL, 0x010E8828UL, 0x6F547FA9UL, 0x0ABFE4C3UL + ); + static const secp256k1_scalar_t minus_b2 = SECP256K1_SCALAR_CONST( + 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFEUL, + 0x8A280AC5UL, 0x0774346DUL, 0xD765CDA8UL, 0x3DB1562CUL + ); + static const secp256k1_scalar_t g1 = SECP256K1_SCALAR_CONST( + 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x00003086UL, + 0xD221A7D4UL, 0x6BCDE86CUL, 0x90E49284UL, 0xEB153DABUL + ); + static const secp256k1_scalar_t g2 = SECP256K1_SCALAR_CONST( + 0x00000000UL, 0x00000000UL, 0x00000000UL, 0x0000E443UL, + 0x7ED6010EUL, 0x88286F54UL, 0x7FA90ABFUL, 0xE4C42212UL + ); + VERIFY_CHECK(r1 != a); + VERIFY_CHECK(r2 != a); + secp256k1_scalar_mul_shift_var(&c1, a, &g1, 272); + secp256k1_scalar_mul_shift_var(&c2, a, &g2, 272); + secp256k1_scalar_mul(&c1, &c1, &minus_b1); + secp256k1_scalar_mul(&c2, &c2, &minus_b2); + secp256k1_scalar_add(r2, &c1, &c2); + secp256k1_scalar_mul(r1, r2, &minus_lambda); + secp256k1_scalar_add(r1, r1, a); +} +#endif + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/secp256k1.c b/src/cryptoconditions/src/include/secp256k1/src/secp256k1.c new file mode 100644 index 00000000000..d6192dc4ed6 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/secp256k1.c @@ -0,0 +1,419 @@ +/********************************************************************** + * Copyright (c) 2013-2015 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#define SECP256K1_BUILD (1) + +#include "include/secp256k1.h" + +#include "util.h" +#include "num_impl.h" +#include "field_impl.h" +#include "scalar_impl.h" +#include "group_impl.h" +#include "ecmult_impl.h" +#include "ecmult_gen_impl.h" +#include "ecdsa_impl.h" +#include "eckey_impl.h" +#include "hash_impl.h" + +struct secp256k1_context_struct { + secp256k1_ecmult_context_t ecmult_ctx; + secp256k1_ecmult_gen_context_t ecmult_gen_ctx; +}; + +secp256k1_context_t* secp256k1_context_create(int flags) { + secp256k1_context_t* ret = (secp256k1_context_t*)checked_malloc(sizeof(secp256k1_context_t)); + + secp256k1_ecmult_context_init(&ret->ecmult_ctx); + secp256k1_ecmult_gen_context_init(&ret->ecmult_gen_ctx); + + if (flags & SECP256K1_CONTEXT_SIGN) { + secp256k1_ecmult_gen_context_build(&ret->ecmult_gen_ctx); + } + if (flags & SECP256K1_CONTEXT_VERIFY) { + secp256k1_ecmult_context_build(&ret->ecmult_ctx); + } + + return ret; +} + +secp256k1_context_t* secp256k1_context_clone(const secp256k1_context_t* ctx) { + secp256k1_context_t* ret = (secp256k1_context_t*)checked_malloc(sizeof(secp256k1_context_t)); + secp256k1_ecmult_context_clone(&ret->ecmult_ctx, &ctx->ecmult_ctx); + secp256k1_ecmult_gen_context_clone(&ret->ecmult_gen_ctx, &ctx->ecmult_gen_ctx); + return ret; +} + +void secp256k1_context_destroy(secp256k1_context_t* ctx) { + secp256k1_ecmult_context_clear(&ctx->ecmult_ctx); + secp256k1_ecmult_gen_context_clear(&ctx->ecmult_gen_ctx); + + free(ctx); +} + +int secp256k1_ecdsa_verify(const secp256k1_context_t* ctx, const unsigned char *msg32, const unsigned char *sig, int siglen, const unsigned char *pubkey, int pubkeylen) { + secp256k1_ge_t q; + secp256k1_ecdsa_sig_t s; + secp256k1_scalar_t m; + int ret = -3; + DEBUG_CHECK(ctx != NULL); + DEBUG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); + DEBUG_CHECK(msg32 != NULL); + DEBUG_CHECK(sig != NULL); + DEBUG_CHECK(pubkey != NULL); + + secp256k1_scalar_set_b32(&m, msg32, NULL); + + if (secp256k1_eckey_pubkey_parse(&q, pubkey, pubkeylen)) { + if (secp256k1_ecdsa_sig_parse(&s, sig, siglen)) { + if (secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &s, &q, &m)) { + /* success is 1, all other values are fail */ + ret = 1; + } else { + ret = 0; + } + } else { + ret = -2; + } + } else { + ret = -1; + } + + return ret; +} + +static int nonce_function_rfc6979(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, unsigned int counter, const void *data) { + secp256k1_rfc6979_hmac_sha256_t rng; + unsigned int i; + secp256k1_rfc6979_hmac_sha256_initialize(&rng, key32, 32, msg32, 32, (const unsigned char*)data, data != NULL ? 32 : 0); + for (i = 0; i <= counter; i++) { + secp256k1_rfc6979_hmac_sha256_generate(&rng, nonce32, 32); + } + secp256k1_rfc6979_hmac_sha256_finalize(&rng); + return 1; +} + +const secp256k1_nonce_function_t secp256k1_nonce_function_rfc6979 = nonce_function_rfc6979; +const secp256k1_nonce_function_t secp256k1_nonce_function_default = nonce_function_rfc6979; + +int secp256k1_ecdsa_sign(const secp256k1_context_t* ctx, const unsigned char *msg32, unsigned char *signature, int *signaturelen, const unsigned char *seckey, secp256k1_nonce_function_t noncefp, const void* noncedata) { + secp256k1_ecdsa_sig_t sig; + secp256k1_scalar_t sec, non, msg; + int ret = 0; + int overflow = 0; + unsigned int count = 0; + DEBUG_CHECK(ctx != NULL); + DEBUG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); + DEBUG_CHECK(msg32 != NULL); + DEBUG_CHECK(signature != NULL); + DEBUG_CHECK(signaturelen != NULL); + DEBUG_CHECK(seckey != NULL); + if (noncefp == NULL) { + noncefp = secp256k1_nonce_function_default; + } + + secp256k1_scalar_set_b32(&sec, seckey, &overflow); + /* Fail if the secret key is invalid. */ + if (!overflow && !secp256k1_scalar_is_zero(&sec)) { + secp256k1_scalar_set_b32(&msg, msg32, NULL); + while (1) { + unsigned char nonce32[32]; + ret = noncefp(nonce32, msg32, seckey, count, noncedata); + if (!ret) { + break; + } + secp256k1_scalar_set_b32(&non, nonce32, &overflow); + memset(nonce32, 0, 32); + if (!secp256k1_scalar_is_zero(&non) && !overflow) { + if (secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, &sig, &sec, &msg, &non, NULL)) { + break; + } + } + count++; + } + if (ret) { + ret = secp256k1_ecdsa_sig_serialize(signature, signaturelen, &sig); + } + secp256k1_scalar_clear(&msg); + secp256k1_scalar_clear(&non); + secp256k1_scalar_clear(&sec); + } + if (!ret) { + *signaturelen = 0; + } + return ret; +} + +int secp256k1_ecdsa_sign_compact(const secp256k1_context_t* ctx, const unsigned char *msg32, unsigned char *sig64, const unsigned char *seckey, secp256k1_nonce_function_t noncefp, const void* noncedata, int *recid) { + secp256k1_ecdsa_sig_t sig; + secp256k1_scalar_t sec, non, msg; + int ret = 0; + int overflow = 0; + unsigned int count = 0; + DEBUG_CHECK(ctx != NULL); + DEBUG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); + DEBUG_CHECK(msg32 != NULL); + DEBUG_CHECK(sig64 != NULL); + DEBUG_CHECK(seckey != NULL); + if (noncefp == NULL) { + noncefp = secp256k1_nonce_function_default; + } + + secp256k1_scalar_set_b32(&sec, seckey, &overflow); + /* Fail if the secret key is invalid. */ + if (!overflow && !secp256k1_scalar_is_zero(&sec)) { + secp256k1_scalar_set_b32(&msg, msg32, NULL); + while (1) { + unsigned char nonce32[32]; + ret = noncefp(nonce32, msg32, seckey, count, noncedata); + if (!ret) { + break; + } + secp256k1_scalar_set_b32(&non, nonce32, &overflow); + memset(nonce32, 0, 32); + if (!secp256k1_scalar_is_zero(&non) && !overflow) { + if (secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, &sig, &sec, &msg, &non, recid)) { + break; + } + } + count++; + } + if (ret) { + secp256k1_scalar_get_b32(sig64, &sig.r); + secp256k1_scalar_get_b32(sig64 + 32, &sig.s); + } + secp256k1_scalar_clear(&msg); + secp256k1_scalar_clear(&non); + secp256k1_scalar_clear(&sec); + } + if (!ret) { + memset(sig64, 0, 64); + } + return ret; +} + +int secp256k1_ecdsa_recover_compact(const secp256k1_context_t* ctx, const unsigned char *msg32, const unsigned char *sig64, unsigned char *pubkey, int *pubkeylen, int compressed, int recid) { + secp256k1_ge_t q; + secp256k1_ecdsa_sig_t sig; + secp256k1_scalar_t m; + int ret = 0; + int overflow = 0; + DEBUG_CHECK(ctx != NULL); + DEBUG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); + DEBUG_CHECK(msg32 != NULL); + DEBUG_CHECK(sig64 != NULL); + DEBUG_CHECK(pubkey != NULL); + DEBUG_CHECK(pubkeylen != NULL); + DEBUG_CHECK(recid >= 0 && recid <= 3); + + secp256k1_scalar_set_b32(&sig.r, sig64, &overflow); + if (!overflow) { + secp256k1_scalar_set_b32(&sig.s, sig64 + 32, &overflow); + if (!overflow) { + secp256k1_scalar_set_b32(&m, msg32, NULL); + + if (secp256k1_ecdsa_sig_recover(&ctx->ecmult_ctx, &sig, &q, &m, recid)) { + ret = secp256k1_eckey_pubkey_serialize(&q, pubkey, pubkeylen, compressed); + } + } + } + return ret; +} + +int secp256k1_ec_seckey_verify(const secp256k1_context_t* ctx, const unsigned char *seckey) { + secp256k1_scalar_t sec; + int ret; + int overflow; + DEBUG_CHECK(ctx != NULL); + DEBUG_CHECK(seckey != NULL); + (void)ctx; + + secp256k1_scalar_set_b32(&sec, seckey, &overflow); + ret = !secp256k1_scalar_is_zero(&sec) && !overflow; + secp256k1_scalar_clear(&sec); + return ret; +} + +int secp256k1_ec_pubkey_verify(const secp256k1_context_t* ctx, const unsigned char *pubkey, int pubkeylen) { + secp256k1_ge_t q; + DEBUG_CHECK(ctx != NULL); + DEBUG_CHECK(pubkey != NULL); + (void)ctx; + + return secp256k1_eckey_pubkey_parse(&q, pubkey, pubkeylen); +} + +int secp256k1_ec_pubkey_create(const secp256k1_context_t* ctx, unsigned char *pubkey, int *pubkeylen, const unsigned char *seckey, int compressed) { + secp256k1_gej_t pj; + secp256k1_ge_t p; + secp256k1_scalar_t sec; + int overflow; + int ret = 0; + DEBUG_CHECK(ctx != NULL); + DEBUG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); + DEBUG_CHECK(pubkey != NULL); + DEBUG_CHECK(pubkeylen != NULL); + DEBUG_CHECK(seckey != NULL); + + secp256k1_scalar_set_b32(&sec, seckey, &overflow); + if (!overflow) { + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pj, &sec); + secp256k1_scalar_clear(&sec); + secp256k1_ge_set_gej(&p, &pj); + ret = secp256k1_eckey_pubkey_serialize(&p, pubkey, pubkeylen, compressed); + } + if (!ret) { + *pubkeylen = 0; + } + return ret; +} + +int secp256k1_ec_pubkey_decompress(const secp256k1_context_t* ctx, unsigned char *pubkey, int *pubkeylen) { + secp256k1_ge_t p; + int ret = 0; + DEBUG_CHECK(pubkey != NULL); + DEBUG_CHECK(pubkeylen != NULL); + (void)ctx; + + if (secp256k1_eckey_pubkey_parse(&p, pubkey, *pubkeylen)) { + ret = secp256k1_eckey_pubkey_serialize(&p, pubkey, pubkeylen, 0); + } + return ret; +} + +int secp256k1_ec_privkey_tweak_add(const secp256k1_context_t* ctx, unsigned char *seckey, const unsigned char *tweak) { + secp256k1_scalar_t term; + secp256k1_scalar_t sec; + int ret = 0; + int overflow = 0; + DEBUG_CHECK(ctx != NULL); + DEBUG_CHECK(seckey != NULL); + DEBUG_CHECK(tweak != NULL); + (void)ctx; + + secp256k1_scalar_set_b32(&term, tweak, &overflow); + secp256k1_scalar_set_b32(&sec, seckey, NULL); + + ret = secp256k1_eckey_privkey_tweak_add(&sec, &term) && !overflow; + if (ret) { + secp256k1_scalar_get_b32(seckey, &sec); + } + + secp256k1_scalar_clear(&sec); + secp256k1_scalar_clear(&term); + return ret; +} + +int secp256k1_ec_pubkey_tweak_add(const secp256k1_context_t* ctx, unsigned char *pubkey, int pubkeylen, const unsigned char *tweak) { + secp256k1_ge_t p; + secp256k1_scalar_t term; + int ret = 0; + int overflow = 0; + DEBUG_CHECK(ctx != NULL); + DEBUG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); + DEBUG_CHECK(pubkey != NULL); + DEBUG_CHECK(tweak != NULL); + + secp256k1_scalar_set_b32(&term, tweak, &overflow); + if (!overflow) { + ret = secp256k1_eckey_pubkey_parse(&p, pubkey, pubkeylen); + if (ret) { + ret = secp256k1_eckey_pubkey_tweak_add(&ctx->ecmult_ctx, &p, &term); + } + if (ret) { + int oldlen = pubkeylen; + ret = secp256k1_eckey_pubkey_serialize(&p, pubkey, &pubkeylen, oldlen <= 33); + VERIFY_CHECK(pubkeylen == oldlen); + } + } + + return ret; +} + +int secp256k1_ec_privkey_tweak_mul(const secp256k1_context_t* ctx, unsigned char *seckey, const unsigned char *tweak) { + secp256k1_scalar_t factor; + secp256k1_scalar_t sec; + int ret = 0; + int overflow = 0; + DEBUG_CHECK(ctx != NULL); + DEBUG_CHECK(seckey != NULL); + DEBUG_CHECK(tweak != NULL); + (void)ctx; + + secp256k1_scalar_set_b32(&factor, tweak, &overflow); + secp256k1_scalar_set_b32(&sec, seckey, NULL); + ret = secp256k1_eckey_privkey_tweak_mul(&sec, &factor) && !overflow; + if (ret) { + secp256k1_scalar_get_b32(seckey, &sec); + } + + secp256k1_scalar_clear(&sec); + secp256k1_scalar_clear(&factor); + return ret; +} + +int secp256k1_ec_pubkey_tweak_mul(const secp256k1_context_t* ctx, unsigned char *pubkey, int pubkeylen, const unsigned char *tweak) { + secp256k1_ge_t p; + secp256k1_scalar_t factor; + int ret = 0; + int overflow = 0; + DEBUG_CHECK(ctx != NULL); + DEBUG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx)); + DEBUG_CHECK(pubkey != NULL); + DEBUG_CHECK(tweak != NULL); + + secp256k1_scalar_set_b32(&factor, tweak, &overflow); + if (!overflow) { + ret = secp256k1_eckey_pubkey_parse(&p, pubkey, pubkeylen); + if (ret) { + ret = secp256k1_eckey_pubkey_tweak_mul(&ctx->ecmult_ctx, &p, &factor); + } + if (ret) { + int oldlen = pubkeylen; + ret = secp256k1_eckey_pubkey_serialize(&p, pubkey, &pubkeylen, oldlen <= 33); + VERIFY_CHECK(pubkeylen == oldlen); + } + } + + return ret; +} + +int secp256k1_ec_privkey_export(const secp256k1_context_t* ctx, const unsigned char *seckey, unsigned char *privkey, int *privkeylen, int compressed) { + secp256k1_scalar_t key; + int ret = 0; + DEBUG_CHECK(seckey != NULL); + DEBUG_CHECK(privkey != NULL); + DEBUG_CHECK(privkeylen != NULL); + DEBUG_CHECK(ctx != NULL); + DEBUG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); + + secp256k1_scalar_set_b32(&key, seckey, NULL); + ret = secp256k1_eckey_privkey_serialize(&ctx->ecmult_gen_ctx, privkey, privkeylen, &key, compressed); + secp256k1_scalar_clear(&key); + return ret; +} + +int secp256k1_ec_privkey_import(const secp256k1_context_t* ctx, unsigned char *seckey, const unsigned char *privkey, int privkeylen) { + secp256k1_scalar_t key; + int ret = 0; + DEBUG_CHECK(seckey != NULL); + DEBUG_CHECK(privkey != NULL); + (void)ctx; + + ret = secp256k1_eckey_privkey_parse(&key, privkey, privkeylen); + if (ret) { + secp256k1_scalar_get_b32(seckey, &key); + } + secp256k1_scalar_clear(&key); + return ret; +} + +int secp256k1_context_randomize(secp256k1_context_t* ctx, const unsigned char *seed32) { + DEBUG_CHECK(ctx != NULL); + DEBUG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx)); + secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, seed32); + return 1; +} diff --git a/src/cryptoconditions/src/include/secp256k1/src/testrand.h b/src/cryptoconditions/src/include/secp256k1/src/testrand.h new file mode 100644 index 00000000000..041bb92c47a --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/testrand.h @@ -0,0 +1,28 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_TESTRAND_H_ +#define _SECP256K1_TESTRAND_H_ + +#if defined HAVE_CONFIG_H +#include "libsecp256k1-config.h" +#endif + +/* A non-cryptographic RNG used only for test infrastructure. */ + +/** Seed the pseudorandom number generator for testing. */ +SECP256K1_INLINE static void secp256k1_rand_seed(const unsigned char *seed16); + +/** Generate a pseudorandom 32-bit number. */ +static uint32_t secp256k1_rand32(void); + +/** Generate a pseudorandom 32-byte array. */ +static void secp256k1_rand256(unsigned char *b32); + +/** Generate a pseudorandom 32-byte array with long sequences of zero and one bits. */ +static void secp256k1_rand256_test(unsigned char *b32); + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/testrand_impl.h b/src/cryptoconditions/src/include/secp256k1/src/testrand_impl.h new file mode 100644 index 00000000000..21c69f1c51e --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/testrand_impl.h @@ -0,0 +1,60 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_TESTRAND_IMPL_H_ +#define _SECP256K1_TESTRAND_IMPL_H_ + +#include +#include + +#include "testrand.h" +#include "hash.h" + +static secp256k1_rfc6979_hmac_sha256_t secp256k1_test_rng; +static uint32_t secp256k1_test_rng_precomputed[8]; +static int secp256k1_test_rng_precomputed_used = 8; + +SECP256K1_INLINE static void secp256k1_rand_seed(const unsigned char *seed16) { + secp256k1_rfc6979_hmac_sha256_initialize(&secp256k1_test_rng, (const unsigned char*)"TestRNG", 7, seed16, 16, NULL, 0); +} + +SECP256K1_INLINE static uint32_t secp256k1_rand32(void) { + if (secp256k1_test_rng_precomputed_used == 8) { + secp256k1_rfc6979_hmac_sha256_generate(&secp256k1_test_rng, (unsigned char*)(&secp256k1_test_rng_precomputed[0]), sizeof(secp256k1_test_rng_precomputed)); + secp256k1_test_rng_precomputed_used = 0; + } + return secp256k1_test_rng_precomputed[secp256k1_test_rng_precomputed_used++]; +} + +static void secp256k1_rand256(unsigned char *b32) { + secp256k1_rfc6979_hmac_sha256_generate(&secp256k1_test_rng, b32, 32); +} + +static void secp256k1_rand256_test(unsigned char *b32) { + int bits=0; + uint64_t ent = 0; + int entleft = 0; + memset(b32, 0, 32); + while (bits < 256) { + int now; + uint32_t val; + if (entleft < 12) { + ent |= ((uint64_t)secp256k1_rand32()) << entleft; + entleft += 32; + } + now = 1 + ((ent % 64)*((ent >> 6) % 32)+16)/31; + val = 1 & (ent >> 11); + ent >>= 12; + entleft -= 12; + while (now > 0 && bits < 256) { + b32[bits / 8] |= val << (bits % 8); + now--; + bits++; + } + } +} + +#endif diff --git a/src/cryptoconditions/src/include/secp256k1/src/tests.c b/src/cryptoconditions/src/include/secp256k1/src/tests.c new file mode 100644 index 00000000000..d0e05057f29 --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/tests.c @@ -0,0 +1,2083 @@ +/********************************************************************** + * Copyright (c) 2013, 2014, 2015 Pieter Wuille, Gregory Maxwell * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#if defined HAVE_CONFIG_H +#include "libsecp256k1-config.h" +#endif + +#include +#include + +#include + +#include "secp256k1.c" +#include "testrand_impl.h" + +#ifdef ENABLE_OPENSSL_TESTS +#include "openssl/bn.h" +#include "openssl/ec.h" +#include "openssl/ecdsa.h" +#include "openssl/obj_mac.h" +#endif + +static int count = 64; +static secp256k1_context_t *ctx = NULL; + +void random_field_element_test(secp256k1_fe_t *fe) { + do { + unsigned char b32[32]; + secp256k1_rand256_test(b32); + if (secp256k1_fe_set_b32(fe, b32)) { + break; + } + } while(1); +} + +void random_field_element_magnitude(secp256k1_fe_t *fe) { + secp256k1_fe_t zero; + int n = secp256k1_rand32() % 9; + secp256k1_fe_normalize(fe); + if (n == 0) { + return; + } + secp256k1_fe_clear(&zero); + secp256k1_fe_negate(&zero, &zero, 0); + secp256k1_fe_mul_int(&zero, n - 1); + secp256k1_fe_add(fe, &zero); +#ifdef VERIFY + CHECK(fe->magnitude == n); +#endif +} + +void random_group_element_test(secp256k1_ge_t *ge) { + secp256k1_fe_t fe; + do { + random_field_element_test(&fe); + if (secp256k1_ge_set_xo_var(ge, &fe, secp256k1_rand32() & 1)) { + break; + } + } while(1); +} + +void random_group_element_jacobian_test(secp256k1_gej_t *gej, const secp256k1_ge_t *ge) { + secp256k1_fe_t z2, z3; + do { + random_field_element_test(&gej->z); + if (!secp256k1_fe_is_zero(&gej->z)) { + break; + } + } while(1); + secp256k1_fe_sqr(&z2, &gej->z); + secp256k1_fe_mul(&z3, &z2, &gej->z); + secp256k1_fe_mul(&gej->x, &ge->x, &z2); + secp256k1_fe_mul(&gej->y, &ge->y, &z3); + gej->infinity = ge->infinity; +} + +void random_scalar_order_test(secp256k1_scalar_t *num) { + do { + unsigned char b32[32]; + int overflow = 0; + secp256k1_rand256_test(b32); + secp256k1_scalar_set_b32(num, b32, &overflow); + if (overflow || secp256k1_scalar_is_zero(num)) { + continue; + } + break; + } while(1); +} + +void random_scalar_order(secp256k1_scalar_t *num) { + do { + unsigned char b32[32]; + int overflow = 0; + secp256k1_rand256(b32); + secp256k1_scalar_set_b32(num, b32, &overflow); + if (overflow || secp256k1_scalar_is_zero(num)) { + continue; + } + break; + } while(1); +} + +void run_context_tests(void) { + secp256k1_context_t *none = secp256k1_context_create(0); + secp256k1_context_t *sign = secp256k1_context_create(SECP256K1_CONTEXT_SIGN); + secp256k1_context_t *vrfy = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY); + secp256k1_context_t *both = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); + + secp256k1_gej_t pubj; + secp256k1_ge_t pub; + secp256k1_scalar_t msg, key, nonce; + secp256k1_ecdsa_sig_t sig; + + /*** clone and destroy all of them to make sure cloning was complete ***/ + { + secp256k1_context_t *ctx_tmp; + + ctx_tmp = none; none = secp256k1_context_clone(none); secp256k1_context_destroy(ctx_tmp); + ctx_tmp = sign; sign = secp256k1_context_clone(sign); secp256k1_context_destroy(ctx_tmp); + ctx_tmp = vrfy; vrfy = secp256k1_context_clone(vrfy); secp256k1_context_destroy(ctx_tmp); + ctx_tmp = both; both = secp256k1_context_clone(both); secp256k1_context_destroy(ctx_tmp); + } + + /*** attempt to use them ***/ + random_scalar_order_test(&msg); + random_scalar_order_test(&key); + secp256k1_ecmult_gen(&both->ecmult_gen_ctx, &pubj, &key); + secp256k1_ge_set_gej(&pub, &pubj); + + /* obtain a working nonce */ + do { + random_scalar_order_test(&nonce); + } while(!secp256k1_ecdsa_sig_sign(&both->ecmult_gen_ctx, &sig, &key, &msg, &nonce, NULL)); + + /* try signing */ + CHECK(secp256k1_ecdsa_sig_sign(&sign->ecmult_gen_ctx, &sig, &key, &msg, &nonce, NULL)); + CHECK(secp256k1_ecdsa_sig_sign(&both->ecmult_gen_ctx, &sig, &key, &msg, &nonce, NULL)); + + /* try verifying */ + CHECK(secp256k1_ecdsa_sig_verify(&vrfy->ecmult_ctx, &sig, &pub, &msg)); + CHECK(secp256k1_ecdsa_sig_verify(&both->ecmult_ctx, &sig, &pub, &msg)); + + /* cleanup */ + secp256k1_context_destroy(none); + secp256k1_context_destroy(sign); + secp256k1_context_destroy(vrfy); + secp256k1_context_destroy(both); +} + +/***** HASH TESTS *****/ + +void run_sha256_tests(void) { + static const char *inputs[8] = { + "", "abc", "message digest", "secure hash algorithm", "SHA256 is considered to be safe", + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + "For this sample, this 63-byte string will be used as input data", + "This is exactly 64 bytes long, not counting the terminating byte" + }; + static const unsigned char outputs[8][32] = { + {0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55}, + {0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23, 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c, 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad}, + {0xf7, 0x84, 0x6f, 0x55, 0xcf, 0x23, 0xe1, 0x4e, 0xeb, 0xea, 0xb5, 0xb4, 0xe1, 0x55, 0x0c, 0xad, 0x5b, 0x50, 0x9e, 0x33, 0x48, 0xfb, 0xc4, 0xef, 0xa3, 0xa1, 0x41, 0x3d, 0x39, 0x3c, 0xb6, 0x50}, + {0xf3, 0x0c, 0xeb, 0x2b, 0xb2, 0x82, 0x9e, 0x79, 0xe4, 0xca, 0x97, 0x53, 0xd3, 0x5a, 0x8e, 0xcc, 0x00, 0x26, 0x2d, 0x16, 0x4c, 0xc0, 0x77, 0x08, 0x02, 0x95, 0x38, 0x1c, 0xbd, 0x64, 0x3f, 0x0d}, + {0x68, 0x19, 0xd9, 0x15, 0xc7, 0x3f, 0x4d, 0x1e, 0x77, 0xe4, 0xe1, 0xb5, 0x2d, 0x1f, 0xa0, 0xf9, 0xcf, 0x9b, 0xea, 0xea, 0xd3, 0x93, 0x9f, 0x15, 0x87, 0x4b, 0xd9, 0x88, 0xe2, 0xa2, 0x36, 0x30}, + {0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8, 0xe5, 0xc0, 0x26, 0x93, 0x0c, 0x3e, 0x60, 0x39, 0xa3, 0x3c, 0xe4, 0x59, 0x64, 0xff, 0x21, 0x67, 0xf6, 0xec, 0xed, 0xd4, 0x19, 0xdb, 0x06, 0xc1}, + {0xf0, 0x8a, 0x78, 0xcb, 0xba, 0xee, 0x08, 0x2b, 0x05, 0x2a, 0xe0, 0x70, 0x8f, 0x32, 0xfa, 0x1e, 0x50, 0xc5, 0xc4, 0x21, 0xaa, 0x77, 0x2b, 0xa5, 0xdb, 0xb4, 0x06, 0xa2, 0xea, 0x6b, 0xe3, 0x42}, + {0xab, 0x64, 0xef, 0xf7, 0xe8, 0x8e, 0x2e, 0x46, 0x16, 0x5e, 0x29, 0xf2, 0xbc, 0xe4, 0x18, 0x26, 0xbd, 0x4c, 0x7b, 0x35, 0x52, 0xf6, 0xb3, 0x82, 0xa9, 0xe7, 0xd3, 0xaf, 0x47, 0xc2, 0x45, 0xf8} + }; + int i; + for (i = 0; i < 8; i++) { + unsigned char out[32]; + secp256k1_sha256_t hasher; + secp256k1_sha256_initialize(&hasher); + secp256k1_sha256_write(&hasher, (const unsigned char*)(inputs[i]), strlen(inputs[i])); + secp256k1_sha256_finalize(&hasher, out); + CHECK(memcmp(out, outputs[i], 32) == 0); + if (strlen(inputs[i]) > 0) { + int split = secp256k1_rand32() % strlen(inputs[i]); + secp256k1_sha256_initialize(&hasher); + secp256k1_sha256_write(&hasher, (const unsigned char*)(inputs[i]), split); + secp256k1_sha256_write(&hasher, (const unsigned char*)(inputs[i] + split), strlen(inputs[i]) - split); + secp256k1_sha256_finalize(&hasher, out); + CHECK(memcmp(out, outputs[i], 32) == 0); + } + } +} + +void run_hmac_sha256_tests(void) { + static const char *keys[6] = { + "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b", + "\x4a\x65\x66\x65", + "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", + "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19", + "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", + "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa" + }; + static const char *inputs[6] = { + "\x48\x69\x20\x54\x68\x65\x72\x65", + "\x77\x68\x61\x74\x20\x64\x6f\x20\x79\x61\x20\x77\x61\x6e\x74\x20\x66\x6f\x72\x20\x6e\x6f\x74\x68\x69\x6e\x67\x3f", + "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd", + "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd", + "\x54\x65\x73\x74\x20\x55\x73\x69\x6e\x67\x20\x4c\x61\x72\x67\x65\x72\x20\x54\x68\x61\x6e\x20\x42\x6c\x6f\x63\x6b\x2d\x53\x69\x7a\x65\x20\x4b\x65\x79\x20\x2d\x20\x48\x61\x73\x68\x20\x4b\x65\x79\x20\x46\x69\x72\x73\x74", + "\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x74\x65\x73\x74\x20\x75\x73\x69\x6e\x67\x20\x61\x20\x6c\x61\x72\x67\x65\x72\x20\x74\x68\x61\x6e\x20\x62\x6c\x6f\x63\x6b\x2d\x73\x69\x7a\x65\x20\x6b\x65\x79\x20\x61\x6e\x64\x20\x61\x20\x6c\x61\x72\x67\x65\x72\x20\x74\x68\x61\x6e\x20\x62\x6c\x6f\x63\x6b\x2d\x73\x69\x7a\x65\x20\x64\x61\x74\x61\x2e\x20\x54\x68\x65\x20\x6b\x65\x79\x20\x6e\x65\x65\x64\x73\x20\x74\x6f\x20\x62\x65\x20\x68\x61\x73\x68\x65\x64\x20\x62\x65\x66\x6f\x72\x65\x20\x62\x65\x69\x6e\x67\x20\x75\x73\x65\x64\x20\x62\x79\x20\x74\x68\x65\x20\x48\x4d\x41\x43\x20\x61\x6c\x67\x6f\x72\x69\x74\x68\x6d\x2e" + }; + static const unsigned char outputs[6][32] = { + {0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf, 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83, 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7}, + {0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e, 0x6a, 0x04, 0x24, 0x26, 0x08, 0x95, 0x75, 0xc7, 0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27, 0x39, 0x83, 0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43}, + {0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8, 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8, 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe}, + {0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81, 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78, 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b}, + {0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26, 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28, 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54}, + {0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f, 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07, 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2} + }; + int i; + for (i = 0; i < 6; i++) { + secp256k1_hmac_sha256_t hasher; + unsigned char out[32]; + secp256k1_hmac_sha256_initialize(&hasher, (const unsigned char*)(keys[i]), strlen(keys[i])); + secp256k1_hmac_sha256_write(&hasher, (const unsigned char*)(inputs[i]), strlen(inputs[i])); + secp256k1_hmac_sha256_finalize(&hasher, out); + CHECK(memcmp(out, outputs[i], 32) == 0); + if (strlen(inputs[i]) > 0) { + int split = secp256k1_rand32() % strlen(inputs[i]); + secp256k1_hmac_sha256_initialize(&hasher, (const unsigned char*)(keys[i]), strlen(keys[i])); + secp256k1_hmac_sha256_write(&hasher, (const unsigned char*)(inputs[i]), split); + secp256k1_hmac_sha256_write(&hasher, (const unsigned char*)(inputs[i] + split), strlen(inputs[i]) - split); + secp256k1_hmac_sha256_finalize(&hasher, out); + CHECK(memcmp(out, outputs[i], 32) == 0); + } + } +} + +void run_rfc6979_hmac_sha256_tests(void) { + static const unsigned char key1[32] = {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, 0x00}; + static const unsigned char msg1[32] = {0x4b, 0xf5, 0x12, 0x2f, 0x34, 0x45, 0x54, 0xc5, 0x3b, 0xde, 0x2e, 0xbb, 0x8c, 0xd2, 0xb7, 0xe3, 0xd1, 0x60, 0x0a, 0xd6, 0x31, 0xc3, 0x85, 0xa5, 0xd7, 0xcc, 0xe2, 0x3c, 0x77, 0x85, 0x45, 0x9a}; + static const unsigned char out1[3][32] = { + {0x4f, 0xe2, 0x95, 0x25, 0xb2, 0x08, 0x68, 0x09, 0x15, 0x9a, 0xcd, 0xf0, 0x50, 0x6e, 0xfb, 0x86, 0xb0, 0xec, 0x93, 0x2c, 0x7b, 0xa4, 0x42, 0x56, 0xab, 0x32, 0x1e, 0x42, 0x1e, 0x67, 0xe9, 0xfb}, + {0x2b, 0xf0, 0xff, 0xf1, 0xd3, 0xc3, 0x78, 0xa2, 0x2d, 0xc5, 0xde, 0x1d, 0x85, 0x65, 0x22, 0x32, 0x5c, 0x65, 0xb5, 0x04, 0x49, 0x1a, 0x0c, 0xbd, 0x01, 0xcb, 0x8f, 0x3a, 0xa6, 0x7f, 0xfd, 0x4a}, + {0xf5, 0x28, 0xb4, 0x10, 0xcb, 0x54, 0x1f, 0x77, 0x00, 0x0d, 0x7a, 0xfb, 0x6c, 0x5b, 0x53, 0xc5, 0xc4, 0x71, 0xea, 0xb4, 0x3e, 0x46, 0x6d, 0x9a, 0xc5, 0x19, 0x0c, 0x39, 0xc8, 0x2f, 0xd8, 0x2e} + }; + + static const unsigned char key2[32] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + static const unsigned char msg2[32] = {0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55}; + static const unsigned char out2[3][32] = { + {0x9c, 0x23, 0x6c, 0x16, 0x5b, 0x82, 0xae, 0x0c, 0xd5, 0x90, 0x65, 0x9e, 0x10, 0x0b, 0x6b, 0xab, 0x30, 0x36, 0xe7, 0xba, 0x8b, 0x06, 0x74, 0x9b, 0xaf, 0x69, 0x81, 0xe1, 0x6f, 0x1a, 0x2b, 0x95}, + {0xdf, 0x47, 0x10, 0x61, 0x62, 0x5b, 0xc0, 0xea, 0x14, 0xb6, 0x82, 0xfe, 0xee, 0x2c, 0x9c, 0x02, 0xf2, 0x35, 0xda, 0x04, 0x20, 0x4c, 0x1d, 0x62, 0xa1, 0x53, 0x6c, 0x6e, 0x17, 0xae, 0xd7, 0xa9}, + {0x75, 0x97, 0x88, 0x7c, 0xbd, 0x76, 0x32, 0x1f, 0x32, 0xe3, 0x04, 0x40, 0x67, 0x9a, 0x22, 0xcf, 0x7f, 0x8d, 0x9d, 0x2e, 0xac, 0x39, 0x0e, 0x58, 0x1f, 0xea, 0x09, 0x1c, 0xe2, 0x02, 0xba, 0x94} + }; + + secp256k1_rfc6979_hmac_sha256_t rng; + unsigned char out[32]; + unsigned char zero[1] = {0}; + int i; + + secp256k1_rfc6979_hmac_sha256_initialize(&rng, key1, 32, msg1, 32, NULL, 1); + for (i = 0; i < 3; i++) { + secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32); + CHECK(memcmp(out, out1[i], 32) == 0); + } + secp256k1_rfc6979_hmac_sha256_finalize(&rng); + + secp256k1_rfc6979_hmac_sha256_initialize(&rng, key1, 32, msg1, 32, zero, 1); + for (i = 0; i < 3; i++) { + secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32); + CHECK(memcmp(out, out1[i], 32) != 0); + } + secp256k1_rfc6979_hmac_sha256_finalize(&rng); + + secp256k1_rfc6979_hmac_sha256_initialize(&rng, key2, 32, msg2, 32, zero, 0); + for (i = 0; i < 3; i++) { + secp256k1_rfc6979_hmac_sha256_generate(&rng, out, 32); + CHECK(memcmp(out, out2[i], 32) == 0); + } + secp256k1_rfc6979_hmac_sha256_finalize(&rng); +} + +/***** NUM TESTS *****/ + +#ifndef USE_NUM_NONE +void random_num_negate(secp256k1_num_t *num) { + if (secp256k1_rand32() & 1) { + secp256k1_num_negate(num); + } +} + +void random_num_order_test(secp256k1_num_t *num) { + secp256k1_scalar_t sc; + random_scalar_order_test(&sc); + secp256k1_scalar_get_num(num, &sc); +} + +void random_num_order(secp256k1_num_t *num) { + secp256k1_scalar_t sc; + random_scalar_order(&sc); + secp256k1_scalar_get_num(num, &sc); +} + +void test_num_negate(void) { + secp256k1_num_t n1; + secp256k1_num_t n2; + random_num_order_test(&n1); /* n1 = R */ + random_num_negate(&n1); + secp256k1_num_copy(&n2, &n1); /* n2 = R */ + secp256k1_num_sub(&n1, &n2, &n1); /* n1 = n2-n1 = 0 */ + CHECK(secp256k1_num_is_zero(&n1)); + secp256k1_num_copy(&n1, &n2); /* n1 = R */ + secp256k1_num_negate(&n1); /* n1 = -R */ + CHECK(!secp256k1_num_is_zero(&n1)); + secp256k1_num_add(&n1, &n2, &n1); /* n1 = n2+n1 = 0 */ + CHECK(secp256k1_num_is_zero(&n1)); + secp256k1_num_copy(&n1, &n2); /* n1 = R */ + secp256k1_num_negate(&n1); /* n1 = -R */ + CHECK(secp256k1_num_is_neg(&n1) != secp256k1_num_is_neg(&n2)); + secp256k1_num_negate(&n1); /* n1 = R */ + CHECK(secp256k1_num_eq(&n1, &n2)); +} + +void test_num_add_sub(void) { + secp256k1_num_t n1; + secp256k1_num_t n2; + secp256k1_num_t n1p2, n2p1, n1m2, n2m1; + int r = secp256k1_rand32(); + random_num_order_test(&n1); /* n1 = R1 */ + if (r & 1) { + random_num_negate(&n1); + } + random_num_order_test(&n2); /* n2 = R2 */ + if (r & 2) { + random_num_negate(&n2); + } + secp256k1_num_add(&n1p2, &n1, &n2); /* n1p2 = R1 + R2 */ + secp256k1_num_add(&n2p1, &n2, &n1); /* n2p1 = R2 + R1 */ + secp256k1_num_sub(&n1m2, &n1, &n2); /* n1m2 = R1 - R2 */ + secp256k1_num_sub(&n2m1, &n2, &n1); /* n2m1 = R2 - R1 */ + CHECK(secp256k1_num_eq(&n1p2, &n2p1)); + CHECK(!secp256k1_num_eq(&n1p2, &n1m2)); + secp256k1_num_negate(&n2m1); /* n2m1 = -R2 + R1 */ + CHECK(secp256k1_num_eq(&n2m1, &n1m2)); + CHECK(!secp256k1_num_eq(&n2m1, &n1)); + secp256k1_num_add(&n2m1, &n2m1, &n2); /* n2m1 = -R2 + R1 + R2 = R1 */ + CHECK(secp256k1_num_eq(&n2m1, &n1)); + CHECK(!secp256k1_num_eq(&n2p1, &n1)); + secp256k1_num_sub(&n2p1, &n2p1, &n2); /* n2p1 = R2 + R1 - R2 = R1 */ + CHECK(secp256k1_num_eq(&n2p1, &n1)); +} + +void run_num_smalltests(void) { + int i; + for (i = 0; i < 100*count; i++) { + test_num_negate(); + test_num_add_sub(); + } +} +#endif + +/***** SCALAR TESTS *****/ + +void scalar_test(void) { + secp256k1_scalar_t s; + secp256k1_scalar_t s1; + secp256k1_scalar_t s2; +#ifndef USE_NUM_NONE + secp256k1_num_t snum, s1num, s2num; + secp256k1_num_t order, half_order; +#endif + unsigned char c[32]; + + /* Set 's' to a random scalar, with value 'snum'. */ + random_scalar_order_test(&s); + + /* Set 's1' to a random scalar, with value 's1num'. */ + random_scalar_order_test(&s1); + + /* Set 's2' to a random scalar, with value 'snum2', and byte array representation 'c'. */ + random_scalar_order_test(&s2); + secp256k1_scalar_get_b32(c, &s2); + +#ifndef USE_NUM_NONE + secp256k1_scalar_get_num(&snum, &s); + secp256k1_scalar_get_num(&s1num, &s1); + secp256k1_scalar_get_num(&s2num, &s2); + + secp256k1_scalar_order_get_num(&order); + half_order = order; + secp256k1_num_shift(&half_order, 1); +#endif + + { + int i; + /* Test that fetching groups of 4 bits from a scalar and recursing n(i)=16*n(i-1)+p(i) reconstructs it. */ + secp256k1_scalar_t n; + secp256k1_scalar_set_int(&n, 0); + for (i = 0; i < 256; i += 4) { + secp256k1_scalar_t t; + int j; + secp256k1_scalar_set_int(&t, secp256k1_scalar_get_bits(&s, 256 - 4 - i, 4)); + for (j = 0; j < 4; j++) { + secp256k1_scalar_add(&n, &n, &n); + } + secp256k1_scalar_add(&n, &n, &t); + } + CHECK(secp256k1_scalar_eq(&n, &s)); + } + + { + /* Test that fetching groups of randomly-sized bits from a scalar and recursing n(i)=b*n(i-1)+p(i) reconstructs it. */ + secp256k1_scalar_t n; + int i = 0; + secp256k1_scalar_set_int(&n, 0); + while (i < 256) { + secp256k1_scalar_t t; + int j; + int now = (secp256k1_rand32() % 15) + 1; + if (now + i > 256) { + now = 256 - i; + } + secp256k1_scalar_set_int(&t, secp256k1_scalar_get_bits_var(&s, 256 - now - i, now)); + for (j = 0; j < now; j++) { + secp256k1_scalar_add(&n, &n, &n); + } + secp256k1_scalar_add(&n, &n, &t); + i += now; + } + CHECK(secp256k1_scalar_eq(&n, &s)); + } + +#ifndef USE_NUM_NONE + { + /* Test that adding the scalars together is equal to adding their numbers together modulo the order. */ + secp256k1_num_t rnum; + secp256k1_num_t r2num; + secp256k1_scalar_t r; + secp256k1_num_add(&rnum, &snum, &s2num); + secp256k1_num_mod(&rnum, &order); + secp256k1_scalar_add(&r, &s, &s2); + secp256k1_scalar_get_num(&r2num, &r); + CHECK(secp256k1_num_eq(&rnum, &r2num)); + } + + { + /* Test that multipying the scalars is equal to multiplying their numbers modulo the order. */ + secp256k1_scalar_t r; + secp256k1_num_t r2num; + secp256k1_num_t rnum; + secp256k1_num_mul(&rnum, &snum, &s2num); + secp256k1_num_mod(&rnum, &order); + secp256k1_scalar_mul(&r, &s, &s2); + secp256k1_scalar_get_num(&r2num, &r); + CHECK(secp256k1_num_eq(&rnum, &r2num)); + /* The result can only be zero if at least one of the factors was zero. */ + CHECK(secp256k1_scalar_is_zero(&r) == (secp256k1_scalar_is_zero(&s) || secp256k1_scalar_is_zero(&s2))); + /* The results can only be equal to one of the factors if that factor was zero, or the other factor was one. */ + CHECK(secp256k1_num_eq(&rnum, &snum) == (secp256k1_scalar_is_zero(&s) || secp256k1_scalar_is_one(&s2))); + CHECK(secp256k1_num_eq(&rnum, &s2num) == (secp256k1_scalar_is_zero(&s2) || secp256k1_scalar_is_one(&s))); + } + + { + secp256k1_scalar_t neg; + secp256k1_num_t negnum; + secp256k1_num_t negnum2; + /* Check that comparison with zero matches comparison with zero on the number. */ + CHECK(secp256k1_num_is_zero(&snum) == secp256k1_scalar_is_zero(&s)); + /* Check that comparison with the half order is equal to testing for high scalar. */ + CHECK(secp256k1_scalar_is_high(&s) == (secp256k1_num_cmp(&snum, &half_order) > 0)); + secp256k1_scalar_negate(&neg, &s); + secp256k1_num_sub(&negnum, &order, &snum); + secp256k1_num_mod(&negnum, &order); + /* Check that comparison with the half order is equal to testing for high scalar after negation. */ + CHECK(secp256k1_scalar_is_high(&neg) == (secp256k1_num_cmp(&negnum, &half_order) > 0)); + /* Negating should change the high property, unless the value was already zero. */ + CHECK((secp256k1_scalar_is_high(&s) == secp256k1_scalar_is_high(&neg)) == secp256k1_scalar_is_zero(&s)); + secp256k1_scalar_get_num(&negnum2, &neg); + /* Negating a scalar should be equal to (order - n) mod order on the number. */ + CHECK(secp256k1_num_eq(&negnum, &negnum2)); + secp256k1_scalar_add(&neg, &neg, &s); + /* Adding a number to its negation should result in zero. */ + CHECK(secp256k1_scalar_is_zero(&neg)); + secp256k1_scalar_negate(&neg, &neg); + /* Negating zero should still result in zero. */ + CHECK(secp256k1_scalar_is_zero(&neg)); + } + + { + /* Test secp256k1_scalar_mul_shift_var. */ + secp256k1_scalar_t r; + secp256k1_num_t one; + secp256k1_num_t rnum; + secp256k1_num_t rnum2; + unsigned char cone[1] = {0x01}; + unsigned int shift = 256 + (secp256k1_rand32() % 257); + secp256k1_scalar_mul_shift_var(&r, &s1, &s2, shift); + secp256k1_num_mul(&rnum, &s1num, &s2num); + secp256k1_num_shift(&rnum, shift - 1); + secp256k1_num_set_bin(&one, cone, 1); + secp256k1_num_add(&rnum, &rnum, &one); + secp256k1_num_shift(&rnum, 1); + secp256k1_scalar_get_num(&rnum2, &r); + CHECK(secp256k1_num_eq(&rnum, &rnum2)); + } +#endif + + { + /* Test that scalar inverses are equal to the inverse of their number modulo the order. */ + if (!secp256k1_scalar_is_zero(&s)) { + secp256k1_scalar_t inv; +#ifndef USE_NUM_NONE + secp256k1_num_t invnum; + secp256k1_num_t invnum2; +#endif + secp256k1_scalar_inverse(&inv, &s); +#ifndef USE_NUM_NONE + secp256k1_num_mod_inverse(&invnum, &snum, &order); + secp256k1_scalar_get_num(&invnum2, &inv); + CHECK(secp256k1_num_eq(&invnum, &invnum2)); +#endif + secp256k1_scalar_mul(&inv, &inv, &s); + /* Multiplying a scalar with its inverse must result in one. */ + CHECK(secp256k1_scalar_is_one(&inv)); + secp256k1_scalar_inverse(&inv, &inv); + /* Inverting one must result in one. */ + CHECK(secp256k1_scalar_is_one(&inv)); + } + } + + { + /* Test commutativity of add. */ + secp256k1_scalar_t r1, r2; + secp256k1_scalar_add(&r1, &s1, &s2); + secp256k1_scalar_add(&r2, &s2, &s1); + CHECK(secp256k1_scalar_eq(&r1, &r2)); + } + + { + secp256k1_scalar_t r1, r2; + secp256k1_scalar_t b; + int i; + /* Test add_bit. */ + int bit = secp256k1_rand32() % 256; + secp256k1_scalar_set_int(&b, 1); + CHECK(secp256k1_scalar_is_one(&b)); + for (i = 0; i < bit; i++) { + secp256k1_scalar_add(&b, &b, &b); + } + r1 = s1; + r2 = s1; + if (!secp256k1_scalar_add(&r1, &r1, &b)) { + /* No overflow happened. */ + secp256k1_scalar_add_bit(&r2, bit); + CHECK(secp256k1_scalar_eq(&r1, &r2)); + } + } + + { + /* Test commutativity of mul. */ + secp256k1_scalar_t r1, r2; + secp256k1_scalar_mul(&r1, &s1, &s2); + secp256k1_scalar_mul(&r2, &s2, &s1); + CHECK(secp256k1_scalar_eq(&r1, &r2)); + } + + { + /* Test associativity of add. */ + secp256k1_scalar_t r1, r2; + secp256k1_scalar_add(&r1, &s1, &s2); + secp256k1_scalar_add(&r1, &r1, &s); + secp256k1_scalar_add(&r2, &s2, &s); + secp256k1_scalar_add(&r2, &s1, &r2); + CHECK(secp256k1_scalar_eq(&r1, &r2)); + } + + { + /* Test associativity of mul. */ + secp256k1_scalar_t r1, r2; + secp256k1_scalar_mul(&r1, &s1, &s2); + secp256k1_scalar_mul(&r1, &r1, &s); + secp256k1_scalar_mul(&r2, &s2, &s); + secp256k1_scalar_mul(&r2, &s1, &r2); + CHECK(secp256k1_scalar_eq(&r1, &r2)); + } + + { + /* Test distributitivity of mul over add. */ + secp256k1_scalar_t r1, r2, t; + secp256k1_scalar_add(&r1, &s1, &s2); + secp256k1_scalar_mul(&r1, &r1, &s); + secp256k1_scalar_mul(&r2, &s1, &s); + secp256k1_scalar_mul(&t, &s2, &s); + secp256k1_scalar_add(&r2, &r2, &t); + CHECK(secp256k1_scalar_eq(&r1, &r2)); + } + + { + /* Test square. */ + secp256k1_scalar_t r1, r2; + secp256k1_scalar_sqr(&r1, &s1); + secp256k1_scalar_mul(&r2, &s1, &s1); + CHECK(secp256k1_scalar_eq(&r1, &r2)); + } + + { + /* Test multiplicative identity. */ + secp256k1_scalar_t r1, v1; + secp256k1_scalar_set_int(&v1,1); + secp256k1_scalar_mul(&r1, &s1, &v1); + CHECK(secp256k1_scalar_eq(&r1, &s1)); + } + + { + /* Test additive identity. */ + secp256k1_scalar_t r1, v0; + secp256k1_scalar_set_int(&v0,0); + secp256k1_scalar_add(&r1, &s1, &v0); + CHECK(secp256k1_scalar_eq(&r1, &s1)); + } + + { + /* Test zero product property. */ + secp256k1_scalar_t r1, v0; + secp256k1_scalar_set_int(&v0,0); + secp256k1_scalar_mul(&r1, &s1, &v0); + CHECK(secp256k1_scalar_eq(&r1, &v0)); + } + +} + +void run_scalar_tests(void) { + int i; + for (i = 0; i < 128 * count; i++) { + scalar_test(); + } + + { + /* (-1)+1 should be zero. */ + secp256k1_scalar_t s, o; + secp256k1_scalar_set_int(&s, 1); + CHECK(secp256k1_scalar_is_one(&s)); + secp256k1_scalar_negate(&o, &s); + secp256k1_scalar_add(&o, &o, &s); + CHECK(secp256k1_scalar_is_zero(&o)); + secp256k1_scalar_negate(&o, &o); + CHECK(secp256k1_scalar_is_zero(&o)); + } + +#ifndef USE_NUM_NONE + { + /* A scalar with value of the curve order should be 0. */ + secp256k1_num_t order; + secp256k1_scalar_t zero; + unsigned char bin[32]; + int overflow = 0; + secp256k1_scalar_order_get_num(&order); + secp256k1_num_get_bin(bin, 32, &order); + secp256k1_scalar_set_b32(&zero, bin, &overflow); + CHECK(overflow == 1); + CHECK(secp256k1_scalar_is_zero(&zero)); + } +#endif +} + +/***** FIELD TESTS *****/ + +void random_fe(secp256k1_fe_t *x) { + unsigned char bin[32]; + do { + secp256k1_rand256(bin); + if (secp256k1_fe_set_b32(x, bin)) { + return; + } + } while(1); +} + +void random_fe_non_zero(secp256k1_fe_t *nz) { + int tries = 10; + while (--tries >= 0) { + random_fe(nz); + secp256k1_fe_normalize(nz); + if (!secp256k1_fe_is_zero(nz)) { + break; + } + } + /* Infinitesimal probability of spurious failure here */ + CHECK(tries >= 0); +} + +void random_fe_non_square(secp256k1_fe_t *ns) { + secp256k1_fe_t r; + random_fe_non_zero(ns); + if (secp256k1_fe_sqrt_var(&r, ns)) { + secp256k1_fe_negate(ns, ns, 1); + } +} + +int check_fe_equal(const secp256k1_fe_t *a, const secp256k1_fe_t *b) { + secp256k1_fe_t an = *a; + secp256k1_fe_t bn = *b; + secp256k1_fe_normalize_weak(&an); + secp256k1_fe_normalize_var(&bn); + return secp256k1_fe_equal_var(&an, &bn); +} + +int check_fe_inverse(const secp256k1_fe_t *a, const secp256k1_fe_t *ai) { + secp256k1_fe_t x; + secp256k1_fe_t one = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1); + secp256k1_fe_mul(&x, a, ai); + return check_fe_equal(&x, &one); +} + +void run_field_convert(void) { + static const unsigned char b32[32] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, + 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, + 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x40 + }; + static const secp256k1_fe_storage_t fes = SECP256K1_FE_STORAGE_CONST( + 0x00010203UL, 0x04050607UL, 0x11121314UL, 0x15161718UL, + 0x22232425UL, 0x26272829UL, 0x33343536UL, 0x37383940UL + ); + static const secp256k1_fe_t fe = SECP256K1_FE_CONST( + 0x00010203UL, 0x04050607UL, 0x11121314UL, 0x15161718UL, + 0x22232425UL, 0x26272829UL, 0x33343536UL, 0x37383940UL + ); + secp256k1_fe_t fe2; + unsigned char b322[32]; + secp256k1_fe_storage_t fes2; + /* Check conversions to fe. */ + CHECK(secp256k1_fe_set_b32(&fe2, b32)); + CHECK(secp256k1_fe_equal_var(&fe, &fe2)); + secp256k1_fe_from_storage(&fe2, &fes); + CHECK(secp256k1_fe_equal_var(&fe, &fe2)); + /* Check conversion from fe. */ + secp256k1_fe_get_b32(b322, &fe); + CHECK(memcmp(b322, b32, 32) == 0); + secp256k1_fe_to_storage(&fes2, &fe); + CHECK(memcmp(&fes2, &fes, sizeof(fes)) == 0); +} + +void run_field_misc(void) { + secp256k1_fe_t x; + secp256k1_fe_t y; + secp256k1_fe_t z; + secp256k1_fe_t q; + secp256k1_fe_t fe5 = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 5); + int i; + for (i = 0; i < 5*count; i++) { + secp256k1_fe_storage_t xs, ys, zs; + random_fe(&x); + random_fe_non_zero(&y); + /* Test the fe equality and comparison operations. */ + CHECK(secp256k1_fe_cmp_var(&x, &x) == 0); + CHECK(secp256k1_fe_equal_var(&x, &x)); + z = x; + secp256k1_fe_add(&z,&y); + /* Test fe conditional move; z is not normalized here. */ + q = x; + secp256k1_fe_cmov(&x, &z, 0); + secp256k1_fe_cmov(&x, &x, 1); + CHECK(memcmp(&x, &z, sizeof(x)) != 0); + CHECK(memcmp(&x, &q, sizeof(x)) == 0); + secp256k1_fe_cmov(&q, &z, 1); + CHECK(memcmp(&q, &z, sizeof(q)) == 0); + /* Test storage conversion and conditional moves. */ + secp256k1_fe_normalize(&z); + CHECK(!secp256k1_fe_equal_var(&x, &z)); + secp256k1_fe_to_storage(&xs, &x); + secp256k1_fe_to_storage(&ys, &y); + secp256k1_fe_to_storage(&zs, &z); + secp256k1_fe_storage_cmov(&zs, &xs, 0); + secp256k1_fe_storage_cmov(&zs, &zs, 1); + CHECK(memcmp(&xs, &zs, sizeof(xs)) != 0); + secp256k1_fe_storage_cmov(&ys, &xs, 1); + CHECK(memcmp(&xs, &ys, sizeof(xs)) == 0); + secp256k1_fe_from_storage(&x, &xs); + secp256k1_fe_from_storage(&y, &ys); + secp256k1_fe_from_storage(&z, &zs); + /* Test that mul_int, mul, and add agree. */ + secp256k1_fe_add(&y, &x); + secp256k1_fe_add(&y, &x); + z = x; + secp256k1_fe_mul_int(&z, 3); + CHECK(check_fe_equal(&y, &z)); + secp256k1_fe_add(&y, &x); + secp256k1_fe_add(&z, &x); + CHECK(check_fe_equal(&z, &y)); + z = x; + secp256k1_fe_mul_int(&z, 5); + secp256k1_fe_mul(&q, &x, &fe5); + CHECK(check_fe_equal(&z, &q)); + secp256k1_fe_negate(&x, &x, 1); + secp256k1_fe_add(&z, &x); + secp256k1_fe_add(&q, &x); + CHECK(check_fe_equal(&y, &z)); + CHECK(check_fe_equal(&q, &y)); + } +} + +void run_field_inv(void) { + secp256k1_fe_t x, xi, xii; + int i; + for (i = 0; i < 10*count; i++) { + random_fe_non_zero(&x); + secp256k1_fe_inv(&xi, &x); + CHECK(check_fe_inverse(&x, &xi)); + secp256k1_fe_inv(&xii, &xi); + CHECK(check_fe_equal(&x, &xii)); + } +} + +void run_field_inv_var(void) { + secp256k1_fe_t x, xi, xii; + int i; + for (i = 0; i < 10*count; i++) { + random_fe_non_zero(&x); + secp256k1_fe_inv_var(&xi, &x); + CHECK(check_fe_inverse(&x, &xi)); + secp256k1_fe_inv_var(&xii, &xi); + CHECK(check_fe_equal(&x, &xii)); + } +} + +void run_field_inv_all_var(void) { + secp256k1_fe_t x[16], xi[16], xii[16]; + int i; + /* Check it's safe to call for 0 elements */ + secp256k1_fe_inv_all_var(0, xi, x); + for (i = 0; i < count; i++) { + size_t j; + size_t len = (secp256k1_rand32() & 15) + 1; + for (j = 0; j < len; j++) { + random_fe_non_zero(&x[j]); + } + secp256k1_fe_inv_all_var(len, xi, x); + for (j = 0; j < len; j++) { + CHECK(check_fe_inverse(&x[j], &xi[j])); + } + secp256k1_fe_inv_all_var(len, xii, xi); + for (j = 0; j < len; j++) { + CHECK(check_fe_equal(&x[j], &xii[j])); + } + } +} + +void run_sqr(void) { + secp256k1_fe_t x, s; + + { + int i; + secp256k1_fe_set_int(&x, 1); + secp256k1_fe_negate(&x, &x, 1); + + for (i = 1; i <= 512; ++i) { + secp256k1_fe_mul_int(&x, 2); + secp256k1_fe_normalize(&x); + secp256k1_fe_sqr(&s, &x); + } + } +} + +void test_sqrt(const secp256k1_fe_t *a, const secp256k1_fe_t *k) { + secp256k1_fe_t r1, r2; + int v = secp256k1_fe_sqrt_var(&r1, a); + CHECK((v == 0) == (k == NULL)); + + if (k != NULL) { + /* Check that the returned root is +/- the given known answer */ + secp256k1_fe_negate(&r2, &r1, 1); + secp256k1_fe_add(&r1, k); secp256k1_fe_add(&r2, k); + secp256k1_fe_normalize(&r1); secp256k1_fe_normalize(&r2); + CHECK(secp256k1_fe_is_zero(&r1) || secp256k1_fe_is_zero(&r2)); + } +} + +void run_sqrt(void) { + secp256k1_fe_t ns, x, s, t; + int i; + + /* Check sqrt(0) is 0 */ + secp256k1_fe_set_int(&x, 0); + secp256k1_fe_sqr(&s, &x); + test_sqrt(&s, &x); + + /* Check sqrt of small squares (and their negatives) */ + for (i = 1; i <= 100; i++) { + secp256k1_fe_set_int(&x, i); + secp256k1_fe_sqr(&s, &x); + test_sqrt(&s, &x); + secp256k1_fe_negate(&t, &s, 1); + test_sqrt(&t, NULL); + } + + /* Consistency checks for large random values */ + for (i = 0; i < 10; i++) { + int j; + random_fe_non_square(&ns); + for (j = 0; j < count; j++) { + random_fe(&x); + secp256k1_fe_sqr(&s, &x); + test_sqrt(&s, &x); + secp256k1_fe_negate(&t, &s, 1); + test_sqrt(&t, NULL); + secp256k1_fe_mul(&t, &s, &ns); + test_sqrt(&t, NULL); + } + } +} + +/***** GROUP TESTS *****/ + +void ge_equals_ge(const secp256k1_ge_t *a, const secp256k1_ge_t *b) { + CHECK(a->infinity == b->infinity); + if (a->infinity) { + return; + } + CHECK(secp256k1_fe_equal_var(&a->x, &b->x)); + CHECK(secp256k1_fe_equal_var(&b->y, &b->y)); +} + +/* This compares jacobian points including their Z, not just their geometric meaning. */ +int gej_xyz_equals_gej(const secp256k1_gej_t *a, const secp256k1_gej_t *b) { + secp256k1_gej_t a2; + secp256k1_gej_t b2; + int ret = 1; + ret &= a->infinity == b->infinity; + if (ret && !a->infinity) { + a2 = *a; + b2 = *b; + secp256k1_fe_normalize(&a2.x); + secp256k1_fe_normalize(&a2.y); + secp256k1_fe_normalize(&a2.z); + secp256k1_fe_normalize(&b2.x); + secp256k1_fe_normalize(&b2.y); + secp256k1_fe_normalize(&b2.z); + ret &= secp256k1_fe_cmp_var(&a2.x, &b2.x) == 0; + ret &= secp256k1_fe_cmp_var(&a2.y, &b2.y) == 0; + ret &= secp256k1_fe_cmp_var(&a2.z, &b2.z) == 0; + } + return ret; +} + +void ge_equals_gej(const secp256k1_ge_t *a, const secp256k1_gej_t *b) { + secp256k1_fe_t z2s; + secp256k1_fe_t u1, u2, s1, s2; + CHECK(a->infinity == b->infinity); + if (a->infinity) { + return; + } + /* Check a.x * b.z^2 == b.x && a.y * b.z^3 == b.y, to avoid inverses. */ + secp256k1_fe_sqr(&z2s, &b->z); + secp256k1_fe_mul(&u1, &a->x, &z2s); + u2 = b->x; secp256k1_fe_normalize_weak(&u2); + secp256k1_fe_mul(&s1, &a->y, &z2s); secp256k1_fe_mul(&s1, &s1, &b->z); + s2 = b->y; secp256k1_fe_normalize_weak(&s2); + CHECK(secp256k1_fe_equal_var(&u1, &u2)); + CHECK(secp256k1_fe_equal_var(&s1, &s2)); +} + +void test_ge(void) { + int i, i1; + int runs = 4; + /* Points: (infinity, p1, p1, -p1, -p1, p2, p2, -p2, -p2, p3, p3, -p3, -p3, p4, p4, -p4, -p4). + * The second in each pair of identical points uses a random Z coordinate in the Jacobian form. + * All magnitudes are randomized. + * All 17*17 combinations of points are added to eachother, using all applicable methods. + */ + secp256k1_ge_t *ge = (secp256k1_ge_t *)malloc(sizeof(secp256k1_ge_t) * (1 + 4 * runs)); + secp256k1_gej_t *gej = (secp256k1_gej_t *)malloc(sizeof(secp256k1_gej_t) * (1 + 4 * runs)); + secp256k1_gej_set_infinity(&gej[0]); + secp256k1_ge_clear(&ge[0]); + secp256k1_ge_set_gej_var(&ge[0], &gej[0]); + for (i = 0; i < runs; i++) { + int j; + secp256k1_ge_t g; + random_group_element_test(&g); + ge[1 + 4 * i] = g; + ge[2 + 4 * i] = g; + secp256k1_ge_neg(&ge[3 + 4 * i], &g); + secp256k1_ge_neg(&ge[4 + 4 * i], &g); + secp256k1_gej_set_ge(&gej[1 + 4 * i], &ge[1 + 4 * i]); + random_group_element_jacobian_test(&gej[2 + 4 * i], &ge[2 + 4 * i]); + secp256k1_gej_set_ge(&gej[3 + 4 * i], &ge[3 + 4 * i]); + random_group_element_jacobian_test(&gej[4 + 4 * i], &ge[4 + 4 * i]); + for (j = 0; j < 4; j++) { + random_field_element_magnitude(&ge[1 + j + 4 * i].x); + random_field_element_magnitude(&ge[1 + j + 4 * i].y); + random_field_element_magnitude(&gej[1 + j + 4 * i].x); + random_field_element_magnitude(&gej[1 + j + 4 * i].y); + random_field_element_magnitude(&gej[1 + j + 4 * i].z); + } + } + + for (i1 = 0; i1 < 1 + 4 * runs; i1++) { + int i2; + for (i2 = 0; i2 < 1 + 4 * runs; i2++) { + /* Compute reference result using gej + gej (var). */ + secp256k1_gej_t refj, resj; + secp256k1_ge_t ref; + secp256k1_gej_add_var(&refj, &gej[i1], &gej[i2]); + secp256k1_ge_set_gej_var(&ref, &refj); + + /* Test gej + ge (var). */ + secp256k1_gej_add_ge_var(&resj, &gej[i1], &ge[i2]); + ge_equals_gej(&ref, &resj); + + /* Test gej + ge (const). */ + if (i2 != 0) { + /* secp256k1_gej_add_ge does not support its second argument being infinity. */ + secp256k1_gej_add_ge(&resj, &gej[i1], &ge[i2]); + ge_equals_gej(&ref, &resj); + } + + /* Test doubling (var). */ + if ((i1 == 0 && i2 == 0) || ((i1 + 3)/4 == (i2 + 3)/4 && ((i1 + 3)%4)/2 == ((i2 + 3)%4)/2)) { + /* Normal doubling. */ + secp256k1_gej_double_var(&resj, &gej[i1]); + ge_equals_gej(&ref, &resj); + secp256k1_gej_double_var(&resj, &gej[i2]); + ge_equals_gej(&ref, &resj); + } + + /* Test adding opposites. */ + if ((i1 == 0 && i2 == 0) || ((i1 + 3)/4 == (i2 + 3)/4 && ((i1 + 3)%4)/2 != ((i2 + 3)%4)/2)) { + CHECK(secp256k1_ge_is_infinity(&ref)); + } + + /* Test adding infinity. */ + if (i1 == 0) { + CHECK(secp256k1_ge_is_infinity(&ge[i1])); + CHECK(secp256k1_gej_is_infinity(&gej[i1])); + ge_equals_gej(&ref, &gej[i2]); + } + if (i2 == 0) { + CHECK(secp256k1_ge_is_infinity(&ge[i2])); + CHECK(secp256k1_gej_is_infinity(&gej[i2])); + ge_equals_gej(&ref, &gej[i1]); + } + } + } + + /* Test adding all points together in random order equals infinity. */ + { + secp256k1_gej_t sum = SECP256K1_GEJ_CONST_INFINITY; + secp256k1_gej_t *gej_shuffled = (secp256k1_gej_t *)malloc((4 * runs + 1) * sizeof(secp256k1_gej_t)); + for (i = 0; i < 4 * runs + 1; i++) { + gej_shuffled[i] = gej[i]; + } + for (i = 0; i < 4 * runs + 1; i++) { + int swap = i + secp256k1_rand32() % (4 * runs + 1 - i); + if (swap != i) { + secp256k1_gej_t t = gej_shuffled[i]; + gej_shuffled[i] = gej_shuffled[swap]; + gej_shuffled[swap] = t; + } + } + for (i = 0; i < 4 * runs + 1; i++) { + secp256k1_gej_add_var(&sum, &sum, &gej_shuffled[i]); + } + CHECK(secp256k1_gej_is_infinity(&sum)); + free(gej_shuffled); + } + + /* Test batch gej -> ge conversion. */ + { + secp256k1_ge_t *ge_set_all = (secp256k1_ge_t *)malloc((4 * runs + 1) * sizeof(secp256k1_ge_t)); + secp256k1_ge_set_all_gej_var(4 * runs + 1, ge_set_all, gej); + for (i = 0; i < 4 * runs + 1; i++) { + secp256k1_fe_t s; + random_fe_non_zero(&s); + secp256k1_gej_rescale(&gej[i], &s); + ge_equals_gej(&ge_set_all[i], &gej[i]); + } + free(ge_set_all); + } + + free(ge); + free(gej); +} + +void run_ge(void) { + int i; + for (i = 0; i < count * 32; i++) { + test_ge(); + } +} + +/***** ECMULT TESTS *****/ + +void run_ecmult_chain(void) { + /* random starting point A (on the curve) */ + secp256k1_gej_t a = SECP256K1_GEJ_CONST( + 0x8b30bbe9, 0xae2a9906, 0x96b22f67, 0x0709dff3, + 0x727fd8bc, 0x04d3362c, 0x6c7bf458, 0xe2846004, + 0xa357ae91, 0x5c4a6528, 0x1309edf2, 0x0504740f, + 0x0eb33439, 0x90216b4f, 0x81063cb6, 0x5f2f7e0f + ); + /* two random initial factors xn and gn */ + secp256k1_scalar_t xn = SECP256K1_SCALAR_CONST( + 0x84cc5452, 0xf7fde1ed, 0xb4d38a8c, 0xe9b1b84c, + 0xcef31f14, 0x6e569be9, 0x705d357a, 0x42985407 + ); + secp256k1_scalar_t gn = SECP256K1_SCALAR_CONST( + 0xa1e58d22, 0x553dcd42, 0xb2398062, 0x5d4c57a9, + 0x6e9323d4, 0x2b3152e5, 0xca2c3990, 0xedc7c9de + ); + /* two small multipliers to be applied to xn and gn in every iteration: */ + static const secp256k1_scalar_t xf = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0x1337); + static const secp256k1_scalar_t gf = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0x7113); + /* accumulators with the resulting coefficients to A and G */ + secp256k1_scalar_t ae = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1); + secp256k1_scalar_t ge = SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0); + /* actual points */ + secp256k1_gej_t x = a; + secp256k1_gej_t x2; + int i; + + /* the point being computed */ + x = a; + for (i = 0; i < 200*count; i++) { + /* in each iteration, compute X = xn*X + gn*G; */ + secp256k1_ecmult(&ctx->ecmult_ctx, &x, &x, &xn, &gn); + /* also compute ae and ge: the actual accumulated factors for A and G */ + /* if X was (ae*A+ge*G), xn*X + gn*G results in (xn*ae*A + (xn*ge+gn)*G) */ + secp256k1_scalar_mul(&ae, &ae, &xn); + secp256k1_scalar_mul(&ge, &ge, &xn); + secp256k1_scalar_add(&ge, &ge, &gn); + /* modify xn and gn */ + secp256k1_scalar_mul(&xn, &xn, &xf); + secp256k1_scalar_mul(&gn, &gn, &gf); + + /* verify */ + if (i == 19999) { + /* expected result after 19999 iterations */ + secp256k1_gej_t rp = SECP256K1_GEJ_CONST( + 0xD6E96687, 0xF9B10D09, 0x2A6F3543, 0x9D86CEBE, + 0xA4535D0D, 0x409F5358, 0x6440BD74, 0xB933E830, + 0xB95CBCA2, 0xC77DA786, 0x539BE8FD, 0x53354D2D, + 0x3B4F566A, 0xE6580454, 0x07ED6015, 0xEE1B2A88 + ); + + secp256k1_gej_neg(&rp, &rp); + secp256k1_gej_add_var(&rp, &rp, &x); + CHECK(secp256k1_gej_is_infinity(&rp)); + } + } + /* redo the computation, but directly with the resulting ae and ge coefficients: */ + secp256k1_ecmult(&ctx->ecmult_ctx, &x2, &a, &ae, &ge); + secp256k1_gej_neg(&x2, &x2); + secp256k1_gej_add_var(&x2, &x2, &x); + CHECK(secp256k1_gej_is_infinity(&x2)); +} + +void test_point_times_order(const secp256k1_gej_t *point) { + /* X * (point + G) + (order-X) * (pointer + G) = 0 */ + secp256k1_scalar_t x; + secp256k1_scalar_t nx; + secp256k1_gej_t res1, res2; + secp256k1_ge_t res3; + unsigned char pub[65]; + int psize = 65; + random_scalar_order_test(&x); + secp256k1_scalar_negate(&nx, &x); + secp256k1_ecmult(&ctx->ecmult_ctx, &res1, point, &x, &x); /* calc res1 = x * point + x * G; */ + secp256k1_ecmult(&ctx->ecmult_ctx, &res2, point, &nx, &nx); /* calc res2 = (order - x) * point + (order - x) * G; */ + secp256k1_gej_add_var(&res1, &res1, &res2); + CHECK(secp256k1_gej_is_infinity(&res1)); + CHECK(secp256k1_gej_is_valid_var(&res1) == 0); + secp256k1_ge_set_gej(&res3, &res1); + CHECK(secp256k1_ge_is_infinity(&res3)); + CHECK(secp256k1_ge_is_valid_var(&res3) == 0); + CHECK(secp256k1_eckey_pubkey_serialize(&res3, pub, &psize, 0) == 0); + psize = 65; + CHECK(secp256k1_eckey_pubkey_serialize(&res3, pub, &psize, 1) == 0); +} + +void run_point_times_order(void) { + int i; + secp256k1_fe_t x = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 2); + static const secp256k1_fe_t xr = SECP256K1_FE_CONST( + 0x7603CB59, 0xB0EF6C63, 0xFE608479, 0x2A0C378C, + 0xDB3233A8, 0x0F8A9A09, 0xA877DEAD, 0x31B38C45 + ); + for (i = 0; i < 500; i++) { + secp256k1_ge_t p; + if (secp256k1_ge_set_xo_var(&p, &x, 1)) { + secp256k1_gej_t j; + CHECK(secp256k1_ge_is_valid_var(&p)); + secp256k1_gej_set_ge(&j, &p); + CHECK(secp256k1_gej_is_valid_var(&j)); + test_point_times_order(&j); + } + secp256k1_fe_sqr(&x, &x); + } + secp256k1_fe_normalize_var(&x); + CHECK(secp256k1_fe_equal_var(&x, &xr)); +} + +void test_wnaf(const secp256k1_scalar_t *number, int w) { + secp256k1_scalar_t x, two, t; + int wnaf[256]; + int zeroes = -1; + int i; + int bits; + secp256k1_scalar_set_int(&x, 0); + secp256k1_scalar_set_int(&two, 2); + bits = secp256k1_ecmult_wnaf(wnaf, number, w); + CHECK(bits <= 256); + for (i = bits-1; i >= 0; i--) { + int v = wnaf[i]; + secp256k1_scalar_mul(&x, &x, &two); + if (v) { + CHECK(zeroes == -1 || zeroes >= w-1); /* check that distance between non-zero elements is at least w-1 */ + zeroes=0; + CHECK((v & 1) == 1); /* check non-zero elements are odd */ + CHECK(v <= (1 << (w-1)) - 1); /* check range below */ + CHECK(v >= -(1 << (w-1)) - 1); /* check range above */ + } else { + CHECK(zeroes != -1); /* check that no unnecessary zero padding exists */ + zeroes++; + } + if (v >= 0) { + secp256k1_scalar_set_int(&t, v); + } else { + secp256k1_scalar_set_int(&t, -v); + secp256k1_scalar_negate(&t, &t); + } + secp256k1_scalar_add(&x, &x, &t); + } + CHECK(secp256k1_scalar_eq(&x, number)); /* check that wnaf represents number */ +} + +void run_wnaf(void) { + int i; + secp256k1_scalar_t n; + for (i = 0; i < count; i++) { + random_scalar_order(&n); + test_wnaf(&n, 4+(i%10)); + } +} + +void test_ecmult_constants(void) { + /* Test ecmult_gen() for [0..36) and [order-36..0). */ + secp256k1_scalar_t x; + secp256k1_gej_t r; + secp256k1_ge_t ng; + int i; + int j; + secp256k1_ge_neg(&ng, &secp256k1_ge_const_g); + for (i = 0; i < 36; i++ ) { + secp256k1_scalar_set_int(&x, i); + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &r, &x); + for (j = 0; j < i; j++) { + if (j == i - 1) { + ge_equals_gej(&secp256k1_ge_const_g, &r); + } + secp256k1_gej_add_ge(&r, &r, &ng); + } + CHECK(secp256k1_gej_is_infinity(&r)); + } + for (i = 1; i <= 36; i++ ) { + secp256k1_scalar_set_int(&x, i); + secp256k1_scalar_negate(&x, &x); + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &r, &x); + for (j = 0; j < i; j++) { + if (j == i - 1) { + ge_equals_gej(&ng, &r); + } + secp256k1_gej_add_ge(&r, &r, &secp256k1_ge_const_g); + } + CHECK(secp256k1_gej_is_infinity(&r)); + } +} + +void run_ecmult_constants(void) { + test_ecmult_constants(); +} + +void test_ecmult_gen_blind(void) { + /* Test ecmult_gen() blinding and confirm that the blinding changes, the affline points match, and the z's don't match. */ + secp256k1_scalar_t key; + secp256k1_scalar_t b; + unsigned char seed32[32]; + secp256k1_gej_t pgej; + secp256k1_gej_t pgej2; + secp256k1_gej_t i; + secp256k1_ge_t pge; + random_scalar_order_test(&key); + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pgej, &key); + secp256k1_rand256(seed32); + b = ctx->ecmult_gen_ctx.blind; + i = ctx->ecmult_gen_ctx.initial; + secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, seed32); + CHECK(!secp256k1_scalar_eq(&b, &ctx->ecmult_gen_ctx.blind)); + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pgej2, &key); + CHECK(!gej_xyz_equals_gej(&pgej, &pgej2)); + CHECK(!gej_xyz_equals_gej(&i, &ctx->ecmult_gen_ctx.initial)); + secp256k1_ge_set_gej(&pge, &pgej); + ge_equals_gej(&pge, &pgej2); +} + +void test_ecmult_gen_blind_reset(void) { + /* Test ecmult_gen() blinding reset and confirm that the blinding is consistent. */ + secp256k1_scalar_t b; + secp256k1_gej_t initial; + secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, 0); + b = ctx->ecmult_gen_ctx.blind; + initial = ctx->ecmult_gen_ctx.initial; + secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, 0); + CHECK(secp256k1_scalar_eq(&b, &ctx->ecmult_gen_ctx.blind)); + CHECK(gej_xyz_equals_gej(&initial, &ctx->ecmult_gen_ctx.initial)); +} + +void run_ecmult_gen_blind(void) { + int i; + test_ecmult_gen_blind_reset(); + for (i = 0; i < 10; i++) { + test_ecmult_gen_blind(); + } +} + + +void random_sign(secp256k1_ecdsa_sig_t *sig, const secp256k1_scalar_t *key, const secp256k1_scalar_t *msg, int *recid) { + secp256k1_scalar_t nonce; + do { + random_scalar_order_test(&nonce); + } while(!secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, sig, key, msg, &nonce, recid)); +} + +void test_ecdsa_sign_verify(void) { + secp256k1_gej_t pubj; + secp256k1_ge_t pub; + secp256k1_scalar_t one; + secp256k1_scalar_t msg, key; + secp256k1_ecdsa_sig_t sig; + int recid; + int getrec; + random_scalar_order_test(&msg); + random_scalar_order_test(&key); + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pubj, &key); + secp256k1_ge_set_gej(&pub, &pubj); + getrec = secp256k1_rand32()&1; + random_sign(&sig, &key, &msg, getrec?&recid:NULL); + if (getrec) { + CHECK(recid >= 0 && recid < 4); + } + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sig, &pub, &msg)); + secp256k1_scalar_set_int(&one, 1); + secp256k1_scalar_add(&msg, &msg, &one); + CHECK(!secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sig, &pub, &msg)); +} + +void run_ecdsa_sign_verify(void) { + int i; + for (i = 0; i < 10*count; i++) { + test_ecdsa_sign_verify(); + } +} + +/** Dummy nonce generation function that just uses a precomputed nonce, and fails if it is not accepted. Use only for testing. */ +static int precomputed_nonce_function(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, unsigned int counter, const void *data) { + (void)msg32; + (void)key32; + memcpy(nonce32, data, 32); + return (counter == 0); +} + +static int nonce_function_test_fail(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, unsigned int counter, const void *data) { + /* Dummy nonce generator that has a fatal error on the first counter value. */ + if (counter == 0) { + return 0; + } + return nonce_function_rfc6979(nonce32, msg32, key32, counter - 1, data); +} + +static int nonce_function_test_retry(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, unsigned int counter, const void *data) { + /* Dummy nonce generator that produces unacceptable nonces for the first several counter values. */ + if (counter < 3) { + memset(nonce32, counter==0 ? 0 : 255, 32); + if (counter == 2) { + nonce32[31]--; + } + return 1; + } + if (counter < 5) { + static const unsigned char order[] = { + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B, + 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x41 + }; + memcpy(nonce32, order, 32); + if (counter == 4) { + nonce32[31]++; + } + return 1; + } + /* Retry rate of 6979 is negligible esp. as we only call this in determinstic tests. */ + /* If someone does fine a case where it retries for secp256k1, we'd like to know. */ + if (counter > 5) { + return 0; + } + return nonce_function_rfc6979(nonce32, msg32, key32, counter - 5, data); +} + +int is_empty_compact_signature(const unsigned char *sig64) { + static const unsigned char res[64] = {0}; + return memcmp(sig64, res, 64) == 0; +} + +void test_ecdsa_end_to_end(void) { + unsigned char extra[32] = {0x00}; + unsigned char privkey[32]; + unsigned char message[32]; + unsigned char privkey2[32]; + unsigned char csignature[64]; + unsigned char signature[72]; + unsigned char signature2[72]; + unsigned char signature3[72]; + unsigned char signature4[72]; + unsigned char pubkey[65]; + unsigned char recpubkey[65]; + unsigned char seckey[300]; + int signaturelen = 72; + int signaturelen2 = 72; + int signaturelen3 = 72; + int signaturelen4 = 72; + int recid = 0; + int recpubkeylen = 0; + int pubkeylen = 65; + int seckeylen = 300; + + /* Generate a random key and message. */ + { + secp256k1_scalar_t msg, key; + random_scalar_order_test(&msg); + random_scalar_order_test(&key); + secp256k1_scalar_get_b32(privkey, &key); + secp256k1_scalar_get_b32(message, &msg); + } + + /* Construct and verify corresponding public key. */ + CHECK(secp256k1_ec_seckey_verify(ctx, privkey) == 1); + CHECK(secp256k1_ec_pubkey_create(ctx, pubkey, &pubkeylen, privkey, (secp256k1_rand32() & 3) != 0) == 1); + if (secp256k1_rand32() & 1) { + CHECK(secp256k1_ec_pubkey_decompress(ctx, pubkey, &pubkeylen)); + } + CHECK(secp256k1_ec_pubkey_verify(ctx, pubkey, pubkeylen)); + + /* Verify private key import and export. */ + CHECK(secp256k1_ec_privkey_export(ctx, privkey, seckey, &seckeylen, secp256k1_rand32() % 2) == 1); + CHECK(secp256k1_ec_privkey_import(ctx, privkey2, seckey, seckeylen) == 1); + CHECK(memcmp(privkey, privkey2, 32) == 0); + + /* Optionally tweak the keys using addition. */ + if (secp256k1_rand32() % 3 == 0) { + int ret1; + int ret2; + unsigned char rnd[32]; + unsigned char pubkey2[65]; + int pubkeylen2 = 65; + secp256k1_rand256_test(rnd); + ret1 = secp256k1_ec_privkey_tweak_add(ctx, privkey, rnd); + ret2 = secp256k1_ec_pubkey_tweak_add(ctx, pubkey, pubkeylen, rnd); + CHECK(ret1 == ret2); + if (ret1 == 0) { + return; + } + CHECK(secp256k1_ec_pubkey_create(ctx, pubkey2, &pubkeylen2, privkey, pubkeylen == 33) == 1); + CHECK(memcmp(pubkey, pubkey2, pubkeylen) == 0); + } + + /* Optionally tweak the keys using multiplication. */ + if (secp256k1_rand32() % 3 == 0) { + int ret1; + int ret2; + unsigned char rnd[32]; + unsigned char pubkey2[65]; + int pubkeylen2 = 65; + secp256k1_rand256_test(rnd); + ret1 = secp256k1_ec_privkey_tweak_mul(ctx, privkey, rnd); + ret2 = secp256k1_ec_pubkey_tweak_mul(ctx, pubkey, pubkeylen, rnd); + CHECK(ret1 == ret2); + if (ret1 == 0) { + return; + } + CHECK(secp256k1_ec_pubkey_create(ctx, pubkey2, &pubkeylen2, privkey, pubkeylen == 33) == 1); + CHECK(memcmp(pubkey, pubkey2, pubkeylen) == 0); + } + + /* Sign. */ + CHECK(secp256k1_ecdsa_sign(ctx, message, signature, &signaturelen, privkey, NULL, NULL) == 1); + CHECK(signaturelen > 0); + CHECK(secp256k1_ecdsa_sign(ctx, message, signature2, &signaturelen2, privkey, NULL, extra) == 1); + CHECK(signaturelen2 > 0); + extra[31] = 1; + CHECK(secp256k1_ecdsa_sign(ctx, message, signature3, &signaturelen3, privkey, NULL, extra) == 1); + CHECK(signaturelen3 > 0); + extra[31] = 0; + extra[0] = 1; + CHECK(secp256k1_ecdsa_sign(ctx, message, signature4, &signaturelen4, privkey, NULL, extra) == 1); + CHECK(signaturelen3 > 0); + CHECK((signaturelen != signaturelen2) || (memcmp(signature, signature2, signaturelen) != 0)); + CHECK((signaturelen != signaturelen3) || (memcmp(signature, signature3, signaturelen) != 0)); + CHECK((signaturelen3 != signaturelen2) || (memcmp(signature3, signature2, signaturelen3) != 0)); + CHECK((signaturelen4 != signaturelen3) || (memcmp(signature4, signature3, signaturelen4) != 0)); + CHECK((signaturelen4 != signaturelen2) || (memcmp(signature4, signature2, signaturelen4) != 0)); + CHECK((signaturelen4 != signaturelen) || (memcmp(signature4, signature, signaturelen4) != 0)); + /* Verify. */ + CHECK(secp256k1_ecdsa_verify(ctx, message, signature, signaturelen, pubkey, pubkeylen) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, message, signature2, signaturelen2, pubkey, pubkeylen) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, message, signature3, signaturelen3, pubkey, pubkeylen) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, message, signature4, signaturelen4, pubkey, pubkeylen) == 1); + /* Destroy signature and verify again. */ + signature[signaturelen - 1 - secp256k1_rand32() % 20] += 1 + (secp256k1_rand32() % 255); + CHECK(secp256k1_ecdsa_verify(ctx, message, signature, signaturelen, pubkey, pubkeylen) != 1); + + /* Compact sign. */ + CHECK(secp256k1_ecdsa_sign_compact(ctx, message, csignature, privkey, NULL, NULL, &recid) == 1); + CHECK(!is_empty_compact_signature(csignature)); + /* Recover. */ + CHECK(secp256k1_ecdsa_recover_compact(ctx, message, csignature, recpubkey, &recpubkeylen, pubkeylen == 33, recid) == 1); + CHECK(recpubkeylen == pubkeylen); + CHECK(memcmp(pubkey, recpubkey, pubkeylen) == 0); + /* Destroy signature and verify again. */ + csignature[secp256k1_rand32() % 64] += 1 + (secp256k1_rand32() % 255); + CHECK(secp256k1_ecdsa_recover_compact(ctx, message, csignature, recpubkey, &recpubkeylen, pubkeylen == 33, recid) != 1 || + memcmp(pubkey, recpubkey, pubkeylen) != 0); + CHECK(recpubkeylen == pubkeylen); + +} + +void test_random_pubkeys(void) { + secp256k1_ge_t elem; + secp256k1_ge_t elem2; + unsigned char in[65]; + /* Generate some randomly sized pubkeys. */ + uint32_t r = secp256k1_rand32(); + int len = (r & 3) == 0 ? 65 : 33; + r>>=2; + if ((r & 3) == 0) { + len = (r & 252) >> 3; + } + r>>=8; + if (len == 65) { + in[0] = (r & 2) ? 4 : (r & 1? 6 : 7); + } else { + in[0] = (r & 1) ? 2 : 3; + } + r>>=2; + if ((r & 7) == 0) { + in[0] = (r & 2040) >> 3; + } + r>>=11; + if (len > 1) { + secp256k1_rand256(&in[1]); + } + if (len > 33) { + secp256k1_rand256(&in[33]); + } + if (secp256k1_eckey_pubkey_parse(&elem, in, len)) { + unsigned char out[65]; + unsigned char firstb; + int res; + int size = len; + firstb = in[0]; + /* If the pubkey can be parsed, it should round-trip... */ + CHECK(secp256k1_eckey_pubkey_serialize(&elem, out, &size, len == 33)); + CHECK(size == len); + CHECK(memcmp(&in[1], &out[1], len-1) == 0); + /* ... except for the type of hybrid inputs. */ + if ((in[0] != 6) && (in[0] != 7)) { + CHECK(in[0] == out[0]); + } + size = 65; + CHECK(secp256k1_eckey_pubkey_serialize(&elem, in, &size, 0)); + CHECK(size == 65); + CHECK(secp256k1_eckey_pubkey_parse(&elem2, in, size)); + ge_equals_ge(&elem,&elem2); + /* Check that the X9.62 hybrid type is checked. */ + in[0] = (r & 1) ? 6 : 7; + res = secp256k1_eckey_pubkey_parse(&elem2, in, size); + if (firstb == 2 || firstb == 3) { + if (in[0] == firstb + 4) { + CHECK(res); + } else { + CHECK(!res); + } + } + if (res) { + ge_equals_ge(&elem,&elem2); + CHECK(secp256k1_eckey_pubkey_serialize(&elem, out, &size, 0)); + CHECK(memcmp(&in[1], &out[1], 64) == 0); + } + } +} + +void run_random_pubkeys(void) { + int i; + for (i = 0; i < 10*count; i++) { + test_random_pubkeys(); + } +} + +void run_ecdsa_end_to_end(void) { + int i; + for (i = 0; i < 64*count; i++) { + test_ecdsa_end_to_end(); + } +} + +/* Tests several edge cases. */ +void test_ecdsa_edge_cases(void) { + const unsigned char msg32[32] = { + 'T', 'h', 'i', 's', ' ', 'i', 's', ' ', + 'a', ' ', 'v', 'e', 'r', 'y', ' ', 's', + 'e', 'c', 'r', 'e', 't', ' ', 'm', 'e', + 's', 's', 'a', 'g', 'e', '.', '.', '.' + }; + const unsigned char sig64[64] = { + /* Generated by signing the above message with nonce 'This is the nonce we will use...' + * and secret key 0 (which is not valid), resulting in recid 0. */ + 0x67, 0xCB, 0x28, 0x5F, 0x9C, 0xD1, 0x94, 0xE8, + 0x40, 0xD6, 0x29, 0x39, 0x7A, 0xF5, 0x56, 0x96, + 0x62, 0xFD, 0xE4, 0x46, 0x49, 0x99, 0x59, 0x63, + 0x17, 0x9A, 0x7D, 0xD1, 0x7B, 0xD2, 0x35, 0x32, + 0x4B, 0x1B, 0x7D, 0xF3, 0x4C, 0xE1, 0xF6, 0x8E, + 0x69, 0x4F, 0xF6, 0xF1, 0x1A, 0xC7, 0x51, 0xDD, + 0x7D, 0xD7, 0x3E, 0x38, 0x7E, 0xE4, 0xFC, 0x86, + 0x6E, 0x1B, 0xE8, 0xEC, 0xC7, 0xDD, 0x95, 0x57 + }; + unsigned char pubkey[65]; + int t; + int pubkeylen = 65; + /* signature (r,s) = (4,4), which can be recovered with all 4 recids. */ + const unsigned char sigb64[64] = { + 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, 0x04, + 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, 0x04, + }; + unsigned char pubkeyb[33]; + int pubkeyblen = 33; + int recid; + + CHECK(!secp256k1_ecdsa_recover_compact(ctx, msg32, sig64, pubkey, &pubkeylen, 0, 0)); + CHECK(secp256k1_ecdsa_recover_compact(ctx, msg32, sig64, pubkey, &pubkeylen, 0, 1)); + CHECK(!secp256k1_ecdsa_recover_compact(ctx, msg32, sig64, pubkey, &pubkeylen, 0, 2)); + CHECK(!secp256k1_ecdsa_recover_compact(ctx, msg32, sig64, pubkey, &pubkeylen, 0, 3)); + + for (recid = 0; recid < 4; recid++) { + int i; + int recid2; + /* (4,4) encoded in DER. */ + unsigned char sigbder[8] = {0x30, 0x06, 0x02, 0x01, 0x04, 0x02, 0x01, 0x04}; + unsigned char sigcder_zr[7] = {0x30, 0x05, 0x02, 0x00, 0x02, 0x01, 0x01}; + unsigned char sigcder_zs[7] = {0x30, 0x05, 0x02, 0x01, 0x01, 0x02, 0x00}; + unsigned char sigbderalt1[39] = { + 0x30, 0x25, 0x02, 0x20, 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, 0x04, 0x02, 0x01, 0x04, + }; + unsigned char sigbderalt2[39] = { + 0x30, 0x25, 0x02, 0x01, 0x04, 0x02, 0x20, 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, 0x04, + }; + unsigned char sigbderalt3[40] = { + 0x30, 0x26, 0x02, 0x21, 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, 0x04, 0x02, 0x01, 0x04, + }; + unsigned char sigbderalt4[40] = { + 0x30, 0x26, 0x02, 0x01, 0x04, 0x02, 0x21, 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, 0x04, + }; + /* (order + r,4) encoded in DER. */ + unsigned char sigbderlong[40] = { + 0x30, 0x26, 0x02, 0x21, 0x00, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xBA, 0xAE, 0xDC, + 0xE6, 0xAF, 0x48, 0xA0, 0x3B, 0xBF, 0xD2, 0x5E, + 0x8C, 0xD0, 0x36, 0x41, 0x45, 0x02, 0x01, 0x04 + }; + CHECK(secp256k1_ecdsa_recover_compact(ctx, msg32, sigb64, pubkeyb, &pubkeyblen, 1, recid)); + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbder, sizeof(sigbder), pubkeyb, pubkeyblen) == 1); + for (recid2 = 0; recid2 < 4; recid2++) { + unsigned char pubkey2b[33]; + int pubkey2blen = 33; + CHECK(secp256k1_ecdsa_recover_compact(ctx, msg32, sigb64, pubkey2b, &pubkey2blen, 1, recid2)); + /* Verifying with (order + r,4) should always fail. */ + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderlong, sizeof(sigbderlong), pubkey2b, pubkey2blen) != 1); + } + /* DER parsing tests. */ + /* Zero length r/s. */ + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigcder_zr, sizeof(sigcder_zr), pubkeyb, pubkeyblen) == -2); + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigcder_zs, sizeof(sigcder_zs), pubkeyb, pubkeyblen) == -2); + /* Leading zeros. */ + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderalt1, sizeof(sigbderalt1), pubkeyb, pubkeyblen) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderalt2, sizeof(sigbderalt2), pubkeyb, pubkeyblen) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderalt3, sizeof(sigbderalt3), pubkeyb, pubkeyblen) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderalt4, sizeof(sigbderalt4), pubkeyb, pubkeyblen) == 1); + sigbderalt3[4] = 1; + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderalt3, sizeof(sigbderalt3), pubkeyb, pubkeyblen) == -2); + sigbderalt4[7] = 1; + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderalt4, sizeof(sigbderalt4), pubkeyb, pubkeyblen) == -2); + /* Damage signature. */ + sigbder[7]++; + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbder, sizeof(sigbder), pubkeyb, pubkeyblen) == 0); + sigbder[7]--; + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbder, 6, pubkeyb, pubkeyblen) == -2); + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbder, sizeof(sigbder)-1, pubkeyb, pubkeyblen) == -2); + for(i = 0; i < 8; i++) { + int c; + unsigned char orig = sigbder[i]; + /*Try every single-byte change.*/ + for (c = 0; c < 256; c++) { + if (c == orig ) { + continue; + } + sigbder[i] = c; + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbder, sizeof(sigbder), pubkeyb, pubkeyblen) == + (i==4 || i==7) ? 0 : -2 ); + } + sigbder[i] = orig; + } + } + + /* Test the case where ECDSA recomputes a point that is infinity. */ + { + secp256k1_gej_t keyj; + secp256k1_ge_t key; + secp256k1_scalar_t msg; + secp256k1_ecdsa_sig_t sig; + secp256k1_scalar_set_int(&sig.s, 1); + secp256k1_scalar_negate(&sig.s, &sig.s); + secp256k1_scalar_inverse(&sig.s, &sig.s); + secp256k1_scalar_set_int(&sig.r, 1); + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &keyj, &sig.r); + secp256k1_ge_set_gej(&key, &keyj); + msg = sig.s; + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sig, &key, &msg) == 0); + } + + /* Test r/s equal to zero */ + { + /* (1,1) encoded in DER. */ + unsigned char sigcder[8] = {0x30, 0x06, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01}; + unsigned char sigc64[64] = { + 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, 0x01, + 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, 0x01, + }; + unsigned char pubkeyc[65]; + int pubkeyclen = 65; + CHECK(secp256k1_ecdsa_recover_compact(ctx, msg32, sigc64, pubkeyc, &pubkeyclen, 0, 0) == 1); + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigcder, sizeof(sigcder), pubkeyc, pubkeyclen) == 1); + sigcder[4] = 0; + sigc64[31] = 0; + CHECK(secp256k1_ecdsa_recover_compact(ctx, msg32, sigc64, pubkeyb, &pubkeyblen, 1, 0) == 0); + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigcder, sizeof(sigcder), pubkeyc, pubkeyclen) == 0); + sigcder[4] = 1; + sigcder[7] = 0; + sigc64[31] = 1; + sigc64[63] = 0; + CHECK(secp256k1_ecdsa_recover_compact(ctx, msg32, sigc64, pubkeyb, &pubkeyblen, 1, 0) == 0); + CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigcder, sizeof(sigcder), pubkeyc, pubkeyclen) == 0); + } + + /*Signature where s would be zero.*/ + { + const unsigned char nonce[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, 0x01, + }; + static const unsigned char nonce2[32] = { + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE, + 0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B, + 0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x40 + }; + const unsigned char key[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, 0x01, + }; + unsigned char msg[32] = { + 0x86, 0x41, 0x99, 0x81, 0x06, 0x23, 0x44, 0x53, + 0xaa, 0x5f, 0x9d, 0x6a, 0x31, 0x78, 0xf4, 0xf7, + 0xb8, 0x12, 0xe0, 0x0b, 0x81, 0x7a, 0x77, 0x62, + 0x65, 0xdf, 0xdd, 0x31, 0xb9, 0x3e, 0x29, 0xa9, + }; + unsigned char sig[72]; + int siglen = 72; + CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, precomputed_nonce_function, nonce) == 0); + CHECK(siglen == 0); + CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, precomputed_nonce_function, nonce2) == 0); + CHECK(siglen == 0); + msg[31] = 0xaa; + siglen = 72; + CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, precomputed_nonce_function, nonce) == 1); + CHECK(siglen > 0); + CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, precomputed_nonce_function, nonce2) == 1); + CHECK(siglen > 0); + siglen = 10; + CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, precomputed_nonce_function, nonce) != 1); + CHECK(siglen == 0); + } + + /* Nonce function corner cases. */ + for (t = 0; t < 2; t++) { + static const unsigned char zero[32] = {0x00}; + int i; + unsigned char key[32]; + unsigned char msg[32]; + unsigned char sig[72]; + unsigned char sig2[72]; + secp256k1_ecdsa_sig_t s[512]; + int siglen = 72; + int siglen2 = 72; + int recid2; + const unsigned char *extra; + extra = t == 0 ? NULL : zero; + memset(msg, 0, 32); + msg[31] = 1; + /* High key results in signature failure. */ + memset(key, 0xFF, 32); + CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, NULL, extra) == 0); + CHECK(siglen == 0); + /* Zero key results in signature failure. */ + memset(key, 0, 32); + CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, NULL, extra) == 0); + CHECK(siglen == 0); + /* Nonce function failure results in signature failure. */ + key[31] = 1; + CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, nonce_function_test_fail, extra) == 0); + CHECK(siglen == 0); + CHECK(secp256k1_ecdsa_sign_compact(ctx, msg, sig, key, nonce_function_test_fail, extra, &recid) == 0); + CHECK(is_empty_compact_signature(sig)); + /* The retry loop successfully makes its way to the first good value. */ + siglen = 72; + CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, nonce_function_test_retry, extra) == 1); + CHECK(siglen > 0); + CHECK(secp256k1_ecdsa_sign(ctx, msg, sig2, &siglen2, key, nonce_function_rfc6979, extra) == 1); + CHECK(siglen > 0); + CHECK((siglen == siglen2) && (memcmp(sig, sig2, siglen) == 0)); + CHECK(secp256k1_ecdsa_sign_compact(ctx, msg, sig, key, nonce_function_test_retry, extra, &recid) == 1); + CHECK(!is_empty_compact_signature(sig)); + CHECK(secp256k1_ecdsa_sign_compact(ctx, msg, sig2, key, nonce_function_rfc6979, extra, &recid2) == 1); + CHECK(!is_empty_compact_signature(sig2)); + CHECK((recid == recid2) && (memcmp(sig, sig2, 64) == 0)); + /* The default nonce function is determinstic. */ + siglen = 72; + siglen2 = 72; + CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, NULL, extra) == 1); + CHECK(siglen > 0); + CHECK(secp256k1_ecdsa_sign(ctx, msg, sig2, &siglen2, key, NULL, extra) == 1); + CHECK(siglen2 > 0); + CHECK((siglen == siglen2) && (memcmp(sig, sig2, siglen) == 0)); + CHECK(secp256k1_ecdsa_sign_compact(ctx, msg, sig, key, NULL, extra, &recid) == 1); + CHECK(!is_empty_compact_signature(sig)); + CHECK(secp256k1_ecdsa_sign_compact(ctx, msg, sig2, key, NULL, extra, &recid2) == 1); + CHECK(!is_empty_compact_signature(sig)); + CHECK((recid == recid2) && (memcmp(sig, sig2, 64) == 0)); + /* The default nonce function changes output with different messages. */ + for(i = 0; i < 256; i++) { + int j; + siglen2 = 72; + msg[0] = i; + CHECK(secp256k1_ecdsa_sign(ctx, msg, sig2, &siglen2, key, NULL, extra) == 1); + CHECK(!is_empty_compact_signature(sig)); + CHECK(secp256k1_ecdsa_sig_parse(&s[i], sig2, siglen2)); + for (j = 0; j < i; j++) { + CHECK(!secp256k1_scalar_eq(&s[i].r, &s[j].r)); + } + } + msg[0] = 0; + msg[31] = 2; + /* The default nonce function changes output with different keys. */ + for(i = 256; i < 512; i++) { + int j; + siglen2 = 72; + key[0] = i - 256; + CHECK(secp256k1_ecdsa_sign(ctx, msg, sig2, &siglen2, key, NULL, extra) == 1); + CHECK(secp256k1_ecdsa_sig_parse(&s[i], sig2, siglen2)); + for (j = 0; j < i; j++) { + CHECK(!secp256k1_scalar_eq(&s[i].r, &s[j].r)); + } + } + key[0] = 0; + } + + /* Privkey export where pubkey is the point at infinity. */ + { + unsigned char privkey[300]; + unsigned char seckey[32] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xba, 0xae, 0xdc, 0xe6, 0xaf, 0x48, 0xa0, 0x3b, + 0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41, + }; + int outlen = 300; + CHECK(!secp256k1_ec_privkey_export(ctx, seckey, privkey, &outlen, 0)); + CHECK(!secp256k1_ec_privkey_export(ctx, seckey, privkey, &outlen, 1)); + } +} + +void run_ecdsa_edge_cases(void) { + test_ecdsa_edge_cases(); +} + +#ifdef ENABLE_OPENSSL_TESTS +EC_KEY *get_openssl_key(const secp256k1_scalar_t *key) { + unsigned char privkey[300]; + int privkeylen; + const unsigned char* pbegin = privkey; + int compr = secp256k1_rand32() & 1; + EC_KEY *ec_key = EC_KEY_new_by_curve_name(NID_secp256k1); + CHECK(secp256k1_eckey_privkey_serialize(&ctx->ecmult_gen_ctx, privkey, &privkeylen, key, compr)); + CHECK(d2i_ECPrivateKey(&ec_key, &pbegin, privkeylen)); + CHECK(EC_KEY_check_key(ec_key)); + return ec_key; +} + +void test_ecdsa_openssl(void) { + secp256k1_gej_t qj; + secp256k1_ge_t q; + secp256k1_ecdsa_sig_t sig; + secp256k1_scalar_t one; + secp256k1_scalar_t msg2; + secp256k1_scalar_t key, msg; + EC_KEY *ec_key; + unsigned int sigsize = 80; + int secp_sigsize = 80; + unsigned char message[32]; + unsigned char signature[80]; + secp256k1_rand256_test(message); + secp256k1_scalar_set_b32(&msg, message, NULL); + random_scalar_order_test(&key); + secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &qj, &key); + secp256k1_ge_set_gej(&q, &qj); + ec_key = get_openssl_key(&key); + CHECK(ec_key); + CHECK(ECDSA_sign(0, message, sizeof(message), signature, &sigsize, ec_key)); + CHECK(secp256k1_ecdsa_sig_parse(&sig, signature, sigsize)); + CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sig, &q, &msg)); + secp256k1_scalar_set_int(&one, 1); + secp256k1_scalar_add(&msg2, &msg, &one); + CHECK(!secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sig, &q, &msg2)); + + random_sign(&sig, &key, &msg, NULL); + CHECK(secp256k1_ecdsa_sig_serialize(signature, &secp_sigsize, &sig)); + CHECK(ECDSA_verify(0, message, sizeof(message), signature, secp_sigsize, ec_key) == 1); + + EC_KEY_free(ec_key); +} + +void run_ecdsa_openssl(void) { + int i; + for (i = 0; i < 10*count; i++) { + test_ecdsa_openssl(); + } +} +#endif + +int main(int argc, char **argv) { + unsigned char seed16[16] = {0}; + unsigned char run32[32] = {0}; + /* find iteration count */ + if (argc > 1) { + count = strtol(argv[1], NULL, 0); + } + + /* find random seed */ + if (argc > 2) { + int pos = 0; + const char* ch = argv[2]; + while (pos < 16 && ch[0] != 0 && ch[1] != 0) { + unsigned short sh; + if (sscanf(ch, "%2hx", &sh)) { + seed16[pos] = sh; + } else { + break; + } + ch += 2; + pos++; + } + } else { + FILE *frand = fopen("/dev/urandom", "r"); + if (!frand || !fread(&seed16, sizeof(seed16), 1, frand)) { + uint64_t t = time(NULL) * (uint64_t)1337; + seed16[0] ^= t; + seed16[1] ^= t >> 8; + seed16[2] ^= t >> 16; + seed16[3] ^= t >> 24; + seed16[4] ^= t >> 32; + seed16[5] ^= t >> 40; + seed16[6] ^= t >> 48; + seed16[7] ^= t >> 56; + } + fclose(frand); + } + secp256k1_rand_seed(seed16); + + printf("test count = %i\n", count); + printf("random seed = %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n", seed16[0], seed16[1], seed16[2], seed16[3], seed16[4], seed16[5], seed16[6], seed16[7], seed16[8], seed16[9], seed16[10], seed16[11], seed16[12], seed16[13], seed16[14], seed16[15]); + + /* initialize */ + run_context_tests(); + ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY); + + if (secp256k1_rand32() & 1) { + secp256k1_rand256(run32); + CHECK(secp256k1_context_randomize(ctx, secp256k1_rand32() & 1 ? run32 : NULL)); + } + + run_sha256_tests(); + run_hmac_sha256_tests(); + run_rfc6979_hmac_sha256_tests(); + +#ifndef USE_NUM_NONE + /* num tests */ + run_num_smalltests(); +#endif + + /* scalar tests */ + run_scalar_tests(); + + /* field tests */ + run_field_inv(); + run_field_inv_var(); + run_field_inv_all_var(); + run_field_misc(); + run_field_convert(); + run_sqr(); + run_sqrt(); + + /* group tests */ + run_ge(); + + /* ecmult tests */ + run_wnaf(); + run_point_times_order(); + run_ecmult_chain(); + run_ecmult_constants(); + run_ecmult_gen_blind(); + + /* ecdsa tests */ + run_random_pubkeys(); + run_ecdsa_sign_verify(); + run_ecdsa_end_to_end(); + run_ecdsa_edge_cases(); +#ifdef ENABLE_OPENSSL_TESTS + run_ecdsa_openssl(); +#endif + + secp256k1_rand256(run32); + printf("random run = %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n", run32[0], run32[1], run32[2], run32[3], run32[4], run32[5], run32[6], run32[7], run32[8], run32[9], run32[10], run32[11], run32[12], run32[13], run32[14], run32[15]); + + /* shutdown */ + secp256k1_context_destroy(ctx); + return 0; +} diff --git a/src/cryptoconditions/src/include/secp256k1/src/util.h b/src/cryptoconditions/src/include/secp256k1/src/util.h new file mode 100644 index 00000000000..ae98639f7ca --- /dev/null +++ b/src/cryptoconditions/src/include/secp256k1/src/util.h @@ -0,0 +1,104 @@ +/********************************************************************** + * Copyright (c) 2013, 2014 Pieter Wuille * + * Distributed under the MIT software license, see the accompanying * + * file COPYING or http://www.opensource.org/licenses/mit-license.php.* + **********************************************************************/ + +#ifndef _SECP256K1_UTIL_H_ +#define _SECP256K1_UTIL_H_ + +#if defined HAVE_CONFIG_H +#include "libsecp256k1-config.h" +#endif + +#include +#include +#include + +#ifdef DETERMINISTIC +#define TEST_FAILURE(msg) do { \ + fprintf(stderr, "%s\n", msg); \ + abort(); \ +} while(0); +#else +#define TEST_FAILURE(msg) do { \ + fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, msg); \ + abort(); \ +} while(0) +#endif + +#ifdef HAVE_BUILTIN_EXPECT +#define EXPECT(x,c) __builtin_expect((x),(c)) +#else +#define EXPECT(x,c) (x) +#endif + +#ifdef DETERMINISTIC +#define CHECK(cond) do { \ + if (EXPECT(!(cond), 0)) { \ + TEST_FAILURE("test condition failed"); \ + } \ +} while(0) +#else +#define CHECK(cond) do { \ + if (EXPECT(!(cond), 0)) { \ + TEST_FAILURE("test condition failed: " #cond); \ + } \ +} while(0) +#endif + +/* Like assert(), but safe to use on expressions with side effects. */ +#ifndef NDEBUG +#define DEBUG_CHECK CHECK +#else +#define DEBUG_CHECK(cond) do { (void)(cond); } while(0) +#endif + +/* Like DEBUG_CHECK(), but when VERIFY is defined instead of NDEBUG not defined. */ +#ifdef VERIFY +#define VERIFY_CHECK CHECK +#else +#define VERIFY_CHECK(cond) do { (void)(cond); } while(0) +#endif + +static SECP256K1_INLINE void *checked_malloc(size_t size) { + void *ret = malloc(size); + CHECK(ret != NULL); + return ret; +} + +/* Macro for restrict, when available and not in a VERIFY build. */ +#if defined(SECP256K1_BUILD) && defined(VERIFY) +# define SECP256K1_RESTRICT +#else +# if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) ) +# if SECP256K1_GNUC_PREREQ(3,0) +# define SECP256K1_RESTRICT __restrict__ +# elif (defined(_MSC_VER) && _MSC_VER >= 1400) +# define SECP256K1_RESTRICT __restrict +# else +# define SECP256K1_RESTRICT +# endif +# else +# define SECP256K1_RESTRICT restrict +# endif +#endif + +#if defined(_WIN32) +# define I64FORMAT "I64d" +# define I64uFORMAT "I64u" +#else +# define I64FORMAT "lld" +# define I64uFORMAT "llu" +#endif + +#if defined(HAVE___INT128) +# if defined(__GNUC__) +# define SECP256K1_GNUC_EXT __extension__ +# else +# define SECP256K1_GNUC_EXT +# endif +SECP256K1_GNUC_EXT typedef unsigned __int128 uint128_t; +#endif + +#endif diff --git a/src/cryptoconditions/src/include/sha256.c b/src/cryptoconditions/src/include/sha256.c new file mode 100644 index 00000000000..e273836cebb --- /dev/null +++ b/src/cryptoconditions/src/include/sha256.c @@ -0,0 +1,264 @@ +/*- + * Copyright 2005 Colin Percival + * Copyright 2013 Christian Mehlis & René Kijewski + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + * + * $FreeBSD: src/lib/libmd/sha256c.c,v 1.2 2006/01/17 15:35:56 phk Exp $ + */ + +/** + * @ingroup sys_crypto + * @{ + * + * @file sha256.c + * @brief SHA256 hash function implementation + * + * @author Colin Percival + * @author Christian Mehlis + * @author Rene Kijewski + * + * @} + */ + +#include "sha256.h" + +#define memcpy __builtin_memcpy +#define memset __builtin_memset + +#ifdef __BIG_ENDIAN__ +/* Copy a vector of big-endian uint32_t into a vector of bytes */ +#define be32enc_vect memcpy + +/* Copy a vector of bytes into a vector of big-endian uint32_t */ +#define be32dec_vect memcpy + +#else /* !__BIG_ENDIAN__ */ + +/* + * Encode a length len/4 vector of (uint32_t) into a length len vector of + * (unsigned char) in big-endian form. Assumes len is a multiple of 4. + */ +static void be32enc_vect(void *dst_, const void *src_, size_t len) +{ + uint32_t *dst = dst_; + const uint32_t *src = src_; + size_t i; + + for (i = 0; i < len / 4; i++) { + dst[i] = __builtin_bswap32(src[i]); + } +} + +/* + * Decode a big-endian length len vector of (unsigned char) into a length + * len/4 vector of (uint32_t). Assumes len is a multiple of 4. + */ +#define be32dec_vect be32enc_vect + +#endif /* __BYTE_ORDER__ != __ORDER_BIG_ENDIAN__ */ + +/* Elementary functions used by SHA256 */ +#define Ch(x, y, z) ((x & (y ^ z)) ^ z) +#define Maj(x, y, z) ((x & (y | z)) | (y & z)) +#define SHR(x, n) (x >> n) +#define ROTR(x, n) ((x >> n) | (x << (32 - n))) +#define S0(x) (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22)) +#define S1(x) (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25)) +#define s0(x) (ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3)) +#define s1(x) (ROTR(x, 17) ^ ROTR(x, 19) ^ SHR(x, 10)) + +static const uint32_t K[64] = { + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, + 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, + 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, + 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2, +}; + +/* + * SHA256 block compression function. The 256-bit state is transformed via + * the 512-bit input block to produce a new state. + */ +static void sha256_transform(uint32_t *state, const unsigned char block[64]) +{ + uint32_t W[64]; + uint32_t S[8]; + int i; + + /* 1. Prepare message schedule W. */ + be32dec_vect(W, block, 64); + for (i = 16; i < 64; i++) { + W[i] = s1(W[i - 2]) + W[i - 7] + s0(W[i - 15]) + W[i - 16]; + } + + /* 2. Initialize working variables. */ + memcpy(S, state, 32); + + /* 3. Mix. */ + for (i = 0; i < 64; ++i) { + uint32_t e = S[(68 - i) % 8], f = S[(69 - i) % 8]; + uint32_t g = S[(70 - i) % 8], h = S[(71 - i) % 8]; + uint32_t t0 = h + S1(e) + Ch(e, f, g) + W[i] + K[i]; + + uint32_t a = S[(64 - i) % 8], b = S[(65 - i) % 8]; + uint32_t c = S[(66 - i) % 8], d = S[(67 - i) % 8]; + uint32_t t1 = S0(a) + Maj(a, b, c); + + S[(67 - i) % 8] = d + t0; + S[(71 - i) % 8] = t0 + t1; + } + + /* 4. Mix local working variables into global state */ + for (i = 0; i < 8; i++) { + state[i] += S[i]; + } +} + +/* Add padding and terminating bit-count. */ +static void sha256_pad(sha256_context_t *ctx) +{ + + const unsigned char PAD[64] = { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + /* + * Convert length to a vector of bytes -- we do this now rather + * than later because the length will change after we pad. + */ + unsigned char len[8]; + be32enc_vect(len, ctx->count, 8); + + /* Add 1--64 bytes so that the resulting length is 56 mod 64 */ + uint32_t r = (ctx->count[1] >> 3) & 0x3f; + uint32_t plen = (r < 56) ? (56 - r) : (120 - r); + sha256_update(ctx, PAD, (size_t) plen); + + /* Add the terminating bit-count */ + sha256_update(ctx, len, 8); +} + +/* SHA-256 initialization. Begins a SHA-256 operation. */ +void sha256_init(sha256_context_t *ctx) +{ + /* Zero bits processed so far */ + ctx->count[0] = ctx->count[1] = 0; + + /* Magic initialization constants */ + ctx->state[0] = 0x6A09E667; + ctx->state[1] = 0xBB67AE85; + ctx->state[2] = 0x3C6EF372; + ctx->state[3] = 0xA54FF53A; + ctx->state[4] = 0x510E527F; + ctx->state[5] = 0x9B05688C; + ctx->state[6] = 0x1F83D9AB; + ctx->state[7] = 0x5BE0CD19; +} + +/* Add bytes into the hash */ +void sha256_update(sha256_context_t *ctx, const void *in, size_t len) +{ + /* Number of bytes left in the buffer from previous updates */ + uint32_t r = (ctx->count[1] >> 3) & 0x3f; + + /* Convert the length into a number of bits */ + uint32_t bitlen1 = ((uint32_t) len) << 3; + uint32_t bitlen0 = ((uint32_t) len) >> 29; + + /* Update number of bits */ + if ((ctx->count[1] += bitlen1) < bitlen1) { + ctx->count[0]++; + } + + ctx->count[0] += bitlen0; + + /* Handle the case where we don't need to perform any transforms */ + if (len < 64 - r) { + memcpy(&ctx->buf[r], in, len); + return; + } + + /* Finish the current block */ + const unsigned char *src = in; + + memcpy(&ctx->buf[r], src, 64 - r); + sha256_transform(ctx->state, ctx->buf); + src += 64 - r; + len -= 64 - r; + + /* Perform complete blocks */ + while (len >= 64) { + sha256_transform(ctx->state, src); + src += 64; + len -= 64; + } + + /* Copy left over data into buffer */ + memcpy(ctx->buf, src, len); +} + +/* + * SHA-256 finalization. Pads the input data, exports the hash value, + * and clears the context state. + */ +void sha256_final(unsigned char digest[32], sha256_context_t *ctx) +{ + /* Add padding */ + sha256_pad(ctx); + + /* Write the hash */ + be32enc_vect(digest, ctx->state, 32); + + /* Clear the context state */ + memset((void *) ctx, 0, sizeof(*ctx)); +} + +unsigned char *sha256(const unsigned char *d, size_t n, unsigned char *md) +{ + sha256_context_t c __attribute__((aligned(4))); + static unsigned char m[SHA256_DIGEST_LENGTH] __attribute__((aligned(4))); + + if (md == NULL) { + md = m; + } + + sha256_init(&c); + sha256_update(&c, d, n); + sha256_final(md, &c); + + return md; +} diff --git a/src/cryptoconditions/src/include/sha256.h b/src/cryptoconditions/src/include/sha256.h new file mode 100644 index 00000000000..7bbf3f43ab9 --- /dev/null +++ b/src/cryptoconditions/src/include/sha256.h @@ -0,0 +1,114 @@ +/*- + * Copyright 2005 Colin Percival + * Copyright 2013 Christian Mehlis & René Kijewski + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + * + * $FreeBSD: src/lib/libmd/sha256.h,v 1.1.2.1 2005/06/24 13:32:25 cperciva Exp $ + */ + +/** + * @defgroup sys_sha256 SHA264 + * @ingroup sys + * @brief SHA264 hash generator + */ + +/** + * @ingroup sys_crypto + * @{ + * + * @file sha256.h + * @brief Header definitions for the SHA256 hash function + * + * @author Colin Percival + * @author Christian Mehlis + * @author Rene Kijewski + */ + +#ifndef _SHA256_H_ +#define _SHA256_H_ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define SHA256_DIGEST_LENGTH 32 + +/** + * @brief Context for ciper operatins based on sha256 + */ +typedef struct { + /** global state */ + uint32_t state[8]; + /** processed bytes counter */ + uint32_t count[2]; + /** data buffer */ + unsigned char buf[64]; +} sha256_context_t; + +/** + * @brief SHA-256 initialization. Begins a SHA-256 operation. + * + * @param ctx sha256_context_t handle to init + */ +void sha256_init(sha256_context_t *ctx); + +/** + * @brief Add bytes into the hash + * + * @param ctx sha256_context_t handle to use + * @param in pointer to the input buffer + * @param len length of the buffer + */ +void sha256_update(sha256_context_t *ctx, const void *in, size_t len); + +/** + * @brief SHA-256 finalization. Pads the input data, exports the hash value, + * and clears the context state. + * + * @param digest resulting digest, this is the hash of all the bytes + * @param ctx sha256_context_t handle to use + */ +void sha256_final(unsigned char digest[32], sha256_context_t *ctx); + +/** + * @brief A wrapper function to simplify the generation of a hash, this is + * usefull for generating sha256 for one buffer + * + * @param d pointer to the buffer to generate hash from + * @param n length of the buffer + * @param md optional pointer to an array for the result, length must be + * SHA256_DIGEST_LENGTH + * if md == NULL, one static buffer is used + */ +unsigned char *sha256(const unsigned char *d, size_t n, unsigned char *md); + +#ifdef __cplusplus +} +#endif + +/** @} */ +#endif /* _SHA256_H_ */ diff --git a/src/cryptoconditions/src/include/tweetnacl.c b/src/cryptoconditions/src/include/tweetnacl.c new file mode 100644 index 00000000000..8ac0a1806a7 --- /dev/null +++ b/src/cryptoconditions/src/include/tweetnacl.c @@ -0,0 +1,809 @@ +#include "tweetnacl.h" +#define FOR(i,n) for (i = 0;i < n;++i) +#define sv static void + +typedef unsigned char u8; +typedef unsigned long u32; +typedef unsigned long long u64; +typedef long long i64; +typedef i64 gf[16]; +extern void randombytes(u8 *,u64); + +static const u8 + _0[16], + _9[32] = {9}; +static const gf + gf0, + gf1 = {1}, + _121665 = {0xDB41,1}, + D = {0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203}, + D2 = {0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0, 0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406}, + X = {0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c, 0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169}, + Y = {0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666}, + I = {0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83}; + +static u32 L32(u32 x,int c) { return (x << c) | ((x&0xffffffff) >> (32 - c)); } + +static u32 ld32(const u8 *x) +{ + u32 u = x[3]; + u = (u<<8)|x[2]; + u = (u<<8)|x[1]; + return (u<<8)|x[0]; +} + +static u64 dl64(const u8 *x) +{ + u64 i,u=0; + FOR(i,8) u=(u<<8)|x[i]; + return u; +} + +sv st32(u8 *x,u32 u) +{ + int i; + FOR(i,4) { x[i] = u; u >>= 8; } +} + +sv ts64(u8 *x,u64 u) +{ + int i; + for (i = 7;i >= 0;--i) { x[i] = u; u >>= 8; } +} + +static int vn(const u8 *x,const u8 *y,int n) +{ + u32 i,d = 0; + FOR(i,n) d |= x[i]^y[i]; + return (1 & ((d - 1) >> 8)) - 1; +} + +int crypto_verify_16(const u8 *x,const u8 *y) +{ + return vn(x,y,16); +} + +int crypto_verify_32(const u8 *x,const u8 *y) +{ + return vn(x,y,32); +} + +sv core(u8 *out,const u8 *in,const u8 *k,const u8 *c,int h) +{ + u32 w[16],x[16],y[16],t[4]; + int i,j,m; + + FOR(i,4) { + x[5*i] = ld32(c+4*i); + x[1+i] = ld32(k+4*i); + x[6+i] = ld32(in+4*i); + x[11+i] = ld32(k+16+4*i); + } + + FOR(i,16) y[i] = x[i]; + + FOR(i,20) { + FOR(j,4) { + FOR(m,4) t[m] = x[(5*j+4*m)%16]; + t[1] ^= L32(t[0]+t[3], 7); + t[2] ^= L32(t[1]+t[0], 9); + t[3] ^= L32(t[2]+t[1],13); + t[0] ^= L32(t[3]+t[2],18); + FOR(m,4) w[4*j+(j+m)%4] = t[m]; + } + FOR(m,16) x[m] = w[m]; + } + + if (h) { + FOR(i,16) x[i] += y[i]; + FOR(i,4) { + x[5*i] -= ld32(c+4*i); + x[6+i] -= ld32(in+4*i); + } + FOR(i,4) { + st32(out+4*i,x[5*i]); + st32(out+16+4*i,x[6+i]); + } + } else + FOR(i,16) st32(out + 4 * i,x[i] + y[i]); +} + +int crypto_core_salsa20(u8 *out,const u8 *in,const u8 *k,const u8 *c) +{ + core(out,in,k,c,0); + return 0; +} + +int crypto_core_hsalsa20(u8 *out,const u8 *in,const u8 *k,const u8 *c) +{ + core(out,in,k,c,1); + return 0; +} + +static const u8 sigma[16] = "expand 32-byte k"; + +int crypto_stream_salsa20_xor(u8 *c,const u8 *m,u64 b,const u8 *n,const u8 *k) +{ + u8 z[16],x[64]; + u32 u,i; + if (!b) return 0; + FOR(i,16) z[i] = 0; + FOR(i,8) z[i] = n[i]; + while (b >= 64) { + crypto_core_salsa20(x,z,k,sigma); + FOR(i,64) c[i] = (m?m[i]:0) ^ x[i]; + u = 1; + for (i = 8;i < 16;++i) { + u += (u32) z[i]; + z[i] = u; + u >>= 8; + } + b -= 64; + c += 64; + if (m) m += 64; + } + if (b) { + crypto_core_salsa20(x,z,k,sigma); + FOR(i,b) c[i] = (m?m[i]:0) ^ x[i]; + } + return 0; +} + +int crypto_stream_salsa20(u8 *c,u64 d,const u8 *n,const u8 *k) +{ + return crypto_stream_salsa20_xor(c,0,d,n,k); +} + +int crypto_stream(u8 *c,u64 d,const u8 *n,const u8 *k) +{ + u8 s[32]; + crypto_core_hsalsa20(s,n,k,sigma); + return crypto_stream_salsa20(c,d,n+16,s); +} + +int crypto_stream_xor(u8 *c,const u8 *m,u64 d,const u8 *n,const u8 *k) +{ + u8 s[32]; + crypto_core_hsalsa20(s,n,k,sigma); + return crypto_stream_salsa20_xor(c,m,d,n+16,s); +} + +sv add1305(u32 *h,const u32 *c) +{ + u32 j,u = 0; + FOR(j,17) { + u += h[j] + c[j]; + h[j] = u & 255; + u >>= 8; + } +} + +static const u32 minusp[17] = { + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252 +} ; + +int crypto_onetimeauth(u8 *out,const u8 *m,u64 n,const u8 *k) +{ + u32 s,i,j,u,x[17],r[17],h[17],c[17],g[17]; + + FOR(j,17) r[j]=h[j]=0; + FOR(j,16) r[j]=k[j]; + r[3]&=15; + r[4]&=252; + r[7]&=15; + r[8]&=252; + r[11]&=15; + r[12]&=252; + r[15]&=15; + + while (n > 0) { + FOR(j,17) c[j] = 0; + for (j = 0;(j < 16) && (j < n);++j) c[j] = m[j]; + c[j] = 1; + m += j; n -= j; + add1305(h,c); + FOR(i,17) { + x[i] = 0; + FOR(j,17) x[i] += h[j] * ((j <= i) ? r[i - j] : 320 * r[i + 17 - j]); + } + FOR(i,17) h[i] = x[i]; + u = 0; + FOR(j,16) { + u += h[j]; + h[j] = u & 255; + u >>= 8; + } + u += h[16]; h[16] = u & 3; + u = 5 * (u >> 2); + FOR(j,16) { + u += h[j]; + h[j] = u & 255; + u >>= 8; + } + u += h[16]; h[16] = u; + } + + FOR(j,17) g[j] = h[j]; + add1305(h,minusp); + s = -(h[16] >> 7); + FOR(j,17) h[j] ^= s & (g[j] ^ h[j]); + + FOR(j,16) c[j] = k[j + 16]; + c[16] = 0; + add1305(h,c); + FOR(j,16) out[j] = h[j]; + return 0; +} + +int crypto_onetimeauth_verify(const u8 *h,const u8 *m,u64 n,const u8 *k) +{ + u8 x[16]; + crypto_onetimeauth(x,m,n,k); + return crypto_verify_16(h,x); +} + +int crypto_secretbox(u8 *c,const u8 *m,u64 d,const u8 *n,const u8 *k) +{ + int i; + if (d < 32) return -1; + crypto_stream_xor(c,m,d,n,k); + crypto_onetimeauth(c + 16,c + 32,d - 32,c); + FOR(i,16) c[i] = 0; + return 0; +} + +int crypto_secretbox_open(u8 *m,const u8 *c,u64 d,const u8 *n,const u8 *k) +{ + int i; + u8 x[32]; + if (d < 32) return -1; + crypto_stream(x,32,n,k); + if (crypto_onetimeauth_verify(c + 16,c + 32,d - 32,x) != 0) return -1; + crypto_stream_xor(m,c,d,n,k); + FOR(i,32) m[i] = 0; + return 0; +} + +sv set25519(gf r, const gf a) +{ + int i; + FOR(i,16) r[i]=a[i]; +} + +sv car25519(gf o) +{ + int i; + i64 c; + FOR(i,16) { + o[i]+=(1LL<<16); + c=o[i]>>16; + o[(i+1)*(i<15)]+=c-1+37*(c-1)*(i==15); + o[i]-=c<<16; + } +} + +sv sel25519(gf p,gf q,int b) +{ + i64 t,i,c=~(b-1); + FOR(i,16) { + t= c&(p[i]^q[i]); + p[i]^=t; + q[i]^=t; + } +} + +sv pack25519(u8 *o,const gf n) +{ + int i,j,b; + gf m,t; + FOR(i,16) t[i]=n[i]; + car25519(t); + car25519(t); + car25519(t); + FOR(j,2) { + m[0]=t[0]-0xffed; + for(i=1;i<15;i++) { + m[i]=t[i]-0xffff-((m[i-1]>>16)&1); + m[i-1]&=0xffff; + } + m[15]=t[15]-0x7fff-((m[14]>>16)&1); + b=(m[15]>>16)&1; + m[14]&=0xffff; + sel25519(t,m,1-b); + } + FOR(i,16) { + o[2*i]=t[i]&0xff; + o[2*i+1]=t[i]>>8; + } +} + +static int neq25519(const gf a, const gf b) +{ + u8 c[32],d[32]; + pack25519(c,a); + pack25519(d,b); + return crypto_verify_32(c,d); +} + +static u8 par25519(const gf a) +{ + u8 d[32]; + pack25519(d,a); + return d[0]&1; +} + +sv unpack25519(gf o, const u8 *n) +{ + int i; + FOR(i,16) o[i]=n[2*i]+((i64)n[2*i+1]<<8); + o[15]&=0x7fff; +} + +sv A(gf o,const gf a,const gf b) +{ + int i; + FOR(i,16) o[i]=a[i]+b[i]; +} + +sv Z(gf o,const gf a,const gf b) +{ + int i; + FOR(i,16) o[i]=a[i]-b[i]; +} + +sv M(gf o,const gf a,const gf b) +{ + i64 i,j,t[31]; + FOR(i,31) t[i]=0; + FOR(i,16) FOR(j,16) t[i+j]+=a[i]*b[j]; + FOR(i,15) t[i]+=38*t[i+16]; + FOR(i,16) o[i]=t[i]; + car25519(o); + car25519(o); +} + +sv S(gf o,const gf a) +{ + M(o,a,a); +} + +sv inv25519(gf o,const gf i) +{ + gf c; + int a; + FOR(a,16) c[a]=i[a]; + for(a=253;a>=0;a--) { + S(c,c); + if(a!=2&&a!=4) M(c,c,i); + } + FOR(a,16) o[a]=c[a]; +} + +sv pow2523(gf o,const gf i) +{ + gf c; + int a; + FOR(a,16) c[a]=i[a]; + for(a=250;a>=0;a--) { + S(c,c); + if(a!=1) M(c,c,i); + } + FOR(a,16) o[a]=c[a]; +} + +int crypto_scalarmult(u8 *q,const u8 *n,const u8 *p) +{ + u8 z[32]; + i64 x[80],r,i; + gf a,b,c,d,e,f; + FOR(i,31) z[i]=n[i]; + z[31]=(n[31]&127)|64; + z[0]&=248; + unpack25519(x,p); + FOR(i,16) { + b[i]=x[i]; + d[i]=a[i]=c[i]=0; + } + a[0]=d[0]=1; + for(i=254;i>=0;--i) { + r=(z[i>>3]>>(i&7))&1; + sel25519(a,b,r); + sel25519(c,d,r); + A(e,a,c); + Z(a,a,c); + A(c,b,d); + Z(b,b,d); + S(d,e); + S(f,a); + M(a,c,a); + M(c,b,e); + A(e,a,c); + Z(a,a,c); + S(b,a); + Z(c,d,f); + M(a,c,_121665); + A(a,a,d); + M(c,c,a); + M(a,d,f); + M(d,b,x); + S(b,e); + sel25519(a,b,r); + sel25519(c,d,r); + } + FOR(i,16) { + x[i+16]=a[i]; + x[i+32]=c[i]; + x[i+48]=b[i]; + x[i+64]=d[i]; + } + inv25519(x+32,x+32); + M(x+16,x+16,x+32); + pack25519(q,x+16); + return 0; +} + +int crypto_scalarmult_base(u8 *q,const u8 *n) +{ + return crypto_scalarmult(q,n,_9); +} + +int crypto_box_keypair(u8 *y,u8 *x) +{ + randombytes(x,32); + return crypto_scalarmult_base(y,x); +} + +int crypto_box_beforenm(u8 *k,const u8 *y,const u8 *x) +{ + u8 s[32]; + crypto_scalarmult(s,x,y); + return crypto_core_hsalsa20(k,_0,s,sigma); +} + +int crypto_box_afternm(u8 *c,const u8 *m,u64 d,const u8 *n,const u8 *k) +{ + return crypto_secretbox(c,m,d,n,k); +} + +int crypto_box_open_afternm(u8 *m,const u8 *c,u64 d,const u8 *n,const u8 *k) +{ + return crypto_secretbox_open(m,c,d,n,k); +} + +int crypto_box(u8 *c,const u8 *m,u64 d,const u8 *n,const u8 *y,const u8 *x) +{ + u8 k[32]; + crypto_box_beforenm(k,y,x); + return crypto_box_afternm(c,m,d,n,k); +} + +int crypto_box_open(u8 *m,const u8 *c,u64 d,const u8 *n,const u8 *y,const u8 *x) +{ + u8 k[32]; + crypto_box_beforenm(k,y,x); + return crypto_box_open_afternm(m,c,d,n,k); +} + +static u64 R(u64 x,int c) { return (x >> c) | (x << (64 - c)); } +static u64 Ch(u64 x,u64 y,u64 z) { return (x & y) ^ (~x & z); } +static u64 Maj(u64 x,u64 y,u64 z) { return (x & y) ^ (x & z) ^ (y & z); } +static u64 Sigma0(u64 x) { return R(x,28) ^ R(x,34) ^ R(x,39); } +static u64 Sigma1(u64 x) { return R(x,14) ^ R(x,18) ^ R(x,41); } +static u64 sigma0(u64 x) { return R(x, 1) ^ R(x, 8) ^ (x >> 7); } +static u64 sigma1(u64 x) { return R(x,19) ^ R(x,61) ^ (x >> 6); } + +static const u64 K[80] = +{ + 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL, + 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL, 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL, + 0xd807aa98a3030242ULL, 0x12835b0145706fbeULL, 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL, + 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL, 0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL, + 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL, 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL, + 0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL, 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL, + 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL, 0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL, + 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL, 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL, + 0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL, 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL, + 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL, 0x81c2c92e47edaee6ULL, 0x92722c851482353bULL, + 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL, 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL, + 0xd192e819d6ef5218ULL, 0xd69906245565a910ULL, 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL, + 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL, 0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL, + 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL, 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL, + 0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL, 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL, + 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL, 0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL, + 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL, 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL, + 0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL, 0x113f9804bef90daeULL, 0x1b710b35131c471bULL, + 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL, 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL, + 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL, 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL +}; + +int crypto_hashblocks(u8 *x,const u8 *m,u64 n) +{ + u64 z[8],b[8],a[8],w[16],t; + int i,j; + + FOR(i,8) z[i] = a[i] = dl64(x + 8 * i); + + while (n >= 128) { + FOR(i,16) w[i] = dl64(m + 8 * i); + + FOR(i,80) { + FOR(j,8) b[j] = a[j]; + t = a[7] + Sigma1(a[4]) + Ch(a[4],a[5],a[6]) + K[i] + w[i%16]; + b[7] = t + Sigma0(a[0]) + Maj(a[0],a[1],a[2]); + b[3] += t; + FOR(j,8) a[(j+1)%8] = b[j]; + if (i%16 == 15) + FOR(j,16) + w[j] += w[(j+9)%16] + sigma0(w[(j+1)%16]) + sigma1(w[(j+14)%16]); + } + + FOR(i,8) { a[i] += z[i]; z[i] = a[i]; } + + m += 128; + n -= 128; + } + + FOR(i,8) ts64(x+8*i,z[i]); + + return n; +} + +static const u8 iv[64] = { + 0x6a,0x09,0xe6,0x67,0xf3,0xbc,0xc9,0x08, + 0xbb,0x67,0xae,0x85,0x84,0xca,0xa7,0x3b, + 0x3c,0x6e,0xf3,0x72,0xfe,0x94,0xf8,0x2b, + 0xa5,0x4f,0xf5,0x3a,0x5f,0x1d,0x36,0xf1, + 0x51,0x0e,0x52,0x7f,0xad,0xe6,0x82,0xd1, + 0x9b,0x05,0x68,0x8c,0x2b,0x3e,0x6c,0x1f, + 0x1f,0x83,0xd9,0xab,0xfb,0x41,0xbd,0x6b, + 0x5b,0xe0,0xcd,0x19,0x13,0x7e,0x21,0x79 +} ; + +int crypto_hash(u8 *out,const u8 *m,u64 n) +{ + u8 h[64],x[256]; + u64 i,b = n; + + FOR(i,64) h[i] = iv[i]; + + crypto_hashblocks(h,m,n); + m += n; + n &= 127; + m -= n; + + FOR(i,256) x[i] = 0; + FOR(i,n) x[i] = m[i]; + x[n] = 128; + + n = 256-128*(n<112); + x[n-9] = b >> 61; + ts64(x+n-8,b<<3); + crypto_hashblocks(h,x,n); + + FOR(i,64) out[i] = h[i]; + + return 0; +} + +sv add(gf p[4],gf q[4]) +{ + gf a,b,c,d,t,e,f,g,h; + + Z(a, p[1], p[0]); + Z(t, q[1], q[0]); + M(a, a, t); + A(b, p[0], p[1]); + A(t, q[0], q[1]); + M(b, b, t); + M(c, p[3], q[3]); + M(c, c, D2); + M(d, p[2], q[2]); + A(d, d, d); + Z(e, b, a); + Z(f, d, c); + A(g, d, c); + A(h, b, a); + + M(p[0], e, f); + M(p[1], h, g); + M(p[2], g, f); + M(p[3], e, h); +} + +sv cswap(gf p[4],gf q[4],u8 b) +{ + int i; + FOR(i,4) + sel25519(p[i],q[i],b); +} + +sv pack(u8 *r,gf p[4]) +{ + gf tx, ty, zi; + inv25519(zi, p[2]); + M(tx, p[0], zi); + M(ty, p[1], zi); + pack25519(r, ty); + r[31] ^= par25519(tx) << 7; +} + +sv scalarmult(gf p[4],gf q[4],const u8 *s) +{ + int i; + set25519(p[0],gf0); + set25519(p[1],gf1); + set25519(p[2],gf1); + set25519(p[3],gf0); + for (i = 255;i >= 0;--i) { + u8 b = (s[i/8]>>(i&7))&1; + cswap(p,q,b); + add(q,p); + add(p,p); + cswap(p,q,b); + } +} + +sv scalarbase(gf p[4],const u8 *s) +{ + gf q[4]; + set25519(q[0],X); + set25519(q[1],Y); + set25519(q[2],gf1); + M(q[3],X,Y); + scalarmult(p,q,s); +} + +int crypto_sign_keypair(u8 *pk, u8 *sk) +{ + u8 d[64]; + gf p[4]; + int i; + + randombytes(sk, 32); + crypto_hash(d, sk, 32); + d[0] &= 248; + d[31] &= 127; + d[31] |= 64; + + scalarbase(p,d); + pack(pk,p); + + FOR(i,32) sk[32 + i] = pk[i]; + return 0; +} + +static const u64 L[32] = {0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10}; + +sv modL(u8 *r,i64 x[64]) +{ + i64 carry,i,j; + for (i = 63;i >= 32;--i) { + carry = 0; + for (j = i - 32;j < i - 12;++j) { + x[j] += carry - 16 * x[i] * L[j - (i - 32)]; + carry = (x[j] + 128) >> 8; + x[j] -= carry << 8; + } + x[j] += carry; + x[i] = 0; + } + carry = 0; + FOR(j,32) { + x[j] += carry - (x[31] >> 4) * L[j]; + carry = x[j] >> 8; + x[j] &= 255; + } + FOR(j,32) x[j] -= carry * L[j]; + FOR(i,32) { + x[i+1] += x[i] >> 8; + r[i] = x[i] & 255; + } +} + +sv reduce(u8 *r) +{ + i64 x[64],i; + FOR(i,64) x[i] = (u64) r[i]; + FOR(i,64) r[i] = 0; + modL(r,x); +} + +int crypto_sign(u8 *sm,u64 *smlen,const u8 *m,u64 n,const u8 *sk) +{ + u8 d[64],h[64],r[64]; + i64 i,j,x[64]; + gf p[4]; + + crypto_hash(d, sk, 32); + d[0] &= 248; + d[31] &= 127; + d[31] |= 64; + + *smlen = n+64; + FOR(i,n) sm[64 + i] = m[i]; + FOR(i,32) sm[32 + i] = d[32 + i]; + + crypto_hash(r, sm+32, n+32); + reduce(r); + scalarbase(p,r); + pack(sm,p); + + FOR(i,32) sm[i+32] = sk[i+32]; + crypto_hash(h,sm,n + 64); + reduce(h); + + FOR(i,64) x[i] = 0; + FOR(i,32) x[i] = (u64) r[i]; + FOR(i,32) FOR(j,32) x[i+j] += h[i] * (u64) d[j]; + modL(sm + 32,x); + + return 0; +} + +static int unpackneg(gf r[4],const u8 p[32]) +{ + gf t, chk, num, den, den2, den4, den6; + set25519(r[2],gf1); + unpack25519(r[1],p); + S(num,r[1]); + M(den,num,D); + Z(num,num,r[2]); + A(den,r[2],den); + + S(den2,den); + S(den4,den2); + M(den6,den4,den2); + M(t,den6,num); + M(t,t,den); + + pow2523(t,t); + M(t,t,num); + M(t,t,den); + M(t,t,den); + M(r[0],t,den); + + S(chk,r[0]); + M(chk,chk,den); + if (neq25519(chk, num)) M(r[0],r[0],I); + + S(chk,r[0]); + M(chk,chk,den); + if (neq25519(chk, num)) return -1; + + if (par25519(r[0]) == (p[31]>>7)) Z(r[0],gf0,r[0]); + + M(r[3],r[0],r[1]); + return 0; +} + +int crypto_sign_open(u8 *m,u64 *mlen,const u8 *sm,u64 n,const u8 *pk) +{ + int i; + u8 t[32],h[64]; + gf p[4],q[4]; + + *mlen = -1; + if (n < 64) return -1; + + if (unpackneg(q,pk)) return -1; + + FOR(i,n) m[i] = sm[i]; + FOR(i,32) m[i+32] = pk[i]; + crypto_hash(h,m,n); + reduce(h); + scalarmult(p,q,h); + + scalarbase(q,sm + 32); + add(p,q); + pack(t,p); + + n -= 64; + if (crypto_verify_32(sm, t)) { + FOR(i,n) m[i] = 0; + return -1; + } + + FOR(i,n) m[i] = sm[i + 64]; + *mlen = n; + return 0; +} diff --git a/src/cryptoconditions/src/include/tweetnacl.h b/src/cryptoconditions/src/include/tweetnacl.h new file mode 100644 index 00000000000..9277fbf8ffa --- /dev/null +++ b/src/cryptoconditions/src/include/tweetnacl.h @@ -0,0 +1,272 @@ +#ifndef TWEETNACL_H +#define TWEETNACL_H +#define crypto_auth_PRIMITIVE "hmacsha512256" +#define crypto_auth crypto_auth_hmacsha512256 +#define crypto_auth_verify crypto_auth_hmacsha512256_verify +#define crypto_auth_BYTES crypto_auth_hmacsha512256_BYTES +#define crypto_auth_KEYBYTES crypto_auth_hmacsha512256_KEYBYTES +#define crypto_auth_IMPLEMENTATION crypto_auth_hmacsha512256_IMPLEMENTATION +#define crypto_auth_VERSION crypto_auth_hmacsha512256_VERSION +#define crypto_auth_hmacsha512256_tweet_BYTES 32 +#define crypto_auth_hmacsha512256_tweet_KEYBYTES 32 +extern int crypto_auth_hmacsha512256_tweet(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *); +extern int crypto_auth_hmacsha512256_tweet_verify(const unsigned char *,const unsigned char *,unsigned long long,const unsigned char *); +#define crypto_auth_hmacsha512256_tweet_VERSION "-" +#define crypto_auth_hmacsha512256 crypto_auth_hmacsha512256_tweet +#define crypto_auth_hmacsha512256_verify crypto_auth_hmacsha512256_tweet_verify +#define crypto_auth_hmacsha512256_BYTES crypto_auth_hmacsha512256_tweet_BYTES +#define crypto_auth_hmacsha512256_KEYBYTES crypto_auth_hmacsha512256_tweet_KEYBYTES +#define crypto_auth_hmacsha512256_VERSION crypto_auth_hmacsha512256_tweet_VERSION +#define crypto_auth_hmacsha512256_IMPLEMENTATION "crypto_auth/hmacsha512256/tweet" +#define crypto_box_PRIMITIVE "curve25519xsalsa20poly1305" +#define crypto_box crypto_box_curve25519xsalsa20poly1305 +#define crypto_box_open crypto_box_curve25519xsalsa20poly1305_open +#define crypto_box_keypair crypto_box_curve25519xsalsa20poly1305_keypair +#define crypto_box_beforenm crypto_box_curve25519xsalsa20poly1305_beforenm +#define crypto_box_afternm crypto_box_curve25519xsalsa20poly1305_afternm +#define crypto_box_open_afternm crypto_box_curve25519xsalsa20poly1305_open_afternm +#define crypto_box_PUBLICKEYBYTES crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES +#define crypto_box_SECRETKEYBYTES crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES +#define crypto_box_BEFORENMBYTES crypto_box_curve25519xsalsa20poly1305_BEFORENMBYTES +#define crypto_box_NONCEBYTES crypto_box_curve25519xsalsa20poly1305_NONCEBYTES +#define crypto_box_ZEROBYTES crypto_box_curve25519xsalsa20poly1305_ZEROBYTES +#define crypto_box_BOXZEROBYTES crypto_box_curve25519xsalsa20poly1305_BOXZEROBYTES +#define crypto_box_IMPLEMENTATION crypto_box_curve25519xsalsa20poly1305_IMPLEMENTATION +#define crypto_box_VERSION crypto_box_curve25519xsalsa20poly1305_VERSION +#define crypto_box_curve25519xsalsa20poly1305_tweet_PUBLICKEYBYTES 32 +#define crypto_box_curve25519xsalsa20poly1305_tweet_SECRETKEYBYTES 32 +#define crypto_box_curve25519xsalsa20poly1305_tweet_BEFORENMBYTES 32 +#define crypto_box_curve25519xsalsa20poly1305_tweet_NONCEBYTES 24 +#define crypto_box_curve25519xsalsa20poly1305_tweet_ZEROBYTES 32 +#define crypto_box_curve25519xsalsa20poly1305_tweet_BOXZEROBYTES 16 +extern int crypto_box_curve25519xsalsa20poly1305_tweet(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *,const unsigned char *); +extern int crypto_box_curve25519xsalsa20poly1305_tweet_open(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *,const unsigned char *); +extern int crypto_box_curve25519xsalsa20poly1305_tweet_keypair(unsigned char *,unsigned char *); +extern int crypto_box_curve25519xsalsa20poly1305_tweet_beforenm(unsigned char *,const unsigned char *,const unsigned char *); +extern int crypto_box_curve25519xsalsa20poly1305_tweet_afternm(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *); +extern int crypto_box_curve25519xsalsa20poly1305_tweet_open_afternm(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *); +#define crypto_box_curve25519xsalsa20poly1305_tweet_VERSION "-" +#define crypto_box_curve25519xsalsa20poly1305 crypto_box_curve25519xsalsa20poly1305_tweet +#define crypto_box_curve25519xsalsa20poly1305_open crypto_box_curve25519xsalsa20poly1305_tweet_open +#define crypto_box_curve25519xsalsa20poly1305_keypair crypto_box_curve25519xsalsa20poly1305_tweet_keypair +#define crypto_box_curve25519xsalsa20poly1305_beforenm crypto_box_curve25519xsalsa20poly1305_tweet_beforenm +#define crypto_box_curve25519xsalsa20poly1305_afternm crypto_box_curve25519xsalsa20poly1305_tweet_afternm +#define crypto_box_curve25519xsalsa20poly1305_open_afternm crypto_box_curve25519xsalsa20poly1305_tweet_open_afternm +#define crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES crypto_box_curve25519xsalsa20poly1305_tweet_PUBLICKEYBYTES +#define crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES crypto_box_curve25519xsalsa20poly1305_tweet_SECRETKEYBYTES +#define crypto_box_curve25519xsalsa20poly1305_BEFORENMBYTES crypto_box_curve25519xsalsa20poly1305_tweet_BEFORENMBYTES +#define crypto_box_curve25519xsalsa20poly1305_NONCEBYTES crypto_box_curve25519xsalsa20poly1305_tweet_NONCEBYTES +#define crypto_box_curve25519xsalsa20poly1305_ZEROBYTES crypto_box_curve25519xsalsa20poly1305_tweet_ZEROBYTES +#define crypto_box_curve25519xsalsa20poly1305_BOXZEROBYTES crypto_box_curve25519xsalsa20poly1305_tweet_BOXZEROBYTES +#define crypto_box_curve25519xsalsa20poly1305_VERSION crypto_box_curve25519xsalsa20poly1305_tweet_VERSION +#define crypto_box_curve25519xsalsa20poly1305_IMPLEMENTATION "crypto_box/curve25519xsalsa20poly1305/tweet" +#define crypto_core_PRIMITIVE "salsa20" +#define crypto_core crypto_core_salsa20 +#define crypto_core_OUTPUTBYTES crypto_core_salsa20_OUTPUTBYTES +#define crypto_core_INPUTBYTES crypto_core_salsa20_INPUTBYTES +#define crypto_core_KEYBYTES crypto_core_salsa20_KEYBYTES +#define crypto_core_CONSTBYTES crypto_core_salsa20_CONSTBYTES +#define crypto_core_IMPLEMENTATION crypto_core_salsa20_IMPLEMENTATION +#define crypto_core_VERSION crypto_core_salsa20_VERSION +#define crypto_core_salsa20_tweet_OUTPUTBYTES 64 +#define crypto_core_salsa20_tweet_INPUTBYTES 16 +#define crypto_core_salsa20_tweet_KEYBYTES 32 +#define crypto_core_salsa20_tweet_CONSTBYTES 16 +extern int crypto_core_salsa20_tweet(unsigned char *,const unsigned char *,const unsigned char *,const unsigned char *); +#define crypto_core_salsa20_tweet_VERSION "-" +#define crypto_core_salsa20 crypto_core_salsa20_tweet +#define crypto_core_salsa20_OUTPUTBYTES crypto_core_salsa20_tweet_OUTPUTBYTES +#define crypto_core_salsa20_INPUTBYTES crypto_core_salsa20_tweet_INPUTBYTES +#define crypto_core_salsa20_KEYBYTES crypto_core_salsa20_tweet_KEYBYTES +#define crypto_core_salsa20_CONSTBYTES crypto_core_salsa20_tweet_CONSTBYTES +#define crypto_core_salsa20_VERSION crypto_core_salsa20_tweet_VERSION +#define crypto_core_salsa20_IMPLEMENTATION "crypto_core/salsa20/tweet" +#define crypto_core_hsalsa20_tweet_OUTPUTBYTES 32 +#define crypto_core_hsalsa20_tweet_INPUTBYTES 16 +#define crypto_core_hsalsa20_tweet_KEYBYTES 32 +#define crypto_core_hsalsa20_tweet_CONSTBYTES 16 +extern int crypto_core_hsalsa20_tweet(unsigned char *,const unsigned char *,const unsigned char *,const unsigned char *); +#define crypto_core_hsalsa20_tweet_VERSION "-" +#define crypto_core_hsalsa20 crypto_core_hsalsa20_tweet +#define crypto_core_hsalsa20_OUTPUTBYTES crypto_core_hsalsa20_tweet_OUTPUTBYTES +#define crypto_core_hsalsa20_INPUTBYTES crypto_core_hsalsa20_tweet_INPUTBYTES +#define crypto_core_hsalsa20_KEYBYTES crypto_core_hsalsa20_tweet_KEYBYTES +#define crypto_core_hsalsa20_CONSTBYTES crypto_core_hsalsa20_tweet_CONSTBYTES +#define crypto_core_hsalsa20_VERSION crypto_core_hsalsa20_tweet_VERSION +#define crypto_core_hsalsa20_IMPLEMENTATION "crypto_core/hsalsa20/tweet" +#define crypto_hashblocks_PRIMITIVE "sha512" +#define crypto_hashblocks crypto_hashblocks_sha512 +#define crypto_hashblocks_STATEBYTES crypto_hashblocks_sha512_STATEBYTES +#define crypto_hashblocks_BLOCKBYTES crypto_hashblocks_sha512_BLOCKBYTES +#define crypto_hashblocks_IMPLEMENTATION crypto_hashblocks_sha512_IMPLEMENTATION +#define crypto_hashblocks_VERSION crypto_hashblocks_sha512_VERSION +#define crypto_hashblocks_sha512_tweet_STATEBYTES 64 +#define crypto_hashblocks_sha512_tweet_BLOCKBYTES 128 +extern int crypto_hashblocks_sha512_tweet(unsigned char *,const unsigned char *,unsigned long long); +#define crypto_hashblocks_sha512_tweet_VERSION "-" +#define crypto_hashblocks_sha512 crypto_hashblocks_sha512_tweet +#define crypto_hashblocks_sha512_STATEBYTES crypto_hashblocks_sha512_tweet_STATEBYTES +#define crypto_hashblocks_sha512_BLOCKBYTES crypto_hashblocks_sha512_tweet_BLOCKBYTES +#define crypto_hashblocks_sha512_VERSION crypto_hashblocks_sha512_tweet_VERSION +#define crypto_hashblocks_sha512_IMPLEMENTATION "crypto_hashblocks/sha512/tweet" +#define crypto_hashblocks_sha256_tweet_STATEBYTES 32 +#define crypto_hashblocks_sha256_tweet_BLOCKBYTES 64 +extern int crypto_hashblocks_sha256_tweet(unsigned char *,const unsigned char *,unsigned long long); +#define crypto_hashblocks_sha256_tweet_VERSION "-" +#define crypto_hashblocks_sha256 crypto_hashblocks_sha256_tweet +#define crypto_hashblocks_sha256_STATEBYTES crypto_hashblocks_sha256_tweet_STATEBYTES +#define crypto_hashblocks_sha256_BLOCKBYTES crypto_hashblocks_sha256_tweet_BLOCKBYTES +#define crypto_hashblocks_sha256_VERSION crypto_hashblocks_sha256_tweet_VERSION +#define crypto_hashblocks_sha256_IMPLEMENTATION "crypto_hashblocks/sha256/tweet" +#define crypto_hash_PRIMITIVE "sha512" +#define crypto_hash crypto_hash_sha512 +#define crypto_hash_BYTES crypto_hash_sha512_BYTES +#define crypto_hash_IMPLEMENTATION crypto_hash_sha512_IMPLEMENTATION +#define crypto_hash_VERSION crypto_hash_sha512_VERSION +#define crypto_hash_sha512_tweet_BYTES 64 +extern int crypto_hash_sha512_tweet(unsigned char *,const unsigned char *,unsigned long long); +#define crypto_hash_sha512_tweet_VERSION "-" +#define crypto_hash_sha512 crypto_hash_sha512_tweet +#define crypto_hash_sha512_BYTES crypto_hash_sha512_tweet_BYTES +#define crypto_hash_sha512_VERSION crypto_hash_sha512_tweet_VERSION +#define crypto_hash_sha512_IMPLEMENTATION "crypto_hash/sha512/tweet" +#define crypto_hash_sha256_tweet_BYTES 32 +extern int crypto_hash_sha256_tweet(unsigned char *,const unsigned char *,unsigned long long); +#define crypto_hash_sha256_tweet_VERSION "-" +#define crypto_hash_sha256 crypto_hash_sha256_tweet +#define crypto_hash_sha256_BYTES crypto_hash_sha256_tweet_BYTES +#define crypto_hash_sha256_VERSION crypto_hash_sha256_tweet_VERSION +#define crypto_hash_sha256_IMPLEMENTATION "crypto_hash/sha256/tweet" +#define crypto_onetimeauth_PRIMITIVE "poly1305" +#define crypto_onetimeauth crypto_onetimeauth_poly1305 +#define crypto_onetimeauth_verify crypto_onetimeauth_poly1305_verify +#define crypto_onetimeauth_BYTES crypto_onetimeauth_poly1305_BYTES +#define crypto_onetimeauth_KEYBYTES crypto_onetimeauth_poly1305_KEYBYTES +#define crypto_onetimeauth_IMPLEMENTATION crypto_onetimeauth_poly1305_IMPLEMENTATION +#define crypto_onetimeauth_VERSION crypto_onetimeauth_poly1305_VERSION +#define crypto_onetimeauth_poly1305_tweet_BYTES 16 +#define crypto_onetimeauth_poly1305_tweet_KEYBYTES 32 +extern int crypto_onetimeauth_poly1305_tweet(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *); +extern int crypto_onetimeauth_poly1305_tweet_verify(const unsigned char *,const unsigned char *,unsigned long long,const unsigned char *); +#define crypto_onetimeauth_poly1305_tweet_VERSION "-" +#define crypto_onetimeauth_poly1305 crypto_onetimeauth_poly1305_tweet +#define crypto_onetimeauth_poly1305_verify crypto_onetimeauth_poly1305_tweet_verify +#define crypto_onetimeauth_poly1305_BYTES crypto_onetimeauth_poly1305_tweet_BYTES +#define crypto_onetimeauth_poly1305_KEYBYTES crypto_onetimeauth_poly1305_tweet_KEYBYTES +#define crypto_onetimeauth_poly1305_VERSION crypto_onetimeauth_poly1305_tweet_VERSION +#define crypto_onetimeauth_poly1305_IMPLEMENTATION "crypto_onetimeauth/poly1305/tweet" +#define crypto_scalarmult_PRIMITIVE "curve25519" +#define crypto_scalarmult crypto_scalarmult_curve25519 +#define crypto_scalarmult_base crypto_scalarmult_curve25519_base +#define crypto_scalarmult_BYTES crypto_scalarmult_curve25519_BYTES +#define crypto_scalarmult_SCALARBYTES crypto_scalarmult_curve25519_SCALARBYTES +#define crypto_scalarmult_IMPLEMENTATION crypto_scalarmult_curve25519_IMPLEMENTATION +#define crypto_scalarmult_VERSION crypto_scalarmult_curve25519_VERSION +#define crypto_scalarmult_curve25519_tweet_BYTES 32 +#define crypto_scalarmult_curve25519_tweet_SCALARBYTES 32 +extern int crypto_scalarmult_curve25519_tweet(unsigned char *,const unsigned char *,const unsigned char *); +extern int crypto_scalarmult_curve25519_tweet_base(unsigned char *,const unsigned char *); +#define crypto_scalarmult_curve25519_tweet_VERSION "-" +#define crypto_scalarmult_curve25519 crypto_scalarmult_curve25519_tweet +#define crypto_scalarmult_curve25519_base crypto_scalarmult_curve25519_tweet_base +#define crypto_scalarmult_curve25519_BYTES crypto_scalarmult_curve25519_tweet_BYTES +#define crypto_scalarmult_curve25519_SCALARBYTES crypto_scalarmult_curve25519_tweet_SCALARBYTES +#define crypto_scalarmult_curve25519_VERSION crypto_scalarmult_curve25519_tweet_VERSION +#define crypto_scalarmult_curve25519_IMPLEMENTATION "crypto_scalarmult/curve25519/tweet" +#define crypto_secretbox_PRIMITIVE "xsalsa20poly1305" +#define crypto_secretbox crypto_secretbox_xsalsa20poly1305 +#define crypto_secretbox_open crypto_secretbox_xsalsa20poly1305_open +#define crypto_secretbox_KEYBYTES crypto_secretbox_xsalsa20poly1305_KEYBYTES +#define crypto_secretbox_NONCEBYTES crypto_secretbox_xsalsa20poly1305_NONCEBYTES +#define crypto_secretbox_ZEROBYTES crypto_secretbox_xsalsa20poly1305_ZEROBYTES +#define crypto_secretbox_BOXZEROBYTES crypto_secretbox_xsalsa20poly1305_BOXZEROBYTES +#define crypto_secretbox_IMPLEMENTATION crypto_secretbox_xsalsa20poly1305_IMPLEMENTATION +#define crypto_secretbox_VERSION crypto_secretbox_xsalsa20poly1305_VERSION +#define crypto_secretbox_xsalsa20poly1305_tweet_KEYBYTES 32 +#define crypto_secretbox_xsalsa20poly1305_tweet_NONCEBYTES 24 +#define crypto_secretbox_xsalsa20poly1305_tweet_ZEROBYTES 32 +#define crypto_secretbox_xsalsa20poly1305_tweet_BOXZEROBYTES 16 +extern int crypto_secretbox_xsalsa20poly1305_tweet(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *); +extern int crypto_secretbox_xsalsa20poly1305_tweet_open(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *); +#define crypto_secretbox_xsalsa20poly1305_tweet_VERSION "-" +#define crypto_secretbox_xsalsa20poly1305 crypto_secretbox_xsalsa20poly1305_tweet +#define crypto_secretbox_xsalsa20poly1305_open crypto_secretbox_xsalsa20poly1305_tweet_open +#define crypto_secretbox_xsalsa20poly1305_KEYBYTES crypto_secretbox_xsalsa20poly1305_tweet_KEYBYTES +#define crypto_secretbox_xsalsa20poly1305_NONCEBYTES crypto_secretbox_xsalsa20poly1305_tweet_NONCEBYTES +#define crypto_secretbox_xsalsa20poly1305_ZEROBYTES crypto_secretbox_xsalsa20poly1305_tweet_ZEROBYTES +#define crypto_secretbox_xsalsa20poly1305_BOXZEROBYTES crypto_secretbox_xsalsa20poly1305_tweet_BOXZEROBYTES +#define crypto_secretbox_xsalsa20poly1305_VERSION crypto_secretbox_xsalsa20poly1305_tweet_VERSION +#define crypto_secretbox_xsalsa20poly1305_IMPLEMENTATION "crypto_secretbox/xsalsa20poly1305/tweet" +#define crypto_sign_PRIMITIVE "ed25519" +#define crypto_sign crypto_sign_ed25519 +#define crypto_sign_open crypto_sign_ed25519_open +#define crypto_sign_keypair crypto_sign_ed25519_keypair +#define crypto_sign_BYTES crypto_sign_ed25519_BYTES +#define crypto_sign_PUBLICKEYBYTES crypto_sign_ed25519_PUBLICKEYBYTES +#define crypto_sign_SECRETKEYBYTES crypto_sign_ed25519_SECRETKEYBYTES +#define crypto_sign_IMPLEMENTATION crypto_sign_ed25519_IMPLEMENTATION +#define crypto_sign_VERSION crypto_sign_ed25519_VERSION +#define crypto_sign_ed25519_tweet_BYTES 64 +#define crypto_sign_ed25519_tweet_PUBLICKEYBYTES 32 +#define crypto_sign_ed25519_tweet_SECRETKEYBYTES 64 +extern int crypto_sign_ed25519_tweet(unsigned char *,unsigned long long *,const unsigned char *,unsigned long long,const unsigned char *); +extern int crypto_sign_ed25519_tweet_open(unsigned char *,unsigned long long *,const unsigned char *,unsigned long long,const unsigned char *); +extern int crypto_sign_ed25519_tweet_keypair(unsigned char *,unsigned char *); +#define crypto_sign_ed25519_tweet_VERSION "-" +#define crypto_sign_ed25519 crypto_sign_ed25519_tweet +#define crypto_sign_ed25519_open crypto_sign_ed25519_tweet_open +#define crypto_sign_ed25519_keypair crypto_sign_ed25519_tweet_keypair +#define crypto_sign_ed25519_BYTES crypto_sign_ed25519_tweet_BYTES +#define crypto_sign_ed25519_PUBLICKEYBYTES crypto_sign_ed25519_tweet_PUBLICKEYBYTES +#define crypto_sign_ed25519_SECRETKEYBYTES crypto_sign_ed25519_tweet_SECRETKEYBYTES +#define crypto_sign_ed25519_VERSION crypto_sign_ed25519_tweet_VERSION +#define crypto_sign_ed25519_IMPLEMENTATION "crypto_sign/ed25519/tweet" +#define crypto_stream_PRIMITIVE "xsalsa20" +#define crypto_stream crypto_stream_xsalsa20 +#define crypto_stream_xor crypto_stream_xsalsa20_xor +#define crypto_stream_KEYBYTES crypto_stream_xsalsa20_KEYBYTES +#define crypto_stream_NONCEBYTES crypto_stream_xsalsa20_NONCEBYTES +#define crypto_stream_IMPLEMENTATION crypto_stream_xsalsa20_IMPLEMENTATION +#define crypto_stream_VERSION crypto_stream_xsalsa20_VERSION +#define crypto_stream_xsalsa20_tweet_KEYBYTES 32 +#define crypto_stream_xsalsa20_tweet_NONCEBYTES 24 +extern int crypto_stream_xsalsa20_tweet(unsigned char *,unsigned long long,const unsigned char *,const unsigned char *); +extern int crypto_stream_xsalsa20_tweet_xor(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *); +#define crypto_stream_xsalsa20_tweet_VERSION "-" +#define crypto_stream_xsalsa20 crypto_stream_xsalsa20_tweet +#define crypto_stream_xsalsa20_xor crypto_stream_xsalsa20_tweet_xor +#define crypto_stream_xsalsa20_KEYBYTES crypto_stream_xsalsa20_tweet_KEYBYTES +#define crypto_stream_xsalsa20_NONCEBYTES crypto_stream_xsalsa20_tweet_NONCEBYTES +#define crypto_stream_xsalsa20_VERSION crypto_stream_xsalsa20_tweet_VERSION +#define crypto_stream_xsalsa20_IMPLEMENTATION "crypto_stream/xsalsa20/tweet" +#define crypto_stream_salsa20_tweet_KEYBYTES 32 +#define crypto_stream_salsa20_tweet_NONCEBYTES 8 +extern int crypto_stream_salsa20_tweet(unsigned char *,unsigned long long,const unsigned char *,const unsigned char *); +extern int crypto_stream_salsa20_tweet_xor(unsigned char *,const unsigned char *,unsigned long long,const unsigned char *,const unsigned char *); +#define crypto_stream_salsa20_tweet_VERSION "-" +#define crypto_stream_salsa20 crypto_stream_salsa20_tweet +#define crypto_stream_salsa20_xor crypto_stream_salsa20_tweet_xor +#define crypto_stream_salsa20_KEYBYTES crypto_stream_salsa20_tweet_KEYBYTES +#define crypto_stream_salsa20_NONCEBYTES crypto_stream_salsa20_tweet_NONCEBYTES +#define crypto_stream_salsa20_VERSION crypto_stream_salsa20_tweet_VERSION +#define crypto_stream_salsa20_IMPLEMENTATION "crypto_stream/salsa20/tweet" +#define crypto_verify_PRIMITIVE "16" +#define crypto_verify crypto_verify_16 +#define crypto_verify_BYTES crypto_verify_16_BYTES +#define crypto_verify_IMPLEMENTATION crypto_verify_16_IMPLEMENTATION +#define crypto_verify_VERSION crypto_verify_16_VERSION +#define crypto_verify_16_tweet_BYTES 16 +extern int crypto_verify_16_tweet(const unsigned char *,const unsigned char *); +#define crypto_verify_16_tweet_VERSION "-" +#define crypto_verify_16 crypto_verify_16_tweet +#define crypto_verify_16_BYTES crypto_verify_16_tweet_BYTES +#define crypto_verify_16_VERSION crypto_verify_16_tweet_VERSION +#define crypto_verify_16_IMPLEMENTATION "crypto_verify/16/tweet" +#define crypto_verify_32_tweet_BYTES 32 +extern int crypto_verify_32_tweet(const unsigned char *,const unsigned char *); +#define crypto_verify_32_tweet_VERSION "-" +#define crypto_verify_32 crypto_verify_32_tweet +#define crypto_verify_32_BYTES crypto_verify_32_tweet_BYTES +#define crypto_verify_32_VERSION crypto_verify_32_tweet_VERSION +#define crypto_verify_32_IMPLEMENTATION "crypto_verify/32/tweet" +#endif diff --git a/src/cryptoconditions/src/internal.h b/src/cryptoconditions/src/internal.h new file mode 100644 index 00000000000..bd0e6376a22 --- /dev/null +++ b/src/cryptoconditions/src/internal.h @@ -0,0 +1,76 @@ +#include "include/cJSON.h" +#include "asn/asn_application.h" +#include "cryptoconditions.h" + +#ifndef INTERNAL_H +#define INTERNAL_H + + +#ifdef __cplusplus +extern "C" { +#endif + + +#define BUF_SIZE 1024 * 1024 + + +/* + * Condition Type */ +typedef struct CCType { + uint8_t typeId; + unsigned char name[100]; + Condition_PR asnType; + int hasSubtypes; + int (*visitChildren)(CC *cond, CCVisitor visitor); + unsigned char *(*fingerprint)(const CC *cond); + unsigned long (*getCost)(const CC *cond); + uint32_t (*getSubtypes)(const CC *cond); + CC *(*fromJSON)(const cJSON *params, unsigned char *err); + void (*toJSON)(const CC *cond, cJSON *params); + CC *(*fromFulfillment)(const Fulfillment_t *ffill); + Fulfillment_t *(*toFulfillment)(const CC *cond); + int (*isFulfilled)(const CC *cond); + void (*free)(struct CC *cond); +} CCType; + + +/* + * Globals + */ +static struct CCType *typeRegistry[]; +static int typeRegistryLength; + + +/* + * Internal API + */ +static uint32_t fromAsnSubtypes(ConditionTypes_t types); +static CC *mkAnon(const Condition_t *asnCond); +static void asnCondition(const CC *cond, Condition_t *asn); +static Condition_t *asnConditionNew(const CC *cond); +static Fulfillment_t *asnFulfillmentNew(const CC *cond); +static uint32_t getSubtypes(CC *cond); +static cJSON *jsonEncodeCondition(cJSON *params, unsigned char *err); +static struct CC *fulfillmentToCC(Fulfillment_t *ffill); +static struct CCType *getTypeByAsnEnum(Condition_PR present); + + +/* + * Utility functions + */ +unsigned char *base64_encode(const unsigned char *data, size_t input_length); +unsigned char *base64_decode(const unsigned char *data_, size_t *output_length); +unsigned char *hashFingerprintContents(asn_TYPE_descriptor_t *asnType, void *fp); +void dumpStr(unsigned char *str, size_t len); +int checkString(const cJSON *value, unsigned char *key, unsigned char *err); +int checkDecodeBase64(const cJSON *value, unsigned char *key, unsigned char *err, unsigned char **data, size_t *size); +int jsonGetBase64(const cJSON *params, unsigned char *key, unsigned char *err, unsigned char **data, size_t *size); +int jsonGetBase64Optional(const cJSON *params, unsigned char *key, unsigned char *err, unsigned char **data, size_t *size); +void jsonAddBase64(cJSON *params, unsigned char *key, unsigned char *bin, size_t size); + + +#ifdef __cplusplus +} +#endif + +#endif /* INTERNAL_H */ diff --git a/src/cryptoconditions/src/json_rpc.c b/src/cryptoconditions/src/json_rpc.c new file mode 100644 index 00000000000..8fcf47fdb37 --- /dev/null +++ b/src/cryptoconditions/src/json_rpc.c @@ -0,0 +1,332 @@ +#include "cryptoconditions.h" +#include "internal.h" +#include +#include + + +static cJSON *jsonCondition(CC *cond) { + unsigned char buf[1000]; + size_t conditionBinLength = cc_conditionBinary(cond, buf); + + cJSON *root = cJSON_CreateObject(); + unsigned char *uri = cc_conditionUri(cond); + cJSON_AddItemToObject(root, "uri", cJSON_CreateString(uri)); + free(uri); + + unsigned char *b64 = base64_encode(buf, conditionBinLength); + cJSON_AddItemToObject(root, "bin", cJSON_CreateString(b64)); + free(b64); + + return root; +} + + +static cJSON *jsonFulfillment(CC *cond) { + unsigned char buf[1000000]; + size_t fulfillmentBinLength = cc_fulfillmentBinary(cond, buf, 1000000); + + cJSON *root = cJSON_CreateObject(); + unsigned char *b64 = base64_encode(buf, fulfillmentBinLength); + cJSON_AddItemToObject(root, "fulfillment", cJSON_CreateString(b64)); + free(b64); + + return root; +} + + +CC *cc_conditionFromJSON(cJSON *params, unsigned char *err) { + if (!params || !cJSON_IsObject(params)) { + strcpy(err, "Condition params must be an object"); + return NULL; + } + cJSON *typeName = cJSON_GetObjectItem(params, "type"); + if (!typeName || !cJSON_IsString(typeName)) { + strcpy(err, "\"type\" must be a string"); + return NULL; + } + for (int i=0; ivaluestring, typeRegistry[i]->name)) { + return typeRegistry[i]->fromJSON(params, err); + } + } + } + strcpy(err, "cannot detect type of condition"); + return NULL; +} + + +CC *cc_conditionFromJSONString(const unsigned char *data, unsigned char *err) { + cJSON *params = cJSON_Parse(data); + CC *out = cc_conditionFromJSON(params, err); + cJSON_Delete(params); + return out; +} + + +static cJSON *jsonEncodeCondition(cJSON *params, unsigned char *err) { + CC *cond = cc_conditionFromJSON(params, err); + cJSON *out = NULL; + if (cond != NULL) { + out = jsonCondition(cond); + cc_free(cond); + } + return out; +} + + +static cJSON *jsonEncodeFulfillment(cJSON *params, unsigned char *err) { + CC *cond = cc_conditionFromJSON(params, err); + cJSON *out = NULL; + if (cond != NULL) { + out = jsonFulfillment(cond); + cc_free(cond); + } + return out; +} + + +static cJSON *jsonErr(unsigned char *err) { + cJSON *out = cJSON_CreateObject(); + cJSON_AddItemToObject(out, "error", cJSON_CreateString(err)); + return out; +} + + +static cJSON *jsonVerifyFulfillment(cJSON *params, unsigned char *err) { + unsigned char *ffill_bin = 0, *msg = 0, *cond_bin = 0; + size_t ffill_bin_len, msg_len, cond_bin_len; + cJSON *out = 0; + + if (!(jsonGetBase64(params, "fulfillment", err, &ffill_bin, &ffill_bin_len) && + jsonGetBase64(params, "message", err, &msg, &msg_len) && + jsonGetBase64(params, "condition", err, &cond_bin, &cond_bin_len))) + goto END; + + CC *cond = cc_readFulfillmentBinary(ffill_bin, ffill_bin_len); + + if (!cond) { + strcpy(err, "Invalid fulfillment payload"); + goto END; + } + + int valid = cc_verify(cond, msg, msg_len, 1, cond_bin, cond_bin_len, &jsonVerifyEval, NULL); + cc_free(cond); + out = cJSON_CreateObject(); + cJSON_AddItemToObject(out, "valid", cJSON_CreateBool(valid)); + +END: + free(ffill_bin); free(msg); free(cond_bin); + return out; +} + + +static cJSON *jsonDecodeFulfillment(cJSON *params, unsigned char *err) { + size_t ffill_bin_len; + unsigned char *ffill_bin; + if (!jsonGetBase64(params, "fulfillment", err, &ffill_bin, &ffill_bin_len)) + return NULL; + + CC *cond = cc_readFulfillmentBinary(ffill_bin, ffill_bin_len); + free(ffill_bin); + if (!cond) { + strcpy(err, "Invalid fulfillment payload"); + return NULL; + } + cJSON *out = jsonCondition(cond); + cc_free(cond); + return out; +} + + +static cJSON *jsonDecodeCondition(cJSON *params, unsigned char *err) { + size_t cond_bin_len; + unsigned char *cond_bin; + if (!jsonGetBase64(params, "bin", err, &cond_bin, &cond_bin_len)) + return NULL; + + CC *cond = cc_readConditionBinary(cond_bin, cond_bin_len); + free(cond_bin); + + if (!cond) { + strcpy(err, "Invalid condition payload"); + return NULL; + } + + cJSON *out = jsonCondition(cond); + cJSON_AddItemToObject(out, "condition", cc_conditionToJSON(cond)); + cc_free(cond); + return out; +} + + +static cJSON *jsonSignTreeEd25519(cJSON *params, unsigned char *err) { + cJSON *out = 0; + unsigned char *msg = 0, *sk = 0; + + cJSON *condition_item = cJSON_GetObjectItem(params, "condition"); + CC *cond = cc_conditionFromJSON(condition_item, err); + if (cond == NULL) { + goto END; + } + + size_t skLength; + if (!jsonGetBase64(params, "privateKey", err, &sk, &skLength)) { + goto END; + } + + if (skLength != 32) { + strcpy(err, "privateKey wrong length"); + } + + size_t msgLength; + if (!jsonGetBase64(params, "message", err, &msg, &msgLength)) { + goto END; + } + + int nSigned = cc_signTreeEd25519(cond, sk, msg, msgLength); + out = cJSON_CreateObject(); + cJSON_AddItemToObject(out, "num_signed", cJSON_CreateNumber(nSigned)); + cJSON_AddItemToObject(out, "condition", cc_conditionToJSON(cond)); + +END: + cc_free(cond); + free(msg); + free(sk); + return out; +} + + +static cJSON *jsonSignTreeSecp256k1(cJSON *params, unsigned char *err) { + cJSON *out = 0; + unsigned char *msg = 0, *sk = 0; + + cJSON *condition_item = cJSON_GetObjectItem(params, "condition"); + CC *cond = cc_conditionFromJSON(condition_item, err); + if (cond == NULL) { + goto END; + } + + size_t skLength; + if (!jsonGetBase64(params, "privateKey", err, &sk, &skLength)) { + goto END; + } + + if (skLength != SECP256K1_SK_SIZE) { + strcpy(err, "privateKey wrong length"); + } + + size_t msgLength; + if (!jsonGetBase64(params, "message", err, &msg, &msgLength)) { + goto END; + } + + char msgHash[32]; + sha256(msg, msgLength, msgHash); + int nSigned = cc_signTreeSecp256k1Msg32(cond, sk, msgHash); + out = cJSON_CreateObject(); + cJSON_AddItemToObject(out, "num_signed", cJSON_CreateNumber(nSigned)); + cJSON_AddItemToObject(out, "condition", cc_conditionToJSON(cond)); + +END: + cc_free(cond); + free(msg); + free(sk); + return out; +} + + +cJSON *cc_conditionToJSON(const CC *cond) { + cJSON *params = cJSON_CreateObject(); + cJSON_AddItemToObject(params, "type", cJSON_CreateString(cond->type->name)); + cond->type->toJSON(cond, params); + return params; +} + + +unsigned char *cc_conditionToJSONString(const CC *cond) { + assert(cond != NULL); + cJSON *params = cc_conditionToJSON(cond); + unsigned char *out = cJSON_Print(params); + cJSON_Delete(params); + return out; +} + + +static cJSON *jsonListMethods(cJSON *params, unsigned char *err); + + +typedef struct JsonMethod { + unsigned char *name; + cJSON* (*method)(cJSON *params, unsigned char *err); + unsigned char *description; +} JsonMethod; + + +static JsonMethod cc_jsonMethods[] = { + {"encodeCondition", &jsonEncodeCondition, "Encode a JSON condition to binary"}, + {"decodeCondition", &jsonDecodeCondition, "Decode a binary condition"}, + {"encodeFulfillment", &jsonEncodeFulfillment, "Encode a JSON condition to a fulfillment"}, + {"decodeFulfillment", &jsonDecodeFulfillment, "Decode a binary fulfillment"}, + {"verifyFulfillment", &jsonVerifyFulfillment, "Verify a fulfillment"}, + {"signTreeEd25519", &jsonSignTreeEd25519, "Sign ed25519 condition nodes"}, + {"signTreeSecp256k1", &jsonSignTreeSecp256k1, "Sign secp256k1 condition nodes"}, + {"listMethods", &jsonListMethods, "List available methods"} +}; + + +static int nJsonMethods = sizeof(cc_jsonMethods) / sizeof(*cc_jsonMethods); + + +static cJSON *jsonListMethods(cJSON *params, unsigned char *err) { + cJSON *list = cJSON_CreateArray(); + for (int i=0; ivaluestring)) { + return method.method(params, err); + } + } + + return jsonErr("invalid method"); +} + + +unsigned char *cc_jsonRPC(unsigned char* input) { + unsigned char err[1000] = "\0"; + cJSON *out; + cJSON *root = cJSON_Parse(input); + if (!root) out = jsonErr("Error parsing JSON request"); + else { + out = execJsonRPC(root, err); + if (NULL == out) out = jsonErr(err); + } + unsigned char *res = cJSON_Print(out); + cJSON_Delete(out); + cJSON_Delete(root); + return res; +} diff --git a/src/cryptoconditions/src/prefix.c b/src/cryptoconditions/src/prefix.c new file mode 100644 index 00000000000..8fdd0a48389 --- /dev/null +++ b/src/cryptoconditions/src/prefix.c @@ -0,0 +1,126 @@ + +#include "asn/Condition.h" +#include "asn/Fulfillment.h" +#include "asn/PrefixFingerprintContents.h" +#include "asn/OCTET_STRING.h" +#include "include/cJSON.h" +#include "cryptoconditions.h" + + +struct CCType cc_prefixType; + + +static int prefixVisitChildren(CC *cond, CCVisitor visitor) { + size_t prefixedLength = cond->prefixLength + visitor.msgLength; + unsigned char *prefixed = malloc(prefixedLength); + memcpy(prefixed, cond->prefix, cond->prefixLength); + memcpy(prefixed + cond->prefixLength, visitor.msg, visitor.msgLength); + visitor.msg = prefixed; + visitor.msgLength = prefixedLength; + int res = cc_visit(cond->subcondition, visitor); + free(prefixed); + return res; +} + + +static unsigned char *prefixFingerprint(const CC *cond) { + PrefixFingerprintContents_t *fp = calloc(1, sizeof(PrefixFingerprintContents_t)); + asnCondition(cond->subcondition, &fp->subcondition); // TODO: check asnCondition for safety + fp->maxMessageLength = cond->maxMessageLength; + OCTET_STRING_fromBuf(&fp->prefix, cond->prefix, cond->prefixLength); + return hashFingerprintContents(&asn_DEF_PrefixFingerprintContents, fp); +} + + +static unsigned long prefixCost(const CC *cond) { + return 1024 + cond->prefixLength + cond->maxMessageLength + + cond->subcondition->type->getCost(cond->subcondition); +} + + +static CC *prefixFromFulfillment(const Fulfillment_t *ffill) { + PrefixFulfillment_t *p = ffill->choice.prefixSha256; + CC *sub = fulfillmentToCC(p->subfulfillment); + if (!sub) return 0; + CC *cond = calloc(1, sizeof(CC)); + cond->type = &cc_prefixType; + cond->maxMessageLength = p->maxMessageLength; + cond->prefix = calloc(1, p->prefix.size); + memcpy(cond->prefix, p->prefix.buf, p->prefix.size); + cond->prefixLength = p->prefix.size; + cond->subcondition = sub; + return cond; +} + + +static Fulfillment_t *prefixToFulfillment(const CC *cond) { + Fulfillment_t *ffill = asnFulfillmentNew(cond->subcondition); + if (!ffill) { + return NULL; + } + PrefixFulfillment_t *pf = calloc(1, sizeof(PrefixFulfillment_t)); + OCTET_STRING_fromBuf(&pf->prefix, cond->prefix, cond->prefixLength); + pf->maxMessageLength = cond->maxMessageLength; + pf->subfulfillment = ffill; + + ffill = calloc(1, sizeof(Fulfillment_t)); + ffill->present = Fulfillment_PR_prefixSha256; + ffill->choice.prefixSha256 = pf; + return ffill; +} + + +static uint32_t prefixSubtypes(const CC *cond) { + return getSubtypes(cond->subcondition) & ~(1 << cc_prefixType.typeId); +} + + +static CC *prefixFromJSON(const cJSON *params, unsigned char *err) { + cJSON *mml_item = cJSON_GetObjectItem(params, "maxMessageLength"); + if (!cJSON_IsNumber(mml_item)) { + strcpy(err, "maxMessageLength must be a number"); + return NULL; + } + + cJSON *subcond_item = cJSON_GetObjectItem(params, "subfulfillment"); + CC *sub = cc_conditionFromJSON(subcond_item, err); + if (!sub) { + return NULL; + } + + CC *cond = calloc(1, sizeof(CC)); + cond->type = &cc_prefixType; + cond->maxMessageLength = (unsigned long) mml_item->valuedouble; + cond->subcondition = sub; + + if (!jsonGetBase64(params, "prefix", err, &cond->prefix, &cond->prefixLength)) { + cc_free(cond); + return NULL; + } + + return cond; +} + + +static void prefixToJSON(const CC *cond, cJSON *params) { + cJSON_AddNumberToObject(params, "maxMessageLength", (double)cond->maxMessageLength); + unsigned char *b64 = base64_encode(cond->prefix, cond->prefixLength); + cJSON_AddStringToObject(params, "prefix", b64); + free(b64); + cJSON_AddItemToObject(params, "subfulfillment", cc_conditionToJSON(cond->subcondition)); +} + + +int prefixIsFulfilled(const CC *cond) { + return cc_isFulfilled(cond->subcondition); +} + + +static void prefixFree(CC *cond) { + free(cond->prefix); + cc_free(cond->subcondition); + free(cond); +} + + +struct CCType cc_prefixType = { 1, "prefix-sha-256", Condition_PR_prefixSha256, 1, &prefixVisitChildren, &prefixFingerprint, &prefixCost, &prefixSubtypes, &prefixFromJSON, &prefixToJSON, &prefixFromFulfillment, &prefixToFulfillment, &prefixIsFulfilled, &prefixFree }; diff --git a/src/cryptoconditions/src/preimage.c b/src/cryptoconditions/src/preimage.c new file mode 100644 index 00000000000..71d3b2e8960 --- /dev/null +++ b/src/cryptoconditions/src/preimage.c @@ -0,0 +1,83 @@ + +#include "asn/Condition.h" +#include "asn/Fulfillment.h" +#include "asn/OCTET_STRING.h" +#include "include/cJSON.h" +#include "include/sha256.h" +#include "cryptoconditions.h" + + +struct CCType cc_preimageType; + + +static CC *preimageFromJSON(const cJSON *params, unsigned char *err) { + cJSON *preimage_item = cJSON_GetObjectItem(params, "preimage"); + if (!cJSON_IsString(preimage_item)) { + strcpy(err, "preimage must be a string"); + return NULL; + } + unsigned char *preimage_b64 = preimage_item->valuestring; + + CC *cond = calloc(1, sizeof(CC)); + cond->type = &cc_preimageType; + cond->preimage = base64_decode(preimage_b64, &cond->preimageLength); + return cond; +} + + +static void preimageToJSON(const CC *cond, cJSON *params) { + unsigned char *encoded = base64_encode(cond->preimage, cond->preimageLength); + cJSON_AddStringToObject(params, "preimage", encoded); + free(encoded); +} + + +static unsigned long preimageCost(const CC *cond) { + return (unsigned long) cond->preimageLength; +} + + +static unsigned char *preimageFingerprint(const CC *cond) { + unsigned char *hash = calloc(1, 32); + sha256(cond->preimage, cond->preimageLength, hash); + return hash; +} + + +static CC *preimageFromFulfillment(const Fulfillment_t *ffill) { + CC *cond = calloc(1, sizeof(CC)); + cond->type = &cc_preimageType; + PreimageFulfillment_t p = ffill->choice.preimageSha256; + cond->preimage = calloc(1, p.preimage.size); + memcpy(cond->preimage, p.preimage.buf, p.preimage.size); + cond->preimageLength = p.preimage.size; + return cond; +} + + +static Fulfillment_t *preimageToFulfillment(const CC *cond) { + Fulfillment_t *ffill = calloc(1, sizeof(Fulfillment_t)); + ffill->present = Fulfillment_PR_preimageSha256; + PreimageFulfillment_t *pf = &ffill->choice.preimageSha256; + OCTET_STRING_fromBuf(&pf->preimage, cond->preimage, cond->preimageLength); + return ffill; +} + + +int preimageIsFulfilled(const CC *cond) { + return 1; +} + + +static void preimageFree(CC *cond) { + free(cond->preimage); + free(cond); +} + + +static uint32_t preimageSubtypes(const CC *cond) { + return 0; +} + + +struct CCType cc_preimageType = { 0, "preimage-sha-256", Condition_PR_preimageSha256, 0, 0, &preimageFingerprint, &preimageCost, &preimageSubtypes, &preimageFromJSON, &preimageToJSON, &preimageFromFulfillment, &preimageToFulfillment, &preimageIsFulfilled, &preimageFree }; diff --git a/src/cryptoconditions/src/secp256k1.c b/src/cryptoconditions/src/secp256k1.c new file mode 100644 index 00000000000..507c9c84fb6 --- /dev/null +++ b/src/cryptoconditions/src/secp256k1.c @@ -0,0 +1,253 @@ +#define _GNU_SOURCE 1 + +#include +#include +#include + +#include "asn/Condition.h" +#include "asn/Fulfillment.h" +#include "asn/Secp256k1Fulfillment.h" +#include "asn/Secp256k1FingerprintContents.h" +#include "asn/OCTET_STRING.h" +#include "include/cJSON.h" +#include "include/secp256k1/include/secp256k1.h" +#include "cryptoconditions.h" +#include "internal.h" + + +struct CCType cc_secp256k1Type; + + +static const size_t SECP256K1_PK_SIZE = 33; +static const size_t SECP256K1_SK_SIZE = 32; +static const size_t SECP256K1_SIG_SIZE = 64; + + +secp256k1_context_t *ec_ctx_sign = 0, *ec_ctx_verify = 0; +pthread_mutex_t cc_secp256k1ContextLock = PTHREAD_MUTEX_INITIALIZER; + + +void lockSign() { + pthread_mutex_lock(&cc_secp256k1ContextLock); + if (!ec_ctx_sign) { + ec_ctx_sign = secp256k1_context_create(SECP256K1_CONTEXT_SIGN); + } + unsigned char ent[32]; +#ifdef SYS_getrandom + int read = syscall(SYS_getrandom, ent, 32, 0); +#else + FILE *fp = fopen("/dev/urandom", "r"); + int read = (int) fread(&ent, 1, 32, fp); + fclose(fp); +#endif + if (read != 32) { + fprintf(stderr, "Could not read 32 bytes entropy from system\n"); + exit(1); + } + if (!secp256k1_context_randomize(ec_ctx_sign, ent)) { + fprintf(stderr, "Could not randomize secp256k1 context\n"); + exit(1); + } +} + + +void unlockSign() { + pthread_mutex_unlock(&cc_secp256k1ContextLock); +} + + +void initVerify() { + if (!ec_ctx_verify) { + pthread_mutex_lock(&cc_secp256k1ContextLock); + if (!ec_ctx_verify) + ec_ctx_verify = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY); + pthread_mutex_unlock(&cc_secp256k1ContextLock); + } +} + + +static unsigned char *secp256k1Fingerprint(const CC *cond) { + Secp256k1FingerprintContents_t *fp = calloc(1, sizeof(Secp256k1FingerprintContents_t)); + OCTET_STRING_fromBuf(&fp->publicKey, cond->publicKey, SECP256K1_PK_SIZE); + return hashFingerprintContents(&asn_DEF_Secp256k1FingerprintContents, fp); +} + + +int secp256k1Verify(CC *cond, CCVisitor visitor) { + if (cond->type->typeId != cc_secp256k1Type.typeId) return 1; + // TODO: test failure mode: empty sig / null pointer + initVerify(); + int rc = secp256k1_ecdsa_verify(ec_ctx_verify, visitor.msg, cond->signature, SECP256K1_SIG_SIZE, + cond->publicKey, SECP256K1_PK_SIZE); + return rc == 1; +} + + +static int cc_secp256k1VerifyTreeMsg32(const CC *cond, const unsigned char *msg32) { + int subtypes = getSubtypes(cond); + if (subtypes & (1 << cc_prefixType.typeId) && + subtypes & (1 << cc_secp256k1Type.typeId)) { + // No support for prefix currently, due to pending protocol decision on + // how to combine message and prefix into 32 byte hash + return 0; + } + CCVisitor visitor = {&secp256k1Verify, msg32, 0, NULL}; + int out = cc_visit(cond, visitor); + return out; +} + + +/* + * Signing data + */ +typedef struct CCSecp256k1SigningData { + const unsigned char *pk; + const unsigned char *sk; + int nSigned; +} CCSecp256k1SigningData; + + +/* + * Visitor that signs an secp256k1 condition if it has a matching public key + */ +static int secp256k1Sign(CC *cond, CCVisitor visitor) { + if (cond->type->typeId != cc_secp256k1Type.typeId) return 1; + CCSecp256k1SigningData *signing = (CCSecp256k1SigningData*) visitor.context; + if (0 != memcmp(cond->publicKey, signing->pk, SECP256K1_PK_SIZE)) return 1; + if (!cond->signature) cond->signature = calloc(1, SECP256K1_SIG_SIZE); + lockSign(); + int rc = secp256k1_ecdsa_sign_compact(ec_ctx_sign, visitor.msg, cond->signature, signing->sk, NULL, NULL, NULL); + unlockSign(); + if (rc) { + signing->nSigned++; + return 1; + } + return 0; +} + + +/* + * Sign secp256k1 conditions in a tree + */ +int cc_signTreeSecp256k1Msg32(CC *cond, const unsigned char *privateKey, const unsigned char *msg32) { + if (getSubtypes(cond) & (1 << cc_preimageType.typeId)) { + // No support for prefix currently, due to pending protocol decision on + // how to combine message and prefix into 32 byte hash + return 0; + } + unsigned char *publicKey = calloc(1, SECP256K1_PK_SIZE); + CCSecp256k1SigningData signing = {publicKey, privateKey, 0}; + CCVisitor visitor = {&secp256k1Sign, msg32, 32, &signing}; + int ol = 0; + lockSign(); + int rc = secp256k1_ec_pubkey_create(ec_ctx_sign, publicKey, &ol, privateKey, 1); + unlockSign(); + if (rc) cc_visit(cond, visitor); + free(publicKey); + return signing.nSigned; +} + + +static unsigned long secp256k1Cost(const CC *cond) { + return 131072; +} + + +static CC *cc_secp256k1Condition(const unsigned char *publicKey, const unsigned char *signature) { + unsigned char *pk = 0, *sig = 0; + + + initVerify(); + int rc = secp256k1_ec_pubkey_verify(ec_ctx_verify, publicKey, SECP256K1_PK_SIZE); + if (!rc) { + return NULL; + } + + pk = calloc(1, SECP256K1_PK_SIZE); + memcpy(pk, publicKey, SECP256K1_PK_SIZE); + if (signature) { + sig = calloc(1, SECP256K1_SIG_SIZE); + memcpy(sig, signature, SECP256K1_SIG_SIZE); + } + + CC *cond = calloc(1, sizeof(CC)); + cond->type = &cc_secp256k1Type; + cond->publicKey = pk; + cond->signature = sig; + return cond; +} + + +static CC *secp256k1FromJSON(const cJSON *params, unsigned char *err) { + CC *cond = 0; + unsigned char *pk = 0, *sig = 0; + size_t pkSize, sigSize; + + if (!jsonGetBase64(params, "publicKey", err, &pk, &pkSize)) goto END; + + if (!jsonGetBase64Optional(params, "signature", err, &sig, &sigSize)) goto END; + if (sig && SECP256K1_SIG_SIZE != sigSize) { + strcpy(err, "signature has incorrect length"); + goto END; + } + + cond = cc_secp256k1Condition(pk, sig); + if (!cond) { + strcpy(err, "invalid public key"); + } +END: + free(pk); + free(sig); + return cond; +} + + +static void secp256k1ToJSON(const CC *cond, cJSON *params) { + jsonAddBase64(params, "publicKey", cond->publicKey, SECP256K1_PK_SIZE); + if (cond->signature) { + jsonAddBase64(params, "signature", cond->signature, SECP256K1_SIG_SIZE); + } +} + + +static CC *secp256k1FromFulfillment(const Fulfillment_t *ffill) { + return cc_secp256k1Condition(ffill->choice.secp256k1Sha256.publicKey.buf, + ffill->choice.secp256k1Sha256.signature.buf); +} + + +static Fulfillment_t *secp256k1ToFulfillment(const CC *cond) { + if (!cond->signature) { + return NULL; + } + + Fulfillment_t *ffill = calloc(1, sizeof(Fulfillment_t)); + ffill->present = Fulfillment_PR_secp256k1Sha256; + Secp256k1Fulfillment_t *sec = &ffill->choice.secp256k1Sha256; + + OCTET_STRING_fromBuf(&sec->publicKey, cond->publicKey, SECP256K1_PK_SIZE); + OCTET_STRING_fromBuf(&sec->signature, cond->signature, SECP256K1_SIG_SIZE); + return ffill; +} + + +int secp256k1IsFulfilled(const CC *cond) { + return cond->signature > 0; +} + + +static void secp256k1Free(CC *cond) { + free(cond->publicKey); + if (cond->signature) { + free(cond->signature); + } + free(cond); +} + + +static uint32_t secp256k1Subtypes(const CC *cond) { + return 0; +} + + +struct CCType cc_secp256k1Type = { 5, "secp256k1-sha-256", Condition_PR_secp256k1Sha256, 0, 0, &secp256k1Fingerprint, &secp256k1Cost, &secp256k1Subtypes, &secp256k1FromJSON, &secp256k1ToJSON, &secp256k1FromFulfillment, &secp256k1ToFulfillment, &secp256k1IsFulfilled, &secp256k1Free }; diff --git a/src/cryptoconditions/src/stamp-h1 b/src/cryptoconditions/src/stamp-h1 new file mode 100644 index 00000000000..8f14c586ab4 --- /dev/null +++ b/src/cryptoconditions/src/stamp-h1 @@ -0,0 +1 @@ +timestamp for src/cryptoconditions-config.h diff --git a/src/cryptoconditions/src/threshold.c b/src/cryptoconditions/src/threshold.c new file mode 100644 index 00000000000..68f4c557dc2 --- /dev/null +++ b/src/cryptoconditions/src/threshold.c @@ -0,0 +1,206 @@ + +#include "asn/Condition.h" +#include "asn/Fulfillment.h" +#include "asn/ThresholdFingerprintContents.h" +#include "asn/OCTET_STRING.h" +#include "include/cJSON.h" +#include "cryptoconditions.h" +#include "internal.h" + + +struct CCType cc_thresholdType; + + +static uint32_t thresholdSubtypes(const CC *cond) { + uint32_t mask = 0; + for (int i=0; isize; i++) { + mask |= getSubtypes(cond->subconditions[i]); + } + mask &= ~(1 << cc_thresholdType.typeId); + return mask; +} + + +static int cmpCostDesc(const void *a, const void *b) { + return (int) ( *(unsigned long*)b - *(unsigned long*)a ); +} + + +static unsigned long thresholdCost(const CC *cond) { + CC *sub; + unsigned long *costs = calloc(1, cond->size * sizeof(unsigned long)); + for (int i=0; isize; i++) { + sub = cond->subconditions[i]; + costs[i] = cc_getCost(sub); + } + qsort(costs, cond->size, sizeof(unsigned long), cmpCostDesc); + unsigned long cost = 0; + for (int i=0; ithreshold; i++) { + cost += costs[i]; + } + free(costs); + return cost + 1024 * cond->size; +} + + +static int thresholdVisitChildren(CC *cond, CCVisitor visitor) { + for (int i=0; ithreshold; i++) { + if (!cc_visit(cond->subconditions[i], visitor)) { + return 0; + } + } + return 1; +} + + +static int cmpConditions(const void *a, const void *b) { + /* Compare conditions by their ASN binary representation */ + unsigned char bufa[BUF_SIZE], bufb[BUF_SIZE]; + asn_enc_rval_t r0 = der_encode_to_buffer(&asn_DEF_Condition, *(Condition_t**)a, bufa, BUF_SIZE); + asn_enc_rval_t r1 = der_encode_to_buffer(&asn_DEF_Condition, *(Condition_t**)b, bufb, BUF_SIZE); + int diff = r0.encoded - r1.encoded; + return diff != 0 ? diff : strcmp(bufa, bufb); +} + + +static unsigned char *thresholdFingerprint(const CC *cond) { + /* Create fingerprint */ + ThresholdFingerprintContents_t *fp = calloc(1, sizeof(ThresholdFingerprintContents_t)); + fp->threshold = cond->threshold; + for (int i=0; isize; i++) { + asn_set_add(&fp->subconditions2, asnConditionNew(cond->subconditions[i])); + } + qsort(fp->subconditions2.list.array, cond->size, sizeof(Condition_t*), cmpConditions); + return hashFingerprintContents(&asn_DEF_ThresholdFingerprintContents, fp); +} + + +static CC *thresholdFromFulfillment(const Fulfillment_t *ffill) { + ThresholdFulfillment_t *t = ffill->choice.thresholdSha256; + int threshold = t->subfulfillments.list.count; + int size = threshold + t->subconditions.list.count; + + CC **subconditions = calloc(size, sizeof(CC*)); + + for (int i=0; isubfulfillments.list.array[i]) : + mkAnon(t->subconditions.list.array[i-threshold]); + + if (!subconditions[i]) { + for (int j=0; jtype = &cc_thresholdType; + cond->threshold = threshold; + cond->size = size; + cond->subconditions = subconditions; + return cond; +} + + +static int cmpByCostDesc(const void *c1, const void *c2) { + return cc_getCost(*((CC**)c1)) - cc_getCost(*((CC**)c2)); +} + + +static Fulfillment_t *thresholdToFulfillment(const CC *cond) { + CC *sub; + Fulfillment_t *fulfillment; + + qsort(cond->subconditions, cond->size, sizeof(CC*), cmpByCostDesc); + + ThresholdFulfillment_t *tf = calloc(1, sizeof(ThresholdFulfillment_t)); + + int needed = cond->threshold; + + for (int i=0; isize; i++) { + sub = cond->subconditions[i]; + if (needed && (fulfillment = asnFulfillmentNew(sub))) { + asn_set_add(&tf->subfulfillments, fulfillment); + needed--; + } else { + asn_set_add(&tf->subconditions, asnConditionNew(cond->subconditions[i])); + } + } + + if (needed) { + ASN_STRUCT_FREE(asn_DEF_ThresholdFulfillment, tf); + return NULL; + } + + fulfillment = calloc(1, sizeof(Fulfillment_t)); + fulfillment->present = Fulfillment_PR_thresholdSha256; + fulfillment->choice.thresholdSha256 = tf; + return fulfillment; +} + + +static CC *thresholdFromJSON(const cJSON *params, unsigned char *err) { + cJSON *threshold_item = cJSON_GetObjectItem(params, "threshold"); + if (!cJSON_IsNumber(threshold_item)) { + strcpy(err, "threshold must be a number"); + return NULL; + } + + cJSON *subfulfillments_item = cJSON_GetObjectItem(params, "subfulfillments"); + if (!cJSON_IsArray(subfulfillments_item)) { + strcpy(err, "subfulfullments must be an array"); + return NULL; + } + + CC *cond = calloc(1, sizeof(CC)); + cond->type = &cc_thresholdType; + cond->threshold = (long) threshold_item->valuedouble; + cond->size = cJSON_GetArraySize(subfulfillments_item); + cond->subconditions = calloc(cond->size, sizeof(CC*)); + + cJSON *sub; + for (int i=0; isize; i++) { + sub = cJSON_GetArrayItem(subfulfillments_item, i); + cond->subconditions[i] = cc_conditionFromJSON(sub, err); + if (err[0]) return NULL; + } + + return cond; +} + + +static void thresholdToJSON(const CC *cond, cJSON *params) { + cJSON *subs = cJSON_CreateArray(); + cJSON_AddNumberToObject(params, "threshold", cond->threshold); + for (int i=0; isize; i++) { + cJSON_AddItemToArray(subs, cc_conditionToJSON(cond->subconditions[i])); + } + cJSON_AddItemToObject(params, "subfulfillments", subs); +} + + +static int thresholdIsFulfilled(const CC *cond) { + int nFulfilled = 0; + for (int i=0; ithreshold; i++) { + if (!cc_isFulfilled(cond->subconditions[i])) { + nFulfilled++; + } + if (nFulfilled == cond->threshold) { + return 1; + } + } + return 0; +} + + +static void thresholdFree(CC *cond) { + for (int i=0; isize; i++) { + cc_free(cond->subconditions[i]); + } + free(cond->subconditions); + free(cond); +} + + +struct CCType cc_thresholdType = { 2, "threshold-sha-256", Condition_PR_thresholdSha256, 1, &thresholdVisitChildren, &thresholdFingerprint, &thresholdCost, &thresholdSubtypes, &thresholdFromJSON, &thresholdToJSON, &thresholdFromFulfillment, &thresholdToFulfillment, &thresholdIsFulfilled, &thresholdFree }; diff --git a/src/cryptoconditions/src/utils.c b/src/cryptoconditions/src/utils.c new file mode 100644 index 00000000000..d1e63629ffb --- /dev/null +++ b/src/cryptoconditions/src/utils.c @@ -0,0 +1,208 @@ +#include +#include +#include +#include +#include + +#include "include/cJSON.h" +#include "include/sha256.h" +#include "asn/asn_application.h" +#include "cryptoconditions.h" +#include "internal.h" + + +static unsigned char encoding_table[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', + 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', + 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', + 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', + 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', + 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', + 'w', 'x', 'y', 'z', '0', '1', '2', '3', + '4', '5', '6', '7', '8', '9', '+', '/'}; +static unsigned char *decoding_table = NULL; +static int mod_table[] = {0, 2, 1}; + + +void build_decoding_table() { + decoding_table = malloc(256); + for (int i = 0; i < 64; i++) + decoding_table[(unsigned char) encoding_table[i]] = i; +} + + +unsigned char *base64_encode(const unsigned char *data, size_t input_length) { + + size_t output_length = 4 * ((input_length + 2) / 3); + + unsigned char *encoded_data = malloc(output_length + 1); + if (encoded_data == NULL) return NULL; + + for (int i = 0, j = 0; i < input_length;) { + + uint32_t octet_a = i < input_length ? (unsigned char)data[i++] : 0; + uint32_t octet_b = i < input_length ? (unsigned char)data[i++] : 0; + uint32_t octet_c = i < input_length ? (unsigned char)data[i++] : 0; + + uint32_t triple = (octet_a << 0x10) + (octet_b << 0x08) + octet_c; + + encoded_data[j++] = encoding_table[(triple >> 3 * 6) & 0x3F]; + encoded_data[j++] = encoding_table[(triple >> 2 * 6) & 0x3F]; + encoded_data[j++] = encoding_table[(triple >> 1 * 6) & 0x3F]; + encoded_data[j++] = encoding_table[(triple >> 0 * 6) & 0x3F]; + } + + int strip = mod_table[input_length % 3]; + for (int i = 0; i < strip; i++) + encoded_data[output_length - 1 - i] = '\0'; + // make sure there's a null termination for string protocol + encoded_data[output_length] = '\0'; + + + // url safe + for (int i=0; i> 2 * 8) & 0xFF; + if (j < *output_length) decoded_data[j++] = (triple >> 1 * 8) & 0xFF; + if (j < *output_length) decoded_data[j++] = (triple >> 0 * 8) & 0xFF; + } + + return decoded_data; +} + + +void base64_cleanup() { + free(decoding_table); +} + + +void dumpStr(unsigned char *str, size_t len) { + if (-1 == len) len = strlen(str); + fprintf(stderr, "len:%i ", (int)len); + for (int i=0; ivaluestring, size); + if (!*data) { + sprintf(err, "%s must be valid base64 string", key); + return 0; + } + return 1; +} + + +int jsonGetBase64(const cJSON *params, unsigned char *key, unsigned char *err, unsigned char **data, size_t *size) +{ + cJSON *item = cJSON_GetObjectItem(params, key); + if (!item) { + sprintf(err, "%s is required", key); + return 0; + } + return checkDecodeBase64(item, key, err, data, size); +} + + +int jsonGetBase64Optional(const cJSON *params, unsigned char *key, unsigned char *err, unsigned char **data, size_t *size) { + cJSON *item = cJSON_GetObjectItem(params, key); + if (!item) { + return 1; + } + return checkDecodeBase64(item, key, err, data, size); +} + +void jsonAddBase64(cJSON *params, unsigned char *key, unsigned char *bin, size_t size) { + unsigned char *b64 = base64_encode(bin, size); + cJSON_AddItemToObject(params, key, cJSON_CreateString(b64)); + free(b64); +} + + +unsigned char *hashFingerprintContents(asn_TYPE_descriptor_t *asnType, void *fp) { + unsigned char buf[BUF_SIZE]; + asn_enc_rval_t rc = der_encode_to_buffer(asnType, fp, buf, BUF_SIZE); + ASN_STRUCT_FREE(*asnType, fp); + if (rc.encoded < 1) { + printf("Encoding fingerprint failed\n"); + return 0; + } + unsigned char *hash = malloc(32); + sha256(buf, rc.encoded, hash); + return hash; +} diff --git a/src/cryptoconditions/test-requirements.txt b/src/cryptoconditions/test-requirements.txt new file mode 100644 index 00000000000..2858c9ae399 --- /dev/null +++ b/src/cryptoconditions/test-requirements.txt @@ -0,0 +1,3 @@ +nose +base58==0.2.5 +secp256k1 diff --git a/src/cryptoconditions/tests/__init__.py b/src/cryptoconditions/tests/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/cryptoconditions/tests/custom-vectors/1000_test-minimal-eval.json b/src/cryptoconditions/tests/custom-vectors/1000_test-minimal-eval.json new file mode 100644 index 00000000000..14ab8ca49cc --- /dev/null +++ b/src/cryptoconditions/tests/custom-vectors/1000_test-minimal-eval.json @@ -0,0 +1,14 @@ +{ + "json": { + "type": "eval-sha-256", + "method": "testEval", + "params": "dGVzdEV2YWw" + }, + "cost": 131072, + "subtypes": [], + "fingerprintContents": "", + "fulfillment": "AF148008746573744576616C8108746573744576616C", + "conditionBinary": "AF27802062CC11575F91E1611379B5A0B53678805FC03858544FC28E72BB66A14629C08F8103100000", + "conditionUri": "ni:///sha-256;YswRV1-R4WETebWgtTZ4gF_AOFhUT8KOcrtmoUYpwI8?fpt=eval-sha-256&cost=1048576", + "message": "" +} diff --git a/src/cryptoconditions/tests/custom-vectors/1001_test-minimal-secp256k1.json b/src/cryptoconditions/tests/custom-vectors/1001_test-minimal-secp256k1.json new file mode 100644 index 00000000000..d34de80fa48 --- /dev/null +++ b/src/cryptoconditions/tests/custom-vectors/1001_test-minimal-secp256k1.json @@ -0,0 +1,14 @@ +{ + "json": { + "type": "secp256k1-sha-256", + "publicKey": "AtXZaTBVNawpp3B5wR1PDdQGYc-W4E6XSl6NfjdO4iWq", + "signature": "nC1v8580C7r2XohL3_rnQ2p7dWiDnFuhF_poGCRfudo83sfP1NPfcZG9siY4_Ybz2aO4yyV_z5tU0JMcTQGV0w" + }, + "cost": 131072, + "subtypes": [], + "fingerprintContents": "", + "fulfillment": "A565802102D5D969305535AC29A77079C11D4F0DD40661CF96E04E974A5E8D7E374EE225AA81409C2D6FF39F340BBAF65E884BDFFAE7436A7B7568839C5BA117FA6818245FB9DA3CDEC7CFD4D3DF7191BDB22638FD86F3D9A3B8CB257FCF9B54D0931C4D0195D3", + "conditionBinary": "A52780209C2850F5147E9903DD317C650AC1D6E80E695280789887F2E3179E5C65C9DF3A8103020000", + "conditionUri": "ni:///sha-256;nChQ9RR-mQPdMXxlCsHW6A5pUoB4mIfy4xeeXGXJ3zo?fpt=secp256k1-sha-256&cost=131072", + "message": "" +} diff --git a/src/cryptoconditions/tests/test_ed25519.py b/src/cryptoconditions/tests/test_ed25519.py new file mode 100644 index 00000000000..081a7efd510 --- /dev/null +++ b/src/cryptoconditions/tests/test_ed25519.py @@ -0,0 +1,73 @@ +import json +import base64 +from test_vectors import jsonRPC + + +def test_sign_ed25519_pass_simple(): + res = jsonRPC('signTreeEd25519', { + 'condition': { + 'type': 'ed25519-sha-256', + 'publicKey': "E0x0Ws4GhWhO_zBoUyaLbuqCz6hDdq11Ft1Dgbe9y9k", + }, + 'privateKey': '11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo', + 'message': '', + }) + + assert res == { + "num_signed": 1, + "condition": { + "type": "ed25519-sha-256", + "publicKey": "E0x0Ws4GhWhO_zBoUyaLbuqCz6hDdq11Ft1Dgbe9y9k", + "signature": "jcuovSRpHwqiC781KzSM1Jd0Qtyfge0cMGttUdLOVdjJlSBFLTtgpinASOaJpd-VGjhSGWkp1hPWuMAAZq6pAg" + } + } + + +def test_sign_ed25519_pass_prefix(): + res = jsonRPC('signTreeEd25519', { + 'condition': { + 'type': 'prefix-sha-256', + 'prefix': 'YmJi', + 'maxMessageLength': 3, + 'subfulfillment': { + 'type': 'ed25519-sha-256', + 'publicKey': "E0x0Ws4GhWhO_zBoUyaLbuqCz6hDdq11Ft1Dgbe9y9k", + } + }, + 'privateKey': '11qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo', + 'message': '', + }) + + assert res == { + "num_signed": 1, + 'condition': { + 'type': 'prefix-sha-256', + 'prefix': 'YmJi', + 'maxMessageLength': 3, + 'subfulfillment': { + 'type': 'ed25519-sha-256', + 'publicKey': "E0x0Ws4GhWhO_zBoUyaLbuqCz6hDdq11Ft1Dgbe9y9k", + 'signature': '4Y6keUFEl4KgIum9e3MBdlhlp32FRas-1N1vhtdy5q3JEPdqMvmXo2Rb99fC6j_3vflh8_QtOEW5rj4utjMOBg', + } + }, + } + + +def test_sign_ed25519_fail(): + # privateKey doesnt match publicKey + res = jsonRPC('signTreeEd25519', { + 'condition': { + 'type': 'ed25519-sha-256', + 'publicKey': "E0x0Ws4GhWhO_zBoUyaLbuqCz6hDdq11Ft1Dgbe9y9k", + }, + 'privateKey': '22qYAYKxCrfVS_7TyWQHOg7hcvPapiMlrwIaaPcHURo', + 'message': '', + }) + + assert res == { + "num_signed": 0, + "condition": { + "type": "ed25519-sha-256", + "publicKey": "E0x0Ws4GhWhO_zBoUyaLbuqCz6hDdq11Ft1Dgbe9y9k", + } + } diff --git a/src/cryptoconditions/tests/test_failure_modes.py b/src/cryptoconditions/tests/test_failure_modes.py new file mode 100644 index 00000000000..b95c8527e1a --- /dev/null +++ b/src/cryptoconditions/tests/test_failure_modes.py @@ -0,0 +1,63 @@ +import json +import ctypes +import base64 +from test_vectors import jsonRPC, so, decode_base64 as d64 + + +''' +These tests are aimed at edge cases of serverside deployment. + +As such, the main functions to test are decoding and verifying fulfillment payloads. +''' + + +cc_rfb = lambda f: so.cc_readFulfillmentBinary(f, len(f)) +cc_rcb = lambda f: so.cc_readConditionBinary(f, len(f)) + +unhex = lambda s: base64.b16decode(s.upper()) + + +def test_decode_valid_fulfillment(): + f = unhex('a42480206ee12ed43d7dce6fc0b2be20e6808380baafc03d400404bbf95165d7527b373a8100') + assert cc_rfb(f) + + +def test_decode_invalid_fulfillment(): + # This fulfillment payload has an invalid type ID but is otherwise valid + invalid_type_id = unhex('bf632480206ee12ed43d7dce6fc0b2be20e6808380baafc03d400404bbf95165d7527b373a8100') + assert cc_rfb(invalid_type_id) == 0 + assert cc_rfb('\0') == 0 + assert cc_rfb('') == 0 + + +def test_large_fulfillment(): + # This payload is valid and very large + f = unhex("a1839896b28083989680") + 10000000 * b'e' + \ + unhex("81030186a0a226a42480206ee12ed43d7dce6fc0b2be20e68083" + "80baafc03d400404bbf95165d7527b373a8100") + cond = cc_rfb(f) + buflen = len(f) + 1000 # Wiggle room + buf = ctypes.create_string_buffer(buflen) + assert so.cc_fulfillmentBinary(cond, buf, buflen) + so.cc_free(cond) + + +def test_decode_valid_condition(): + # Valid preimage + assert cc_rcb(d64('oCWAIMqXgRLKG73K-sIxs5oj3E2nhu_4FHxOcrmAd4Wv7ki7gQEB')) + + # Somewhat bogus condition (prefix with no subtypes) but nonetheless valid structure + assert cc_rcb(unhex("a10a8001618101ff82020700")) + + +def test_decode_invalid_condition(): + assert 0 == cc_rcb("") + assert 0 == cc_rcb("\0") + + # Bogus type ID + assert 0 == cc_rcb(unhex('bf630c80016181030186a082020700')) + + +def test_validate_empty_sigs(): + #// TODO: test failure mode: empty sig / null pointer + pass diff --git a/src/cryptoconditions/tests/test_secp256k1.py b/src/cryptoconditions/tests/test_secp256k1.py new file mode 100644 index 00000000000..db36da21886 --- /dev/null +++ b/src/cryptoconditions/tests/test_secp256k1.py @@ -0,0 +1,62 @@ +import json +import base64 +import hashlib +import secp256k1 +from test_vectors import jsonRPC, encode_base64, decode_base64 + + +key = secp256k1.PrivateKey() + + +def test_sign_secp256k1_pass_simple(): + pubkey = encode_base64(key.pubkey.serialize()) + msg = '' + res = jsonRPC('signTreeSecp256k1', { + 'condition': { + 'type': 'secp256k1-sha-256', + 'publicKey': pubkey, + }, + 'privateKey': encode_base64(key.private_key), + 'message': msg, + }) + + sig = encode_base64(key.ecdsa_serialize_compact(key.ecdsa_sign(msg))) + + assert res == { + "num_signed": 1, + "condition": { + "type": "secp256k1-sha-256", + "publicKey": pubkey, + "signature": sig + } + } + cond_bin = jsonRPC('encodeCondition', res['condition'])['bin'] + ffill_bin = jsonRPC('encodeFulfillment', res['condition'])['fulfillment'] + assert jsonRPC('verifyFulfillment', { + 'fulfillment': ffill_bin, + 'message': msg, + 'condition': cond_bin + }) == {'valid': True} + + + +def test_sign_secp256k1_fail(): + # privateKey doesnt match publicKey + pubkey = encode_base64(key.pubkey.serialize()) + msg = '' + res = jsonRPC('signTreeSecp256k1', { + 'condition': { + 'type': 'secp256k1-sha-256', + 'publicKey': pubkey, + }, + 'privateKey': encode_base64('0' * 32), + 'message': msg, + }) + + assert res == { + "num_signed": 0, + "condition": { + "type": "secp256k1-sha-256", + "publicKey": pubkey, + } + } diff --git a/src/cryptoconditions/tests/test_vectors.py b/src/cryptoconditions/tests/test_vectors.py new file mode 100644 index 00000000000..b94ed946139 --- /dev/null +++ b/src/cryptoconditions/tests/test_vectors.py @@ -0,0 +1,149 @@ +import json +import ctypes +import base64 +import pytest +import os.path +from ctypes import * + + +v0000 = '0000_test-minimal-preimage' +v0001 = '0001_test-minimal-prefix' +v0002 = '0002_test-minimal-threshold' +v0003 = '0003_test-minimal-rsa' +v0004 = '0004_test-minimal-ed25519' +v0005 = '0005_test-basic-preimage' +v0006 = '0006_test-basic-prefix' +v0007 = '0007_test-basic-prefix-two-levels-deep' +v0010 = '0010_test-basic-threshold-same-fulfillment-twice' +v0015 = '0015_test-basic-ed25519' +v0016 = '0016_test-advanced-notarized-receipt' +v0017 = '0017_test-advanced-notarized-receipt-multiple-notaries' + +# These contain RSA conditions which are not implemented yet +#v0008 = '0008_test-basic-threshold' +#v0009 = '0009_test-basic-threshold-same-condition-twice' +#v0011 = '0011_test-basic-threshold-two-levels-deep' +#v0012 = '0012_test-basic-threshold-schroedinger' +#v0013 = '0013_test-basic-rsa' +#v0014 = '0014_test-basic-rsa4096' + +# Custom test vectors +v1000 = '1000_test-minimal-eval' +v1001 = '1001_test-minimal-secp256k1' + + +all_vectors = {v0000, v0001, v0002, v0004, v0005, v0006, v0007, v0010, + v0015, v0016, v0017, v1000, v1001} + + +@pytest.mark.parametrize('vectors_file', all_vectors) +def test_encodeCondition(vectors_file): + vectors = _read_vectors(vectors_file) + response = jsonRPC('encodeCondition', vectors['json']) + assert response == { + 'uri': vectors['conditionUri'], + 'bin': vectors['conditionBinary'], + } + + +@pytest.mark.parametrize('vectors_file', all_vectors) +def test_encodeFulfillment(vectors_file): + vectors = _read_vectors(vectors_file) + response = jsonRPC('encodeFulfillment', vectors['json']) + assert response == { + 'fulfillment': vectors['fulfillment'], + } + + +@pytest.mark.parametrize('vectors_file', all_vectors) +def test_verifyFulfillment(vectors_file): + vectors = _read_vectors(vectors_file) + req = { + 'fulfillment': vectors['fulfillment'], + 'message': vectors['message'], + 'condition': vectors['conditionBinary'], + } + assert jsonRPC('verifyFulfillment', req) == {'valid': True} + + +@pytest.mark.parametrize('vectors_file', all_vectors) +def test_decodeFulfillment(vectors_file): + vectors = _read_vectors(vectors_file) + response = jsonRPC('decodeFulfillment', { + 'fulfillment': vectors['fulfillment'], + }) + assert response == { + 'uri': vectors['conditionUri'], + 'bin': vectors['conditionBinary'], + } + + +@pytest.mark.parametrize('vectors_file', all_vectors) +def test_decodeCondition(vectors_file): + vectors = _read_vectors(vectors_file) + response = jsonRPC('decodeCondition', { + 'bin': vectors['conditionBinary'], + }) + assert response['uri'] == vectors['conditionUri'] + + +@pytest.mark.parametrize('vectors_file', all_vectors) +def test_json_condition_json_parse(vectors_file): + vectors = _read_vectors(vectors_file) + err = ctypes.create_string_buffer(100) + cc = so.cc_conditionFromJSONString(json.dumps(vectors['json']).encode(), err) + out_ptr = so.cc_conditionToJSONString(cc) + out = ctypes.cast(out_ptr, c_char_p).value.decode() + assert json.loads(out) == vectors['json'] + + +def b16_to_b64(b16): + return base64.urlsafe_b64encode(base64.b16decode(b16)).rstrip('=') + + +def decode_base64(data): + """Decode base64, padding being optional. + + :param data: Base64 data as an ASCII byte string + :returns: The decoded byte string. + """ + missing_padding = len(data) % 4 + if missing_padding: + data += '=' * (4 - missing_padding) + return base64.urlsafe_b64decode(data) + + +def encode_base64(data): + return base64.urlsafe_b64encode(data).rstrip(b'=') + + +def b16_to_b64(b16): + return encode_base64(base64.b16decode(b16)).decode() + + +def _read_vectors(name): + paths = ['ext/crypto-conditions/test-vectors/valid/%s.json', + 'tests/custom-vectors/%s.json'] + for fmt in paths: + path = fmt % name + if os.path.isfile(path): + vectors = json.load(open(path)) + break + else: + raise IOError("Vectors file not found: %s.json" % name) + for key in ['conditionBinary', 'fulfillment', 'message']: + vectors[key] = b16_to_b64(vectors[key]) + return vectors + + +so = cdll.LoadLibrary('.libs/libcryptoconditions.so') +so.cc_jsonRPC.restype = c_char_p + + +def jsonRPC(method, params): + req = json.dumps({ + 'method': method, + 'params': params, + }) + out = so.cc_jsonRPC(req.encode()) + return json.loads(out.decode()) From 91fe980a98e198564a3af89686c4ed50d0538230 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Mon, 12 Mar 2018 18:22:38 -0300 Subject: [PATCH 0047/1081] fix cryptoconditions qa --- qa/cryptoconditions/test_integration.py | 94 ------------------------- qa/cryptoconditions/testsupport.py | 4 +- 2 files changed, 2 insertions(+), 96 deletions(-) diff --git a/qa/cryptoconditions/test_integration.py b/qa/cryptoconditions/test_integration.py index 1f6746b696d..16b5f93a691 100644 --- a/qa/cryptoconditions/test_integration.py +++ b/qa/cryptoconditions/test_integration.py @@ -91,45 +91,6 @@ def test_oversize_fulfillment(inp): assert 'scriptsig-size' in str(e), str(e) -@fanout_input(6) -def test_eval_basic(inp): - eval_cond = { - 'type': 'eval-sha-256', - 'method': 'testEval', - 'params': encode_base64('testEval') - } - - # Setup some eval outputs - spend0 = { - 'inputs': [inp], - 'outputs': [ - {'amount': 500, 'script': {'condition': eval_cond}}, - {'amount': 500, 'script': {'condition': eval_cond}} - ] - } - spend0_txid = submit(sign(spend0)) - assert rpc.getrawtransaction(spend0_txid) - - # Test a good fulfillment - spend1 = { - 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {'fulfillment': eval_cond}}], - 'outputs': [{'amount': 500, 'script': {'condition': eval_cond}}] - } - spend1_txid = submit(sign(spend1)) - assert rpc.getrawtransaction(spend1_txid) - - # Test a bad fulfillment - eval_cond['params'] = '' - spend2 = { - 'inputs': [{'txid': spend0_txid, 'idx': 1, 'script': {'fulfillment': eval_cond}}], - 'outputs': [{'amount': 500, 'script': {'condition': eval_cond}}] - } - try: - assert not submit(sign(spend2)), 'should raise an error' - except RPCError as e: - assert SCRIPT_FALSE in str(e), str(e) - - @fanout_input(7) def test_secp256k1_condition(inp): ec_cond = { @@ -169,61 +130,6 @@ def test_secp256k1_condition(inp): except RPCError as e: assert SCRIPT_FALSE in str(e), str(e) - -@fanout_input(20) -def test_eval_replacement(inp): - eval_cond = { - 'type': 'eval-sha-256', - 'method': 'testReplace', - 'params': '', - } - - # Setup replaceable output - spend0 = { - 'inputs': [inp], - 'outputs': [ - {'amount': 1000, 'script': {'condition': eval_cond}}, - ] - } - spend0_txid = submit(sign(spend0)) - assert rpc.getrawtransaction(spend0_txid) - - b64_1 = 'AQ==' - spend1 = { - 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {'fulfillment': eval_cond}}], - 'outputs': [{'amount': 1000, 'script': {'op_return': b64_1}}] - } - - b64_2 = 'Ag==' - spend2 = { - 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {'fulfillment': eval_cond}}], - 'outputs': [{'amount': 1000, 'script': {'op_return': b64_2}}] - } - - # If spend2 is already registered, return true, as this test has already been performed - spend2_txid = hoek.encodeTx(sign(spend2))['txid'] - try: - rpc.getrawtransaction(spend2_txid) - return - except RPCError: - pass - - # Send replaceable - spend1_txid = submit(sign(spend1)) - assert rpc.getrawtransaction(spend1_txid) - - - # Send replacement (higher OP_RETURN data) - spend2_txid = submit(sign(spend2)) - assert rpc.getrawtransaction(spend2_txid) - - # Now the first transaction has gone - try: - assert not rpc.getrawtransaction(spend1_txid), "should raise an error" - except RPCError as e: - assert 'No information available about transaction' in str(e), str(e) - - if __name__ == '__main__': logging.basicConfig(level=logging.INFO) for name, f in globals().items(): diff --git a/qa/cryptoconditions/testsupport.py b/qa/cryptoconditions/testsupport.py index a127379f616..055f4cc30b3 100644 --- a/qa/cryptoconditions/testsupport.py +++ b/qa/cryptoconditions/testsupport.py @@ -32,7 +32,7 @@ def load_response(self, data): def run_cmd(cmd): proc = subprocess.Popen(cmd, stdout=subprocess.PIPE) - assert proc.wait() == 0 + assert proc.wait() == 0, cmd return proc.stdout.read() @@ -68,7 +68,7 @@ def wait_for_block(height): try: return rpc.getblock(str(height)) except RPCError as e: - time.sleep(3) + time.sleep(1) raise Exception('Time out waiting for block at height %s' % height) From aaff5dd10cdb03f31afe291d48f063bab969de31 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Sat, 17 Mar 2018 15:13:10 -0300 Subject: [PATCH 0048/1081] explicitly disable replacementpool if cryptoconditions is not enabled --- src/main.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main.cpp b/src/main.cpp index 62fa0c726d4..fa366964f66 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1116,6 +1116,11 @@ CAmount GetMinRelayFee(const CTransaction& tx, unsigned int nBytes, bool fAllowF */ bool AcceptToReplacementPool(const CTransaction &tx, CValidationState &state) { + // This is not actually required; if crypto-conditions is disabled, then transactions + // with replaceable outputs will not be accepted as standard. However, just to be a + // bit more explicit. + if (!IsCryptoConditionsEnabled()) return false; + CTxReplacementPoolItem item(tx, GetHeight()); if (!SetReplacementParams(item)) return false; From 49cd4daab29186139ef18b35340cd3552f36144f Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Sat, 17 Mar 2018 23:09:14 -0300 Subject: [PATCH 0049/1081] cryptoconditions secp256k1 tests canonical signature --- .../src/include/secp256k1/include/secp256k1.h | 12 ++++++++++++ .../src/include/secp256k1/src/secp256k1.c | 8 ++++++++ src/cryptoconditions/src/secp256k1.c | 7 ++++++- src/cryptoconditions/tests/test_failure_modes.py | 15 +++++++++++++++ 4 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/cryptoconditions/src/include/secp256k1/include/secp256k1.h b/src/cryptoconditions/src/include/secp256k1/include/secp256k1.h index 06afd4c65bc..9db5cf3a860 100644 --- a/src/cryptoconditions/src/include/secp256k1/include/secp256k1.h +++ b/src/cryptoconditions/src/include/secp256k1/include/secp256k1.h @@ -95,6 +95,18 @@ SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_verify( int pubkeylen ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(5); +/** Check that signature is in canonical form + * Returns: 1: In canonical form + * 0: Non canonical + * -1: invalid signature + * In: sig: the signature being verified (cannot be NULL) + * siglen: the length of the signature + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_check_canonical_sig( + const unsigned char *sig, + int siglen +) SECP256K1_ARG_NONNULL(1); + /** A pointer to a function to deterministically generate a nonce. * Returns: 1 if a nonce was successfully generated. 0 will cause signing to fail. * In: msg32: the 32-byte message hash being verified (will not be NULL) diff --git a/src/cryptoconditions/src/include/secp256k1/src/secp256k1.c b/src/cryptoconditions/src/include/secp256k1/src/secp256k1.c index d6192dc4ed6..48569ad9eba 100644 --- a/src/cryptoconditions/src/include/secp256k1/src/secp256k1.c +++ b/src/cryptoconditions/src/include/secp256k1/src/secp256k1.c @@ -85,6 +85,14 @@ int secp256k1_ecdsa_verify(const secp256k1_context_t* ctx, const unsigned char * return ret; } + +int secp256k1_ecdsa_check_canonical_sig(const unsigned char *sig, int siglen) { + secp256k1_ecdsa_sig_t s; + if (!secp256k1_ecdsa_sig_parse(&s, sig, siglen)) return -1; + return !secp256k1_scalar_is_high(&s.s); +} + + static int nonce_function_rfc6979(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, unsigned int counter, const void *data) { secp256k1_rfc6979_hmac_sha256_t rng; unsigned int i; diff --git a/src/cryptoconditions/src/secp256k1.c b/src/cryptoconditions/src/secp256k1.c index 507c9c84fb6..9e09cabe58e 100644 --- a/src/cryptoconditions/src/secp256k1.c +++ b/src/cryptoconditions/src/secp256k1.c @@ -77,7 +77,12 @@ int secp256k1Verify(CC *cond, CCVisitor visitor) { if (cond->type->typeId != cc_secp256k1Type.typeId) return 1; // TODO: test failure mode: empty sig / null pointer initVerify(); - int rc = secp256k1_ecdsa_verify(ec_ctx_verify, visitor.msg, cond->signature, SECP256K1_SIG_SIZE, + + // Test for non canonical S + int rc = secp256k1_ecdsa_check_canonical_sig(cond->signature, SECP256K1_SIG_SIZE); + if (rc == 1) + // Test for correct sig + rc = secp256k1_ecdsa_verify(ec_ctx_verify, visitor.msg, cond->signature, SECP256K1_SIG_SIZE, cond->publicKey, SECP256K1_PK_SIZE); return rc == 1; } diff --git a/src/cryptoconditions/tests/test_failure_modes.py b/src/cryptoconditions/tests/test_failure_modes.py index b95c8527e1a..4e252424f72 100644 --- a/src/cryptoconditions/tests/test_failure_modes.py +++ b/src/cryptoconditions/tests/test_failure_modes.py @@ -61,3 +61,18 @@ def test_decode_invalid_condition(): def test_validate_empty_sigs(): #// TODO: test failure mode: empty sig / null pointer pass + + +def test_non_canonical_secp256k1(): + cond = { + "type": "secp256k1-sha-256", + "publicKey": "AtXZaTBVNawpp3B5wR1PDdQGYc-W4E6XSl6NfjdO4iWq", + # Signature is correct, but non canonical; validation should fail + "signature": "nC1v8580C7r2XohL3_rnQ2p7dWiDnFuhF_poGCRfudrDITgwKywgjm5CTdnHAnkK4QskG4nI0KBrActwgzSrbg" + } + res = jsonRPC('verifyFulfillment', { + 'fulfillment': jsonRPC('encodeFulfillment', cond)['fulfillment'], + 'condition': jsonRPC('encodeCondition', cond)['bin'], + 'message': '' + }) + assert res['valid'] == False From 51aad1873397455645fcd188b2ae406fa44c9646 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Mon, 26 Mar 2018 16:21:33 -0300 Subject: [PATCH 0050/1081] remove replacementpool --- qa/cryptoconditions/test_integration.py | 86 +++- qa/cryptoconditions/testsupport.py | 10 +- src/Makefile.am | 9 +- src/Makefile.ktest.include | 16 - src/cryptoconditions/Makefile.am | 16 +- .../include/cryptoconditions.h | 1 + src/komodo_cryptoconditions.cpp | 79 +--- src/komodo_cryptoconditions.h | 7 +- src/main.cpp | 206 +++----- src/main.h | 2 +- src/replacementpool.cpp | 88 ---- src/replacementpool.h | 76 --- src/secp256k1/include/secp256k1.h | 12 + src/secp256k1/src/secp256k1.c | 8 + src/test-komodo/main.cpp | 9 - src/test-komodo/test_replacementpool.cpp | 440 ------------------ 16 files changed, 190 insertions(+), 875 deletions(-) delete mode 100644 src/Makefile.ktest.include delete mode 100644 src/replacementpool.cpp delete mode 100644 src/replacementpool.h delete mode 100644 src/test-komodo/main.cpp delete mode 100644 src/test-komodo/test_replacementpool.cpp diff --git a/qa/cryptoconditions/test_integration.py b/qa/cryptoconditions/test_integration.py index 16b5f93a691..bd72b961d0f 100644 --- a/qa/cryptoconditions/test_integration.py +++ b/qa/cryptoconditions/test_integration.py @@ -4,7 +4,6 @@ import logging import binascii import struct -import base64 from testsupport import * @@ -91,7 +90,91 @@ def test_oversize_fulfillment(inp): assert 'scriptsig-size' in str(e), str(e) +@fanout_input(6) +def test_aux_basic(inp): + aux_cond = { + 'type': 'aux-sha-256', + 'method': 'equals', + 'conditionAux': 'LTE', + 'fulfillmentAux': 'LTE' + } + + # Setup some aux outputs + spend0 = { + 'inputs': [inp], + 'outputs': [ + {'amount': 500, 'script': {'condition': aux_cond}}, + {'amount': 500, 'script': {'condition': aux_cond}} + ] + } + spend0_txid = submit(sign(spend0)) + assert rpc.getrawtransaction(spend0_txid) + + # Test a good fulfillment + spend1 = { + 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {'fulfillment': aux_cond}}], + 'outputs': [{'amount': 500, 'script': {'condition': aux_cond}}] + } + spend1_txid = submit(sign(spend1)) + assert rpc.getrawtransaction(spend1_txid) + + # Test a bad fulfillment + aux_cond['fulfillmentAux'] = 'WYW' + spend2 = { + 'inputs': [{'txid': spend0_txid, 'idx': 1, 'script': {'fulfillment': aux_cond}}], + 'outputs': [{'amount': 500, 'script': {'condition': aux_cond}}] + } + try: + assert not submit(sign(spend2)), 'should raise an error' + except RPCError as e: + assert SCRIPT_FALSE in str(e), str(e) + + @fanout_input(7) +def test_aux_complex(inp): + aux_cond = { + 'type': 'aux-sha-256', + 'method': 'inputIsReturn', + 'conditionAux': '', + 'fulfillmentAux': 'AQ' # \1 (tx.vout[1]) + } + + # Setup some aux outputs + spend0 = { + 'inputs': [inp], + 'outputs': [ + {'amount': 500, 'script': {'condition': aux_cond}}, + {'amount': 500, 'script': {'condition': aux_cond}} + ] + } + spend0_txid = submit(sign(spend0)) + assert rpc.getrawtransaction(spend0_txid) + + # Test a good fulfillment + spend1 = { + 'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {'fulfillment': aux_cond}}], + 'outputs': [ + {'amount': 250, 'script': {'condition': aux_cond}}, + {'amount': 250, 'script': "6A0B68656C6C6F207468657265"} # OP_RETURN somedata + ] + } + spend1_txid = submit(sign(spend1)) + assert rpc.getrawtransaction(spend1_txid) + + # Test a bad fulfillment + spend2 = { + 'inputs': [{'txid': spend0_txid, 'idx': 1, 'script': {'fulfillment': aux_cond}}], + 'outputs': [ + {'amount': 500, 'script': "6A0B68656C6C6F207468657265"} # OP_RETURN somedata + ] + } + try: + assert not submit(sign(spend2)), 'should raise an error' + except RPCError as e: + assert SCRIPT_FALSE in str(e), str(e) + + +@fanout_input(8) def test_secp256k1_condition(inp): ec_cond = { 'type': 'secp256k1-sha-256', @@ -130,6 +213,7 @@ def test_secp256k1_condition(inp): except RPCError as e: assert SCRIPT_FALSE in str(e), str(e) + if __name__ == '__main__': logging.basicConfig(level=logging.INFO) for name, f in globals().items(): diff --git a/qa/cryptoconditions/testsupport.py b/qa/cryptoconditions/testsupport.py index 055f4cc30b3..e22520f3f51 100644 --- a/qa/cryptoconditions/testsupport.py +++ b/qa/cryptoconditions/testsupport.py @@ -32,7 +32,7 @@ def load_response(self, data): def run_cmd(cmd): proc = subprocess.Popen(cmd, stdout=subprocess.PIPE) - assert proc.wait() == 0, cmd + assert proc.wait() == 0 return proc.stdout.read() @@ -68,7 +68,7 @@ def wait_for_block(height): try: return rpc.getblock(str(height)) except RPCError as e: - time.sleep(1) + time.sleep(3) raise Exception('Time out waiting for block at height %s' % height) @@ -97,7 +97,7 @@ def get_fanout_txid(): reward_tx = hoek.decodeTx({'hex': reward_tx_raw}) balance = reward_tx['outputs'][0]['amount'] - n_outs = 40 + n_outs = 16 remainder = balance - n_outs * 1000 fanout = { @@ -109,9 +109,7 @@ def get_fanout_txid(): ] + [{"amount": remainder, 'script': {'address': notary_addr}}]) } - txid = submit(sign(fanout)) - rpc.getrawtransaction(txid) - return txid + return submit(sign(fanout)) def fanout_input(n): diff --git a/src/Makefile.am b/src/Makefile.am index 7c020062305..00242776fc3 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -39,7 +39,7 @@ LIBBITCOIN_CLI=libbitcoin_cli.a LIBBITCOIN_UTIL=libbitcoin_util.a LIBBITCOIN_CRYPTO=crypto/libbitcoin_crypto.a LIBSECP256K1=secp256k1/libsecp256k1.la -LIBCRYPTOCONDITIONS=cryptoconditions/libcryptoconditions.la +LIBCRYPTOCONDITIONS=cryptoconditions/cryptoconditions_core.a LIBUNIVALUE=univalue/libunivalue.la LIBZCASH=libzcash.a -lcurl @@ -156,7 +156,6 @@ BITCOIN_CORE_H = \ protocol.h \ pubkey.h \ random.h \ - replacementpool.h \ reverselock.h \ rpcclient.h \ rpcprotocol.h \ @@ -235,7 +234,6 @@ libbitcoin_server_a_SOURCES = \ noui.cpp \ policy/fees.cpp \ pow.cpp \ - replacementpool.cpp \ rest.cpp \ rpcblockchain.cpp \ rpcmining.cpp \ @@ -562,10 +560,9 @@ endif @test -f $(PROTOC) $(AM_V_GEN) $(PROTOC) --cpp_out=$(@D) --proto_path=$(abspath $( +#include #ifndef CRYPTOCONDITIONS_H diff --git a/src/komodo_cryptoconditions.cpp b/src/komodo_cryptoconditions.cpp index e2695af405d..4ebbebbeb55 100644 --- a/src/komodo_cryptoconditions.cpp +++ b/src/komodo_cryptoconditions.cpp @@ -1,94 +1,21 @@ - -#include "replacementpool.h" #include "komodo_cryptoconditions.h" #include "cryptoconditions/include/cryptoconditions.h" -bool ASSETCHAINS_CC_TEST = false; - - /* * Evaluate the validity of an Eval node */ bool EvalConditionValidity(const CC *cond, const CTransaction *txTo) { - if (ASSETCHAINS_CC_TEST) { - if (strcmp(cond->method, "testEval") == 0) { - return cond->paramsBinLength == 8 && - memcmp(cond->paramsBin, "testEval", 8) == 0; - } - if (strcmp(cond->method, "testReplace") == 0) { - std::vector data; - auto out = txTo->vout[txTo->vout.size()-1]; // Last output is data - return GetOpReturnData(out.scriptPubKey, data) && data.size() == 2; - } + if (strcmp(cond->method, "testEval") == 0) { + return cond->paramsBinLength == 8 && + memcmp(cond->paramsBin, "testEval", 8) == 0; } fprintf(stderr, "no defined behaviour for method: %s\n", cond->method); return 0; } -/* - * Evaluate the priority of an eval node. - * - * This method should set the ->priority and ->replacementWindow (in blocks) - * of the provided replacement pool item. Priority is a 64 bit unsigned int and - * 0 is invalid. - * - * This method does not need to validate, that is done separately. Actually, - * this method will nearly always be called with the same condition and transaction - * in sequence after EvalConditionValidity. If performance became an issue, a very - * small LRU cache could be used to cache a result. - */ -bool EvalConditionPriority(const CC *cond, CTxReplacementPoolItem *rep) -{ - if (ASSETCHAINS_CC_TEST) { - if (strcmp((const char*)cond->method, "testReplace") == 0) { - std::vector data; - auto out = rep->tx.vout[rep->tx.vout.size()-1]; // Last output is data - if (GetOpReturnData(out.scriptPubKey, data)) { - rep->replacementWindow = (int) data[0]; - rep->priority = (uint64_t) data[1]; - return true; - } - } - } - return false; -} - - -int visitConditionPriority(CC *cond, struct CCVisitor visitor) -{ - auto rep = (CTxReplacementPoolItem*)visitor.context; - // visitor protocol is 1 for continue, 0 for stop - return !(cc_typeId(cond) == CC_Eval && EvalConditionPriority(cond, rep)); -} - - -/* - * Try to get replacement parameters from a transaction in &rep. - */ -bool SetReplacementParams(CTxReplacementPoolItem &rep) -{ - // first, see if we have a cryptocondition - const CScript &sig = rep.tx.vin[0].scriptSig; - if (!sig.IsPushOnly()) return false; - CScript::const_iterator pc = sig.begin(); - std::vector data; - opcodetype opcode; - if (!sig.GetOp(pc, opcode, data)) return false; - CC *cond = cc_readFulfillmentBinary((unsigned char*)data.data(), data.size()); - if (!cond) return false; - - // now, see if it has a replacement node - CC *replacementNode = 0; - CCVisitor visitor = {&visitConditionPriority, (const unsigned char*)"", 0, &rep}; - bool out = cc_visit(cond, visitor); - cc_free(cond); - return !out; -} - - bool GetOpReturnData(const CScript &sig, std::vector &data) { auto pc = sig.begin(); diff --git a/src/komodo_cryptoconditions.h b/src/komodo_cryptoconditions.h index de12140ef6a..4edc2bedcca 100644 --- a/src/komodo_cryptoconditions.h +++ b/src/komodo_cryptoconditions.h @@ -1,24 +1,19 @@ #ifndef KOMODO_CRYPTOCONDITIONS_H #define KOMODO_CRYPTOCONDITIONS_H -#include "replacementpool.h" #include "cryptoconditions/include/cryptoconditions.h" +#include "primitives/transaction.h" #include "script/script.h" extern int32_t ASSETCHAINS_CC; -extern bool ASSETCHAINS_CC_TEST; static bool IsCryptoConditionsEnabled() { return 0 != ASSETCHAINS_CC; } -extern CTxReplacementPool replacementPool; - bool EvalConditionValidity(const CC *cond, const CTransaction *tx); -bool SetReplacementParams(CTxReplacementPoolItem &rep); - bool GetOpReturnData(const CScript &sig, std::vector &data); #endif /* KOMODO_CRYPTOCONDITIONS_H */ diff --git a/src/main.cpp b/src/main.cpp index fa366964f66..86b52495a31 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -21,8 +21,6 @@ #include "pow.h" #include "txdb.h" #include "txmempool.h" -#include "replacementpool.h" -#include "komodo_cryptoconditions.h" #include "ui_interface.h" #include "undo.h" #include "util.h" @@ -55,7 +53,6 @@ extern uint8_t NOTARY_PUBKEY33[33]; BlockMap mapBlockIndex; CChain chainActive; - CBlockIndex *pindexBestHeader = NULL; int64_t nTimeBestReceived = 0; CWaitableCriticalSection csBestBlock; @@ -1110,45 +1107,7 @@ CAmount GetMinRelayFee(const CTransaction& tx, unsigned int nBytes, bool fAllowF } -/* - * This should be called from AcceptToMemoryPool in order - * to perform all validations. - */ -bool AcceptToReplacementPool(const CTransaction &tx, CValidationState &state) -{ - // This is not actually required; if crypto-conditions is disabled, then transactions - // with replaceable outputs will not be accepted as standard. However, just to be a - // bit more explicit. - if (!IsCryptoConditionsEnabled()) return false; - - CTxReplacementPoolItem item(tx, GetHeight()); - if (!SetReplacementParams(item)) return false; - - switch (replacementPool.replace(item)) { - - case RP_Accept: - return true; - - case RP_HaveBetter: - // already have a better one - fprintf(stderr,"accept failure.20\n"); - return state.Invalid(error("AcceptToMemoryPool: Replacement is worse"), - REJECT_HAVEBETTER, "replacement-is-worse"); - - case RP_Invalid: - // Not valid according to replaceability rules - fprintf(stderr,"accept failure.22\n"); - return state.Invalid(error("AcceptToMemoryPool: Replacement has multiple inputs"), - REJECT_INVALID, "replacement-invalid"); - - default: - return false; - } -} - - - -bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree,bool* pfMissingInputs, bool fRejectAbsurdFee, bool fAcceptReplacement) +bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree,bool* pfMissingInputs, bool fRejectAbsurdFee) { AssertLockHeld(cs_main); if (pfMissingInputs) @@ -1372,20 +1331,14 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa return error("AcceptToMemoryPool: BUG! PLEASE REPORT THIS! ConnectInputs failed against MANDATORY but not STANDARD flags %s", hash.ToString()); } + // Store transaction in memory if ( komodo_is_notarytx(tx) == 0 ) KOMODO_ON_DEMAND++; - - if (fAcceptReplacement) - { - if (AcceptToReplacementPool(tx, state)) return true; - if (state.IsInvalid()) return false; - } - - // Store transaction in memory pool.addUnchecked(hash, entry, !IsInitialBlockDownload()); } SyncWithWallets(tx, NULL); + return true; } @@ -1401,12 +1354,6 @@ bool GetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock return true; } - // replacementPool lookup is O(n) since there's no index by txid - if (fAllowSlow && replacementPool.lookup(hash, txOut)) - { - return true; - } - if (fTxIndex) { CDiskTxPos postx; if (pblocktree->ReadTxIndex(hash, postx)) { @@ -1456,21 +1403,6 @@ bool GetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock return false; } - -void ProcessOrphanTransactions(uint256 initialHash); - -void ProcessReplacementPool(int newHeight) -{ - std::vector pending; - replacementPool.removePending(newHeight, pending); - CValidationState stateDummy; - BOOST_FOREACH(CTransaction tx, pending) { - if (AcceptToMemoryPool(mempool, stateDummy, tx, false, NULL, false, false)) - ProcessOrphanTransactions(tx.GetHash()); - // otherwise silently drop. TODO: log - } -} - /*char *komodo_getspendscript(uint256 hash,int32_t n) { CTransaction tx; uint256 hashBlock; @@ -2000,7 +1932,7 @@ bool ContextualCheckInputs(const CTransaction& tx, CValidationState &state, cons // as to the correct behavior - we may want to continue // peering with non-upgraded nodes even after a soft-fork // super-majority vote has passed. - return state.DoS(100, false, REJECT_INVALID, strprintf("mandatory-script-verify-flag-failed (%s)", ScriptErrorString(check.GetScriptError()))); + return state.DoS(100,false, REJECT_INVALID, strprintf("mandatory-script-verify-flag-failed (%s)", ScriptErrorString(check.GetScriptError()))); } } } @@ -2770,13 +2702,6 @@ bool static DisconnectTip(CValidationState &state) { // Update cached incremental witnesses //fprintf(stderr,"chaintip false\n"); GetMainSignals().ChainTip(pindexDelete, &block, newTree, false); - - /* if chain tip disconnects, some transactions may return to the replacementPool - * via AcceptToMemoryPool. - * - * No double send conflicts may result as the winning transaction will be picked. - */ - return true; } @@ -2836,8 +2761,6 @@ bool static ConnectTip(CValidationState &state, CBlockIndex *pindexNew, CBlock * mempool.check(pcoinsTip); // Update chainActive & related variables. UpdateTip(pindexNew); - // Process pending replacements - ProcessReplacementPool(pindexNew->nHeight); // Tell wallet about transactions that went from mempool // to conflicted: BOOST_FOREACH(const CTransaction &tx, txConflicted) { @@ -2847,7 +2770,6 @@ bool static ConnectTip(CValidationState &state, CBlockIndex *pindexNew, CBlock * BOOST_FOREACH(const CTransaction &tx, pblock->vtx) { SyncWithWallets(tx, pblock); } - // Update cached incremental witnesses //fprintf(stderr,"chaintip true\n"); GetMainSignals().ChainTip(pindexNew, pblock, oldTree, true); @@ -4748,70 +4670,6 @@ void static ProcessGetData(CNode* pfrom) } } - -void ProcessOrphanTransactions(uint256 parentHash) -{ - AssertLockHeld(cs_main); - - vector vWorkQueue, vEraseQueue; - // Recursively process any orphan transactions that depended on this one - vWorkQueue.push_back(parentHash); - set setMisbehaving; - - for (unsigned int i = 0; i < vWorkQueue.size(); i++) - { - map >::iterator itByPrev = mapOrphanTransactionsByPrev.find(vWorkQueue[i]); - if (itByPrev == mapOrphanTransactionsByPrev.end()) - continue; - for (set::iterator mi = itByPrev->second.begin(); - mi != itByPrev->second.end(); - ++mi) - { - const uint256& orphanHash = *mi; - const CTransaction& orphanTx = mapOrphanTransactions[orphanHash].tx; - NodeId fromPeer = mapOrphanTransactions[orphanHash].fromPeer; - bool fMissingInputs2 = false; - // Use a dummy CValidationState so someone can't setup nodes to counter-DoS based on orphan - // resolution (that is, feeding people an invalid transaction based on LegitTxX in order to get - // anyone relaying LegitTxX banned) - CValidationState stateDummy; - - - if (setMisbehaving.count(fromPeer)) - continue; - if (AcceptToMemoryPool(mempool, stateDummy, orphanTx, true, &fMissingInputs2)) - { - LogPrint("mempool", " accepted orphan tx %s\n", orphanHash.ToString()); - RelayTransaction(orphanTx); - vWorkQueue.push_back(orphanHash); - vEraseQueue.push_back(orphanHash); - } - else if (!fMissingInputs2) - { - int nDos = 0; - if (stateDummy.IsInvalid(nDos) && nDos > 0) - { - // Punish peer that gave us an invalid orphan tx - Misbehaving(fromPeer, nDos); - setMisbehaving.insert(fromPeer); - LogPrint("mempool", " invalid orphan tx %s\n", orphanHash.ToString()); - } - // Has inputs but not accepted to mempool - // Probably non-standard or insufficient fee/priority - LogPrint("mempool", " removed orphan tx %s\n", orphanHash.ToString()); - vEraseQueue.push_back(orphanHash); - assert(recentRejects); - recentRejects->insert(orphanHash); - } - mempool.check(pcoinsTip); - } - } - - BOOST_FOREACH(uint256 hash, vEraseQueue) - EraseOrphanTx(hash); -} - - bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, int64_t nTimeReceived) { const CChainParams& chainparams = Params(); @@ -5212,6 +5070,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, else if (strCommand == "tx") { + vector vWorkQueue; + vector vEraseQueue; CTransaction tx; vRecv >> tx; @@ -5230,14 +5090,66 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, { mempool.check(pcoinsTip); RelayTransaction(tx); + vWorkQueue.push_back(inv.hash); LogPrint("mempool", "AcceptToMemoryPool: peer=%d %s: accepted %s (poolsz %u)\n", pfrom->id, pfrom->cleanSubVer, tx.GetHash().ToString(), mempool.mapTx.size()); - ProcessOrphanTransactions(inv.hash); + // Recursively process any orphan transactions that depended on this one + set setMisbehaving; + for (unsigned int i = 0; i < vWorkQueue.size(); i++) + { + map >::iterator itByPrev = mapOrphanTransactionsByPrev.find(vWorkQueue[i]); + if (itByPrev == mapOrphanTransactionsByPrev.end()) + continue; + for (set::iterator mi = itByPrev->second.begin(); + mi != itByPrev->second.end(); + ++mi) + { + const uint256& orphanHash = *mi; + const CTransaction& orphanTx = mapOrphanTransactions[orphanHash].tx; + NodeId fromPeer = mapOrphanTransactions[orphanHash].fromPeer; + bool fMissingInputs2 = false; + // Use a dummy CValidationState so someone can't setup nodes to counter-DoS based on orphan + // resolution (that is, feeding people an invalid transaction based on LegitTxX in order to get + // anyone relaying LegitTxX banned) + CValidationState stateDummy; + + + if (setMisbehaving.count(fromPeer)) + continue; + if (AcceptToMemoryPool(mempool, stateDummy, orphanTx, true, &fMissingInputs2)) + { + LogPrint("mempool", " accepted orphan tx %s\n", orphanHash.ToString()); + RelayTransaction(orphanTx); + vWorkQueue.push_back(orphanHash); + vEraseQueue.push_back(orphanHash); + } + else if (!fMissingInputs2) + { + int nDos = 0; + if (stateDummy.IsInvalid(nDos) && nDos > 0) + { + // Punish peer that gave us an invalid orphan tx + Misbehaving(fromPeer, nDos); + setMisbehaving.insert(fromPeer); + LogPrint("mempool", " invalid orphan tx %s\n", orphanHash.ToString()); + } + // Has inputs but not accepted to mempool + // Probably non-standard or insufficient fee/priority + LogPrint("mempool", " removed orphan tx %s\n", orphanHash.ToString()); + vEraseQueue.push_back(orphanHash); + assert(recentRejects); + recentRejects->insert(orphanHash); + } + mempool.check(pcoinsTip); + } + } + BOOST_FOREACH(uint256 hash, vEraseQueue) + EraseOrphanTx(hash); } // TODO: currently, prohibit joinsplits from entering mapOrphans else if (fMissingInputs && tx.vjoinsplit.size() == 0) diff --git a/src/main.h b/src/main.h index 061dcfcc54e..bcdd04a5ea9 100644 --- a/src/main.h +++ b/src/main.h @@ -250,7 +250,7 @@ void PruneAndFlush(); /** (try to) add transaction to memory pool **/ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree, - bool* pfMissingInputs, bool fRejectAbsurdFee=false, bool fAcceptReplacement=true); + bool* pfMissingInputs, bool fRejectAbsurdFee=false); struct CNodeStateStats { diff --git a/src/replacementpool.cpp b/src/replacementpool.cpp deleted file mode 100644 index 168c30b6eea..00000000000 --- a/src/replacementpool.cpp +++ /dev/null @@ -1,88 +0,0 @@ - -#include "main.h" -#include "replacementpool.h" -#include "sync.h" - - -CTxReplacementPool replacementPool; -CCriticalSection cs_replacementPool; - - -/* - * Validate the item - * - * Compare the item with any current replacement candidate - * - * Ensure that the item is not passed the replacement window - * - * Insert the item into the map - */ -CTxReplacementPoolResult CTxReplacementPool::replace(CTxReplacementPoolItem &item) -{ - LOCK(cs_replacementPool); - - // Replaceable transactions with multiple inputs are disabled - // until someone figures out how they would work. - if (item.tx.vin.size() > 1) return RP_Invalid; - - // replacementWindow of 0 goes direct to mempool - if (item.replacementWindow == 0) - { - // But we also need to remove replacement candidates - replaceMap.erase(item.tx.vin[0].prevout); - return RP_NoReplace; - } - - int startBlock = item.startBlock; - - auto it = replaceMap.find(item.tx.vin[0].prevout); - if (it != replaceMap.end()) - { - if (it->second.replacementWindow <= item.replacementWindow && - it->second.priority >= item.priority) { - return RP_HaveBetter; - } - startBlock = it->second.startBlock; - } - - // This transaction has higher priority - replaceMap[item.tx.vin[0].prevout] = item; - replaceMap[item.tx.vin[0].prevout].startBlock = startBlock; - return RP_Accept; -} - - -/* - * Remove and return any spends that have matured - */ -void CTxReplacementPool::removePending(int height, std::vector &txs) -{ - LOCK(cs_replacementPool); - - for (auto it = replaceMap.begin(); it != replaceMap.end(); /**/) { - CTxReplacementPoolItem &rep = it->second; - - if (rep.GetTargetBlock() <= height) { - txs.push_back(rep.tx); - replaceMap.erase(it++); - } else { - ++it; - } - } -} - - -/* - * O(n) lookup of tx by hash - */ -bool CTxReplacementPool::lookup(uint256 txHash, CTransaction &tx) -{ - LOCK(cs_replacementPool); - for (auto it = replaceMap.begin(); it != replaceMap.end(); it++) { - if (it->second.tx.GetHash() == txHash) { - tx = it->second.tx; - return true; - } - } - return false; -} diff --git a/src/replacementpool.h b/src/replacementpool.h deleted file mode 100644 index d6ab2ed280a..00000000000 --- a/src/replacementpool.h +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright (c) 2018 The Komodo Developers -// Distributed under the MIT software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. - -#ifndef KOMODO_REPLACEMENTCACHE_H -#define KOMODO_REPLACEMENTCACHE_H - -#include "primitives/transaction.h" - - -// My kingdom for a proper sum type... -enum CTxReplacementPoolResult { - RP_Accept, - RP_HaveBetter, - RP_Invalid, - RP_NoReplace -}; - - -class CTxReplacementPoolItem -{ -public: - CTransaction tx; - int startBlock; - uint64_t priority; - uint32_t replacementWindow; - - CTxReplacementPoolItem() {} - - CTxReplacementPoolItem(const CTransaction &_tx, int _startBlock) { - tx = _tx; - startBlock = _startBlock; - priority = 0; - replacementWindow = 0; - } - - int GetTargetBlock() { return startBlock + replacementWindow; } -}; - -/** - * CTxReplacementPool stores transactions that are valid but held for - * period of time during which they may be replaced. - * - * Transactions are added when they are found to be valid but not added - * to the mempool until a timeout. - * - * Replacement pool is like another mempool before the main mempool. - * - * Transactions in the replacement pool are indexed by the output - * that they are spending. Once a replaceable transaction tries to - * spend an output, a countdown of blocks begins at the current block - * plus a window that is set by "userland" code. If another, better - * transaction replaces the spend that's already pending, the countdown - * start block remains the same. - */ -class CTxReplacementPool -{ -private: - /* Index of spends that may be replaced */ - std::map replaceMap; -public: - /* Try to replace a transaction in the index */ - CTxReplacementPoolResult replace(CTxReplacementPoolItem &item); - - /* Remove and return all transactions up to a given block height */ - void removePending(int height, std::vector &txs); - - /* Find a transaction in the index by it's hash. */ - bool lookup(uint256 txHash, CTransaction &tx); -}; - - -/* Global instance */ -extern CTxReplacementPool replacementPool; - -#endif // KOMODO_REPLACEMENTCACHE_H diff --git a/src/secp256k1/include/secp256k1.h b/src/secp256k1/include/secp256k1.h index 06afd4c65bc..9db5cf3a860 100644 --- a/src/secp256k1/include/secp256k1.h +++ b/src/secp256k1/include/secp256k1.h @@ -95,6 +95,18 @@ SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_verify( int pubkeylen ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(5); +/** Check that signature is in canonical form + * Returns: 1: In canonical form + * 0: Non canonical + * -1: invalid signature + * In: sig: the signature being verified (cannot be NULL) + * siglen: the length of the signature + */ +SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_check_canonical_sig( + const unsigned char *sig, + int siglen +) SECP256K1_ARG_NONNULL(1); + /** A pointer to a function to deterministically generate a nonce. * Returns: 1 if a nonce was successfully generated. 0 will cause signing to fail. * In: msg32: the 32-byte message hash being verified (will not be NULL) diff --git a/src/secp256k1/src/secp256k1.c b/src/secp256k1/src/secp256k1.c index d6192dc4ed6..48569ad9eba 100644 --- a/src/secp256k1/src/secp256k1.c +++ b/src/secp256k1/src/secp256k1.c @@ -85,6 +85,14 @@ int secp256k1_ecdsa_verify(const secp256k1_context_t* ctx, const unsigned char * return ret; } + +int secp256k1_ecdsa_check_canonical_sig(const unsigned char *sig, int siglen) { + secp256k1_ecdsa_sig_t s; + if (!secp256k1_ecdsa_sig_parse(&s, sig, siglen)) return -1; + return !secp256k1_scalar_is_high(&s.s); +} + + static int nonce_function_rfc6979(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, unsigned int counter, const void *data) { secp256k1_rfc6979_hmac_sha256_t rng; unsigned int i; diff --git a/src/test-komodo/main.cpp b/src/test-komodo/main.cpp deleted file mode 100644 index 7811d5f9a74..00000000000 --- a/src/test-komodo/main.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include "gtest/gtest.h" -#include "crypto/common.h" - -int main(int argc, char **argv) { - assert(init_and_check_sodium() != -1); - - testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/src/test-komodo/test_replacementpool.cpp b/src/test-komodo/test_replacementpool.cpp deleted file mode 100644 index b0ccc427838..00000000000 --- a/src/test-komodo/test_replacementpool.cpp +++ /dev/null @@ -1,440 +0,0 @@ -#include -#include - -#include "base58.h" -#include "core_io.h" -#include "key.h" -#include "komodo_cryptoconditions.h" -#include "main.h" -#include "miner.h" -#include "random.h" -#include "rpcserver.h" -#include "rpcprotocol.h" -#include "replacementpool.h" -#include "txdb.h" -#include "util.h" -#include "utilstrencodings.h" -#include "utiltime.h" -#include "consensus/validation.h" -#include "primitives/transaction.h" -#include "script/interpreter.h" -#include "cryptoconditions/include/cryptoconditions.h" - - -extern int32_t USE_EXTERNAL_PUBKEY; -extern std::string NOTARY_PUBKEY; -std::string _NOTARY_PUBKEY = "0205a8ad0c1dbc515f149af377981aab58b836af008d4d7ab21bd76faf80550b47"; -std::string NOTARY_SECRET = "UxFWWxsf1d7w7K5TvAWSkeX4H95XQKwdwGv49DXwWUTzPTTjHBbU"; -CKey notaryKey; - -#define VCH(a,b) std::vector(a, a + b) - - -/* - * We need to have control of clock, - * otherwise block production can fail. - */ -int64_t nMockTime; - - -void testSetup() -{ - SelectParams(CBaseChainParams::REGTEST); - - // enable CC - ASSETCHAINS_CC = 1; - ASSETCHAINS_CC_TEST = true; - - // Settings to get block reward - NOTARY_PUBKEY = _NOTARY_PUBKEY; - USE_EXTERNAL_PUBKEY = 1; - mapArgs["-mineraddress"] = "bogus"; - COINBASE_MATURITY = 1; - // Global mock time - nMockTime = GetTime(); - - // Init blockchain - ClearDatadirCache(); - auto pathTemp = GetTempPath() / strprintf("test_komodo_%li_%i", GetTime(), GetRand(100000)); - boost::filesystem::create_directories(pathTemp); - mapArgs["-datadir"] = pathTemp.string(); - pblocktree = new CBlockTreeDB(1 << 20, true); - CCoinsViewDB *pcoinsdbview = new CCoinsViewDB(1 << 23, true); - pcoinsTip = new CCoinsViewCache(pcoinsdbview); - InitBlockIndex(); - - // Set address - ECC_Start(); - - // Notary key - CBitcoinSecret vchSecret; - // this returns false due to network prefix mismatch but works anyway - vchSecret.SetString(NOTARY_SECRET); - notaryKey = vchSecret.GetKey(); -} - - -void generateBlock(CBlock *block=NULL) -{ - UniValue params; - params.setArray(); - params.push_back(1); - uint256 blockId; - - SetMockTime(nMockTime++); // CreateNewBlock can fail if not enough time passes - - try { - UniValue out = generate(params, false); - blockId.SetHex(out[0].getValStr()); - } catch (const UniValue& e) { - FAIL() << "failed to create block: " << e.write().data(); - } - if (block) ASSERT_TRUE(ReadBlockFromDisk(*block, mapBlockIndex[blockId])); -} - - -void acceptTx(const CTransaction tx) -{ - CValidationState state; - LOCK(cs_main); - if (!AcceptToMemoryPool(mempool, state, tx, false, NULL)) - FAIL() << state.GetRejectReason(); -} - - -static CMutableTransaction spendTx(const CTransaction &txIn, int nOut=0) -{ - CMutableTransaction mtx; - mtx.vin.resize(1); - mtx.vin[0].prevout.hash = txIn.GetHash(); - mtx.vin[0].prevout.n = nOut; - mtx.vout.resize(1); - mtx.vout[0].nValue = txIn.vout[nOut].nValue - 1000; - return mtx; -} - - -/* - * In order to do tests there needs to be inputs to spend. - * This method creates a block and returns a transaction that spends the coinbase. - */ -void getInputTx(CScript scriptPubKey, CTransaction &txIn) -{ - // Get coinbase - CBlock block; - generateBlock(&block); - CTransaction coinbase = block.vtx[0]; - - // Create tx - auto mtx = spendTx(coinbase); - mtx.vout[0].scriptPubKey = scriptPubKey; - uint256 hash = SignatureHash(coinbase.vout[0].scriptPubKey, mtx, 0, SIGHASH_ALL); - std::vector vchSig; - notaryKey.Sign(hash, vchSig); - vchSig.push_back((unsigned char)SIGHASH_ALL); - mtx.vin[0].scriptSig << vchSig; - - // Accept - acceptTx(mtx); - txIn = CTransaction(mtx); -} - - -std::string HexToB64(std::string hexStr) -{ - auto d = ParseHex(hexStr); - return EncodeBase64(d.data(), d.size()); -} - - -CC *getReplaceCond() -{ - const char *condJsonTpl = R"V0G0N( - { "type": "threshold-sha-256", - "threshold": 2, - "subfulfillments": [ - { "type": "secp256k1-sha-256", "publicKey": "%s"}, - { "type": "eval-sha-256", "method": "testReplace", "params": "" } - ] })V0G0N"; - char condJson[1000]; - sprintf(condJson, condJsonTpl, (char*)HexToB64(NOTARY_PUBKEY).data()); - - unsigned char err[1000] = "\0"; - return cc_conditionFromJSONString((const unsigned char*)condJson, err); - // above could fail -} - -CScript condPK(CC *cond) -{ - unsigned char buf[1000]; - size_t bufLen = cc_conditionBinary(cond, buf); - return CScript() << VCH(buf, bufLen) << OP_CHECKCRYPTOCONDITION; -} - -void setFulfillment(CMutableTransaction &mtx, CC *cond, const CScript &spk, int nIn=0) -{ - uint256 hash = SignatureHash(spk, mtx, nIn, SIGHASH_ALL); - int nSigned = cc_signTreeSecp256k1Msg32(cond, notaryKey.begin(), hash.begin()); - unsigned char buf[1000]; - size_t bufLen = cc_fulfillmentBinary(cond, buf, 1000); - mtx.vin[nIn].scriptSig = CScript() << VCH(buf, bufLen); -} - - -CScript getReplaceOut(unsigned char replacementWindow, unsigned char priority) -{ - std::vector v = {replacementWindow, priority}; - return CScript() << OP_RETURN << v; -} - - -CTransaction _txout; -#define ONLY_REPLACEMENT_POOL(hash) ASSERT_TRUE(replacementPool.lookup(hash, _txout)); \ - ASSERT_FALSE(mempool.lookup(hash, _txout)); -#define ONLY_MEM_POOL(hash) ASSERT_FALSE(replacementPool.lookup(hash, _txout)); \ - ASSERT_TRUE(mempool.lookup(hash, _txout)); - - - -// Setup environment and perform basic spend as test -TEST(replacementpool, 0_setup) -{ - testSetup(); // Only call this method here - - CTransaction txIn; - getInputTx(CScript() << OP_RETURN << VCH("1", 1), txIn); -} - - -// Perform replaceable spend -TEST(replacementpool, basic) -{ - CTransaction txIn; - CC *cond = getReplaceCond(); - getInputTx(condPK(cond), txIn); - - // Spend output to replaceable - auto mtx = spendTx(txIn); - mtx.vout[0].scriptPubKey = getReplaceOut(2, 100); - setFulfillment(mtx, cond, txIn.vout[0].scriptPubKey); - - acceptTx(mtx); - - ONLY_REPLACEMENT_POOL(mtx.GetHash()); - generateBlock(); - ONLY_REPLACEMENT_POOL(mtx.GetHash()); - generateBlock(); - ONLY_MEM_POOL(mtx.GetHash()); -} - - -/* - * replacementWindow is 0, transaction should go direct to mempool - */ -TEST(replacementpool, noWindow) -{ - CTransaction txIn; - CC *cond = getReplaceCond(); - getInputTx(condPK(cond), txIn); - - // First set a tx with a 1 block wait. It should stay in the replacement pool. - auto mtx = spendTx(txIn); - mtx.vout[0].scriptPubKey = getReplaceOut(1, 100); - setFulfillment(mtx, cond, txIn.vout[0].scriptPubKey); - acceptTx(mtx); - ONLY_REPLACEMENT_POOL(mtx.GetHash()); - - // Now set a transaction with a 0 block wait and higher priority. - // It should go direct to the mem pool. - auto mtx2 = spendTx(txIn); - mtx2.vout[0].scriptPubKey = getReplaceOut(0, 101); - setFulfillment(mtx2, cond, txIn.vout[0].scriptPubKey); - acceptTx(mtx2); - ONLY_MEM_POOL(mtx2.GetHash()); - - // Additionally, there should be no replacement remaining for txIn in the mempool - ASSERT_FALSE(replacementPool.lookup(mtx.GetHash(), _txout)); -} - - -/* - * Multiple replaceable transactions dont interfere - */ -TEST(replacementpool, noInterfere) -{ - CTransaction txIn1, txIn2; - CC *cond = getReplaceCond(); - getInputTx(condPK(cond), txIn1); - getInputTx(condPK(cond), txIn2); - - // First set a transaction with a low window - auto mtx = spendTx(txIn1); - mtx.vout[0].scriptPubKey = getReplaceOut(1, 100); - setFulfillment(mtx, cond, txIn1.vout[0].scriptPubKey); - acceptTx(mtx); - ONLY_REPLACEMENT_POOL(mtx.GetHash()); - - // Now, a different spend with a higher window - auto mtx2 = spendTx(txIn2); - mtx2.vout[0].scriptPubKey = getReplaceOut(10, 100); - setFulfillment(mtx2, cond, txIn2.vout[0].scriptPubKey); - acceptTx(mtx2); - ONLY_REPLACEMENT_POOL(mtx2.GetHash()); - - generateBlock(); - - // mtx has gone to mempool - ONLY_MEM_POOL(mtx.GetHash()); - - // mtx2 still in replacementpool - ONLY_REPLACEMENT_POOL(mtx2.GetHash()); - - // But 9 blocks later... - for (int i=0; i<9; i++) - { - generateBlock(); - ASSERT_EQ(i == 8, mempool.lookup(mtx2.GetHash(), _txout)); - } -} - - -/* - * Multiple inputs is invalid - */ -TEST(replacementpool, invalidMultipleInputs) -{ - LOCK(cs_main); - - CTransaction txIn, txIn2; - CC *cond = getReplaceCond(); - getInputTx(condPK(cond), txIn); - getInputTx(condPK(cond), txIn2); - - CMutableTransaction mtx; - mtx.vout.resize(1); - mtx.vout[0].nValue = txIn.vout[0].nValue * 2 - 1000; - mtx.vout[0].scriptPubKey = getReplaceOut(1, 100); - mtx.vin.resize(2); - mtx.vin[0].prevout.hash = txIn.GetHash(); - mtx.vin[0].prevout.n = 0; - mtx.vin[1].prevout.hash = txIn2.GetHash(); - mtx.vin[1].prevout.n = 0; - setFulfillment(mtx, cond, txIn.vout[0].scriptPubKey); - setFulfillment(mtx, cond, txIn2.vout[0].scriptPubKey, 1); - - CValidationState state; - ASSERT_FALSE(AcceptToMemoryPool(mempool, state, mtx, false, NULL)); - ASSERT_EQ("replacement-invalid", state.GetRejectReason()); -} - - -extern bool AddOrphanTx(const CTransaction& tx, NodeId peer); -extern void ProcessOrphanTransactions(uint256 parentHash); -struct COrphanTx { CTransaction tx; NodeId fromPeer; }; -extern std::map mapOrphanTransactions; - -/* - * Orphans are processed - */ -TEST(replacementpool, orphansAreProcessed) -{ - LOCK(cs_main); - - CTransaction txIn; - CC *cond = getReplaceCond(); - getInputTx(condPK(cond), txIn); - - // Make basic replaceable spend and dont submit - auto mtx = spendTx(txIn); - mtx.vout.resize(2); - mtx.vout[0].nValue = txIn.vout[0].nValue - 1000; - mtx.vout[0].scriptPubKey = condPK(cond); - mtx.vout[1].nValue = 1; - mtx.vout[1].scriptPubKey = getReplaceOut(1, 100); - setFulfillment(mtx, cond, txIn.vout[0].scriptPubKey); - - // Make an orphan and add it - auto orphan = spendTx(mtx); - orphan.vout[0].scriptPubKey = getReplaceOut(0, 100); - setFulfillment(orphan, cond, mtx.vout[0].scriptPubKey); - ASSERT_TRUE(AddOrphanTx(orphan, 1001)); - ASSERT_EQ(1, mapOrphanTransactions.count(orphan.GetHash())); - - // parent goes into replacement pool - acceptTx(mtx); - ONLY_REPLACEMENT_POOL(mtx.GetHash()); - - // this should not result in the movement of any orphans - ProcessOrphanTransactions(mtx.GetHash()); - ASSERT_EQ(1, mapOrphanTransactions.count(orphan.GetHash())); - - // Processing of parent transaction also un-orphanises orphan - generateBlock(); - ONLY_MEM_POOL(mtx.GetHash()); - ONLY_MEM_POOL(orphan.GetHash()); - ASSERT_EQ(0, mapOrphanTransactions.count(orphan.GetHash())); -} - - -/* - * Add transaction with lower priority, already have better - */ -TEST(replacementpool, haveBetter) -{ - LOCK(cs_main); - - CTransaction txIn; - CC *cond = getReplaceCond(); - getInputTx(condPK(cond), txIn); - - // A replaceable tx. - auto mtx = spendTx(txIn); - mtx.vout[0].scriptPubKey = getReplaceOut(2, 100); - setFulfillment(mtx, cond, txIn.vout[0].scriptPubKey); - acceptTx(mtx); - ONLY_REPLACEMENT_POOL(mtx.GetHash()); - - // Another one, but not as good. - auto mtx2 = spendTx(txIn); - mtx2.vout[0].scriptPubKey = getReplaceOut(2, 99); - setFulfillment(mtx2, cond, txIn.vout[0].scriptPubKey); - CValidationState state; - ASSERT_FALSE(AcceptToMemoryPool(mempool, state, mtx, false, NULL)); - ASSERT_EQ("replacement-is-worse", state.GetRejectReason()); - ONLY_REPLACEMENT_POOL(mtx.GetHash()); -} - - -/* - * Add transaction with lower priority, but shorter replacementWindow - */ -TEST(replacementpool, shorterReplacementWindow) -{ - LOCK(cs_main); - - CTransaction txIn; - CC *cond = getReplaceCond(); - getInputTx(condPK(cond), txIn); - - // A replaceable tx. - auto mtx = spendTx(txIn); - mtx.vout[0].scriptPubKey = getReplaceOut(2, 100); - setFulfillment(mtx, cond, txIn.vout[0].scriptPubKey); - acceptTx(mtx); - ONLY_REPLACEMENT_POOL(mtx.GetHash()); - - // Another one, lower priority but shorter replacementWindow so wins. - auto mtx2 = spendTx(txIn); - mtx2.vout[0].scriptPubKey = getReplaceOut(1, 99); - setFulfillment(mtx2, cond, txIn.vout[0].scriptPubKey); - acceptTx(mtx2); - ONLY_REPLACEMENT_POOL(mtx2.GetHash()); - ASSERT_FALSE(replacementPool.lookup(mtx.GetHash(), _txout)); - - // Shorter still, in fact direct to mem pool - auto mtx3 = spendTx(txIn); - mtx3.vout[0].scriptPubKey = getReplaceOut(0, 98); - setFulfillment(mtx3, cond, txIn.vout[0].scriptPubKey); - acceptTx(mtx3); - ONLY_MEM_POOL(mtx3.GetHash()); -} From 8b78a8199e185165af3609028ee36211514b22d5 Mon Sep 17 00:00:00 2001 From: TheTrunk Date: Tue, 27 Mar 2018 13:34:52 +0200 Subject: [PATCH 0051/1081] Bitcore port --- .vs/ProjectSettings.json | 3 + .vs/VSWorkspaceState.json | 6 + .vs/komodo/v15/.suo | Bin 0 -> 14336 bytes .vs/komodo/v15/Browse.VC.db | Bin 0 -> 6598656 bytes .vs/slnx.sqlite | Bin 0 -> 266240 bytes Makefile.am | 201 ++++----- configure.ac | 4 +- qa/pull-tester/rpc-tests.sh | 3 + qa/rpc-tests/addressindex.py | 349 ++++++++++++++++ qa/rpc-tests/spentindex.py | 139 +++++++ qa/rpc-tests/timestampindex.py | 61 +++ qa/rpc-tests/txindex.py | 73 ++++ qa/zcash/create_benchmark_archive.py | 263 ++++++++++++ qa/zcash/create_wallet_200k_utxos.py | 60 +++ qa/zcash/full-test-suite.sh | 218 ++++++++-- qa/zcash/performance-measurements.sh | 187 +++++++-- qa/zcash/test-depends-sources-mirror.py | 2 +- src/Makefile.am | 425 ++++++++++--------- src/Makefile.test.include | 149 +++---- src/addressindex.h | 82 ++++ src/base58.cpp | 17 + src/base58.h | 1 + src/clientversion.cpp | 7 +- src/init.cpp | 26 +- src/leveldbwrapper.cpp | 10 +- src/leveldbwrapper.h | 2 +- src/main.cpp | 269 ++++++++++++ src/main.h | 346 ++++++++++++++++ src/rpcblockchain.cpp | 207 ++++++++++ src/rpcclient.cpp | 9 + src/rpcmisc.cpp | 528 ++++++++++++++++++++++++ src/rpcrawtransaction.cpp | 123 +++++- src/rpcserver.cpp | 10 + src/rpcserver.h | 8 + src/script/script.cpp | 11 + src/script/script.h | 2 + src/serialize.h | 11 + src/spentindex.h | 98 +++++ src/test/script_P2PKH_tests.cpp | 59 +++ src/test/test_bitcoin.cpp | 1 + src/test/wallet-utility.py | 61 +++ src/txdb.cpp | 210 +++++++++- src/txdb.h | 28 +- src/txmempool.cpp | 140 +++++++ src/txmempool.h | 25 ++ src/wallet-utility.cpp | 339 +++++++++++++++ 46 files changed, 4321 insertions(+), 452 deletions(-) create mode 100644 .vs/ProjectSettings.json create mode 100644 .vs/VSWorkspaceState.json create mode 100644 .vs/komodo/v15/.suo create mode 100644 .vs/komodo/v15/Browse.VC.db create mode 100644 .vs/slnx.sqlite create mode 100644 qa/rpc-tests/addressindex.py create mode 100644 qa/rpc-tests/spentindex.py create mode 100644 qa/rpc-tests/timestampindex.py create mode 100644 qa/rpc-tests/txindex.py create mode 100644 qa/zcash/create_benchmark_archive.py create mode 100644 qa/zcash/create_wallet_200k_utxos.py create mode 100644 src/addressindex.h create mode 100644 src/spentindex.h create mode 100644 src/test/script_P2PKH_tests.cpp create mode 100644 src/test/wallet-utility.py create mode 100644 src/wallet-utility.cpp diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json new file mode 100644 index 00000000000..38c5f003cfe --- /dev/null +++ b/.vs/ProjectSettings.json @@ -0,0 +1,3 @@ +{ + "CurrentProjectSetting": "x86-Debug" +} \ No newline at end of file diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json new file mode 100644 index 00000000000..6b6114114f4 --- /dev/null +++ b/.vs/VSWorkspaceState.json @@ -0,0 +1,6 @@ +{ + "ExpandedNodes": [ + "" + ], + "PreviewInSolutionExplorer": false +} \ No newline at end of file diff --git a/.vs/komodo/v15/.suo b/.vs/komodo/v15/.suo new file mode 100644 index 0000000000000000000000000000000000000000..53e333dac05c33e1f02485d134c0bb58b19f30ca GIT binary patch literal 14336 zcmeI2>v9xD6vulLQSll?Q4w`T#HbJx?xLWO5V;tzNC3-96^6~lWj7ahm)nc@$uB;F zPoQO$Unonc($cT;2E2g8-@j*iw|CgxOlG;bFMd|)93WL_362JW8L51|FH3v ziIjt;*W6iNYaaF5GhW^F8S^~%YP++%ysSs6Q|*=x;=pOM$gg6u=7?F~S~AzPl(EYO zv!=S{YgTxx@2hX;e*ES4%oFOjKIr^87#Gb&a}4aW)Q*^|D~wYAc!TMw;uqWNpEkZb zK{MiOi^DIxOQy&SN@fNahZj@8OxUm4WsB*__{-g_pWl9%oB6Qel(__!qRB(QV9vul zLQBbiu|ZwjtjE^I~|f=iTz(;=qH{|J&htF}`%M0P+n zTsr$0@Hikn7ObTIGUw{oEuF=I!+5+!Q@|fh;cE(>_hCU}luh^_#eI?wQ6A$JbCgc~ zVaEyZmcjcOzOIZX95-KEA6zjx>lw={3@HECOP{qsT>PKXSF){g)(m5V3i#dg<`6h5 z%;Pd%U-3Z2j8I!*Ugyn_88CyvD|P>a;MZ8PCvovhPuw5@9z`4raH42N!CwSxxoR0_ z?5u|2isG{w`(NYA{si%lkAH-5#p(HQ@}=z_6D8=@sE6c zT>3}p>+EkU{Aa)@&WzYdY^sLTs||o(@rZ0zT>L)$oMsl&)(*Cs&mQoLmx}S@(tn@@e%U|SAL*s^Pq{Uwn6^{%PYo*`8+d7hqB(5bVScp$SXaM_FZgBDMNO^5<~t>OX5%SG=NlS4I9m z8}YTepF;8q{L3n3@&3D;`~Owr_t)R&>=^hI1q7CGfLTZv7OWnQLid#Q()E%6{Tc1y z6|cvoUv$e~sAw(@#1qy1_+N3AY+Ic8Uv@xqQ7j;Ppge%`2+9q-0&D_a1zrPQ2eQB$ zz-Hi0U<>dTuoZY4=m*{b-UZ$RwgKCL0pNW=K6D7!0qg{J0lR@cz+OP!^8;W%@FDOK z;AqwL6YqZ5tNVTYy7-&6B00za53Ae@+%A^!X=ta-A17{IF~HBjFw!;|+7rce(%GyR z)n}3Ft4QV^BzqFOmdDO016l@Vv2R%$hn4Yt+6`pwe(VzdP%-Evl0JyU@1>?Vb)Mg) z&@Nu1O}1 zeoFy0^Q@)TsFa%ZDHGjDKGPv>6?QAZ+H|4?ko}Ral)2_Qc1@yGT*b!iN)0v2&COeC zZg!wOi>^%$|0J&y$el62rhukAo>g95HtmlT&=Z_U7Fa1|B0ASrJ1KM4O*_kCYF6no zS|n{MK~tV=g{1G#6iA=wD%sdp`FQ1~MOi1>K7B(_go0Tps`*%VpC+0DO4G4UckhZ2 zzlJ5#=I+_$p&AYzqfz_klR&WVbSEaV*Aq5}J`w6sffhffI%!U$RmyRzuk5_Cjym_z z3dS$O-%e5fLHS!1KNoR^dyRc`kS(wO+g`nEUGv{j{XP}#`^T_UMf5yxck7DPDzq$B zvx>$X;A=W%U6qBZFMZsuw@px+fSF(1P zZ*J||fAacY7r)Do_U%1U_pp0&-#OstH@o@YS}xq@i(gM${x_=qaldFh(Y;rP<(DtU6x@4@#U_WVs}ElKc?+Z{yk72ah$n6khna>UW^A_n+EXOW!rw9Py# z>s+xU987TjcAPie`JdxMJ6F-|N;~5ueb?dEHR%}byw?u?6rBIA`utfji;KHcaQ+T;N2a{d@1#wSNBme*a literal 0 HcmV?d00001 diff --git a/.vs/komodo/v15/Browse.VC.db b/.vs/komodo/v15/Browse.VC.db new file mode 100644 index 0000000000000000000000000000000000000000..466e021bd0bfa026330c57b0924fc4e503e08c29 GIT binary patch literal 6598656 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%0DRB04Z!y>+W>qIu?@iY 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 `SG5&{JFk(Zt9!XudhzER?ih6dVg9 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
P?@-ZoR5tYpo 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̻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

< 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

8!s;6Vm^89cyX4}<#|>}Ifw!F>$wWpEFJyBXZY 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

@|A4ObagbawYP2DxInm>W`B2CcOEhRqpA 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

dwj){go?p<%(X)6@!!O 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 t zK<%E!6%QErw~OoT(L5gvo;n^Oe;va0nbH>`jwSBQPuN&2> zEDLyq7GtbxL`(mQV~?&+njZnb5(b=0q^-s1VpGpnWm(WRJiC83lo7N?)eoz2t*vNP z76YhFk`0DEvfdu?-)6UWpFV2(KrE_Xl(#C=0TfeB+HW_b${vAYQrF=he3GW9PhVzD z?@F0ev?|kqPRldA9v)CBmxKQf)T3f_#ULyy+W1yBB5(}vIGAb=LwV4NXH+*IySj13 zgxY1xYL}o(u3x%(4MtbdFDnl5R&=X?qpejHt=ftpxq*h(!^!b~DNxq!LEHZLu1)kXy!9A-MY*mgZ!LMIvBOw68}JrxTZ-Lz_Jf+V9GTdLHUsC1w?!-(wi z>?js8x@lEr1ZavRqZ>P-lKziIH@VqEvx~5h(M_weE5MIXNz>-+0rdwry2(B)+nt?F zITW|DWkIr8hTXp&j<1u=GP34n9g2m`GFsWTAlWR#?x#{8)GQ-wLRJYDHp^&b!-HhA z47*5WakZIy1|#3+p?YWn>+m70k*+s^-=GTb2C*F3M^~`~ed- zjV^ZIdNsMYv3hy+I=BE;IIy*VBPY#7whJio{+Y|nY5J@kMuLM)pT)4Z+SISL*TIU`3#r>p)E(X0ljDv~Is!crSN+(9nU8Cl z24aqP?NYMFz%<=FkJ>P(RoMinYg$s;9x81OexPf>9KU8vQ--e^6&~5j1_9nASCMx2 z6>#o84HiWEr*T^TEPn^zPP^L*xO?|!tN#(LdhUOh_P_q1Lv=+g zZ-&ZB?L__Z=jxu)-QPXbU9B6@sto{w!__@Dac9TlQ0@x&non!2R#U~RD^=t${|4B% zN7sQ}C$+K}fZ414&tBML4)*8?8)?d^R26>p8rv=p6hOGT4(^)KwOdyeV??XA3`j0P z_6qp8@3aKzxqWg+wJPfXJQ@_FsiLb-+ap4jDnYx1*k^9vTo>F9tHMleRb~SCD;&%T z_b2V5k_yj>2bS3(!mC!pA`_0zipc1%pDWXq<;qOURMAGXDoX*BqeI*Ky4aa3>~?UR~^MXejtstg8%!%VI~hAKr=c-of&KOdxrQgc()+99oEE#MPs9((&IkMtE@ z^T34u9-csYK&>fh)dm71splTpWN9l7aD_YZu!*zhOq@1z{2`SU?p|&m=9$A>Vae!L zZ7={UwDwat?Nt11KBswggR* zYQn7gYwIgPvI|+$SXmO))zpW~&q{T9x$y4t=-voaz2- z19i6L_0(V@cD=G5U0q)U%c6co>PJ-kn9c^p__05tYPZ}B57;`DQg|BJo%0I#ap z`iJ+K*{8RJ5<)X41R*40cIX5WI4P7+LldPKLJA2vDI}p=4!tNvY={jN6|wiOsHmu@ zT=janniIKJ^x6y8>$UvXT6=bKO2WPG|M{N#e9!m28#2GOrtP(6X3ySd%948mA`H)Nmb)2XixJdA>jMv& zI6B;7G}r@*&%{ke$<6u(hjxCf*kSPqgW}CkZ^ms5@Rbp@Cd}j(wxz;?lj^jBjOC}Y ze3sU1Y+i_5Zw5V(6=NHVUs!$;%OBIM?_h{s{30yvFMeV9X)NEvV46RlmZdbCLALgm zr3f?1p9lZPHtRbSVpos}wS&bkEH8)Ud01W|%fq{jZsv3sQ_Ko7!664(0LEOro#l>Z zxp6Evf#rhV(&T2=k&Fyw90UKeoAq4>VLu3IZ7h_UX{k`?2Vp-pCX0rDm2l*5hlDe#C+ZquH2VY)oG^27e(s zJe8($?pI)5Jk{xQCOYGsHm3r!;@>(>IZirGIF37x!kqYHaCY56$9~6N$8MMr4?0%C z>2?1XHuF4-Jm-3fJQHEYf21eVlj`w#5a4kz6wV7C9L`!Jm2cc1&9 zdq2$e?{;r>2i>dO_3lcT=|9(9XTPISk)ZEnT&GtBaza-DRYa2@|& z%Y5eD=B+T3zRFy0t~4)#a~q3b9^G#qY0fmKntkR(cp=%$iu$wqt$GS}W}Nu%*vxYs zbsdIT`}rYqIub0xxjz0IXKe|CQB zJmowIv-QWFN1cbAk2&vi9)!92z0TdvtdtV%!H~V*5RNJ-a^2eoEufLYm#$= z>Y(teRI+Q5vr8qrCOI2bEBTL7$*xJxNR{lGBY&eNltf8c1>~;`9COq0zXaI zng2u>&wnIz@E-{6{CmXgXE@n4$$pxXU6bsm_&4N#7bm+W*>`ZVYm$8%C%Y!u2l(G9 z{3iYd;q{#Cnq*(gPZ56&|BUczPIgVQui&2$znha?lk6Rw?3!e6;bhk&dow4yCfS=f z*)_@Dz{##jc96GFx{Em3HOXGf$*xKEO8!3iFXrzNmhit4F5)K$i}_y&&*$$FF64hE zT)^KUoX_7ToX6iHJdgj0@LYbJa1wu$a3p_&a0q{$Fq0o6%;2vPrt?=NzCxJFj}ms_ zFB3ZWON4g*BB6~RA++!p2vz<(p@~0-IQn;fnD96LEa5Nw8Nws{X~GxyQ-sg*CkdbA zPY^!FA18d2KSua4f0S@He}r%sf0%G5e~54ge~|D}{s7@6{C>ji{64~M{9eLg{2s(n zxAD6P_wu_4x9~d&*YZPzEBPISP5dC?GJZQ@6~B!zgWrmnRl*M-j{J(>f;e;+znO3+ zzlm@M-%ps&ZzLSVZy?Oz*CP)3gFd8{rLn zE8&HF3*lP6nXrLxB3#Bd64vnzgf)CUVSukAtmZ+&5`Hn^`TQcnf&4BS$r*F zFTMsb^C(|U_%dHb_!3`9_#$6Hc!Vz}e1SI+KF=EopW_XLhxszXXL&v0GrW%QXb|H7Sw?{Wv>Tij0gCbtp3#;t@$xrOj0 zZYDg!Rl?^vCw!JO!l$^2@NupXKF0nae3bo8_#pd@@B#KK;qB~SgtxL^2oJD-65hgo zCcKILgYZUnn(zkp6XEsjN5bpa4}{mU?+N#@?+CA9-xBU+-waYJhj62sOt@P05w28|2v?|Q5iVDI z6E>>72PK)+^)v7!r}`QA0jK&I_%5gV8F-vi{S3U3Q~eCQl2iQ* zT*9e-23ByYpNyY4)lbF`oa!gzJ5KeJ@pn%3lko+o`pNj5Q~hLo%Bg-bKH^kA8O@yP zC*yuj^^>L=qiPW6*L(+}seUpp1QsO3~Y839i9ld+Uj z{iM4&)la&EQ~jiU$EkkOzU5RuXh1xj__i&mT;9?L)fSW2>Ywmg#FZ|glDT&gniXY!W4B0VIQ@E zFj*}p^r>ZpR<)GSqAn)nY6&4z7ZIA&VnRhdAF<#Mbs=G)x`1$^I-hWYI*)L?dLH38 z^<2UNbuMAPdJbWpI)^YR3)#-@2Z>!S?H>gty{pu9L zvFc>PG3q2l|95I3;kW8U!f(_Ggs-XN313ym5x$}p5FS?Z37=K-2%k}NaWu`Z+@^S& zVU_`Tu4(=YGC(gyTmT5x4|Sthd^qh1Kk% zZKrMb*cxopZSmGOtT)0c@>Dnv{-9;0WvKZ(SmC|HJi(lz{-HjhHmJkljQ2ylmZ!3l z>;Nlcy-X)fcbck9X|VhMHskkH`&bathdoT`Dba(FL72aTxj7grfqnkvO}G)bbrubV zNJ7lyFohCLA&fJs`C@%|C!Mz6;|Pi|ns{*_nNOZRb$Y?{;>qXeW^kCb2eaB4jB;74 z>uTz za*M&t&8&Rb-amU*;k8X~o)rSna5oSRRo3k+FPyH9!=%8W&t+~n%;Mqg7Kyx zRNLaLW@$zsR)1kmX-qs z#OSahOb30h1SsoCL;hJcsq>-kiq2x+Uq=|r7O`0%m zN1AjqC1seB`jd-sa+{^4fU{#XX$;o{wta=`kz^X~FeP<0CFy!dLjkdRGz3I_xE`6x z=`7{+Fmk0H%iuYJQRY}ZmSNhC^hi`r4^&R4l8bTjn(OuF5sczQO-$75dNh=*l*Syw z6j4r_dOMWU3Cd|uq#?N(%>%SMtXzj{c)lxaKGFVTCdN zK;)XAIvUJ{8xK=H@hYEmQ$EpGB;gMJb|tMwNk4}F{$|{yA0g=wDe2OHs3J*wDIX6} zK2GgZR$dR=^kE2E5(9h`;BUqa`Y2}fc5qP@DJJSBCH;7q@^L5S;~vV#D5+?c`}5tj z9ICZ1gQkM?Dk`A8L|JZeD<8O(55euOe1MCS1~r$ZWS0RxI7@r z97YQpHR_z)nKRE)TGEvke>3jLhjQwf5+O5GXBm}~ELI~eOt89@mVru3g3{7UX~EEp z=2CfE+S1;7TPUZ}fGB~b4!C*?3|T2BhA1bPzj?79J;uO|Sgc2{G7Q|zUR79&lgd4n z6Y0u{RC1eEfq|Q5eXD*u#Z=N>F`aNL&2HsHcjW{YldpLZsf@GU;l-r5#iGDaWn#)60tDc6-{{c$@8zAh{W>1GF1w7QS1y z!vA^AXcQo#H(mlPzBgtD#0au^X81p+8I21>Xt7Y%#gu@UEVbC2r)-8dV{7-&Cj&~oZ7pOfJ!@1u zxY!tD=QZnQ2ij3!@);D^T%c@rDVw_}n{@@yGC{ivOhN@V!T(v!Xn-I>f%BvSg#j^9 zDzGV6*_7G`tyuQSfR`mKz^ZMkNbPfW=15q7OwxYQn+9qhX{3o74{7w1F zCYQ3Qi?T@TER+b}aXXUCM9s$6!zLHGHS{C+`>D z54`VqUje%ScY3e$Uh2KT8}KghPWBG>CVO3;e|SFhybg1vw|I7X)_YdK{{HhlGdrQufbN%M}$n}crUe^_Ti0dMl2cGH5cJ+gq zU+z5Z{0!!NUvWO+yw17Hx!$?lxx{&%b28W;)SSt%%8omJfL;4WIVfM4YQsHUahqgChPyPM2t6(4f zBHK6{tgYbj>^##yP4`&3m|wLytY5%5#Wd@2uv6HRy=XelZZTcT)|$VBJ@ijl@3kJV zUSr*9-C%99mRrw(!^14FGyXX2ioeftgXI!Sy=9JNIP7!($o#JP74uW(d(Ah)-uA8L zwdPuLiFr0(#Am<>2*Y^_k4xr}Tt3gAH+2SBy$@71R?aM0NiU&kbxlb5IsypdCf#p3x-m3IDnm2Ae{43%PvSRtk1NCvsQlvco1l$4e$yS`82 zV@V~w97<{VX;}C-|0eun2P{7V8{mbtRsJ?|Y-c_IeGA}A4r~x%w^w_p2Oj}`Xp1%w zd6(SWzI?I_(k-FSs#*f6mN%5o0xRSo_L}mB>ihqbNQXM{v$=i~Jtt*LQ#?OABJYeBcKD+nh4a;$u-m*oRWmR6Y$pm+`|5mq%7Ll$T{B zP~$X$r`Ey8QdN1`ENFO3`*avoRnm#~r%Y!zl$Xz~Dr>4tN}_s#jHZ?}R%3d{`e+~f z8*bj4l3`bulpM~T^+$g`1Hwux!E{bo-_rU(kV&TUhMH^t!+6*Hhw*lMIIMYu`!Xf??&>(`&W?lb=s0M(U66Oy_DFVH1lvoAV0->Sw>hVz0lrO! z-4)Ip>dFVQ{I-u9s;gDe--xJ#(i_iBG2bpS@~MZCTye-c%!W3Qc}p4eUE; zY^-Z=KHIMEg3(wYY5M=sroF8{xppKFpQoYMo%L7X0MuBUQ+}+FUH{sPfP0B z@yt2ep6AQ$c^+=h^O5#EUprT{{#2C?$_N%z=q!gU{zqh`zqV7V8L&Nd$D_( zdz8DMyNjE-esF#4dfWB9>p|B6*B;jfR}-8&aE@z|YYfqlcH8@~ z7W_q62Y#({i?h*L=A7dk50?E>o!#MVf`2)_bcDc?-!ovR;0DJ9j(Lu84h<~z^>TD_ z*zCXCe}q#D|7<^OzYQ$%t+g+;pKG6B&$6f6d)l40&%xr}3t-LQdfN_L&{l1m3u6O= zY`twR>#x=?t$($?Zhg*rr}YNwCDzr}CDwDnTHbJLsP79Zi1=UM|1E+4SC@c`cjvW*we`!JluNF5@@~8q zyL4sy>M(kRop)v6-WEcgX5AQNAfweW5Oy{cct zE*P1`FeO#i|6P&|-+OPiQsePEw|061oaPB?POqqdiS0&Z+ee*w|2A*@0j+GWiS^s| zVLN{J#`NAg=Pj^aB<@o_lPQ>%+d$}8JWQ6WjMlA8KJ`KY0!*0j2n zy?fYrR}+j}udFnP3WMlm5RfO7G87$*H`V2>ZYpndY>e@;AII0fJ_cU-b{lP;M}70@i1mui=_oy+Td58vgLam4v;<-@Uc>vw1nzpTKUS^E6Yo&)o&u%1G;eK zD=)@RzuKvAu2(*crs<#5jd+v(7vfh> z-Peebx0mFcTGhC?ys~6PRb4~xPosUh>#cHXRc(30>`FK+tE|ytrPc;s@R@H)&;_e% zZKc$3hftY8l<@_*HDPowDr)dAsDh!BdKjMUO+OWD(F^uNS1KE>phnQf@79%o@WnKC zk^KzS!BpJXO=I8hm58Vpo0Xv4CQ6xI!DA92TO$-O3NwAocbjVZ~*eS zPSirD$mdMi^m8P?F(;DWV5X8`(#%NK5y1}X9Knh$5o}j~Bs)5i z9Uj5PUqjCZ2#LSt8&*`6mN%x-P;+gBU%$txYRPXR^i%W>N`0ms&wkI)t8fbR99a*y zk@vTecear8)s=-W&8PYmEcFSH`S%{1PMm z@G(z%JJzrF#z;RDtNXR|fdUT|d>(v9PaY0{t)nLosKo}c$RHLP#C(Hr8HC*+tW*|- zu=%?I2aOudocde(ENkrX9#t7J)z8T9H8`(a*)~3m*%}IG-VbMB=!(AaFwK?)Va%pk z;mnM1W}3Vwq^bO882wWieI$&g5pVd8EUc{^Kn)Mcn)}*Fy%nQx;Oti4K=)R%`k_|x ztV|p{hL{(ADv8?P4dO$Cm}w9b4IdJ`G~d%kztqUnu6g9 z%MN-13(N9xvD9k)Hf1Znk%Y3_Aa>#+%2CRr3ha`;z}wsNF8q$4?TK^0;ojz+0@m}7 zxHh^bxLnScVW;&N_-*~HW4&Vn%&tFfUu_?1`_c9Q*q~3der&zTT4L>EdEauCWg49L zcN8qRXR2SScd2D+DnG^d^D^F-HM9L}28%bnX4-7>E5E@_|L?E-kTg`6M2EHDN()*J z3YNH@2#7}6A6ndm=L64Rhf3L@`Q)k?!yiIpb+BNjdrU5mV=h&V zjmyi+!n5$RL(|!zN#t@2&JUr{I>;hckjF3!Sj1V^2I7+CPf9;29Zom`1oPiR@4sJJg3kd598-@^C;rtlpUY3lCu0jus|%W~)=#>J)M@PEKeL6|5od(K9!A6Vd&~Qpy@hTC>pE7J)lDk{_LnKi_l>_Tj^lqX0&&rDQU6r4G`1U2Hwvg=st1AtjZiq%d@K9dzS$?dWhP=uo|)vAhJ@Wq3WL zumT55iDxMom>ZI&>$)ew^Ff!8G&02bGWp^L%!A>FXC`CGp8v#f?7#Gs*_}P1EdX>sbg-2vBrq_$Kv9%QD z4A#r6&Kbx+$m}@?BokuR5V;UG0(rxi4&0wx+1O=e`TDyY z)56MV__>M&Xna7XGuJ5Q8b&S}wJaSQLSuf=uA_QgsDwS3h5m52e%*iuJ(z0%bES}r zp#>r6XR!F;VD@nB;n}>bwfNz?Oc$nA7sgx*naj>xiOhxNpBIA16a`79{Zv?x#;a|2 zKwLtFxB}Kj*U)1@`k1CM=OX5uORgCUb7Tlj{oxZHRTG`XF3cpX5(}7f3Uf{(SEWis zBY%)Iwi0(5_ctmri#hX{b1bCGnF~}l8b=_AvDm3&j9SA3CjQ~;gXn2Xl)Si_I562 zP6u-)GACBTsE|VzLS)Yba%>NXZDiaQQ{(#z4ivgU&!op$yG5lHw62g z;r8~Vm>jlX4me0fquy;ojAr&J%w9k)uMO0djtN=xJi5o^v6=FKwH^8=j@}T{nLUfy zhmy-`;cI402#x)L5K&z`6yzpSV^vg>=)vp*n7t3VO%PZRQuV@&t5F7=Fkt= z_S!CmS@b4brEP(&$d+dtYU^(O-TIaFB%DU~lJ#-xU0^R@k98BAKv!)&pAEB4wdPm{ z!l`p^%WsyiEFW1;SYEe0W4X(+&$89h1n0_4v}9Tm-EeM&`DgQ2?oI9z_Z)YjJIDNi z`A_B-%nzGyH(z7kZeC+vYMy7F#1@;rG!JvHcGsBG%t>JO)uR4G{X~6ReHP}{Z-SZi z^)S<3r7lwEsFT#OZcQDc_E*nRyQ(gg^Iza}wp08A{w|zXaD+bzC$rrFV;EQSo%|wR z%lh&2`7}O;3w{>&u-{>iKnr_=J;Ux{H?b?cKX^a&{?&WT`>gi?I6HB#_Yzo1vCLcM zoeSqBj`n82UWo)aCsFZy2m2-7_8jp%0=DJ$d3JzZxkgWg=RD68&saDM@ocb*=yd{4cEK(|2do)gHtjP0!x!>z^-b>)lqzXBtPJ}DE^)( z{`x3>XB59KieC}M*F^CZQG7`hUo81t{nL=cVoK7-;2UvR4)j}ECy6{7gv63hHGEV_ z-Yxgr9|9UcWP@5 zb*om-hL8C4dn4IH?pcS!_vBXyQ%W$~l>S1rPukqpY%oq* zSDehFB)JVsJnKn(%ryPMHj;*%DNfoVoP+_A9wgl2UR=6(^w+u`#?zJQh~zW$w$b|Z zrP4Y+BNI_+e$B&^O>KO(6sf+pq^5kH63$H-Z*VZGzk0qJ&dsA}9r({_-#;fGXF6m)a(-pW{q6YC zUXSp2OYWAHh7wT9CG(?wa+b?##5kg|j26COCdK6!Nc~ES%TD2B3i_6Pp;rm@TkxZF z1ueLf{TT9bk>T~Dqxca~e3vLb4rg0remEM^`F`rW^p0{3Z3~g1E4qe-tnh|0^`pX> z;o(f@a3(xW=SRXqyw`*?)5DouLq3>(Erz~(bTjV80FiLswhC6Jw7o9|!@~Uzg0zWx zqk_+;ia_n?st9gAbq=(pbaZ(beNG!abWj`Jm6m^i1dvzP7ux*0>1fhCQ^9^Awn=XebGcdRl*cAS3Hg8PWLK2x}yw@}eVW44r$X(ApQz z6k2oZnL?{ioiTLPnL?|2oGG;O3^os$!EOpkP6s_vJQ{w(&t+y~E7YKSf*F zo22l#m?P_n=1@3uYdCXVICFJ4vn!lg70%R$GezOdWXa%p=s_fV5feC`)pUpb(3p`%MJ7Y+nh6;F2{?GO^zIx|9{55 z!amCOwe4P870my?Zrx@DOPiLb;a7S$^PA?&%`?ny^%Xb`y+lpn&vCGi3!j01XOFTP zrkOr5J!-n#G|8kYPbtBy(29=6Ku!n5kKtn=gVc&qYQ=DJrmf-l2JyqKv26n7uF8(ug?SGGnmb&r=LP(mT0`%Z>HLh6^EoHwUqhMb$bfa zgjJ|svPHRtGiRSyG%i(V<$!dC&*V!R&=0=kicbRK zBZql$yKN$!e>cYX&lcx~%Bbw3GqHQc$COD)yP0(5-=!M=OL9Y{lm}0yBW+My;}QNS zAU?DvGplhnR_XvyE`Ud3@$bz17YF~YGye_)$A%W`r3FVdMRfxo1{lX(btMh@GS|ku z)e~u2o`1vtW#ixU;@^})a8?K{u)*ke?6C0P0^)=4E^#P7ki!pTkt@4Iw7-T^DKSf4 zPGZ`Qy2M`mz#x7ggItU=K7>Zvpi7MH%s$Y&M7_^IqfJr0BG`-h(!me(;0K^rTs$u% zEw-iS>#H4D>%>$`K)eTYt)8!!9RE?RLoUsj%L+J0 z4F*Nv$B@r7g73@a`$m(?FkpO08glCz*>+*7;(bhv!#BE85hq3YOlR?ZL;1czD|n0NG_ z!wT70wH{sATR3dw*wPou1qwSWgeKtHeN5kh1K-0RQ#d?o1YbIYT=|%yX}ESD)3-5g zM~`U&Uz*OB_9GYL_(Nzu4j$8#7=7M?#}pbU><))nsVdk)T1B&N&|~qXe4~Re?ZTI0 zcvfgeM{4{Dj;Ie;Bb_G><%yZ(N;Qf)QsX$L?MRKzJTa9grjUzqazbc7uHD6HZ|c1b znRgD?A(2-)cw#(HgifZZAcQ93pg3{%8<$kIbuw=R#8C&HO*}!_%o8ru zfew4j3r*FtNr{}lg^u9$)@-6?9vAV12A)t!t{Lw$EF`VSd80D%ies2b+xoI|c*6O{ zf3i z5V^8_j@Q%1z71c(v>mn2F6@T^?1#SOVw^D{-HMzkDdsVI5!z?#@{F(s%6{No9PEcq z><0|Z3Kevu#F2n_K3s`(c5Em+mPxKuBEKUgUcj^+Dbbl7OJ&DW$kiXRJjkcrhwS+< zCBk($#=di~WAW^mt^-<=Yq!69E+C!_*I^*LdpNs$Fu76(e@8kT#l{)CwV8XSyo4x8_cXwuYqZVUBV<-nZ<^bBjKjRbcnLsz)Ktn#* zU651x3+Inq$nNaL?sT&|6WE=&HgQZSN7tomZ)o3i8J`PJ<63Q8(L$-=TSK`7mRDZ^ zf0yZK#lUf)Y(0bCuv{fFgQqY9Snpq6UK6=ud=;eM27l{yv|yaP(CD^&!c>80{z+Oi zUJv6)DLv`euOCSR5|2LJZCzSurscHY6^Z))kXBqzQDTDvhQwIM#=l}h8 z&N4K%uHZQu+6nCh;a{}B5WcIuOZaE)&xG%2?-0JNy-oO*_7>rvv_BCZ*Nzjusl7?~ zhV};G>)Pvt$FyUFuW7FlzN)=S_=@%l;Zf}<;mg{~gfD3?5x%IsNO(j$LimFA0^#%8 z^Muc7&k-Kh4ii4BJxlnE_6*_E+S7zjX-^S8sXa;fg!TmCYIM$wHba|1au#VtgwwU@gwr%SXGWWy_%QMqj?D3 znw!w2xd_3;E+H7sA+&3DLYrnIv}#sDi)JA-Yi2@KQwh1o37N(SO`3^N(G*1Shxmi= zckw&nZ{jz?U&XJ4{}TTq{6+ji_)qaq!k@*@g#Qr#AUrKj6aFNABK%SONce;Jf$)3r zJ>hraJHl_pw}jt_ZwS8@UlV>Mz9Rfmd`b9s@pr;6#2190i_Zy9iBp81iO&c>6`vA* zB0eGfSbR+Qk@$%4Ll`qeeg7u@MtD-3B>X^pK-eN$2ty)7*esd}-xu!_z9-%z{HypY z;R$hq@Gs&ogzt)X3I8nqO!$s?hwyFjHsM?1Ey6#EKM@`m#|hsQZxX&C-XMHkyiRyb z93y;9yhiw{c$M%K@e1Klag^|7@iO5{;w8ct#fyYT#1X<5#0!Mai{}ZS6VDMI7KaI+ z70(hrBc36AT0Bkolz58pN%17%6XFTN$Hn7>kBP?!9~F-hJ|Z3=d{{h8_>g#r@Imn) z;RE6U!u!Sjg!hU22=5j565b>3A-r4MO?a2Mi||fyC*dJ+i0}?^2jM|+knnbKJEC^0 zb}Qil?Ev8|+AV}PYc~_#q}@cgU)xW3qjn?V4cZNa*K5}kUZ-70c&&CV;XZ92;WgSd zgnPBUgjZ`<6JDiVMR=ulCE*p?6@-^-mlN*M_7GmCT}HTD+fBGj+eNrj+ex@X+d+7# zb}8W{+9ibBwe5u4v~7f2wXK9(v@L|2watW^v`vH?wT*-uv<-yowe^JSv~`3*El7B= zb}`{a+C_vHY8Mh-pj|+?R$EKBMq5L;T3b!HN?S#^Qd>#5LR&$&Tw6}qq%{#XYK@5E zHgOx_t%B-D91v7L;ub;mBW@N{KjJ1q^&|ERsvmKqp!yLv2&x}(y`cIL*9od0ajl^G z5&HzykGMuq{fNDS>PK8HsD8v%g6cdp6;was5<&GNwhO8su}x6@h^>O^M{E&PKVq|>`VpH1)sNUHsD8u- zLG>fn3#uQnPEh@bprHB@7YnK%agm_<5f=)oA8~=8`Vngd)sI*ssD8w1LG>e63928l zQc(Sf6@uzVEEiNiqDfHwh(@8;PlITn`dKEH5!Q=(!a7k$SSxA?YeWqpoS;NlEvgBZ zilu~AqKdFmR1z)`O9(4O1!1`;CoB_Xgr%aCaIsiSSRzUY7l}oL#iE$-d~rVELa~r= zfmlE|U(6?*C*~2JC(a{0SDZ^YSIi|mN1Q`AN6aCdEoKwW60-5~k2*-=@gyY0G!U9o1m@o1P^F$tD zuAuY(a+TeR_i9$?{m-@44@D2f;dDg6l0ft9^pY1NQc6oC6(ya~yO8 z9O?Fx_ABg#c9ZQv+qt%$*3YfCTIX9;%Tt!+mI+`(|F7oj!P@-@vs3*5*4uAT&s7KV zU-@xH**4Y4C^P{ubQ&4kKi+Ys6%yT;$l0Hmr_L z8LTaD!lO%Im0o@LRB>^mqd2h`Mxtwnwcze|eUL0%3{zKaXq`4VT>Q+bSyP9>pA=ti zbBB@2@N^*l5KPyR_=!^oPECbB3?I{i+ucEY*g+H}{$O2v7~?GoL<>K4p<`;oR1iKe ztYwfa!)_5mfbfIrG_7qPme14=K84fZkM>^;ZOLpm9SEO^=>m0i)yrY_2IkLtq^6{v z1%K$}Z^5nYATMlvi;`CZc_);kEp{yKi7>!jGz-$}+l5%_WP562Di*iaqVHzmB5z zgQ)NziONoKoe0L|>U4lrTzGa%wHDl=4INi(SD8>7*;U%R+Oew~)q)$dp-zWTGr$`g zufwjj$vm%ccK-CjX~lT^DTQe4dLnGzvs-&waeMo@EplTvlqt=!v@WX9y3}Z${wHOs z94Ju^oJTH|>*N->ZyU-rJZoq@on_W%Dp%#eaOHp?7t3~B3vS^CEn`m5(>m28urm~{ zazJ_5p&aP09KiCO*n%6m@dG4As`wf$?u>0(**8MjH<(-yX+>cRZsrD&Vpb_=aUjya zY1qm>JP&VQZ)G30?TIb8ryKH085A|&rFm<*<%8t;E1G7Lf%!I7iHF&%EBh)}c2}-U zQLaP{$F%5syiEh+qgFO)o*K=a!1AMVfV26wE0=dxw)auCmqHF%EpC#WG)E1Li7_kmS@<9tYs2tZ zwk-~2Q=GC1L;Nkc$D2W0i(W~m*)hF2x(r}>nX;i99WVxGdSN-tZ_#&nn|jjGZukHg zWoUyeY@J~RDeOgQ)O(ZiCcTHMFR6;?t1_Ud#*Bdlh)QsX63kG7gOwmA9NuEZ8nT<9 zhD=aDVUN7EhDS?xp|aI_VZwzd*0dH2RV~+sMfXsanr(LMo-yD;(F!hj+OqbJw2mUDTs11`lh2eT}W<5RnIuCh4$*?}#%kGtLPNfV_28R>h{)!Bt){}x4$-#O~t+*wof_~lJbj}sP| z4hUULF-j!=fh+o2g8Vy$Wk5>1OAXly*SgWUvUC8k-OiPVH zE*@-s$HV)$hq_-=_otDIaSB3fbfM8MfZiXUQ`!P;dXmv-b{4*f_5vj_W(dwEJD!NjYRUN7FGp6lWl{K2WCQU_GS7l{Ks{8{~ zfyHk6uY~d#Ro19CIMg+X>KcrL>YJ3g3jY6p@Vc>Izzn+trUVqfqU_f*R^t>KQ9cC- zrow#{pAv_Rg3**kin0zsvDq+4#URBNr?5EY2TJjQr|w`dUVcT1^C>oNQ-VGlWn;pS zIJL+JTN?0EC2oWy1;7W<6MX$aCFoZUBNM~|h`7K9Mk8!~_z$GwgMa!(@j!G%;ff!a z!zLwJ4+)|tU1}VN9aKp;(oTUO)em7l3I``H7>q;N@q)-UpN`-%lVVy2h@_&V28oJO z`VjiSRiSJ;A-547c~i(kzx-wf%A>Cz1b_=D85jgkMMqhWQ53t$&-@CMu^JD0fHy?u zK?F+aLrU>0%2r)$@`S7)^C0*tCJ-9{FQ()L!9Pg%@}Y-KPXiu!`7ts@XNnC;VgY@= zIFpLG=;4`|<09||AG%l{gDL<*B@q;x%vA}>z)pThZt@x8FuzT)fJ}6$;4c-@Qv+vH za{T~`EoexR36vhoXf2Q)8mnTxsSijK^l$Qixu9F<#y{B zae2z;*5Np?sl`6%};zfe&1r{OH=S3D5<3D=y5x2x0`$D^Bt4Mx<*ax}C83 z#8GGv@{^ZON4SH}53QSphXgOfKx%e+EL{T>)sGGowGRREMj7$Kd$1roKvS zrh*S%OphuP6hW5-Dq_xl_=mEQa9@U|o(F-~eTO4o@87?2AAf~f^1z3`@ zsOAHJYdu7ZEAl~3eUSwMFTJOQSaA6%Cm@2zLDnD>^b-4#RDxJ+trw7#s~>!P=nEpd zARV+vECoFW;ABURUV7ET>j<(07NcPnLChf8hkYa50xy#i#||iqk|`rU#)P}sfiJ*^>CGvE$L?TSsEBGlcHbHzpP(CUV$iUtG zRD8&&nUs(2pwyU>-ftjC9Q3>!G4dkvW^u`YNaDxC^OVL<9){yzN1h;R>jioGpg8=7 zho3xj&O{nPkWYb58}g)rQS%gs5u4Dc^xb;7`rsZYq0dLp2sU#{7nTN7_>qUsKZqGC zi6C^`M)2{&AGSJ-QUrer#R^FHgNFF%4wE6(2@eZ}=huSJ3BEpoD!GcMAD{Y~bbB zX=qOnheV>!KH%`J2l*-R;)DD9!7(9kQhY!{UeL*_ev%;wcZPxlX%zUF0l;K%F+cbR zmDUTIOfI(D{VIGE;HBz$5v@CrArPP&Uf{xQ5U}i_W`js0i?_nd2IY)+wk0Uj?1l(^ z!3Sf|X9Z^Hqxkd|mf{~(lw^pZU{pN|KZ6{%s6`1K)Bg{HQ=-^jlG-0wXU!iXVPC^k|SfT-XGXRa6Q7SWpQb1Vxk} z@D4w=J`?2Y115-asYT##20z(yFb!Tla;c!yJ`UEH4XyfBM-wdDMR6ACrgXt z;e!RLXDdrloZb``htYg}GJ`*_dcTKSi1qI?A1~SR+gIU7*+KT)IzP0zxK0d;VXKm- zf_%`TAWCq9BN?CKWfrCsKt~6j&@i!O9|p~~!FNCA0KGbtnlb}Y`vBoG!LLCUAJ-Q{ z{h$vxe)PvnMbZb)j}LB{3iXPfkOzv>dimfr2Dh=n=l4v!r=LPlN_jbWwrK$$VlqEw zzR!Hnyx+X{f3m9k|4X|D{yVGF|Npo*fe%qnswX;Fm%mc2Rm;Hu!Yr`En5&M2C8Yh- z-f9=ssWSdg{w@EEx9~snWBdjF1izmjR%aZ*qXIZ-PH0vTb*RcpXauXk_Y<63LU_&pw2)p(eKl5RwFT~n#S_W+d&+yCku0n?YIl=e90gV>jiw#n-U+9xKm=C z#3d37BxXyr>v-WG62Fo7mc)l7Uan)7ykFL{l7B|xHi=s$Zjl&}DDR)OQ0IpZ)NzoM zd(dl=e^law5;sfSByqjO3nZ?TxI*G`iS-g|B`%d%C9zWC66o;{vY~@2Bwr@6RN`WZ zizG_<2hElI1c@Uh4ujW%naSGO>@o=WmZ1k?)7J*^g+Ulibkj-0=Usz1Y7j3Qgi-IC zUNn53Gl-iE;(CL)#vt|@#1#gy+aPus#7=|QVGu^^-L%E<*PfhuZ|adAn|R9MV(@k5EXNn9tfMxuOf zSIK-=$$nwgVLg16EWcIqxmo3x{$nMM(Q)Mu68|jm9f`7>R?2>8rPOnU)N_TV$6F!G zVY#fg<-2wN&Lwax9nSxqO)Pm-V{bA$e8DrawuP{ZZ2sl7B>^?3bGE zk^CJJZ`H9;=HDR8p<#sX-!MdCKZ!{adr0(1l=3uKbbgtvzhys3{(FhvNR;KdOv=6N zdg(9AX_;(S%Vht#OxEu**?%r;knv?dxonZ-Ww|b!CwW=Eb@Dl=6S{w$?8oaeB%dxZ zP2vEFsS^83l;u!&w&eRtOpz#`vpQMtb-ks3Pl>YJ>bT@hI@ZeeTDw^1Yrc~BrNqBW z{6eC9E^AIn{xgYx(Xo1kL|HD?#gac?qAZ{4Ns=#=I8LJMN2>EBFWW`6Y?swzq<@Y? z`ChIbCHX9g^8HdR+f(&$=`Y(`^-#&nc2+%D^0J**%jc+C)?2l#uWDH@)jmD`QrW(i zekXa^zLy@9{5FYOCCYwcX@%tFd$Zzwov)DXt74hX&wp3PxgY6RB-=reYzIZM9TcU= zaM=!uWPe*Ec&)^J60ecCSK`$YuatO=#aKbNyp@;fA6 zDsi(!`F!VGEcrDOS4))7cg|AD%lgVGmi)OA=SrL{ahAj)iPI%clQ>c01c~D%=1I(z zDBFFGY~MMfb^mPH?z5$Tw&5?^f3|G@*|L3S%X-X~^_VT&b+&BR*|I;%9w76V?IydY zy zg?l^fGg#pcxEH(6h5ZHv?osYccRzP8cPF>a^}Fjw*B7pnu6JF>T+h26bKT=O?fBC1 zq2q+(4aX736OQ{Fw>hqJ>~U;$T;ynSEOjh$oa30{$a9Qz2uEK>4@aECV*l0tz5SHE z#r}@{Rr_K4Blf%OH^bijo%W6PHE?=Cg?)j2rhTG)jD4s*&F-@&z$7cP{S3AZKeoMR zJ8pXkPBVDGcF=Z%?F!p=IL}~(Enr&=dmg6Q3T&fnnYMnmUbap)8=P$LqxB0o+u&X6 zG3)cz$E^2Q4_NnEcUw1GFR(UPE3M~Shg5erzToGmR~I2T0XTj!!OjM zaMHm;mP3~PaDw8cmi6%awANB)nP(}ojJIT4QY~F9ie)hTLUou=o4+)FXg*n6$Gp{ik+}&@K3HTv$2`THXC7%5=Dy}0<~TU_;8*o~^_1G8zN5aX9#$WL zQyFho_o_S9jp`b;9&8vca2;^%bM1C*c3t3Va8Eo|@5%1$0wIBLZ9)PG$IdJyRnyaGt<>w-P=7oUA3R>3_rKB8R1!tIH0FGRTA z5$^d2w=2Ru7vXkBxMw5WGZF6T2)84`Jr&`ejBwi{+_nh!M1*@h!aWw@9*uC1M7XUH zZcBvQ9N``&ZlIzMA}(9e`xDns(K8}kI&pmzJvGAhB~DXxZ-mo{>#69yBU~@yx+{7z zafynaL|nY0ClJ?J(cKZQ3vulgy+eeHBd)EY$40mq;#w(sn+VsMIHu^v2xmY}`&-ea zFsJ>OxIYx_uL$=iala|r@5KGAXun3dUx@ob(SC|>KN5Fd(Y}vx-w}6C(Y}pv-w^ku zqJ16Vz9Q~(Mf)Pcoh9y5yY?AzpS03GCGNw%+9$+)tY~M1%%Xiv+-XJoC?Y#eT%)3e zBCX+IM zMI*cC9NE3LUD3$eIY-v6J+5eEzU zZiS+)B<|;sz;NPK5Ijm#t_6B3yssG88QgrkuGoHcshCmC=wMsOL85u7_lM~^6;cO%?U;@(y~??kx6#2r*TG;V;SIuDH- zoO>g3^z{h$T7)} z<%+%{!re?$OWY2{L!UShMcVTe$$+Cz9Ei&7*+w$p z=o1H`9D5!k8E}shw?Xl2jc{8c9DU+Ilv~fk5!t2)_fUi*i-i!d9=dGz zddNCCN7l)?`{*jb-Amj(iswHOZZ&bYDW1C{++7jw&Im^~4sk9$x0CE<#j^@I9cI#^ z%pkipa`cu6w=%*}uYmZ7p5-K4rg*3?K)gXuFe0muaMUXx%AIEk$$+E2;HgtQ3rPmt z0^({EPi=&oPh6$qsg7{eQ#@sgr-Ed_QBU#ARXo%yJSB>UdWC0}0=q2v`h#<`i7Qk* z)IU50if1OtfSW0c&Mjv?n=scx#FQd;{k38$u3hoa2|3# zR>uvFd5)_bBViSv;%Miv*nhTvYJb=MlKn}DB(Tc9$X;r{(w=WmgO#N- z>d&YzqK-wq1fB)%hv;uDUjuI|dz42Z5@CZ<2dn!llo3jn z(gW7@3Pd6N%=VsbzwHUzeYWMcI$N=Al5McfYwKcjSpTqoVLfhr#k#|~!Fs!Ov9-)P z4c6-etR8C@tHbgKcq=$=dBw8BvcYnjWszkbcrF-jNw*|fTEn--=gcR~ufke~LarUzloy~I>unqe9bt8E=33_6T|7{4$cH@;$g z3gQdiYP{Y!$9RQtIDDg>VvI9Jf%k)R@J;qxhCPPI4fnx{x7IMrFwrpB(8u70D1v{& z8utWyg+0mEvK0_LzL-sBd8`kMhs_VN{GI%f{Eoa2nn{uz4Y3x6d#nbQD8mwlIT~WZ z=|V?NQjVjcZ8$yMoZT_o(GVR@UuEvxv9qJ0O*lQ((Y9+_dqZnT^9v4~q{gXgLn{mJ z`;rHI%;IKroS`%tPZS-!cWe6usS zFf8d}mSbb&SVwRHm%z_}PUg$IU+xIjh0`5X@bcye)`rvV&3PU2?7{hv<|hnjHz;tnP?b@!_I)c-~=^Je`6J|Ps)57Vc=4l!=1NhXvQL_zp?Xn3KYStD!Nw zL1Rt~3$9|F+aAnD_KHpw^%heJ}kI`bp&q|YVfkKU@CLBO$3t}7ZyxmoucET z)!^8$U<6B6d#kO2W4Hi(;`YyAomjE7f)%@hqfrJe(3hpN88g`oS8!BVq_g(ynyc6~ zuHeY9s27|$rIt-`1xJKMJy}~dEyKb$EU2HOe!*#uW` zSXdOzTFZxuTA4)O^#I0z)%2DAT?w{()XsKJ3@ z!SC{&9c8%Ffbcmlo2AbZq|cne{$a^WW~nhrYIFv(!;%-x(%uAVuQQkxmOO8kwk1g0 zoWabnWT#nL8ZRxi2QxszjV=4x>w8{r52lBcPuKRSRfGL_Rq>;%SVHfV-fA!{EVz~R zNcJSF!PKze7S^kq-c1em4GUJX-igJDYOqgOu!8kYC{9p=-mu_i7Vl1Ut3f?1Sk4kU zCxJn0VZlwTd&i89&Y&k;?zGm1rCkh5ox$EhlC{Yy8$0lEq*qw7+A5vxA)R#wdxj-J zt8^+!I^_)Z2ul{Wliunnz2yw1geCLaNpE_kH=V)cu%xPu^hOWq4QH@>SW@0bdOcBk z-4*P{3kWTiRl?$>ec94}HJBvIoYjkUY~8uF8cY;|%mSuPPnqrvb`_V&IM-3uvt->B zOc0kzy_JERfdpxzD;OUZ-2$Qw3DO2v&>a@71kr;D(t~QSi@0{`V3r8pC0)VJ;XGaz zC2h))HmSi*;XJ)qhxFuhN3bKmKm7Fl-CEbB&JpYoPXA)A>Rjar#)Z>AnoHazj$r$6 z`aARV_R}4~cH#85=80`#+zL-r`hH{X+^MrY$R{fN27S-9ifv^N@_7m-zjnlc+2b?? zs?2*9x=$?cJ~&a~l2Zyh+JPN)2KiKlSF88^X!)^Z`7t#JvlZ+b-V^frXnDOeh_e;g z+v`2XQs7=|9YLI~0PB6OM?pq`BZ!j~p5AUA+-a~Qh*K4we!@Jk<3LA{PgEc&dml4r zw$F3~VV*+iN6e}1Q`I0&Quy(8tZQNh7%)yzxL_@d>)NHO8pH_-7d*h)Cv-`01udfX zz1Op7!`+F7yInz;o}h(z7qX6q+jtf6ynLuXe#OjJm84Qp$N>tKj;)x%7MM7>!TY4ZSSv#TDaDkMtgR;Ym$*27$d zM4jRF>=hnqg{vMWDz36*cQeJYNS|6Uh=r6LQoRl23K0JHT_pl^iichVF*$Z9c z1(q}@Wsq7AlNS=~W=R862CDTicOk*^ENMW>0JR>bE+p8+lKLn2SLtWhLg2z}=&*YwJJx ziNz(vC#dz|xr@G$x%ou2ep2`@8<;yTF;1%(&w zeI0YhCdR7u;kk>xmbqgRW7PWa+(mzYCNuTnxr=^3b4MpetMxc{0rm7-SdSs8U}HFO z;ewT{$KdqAuKMt_MbBed@@4(y%Ut#0X^Wo8y2yjCk_S8MVcLR&oc3vVY0VI6jjJAJ zE!dB=Qr3aJ)SbQLst-?Fw7DSK--GRU)ej5jDrTM8?tHe}RS(k^I&l)~!Zs(d&1yZL zxA3`yrlMaKzWz5D+e(gKqP_w6zd!%C2L5ji{QtcMZk_B0?;UG<`2zt-hizp(+<64s zTfx_Z$(V1J76;t0-4eDS!PX|@DyXi-@Sn%`a^6 z2lgJh-ELsu$rfzXbCcX=T%sF&2?0q;7{#~u(GFF3J1JnZ>CBfS$HN)06$*}crThTw za!Q1)dWkT*hAgdpke_c=^}&S$i*XB-G1i#Ng?vAs3}_9wVO|0o9q}|7Hemt7FV_xU z;Wpv!DcFDIhP~==Q@6w#R=|aQMu!Bu9rNHcw&xHoM@eJ`gi$mD#}kGek?^cEbm0Ye13nVHao4D%hxn z?ggM$lc8kNR3;_lKsCZHJJ=ltE)?KJE!?%}25sQ>?PVV#FPS|64pb$$Ae4@8D)ULW z&ynvbwHYDiBD|*#rz8jX)!@g?_oqQlD7(+i+;CrhiZ7oRG2oVb(?Mdi!)@S}TtCGp z1*W?;!->4Yj52@Oy%ki0Taxmn98d-r$OWLdpmlk{0$c)nW)lM(;e38$Hr&m#axIL^ z2wU8-G?G-mN^-};0bVNRbDP>?@m$ifWp1Nng6-i_56Q>f7{HGYet`>c&ShmTs5YC) z1zW{oziWVB!EFuz-zw17xg}R}6|5ScH|3k1iyEh`^BIl0Pm-6-Ej?v;W{fPQ=(biJ zZ~W={=ko_GaT|T+(LdkT_V|(Gra6cFm+@EpZ9eg`3$e6X$GSEzRk7lSQ?ZZA}a8`?Dh+3I0u5>tEu+a|aPV~dT}JU6c*w`}w=z7IIi`gW)+H&mHq z-zG^>u7~pX!Vw>&L6!jEskcmwU<^ z?t&eghbJv>C$aisk zRv3E&un*QP+oxOGfvQj!a<6Sr;ZRHPFRjZp`h0Fc=wy4L;^nfyVh|f3r-EBao==yUr0j)#zJWj= zmswKT#_5t9F0&kRLFG>>2;@T!$rzB`QX!0*4R8hKw($lrOTHzTNh*Mixe^vvGK_Nj z;7$Sl8=sR4BVz#OqM(sg%7r}eV@Q^y49>VafUQerMM{8%^}$`GR^Y)%a=o0B5->({ zzY0(e$QA%Kxsgc5cHp!?=IRBkP^f?;^IA!TH2(=q2a5`@RlLK%S?~uJ;57oQi;rPO z$YeF<&{bhW`U;sHv`NO+QXtRfHtLdf1Rk;)_{SOiOoxAdj?@k0K1q&&(!#(6LtSFP z*k>J+P4JnK2$#nJ74jNw?w6%xgQ+kVJ`QqPx%v4}hj~y6_<>&J2D@;xfHfbwH#c#} z0Wz1A19=Sfa5E5$lA+`u!D(*EWQBJv6Cj_YOH16YeE#taa$cr@s}KqzxpGa?GIJ?> zus7IC;pFM?-}DD=e4zwO!auFxhhL1qjSSD~1I{Rij|CuwKX5Dhfew#9VA-7W!9U+! zjs8=B59hP8ac)S0(&8qVK;m-?p1HAh`DJ)p;* z>1%A4nqZS=1lqx5G66iojbCM#@})HmT(Nd$)TjBuc9IJuK*0|X)PWq3-HChSp>$k#xI6r~Wu6s( z6g?-=&5r~mIS*=scR|^>*9TYQV-a8f`=nix^Lgid=OB2ee}`JDYL0Im4?E^KlHtw! zjrM8w*r-!cx4`?|it>U|s*F^++rF@EwJo%zTYs@0wccVKVL5Ag*%Gj{H~(aQ2fjBS zWllDI2;Y+5Vj5@aXgq103uBW6?|U~G3Jq@fu6rlDlZ|Jc<@e<~WWU@)YJ>v(kALDD z$pNC(;oy&i|MC6q(B}J7P3$224R5R=XN!)u;XFe)V{>RVeyv&=2Yyjw*uj46U~&TZ zZRK%;6MB`Q$Hd+P!;yqj;xI>UV>LQlG<508FTsC#9x}7CCXdY>(Uu)ZU@meGydH>;;IyfIZz_*AT<1BvW_$_}() z2l&DGMn7KR5|!llr`p&{@R!qAih1OV0^UMvl=@>0k+vupU0ub!8}rtH(~{Xst=UU) z>?LZ9c`e;%9>33i_{(XW+tPjJwtS!cJ=y-&Y=0cvPxqPA(tYOmQ?2YpxR1B-TF3+5 zQ60@{`dYtM(zK>?#*gpJ_Vi?XavDqUx`s~8YPy8ibWT|L3+j4LZ?>l`+tZQlDVSGX zHKeha^ozeRggVq?G3dv=*H0{{fLIF!6(v>0(;^XwO>FmYw!016-I49)nc^E~x1{52 zZrHovZ%*T^cBEsZH!ija%bo?^^3k%}uw9ebuH=MSa|>pJN#_^UPN=F#=AOoLb0!R# zHgr_ZunC?SMYBsvlT&(KB!<|p$tfui0D)g(P-79*PM1#n9{e}lUyCm600q^xqO^V3R-#DYCTAbleb+BjPFS)TmlnOmzH|>)Jer>t}K6fkX5+NUZCckky6{d@J zaTQFzunMXw3Q8*rW>&!fSc!E3H|oKjiDSY0tJ! zWLuLHAXbRK42+dNIjV~0mCY@vD(XG3W@7DxlG$U+DzAjl^+mN1?s{7I;MFOe@Z_Av zsV%8IwI!9Ibd%XuC)*m!wvx(IT2f~US7!_SO>4aTVs*-eI+y#k$wHkiW7!tydPPN- z)MaQKUFhW;tMRjcI%{C<`6c&}izyi$+ zOeHiMm*zB%Z%NtlEi1c8W1F08Q!LxWmF?AdnJ5DeP?3%-JG9IE+E|FT4hCKWaY@*E z4_nXrH;$w1tu7p?ZLPF%JbOtg1E4^F2Qn zqV4349Xny-w4r0i56Kyv&wcZ+x3PzSwq@&i*qivqF?jYRK9a}q;r$NC>TVnz&cnZ8 zis&Obw9)=lc{}79)i{cDh|Rg6gM%~vQGRVC1WAB?Bh-Lk79z^c1TN(ob(hx;me&qK z%CnAW97#H*U+m6X8|jb9%^g0jPoIA-Gajd9O$J|it^7nQd2N!sc1B5ApUlP)qHOIi zC>ulp8R6IRn>zK*kQe31iv}Pir{0aj>D*@i$+hA9+?JeryX8e`@**86&oiPiza@q8 zp^?feO8oFKTms(R{~52FDzr$xSCJQWmKX7ynT^9*QfQc88`4xET^^k&k4{4>6dKx+ zLPPnvEh*Ga9^G3Wos5*{$!#1$3PDV&3mvX&LntN{1obH?g-`QY{-%nImKQ4W=op#D zrJ9%7nAegbd44UosUjY^b-LWTFH)h%;Fc5_%+GB}kr=skPq}qBq&$zWF_#qS+DwsL zPy||Jb`iuW0z+-8Mr(PvBDao~Tl3?YjX5o;k>l3}HC3ahv>{d6pd%G(_*zoK$Iop^ zjW*JTWNAZJq&&}n#zCY;r)Fvl!uDvUgS0_*D$<5l(gv>J(8hsyzO83>-pBcGcv3ac zA3J93#GLU{r;VGGJ95a>zJ2**F=HCUao{U8Qv{X#AJ1*fpyKnWK+qcS6K;zPD!vF;$LHr4#H*{8mMhimt9b-9enx-z_6XMhmpl7H z{J-_^e*aW8+VPrWlVgcvfc**k&Gw;Dzec?qb!${glu6mET&GM?+Q6Il57?$c{J#&a ztF42rT`VUp4VFSn7kGDmgZUb>!4xvxYr5JLZ+zdl(l`WG|GNyc4GAp7?qOH5cJg8Q zPI(kO)HsMM=>H8QGb94&LEONmh6xSvlpl73&dM*ETSj47`WhzpH%!hzO7;}$6KRa5 z=R#vV$6FhJM|U@;tr} zMb?v>_l?J!=mJy4rfT#vOjHd0q7D5>4IXL_iqc$-$NaGIwy7HIhjjKsU!+0}9%k>7 zYCOu%ZBY&OLr?ZYH>9M72*1}{jYmL@%IX>ON~$i7kimX1q$=!(X!Zj?o*U|cMUm6+ zITN?8a5vlPhh4*_!T(G#hL=_qRq%Lx3GAc(?4uN10=02(HtMTlsQAi;SRzcO^5RcvmmyE@kYouIYwVUyhsFs*a+u5twS)d)+S)OZ1hzAPf)#K$?ny7 zY+|2vV4uaX&*Io;JWFP%tGLdE0}CukHsEz;L1?=|8d*&2Qz!dWVV|n(Q!dU9@rZ&@ zhPGWUF2jR(E>}8SA8_YSTCq=PIJgdfNWVT?hW452D78cx>x4K39K`-pvKVIOs7 zAMqUVAqqHniFx}vK5st-e^Wv{${>Ht5m~m+anGPX~)R2($(R zacR}8}&b~2isBn2o=;UyGU z!xeZR{>Fwx48ngJ;WDAXfBf2Np}_n7+57O&x4Hs8Ng`|X-UEjfRbelk2vT?e7RPwL z+)%rgioW_^ivIpU_P(9HAI;vUqEqC-OBDScUi1_2H$KE83tmw7my4p`?bq%SML#i! zo#0PO78K1bfibs<360K~GA(!1*uf*GO&ET~5GXy*nj50vgO{lIyZ)v0Cvw;cJ3A50 zPEhH25JCuQ(flidJ9+7k!{4Nkh$i??#fL5D4!?H0DE;wVc3eE?`M2T^8#`_SD8O^) zhFZ5&{kQ*%0>|^%aXUL6&5n}-ty)sxHm<-i_!|@A(E=~1ehj$?-FKB=yHzM~ESnum zPAK)4&V)ru>1;5b1YP{h5ou@5AcGLrwPMZ>DN|>lE3F+?n1{77zy#|6A(2VL^u3;Qno%?v3Q7q(6mcDY}>Nfh?oaqL|vEQ~AIK_kOt z(@_$7>*%7wl7dp+UB?wvRwbvvh#ANDxw#=*OX}S8FY3HIp1o^l??$tCNgW;|@RI5@ zaCMHt-^h^VVs(ZKb%K7aUZ`_4gB?vyfM@@(R7mK>Ka}Xp01xN@Pv&u~;dydH=9Y?G z|1ZTpn#GRV+0kfrl#0zm{#~-zH}Ya1fxpE{$k^;Vgz#5-%lz6>QSc+R>_~FLTz~28 zGXGq7j+D@gN2x8%fhXKGMV^TzWyvZ344e6&S8_^3r=BJKQmY^cbVYLM#D5;MR8A@@ zgvop1C}=P~#PU1jh72vKz4TwyKC*xvv9lx5>ri;DVj=hO$HBv~yOBDGA{-xLJa6)_|#Spwip6hvwzXpFJ z8b#Q^f5zuw!cedCYYRntzn0Ek14C`nT>OiLf4@B5h3uOQdf&o*ZH+tQR+iu*rDWvGMGD+_^T`VOnMIQ zWB<%Wc#2Q0@Y6kFpr8ytGq z?O#NViW(9%Fe)AV@25m1M0Efkb&e>r@?Ygw@H6nGaz^<;c@KOFz6#Gbo>QJw9#J+b z_bYcRw}R(^#mWMuQkkn1Dc2~ME8~>m;9oFXNmY6)-IOj$JEfJPC=7$+vm2^ zw)bsEY_Hp1w!Hwp2A{BPwyn3VvE5-?VY|_GgKfU8%vNHXVY|{c(KgyP)HcYL0X_?Q z*t*&}Leyo|X0b`u->lzTzXI=rA6k!D-?kpK?z8T)K4pE>`VjaayvMrAdXsgDb)mJ& zI?p-_{2ENLUS=HuPhk36)4;z$cL?F#9{dr4uWHL*mY*%(!kZZ%!Lym8;Fa(d%O10{|>NrYg|F&3xAYLUTD z;Sc7o&7YbZ&Bx7$!JGbm^Yh>#;W6_j^IG$2^KIZ!e<}D%s0N>fv(3}ZQ_bVStA3t& zfVrPp1K)-5<~WG^Z3q7ef17?Woi}{}{tHi;-Zi~xI$(Mc;!bQgZ8dEGFNSx)`yxS8 zz*Gl*73P=<;px$2(^yl!DaVv$>TBv{N-}k}e{4Sm-Xz|%AF#g&-XOQzx7s(@@3Y@! zzr`N32kdp=zi^Jd(0;XjvVAOgnaHtc+53VQ!z6oWd#v4Mx7k_LA5lL>odaKnp{Ns4 z??k-@-Y0fPJstIU)WhJ>@IO(vN8KE?Eb98Gnkau%F$D6yB5HzKZi)pziZ&Ai4-Y>Y z&lx{6h9H{3JK#<6CF5@6)5gb*4;$AR|6{z}c(ZXC_BnCI}ELBDjIzdV=c+77{EVs3WK)m`_kcP|cxSuOg@BS<1hB;zE+3W1HlN?;){6PP%Z>0q=R3vAagWz|9-w1vs_=VtSf}aR}B=~{gdxGx>&J%n~@D0H^g0Bg_ zBKVTv3xcx*pA&pW@F~G31ZN07CisZpG(m`Epu4+u^XoFsUk-~_>Of@1{l5xh%q zl;8-#I|PRb-X?g9;7x)z2wo?6jo=W$L4sEa4iLOT@G`+m1p5j05$q*+kzfzO3k16f zo+sEv@EpNTf@eASwPy&PCfGsn6v2}O+X=Q2JVEd{!D9rE5h^%odkCf+)i*C!774V32q@+ zNw9+8W`gAeHxV=t1PSU1ZX{Snu#{j4!D4~{!6Jei2(Bl%j$k3d0)je%T7vlmH3ZcJ zRRom;6$Ir3WdweLQi6E|a|z}UTuV?wP)snJU=~3UK_S6Rf*Aw_1k(wo5nMxXHNjN` zR}x%7FqL2m!Q}*#2__LtB$z-jp5QWqaRg%t#t@7q7)3CWUHLO zT!I_|AHg7kfdm5x`V(XmWD#T%WDuki^dm?kNG0e?(1*ZFpc7~W9)jKky$E^|^x)vv zP!)KAfl{c7Uqe;kWdIVQDt--Bfv?s{h^qKCRK>5MD)3D+9Ya<88ma={-I5Sh@oT7x zUqe;=8mi*gP!+$1s`xcj#jl|%ehpReYp9A}Lsk45s^ZsB6~87_Nue7h6Lcr&Mvz31 zNYIrafgqm1P0)p)GeIYUjvPw04g_%o?Frfu#1h01wB;~QizaA8(3+qXfs4S&p=_<`Vig6{~<6MReX4Z%5ruL-^)_>$lYg0lpl6MRPSDZwWMX9zwf_=w;% zL5QG{;6s8B2u=~4BzT|T1i^8>{x33~kp90E$?yMgjJ-136k9F$ADnI*2XO>^u%g#( z$q-4Poy}#l!g~H!>v`*0>uKu=h$e8*y4SiBq6w_FHdwb=*THH&V66rJgvHkBu#z8V z&A0lj84y(<8P@UbAjmW9wz2$bIS;G&)0PvK!n!=Oe$TMzmSl??A`G}-^)8uzg(w4O&8N*LVC{a;yw|+byv@8BA`PrIuQE57 z0}yMV%v=oX_9+l;Am8i*Z-+Xp+TG@MW|tZE44Qt0HTzl9X^1&+*mTge_y1j_NFD+3 z|4f9%7UB%nLac*g<8~olfidq<@4JYHy+;JTgZPH`ErD+$ z9`wE@@DSoF-d6=4K-}+rS>Q{EFM9V0+>7{vcMsz8-ra~hy}JZHhq%N0jKHT6w|k#N ze8Rg8@iFh?h>v(5McnG$F7OF~j|qGPaie#$z=s8H68I2e(0h}>2E?V_WrzXqV#FJ~ zix6wQ3k237R(h)tuk>DpIK_K~z^RB6ypsh^5;zfYoOisy%MeF<#|j*SIMO=`G2c6a zqyCVN^$PfkNMrp%8tWHuzmQ`+LmKND@I@iV`iAriB8~M9>E}fn>mSls|A0G%{8@q6 z9w5i|0Nf$uPYJ~K0Xenu3jnL6k4iZxo1j zp)b*wV)_Oh?L)so4~R6{iC&?jT>w_1+^?4lEJK{DmkOMRSfXExI7^?6I8!eYScrIy zK3(86#4B~QH+_nZcBW6#(a!Yo`UE^aMjs~-?Mlzrhhut(K1|?H#2h^raiBg3F68I+KLG2LY0qs@99UAsuZHI>aSKF>Vh4Sqh z_FL_7Z5yT^*Ra28k7(FW0kNNI>ox43+QZrw%=fT{{S)L5WBMTt`zNFy!t{D=qd@GZ zAjf{HJ)o^c`MuhGh^w{#Al{|jjd;6u2jZ>TD#R7qO2nJA<%soK5OJxt3~`YbKwPL@ zhghrCAy#WOh!t8TVwr~hPb<-|pJ_$fER@gG3K6Gk1&CK`*C0;Sa2(erYnNksyfy)G ztah2eafl_VyGeGQTTCSFd$8)v8h=a5ofj-1+ZGgc3h#6Xzz)Zw6 zEnQ$g#6BAKN3D<67t@;N6{sV|Y1pr{Sgk##W3_gOt+i-@Z4g~rD~{fLFP7Vz=f&~@ z4ncX27t8C-@!~k)?eE3%0uI9C{k;PPV)?z9-fT=~da?Z8eqJoMx33q=>(#wjPH^Sc z1M?+$yCJ&0@rdocafmTqEU!1l8;fa|7t8H+d9mDpI355}`5j&r^Vz%#qRDF!XhxL1 zjHCXyj^l*>yZ#5Jf6;#vh~tC)y^iAo;EyQ(UjG5{l#cyUe_ua|>G$;G0*@iSqrWTg zsK6tLZ|a8yzAX^@seVX*1Jj4}*9E?Y_>g{3;Hw-phlYAVBo8~L6)g%8B5Vk>3A7>_ zG?PFhN6+t`KLw(`o?kquFCgmc`O)(;9{_MAif-1CJ%9Pd15 zJUGq)euDCkJvh#JLLMC70C9Ztob=$h2KXW7JL$oCg!Cy)zvp>h;0b|Pub%fjSg)QV z9;{bDtXI$5o_8?c+a9b}&p{8?Cm@b{fLO19Sg(LsuYiZ}yjMI}ubx*t2QacME)8;4XpB3EV00S;QS49A`b-Jx^hJy9dWv&*PqLn10-YZnyw4N(Dz3s(l;piYmP0+HeJqkK^r|A$uP|4-K6+h7I04%XnSU={wqef@3DfF}V{ z__Kij*)x@1m7@WoO4d5c9L4Z<$P~voN4~@7$biU_ z$qqNfrEoc{4$1y2ycu%Vej46hX$KK4txie(RXq>yuAEj+sE5^q5Y=)gyt%SjT?cV3 zSE&tZ0Nz_EQ;XH<>XgX(AAF&)m<1H4GiCwBb&Xlj5#w&gENCUrDbOJh;)COPHh~s_ zCV>WlGGX0+1^y!NCxPDyJSULi1IN^TA<`5NIHvAXkv=2vw7^Dz4-4ENkm9<=)ZH!8 z6xTJTj^et;)KOg5n7UiUaf;^}Q@32CDZXw@9mRKzsaq!GO9WD!*ObpwRbCpEb zt^8Zy*8;y3cvhgO$I6dITGU_VNs*@bz%i9aMf$M7Hv}FONO5;#YM-QZ?KXjr3w%_d zIKTESk=`TlSAjnW4BLUQ!@ABSuj?kTmq3a)8?#_6r5B78I80!kz#M@C1&aDzAnJ2L zBFSqgo^Q;2Vb}8&lFt|QJ73gq&7UIwd*ZlA&;MPdg+B9t7U>@a3ccpPFVdoZ=Pwm$ zVMnzT_cx|il)F~6f2}BQZEwn7+e2Woz^(%C6DaJy_I8mLc3vy=tX(MNPZQ1;c2y(n zz9vZW8e#7>!rp5{Icu&L$HjGOD86w_&3qxR7Fa2;OyE3$qMy{1i1ciMMFM9EED$(N z;MD@J6gX9&sJEI)B0WLiWdenr)QlEsVJ|iLA}#u5jj)@VTp_1;$1ydc{%dq07wu3Z z>b*wTYfTq%T#TDFu_E1Cpk1J_s~Q8PtN#`#?5JAUPxW~r|5~6J534^CX<<**?}+pv zf%^sS6)5^!^=^^gB5;$y4FcB_*4!oV4uQ7`yp?diN1*7B^MyUm7xp+`^xOIEMZPwK z)ei_1*Q*xxSbdX_*9#Q(RxRwUx=P5)1^NXFJE*3(*)i3k{j0}|<6{Jh_O2c#(t`zx z@wYl#r27dJ?Om;jwD>%$mMLBJmq5{8RieGBeh~7r0>wC6bw;G$7Wjrh(Oy*tL|U|4 z)r%tiyufD#?hyEdz^wvBJ64HytP=gUDj<$uCs6d$D$!4?M7>s3h~uK4R+Wmh=%-c1 zA}#u7)eMooMxbbiD$x(CCJOmw0!6>88ZOd91d4X35}$WfX+rK5DEe7dib#v`x=Qr7 zDq&|;qQ6zeiF`2vh27PO^Xs~jysiUb?Y9Dt3VcqWsP9@)zqOl%T-0-|sGr)agk0!f zJ5{7R2{a2d3SkQ)EfnW3 z6!%{!>SJLn(a8dKcwgxP^`{Tr2QCf%gc!Q=lmK!c`)@OyClMqWlX*`4=t} z@+yI1oLg8T(z67L@+}nQTR2|G#|a!QP>gpA#dx<+^tXk%bbP+ZKYyS|XA2Z|RU`UC z%{wHo5#v_PnHp5Mc=DmtDnKT z=%o6t`WCE=_N%+qXJBo#Ro$pQ0IQ?h)fMnwe?VQJR;i`1LYe{Z_D_aY+XyvJ9SG~T zK58$u8?4;o)M!G&B|Z(l;}z(!cV9dW$jH~=fSUGR?otZ-y1!@Ae<<-@uyg zWBUj8WA?-L*X%Fb_rROtPud@~Z-Vvl8vC8_u6Toe3B~9@V59huo50`A7vj3 zG4HeNsdkS&8KM(*w8y}c4#jSa`Wv2gd>{2Syfc0}>LmC9pQv6@-J;x4aj@?|jj~2D z>_(W+`PAEr|H*!wCMum_4?=6ju7G!3+wZm?VHd(#+sC#KY{zVeZLh&Tggv&M zwkK_m+BVtN!A^ubZMVR4g(bG@Y&Gy?;aXdv?HYJmG2S)`b|d&~S+-Q02i{&tfc*$D z@cx2gGg|+KHyFORer^2>-eEXteb@Sy^`LdXb+`2yc!Oc9btCLbSPfAYS6J)eS;_*~ zmrx3CGt97FWt|M~GmNn2SqH)!4SlS=tli+9hB#}qRfV@2nB`B{op9drrR5V#BfQyg z1okH!fOi{qK~%=a;q8V8E%#aOhW8tmTb5aFfHxc}EORZh;2no6EE8duLcS%}(%;e# z-gD>y`xH9En+~llc8eL_b@<)vL2j*k&zQb$gm(6?NdC8OJM`5?ZI`bOy zo#tEMt%oJBU!exxd$`tI2;M5Dz>bAc=ArQJLzX$!?18r*63iVT;-kx~n2oS&;aAi5 zrmsz(!84GPuy5flcne~`X}9Sa(>B<-u+j8@X*EQHTw$t*Cn*a|Ri;vSiZ;V^m2nKb zXOL^`Z|nze8uTzG8auDquHdw^E77s)A%zyQTx*PiLnu$tQ;}EVLSlOR(2V8 zz>b2=#s`h}8SjSYE6ZU|!42?)r2@QY&Vu(Bt}sr7eG%hKBTRXwf$)s35A2NS22bhY zOwrEYoj*Fiah`R446!_qIS)HubH41{!d@abD-Fah5r+ zbrw3WfxSHAO$ICLKM3hSqyv!lN1BZ^3uz|O45VpDQ<3&X+6So@=}e?EkQN}Fj&vH* zYmi=z^eUuRBE16XRHRdoUXFA!(n&}sBAtMgN`4vgzJ>I4q=%5ciWD`? zz8m@5kgh_CI%eO3{7R%Nklu`RIntYuHXscmtw(wz(q%}OB3*)XG136iMM!TzdOgzX zkS;{J0BIf4TBP%lVx4DKBVUCS>p!~!`FTjO6|(0bUxIWt(jug2pV?@W*=T#&lTnVg zl#P~?jh2&*c9M;DlAVWn&|0#wr(|PK$;O_NjeR5=+cX>7G#gtpy9=Jx87a1AHnwIq zwq|yFl($2QEt`!kn~g1-jV+svEt`!ko81a?x{zWkXHzRXP+~_Kg;YUmLuy58L25>7 zLTW^6K+2HHNF`3Q{)_Z)q<Fwkb02zM%oK$Po!v*S!k14IL>5sM|n4-Xr)<+ z$ah7GBTp9EZB{3gpv7jPt!AN>W}$s%p=D;FO=dYUC)!~a+F=%2U=~_n7TR7G+Flmg zUKZM37Ft~v+FK@CS|-|9CR$e}+Epf6R3_R|CR$M@+D|50P9|DTCfZCU+Ds-|OD0-N zCR$4-T1)0}Uc$_`kiLQRHKea1eHrO~r2CNWMfxJrJxCu#x*6#Pr0bEcL%Ig(T}bal zdI!>#NLL`e8R>GQHz9368brDnX#nXWq&FbF9_e*R7b2}eT8*>{X(`fqNarG*gR~gw zY@|gX@{LHb%;{(w>1YY*J5jzJ>1L#Bk*-F%3TXq< zB}lQ2(y?9A%TR*#pN=)0j`fg^dZiD>}zRTkzau{h;$iJ ztlKo~9cftFH0%Xw6?k+WQndNBLgdk^)6j;~u+G!auF~@G=m4bskmC56mW+Hn(m14T zkYfF(q0OXX{ipuI<*8Wzsc1Q=AEV?HJo$KhKn~{z_>kgV2J}Zh8!6i104wqqq*zM> z@cILcC@~;qNM)oFr~R=e`(qjU|Ams1NU`4f??L_rq`Q$~>-XP<{BuarlKVf4{4?Aq z)*$IA$@!eK9QN{C)FbL9SjCT3-4FxdMaLbEYaHES2mQ158|`E4=BQU;jhhQ=*Jofo zs@s0BJq4@CELb1zvd*{a@TU51co#jx{3ooq0_K6HpG{j#1*Q(hqsE|dtkG#WZn(`b z+~8mbS%Bq1oQ0k8b#l7&E!_Tp@{<{=AV(L?{mOk`rk!uUlHfR!rkgt>!g#kSCp!eo~}! zG157nBQwPP+=IuC=8Ak#(moRPj#q%&=$Go%Oik$*`&zAn?gY^sMY9m$lAq#+f0 z%xOuFulTtw>CsL)(px%`jFcMWTDXo?zC?q3`HvozMKddks+xE#l#WOrDbkS`=?E!O z(vl)ylxd$gRm3ap%aZo>Ln;*Ej`T0tAZPixEh*Ao+UJq>r6A>b28U*oA}P%pHAJgROKJv$ zxYK<2O}X$q@OJlUnf6I5tBL!>E15a1rUY*9uW)08QjfGITUx`9q=m?3z9F{R`Ja?& zANG|ciMx}og2<*lr8PvkV0ehT%?D3;o%-^-^I!DV2jx9erhTlKDrZ)dlvNGS6aEY* zh$MGu*k0P|mA3Xk%Cij#aVPprHpF+OEB)j7?_(%~C7xOQW!zP-zalv$ToK%>p|sT` zy`V~4W2LP;!{87(+P{Q@#gEFg(~4XsC&XR& zQ+I269#qFEeqKx6t#x|$^aS|l$1_9R#XpQ09hy1NJqcY6d|qATmO5R!M@e_3^8;xi z^4l+`I50SP6X(0{m&F@KjvYNVZ|t$fKU{j5rA|tU#9jDXWm{60i!X7sEOx}C(Yd3> zPaBsrX~K|53HtQz6W^y-A3i`13XP|;dpA4#NLj3CzEL?7CXOCHW=LMsE4cb}>BCzx zGbG&ix9@Us?Y~o|y{%B=Mb7N*P4#N<&$v7*Bz*ZpY!dMk9_|kFbIYn{z}V5G?P9%2 z-cIn(4-5#ACx2V_W=-&RSqv{)p?})^Vt>KBlE~c|yi;!Tw)OI(St0JrpLe-tCiqsF z_6C|wS=cKn*p03a&@`^=&Jp3xzA>sQ!zFAuyD$@=sH0LOQ zF)-4fdiU;~2><*@UWh#YU!p%9EQ=XI^T>ZL0hjqlmEKx!Tknp&xjFX_319zRn-${K zGVK6#XPhrIEk&1JTCXJd=ZA)bhEh$WH>=MBky13d#s$Ubk4mMy;7X)l*`gr^zoKkrWl;r0Lh}^E*PlGqE5v>6!wFrQov<5D01xxrkD#X* zzSrb@a!9z;k8PIydCKl7R$K~X^`wNj>wLI!b2WEC)_LHr(Nk<|W#ddrh`Y zFZ6F{Dr+k%XZnPMTm0sAz7z7!oLd6HgG8`5Pq8J=!X-UJ>2!nU_V6s6#C1%|@Dzg| zGtOp)`ay0!2wvzD8a~9I@oPJpPFngHDzXg~=}5&oA&t&$zHob*pWD*JCC*Tx87g`p z<$3Z#sZ`>g&DIG!$ooI~6RfPBQCU)Wfv@=r!%D?a(ayk~dd}d%SU1a0OYoiH%kUlH zV&_%x7C@rY3O@XfsV}H&)y3eaFHcQU&5kqh{rvroMUDc;U`LX}VE@SelKmm@yLPR8 zv|YEi2ES^@;9Kzr;qCux!P{PPluxK*>Zwftgv-?9(<(=E5mv5c^!SX!CCGrwnk&d}e`j(rRM=GL3< zGT+38nCr|X=BeyW_AG?Ox!F9{Jj9%B_L{q!J3;%{O#e0gWcteVk?A;FY?#Q-m|h1j zb5Fs$?f1jCvAmu-;CcF&%pPu2aUVfc;go1y~d@+ImRh$ z9z3%cY8+rpHTDGGZS7&7xW(|d;U~lAhW8Dx8(uIxZdeO@!vnA{d^$^GNvth1$v?@T z%J0dq$WJSKC2wU>QDIDxEy*w%;)BdA>yy@Rj&~Zm;GH(Bx)g(LO{M##-i*S6X*C5E)mx$r?OCPM5D$4PrcuDIo+B?zceyy- z=fdNiufH(e>6;7FQ7>JXHZ8a)opfQ^c*<^QZ=la8Y1zZ7p%WxZ3ujgM=SfS~Mj2uu zSyWgiE$!3B&>as|`S}MCED5Bg9-E;p=u%X;U|(B9Z(ak{6-Cov6!g#J3$*$Fi@o=b zkE%-l$M2n%>5~Kk3873NgoHL{LVy&?q>=zBB%uj1X%iAjolK|-10sT=vbrkjD(Je( zTG4gYwPIb{D!LXdyH2dEpSAA_>bid4=eZ>}nS|Z%@Aud5_4{1NJn!?Ia-UQ0y{A0S zRYP)rIVAUrA-NY(k>L*BIU8rD>uWTn9Kv(mAM9A~hYHTd&i1Ze=y&yFrlV=&^hx@% z{}6EFw9$I+5Mee>)!cC0z@ien2DxVpa!+vTQ^fwNt#s-q;1=Dz0qAY^ugV_atXk#J zk5hfCb`5ZC)VeBcT37kwX8i~rZ&jrNrpsW(SQ#w8N(QxxSA`O*;;8IZk)Z&$49cHY zzyGW7b_&5$H*&p9ELX`sW8 zH*WvRzmC*TL+HQ;e{*YFz~2_w7-(CWD~FMoD|4h|(57eZSK+8@`r$sM1^72Fen-k4 z8dhtE+`6HcwrR$$VfZadGXCbvRJgoOg_S=jiO3aUC^ zMVnN#KtYvHsVGN5qtqCq)RZx>$vt;uxq@8xs%Wj$u=#Ww@9UoD2f7o2gWMY=>3R4O z4{5M8;L)_*h`fHjYh$uL2lb?ksy!|B7+(FGU>z&abLAQQ3Mc6EqvKI~Z0-!U_gpSj z%b;{aJwCU-FghN8-)M!MvaNxh1OF*N{&@Yu=oFeUOGELmIkWeoL2^mYhfuF;XnyFD zar*h%yUEX!?x26RH?w!gnS4XvCh2Dn8Mk-Oa6X|QhV^OqFQ07xRj^QaQ2lA2litki z-hF5G5B>BX{LdY_WC9^{-%xMnnS4XHoY8mLu)YnmGJ7k|BMl(Rje6&t(K~e8nZ1jL%_AT8s?X#bdiIRI zwTb#!(dC1;UZ6>er3*#Nw5nY5Y?W2bMhQ)>y{ZIOL^uN;A=+mHV<0;)X-9qtu@gA{P ztQJQ?l>hr{X@t+-U_K^gE`I5sJe|(wcC$G!D;vb5V?}3^Y+DvHdbzn^!tf|xvKuYt z%@Xsb(l5C6c@aLngW0AiQ@LzTceJToG0!6ATg1EsF^^9zx+8pohs>A^GK0%zcV~&1 z7t70u@VT3z=8srbH_Oz{A9;mSxx%SA^efFDMPx&VQS(P^7LPmJ{85r{YNl{1gMN9K z!bql+$*6T^mWfO@wf0~!u_MqJ>Oiq+R!N0ZqRlFt8ZDgSL2@G8K>qO&+4Uu#7j*P8#zdC+H@Fv+xYx zh4Dc)44d;v&ZcGwxTo{=`iRrPX#hZkZZ6Se8=^kYeL~d@x-%#JU0pECJx*e$} z3pYB18xw>Z$*@W!Z8&k#xHyOKzcM132-Fy>lkKFj$=xiK469(pe7CJEO{ z?YZ9!pr~nxf`g6g&N7~hkmDoV3ZT^F2doM?*x2r@a^tz_5pK?p=Rb+B_i6K=+|81# z8~HP$C#58G2^& zRP6Gyr08rKOK_B@B(8*KaePEF*@vNM;Hs8`C3a`|j3wz2ZjNtA`A2uN1V#Rwv>eDk zYB>2v@t|E?^nUqs#^;Q|pCrFzdXHDrAo&x9kUz(mXUvJqk>pqH?G2WHWOr7EF=uu} zHnxX_6K&FB0vplI;{Fn=v4yWuV)2mkrbi?bdeKX7%-KCjr!HZ+M!Go8 zh;VCqL#>f92Z9e=HjGGC^P-mxnH^!HmJKr^w&BvYA$-r4jz+8)#@RWT5#fgNAV<`a zB(oxHSFkhG+1QCCOk0ADJElh@lXpX8(}M8o3Zr!-Up8z=k4VPt#HbZUW|o3u)iBmV zD~yqt;iQg1P-%q`tA-q8Mod!Js8vH|LfD~K4QECqi*?bfsmzE-n$=X}C?j`GjTmqj zssDm%#~(u%(<%K|m!76e*X2bpaV?KPoZ_D{0_l0+K_ieZeY`Gx4E=JSyoh90ZivBF zhs{j|m6bKM{*ub-;{3u=Zap{MsGEx4I9)n#d+vy8aBlERtk{*Mi$%zsh-_~zY7vwP zU7mky`!W;X$r0a~O~3LYD7P?&a)^5M^Zd-?4%eR(#dl_i@1)Z&4^!~|cB$5)x8eR9 znMAi}ZQjz3g{J!T+ILv-9i7uEzB5XEhlj{{pIf2hBYo6r?oVBwAGI0rig)LVch8|; zIU}-ly6BAji^m-QX?$P4iJV^2T+%nye#ri{+=lfx$NfU#4VsH-qa%rmG=ho}cg^N=Ly-|CjD*5(SOV0=_z_EoZOTW);0- zL@y7O^M3DenfYgz=UZ)NGKEul!l}9RD`zG&TxR~k;|`aZF~TX2aB3?3@-Rj3_ehzE zUjP4=H~nF=f)BWv_<&0kPVq2S^GV@G@iD>t0?u;p!^!PMIHzsIsqCj>ejRf@?7|hs zOp4K)J~TaL`ju%n&P!L~gmeR71*EQXh0-XXj=l9M}oo_gwa^8d81(!I_bGAFrc9uKmJ7>W9 zpTqH!<5S10u=RJuaiwFAV-xKAt#vGR_zXY8uERvqGphEEMQ8ZFi?YlC&H)rk}M-&j7v$@}Ll58=f94bb7Y%M!9Q z+TmRZ|bLo*W16SS`SnFCzY2DsAW z^pkb9Sj5IeMol2p+qFF_io>EflcG2i`LZ2P=e#X^^^~K6-qtqE;h$GGn6aF%h4K(p z^_W53R?ZiCxwD3ERVc-q%(g{*#);D41}$r(4Jf7cZ5ttF&(_b*==veqYjwh>l)pWM;_nxg+j?ib2M`?L}VNGd1X4|(e8N|cl;MPTosMTdv z#pOlbIc#eYUxg&;rD*vYH;=M_iks)IG~c^5Pw`!WX%R@2srXjaw+6SSD85CQWoim+ zouIgj@j40jSj8>H-r^tRUaN>)glE!5+Pb}E6<^)s@>SJuX~U)oc?M9W2ynb-w*gQXq<0Z~2f5q~pOZ`RpwfP-4Q7c*HFJHd2 zwydUXQOAu`)~ozAg(&RW()^mzj>9smYI(tu;?=}DL~Uu6Ut)FKKqY{5D=TVh^DBz- ztBX3Wr+al4YzYOVa%-#NQ?9j@mAF%te`R%kmA|&My11saa%s^yC-@36FE7llzM#R+ z5N_`(Y7I6&rNIv<4ZrzL={^d6s`^k%pp#0b1&`IHg3hKbO^@^CmfEt4)p%(t z&#(2b$gj??UR2|sll%2BKC^Sb8pbCp_sd~?X61e{j8A6n=hQi(CGgJ4{c$+2*||Rq z=arTF{cv8ha!(KEm6>~LI4^JRcf)zH+y~4#4sf&R7iIJUcyC`diU}W{~?1%p9dEPuR6R+NbE+BCTt|bpu?qjY^5PplyI( zlh&0}qjgPxV}R=dt!vs916+Xtt~{-4>Q@6?e;MGqLF*bn;11)mwSLB(16-{GTwbj! zR-dBhgXc=x%`99TJDA~0($CV@(vVovhUr8pU{Qf^(fz~vShRN#)3h$(1HK6h#@LOt zucWrM9d8KLfga4*)_3s7e0^I%fSxRL%Nk6H2P$?CX6)b#%aTwvEuEXn19*#S?7?S9 zAkZ=4=$SkZ@V#DgOl(!lZwmxNPBu#KQJ8edtdK9*jeBHB_L!$>?2^Q*Zw@T$Me$+& zXu&BO?Nolb^a)zfxp~2N^cW|G(%RZ8$7TI){^Y5+jvkW~B|o^n z;wpN8k<)ZFU)<$&hWU=#&VoQufNy0)IW?8E2HKjcs|t-$BSH}VK2UE_Uf-xRmp2b| zuH!o>d2-d*qSo1--`L0nPgUMFDmp{BLt}7D7tiG4F6u|KN4z6~#G9n}!5 z>?ONCnUcq8xr!;u`%Wod^GaIV@XYqlp&G&cOR)8`KG;;#Sl>}Uo*pV-7H{r?Sos}I zh1jdfKhVmaQskB1v7|Sz6+Y$ug@s(yPTZ{q?`wg@c~pr=iR`JMieqoUNwn6US4s=&a?OeV8l4q#ExLf}Es9PSzDHzOI`(_m9(J0O% zgE=cFs~of^Ud+o6^DUOO{O)x&6|TLzANB`Wdxgraok#7VdbNLPW#N*XKT-`>uO2m# z`bK57zb3z=*k4mzjiZ2g?akXifM2+@thl0<^Dm*^fbe+vEkuN}vx@UBrrrQvVP)l# zGMRbNFz-=0x&Ii(Cp(um^l4rZlvmfex!+i^(qPqnE!h8M{}NjBUb8=Gzt{DM>qgfB z`>n97{tNpa`&N60y#X5Xa_r;m7TXuLw_r8>erWo?7{`KVZGxddPYOzLd9FJFSh@mDVNJh1OZtDb{4G%c{4Wviy(beaoLM zf3!Sox!dw<%hi^PEjuhdmi3l3mP$*ZWv*qKWrAgdCC2=t`AhSM=C{l*njbg+&U~x+ zI`d`b^PzKKgV}Gc!JI{&>rdvH<`h`W(?hS^-(uc_#rqdNcu^dG}E{GatN=%0Wky1QT({-A!p%kNs@Dt8sR@?4p&4A*$q2%OXS=D*Wd zuWHbr;*59v2)&DMLu38}j$0kSbnL_&%NpoZob8zCaKX;qdi@H0u|7*b>HmHs#{UOm zSo9a+&0?8hTL{WvaO5~{w-j|~H)7$C_*McrQCl|(00f~b^`k$Aj%p5+g0C?p8by%!zi zkAomzvLF8%<+`P(-J}4itijRAoVK48@RI_5RKWKNIHiDpD&SiMe64^l74W$N{zn0S zQ^2PR_*elSDxgmR?<;`5FoMng4!pkf%z(|YI9;%L#;>BPeb%Q`K~hWbQ&Sif#TgOB ziRUvna{Hmv7Q7-cmCfHx-~6y0r8n4t0~(Np@8enUMV5JFmABU~CsTqd;~e6nomSu15C)bXwiHe8?pIe($D1v011 zC4)uMKoAHO=gOSo*)m{x(v5nsYP5C45v?P)-?4ebty)KpBs!1d58-y z(9t{^x*>wLe`}vJV4c7JJIywO( zm5KjgKi}WjkJpv=RVxCZxXu%>L+X!5mYfhJ6j2G7x8O@3Ev%5!yl zf0)%R8XVAIP1&w4)$nsQcyd3k8P|`izt&)y^Oee~BBq~T{;~#Z!jx;;)q<4%F!MF_ z;@#fQXRm3nCQWvshOa4SPZvEW_$OWv8@AV-9O$G;8%RsO>#ml@I&$H#dUFrboQ@LX=xS(l6V7wBw)M>ToPT3eQj%X_ zGty}aG|l*of8_Oh%ut2~oRP}jBNr3!*em*R@(F1aM2?N33JqWM!w34|ujTalF?F2S zb6-8kedQo`uUsxXeD*$#W1OIIjEUgY)f5cSz^{ER+xC1EYqK+ol_^BASZ@?-=D(v@ zj>2e`EsA9rMVabqZ0?{@Idh);J}GTW!F$-_gBi3UgBMIC#LS-tg)k&g8|iAK!?v6J zJ-rQ>L+WvCr)JpIxUxRj-rH4!Ik(;(?_oJ|;l>bsA$wf(ZqS88-TWP)YZB}m5`{fO zqOi|L6!!9n!ag2R*ry}fA=4I_Hp&!sM9IHKrfD)wk?B~Oj+W>|*yrQnQ{?ngs%3Y+ zOy|iIM;YS+D3*E@KN%YAY-sK9HwD`2x46%@>J#AK84~tC+7A!)!%OI?+S#_~ zZUR`zd{hB+9u}vFdyXia4GLJV06#wlO>c<8e#|f@>*bdkVLxVkHLhGf<%-@Tw{BtY z%YzxuQceOPVGq`72ZY^|&Cg*YGM>W11Fc;wr^5 zfP@6MIaUZ$x-vr$j+w)_`AAXNC9%>GnBPPY-QWv?9)J8YNF zGaNd>#0laRA%YM8D2qA{cDYGH?k!yiDd->vLIQ?mu0oPT9}kLhNEdlXxa7;tWl0sn zZXsMp$rInMi-00HZl-e+OGx!0X}2Ui_mbJikigSCOc7YnRH!Qyi^`VRR^3Q;TLs=0wK;FyYuodM~b>NadA2y%Gn&4 zx9-9zu|2d zLm7e%S@DN3Xlp_p-GgJ{2_K3SS3JV;i{~%Q0eVf5V5sAm3xiw2hhIKQi=aW`?UWtl znJ(m?4S-Uyn$3q_dzoxL`pg($njX6-6}Ltu9$hSCCazkyF~K5;hQm7Xn44YloQe1E zT_bBprdUHumqE{|Alzp))!nt~-XbBf4mUjzd-<;F-6tJMzS6?@usJ_D}} zoGem4BKpMmQi_E*@`yvBxeHfVmWX$SW8|T8yFqmj4ZSK>6d)hTg~Dmsr(@`FEirk>JUg0SjUToE_aa+t)L3kz#FRw9^}O3!=GCe z>W=vY@oCPB6(&st&xj|Ulm-O`pMeXB3gc%M$lhZ_#Wlza@LK_0x!KIF?FSlprjKlE=<-eGVd|L7F?B8Dfr zAd3#|YcC3eyTg#2XKN&)Q=VcM`vf5cJ_f<4j#luv7|cW_uDUa@a%WlW-kZ-d>=q8D z=02Uc#3zh(3%d&Lt1X>=;HGekm6vqvst@9NeWTEfsh{P$1xvWjT!7*jnVKK#Gx$ts z=#YtzB9C2E0Fmf23yEk`yd#^16rC6bGY$@00)CJ=&Ik+Po!r46?0D9R$hJ;rcLO0g zhS6N83;TFY8GPoQzVih)Z_Ps3z+aH~`;&+mhE%XUQoG@_9+{E3AhA zKAt!#8>0=URC{jRE+2Q~#Z5AC52Z1h_oB#oxZS8L9yeB?w{Ilmv!Vcz12?!lb7mnQ z;|4D%IFE(Vt_7hB5s)taPZSO2*k{9a6n2*zB%eP%a7*+R!3Q8;xJlRzb{*WhxLDyh z_vHbFkv>QYridRtTxc)cA@=0nzEMJ$g6}r(ee%U}B*lBa+3ucsaEef;i$hT^HV03f zex+-9Vxs6oo)5cg_pPzgfVaQMl9m2}@zD8CTCBo-y2S3AUz_q$zK-$YjXkjYiLf~- zp+G1a16f>xxO43OryvH;Hl9LaBppJU3k)ebCWghZ*GJ%%J2@i`l3JH-C$8=59@m!!Q;GNd3!|i!UpBvI;ARx*k?B;h*rNHFP zUllkD35j}iCmt3JQFHBdALw_P!#sV&M=15Kz|u8xZ&(PUcpwFTS#`@#EhHW0VeGm( z5X7fzr%W4ou^YI!xUEmzE5D?0Ur{hw-N!(SgaY{aL^sl03J(D{I3NlZf{M5Xp;QM3 zrSB8mJ|rs?fuXbWU@6KgaDhQ6;^BDm7IamgfJBAE$PZ$|;d2XC-2>uG-5r9-W)h93 zjGtp)|Jzv8e#ZE)@gC!?(3y9Iai4JqRgZr69Nzq|TiiR?w!G1u>1x490%{@6a(c2|$9 z#dWr;+O^0v&*gQcxsqXN(CGX@cLyw-tua&?iVe924=k~N;(QPG2%d93=DZJ<1`j*0 za_)ETf(`Z#XOr_RXSK5oHsR+wXF@ySSmy|*)hWUv{FjbT9Di}V?s(Dhq~i~;2Y;*M z2Am|=?>OJF)zJ-W@P5Y%N4cZOk%yB68L$OE3YG(Pumt~w{UiH3uo(EP{SjCTJYv5A zmIC+Lci4OF8|?M=mC$imh#e3f`(%4E4!W6aKia;seGGemuNYEo&)6Qe-DA7ecD?Ni z+dkV4Td!?{t=_iMR&Fb_%Lj&-JW5^VZ8utVZ|%a@jqE$>=h#U6=AVQt~JmP4@Mx6iU2rwY!o z)LB-*ZeM{V8z&1=En{%(&1C);Z1tTq{}p!nUN9enjlMg~H^DyNrRLqR&DUjahF!jD zb17`{WtpeK9^WXl%`C+H6L$FCk9i~JMeLY(Am&b-{J19OGFaZ*3TqC{F>7P0VR3Ik z%&eI7m~pVQ7X$kaUt`C_Urc{CJ#Tv4^n26o(9C$X=@QfV(9GCr3Si&FGSec{eA6sb zhG~K+!7$q3FzEH)>%YXVhIjR^>i-DsiNDkT7Wxyf)L*RMso$h;*Ei}{>npMEAW!eb z()c)iygo+vlkQvH-*oTm-q5|MdqRgv-~^}-47LiFe2x~~j_Kmw?IFG<%Teb%1+6@y zB3iNKzWK`(UVfE|rm1MElyoR0>}D$5>6ZON`AUkR{OJlWM^I4qZ3>#ztDxi`6lA=qk%KHRJE|GfSvfry!aM@Y?Ft;D3^h2`>Fa4??_DLxRThIHA zicAXHwpu}38x^!=qk=ZaDyZF}pbammNY+~yY~ApP%DZ1d=gd{n2nDr%rlQwWbW}yx zsi;Lo4h6ORtRlIrf~_rYs=VhEv}CJ-7R$Q!f~}>0Q+U416tqyT-(c&)2`Vp6MLGp7 zpe-Q06D*K5_5tN7zS*y+=phvqtH`dPxnHa3&nkLQMTaC5>S&dDKnV)3n+q_`GdkUo~mC)YkrQka_R?Mx#qu ze^OA=9V)tALB@Y8NUt=yCjFf%uUtiC@{JpXy$e-%;b$t``KNx^EXQhWSfZd+wJK8N zZd}Dwp3)l|SBz75E0jLnSgllPWA$RicgkA|GAYm6Mx!EkqfU9&Hj3{l;Y8(8)gWA) zEXxXr?Y#WOA=Du3%j<_DRk+u#!rd>+X*KLn#*Bs?N&{_ZQkp_TjnV@fiu#e#%o{Ry zD5-eYD2TNwC_^6MLk&~pCts)``2)o_IaWbqlyR;h=_-Y1OH`0meu_YacZ$NZoRTwA zFYFtm!o44;@PYyro}Z|~o!|7skL9%LcPQh0{f_AhZ<|sk_1ivFcuh)f>NB5Kcp1t# zR-dkP!TQ+wif^o2MNS2|{vnIt7k18(nf{J<6x420(1zVA+NB`B%JX9@Ck^y|zcQBi z{oM*rr}RO;PJU2^{5qxU_;oMxby74F;o?0C+VciqF$Hg1oD8;JEQ9v_GH9gzcnIT{ zH6({t(iTi`R)}(#FMXqOkfJhX8W zV1`u=lXk8GdSo!3)}s+-T(!(`ZI*$a_Wr?3PkaA3_>1E8X9Ya3fV~RXt$=m~&`LLt z-YRp%m>B&CXs`~+BV=&nJh{4q8}sBw4)hnPPJ$b=ovDrw@cn$HW0w7& z_FL>BoTPW!KC?Xw{r=l=5?*J01K+Q$*v+48dE4>}OS@&7`6GO9ZZ|JCdt*M2`Atk~ z%tY+0f5KF6nhD$K*BLh%XB#4hN1zR0j{XPiY46f!>Au$eR@bh})!D^&#Jj|eVu?6f z_!PqY7uWO%SK5Jzoa8~Ok`mZ?L9U0V8JjHw_3g3ou^i2aa6KIe9%bKwolC(Ldmq?S z&*AiltdAqg>;>Bv)ac%EjCAnr&@&=j@y3ukZ?+;h*S$m5H(KlocJ7!Rkrixsqom&= zhv(w+gX8?rJapxZv+;Nt5w1l8_ldHZ!8XhBU|%E7%ENjhTx$lxPL8_ACWM8~fGu3( zbv-O+SVmj8b6P~!j}cu+8xe!6E$?iHosAJ@4q1dN!9e;`qSEi>p|!iHOo=A$&WXsn zFQPQ9uuwM(YV~H!)RoWGmCvGINpD7k>$@0Aw+ZXvars8#cCNFqC*)QYcR;D$C|&t9 zU3nV)@-V(gP!fC6U?m_d2sKco^0T2Hnh%@QR79PwT(`!mD<7#V=l(en*@$FxHoCi6 zr#2fibhGB@W@XZ^oDFU`a>#6S@wmffBSAN7s&3X~`sHC3M!4-r-r}ON(TQwut#{G6 zn5A1{)y*2Ao5j6zBC-X^=v;Jkvo>umGQ@8)#cyZQubc~RHFC&YwDY*b_LGj35)5dJwPNj zLQ+Qpeo5ofN)DjD@SJYeN_zK3h+h_nUqWACeGnTT*Y`}Ez9@i0u#zKvA~s)Q4_rfi zaAHQrXbQS8!tF$2G>KLj*gCW#K1fm|erXZEj1#|0hw*eoKMhqO2*E2YUFAOiFU2D(|J73U?Ea!I%zkTUV(TJdAu*%8Siq-91qkHY^^ z6sT@%;!!Ak4feaWHU{|VN2v!_<(F00uC6LhFRTcJcs{1P#f&tZ3uqrLeq17c%*2lu ziXZb_=0zGQQ$y&vYD5znr02>aeryr{j^70FV@c0dgHjKJ^;|VTS?k>hSrp-BAkovJ z6z#D3?okD3DiCo~XK+Ig7hl_0uNCi%6R({hUJJ!>9XS!n4rH{JDOT6b)@i$&N8Fh$ z?#!ZJxw}cWAEVV}F+YzxTz4BS?wl^}oI<}mOnzjYl$9uBuWTL4ii;Ttgf`%~nY| zL&dF`;@0$unm(k$jAZg$7+E!(u&V|Nt11c=w`Pf39pcsmajPWk%Hf1v$%Wm5|HY9N zgM}r7pAdFMH(M?XyJeQRC4D0L3fIuf)tfdKDj3po--VIo!%4e*IBB=c7PmOWEeYZl zN!r@sq^*ToQ*jgiPl?nFmR9QB4p!66s;y8&7f2B|rHY%1Bh|7z8NBTIKMD!;i`4_= zQOli_t>PwW;-=B!rU~LENh)r3ambN#S$9^f*oz2LBUQ3gQR;fDx><#+W-mi*n<=(I z%^o+Wh{g&%afodWF@)bF zv5gNuDG_c>amdV+^9Ip^ped21!-ZMeofQ)65iBJl*+U#chw+l`tW{z?f~7_o0VD{p>>|?4ehatb@5_dRzxyhs85K>d@0o_KNAh* zf@0lBu@1jxu?|D_22W&>RN@XY(5v1BPmx94tk}vQWC2pw-IFO+&l9V4OCu#xjA#Yl zB|HXRmh;b`;CqBv?GdZf=odlp%#h6#Mps&Kbfp=^YNNOgzj0zUuQY!|vQ{W&(3^y| zB^Py%)=Sbu9KMaahremf>wHThPt&`52olE*&Q>T^Nx}7Y;GT<`3+6${35(Cx}bq z#HC5%QmM;HRt$$|IX*7V68tZYaHE9--m{cpYhgEAK*LtDxMZ%lgvQta>Ez~GnU#vm zm_WV@BT)H@9x;Tp3kFK746?X+j<_UFT#_U%k))kJT;a`!K5uamB6uV7WNB$IQd=O} z`MhqHXH}l!xw$whUmY)&Ob|=*B6*TzBLMZRG8CT@&&?ZsNs3tF6iZ^o68NM< za)*;Dw>!%&7C6Mhg^?TzBTh~pJeK63VJ)tytbjs~VrZxehFWl#!7U=v*<#@cv2eUt zcur4ehbNLP=PRmbWphRN8__J~o;63z^ND#neAS3?x&?yqD&t;Q$7?gLGgcW3j9IXa zmuR#a{)H3k5!l9i+HgNktX~WL{o4&)h6Y2ep~R4Fm}(enaN@lB*RE$>54eu#7T|pF z0oQe|OJPSa&PjcCvKjW)-F}WE-7&^txBuJz74#Ln zj`jKn?YBWw!KL=FJ!o&TudtWGV!?F#czdi}2b+YS*iJxS!6UZ2pt0a`+iu%NTZ`>1 z*e6_IW44K~T4}_pe4q7Y>(kbUtVdz3@K@H$u^!)PU283{rbADG6RYsw!E)hWEU#N$ zv^EUpEz`@Ur%ex;j+$=K z?a`eJtBJc!J*EbIME{EZG5wwTR{bjdBK;iQYgko3syk$=HWipMO%qKC&}{HeSbhh|wrLE$pY%VOr0qvr>tc=3h&hzlPh8c8Fw zaM7iM890nTFhqDT<2;2SeGLg0RSjm84`wVG%qSfo)b#4D)fa`?; zt~&>~_Gn$_-8R5AMe913PM9lmZCjhQep^RrU0VdLYjd~OwduIlwej5nt~9Ny*RFMi zF4DSsItRE&^Oho6FkS1{eQ1Ddgx1w@iPqItrgd%jY=A3S>pG`a>uTMgb*+C}>uTQ5 z5C8E_0Hc_j0!^^YB6TcsJ0wes^cdwI`vvt)Ti;P4NKH#G+4od~=-(RTPkMm(4dn22 zWKwod`D1@z{^rL@2D#@BbWhRTjEA2B!;J$v=x);>#`#waW?VLyfh93%eAtBrI2j#P z(d`Nf7t$g`D7fRV3ZS#}$jXir3g=B3Y`<9nH_2ez12Wh`x*HIy?Nyo6yhZ`i+Ds_e zT%vH4n^yQ`&eCKV6x1qUnF1;luv7ty6;Pmn`3lHZz$^vKRKQdPq$xmJSPBIT%nC=z zMLsE&;Pv^P?3GWtBsfP}y8<9x5}fmy5{48;a85+wD218-mck)z7d*^yh4Zum9#p_` z8Tgbc@JWkmp`edcgdq9?rJNVMA_rb@tpe(0kiA0&b4jlWV$F3b9MWq7&g_#iXSO2q z?6+l3qEgF=n-q>x7bDVT&WOnhn5ck61t>R-KPGeH?^QsJ0^Bl)`-cKPQ2?D0g@jI} zNjRl7xlmC52RV%X76sg(0Hx^k#R^Ah8@iCp(J>i_KP%uX1t?V@UMlrbs6g|#wYE2m zD5b|QSBX~E(S8FzTiwGQ?bj-Ns7o(*X&rX1TMB`?{DI9d(aY7p`5XDSobH8TeXi!` zn0cI)ErE{W_O8&DEVnF3m!x&?oa>Yz)v(%ybLoMmENM9zv6e~ecR*RvUJ;;KU((7I zkoV6DnsAefNK0BzsLhYHlK_sZHwDJOEQuHB>Zxgk4c(>n&}|oJhxx7fmr2nAUCWNk z&&0M?SZ)`>%2-U!9k0q`F}b$w)w(u~)4DdkGr&bU81X!zcs-}JemxxnT)A3Ti>P(2 zSDtN@O7p{7zvf#9xJXs8a=*rtTE7O;S*Q4|dS2_dYLnJgOS&SJkQD6-&wR}OG3AK*&Tx)#aLGO3gnDNkg|ZP5V97S7hj%iE@Pxs|sOiZ}iitzY~)t;?}U z>oSuzZ6&v+d$oQBQqG|Gi7>UCj2F?S)=u6+pa)drS~|d$D0LeOxqZLJvGF~vW3I;0 zov(3plBO2>DS!jAiW5p7Uqxx>G;}WeSMdMf&(KssJ(mHZ9j`CZyjvZQu zHrRq?8lRjJjU&5U<8a@ham1gkam3!EbyR8`&Qy)Vp-tL6RpVnis&N>awT>|whq!OR zYx}Oh4|HBLz`65BtjJ8`twCzg^7mK|xCwX!mB3!M@;!Cob{uID1BMfV>$K}D*GX5z zb;5Pr^&Ix=Kj=E@I^sI)I_Ns!+Up9tHoLm8KcLRF3Yz^(@l~JgVy<+T+m(pD`(~Hm zJdOSOC!G;|-yg@0{bSAtokyKVuxI}ub`$J%hOukE3zh}zoU2q#bj+FVbUPEBu}-s7 zz|Q@z948$S#|g)AXr?>nco2K{kKpV7pyPmJuOsZ(?C8So{W`}gM-_C{`5f5}hM54j zBheA-Fgpb7;Qz{g(jKv&uph^leY(wUOSHw>%r?P#8oTaKLTmpC>v8LI)??NO@tuFf zdf0lDZf}h!Z(x%m$o} z`6}jQOeE$+%<-7#Vva$l;nA2QF^6Lg#vF**3tfhrF(c3tQx~%;rV9J?eKFZF408hR zn8cXa7;}tZI&J#ObP}@yCrrmp&zX*y9>l!B5z}GQLDK=#UQ^h#+09Q{U6|3SgMEf7TPb#?WE+kfo--UXJP2!(M+}Dz2Mq@ddkta3X3Sf)80rkG zaK5Az+7`17%#dz?E&xL;KOd(*t^Z1Y5;G(x^vCtj>5pND%2E9h{bA@`JfPpJ4?{0v zm%c?`hnbTqeW~7u&O}!XOjvpscoz_z@10L{o)>yYz|ZsM5zY1H63y}E5Y6^x6P@dw zOLUHR4$;}(*+jFvSwv@fXA#ZxW)k&!y+oOp5%qXIL}z+u5}o0lL3FxzI?-v~X+)=b zrxMNZW)MyHrW2jwokBFt3q324cd~af(Nu3L(Mev|{s4cXcOuagFZ8g$?e@BfPVi13 zI^H{;=s52)^bz(5(TCZ? zL?2=g5&Z-E1JMWBgG3)-4-mbd-B0xQ?Ds_PWA_pL9s3>8d)d82?_u{4J<5&}y_?-l z^e%Q6(L33lMDJjC5WStzpu-_29ncYnE*X-9s zZ(=tQy^-BW^e{V2^bmtCLe%FC>;|IOGwA(+`&aB&M6YAl5xtgOOY|Cc4bg+_AknMY z)kLpiR}sCET}kwp?3YBZU{?^moLx@z7wi{A53mD7FJqSxy_8)_^b&Rn(fw>c(Tmx| zL@#0&5#7i35#7u761|XJNOTX|L-Yc60ny!TH_`Li`9ycIT|{@XokYVdOmqj^L3BIY zPV_u>9?^5zxkR_IZA7=Stwgu5Ekrl7%|th`O++`cjYNA{FVPSS5$$0;M1w3yw3~Gk z?P6U-J6R{u4%R`mowXBfV{Jq?unk1dVdoHSWvxV8SPRkhY(3Ft)=V_O0z{iw6VXQ2 zNVI`95UpqRMC(``Q9tt&UB}iDJ)50PbS+y;bPZcW^elE3(ba4<(N$~}(Uoi^(G_e3 z(dBG8(OOnZw1(9Xt!C9km$79;t5_A$N>)jjVLXXQkfvZX|quq8wnv&BTqSQ*h$ zR!VdcTST;kl@Kjv#YBr(5z#_cNVI?z5Y1=#M19OhbRk_#G z&1Jbnb65`1Y?e)QE}Khq4x2-CHk(Z}i)9g=#by!BWSK<0%uAFpM%2SRL}#*@L}#!W zM5nXqM5nQ7M5nT;L^D_h(R7whbPAh7G>xSZoy;Z^O=YP>C$ULHC$fn|Q& z@kHZT9MM=7OBAoVM4ik@6tA9~dTm}CQLEQV)Z(=eHG9oOu{cB2WGS7k*MGmIAuSxpNamP{hR1d>?flCV*eugBm0r)59|k`-?Q(Do@S?so?@qn ze#gEe`cL*xqW@t3Ao?x)mgqO^8=_ycuZe!ez9RZ1`;zDv>mwRr5u)$2_lf?M z{gvon*k6dg$KE6QE_;{gJM0~zZ?m_F;uVr8J_Ly3g`Oy0%!%R!nBcU9i#eTBBT0YIEKyrJwJP>emwv7Q2ls*@=*PF{^gE^ichH{^6ne@qFu{`tf|@q5AQB?Vq5AQB?xFhe{M|$Kh57m$7Zyu^2&q)u}kLObl)sN>B57m$7V-MAj z=OYi*kLN=V)sN=`57m#S&qMX&iFl}fJnws`emsBmQ2luR;-UKSyyv0%@x1Gy`tiKu zq5AQ>?VwU+}y@^m)(oM4$6KNA!=LKN5Y`^DNP4JkJn)+VeEg zr#w#)ebVzJ(I-4l5IyEOM)Yyd<3u0xJVx|U&!a>i@jOEGVb8-vAM!jz^bejt5Pi_| zAkhar4-mcIb3f7Fdwx&!KF@tbf9Lrf(R)4j61~TB57DEZqeSoa+)eZ@&s{|C^xR4G z4$mD#Z};3z^fu3JM1Sk~Ezu*MBSdfY+{(ZIn{=-VbXNZZ*ITgS_k`Z_*>Sz&D#vB`?%#=1`#o6uZ*rW4@BR|UJe=B3cZ|ojdn>;Azq9`xdjL+@ zU$#GOe+b`|w_qQ@<@l=Hj`IrV;G1%VeW|?wUz9WLsrE7Wo;2D1W%~wSlYh0njy(a# zV8!4LoM$*_yA=BZw&FXo*|yeJjjzZBwk+FJ%pi=i*>Te0wDk+?M>w^A-1@Bb5$nDG z59bbEwmc1+fJZI2Sbk->+;XAiTnt(^~8cSY(=qhgX^@8FK+f;}6C!jUPcj#LLE~Fbi@u#$-jU_TrO*(Oiw9l0aRQ9qI*bOxkA`ocBO(I32QL|(#CQ2! zhMTdIC+eMggYF02SGrGh?+N_8OQ0>#E?lPL6Z}wa8(hCaMT-=)+OD8g zba0%9TXjs~EvI9EoVT0~9CB1a=Vv&Y|BVuECY_Jvycu^Zys>5l**=$1VBQ85tyfUa z3o5!xMRdXx=>>8wQF$E-vfitr+bNqJJ-x#Dx2SN}5B>0TKg0qLiiC&Vb-k28Pj6)+sXlwwRoy+c5c%`?f=oixMnp%bP z<2WL^=GoLzam~iS#-b>>G`wd zT5j^|p5rUR;0a+`(F5A?IA0V4SVQ&+09IZqb5@oqfR56^YsFPEXW9KSs4~c)lGfA^ zrt&_8Lu-YcGhXHt(4rwY3l7Pg1=lNJkqoj)r8~l8?~*yQX~h$q+1JRN8A>{7yJb#N zmJD2BsgN6k!lfnskdCwlI>5bz4u(naM>W7DFZIJ0Rd{in3itM>yPHmAQVP52JQ=~A zFRNj9(or~xyR4tPM5>v_;Np1-nnlNQ5wcU*MThq|Y%h?#I~%iAG+RZPD)K0(;S&`_ zR77Wld3p`6tGt_4bXY-tT1@2O{2NuC+;qT`n@(friVVef`9Bp@t5;At9h~E-6yz(s zf(0s?tD-Cg<`|VI{UdD{g8Bj zNC8BZd+|T}p(GyC-Qgusfc(-B!qIOO-a0z<$rD;D6*JKC%N5`33lx+lRWE##=19EO zP>oc~?LaS3Cfh=Vw96p?K)W0`s8hUXhX*(X5t&m!+Z{NEwmWd}y5glISn!O(c|rk? z(f!-nLkm|)sI`6KZpt`+C|ydY>FN1&>0|xe2UWQL5h)h(ELAXKbvB$aeD1j0vB5C~E9yt=J$8@nQ`;fi5}O6PUG} zKF2&K=6if~hGU9jET$(-=V2Y$Z2Tiuhs%r(oF2FsYpxdki~4=|YBT8msJl?N5a%PF z61R(9;qSQlnXb}4e(XXgie(N_zLaxg5BIR&SoAm&;g{?v`pYWtzpS<_A7;rbS5_>o z%r7#|&zNtVKXE>epZg2?_!$f&H9sn;hXyBAQCSPKixm~cg|)>+#(C-UjPu6Mb1Awf!(;S} z^6=;j`QI!7uOb78)v4^G|o(#$y3Pd^GGRpq6D~GO`&pm zt-rFwUtU~ZS-sjgBYlQ(M#2mpyQpub6gxjE_FZah<^K6aMb*VMHGbG8h4E73^z`Y* z>EoyKWU~8aNXcYGC3B~m3_sZ|m%z02X~t>s(VmSOqT&jF!D`92 zYI$W*v2kkpRO8g~QzZ$e4JX0vYBJ?zHHESS8R;3ujQ9*5HK%W?6m?pZ@VBW^QTA&6 zrKO}9(?+E6xbyllq`1-5|64U~Sq18>0>hJ3{gYEB8z+yNEJaTrF8UEobWQcw7*kVH zjj5wjdGrN+Q>5s#qa?pojgA&mT3G}Ov$g(`%H4@dW1grAY}ycfecJ z1eEHpE?&00xTe-PF=e80;^>JyerDff#K$>Uu5H9Z1GO?t|E9;l2WdLDR){^h6Ut2! z;wB(cpr9{Rx@q))d~*-`l||3ZVUzLPGT6jjUXi~dzierK!O~)5a%!?Md2Dh^DAZNd zH%Uq)y5au1KM}R$B~!d|1&m1@V;nPn3{NJfZ=#e;blu<7pG-l15&8}W5UP;9@*PBPKuly z)!eS{k6gLLI5Kslainb|kCW9m7IDx*GNM|@uh2qxRZG^UcpHfyYl_ z!NJ+n`jVu$(F%61p}5#UiBr7L0L;ORzCw8ET&a%kyfm2HHL@5h|dH(ClmVvuAb z*wqvs`ZI9g5Wg9Hqoj}tgF+^-t0*KtS8Q=v=y-8o0)-XlQdr*il&*JWPl~>vthTTc z4{vnAs_M$x%EHQ}{!$znv_P3}Lu;sUe&0wb`i$hkJ@=QvQMw|`JA?xHy`h%E&dv?3 zfsLK5O*r1VX}f7t!X_BcLMI-9_&E8SGEIIzlWvdm^H&7f<<>@u=I`u<`OBuoxr{n&aeKskLgwX@iK!drMrvar`0hl^;i=(s0 zXD8#2Gv@bMDFY%@mkfHoT!g~ao{iQV!p>e`%}&VXC!^=}S)`lBc?aB7jAQ$PY>&0I zNs?KO45^DUmuJ@EPv6><-)EMhj~)~~f$indp=GW!7@fk5%>2yx_|tL!{Jt0|jiiBT zAm11AG;n+mmfNBeNywa>5-El?~^pH7e@Tm^CdiO)3d-xRTfzWZQ=Ip2$0^$vApd*)ZwdTw z3H<-P1TI?vL%cBK8A3r|>D!HS7_c4!14XbS0_!Q=p$Gm>PZt_rx)rRv6TQxtagN+MB>f zS)B3X@4oNeR}vs3A&_hmj%*0Y&PzDLxj9KVLjrQCAtW0T$VGM+!l49^h^PpPidq#B zEnWy-rM0$bwW8HlTU%|lYId!~qb=S?ZTtH^GrOB(H~RbiKmWkK-V z^ZayKMB!crl{#=Glo2kR5Fme9RA&N+LQ}vEDgSfhL_9GjQ+@}p)ZKlQ&QUISy+M8W zbMQD?7>;G!67iXdRPy%aM%@U+`7fIb{YPd1Pd13-*Q8gT&A>hX0C|V8qv=W>V zxwX5>s5A<9TeS_yNp-m0@sjZ@1@I$RR+8+_rj|mjCJ;m+X_sUNQL-jeqf2q`zAH!t zyQ_~^yti`aYwu(~tJQ0}yWQuSHoR;3$wH00Qqts%V5bXjJ9lQkYlS>w%*&e7``0Ev z@6$XpRySQb`4Uw6#$qo$3Z%!~#gwYRFF|dAYNh z6WwSb8gtajs185Wik3FIX+Y@6Z<1`>P37Vtf$Gppj&3)1g5*HE?3Rx12fO4bmYVcx zB$?dgZHT%->Xz1`Itsewgx-Ddb**(%yc^fnqEX#aDP2nA;2x3SxeJ#)C@+;{H|`(u zUWFW-X2kGkOgLMNO409ENRm_Qpd^rp>LjBXL?hskv~D-u@OllHcDOlHXAwtk5G0E+ zJDv(YOYXmLqMI)Jw2UB723DY=Vt#e>K5hvKjSkFl{@e)BcXzz*m^qw%geM;?;A!xE)~!zzpozUDRGO_eb3 zoht6Ww|De|#?9ou%CWz+`|z>zWpC|S2ls)e^5P4gxOBo_58UB!<6Qh%Y2}qCiqxyR zHS(^UV*Mz~r^T;kfQ)!4bC1$|)^WmJ1nX=ZXbIbAY1Lo#jX|g4U zLpp|O>y%Z}>P)V+(yhjBH%&BWaaV$9M=^RxGCOurzwm}5FL7uc{4{V0Oznc3F&;js zDyS8brEVPE9dwtu>KT z(c|k-y(ATAr{j1He$o}1_FK2#w&)}l78X15!ZN>VAxI4}xAw>8yC zm(o>tQvi%mCeZ3O(wK5|mrB-b2k6=@;S?OfWol)Iq{wbWP>lYF2>L@z)^?*_vn-hq z(a>oPCO~v5?iq4iMscc?U)6!AtCYfS>S{N#yO9Lax^ckYE)a>U9+afrxR=F(9Rnps$qEY0Xd12D4bo(s z%G$klEYXu3kDkn+nHp_@0pM`+tAj%7QECD)#c zLxz0JbxRu(HDfUqV3MJ7+F?>ME|~+$he;Y2dJKNfj4V+)0SctEZba9Dnr_Vn2Pyzr z-EJyKl~MU_{9jvyK)k~^-H{Di$uXoO-n~{Dfl}SwsD!2_{Ee2D;i#>UG{ZCw+0iXY zZpm1MCUm*o4vaHI<*Z|XVcMrFka2&u@rrJm8Z?Sj?z+K#zs4a+j%TD@M$K5q6$a^y z8{Ow#Xp^cKt}s^G-!0v+|E%Roc_gyAr9*D%0i+w?kv(J|w|;MW(|& zteb8xX>1EUR`uE$Qjr_E$$y_iIha9@a&r~Flx0cOP?2DAH(&Z}{6ylp&$B zYi0Z}w=CVRCXYB+q?PX6N6z6k#Vfm=(y$Yfw%ctiwJyEB`{)Rx?cfy}Y2UfKTw2E! zE-N)%MgwScND1x=xdJU}m3L>j@wT!LPkOzShKHUMZyvFCcV>mORB}s2aH5B{uPVI~ zcOmt$k=oLTiSd|rHw_UtS{dEj4RpDeN*NeQ=*N8+2%UT&bavx$oe9qIUL&J%!Gw%= zAhf6!?IZp)7WY9gtfBGij^9U##`x^+Y;q(>t;h!q0{ra@Qw24J_(KcvKaB%$)Pd)K z6Xdw7+z!dT);$d4y<4KIcH`&n-bI~F^cGnh)x66|C8f24}x}_5tjogH#b+QF zYB_rJU>1?zjZxz;>Nc39-MiwYVbUqxr0+Te#-LO|B`$rCeGmdEahFKsW|er~(X zw#rsy%duIkzqj6C-Da(|F1F6Gron1nz;p~&^0q-c{vy*z!zlfq^pENH>l^eFU}LUB z$F#lL$F(t_AJD?RWquDy+ppM+39a1Tl}?rwJKX=tl?{A zPE*eUWFI~wUv;_6J@d7)X84R;dA7sl>Z!zux*6Kq+BzTduJijmwYAyVZSA$F*;Ch0 z>#b|___o&8wbfzet=a2z7WP!2hy=g`?ySDbCqS~VB zc{R1QPN#EL&pedfIzt*%*3(tr;`cUhh8dslE3WpGqqwK=zk`a4Lc9`KfgE(r2|Z;f zw50I67==Km&)*4?_}N{cZgNj4a;`7@c2G`#8(pBb(ce~2_JIb~KeMLxzI9u9S7-LjM9#9p4+rHOP~F&`8OT&wcz%dXp}NNR z6e8QA!oLs72A>Tbp&O!ZU5m%*Oz)YFjB^X$AC!?=S>$l`Ohb;E!k4x?vg^IhJTdaJ zoiiN^J$0KsC7sQ_W>}%8gv%E7Ox4MzT`7exZg-SHv7$3_Hmly7>!{`1CbhK`T3ETb zj6&J8$CcyE9*??F1-}GcoYyz2X9}*pweb0pa7D#*&e2xa>Osz2$B@bO7F=>&bd=|Q__mgx{izL zVB^NuFGo>N9<{P&N;hRGDQ~IsmDc&{va{u^NP^X{iBYF4sY`|PkUqNDto$m zCZUom+Y7Fz^je<-yO6Nj++5d!XbpbZv`f{tY-@)n*TI7q!4(W-msxSK? zBA2&$!|k5^e?#VWN0_acjo81sn9X?E?4DeVuUHufYB3q0R`6ok5MC z>i~(hb-a_D&bXe581Z8YuEWbiHk&m|MM@4&IS@)=NOAI%YeOk6=kT6vq>L*lp;wMB z7hXc>Z+6cFq;4%>xO;@zyc%c;6}8a2j?*#2!9%z@#-gv?F|NTucJI8nqjKAj(dSI) z8ISTA1@t1L7UWEI;s5c`J>zt;=G+waC!}uQPM!pOo$W1|xtZ8?ZiZ@CX72b?PHvM}G}NHP*d-&*HAI<6Gj2c@;%96}3f+S1o~H zZqeeZqE*h>v%|?Xm5b*sEOSonNkj3CY?GW#qQPOAwTQ@MZf0d01co5R;%#2vgvuR! zw>Hx`x@QauPGjx3uGqj`Gx?G{jFVcguQS^@qGvQtPhhP?Z_WoG2`Kb6*#f*NMB zx;}bTK~G(0XB}G5-jj?Bsq9i@;H^ErCkY7)*d!!Ch={+KRJJvEy7C&E+ZwWoS)S%h z>lw+b&PK*%UGv+U+iE&mntjXKNsc1h*M+Gl5gEp@G-PP@O`78+k&cF`JtL61k&TXB ze@8tk@-A!cm^5b|900G3V!I@O)glqd(zlxOoN^Jn+>ZCiO?he zv3?`;#p8AF!e0C?-9@@&?ccSJXt!ufwKnB#t} zTZR0Et%&M~IDvp0l5c#jugn{~c#h&dyMtcDP`b_E($d`6Oz!?FODpB+y93&4Gp&8znzVsE$vQ^IP^$V)9QU+9w!TN>I^{KhBvJGnp4W0^5 zmk?kp%UYH-A3p_CME&&Mkb}PA;|7)MMl#T)BO+`o!#3ZO3WVAtck7*yabok%f|{+^ZK@Y zdPdf^HAk{(UPxxOZyYDOKIm734-m0Zm)DfwNT8x>uW+3gqan@@E}GXAKPsLI<@J&;J&>3c z#o6Cc2*T*%)doVuBjYGGvsd`agJ#aa8!gfGJ_>Yn(g!M@>E3+!6KeB{7yrB_dzPI} zW%rVwJX|g*s`TGb8gG7iO|V-^=;|f^crhFAJ!Eb5bZ&&GD19#HHNhw*#htzNqDZum za*&GPy#gLX6D$;%)GHj^X`=6i0P=1Oy{*7&Xrh@S&fdDA>h4AU=C)??7n)$AKyEL& zv;*nUqw8Jdt;btXEg4KUjxbWVu$R2pA$ws|qrAhj<0}s)C%pOm?Tml9nS+9SNNzikw~-n3(v2A^^P1uqIpg78vUBYHA190 zqc>&>ABibt%*vr!A&%i4y54EM8Oae%`4an{feX&LZo@6sDVV9 z2iEY$ARfM7qIr4l@|5My<-}TfFFC;@5#ni~Duui_o=~rQU4I-bLfj`ZPIAQ6GpY;l z3&|0OJmp2p5&wxQ>XRd`PODDEPskB37aWls@j#CL=p8wP7;*KiYIAjBwGbR7r+A<~ zT8{WNuj|#Af}@p7S1(dPDy5qUDJHK*fg=p3mT2yL|>AzFm?_f*G_ zBD72Mm*(InL}-N%6L*s>h4H6P4?yE*4FYzp~Eg7|hnxw3kJOe^YHd-(ATtuC0MbW~AWy>OZq06DL zTe1LJN(-F}b$CZ7wX*VF;VMv57NuzP{NQ@Z7ME17s^ZF-<PD5v779;gK)~OTUa1jwp@`#mdSmQfaMOUc9($ znXbrLq$|oQ5-gEdLJ$(o(k}+rwHW%ST*tCcecbJI>)aV`s;Q)xyc43PXkFu{hO7zd zwrJwH&bhj|W9ABag#W@A^!z+#Eny{eQPUjf9NnCZIaCv5T%5S>ey07K z_I2$G+9$OSY46k?((cjvwd=L3v0T{_TRL|24L981s&|{tLGK9xdYQ7y-3O1S7n9I!h<`nqv`O?Sca-X2q@sm`>(G{ux|G8w;sf4-NDKQ-Q~*o+61Y$X+*`PLh&V5eXvyz=Ei z^m&+3Yxu(OzTtJl^M9yc*qH-9-6e`EL1U`D%Hm?3EkkRdOjL z9le}|@`b)63BJEuR5<>}a zNk(a2X)nBFq=XWsU9a?yGzoU-i>7O1UwDhJUwC<6_|nwA@FidM3!m#3zO`Stp)Wjt zPNFi2w?$n;-(u*PCq^py^73KIIAvLT$8uV+t%6FSwC|7P$YohqC6;8p(!QIC=w)41 z@ZBoyyNT!SS{zvdlCJ!goNg@Zs==;WgIBupYigEIbWvT0bmbTPd^`55urM!O`TD@< zB=XI%EOfS!JEDoi()*vQ%Nr0Ikh6}vsSB68*xNtn#ijjYb8Z_D+dLo!cQ$>r%xUN! zE3D}s%S8+I<;>+Sa>7@ictihl6FmcBGyBJKE)0lqmw@3~a_;DVE^WXS#&DNP;hZ|| zswfiUzD^=B*1r~oyG;t8Q&#jpClAP}8Ni=rKsin8aK$OZdIGJYBtd$+Nr84tFA33%K^nE zev>W6WlA^vreFBQ5z0h4^s<7-Ik$k)xG_fJrOh!CXQaePEc`ZB;?H6w?un7;#Pk$J zl51!W6Y)mD`(TYo1x=2^aY!D5)0v7H~KOi`9EuEhJpa+oMs zhL@RzX!hC)sk@Lj>*CTSq?ilaFDO!512z0HEp{bcUJi={>J+uMV$O83#E9gwIiI(t|V%Fvt1o zd|oVLx3B;0;Di@xYQ?14+1!r(@~tHL0CBhU*JCIDksd95xzk@uQu4vZp#3Om_XTnj zhl!c|%3?l+^g`Q<(Mc~*_fams&nOsRHFUo$>ndq)Yi#ap<&>}A6eDdSJt>xLX}kOh0J`4oopt+Trd|~@bwkY5X5Kv_+5GR?JD_tb7hNiRBuQbEw*+nA^OQn#upVS?E%FbMK7uzeG6-R_!nZi*kbta5@rD)6 z4Zfy%<2l{ov>KnMqq==d`DZax-;SC3R?O7bVy6BfR%%(ytCf8iGw*rc^C5cq?q+#g zR8rY-x^0(*a?yKGQFByEvS{k&)|!sGde6$>z$lz*QNM)FF1}baT{A2WKpvzKO9xHq zCu5{-6Hna_h z78OUL5GZV|fGg!tW*)_q&_4=~#{HvKhf*SH7Ax5`Sgfyu%qL{&Fw)vP+s6M;hKwJ` z(E891Wq5GN3{4(9F*{rD{(%fFLlY@#Xi55^8sdK-!^S`INv3bfzZ6@98^?qa>o+cH zhLkLS)l9!XR-%vJ{TL7)A<9$qAkWqAt7}cc-$o~W6P@(?=%iQq;A#)oB`BFyBq#}|^2NWI*T+gcL_Rf_MaqLD61>4C>CDH6 zJoDI)XKoqtjCkqp|BAkM0iV#?F>`sUU@ODZ!f)!(YjhPJXA=((PRV(b-=(2El~p{~ zjnQd2Z;86a3wveN#90I5IkyjZgWr4kz~~M>QHQS5x}blorMQ1=!?^yj=5GeX-W(A7 z*??I6fY_1&G5!h|e#LF(zCgpVrf>V_Y;h@Ip5l-^7pUx9Dpi5Ac$1kFHiX6Q1B+gIBf|?HJ`7<#DA>nJs@KKf$E| zG@9o$TQ#cm2}t>&znKBCuwzP0$3hDK$9H!$iEOTq%`*GCnj0dU?q!;ZRho&5_)(!V za{^*1$CMgXdJdItt?MG;N$iGBRw47LnWC9kqM10GAF;L8I6 z0c|&S_{0V^kue>$z}ii^X5wVc#B6?~ER_LT!ohCXv<#DM>f=I6WV5i%jhzx-7q-=F z`&Sns3UX7LH73o(F`9{#u`nQPB$|>^29SgnndxJN=0?csc8Kl%0_lm_(i4UJC^zB; zDhmjsh-8qXe`|uB8B}(t)#uUD6HIy{mmeuld4TL9f}i}X!Tb~oemd*6^xG?q$PqyA z=n0L}EIlzwdIHRJW(3G4qEQ182O_9%YuLu7`w9}I)A;WW2$P2XYy@cQclUt zg)|@JwuB%REtM=oDg>#R)-JifF`I3~@X8sVzLe7jCko)Cd z0}hQzIx$B&Fnkuy_ab{nfQ%8w%rntfpp%Z{e|bPy9qiZ2 zb3?71<6}UDDll>Fy-yZaSY4AX|hnd7eN#--Z7(0^^Zqz{r{q z;(5G}jSKO7*LdkJ@Qi5?+~Np6DXAzRYz@Y^b;k|O=Uv&-T^8xC;nH1V9Fgh4m_&~C z6{ym6ATlFBmIY(x$?_GXN!KA;Mu5x)#>|uHD=kEMjh;U%bTdO(;L)Nlbr>_$b*%CV8r0*KhPkgn2gPuNbPZfSu;-lfqJh%C`p;MZ-R z86bOtAT2e6>ZQN%>)8k&i#MZ3=~+P|PrP9*_Fm#$fuEMn%npRC38E!Kf8o-@sdU@I z(8I8={7mmcZz+BXZHvqZ3=>yRi7G#gm%oT?MfMH*iQYnQ0e&*cgwF^hh{9vi2V5NQ zLJ6Got|kv;#-Sh)B7KzC>CME?hZF8VJa3q2K>`-<8yOPmqdRNheJ6Wsy=HH+molUW zgattwrTB{s0m;VVFqyQO+HwM950C~4r!bNOW7O_rHgn|hkk&T7tvC=e`jj08F|}p4jc6N<igPO6dq!qb##Adiuz5iB;;Gz@P@Z4fMyale=h7{NfjsX+~dO!wI)(G?=i zj(gMKV>)xhux4mUK4)FwIypC>4{@C}pb)s$Qz4jH#D@N|6-%lYj9E8f-P`~f=L09H zQJm;FCn4@jNRv&hf@0n`t(&kcRfw8V~e9atDY?=k=Y*o9FSNFVR^UC{q+5 zqkA#?O7p#awX$aA@Rg}6MPHHSy_g(G;9!Mm#ihMF2XnARaNzo%&-Guy!HSDkWM{TR z{t`2h_*5Irgr}p)17XX$7HkjpV*>??dM_V>4cC9amyH!GR}5c~x`MOOd)W|dxc&n+ zmY9~O_wE=f$9KL0+d|vI;@<6p8J!zq^xr<$x17<8g>x2WXZA_1Ln$n>h3OoJli2^) z9MGjnao=DM|0C?;{}ucAzr#-c)7Z;@6ubHNU_bw6?C4*GJ^k(2)o;bVel2$Pmtt?f zByLvRl(;?S*#LKG8nbKE^)M9%nb&HMVbUpV>aP{mu5a?RDEL zwij&A*q*dKW_!qXukB9T5!)fGP3*Dlu=#Cmw)M8Pus~1^A^B3K>H9v1Y zYyK&G{5@bk4k?10%-5OsnRl7DnZ4!~v&Vd?d4;*kTnP^dGtC9&N#^n9baS#f!EA<% z!FQ%FO#d|f-Sn>M&!*p-egkiRPnn*8%)tpr9o%ZV0d^4fnl3kOF?E=lP3uf+Ov_A* zux>KfG#yT3b4*$A{Fi95n+zt&_>J*X<44B#jDI!$$@n|?|9jf_GvlMi2aWd_?=apB zyG2*Q3*dI64}Jg}jkU&=#-+yj#uDQ!;}pm%On}5f3S<^6kXrbU;Y-864Cf8KhQAp8 zV0a0B0e@lmiQ$ytKEpA?ZHB{!YYjc{4%lVbWY}P+hb+T#!(zictlShDRKrBWSeOSM zX^1lz4I2Ho@D%v5{%`uX^{?w+(Z2u>4^Luk=OO*Q`aAVU^oL;6VUK=?-mh=duh*~D zuY%ve1(1K3t)HsT*JtZ9^rIk`YlS4le|2B!F6chc1$1xfUemp-`?cr(qO#=o*$Q3E38G<8P>_xTo_|bIaq9Ci$`DsO1*R^_HvQ3-U6{W=p%J$x>%oZK<(u(k1EQ zbtat*Pllgs|Dkde0r3Lj1lR@G1Xu-F1egVw1i)boUELr+FF+>%O-JVx0kQy% z0MTabe>}$iOW7s(9s$P%+%4dkfV%`76>z73 zI|SS=;70;(6L6~l>?#uxM+Dp~;3fe#3OFp_1_9R#I3(bpfa?St5OA%4YXn>^U_XJ6 zT_s?jfGY*Sy%C+;E8q$Ndj#wjuuDL3fLr|LqNL#_+O$6wF-b6CW>tout7kxfF=R!1vCoq2xt&cFJPU3Ist11)C#y% zz$F4M7O+OZY5}VRtQ4?9z(oR<3s@$gMnJWIr2?u1ED^9+z#;()1uPISUqGdR3IX#3 zlnW>mP%5BAK(T-#0d4_v1iaaR0{v*Kr*6+h#w_!(!#&p0c7##!+*&WfLLR{V^!;%A%{KjW-{EV~WXPgy3*B0 zx;QId7iY!m;;eXGoE5K&v*LAeR=h6Gir2+i@wzxGUKeM@>*B07s(9s$P% z+%4dkfV%`76>z73I|%%Y-|t@6?IQ6<0&Wvt$=F;TrFU~fU5-T6L6(~9szp=Tp?hOfZYOi3FsEEQ^4f{E)%drz;*%K z1Z)-1C18ty%>w)cn_NBtUICo~HVNnu&@P}&K&yZj0UHHu5YQ~3Nx*smjkH)+COs(O zi+@ktO#A=vt=?{*jQ#)L+pe`;YI9h>u-<2_vyQX$;_K)V%P8~f*!g#x$3UX~N2c|r zEaT_KSB!^@<;G0I-waQ~=loW~WJ8?(BmML6CcjfZMfZ{Jq;5aH;>K#vYforBS_WGH zA1Kd3Yhb!!ke`$9lI!IR%|A3JG;1`|q)$Q0kbfmXTHg|DQ$SjUD@2rbeXsDbJ$%7q zq;jiExs`T(VfF})Ycg{iNeGdG&QbhaaZs#*Dd|~MnEr)V4EGFNz9IFn7GXC)r`)P4 zw_253M<}<_`b|cVmdV626e@@;2x6snH}(^hTkwB=ke0g!kUNjA26A`#Sa*orTc#6Q^OtpHW9ezVr(qfF?Tu0>OL0)Fd&Qu-`+KOqrBJ!Ws@yU{xrL}^ zf$-8;)JD`!AG^H&M%0qx`H9MrOy$VjKxnlqC91hD=NA^O)PE~VIWkr`Vpom~SB}uh znE|oZrAZ$soq%QN%dmYD=^r7Wpi^!dr`%*#ApCO^EGV>Q1p3y&2DS7KZ00K0o0P+I z1GEx`ZKf2yiP*nOx8n*>?S|o*8ZMW?Wka!(s~noB97AV2hlc2uh+hvjd z!~*X&AM3*A3v7%v*R}b))06{l<$$~}5HcPyocC$ulBVHot0=HJwEwcm?<2`BF19Cx z>u5J7NjXrU98meu*R^?OfQ(6i18m3;9rza>lwHvqGA8AKNjZpPqH=)tWHJK6o46PiEJ4GG9D3gRQs_isq92H76_S$h~CWf`Ixu= z7{X@eNM%Qsvcnx9+Yq$09W{o$d<=z50}U8NJH{zH?8=T2$_|K9cFqoTiUxvRi$M+4 zNrQ;21l2&%g1c3Mdnlc}f=%gXo$&}7`rE`?h zi8Kh42%8Wwt^&&pMg`7|J7)w!Mj+CY24AHWSBcn4!Zs5%!Fq=RSJCSel=W?Bf_Z_E zF^Dl-R)#7FkFgdM4x0i94O=XG*Ff;oLxWYPG)z(&Mk)9AF65H zCCa*y%DOSiI;trnAWTQZV0weEpg@_dQ))8;!d66#Jk2z6CnH-%Kp2IHk*5i(<;rAa z%LoV?5Ha$srv`>6dgN&w>JDh6dfNBJjeq4+it&B1&qlPP^8rL^( z&InvG6t$Po6qbblxq*w3hbDV20vMSJ@nF8#$JUrPH+!~}`deGKrYK1nN>Wi^4X;wk z7$`A_=hqrOd)2_$6)X*5SCUGK?L{RiOG&aTNl8i)8D3KZA$tykW=%X_R{PjW7(Eb= zd$Glzqa;jG5@dIP>^Fc;Z1VS?^ROMgiVD$A{-90%Bqd>jk}#GZ>GaHiFyIj5xw10W zbA>$6o0Nn^C4rtRjsTfz;Lih+P>eJbo*65A1u`60CoBqtj4)(O8$hEbkzM3tHA3%v zfKRwSjd9E@0(4X$rF)fakFRD1e_Ur>!pzNbXKX9hpY z^tf;bLS`DGn{F9Z6Qk+I$oEW=@5$juI_(aSsRlffC#DV-Xsq##EFPq25;8(0-y@&2 z$@iqn_fQpufoj1_v|MJjk5%=T%gmRzO_#S7@MB0WbEzmBEtk2J$_^!$nIvz^mA6gc zN6J$aATteM0|qY!$(dGR1T?^~TiDE1-y9&z+vH8{d*`fGIm(vR5w0wS~Je2`qr$I9%ijPGRK86%AmDA)d zvz#_YP9uJ@10jPAHvSlmjB88)3w>;X8PzQ7N|sYc%c(O1WSjx7E?H5N{Q`dT_j_sA z$W}QuO-{veq@3!(y_p*bS!IAsPyZVTxBYw{t1!ddWamOylggGY`LabW4v^^u4F05n z(tipexwXD17vz3=Bs2y^ewNGEjl>`#{}6TZh11e z5c8Iw=PS_s4mk@0Y5NWNS`pUN&n^rf5!5rouqUP`s4*SW$mo zT$)P?HJ41`#}F^YqHOdXT1;h!;w4#g$t2As+5AX(iUUQ0mkCk46oHqpBzP1fmuMa| zYc3h7xrA~|3AhC@aRVPxnmFbrsr0sp%u=;x;_C2!E%*O7M|xI@dn@itTpKI^erW%x z{c3xyo!ND^S8ey$T5Z#9X6qZ)W7bCNB+CcbC*5etF@I{l*Syi3Z~6ec+w+WX81FVN zHhg2a&M;Qrt3Rpt>T`7e(%q|T(%H1X)q1tn+GORg*xlT(RKWz|@8yH?B3SqTwPvrT z3?hTi4*9|Ve|cg~kU9b*J|jw${u%#BxvCDDSoHS2gv7qMDLz>`Bpo(MhlWXq&;#Dt zLFxhAcc}wk-Z8&D?PtHFhZrebhVD7d1gWP$>dE6r8HsJPgW<*>Btsv^&Qkf%r(k3h z;;tPb^^6Vw-#jNccPIva*`I-n`Z3TW9W+Tj!=xT!z#W_;7)Tjxe2@LY&z>^ZwYJ0S zLFiqfh)3wXe$e*;AxM)@Ylgppn;3cm3Owciqa8QH1ZDV3iFQS z9T1=MyMwa?8H21FVgCBLpFL@&JY+}|RuLl=fQ*!mNgYo7==9v+%n%tFgZx>tCqag| zI?=%iDhctTkvq1TI+8kwk^Eptp}{tRn21d7m~(&TXJ^bl`UWfO>VV3Ur(tg0f;zb} zNU94o?Uqmp`s1vF?4MGJi|DgWkX=<&Sxw&Sv&C4*b!eR9eZ%W!)fLoDuiK2Orv-)f zf{?82s|zoSXFz}Pk|j{>hCA=FqLKoJQjnGMY`3xMG1=pA3`|+pIKy3sXrf&`U@&_i&h3n^8i#O)`x12H1{KZ zcG~Q1Y4=e@KKMos`I4ALuUFZj@e32HSkh~S_}O^p94OY5EGn6g9~GMw6bcKPC^ypV zw4dESQeM(lg^EMPL+@-Qmn79wfB~kdYom#zP@8@YUY|hYTSa3TGu0rWDdGTOQ0EiiQUv$nXO+6ih29 zz)#RXIuS8xcpyRpH!vNdp}A~fR$d(dY0`IAc4*CG?wc5U&NPz9v;+TwL+a^qA*wX1Z#DM&gIAUMlAV8G&@ zKH+D_jfQ?>Dl~A(PAIBT;qRP>zHb2QSP7fXidhFn=K3J%PT*1*QJ4C$xKw12{C~NU ztJpQ&RpjdE^wd`e$BQeaE*Z?!z5Gg{aqzvDq2Z;=pOim7KQ|v%uRE%Pq?rNoqbt29 zR4MP+AFecSQr`Hy+&r>0t_H`VQcOiz==6cN&T+r2^y@Wat{Rt{l3R~1Z3$+HLeA}? zNZp|;XJL5o{8+*8%mL>)i*wvL zi*l&06~Rn#xrs{#U+x$#M`EVrqQcYJ2-RP4z0F*AKT>JrYz}IkFl|EigsBs#SXnSb z)I5$2uK6z1Tn{Hg9rY{fI$Ql65$_%~LLJwk88>cR%DA!PC{sz$5uz~aJ~)bcB9)Md z1izp#{Jt}`aO{Y&nPZVPY>BzKYCS_95%HSAYR9QagnUctE_mf3m-dXu|E$hkbL{lpU zBQ3J#*Q2NCgK0Cj)tk?4^-c+n7IjUEs_RGn>JomPsNCq((Nz7MV5%rLH>%ui{mO;! z{Cp9h3R1_WQU!%U(l5cM@EGuHe(7Q^B7)g z03g+nGA@N`C<>B#39eoiRl|{(HK5t*Jsmz+Anxc$o{&s+ObwFO3F?Tl56o`vR|oks zs;h6Jf=Q#31nWZIBnIm@^)E=;?=YY5;e?M&A4z2=2Zh3k;*28v#(rhjLEVV1n3$4C zrSgNMg#uEe?B24&yp$itPUv+MR*VyeQ)FV0G*3_>%Bn8AftP6Yw8GX#LP7!s)FA1Z zU{Z=Q$IPzxXUTQmt!*?7!Ac@sB5qV1rA!HuehCV(C{_-kkl)wbLj6YDfEc}KdB{Uk zqBAH|OEl4>9SoI&J>di!n^EJplz?|^JpwJ_UQS;TvONM>P z#;k%Dvzoq`|0AH`iCw=eE;Nd0e!TN`&#+`_oxxapAhAB*uEAE$$7 zzzg>G?Qg+mz&S|yKW4w*e$;-G{Tlmj$oIF|8|m50Zy3jFdsJWH+P#iLl0n`d8K)=xzs$v?1BcsX!9_$(ez)_=cW%K z`~N4?%cf^w6X8Lui`-NDU;0j3lmzWAo`KEEERG7~;82@AZ%=m%v9mx2< zZ2T205Izj~{@Wl)ai#Gxqu1CB$^PZW1;!%dG~*;=7G(P4j5@==4WAhPZul#t`Cl;n z((t(90oWqE8FKu4Aa&7h@EFz@mO_GmHY6~dhIB)s!2;R+uk`k4(MZlZ21Y)OuUHAy4v zNq!59k{`pSXo(-8yqRe(2z@CINw&#mFWP2s>kvdl#) zf9YP4-}O=muL|Mb5bhG_OcQ9!5vaTy!nZ@%62c83To=N%0_FEZ_#R!k857E!U?dcX zgnA>PcSWeRW5pwpP<|vdF&w(+-bm=yNN7_elB#?4RL0$m!u+jfKO~2^1k=MrD<%AqCnkuPzMjW)qRn)VkDyXwgP!(JqRdogWERL_(#J z5WlUPeC;iz&xkaHeijMwX@{S^Kav(28_35e8=PHNdNy=+UFn%f2>ZuGJ{ltIr{1o~)5)vbb(%y-r zN#RhAxB|}RK=KB3Qm8%>s)~d}JJQ**aGG;!IFv2ME6z?3{7`6;8PB>Vd>={&F76AK z_66O2!JNKeLSN7l3GVwS65Jcl+3wspax%Ys`AoM8Jzg0j=8Hvpxx~ifu`h~P$20up1Y~m>s}ZNb+~tj zLTzr*oUoef=I;_sO|=bfacfd&F1_jyD9JUK7Hq5SE8wc$|i>PVvJ99G{??Js52Z&5A_nhW%*9HH8O;`n38CMlo5$DD_fGaK=djH8-2{6V|=e)qu11Gtl`zf%SkR_Jj6)_HL{Qbl98hYwatsCQt#5|LJy@JsYb6$@X~Y z`%73CxL`YPd)M{`RtC<&|KJ(hDXa|~g|7cW+dixgbipe?6Eyu-+Nx|7HaDaaT+s7( z*plH#%V?9VUqj3Py!Bm3D!c+6|7?rHl5B~$7%dVs{4bc#o8L9Rf$#Zq(CFdj7?fiC|(W4E!(*kNoku7xIlm9fI;HcmIXjM>oRPd3J5RZB8_ zZMXm}{&!(n@fE{4!&$=_=*h6?EKPdB&>*#?Ip z*$@xyeF=6LFX+$f-_^eX-Tia=v-&goQ~DG7qtM(xsNbjW)_3VU^i9y)UkR@T6?!-P z7Pz3b@6adffX@3qC2NM3yu9#x)Zvix+A)Sx_!{s@6vTZ(qpY| zrLGEk9&X)qolBRkbLf(xHE+~Ou=;obx*zXq->{y8CCM|^Q`QsKqt+wVgVue}+3&*2 zO_O!4b)~fmYd3D|bgRpnZFRuaS-jO~l`LOdE@1uUU1;mS0zZ^zEoUsJEGM9=f5dXo zvd_|O>B1^blVz=CrKQSJVR2igW1Zog_N?{{EKQz(Uj7m7LG3PC+LhWW zZH3m2^#zwUTkFs!V}-$}m7tM-0c#BJDsL#SDCe-sa7H<$oKTJqwayS0O))64tR7d7 zbG%!Kz;YeK>zWJ;3o= z^;(YCsMm13TD_X%esw>`t5mFWApbrU&r0Bx>XjUO)EAT^zTlTR3i3 zH*@r>evUrX$I+`|od)%Hs+}C?sB<{ZR`ITY^jYdGjx*Jn9A~IAI2Njf9H*<(IZjij zah$47UfUhRJ@BI-&l1l$1F9AW2TzPF+$+{>^~g8W8ZQ7H~TloZ`rpTzhU2S{F;5u@hkQf$1mBJ z9KT>+aQvKo&haz$8OKlAryM_FpK!duE^z!8`xnQ5vVU^?2m1%dkJ-l@KVlzo{E&Uf z@dJi;O3;0to#*&>_IHl&v-dgvjs1<|d+a@qK^Ei~U;&Q3te4}v>|KuUuy;7V&EDqt zSN2zqZ?U&HzRBL?_!ssUj(=u<=J*DCgX8P$b&h{xf8zK@_D7DdvDY~Mf&GEw@7eD; zzRF(Z_zHW4_v_*uopO3dy3=F+0QvX$)4o+Gxjr% zKV?7Vc!r(f_!IUMj!&>BI6lrE=lB?VjN_y1QI3zWM>w8lr#YTtr#L>$9_DzGo#gls zdx+zM>_LtXum?Ea&+g}VAG?p^33h_xkJ*no-plUgcn`aW<8gMJp(Bj(4%U zI38t3Io`?c{gDquv<7DVMjRL%x>m*6T6AyjqFB_ zhuL9{H?SKxUeB)Qc!(Y1c#s|BcpbZr;{kSni>N{&6OhvQzhm*W-e3XXf&9*(=&ZjQUyE{@%-o8wNlljG&=a*mg=%Q)^}J2-A< z+c|Dy+c<7zTRC>IE{(zRW>(q4|>(n}qYt^+J zYt>qgm#UX?yhOc(>$#I3cg5yQ%MI4u_%Q-GnmvO97 zYdBV`)f|_qOF34lRUDV7OE@l87juLRBFBa5LXHd61svzA^Ep!5lt!2D_SS{oI!!BjKf7m6A_Yb?6@%~|J81Empn(_W&s~GPewvzGwVerh#`MQYl z{$a}*?;o~|@%~{ojQ0<#X1sscQpWp-RWaT_YzgE2!xl5%KWq`>{lgYA-al*sep z7R%z8$uc=+undk4=HQsl(mAHFG>&7~7>=XaXpX5YmE$Njiem~(;h4;lIVQ0rjw9Jf zj)^Rh;|Ml_<8U^d<1jXiV**Ry7|-H4#<4h#5boy)7keZ|Izzfq!WaK8SpWab{;1t! zA7^{t_AA?7TZZ)$>&wymFH+a*F3Ii(TtMbz(t4pa|eaa zw=xD|5)iwa{7O(sdB zC^2P{S|!2AiOQz=%BFezC{yn8U`S^?aiFdoknF6Kv>axDy!7CUOnh-&#ysiszs zuc^I(x;W-I7_HP!S8DV5k+PNtLrU#%)jLSH?-OuIULVT3>d5*ct8jLmZMGd`u4iMK%2(hpVS6tMe5)3J!%* zye68%e-7lZ1p77vIb5w=VpCR+QdSd(B|*}hCk_Xx=p?d#zyy_h*^;(p{TY4b$*(#Y~7 z^0@^0ku>=cqNFlN`t{UhgD6R4AHV_?Y3-nK{7`?2ZlDzTuqq#R@+0zfP7jhEJ_Nv% zqVBu%Fk>~6d{uirp_^YmET0-KA5M}FQ|i=UNIf57-c$wtg(v;L`zLc=1QmMuaJ+n2 z9Etw2V56WPX0H1eL|4BLV_9Zc!;cnf#$+}^zQ!qElfjS30|8&5*H6kLgYKrki8-SZ zUhnz~H_P%h^7VT8nql%am?xUcfd@1G+SAXRT|frOItiUuj-oH&^0n9_@9_ zJFaOI=x#`VR9+g7Bw$*+m*akQvuT@ouHCfFYuZ+iXAj07Cv^fiHrj0b#Hs&%RH2q~ z@bPk|>_BNgLJ<168{hlHx|DkR0k)|8YeAF zf76DDX+yqr=}tBEIBO}eWahOk%MmI|CYaH%p|qfK?msw3dTi5w*|fp*c!p_1 zwrK;!9Dba17T_F`5p0{`Vam{)cOJi$UIJZ3gi(=Y?xO1Dqd?qi#&&2 zaAeSNO&>uUQQVLtl<;O|y0L}nC%P3F!C;Jq(%YKTl>&x7^ z4M#*d*c9sDug`2g-`5_t6vLJr*fJ8fP!}9^e2Of05-lCCAm_G+Mq!H$-nPM(AZ(!@ zAfe-|qJR!uV(D6T!h6FnH{`;@7<2S-O%Fk5!vW`g4dFdB`=CY^bfspZT(~a+_l=S+ zoo~J{|G1`?z~ANx!5`jB$!nNmqFwOGDHHAsH~+7hd|XpWkdfbZMDIaFi9!oX~7M3WGnS%y1v9?gaN`z-|so9z_lRD}6WlmiaEmwf?!N-M_>)#+U2s|9{;3KN45=`{2(1 zc3vlH@BiNODX!|jg}eTD;@a_J%8$zD%15}C|EjV}c^X&pA5!j7Zozf@%aw)7JY2<} zu1rDw{3DdXN-w1guHf5IGyk`^et*>UrfVOr-amnR^Vi_o{Y|cAE<7`i229R#ordf7 zV_dnYhd<;>b9r25T(gfmzjVHXEA}rspLK4*_4@mqw>q!G)%vJ&zH=6?)lYR6IY;73 zeK)7m@x8N;vz_A)$ES{+xH^B#@fK>^f6VcK<1SpGzuIxBqYl^S&v%^Rn1rkI!yE%0 zS-3Xub68QY{@3;s_V?^>;JW-)`#SsW_NDgcab^AnT$8W1&#|9_EAr#*qj4E5+up<8 z!LHzH{ExQJQGfnn+pD%+wx@9={vp(ye+#a|Uv687yYXkD&ipC1LR^C%jQjAr;0nCm z`kVDzd=qmNZ7=S_b@3;xk6PE@s`yQ)tNvnK6Q65656@BDg{$#bdoD%&`IVmYJ!g0( z;Y$24)SRD%>+n90)%`23!k<9a*{XW;)AJ^H_tRAZwSJ}U`#4YdO8vBcuXHnz*TFZTwTTw4W z%o4TCx6Hy_{8KGOmXWxJzmKJxrJcoT{=@ve`BU>T^IPUu%sb87n_n5ZtT<@YOhwIN zsfVJ55>f_BT@|%^Lh8m+x}tVTNS#^gsHmM1QW{I`6tzP_YR{5iQG*F7z>-H%eF@3S zl1owD2}xneuBgt0q zmcCcSj|u4qmcCKMcM0iRmcCTP*9qw>mOfL&7YXTemQE_-(}eU1OHGRSI3b;2=_5tN zSz4ut)hyksi2D=LeJtIjh`HkNKy#J>~LEiB!nh!qLx zUo2g(h#M2q4J<8J#B~YjT9&R-#5D=&YL=ENVp&4ElBFvYu_PhISh`dZmnWplSX!)z zOA^w>EJYQuC?Q?MQoSM?64FAJY86qJkp9Wi0!7p$q-vJtDPn#?x{#&0il|IT7qB#2 z5fuq(4ofo?QO?r&iYR00JVpG2rE?TZORj38_y)>djJ?B6_lvp$MMgL{~-dY=+x2L|6V6C7#zrnp5z+MpC-=tyAy}C)z23 zXEWhW6YcohfFgKaqcEP=gijHE{uaY{h7%q|@C--sJn~z74<7zsLi#l!@jQg@lEXi7 z*!N2K2bR83!aV!n`_AyU9QLIW=Gh0|5Qe|vu+Nn+&p!AvEc_XVom9d+=isZP@JSA9 zQo=mv;G2=~aSnS|3BR9^-ec+QwD7wu9Z|yXB*Km)q{A#7RKkZ6(wi(DP{MB{q}N$` zMG3!}koL2*M+xssNPAh@t%P4nNH4OqQwi@%NH4JTUnRUFAvLn}oDzPXrDv4zvn*{_ z!cQlpr&!vmgr7)A+gRGHgtxG?Q3-EiX@e4ejHUHT_)(VDrG+;qq>Tw_Lqb~5(gV)$ z+Jy9QLV746J;>5EO8DA@w49|Yl`zkusP;I_b0?}B4qw6FE>gl5C#1zJ)hl712~i(o z_&g4qp@h##NN2Njx)PqAkj_jg) z6!8j&q4Y9KFDZh1lR#+?hwV}X_a=eTZVua_2<}Y+rJWr1ydtTA1$;B<1tBc}jRxLK?}^FeN;kB~=OMvXrBQ!z}ev!aU2P zA=_{t4ht#aOqMz;;VvwtDPf+U(Yj~26Nd$qaEFA%Gc{Vh47W>!1zGYcVINB_C9JSy zQ^JmfWM|2wg!y?AE#Kw*DZ|h-Tn^9KIX@{mzi=2zKeP0$lJi4C`aU7?oSpNolEd?9 z&JiVtM?lUYC5QVxNpHy%0-yhQF3x#f$$67=LFr&Z;<1pkU&%SZVJPufpfDZ_IeV2H z9t$M#SRiR1r+Cnn!($-_C7xqR;!!~oj|!4_wk3(j2T43WNaA^yBpxXw@kk+wXJC?e z%#g%mhNNc_W#Q37VLWYLd1l;_-;0uq}x&9$OT~V~Zr7sY&8d zMiP%Ql6Y<>iN_mB>k|1rl91NY@2Pl!L98+b_;+C#jkrtZS5fmyTXSCrSyDzC=3 zFj)ip=zNK|(pEXXpdmxJS*U@q#a~rDw+0g#!cr&2r6rjhl~h-1DfL0A6Ov{0*`(S| ze?9X5brN0dzmBLY5M7GAf0F=p0aeuL@~@NuDHF*GM7y_Wn4T&u;Z2!fPSxDGRkP77 z!D3F);!l|b)s@uZ+D1#W=mJtELNydxG`>!YKV=fBZj)n6@vkFlmR^ZP>v%4yCJoW=BGB)`I1LR9=hl{U-Ia>xXofBVrxY=*eA1Q zquMB3%PqgCbzLP3{)=2l!86XmZF5N${I|K(OPe8BF`Syce~}97&v0Qw*k7bKDgdHp zH)sVKI2Sv*ykob%8dV}KowN?6EDV8vl?CoqYomq;voHp>WI=kT679DDZ%$QsK}^Ff z*Bp@GtwqQEB2_eZkP>XviHGsqgcuS?t2x4!%W>a9FaYyP&8@d2W00p>opf}-kt zsUm7al15H*?B<}hNiHsHQ&LQ02y2^YUc-V}^XtmyRG^;6DtcgP9greAZbYoB(8Xqd zipaI)4fVuU%UOC;L?y#K3v_YWpNL#pHD^u*J=s-NH&c~!31;3V#F(T`ZeFXxG1#1> zO^7iGP9zKP`HJ)%;uUm0V^l0Cj)#k+eGT0_LER_SSBXqG6|%xE*W4>xdY>`Sm~a-_ zd1$C@&Zm#wYm7XnVL>f+p(t9>z|!e_$)hH6rI_q7MnvUsb&G2kCgQg88>8doQ$AZh zA-C`}g#A@AEO<-&0d{+7Va#S?PX*5sE%+k!0?o+s#sTGM9 zf6|O`62ynL>I-!93ue+bG*iMMqxYtY z+|tGzTk{*Eno1zDIml_@?*M^w`2d~*@ZqZWQpXt7Irp4>i9H`rjIXqvZR?H}(id3sP>0(KmL-<4=AX=K%@>-p zOz)X)Hcd7K@Y4T(eG2268h6~$rhT-XIwCJBMx@@+)-IYI?Tvr5n{7m#^|!llYrQ@b z=qN@+({LwPo1OL1^P~1?fHr^Cjf;~4cihQ=+v@d6T^+^ns2KJayVtX7^J<6UAMIQ( ziIbLhr^$s|>h-x`0fxx}{LPN~+EKOk+E6VPs9{`OQ~z!((9o#J{fh#Hs)tvr_(ugA zAJ63i;a2)K1K@fpKO^I$7#{cabNv4gVys*t6aUR|4BV2`YhKa30{o+x#c@^?Z|UAzGd|XG zIEtsX1JHYF#YOVS0=BtC()uiSE86CrGq3Bsta*6ld7udt}!}U{gf1x48=cLKLzpLoH_1} z)^o%`*_$$_{hZ16thS$!J)tN5(f4_A*6!{i!wCFo?!CQQ*OOLB6V55IPY6z+N-Bu= zK4=vH6SzD?AZ5y~Bsi|MeLS%Z6$X6_zMOLBZ5 z+#zfa2g7uBV0@f3w&RTh52)yQVGVVQ;%*2V{zOfALM1S$-=GlwVVt^QaZ=$fPp7oX z2rH;-6gN}YXhUZ6=@i?b0fUr5zCjc=B2KE?@gG_N)0Y4fcA=px?|RT`IdwQYA#K?C~kO3W;w=|QIer#q-99k zF>%uEp0sGes0jRDi`J<}agRd$qoR$D2RQ5AhN19y7`?l*7m6pkq8OwqtClcSh;nuDi4z z6DPItNekhP;?APKE=0GSZiDcT3*kvs2v2h%^u}XssPsnZ)~*{BVo2PLX=&%Sp;Nn~ z?dVa7?Z5lYZx;%suCq46+q_3e{yP~b8 z$W9$PIXboPM3w=D#7V(?GIIsO86^W34GD7v9Xoa;&+s^_lD8Oa2?&QwA;-ZGde~i9 zRZ~r-5!!cePk{sCcD|ND+rO~Olw{u^Vd!8$+?Fb~O~%Ga27ep}f&mf+#jPCMU>!hM zwb;1+wGb^LwD;qbRn<3c;rQ)kWwo4LXfG^WmhxJk&xa3g{o-bh*|AN`j>0Ts(i4l< z?EK#*qO(4;{JH_171;ON|9ErsYP0Hb3+z{Sdi_^>x0?HZ&j zq_~jg1ZQCWne?&7ag%i&hH*Mn7GU|WDr%f+D zt*pe+-QjX{b zt;5WNP)PDwW?y78xt4nt#Q+M-;h4!8Ged+T&V+1$OcYF^0Kf_-O3MMIkjajsIRGKQ zDFT5Igd)Hx04Ng50dTH@NF#Zi5JJ}klyXJDWJNg!&XCE8ehdtu>?|!M89x-Z%!Fx5 zL-K1^0AlSiNz4lN2;x%H%n-%HPrI1eS_JJ1BI(Pm2eO^TcreJC4KbLJYw5K;lnrK# zZmulvVqI2%0&;_rNKvCT7K=C|F}#Y?tbAr7#5~z zX~>yfcr7MO54DFv>eIWf@Mk?TH!MZ@cw&CY_QR3L1>0J``;gn!%vkk?X- z6$wEITo{PVoS1Bx{UX^BF2bM)l?c@n;>Q#*6+t#Wo{3Sh!NOAHije~cc&qB$cWXCMG{W&U91Ccu2r z7b;qzzzS=G@4zXT%IMyGQ(24RF4bjV%OD`3h-ZwPWKgG+lY zD`*$N+#>*u6ZcqG1R@@D3_>ez2wXR=H(m*o+#Ing+1H_fSz)?}wPYcrn`~HN)JFCI zv;k`;=DurVNDc1{l7qfm`w)@F#!$+;S%)5i>8wT(!-0c zdeWgEQL%1{#R35*tT5YqQ%C59*UFBV0RIysGhj!MwH*SAj>oM+^i3};pRB$JVhI14 z0HYniHZOu}s-xHu{&il|g()Idi!%_xM)F`@%b`OAOJfQ}mVwih6N)*()QI`IW)k@j z#*dUnfHH(o3|%A>LBBPI?Nqp&W)y2+MPWLaLMAK5!ufjYjfz{-M4!ulRq7XnDcAm@tzG#eqnJUa;S`;&9LojCIJ{>UG=>m~e zYcU|S97;{g%$O`>!j6WY5X8(m0l1brb-)Ut?14AV0P2KGVuAFXOJ>9WZn{EH?$N?6zbz_Mb@P*sjP6O0B5`#C)*YBaOXcy|852S3?ZH9cPA5 zJlCXc%Dy@T*7nDcWqa#PC)HQMff$zhx)O|=hVvfQ5iEm%CtzI#OO^xH(M+6~9M~)X zopIh=jy9RmO{0^&NybMIiWsl8VhFv>?GW|hGz-3+L z3>IPSEQ>&`?D#a1$1qhSBx?`g2{QyLA+|h(m$qShSOWnoeg}Yq1HIJw0ROKk#7YJe z&ZvD{^euiO(#85DG+|d;60)L%UcAj<2zG27#54t3t$4$rTtbn6Cq_h;IH?p^KQ8>k z$ks5DjoEewFf@|23Ldf!dg!IBP>~t^v88KEZc^4zyDeRj(**((oy&0mk1z)!_CS~T zhoXHNv@4B-V6|!YsiO)CimrJaRYT{8b;fU<2Nh1Jt=_ zDk2C4BY@MM$ps-BM#sRXaes_S=vwd%pm|E{r}`j4VqXRpPf?bb&fBhTCD@7k^~)XrSjYr3=Yyj>kim0LS_oLxeq z|IAH83U4Y|7A)#*GH0cK7`xe87;^?XLuIhs6uBNJ-v~}hhqnyy&Vp>Kc~{JglT1OV z$mB6uv4a+60rbZH*fEv^B{7`OunkN*gGG^8Y(=od1SO`KCQwXEY}5kTF|2DG%>kGh ziABtjq8P>xh0Hi=SKWe@ffa#Qv%1|Fh!5QOCEcv?5k5p+09HVtr*#K5gE`O$5qv0! zIYKlJj>WJAaTv~YnsZ{IQmnbP7+Q*bjGic0)7ac-c=DWg)j#*ddzS&c8qp7 z@FUoYm>u=XPy`||pcb$=LxB)YfRxX2YX|HJ6b05|Ow1e$gJVC2MaPf%>K&0-I|_U; zO9n(J4)r7y7GcHogJobgty=01U@I@>L>3tn0yGuj9JdT&m^+pQ^TqM?Y5(KJIXL!k z4vI9cedB|}Iap$x4({=Udi-yQ72i@oL`io>_ZOUfK{3u?&LvYHc=X4{M-M-QwdE{d zcG@RbwmWj!o~2u`beqlp$?5d=gtU@ddgF~i4J--Gn6>KKE)!j_bXo5B8v-s*&xuP+ zH+ej+yk!^ve8-)CfOAm@?5^*oMw&1vY^1}1xrZ;`-Ta8SZ(ns zSY-hxEQ?{A6uJVIoXj&&!Wj;egKFI^RL!q>5GSSq|mb_g?vrRc$!NXHt$ z8z%c-{dEGck znemqc77QX#h-1NIMbUf!6JWQDaY8$U%-EFz7!sk2BtF(ypbOSNR%1JBEYdFruckDH zC?=-zPbtqM*r!e#{*!3*%Bjtc@mo;TD3ub{vMY z@Bs-QA;5YA;FWOvJ8^_U4vvHfegmO)nD;JB(~kH8PLtR)=*7NZUWJiDScX6ZBjc50 z7=)Q%!}XHYvF0>tLj2%QEBgIE9M*$>3tIW}``-24={wig-TR*RVQ+!g=GlVl{yp7C z+_$<*ls}Ybl#7*-t{+@mT?<_~&i9@7;yHMmW4B|8W2F6i`v&`5dxq^j+Y;Mw>w9R~ ztpKgItwlX!0rQLIOU=Ucsp&D(g{GeHF<$Qf<&zh$l`leEq!|PUDgL9<1HOc>ji%8K zjg}YLX4squn}e{q18k;m^5U9WGJ|FoQ4X{2;nvq_wEkm0M#HadWC z`JtN9@(X;U3XJZsNx-H-(&d-=q=F1r1bZ6Fzd$ao)K=gIM?5^Cr?Dvln}V>ZD{R8I zHMM#1`CJqujrmbAPfuesY%GS21=7`MT$qZ+g_JfGjb5-Z4>smXm*Px_&tn>7!?JZV z%#$>*CaT#0vD|p3XR~nvYz)H2EZB%_W>1Kd;xVj{JXFloI;W~=T5)xKLtVvLa--kG z`ZKF(Js_bl3pVtI4PMxg1sf_b-h?=-9W!d^6O~ahH?{t{LRdco)}JX|)?XJVEo9i( z1`U1U0?O%c^w;%-^l-j!#R}G-!fb`7S;^|a+x71E5k-KGMwFt zp+P|(tUCwRb%1r5u#Ol`i?g0G*C<0(&Ekw`jjxJcHkX#y*Vk6o;ogE)%U))9WDq>k z0UqfOk5G;?;-s^zRaf9u+ecxjhxl23IW7mWNu_oM@XyFIYPP)((fY5m=ia zntJAxDTOkGl1+%SIy2YMjJEAMGnzJ`Vj(Vf(NU_R#BrTDH4U@oSAQC4m_L(4|5?$$q*`JB+iP@Tzw6NJYN0HE_9O9+s5npI7u{O*709>Vq&G1W9vTV{RH1b>&^j|JPH$1t)QZ>Y(_r-! zAeS{Y#m`8^>kP^yiKeDOusXl_f3!5ty3msFI=zM0^uOk{`V3gz6IKs^)x@hHuBk{f zHrHuUQJSo|2E(ecuxg}qwdT@Pr5T&+RLUbsb9IGP1DgNWjER?W&&xFQ-_mAUctmNM zw$4R!&Z+`f6@XQpVHGzH=}E)>Vr-mgQE^Jr#u*IvN8tXE($yMAQ>12OF_kh&(l}k= z{sGPZqhsQvSPjRIk;N%G7SnYs?k|M<18{$5xSv==;!|V>MlI1|N)#3MnUZLUhC4%W zXFA-O0e8~36XKI)MVQ(=+Tq}v92FB4+7Oa-2U8es9}l+|NLT82oEV>^<ip?1esQvyEdPK=`JdlT4<+8u3h`&78y2e)^C z+v(d0aniYl`##z{FyPIvBq}B-wv<|i)8NK|aAQB|Ql!E->szyQ?ANw96SU&c-BwQu zx4^)Sxo~3;ZtMUz^7G61RK*z|6~%v1oStw)9^5cYx>TIfc(Ke0^-Z=dPB9fH6KsE{ zZ_)-g6u=GXa6=~CKymZpMO?UyVB0KP6DX6jkq zHtje}>uir}*Uc&gWfisEgs9y-TlNz4$88rjxOOC5I|Q!HgKIItY!NTS65?)4(rn3d zbn|bY!l)%tJh&R}aKP1mxSEPKCSJg_aJwaS1^m~Xs30oxosOCdPcNTaaS9%ntg-eGtGTegd{jKb8FWGgm;7nYAR;rs^Nclhc%`}3WwenH%Y8-1D*{(^xPrbI z6(7r~I~q1Gjg_gXHCy!>+vOcE4_@Bka{6Lyd<>`VZb&^wrk;(5yDq?e3axXvtn+2T z%hE5SFT?SC%mM36ZehZa(6XZ^pX*F(my2PEP>^;1YY+4@X2e^HV+$r`>v0oJ`q{X+>eLDixGHnv~>BmZnGGW&+ z*cFy8#VKl{UBJl2_~YU~dM@&$x1P$bB6@?lD+6{h71{`#v{}|f#VS3O;qXEPUKlN1 zjSB4p#Ax)i6dDa2Ha{cDw^g1_ptGwymKFBHNHL3p7%ynsaJ z=QYtb;G{(EkBWQsLwC%nI3m)QL zA|g+q>y=Z(&V1Mzgq`WIlfKPs;w`^P#>hQUahIOMP}ngBc8rv+#({VFCTWbjDQzka z-C>7-9fPDxaUxB$=@88~T= zx;-jx)zcUT&yR)YM@d(sLA!#J_Ndz^Z7Lc);CU6EA1qypQ_v)L3!7ZM4KvoQ(KP+R zLjA~iz5t#N!t>qWd5V$Oq-`HI&Q|}9iktO3a^bmrcrH)68V_xMuyKgrLTOX+=myV) z;kkj*r8r}oXrC}PN2Y-Zt96VTL{kv;o0u+ zEH{U?C)h~j#;CZyHIZi`@XTl+S0kcr12z)5fzqZX@=Pu~GX%(GBD^Iy36blYiD;)? z^+cX2glB^AOm}#OiO??Lq~qhds93HiG8CR315b~Xu118m3nv{P*HYS4M7qP%0-hcu zU5XQF;vK|EW~=4guaeMsIs#7z;pwjMGKD0m_WPo%*Uc=MZ;7pGm%Nf}%o6_@H641;ZBVcRI_GJ`m6dQRF7mr>eO z40^ye6}AnQF2yN`UyAwQJY~FVT-y9>xDeGR&Bq0%D*3*b-j;1EfNeq8)(y7F2gCR! zsd!ux6^r#eM#9!{uyw3-H69nI;&CyhO~oS%who7_Lb?>EIKG&97@yY{OCC7cR?Ml! zU-E4i5Vsb?)*x&R!B*sg$FLTq;<5;>D(kt7fX55q@qFoOTrNt* zNSES_i$|FYSuMgg#(&Lk6{0v(Rgo<%T0kT=`c`>-96TO`$9urz6elm=~5g8z*J#94E~?}U;9t` zkNFS#5BT?>HNfruP5!n1RsNO!75?S^n17MK)?ewL>7U^*^_Tb~{t^Bhf3`p5PxlA> zPCxj5_I-`k0FL<%`wsZ_pgn-?zD>ThzEx-uV1;kFFXmf>HUTPqGkr6BrDzu*;v3=1 z@nxfBfOKEL=k$U1XYbeElip+A!`=hlJ>Ev|cJC(dTJI|FO79Bqa&OGL$Xn~J^v?9o z@RoW@ybu1swJqaOa>F`j9)_9dJ9{p!}?St(;Vj zq0N8;${wXr*^X8N)+(!%mG~}Wxe`+rDYZ%^S`L_@l;XRM2-*(FQL>c~p7aPPP6b>) zyS_&I0mod2T?bry(1O5r*Cy9m*DACju)?+66>}{@D*~0SnXVbGQnVuwagA{0xU$ib zK)Ng7a^gFZpPgSjPdbk|52H1KJXl1R(V#U#ewCXm}ilv7WbIU^vv*-dP>mhzz9!{C)*Q3y8{7_(*y3G(el7a z_c8Zj_W`s$(CFUo-sE13)(2L)SGbqEV`zV%)?MkI>7IcW2uj=$_Xz6&>mF;Pb-Q(w zb**(3S~^%^U2ct87on|#O6yGP475mDf(HafSaYn|XqN!@=~|suK+6PQTTWVzSq`IZ zf<2Z-%XZ5q+`Y2OveL4`vK;LbEV9&EDlIe7LP4pe#1d(KaYc4CbDg=0hAu+&&s?*H zCJjO2@9G~Ce^r0e@P872Qh(9#XNljdKWg}c#BbE^H2hZLSL)XiKU06z@Fxww*YFz+ zztZqa4ZqOvbBS@aN#arUn1&xnd{=#6!}lZ}R^QR^h{Qwc+Zw(l@eTD&4G&6uO?_R% z0}@|RU)6BG#J%dv8t#+$qPj=Jmn6QR?$&UZ#71?ehC3uar~X&N=OsR^KC9s~5}#C` zl31lmd%kLwI#2rNs?v_HI#<0w`e&;Z8cO@U>P&T(^v_hwCH_M#)9`$W=cwmtc&@~= z)U!2|_IcGa)alZHhAQpys;8=_OaH0rX%eTZr5a9?I9ZkUch$+Nw7;vCsFP%Pi7M^x zs>SLA=`U8Ly9aU-X zR&A$BJGY4K<@bIysG+oPt9n#v*A~$$!(FOdLpeTGyXusFyXuf=QEeJpC4$Q17F0QI z#qZ)z3P+UVR{Sb{lm1_Y9Jk^p@r(5TB;>di-wQcz5#_iQ-v~Kw5#_iQUkW*H5#_iP zp9wi05#@LkC&i~Szmwt3>hi@hgsqccuS` zkmFapB@RpfTSAUsaZntR{)0k}UvWUZA^iu09KT|}cuo5E3pswpKJkk5?-O$TikHM* z>3>Pc@hf(T7o~rfkmFbE5HCpo4k5>{cwRJ0|MNnQU-681PWqn_a{P+z;%VvMF68(X z+r*R7zfC+Laf{fh;o}lFip?5slK7~2Ov4Ql9}(*{Tqp4%u~x%}CH_Y|sNn+=SBW(m zu9kSOxL?EjB;F_8 zorc#+yh>c7;nfnCie(yJDe(%iM8lZGOU30HUM6v|xJ1K?B}T;}4KI>dFB&vlD6v-5 zY4}fx3p9K73p9K7^E5m5^E5m5b2Yp5b2Yp5vo(A5vo(A5Gd274=WBN9&(rMDpQG8K zpRU=RpRU=RKV7pof4XLGzEra_U#i)eKSi@Ie~M;bexhbiexjHp%R51{BVVl9k1y2h z%NJ^P$FKsyC`PN&j`K?4Rm&>h;opjVk-6dX2hV`j@G)f2zyW ztE7L4D*LCpL|rQVm#eaWs+X%*NdG0O?4Rl->ZQ`ZNR|ClU8F9S{svX{PqjgfN`IXy z`=?r`)=PhlD*LBeqt;6Qe6?D`1%zUl7%nka43!ubs)j=1U=h|ZN5df!2Z})wv&8@n z`)k-wVlUBG!#*1JmY5}aO3V-;iCslEiD{y%hFvu5tYNx_og}ss?Ii|8P@+%xC3=Kc zqFc1nFrcANLl0s2=kWhD{8htWB>ouwN#gh6A0&Pg{!YVhC4L$HTEnj-ejffp;-}%y zB%Ta^BJtz!Nr_G26B0iPAD8%U_Naa?`n8N!^08}h7W1@ro;o`H#B@* z;w#}-HQX<8Pk5h(dnN7;zog-d5_g7oY50P~|Au#H*eLP2@beO%2|p`wd-!P$pOUyW zEXQqlYj~UVZw_yfxG}s*;)d{J64!_2I1R50Zf3Cj_-vXTKpX49sAMGFNAMEdo?*Tgd z+xgvotM7N;kG`+)O~8k~cYFtZulRQRp7%Y8?*bk{>wtIrZuQ;hyBhTiF7nOu%|;7> zXZoi4Cg9tEJfH9l@b&U__oey#_&&ho{T1~Oe(r7Z9`(MBZv^&wcY2@kZuM^PKIFY0 z-wE98z0P~3_fl_zx7vFFz7;qd^%PF_7J2i%!@NWAy+Ee7i?_YkgC`jN@ce{t20n35 zaTmMCxQFArfqw2RcUM&X;C0)TKk@CrH_E5VapgVb5ZV-c3EvMqrEF2wD-S65Dz_{D z!Z!p<@YF-SGGD1s&R5RDcLWpBzThY&R~e-AQ8Mr?K~PZ?3tAcc!S$uj zW!Em(b7*UDBfcqE?YhhLZ`Td3t6Z16F2Z*ORjygCb6sb+PH~NQjm5VGVYEBg)78z@ z(dBbF@O{BA&TpNcq5Z-4oo_i`!#4&yoKHI+cRuQT5N#0Nf$t2ibuM*Y;#}xl;GF9$ z!?y;fIwv{DIY&E(ItM%Z;(LS6&UQ|>)9U!$@gwfcIO+J%@s8sl>So;Sc;4|OzB_ot zvBq(?<5tIwXq)f~e0%Uu$2`Yu$9ax39a9|>@cluaLpTOFdZ7x6G>0GGAehij;dl1W z?M?Qh_P6mJ!e0AM`!i^-aD)9J`~CP9;b!}F_ABj|+8fYj;RW~};cWY9_R01ld%k^` zeF(lu$h3E{x3_!jHrpSzpYUD6C%8Z4UE7lfA&)(@*>}h)?&1P zI2_+K^s{DJyIMO~y;i&BPkh_(jpb9zam#y_LzY)9FX8)!r_dVWddmZrdo8!)2`G!n z995rYc#2^=!;=h8Fl=Mk%J4YD7KY6Xn;14SJjSqr;ZcV54C@#kVOY!XFvCL(4>CN! z@E?XX467MdG2G8^AH%&2_b}Yea2La!3@aJ#V7Q&(Hilan{>^X;!_5pU82-g@6T^)R zH!xh!a2><749gj=VYr&%Du!hYS29ds7|&45P{c5fp^%|~A;K`0VGKh)!)S(43?mux z7)CG*XBfsXlp&WvWe^Nuh8%_=41*a4F$`oFz|fzeA44`nUxq#my%~Bj^km3l$YcmH zWH9t#=+4lMp({fdhRzJ>44oL#7&epVDK~e7`zM~1~-Gk;9_txI2h~< zHU=w$g~7~VV&L&7{**rP2gC0SzcKue;a7%V7=C8>iQz|v9~i!8_>SRQhHn_YX84NX zONK8PK4;~Jjw6`!#0Mk439HxVc5*DiD4tdV+&x#Zb;Llc9{^e1?B8oX2o3!#NCRGt6K(i(xv$nG9zzoX&6>!>J6V z4AU5Fcra61XB@AMKBe?R0LBIOhqsi z!BhlO5llre6~R;lQxQx>Fcra61XB@AMKBe?RD?!l0y7%VP|Q%oFpi;+p@1R6FqUBq zLq5Z3hEWV78S)rLFbroH#xRs2mqBF^3}J>Gh9L}t83svEwedcX0|zklXXwX}&Cr*j z4?}N;UJN}MvKTTMLJS!UJs7$(bYtks(1oEhLpnnzhBStb3>_HSGqhs}G6Wd>3_b=g zgNMP*pfI=?oD2>IJA;kE%3xtIGng1aLikUHKL{Gazcc*C@IQuM8Gd2-nc*jf9~pk2 zofo)k1@O22h5jMFkA3&!@A43?!rz0xse_(Fo*O;I9+!KU`%-sA`AOM`zl5{#H|_)Y z8@7w{sPi7@8P0Ua%Z@AYm!sMKwEc4XDBE|oC-E0tf9sdlHTWB-hvf~l?>^PyG4C=j zH;*!XXL{1K$dm)$<3;};Klx2`78*D87&jL;(YB=OIdk#!rheEiQeM*~(P&YUnhQkA;OL4|FX{VHpTXWx& zgf#OidKQPr!r>qs?gEFA#jL!h<^#&DPh8>2o_C{YGg#LwW8m!x@b)+jU5YcYNjsN3)X*$PB#XKhLo{q;M9=5#iSTw1-tGl&BcHmwChc&t zaikoMqP^o*eBPP>Z;buM9=4~ ziSSks-s%N!F(2(zvXRfBDB5b)@fi+>B5-K5bTvNOVPqqpHz{o@J{fQ*7Y+@PF2yNq z(hemXw@x37rnRzZrYCZ!5Do?5P)QSzF!W5`A#Z$#0+w2sJ7cykQAIa0bB5$*V~ zk;v=_MjEeD+Eg?$;9xEs93owA5A7VXu|4+l-DF`+lCA6q z3*lf84t9rwd`qFT$VsQKSE6XrTSsIpyio#g6iHVj!iSKP9Q1gZ(xxKP7v2~RZw!|% z#hKJZN05`w$NS_!(OBp#b?IB?jY;rE5Z>qwZ{SG5P1Jk_ImyYDy-~D6t|OESujj+- zdD7Jg@zLWXg!WL{RD`<0>tT3(pmZtD*d{u7jD(Ey@k>m|IDfr97G4j+>s{b=W-&fh zv%DBZyXmc19LR?Qc|fklg3lQzVX>Rire<*<3n)rxulD2puik9AWEb`&C@$g!qbTt-qa5(8*WhbRg#iBR7HWFSNDqV_G z(p11KRKs0m2hYN7%&qC^yjB9Q1>v=x@ET9TkyMS+7)2xXIy$4^)gpK`B3+FRpD9k# zDF3Cjsp#~CS4Y6Bs&pyN_$E4CjEyqHK<9aV*Ge+*UmXvx2I19Ac$Iq?9WqWj@Slr{ zXY^!-!~O{DA1z&t3>`L3+BVNp+EipRV1F*`A0l0fQ`ki3iII$P275-5X|a^2ZW_}tk^geKOGg@^+ZO(%j4kXvC`Fu$Z z5lqCm%YAz^t*uo~J(rh@;pHH_9D}4DEESh0 zC~Yb(-C>`AeS@S+aUxAanTzr6xUGc?S|`=h*cX9)LD<(7_A!mzR5Z3m#g^7I_KtzQ zBY|9vhMJ1Tn`oc@2;iciyr8twC1~M1p z@2*Et4_-3M(t1KKO@fz#@KSGhiJ~h0F>uoK9r%afPJR=v+rQ>}&bJ%F&lFTqv!vvIwBgtw>H-LJZLxVPf^>Rs*|aldxGd#?Lz_XPJ)cMrE4SKphIHk1BU6 zSL3^dnaU~3NTsjRK{4TK`n$N_ew%BJ>tC)*an<}xSAlthYmlpl%a5z%-#9;Y9(TUy zJmh@U`4aA`f6BSVxgPBh-s`*#SI94O{?l3EJllB+u8ik7hd6sXyE=nThvR!(4S&_~ zf@8b+9P>1DkvY#i*xb{x-f^GfX2&weMYs}vu49U0v}2&7o5N%O4OhM2v%hYC(Y)Gx zoB3MvW#)gHEAU{K+w`aDJNriagZ8^|_4_LOV*3KrdvKWmX4On z(=YOGvjSq?;1b`OQ+`+=SFGA@yyR{J$rp|0SdY3F*~@^sj_;eL|X&kj6Jl zp4|!Q*@SdgLb@X%ElEh1H%smWBlkUtu%!tp)+{M`&5|o|4SPd#m_5PQ2F+pC-xAX2 z3F$;adLkihNl2>`(%sFHsiawg?>bwCQY)0z)>TBy=GRbl7D4X_UbJE#0 z3usD2Ei`4*a|4#16b1F!RL!lbsB@b=maZ63J!gJJ-FaW@JTtoKJcB(tkI$y}fX?H6 zNAGFWdmhny7VAA|RH(03f-kL6>zT4H3r^Q0+qU9HrFD_m*yP}rN_RM?X zFTUIG7vHV?i|=r(b=Iyo>vo-di%zcB$v6g^l9_8O|Qfamr@3$mbo@$*;A@ z=WNx9=H>D^Dl2p$ku|SU4cw#{WTUfByw-{FQC|v)lMfb^cSz7xi7~vt%@1Z(?=7 zVXeG<2g!cHr5W(0-t)QM!(EP}^*=@TP5)w@C;OMg?7IB3gm_gz_N^&+dbpyRv*`P% zG3ah%&@x%WQ!1**znzdCN=TPBOT}L#q`e7=XA4YQyh66)#A?dtEuH+JPQIi?F8*96 z@6pM)8Pjj6glljm$8WB@7#Eii>aUehcLPI|0axkpyIHu3g)kErr4Y)lV!$;f^p)&l zh)L*lHMPnG4OI;btI(R$h0|Jl1FgLCK5FePYH#UBX{ENO^6G{4gDdBaGv1S~`#4G1 zJ5=ed?p>2FG6r2}44PvMI>Q(=*$_18J7dsi#-P2%pr?#M8;wEpjX_h4K}E)(9Al8n z5H#_9W6*z%LH8Mhh8TmahM2wDdMhtKem*{Q0yGRG|Z`rmi@D?x_S;haa2`DL+>}|seM(Z&RQ%&aXDf!0samxn=@y@ zg8KT<>**F%W}+1eHN};Y&a}+_vb8aCZB4DzTrG>6b&#Gl=%QqXx}vVGd{$L;)+4eu zFmP^Ng_e8(J)uxM3d$7Csi>q_zzWo%n%Q2q4@Q|&Rgv{&^X2ALEX339Wq3QQDzDD^ zwz+t7D(05s0|P!c$Xd$GYG&B{g}hFmmRvYGM-DY#Y4*a4LoX#f^DhqVYHk$Npg&t#6WS+x#e&+wmGyWZ!oDKKujH(^0B^TL zE+7}5&aXSc)uaoXwA~OivC$Z$HNGz4M4KFA^J{PsuB@^K)f3uZ)`eih)YRFZm6bQY zYS!#Ui^}TDtE(0+E~DQIML(zd;&n-zQnZTyQ}W;+;UfCQ5w2W}3)rZxioH3N z7s(nx#m`uU6$?ob11wV|H+`7egKl-0DmuGzahDc(fwQY+xCO(F%cgMUowDaA`%Ziy zds@Z9g^Oy?&@o?Ey(UTE;Fwkx852z!*34Ds^7{V`_;Za-cP*`c+c~O zJO}YN{WRP){j~dX_b}y4+!;St>EZgwb)RcGuK&O3yaCUwD~_GGle`dji9e6Ogv0o| zcZ03M*3bH`_1~!ducKwZEXi;?ifFzNEEpc9&UGb531l$Hva%y4#R_+l`8(NDS*XY>hDb%sO? zy9m^-^0ii5Z6IHahA)EfMJM3Rxz@OdG8K1RA41x>Y?kwRxm zn~Fjvd_D|54@;Ng6rCV7XGp=Iy-!WY<2%l%b=M*XL1Zg=- zN~Kd&?Wm_R96pP{XQQR7QAy*pMk;BPHWif&_$(Jb8zNnbQ+R?@oh9v79r2ZK_3XOE zwc6yM?^d4`!e>GFtUG*0QSwfZp0lJxIz-iWdLp^-X+C_KCtZz*rr*p+q&=lgMWh>i z8ir2?N|)k{Jwdw8kceU7O>GxVC1nwes(w9- z2z)XTJ}H*2#zNC?W@Hhdw5eER!zcOh$q4CEoXICh*BP?NYrDpy`kPtQCM*fe#uo(_ zw0ar;$z=E>2%q$UPnZ#DJWI;R7garaMkC?mI5;_0x*8)*(V3Bvm(r$Ulm#b;!$~1s zic@@ol%63Y!&_|CV`QXnos-3IG6*L_aFV%@(zB#o+)>q~=Q12Vj=;yGrK@q#be$Qw zD3mr8mkjtg7d{>$U5Zn9g7lsx9W1VB+JzO1Yinxe*Hz#fqxpIw9~Z*MLHM{kd`waD zPLR^Gq(q!i)vhNp3{H%N6QiW75z(}r8HqS3Z7L!?;Dib%P<<`B6sO>XorxG!OsV#0 z+N|=~7dF)LkkRuvQ2-}`aH1QWpcr{4Nb6Zr9=51z(eoGqO$E@DFI|m?rtZwh!%AsW z@d!cFP-x1LF2xyl0w3k5K@4h{RExZqEW{`MdQ|L;uch=%n#Ms>5Sn^G6W&r5=AFRz z~h2qNzMHGBHuw)J)<-A)W)|G80mNmXryw^0oRZe5ojxeDqA> z;~*Y{cn^rP0ya{9maI+0pHcCN6vc|54ghJo>;#qu`@q(xo^Pn@9~B@-Xh<`c>n>TesvdS+wxdiqA(A;iDjY)C)dh zKBNjQDW6}W;wL?yk?`R-_;9RrH9ng9Gb5j$DQzk~S@7X-_)tif;uJTLDm3I{n25zs z%ttp^T5k#sdKngTQCTGGb(E-JohP3VIX_@D^L)d*?o z(2Rt>rL?IDeJ~n67!KqzAySQ&l+ZT@LdG3~A54M|g786a_<#x3rXuupRD7u?Gy;wm zz|nl^YJ_Syt&z}I{~vqr0UgEdy$z4H?`&f+HU{GYm}YQcHMoH7b;mRV#?%mu!3G<` zcd@eDtL#otcC$1&-!F^AlDr%)!j%C1snS0P%#q%jhcpIP2WOp=vdIm#{#ElV@@ z`=y*o_}XDVpkMV%Q+AF~c4na!Y#Ji5 z`GMt)#HO#ZGhNx4f|jMp`@WvD36DeXP*rY`C>*R@_=N3vSJt8Mh|Qgj=I##I1qr1!_bi_*u~uwx!4DG29*%x`BVwzwz@C zp&$4cMco&ASm*%$DRcz?pnqVx-zn<9&_hB`@HhG!`VZ2Bxcyb=3Lc=S2SfMM{pjB( z^ab}))PDRdZO6U>(m;M(&@20zPyG!U2?xd(UL%*b`Gef@+`h=fT z)SIC@DC*77+l6k@Z9+HcR*L#w^cJC?v{~pU-Ar%B4% zt`oXUX9``WwR9~W=M16Gv_|MNolZ|j|7xMrv`XkSt)wf_ze4CW1%+PIa=IM-0ioN} zCUl!xX)F3q6Z%apLcgh*Hlx2u=r}E-%kXm}ZN%+Tq2suOF2T<*_bSMYV0r;%7U> z=M1$8Jxi<5v$Rlr&QOrc!E_K%h+8AY=L|Ja1AZo4-;yd6pEJH=Lg(_R(7F8EhtC<` z5utbam(aUB>^scz`~DQVmwyP|%in$YobeqJ`j@{6{mX+se9riO6*`y)gbwC@A3kS% z`-C3mUZID%$A`}u-!DQJ^Jk%p`I8TyGrk{%KIRWXAG6bk&lz8b(8+A~;d93Kz3+Q0 z=XXLc^IIQ2XMErIzCr)jLO1g(-&gqgzdn4<_;w5Z%w0l1bEglVGrli{j^-CaNAq(Z zf6ja+bZ|eVpR(i7Pv|GO{aEPXendaQ&)eyC+zKq+KgnsUe^hNyq z0(}9u&kG&h=je0z`C0lbZl4i)x=+)m@$)vi4YyATUEL>z?%@;k3G_cM^ba4SkKyM> z>7%%PMCc%H6*`Cy(}&UjkkCVXQ0O5(Kp#N={X!SED0ELh@L~P< z-WU3(?+N|WcYRntzITKU>f1sG^(`OPkMB*Phx&%lLw((c_2YX@=%T(VbWvaNVg2}C z7W$|!34PQTeON!f7lcmg^Fk-}IUm-K?^&Uj`i#&^ecFfhcjf+J>q)=({1%_#qGmFPxT?+L-_eY--Eb)K^jNR)U4x&m_FawJtAsA=e|-PJ z&sX}c#O)PApY?Lz<@otB-(|SHROqx`;=2StU+lXWw-*V$)=j=m`1wNLg}B`)bXza* zU4Wm@_nnX1^MrouxxRDp^EtkAaJxb1xSs7h8$X}rI}5k#g`Vp=-#Yw!rteJLt`)kj zXZX&*&ue^ZaC^GYcU|pUjh|QfR^fJ~(0N_qTY;Zpbq3rn7kaM&UjRS1`P%sV|E-GW z6;Su1?%&-HyBpl8@c#c+*CJPp^F8O~&I+dmbkfdovqtRE4A7!uUgKq6q=8i9|cYLbW?}vUeG~HGJa>g#W)*cV?H%pY^XF?;Qjwu zBvaX=Y(44s|Ck}Coy~9VZitc24$_&SqbB*pIF=ZT(ehD~b}^qhY($REVtFHtnhYk! zF~pdOmZcfj&gM3EH=a#r!V(s+26b&+Yt4#~LEw;4AYvRxj9y|)CPtPrr+r2wJ~M)} zsw*GESYjw9%nCkYK65yq=`3$#KA^;4$Rx~iK5TAtw|uJf5yr@T4C9Ca7EVnj1{`N> zXY-r8t)FQ@IyIC}4k1N^Y}%P!Us`!>LSW zc_UGYCyI|Ksc2c6f_65|8K{KKBcl~SrF$Am0a3g}i6aV2kkig)ICo29QjkvQLPI&0 zuN)hVR?rX=o5N{LWO*afP>%VOW2tC44K~TSTN)F1jfB^Ra;!i(=2ecxDaUwiu=&m1 z(ik74<)JjjC`U__qXlRM4KbZLoW?koHxiA3%F%4)C`HTCl(n;|%|Ih;-Y6}{m!uKz z66I)_a@4CF?XMh#_oNW!!R9u1OJ;14mWGnaQjQcTM{>~$GGbP9IGHk*Hxijd<%p&n zNk_}l6t%M%&Ojz?-Y6{%#w>vu9F46wZDCoLxQHV~$`P+}BwjhflH|0r>CN2|DGAb| zP$HSiUw-AUF=z#mVxBjgNHNPBiAaL-7ghdBL(9?>wij_CVXsMPktEVmv%IYfkG~3) zzr4y{{gl5r4>rNMTONf$>JR0Sr5r9$4(Fm3Jj9IVa2^FLZzLXx%3)18oQ{@P2%Fv9 zZH4$HkG4AKWkWkH<#3U5*sC0lR}OO`Y-)42MDl|)HM!i!sO3l0~R13Y9~7XayZHqdA;T z7RwunPLgtHlyWEoEw7l&NEMTbbfEu&TYh0(L$J%ea;R820)d{z%5Q$Of{B>a9L_{zc_T3yp!}Al{N_W;(v-Hd3C>V4VXxpRl}x&=mETI0 z-@M9iNy=}W3!C8FEf-&qW`uIdQVtd<2XoO1E@EbLIG2$uZzL{>%0W#zn2wgEDQai4 zoV&g6Gb9&?cY>8#L%ysi2aA-0UgcoCa*z{YQ=Gdck{+a~p+qv3U;WCjW6%mBVp?-J zku;V!5|ISuSE~G)hL)u%Y-dxPfk=2qoQgyiK!{`gvYOT|p@Y8`D!+P_U;8P)0uOkg zu<6a+@)!}MDWN=ylmio#17pz&9>aOwa2~^1-bg%BlmmX{z-Y8A&7}4e&Lb}@bTB0t z12g#`Sf9sqg?z>D66bMXl5)VS92lw`V5xK3hehHvEJ%lhavG)V&sX-3Mk_cCjl^jv z%NvPPyt3b?>`z6@(iF50;he(1NDe_A5*D-{Xz2Q^-(R5Y_bU72l>HD{zAUGGa3mUo zgETpmMz*rAP}!G}iUxKm^zJ4|3v=5BLWMGi?4`nh&*;}IQEkG-n42Z;J0LvSR$v|aqwz8L^WogRV z`*SAY-zEDa6AVy;xYUNG6Upo?Q}%k5z5SKFKnCuZq)23vSXg|Bph}jqr$E`0ix$bS z-~VHj^@`^i(Du)E?{RMdWqz*zSLssW_x}Z;qHcCP>sao{Q4hjA{T8ABS8eZY`_gv3 zZJMpO^+W3g)=5?ytSz^}QUL44J!1}<(@Y0UTTM$$X~quY&Blc=HTO%y&4#&#UStQk zl1wB$lsDnDic;Dk;+?~9*(-zeiilUUKZ(sGu_Mv4t69>)VxOVw3IEA=1uW#-q(_pU z81+YDOGvDj#3qthmMEu#g+6!N`&=HRmxf-;Ow!v=dXGWN8%Bo+dJd;@8Os}~VI+{= zl=MzR%hD8fumI?8d(lg=VPKmGG_-{FIHY$W>Fp)G`;p$zCKl#&u;Axzd0Y~t7lrZ| zMPl+v%xJWNhX{2J=W#L18;M6eiSdz`RJ1HjK?e(a1|H!(&PBS?8Bz&(sF9cg65}N? zaRjB%aynSVbGI}$1?k368a@&|hD2wf6*NSYb2yC)S>8xA`jY5$5}ksUrOE4H5zjy) zEX;>)#OlELG@%@#^GLLpM8}e7sER;N2a9y>mcs=>dR{1p9MY?Z^vXvoIEVn}a1Q6Q zypcHcC%rOBuaRh3nvxC{?A-0$ao%wbV)jrdm0l&JmzVTPB)vElOC&1i2I+=SDn1f5 zhD2qd6;wowb2ycASl&of`jV)05|x6MR|kuC?zTEM9Pc(mIYi}=C@+bMB~jR0b{HdZ zI6Fw!hjPd!Jqt0TYsEGJxqJ4 zYYk=6vzYYslAZ~qCuhRqoV#sU>wEZ3q*XE*HwfTS&ZK;_XMg$fKP_Id{wBj37Ndlt&inQ9yd+q7^(u zbaOb5H7su=9*LxfMtY>9Woe4qS)?=Y2pLgL9oD~O1&=5QjbSl&oPl89#%@noQ7X^Pufh;z41Yb6p9 zEKc}JK|IC8<0YO1;sGY`O^*dQcgti&kS-5p;v?=c#GQp!FcCq`;Y@-oZzLvti94OR zQ_!+BdF?E~8JL9kyUXzlYhYzp`7GkjBW^Eo#}YU6WH1$h1vYofArPdkp&YV^tAMz2 z(FzVCjyaq|8_OGsLn3i$#FdVgr73D>G0ojJt5&QHkSbZ!un>ZGL*qn=tBAO~#1&6m zP#Lv3?JS_VTOy|gX>%x%(ZpFyoPM-|h=^YfC(^?5Mj|qRIJ1b;hnA%&ZD+B}KqUO< zb~C@vVVW&|w_;OcLvImhDRFvZ6mvWTOAIC9YnE+T?CoXawn zHxidb;?RgA9WAdE7R}skr8IIbY}6d5fQJ%s6cLA)IO2(e6Jepu-4aoX8TEHxiKn5TsA+KD4}2SRiw^mC~Sp!8$(KH((iNvN6TRK`^DT^Xi$|9_k?uponh|NoE z@x%s|0=Il!BqDV|x-gVTF0qypYav=eq?YFmCsNDuMk10-tU1IAk(*#ynz8K*Igzj! zce;>Ag-3ixK&)el)k~}ch!x|*+ZRM)vmi+4cV%NKC6+?MtYA|UiA@d58<~wIhgdYi zEN3%65}WzJ1~hylv$2dN7B8_3AQqM`r@cB7o9ZAvwJRHQDKQrkW(Avhk=V>*c_Xti z=Mb|-nB{Cvjl|~EU<{~0)JA4w9!tz#Vje)uEL~3f+(>NZ2I-toHkriaC#ErI1)EbM zu{nk1jl?E_m?$x&p=D_b+vjjL;orUH=x?Fh7PdCDgpRQjQz0>ViK!nkvA55v;Z-uh zuuXB@^B^_11R47{DveZLn(l7FcQRa#*u{tux?U0xP!9 za87gFz)@i>OR#aOJtF$k2%ym@4 z8twTG&5`0ra>O{C4g)9v?oq!}zfeC=UsIm}eSy2wo75}Sjp{lz2y5;wP-m$XY6)lp zX25ED{nVbS&3@E=(EcN=LGY>l9s5i6C+!cwY6REWFSVZwDuJ!`diy+BTW`F*z@BLz zVIN?Rg;n)Tw!^l4wsuep+z#vMJ!gB=c8_hd?J7_&ILo%u)?}--%>f;QGFU^;XB%ou zFl;lbhGT|%-PNtv6b)fDw-~t;?-Ttu@w}F!oUl ztLCL!2U+8+UaQseH>{WUgXO=LPb_a+UbH*`E9Kp0xz=(CC zQI_GbI$m#33pASlH19Qk59{K6Xnq}310ONpZN3>+#JkYE-n_!R%)HP%8`i=rHIFfm zG!HSyo1@Hj(=pR;rk_k-n?5tW3oFq*WqQzbhv|Ay6Fd*rpldTVn5s?FO%qIou=-r8 zX`rc($zw7b|AKYrI*hxF9~s{?K5u*sR-C)Vc(w5&xrB2PA~ z1)1#W>*?XKxR1CGfSTlP_s8zH+%LEvci#u=KVIX$*uBBM+TG$_1ZzK5y35`9Zq1$I zPJ&e*oo<8c57!>ocdjpBy~o#F&$za_?lQc3JVu1cTs60x__?l0SzqAFRjkb|bxe{9 zHm$?&k?2l|ZkOm*ek90w*7)PlCgJ)*nRJ;%OC(w>(M*Y|B$_JG6dk4fA<=IV9gqlh z_gJx0zLmbOBzjPy`y{$sN5f=Ehn}zdhRDk>M3!&J47qo@js~OlAUp41)JsHknZ7si zbBQF6#4O#HfGUJ6M*`J-@xMxhdSPsDU(^+2sL$p4UeBWvZPt`Ic?rSDaV zWXmQuO5e2-{YN5s*AjVO64}OyycftSnIkCCa*5;}K$307Xu?WWC3ZHgGU{lBesPI0CtjTSa9y_Kh{UfC$RgX$HH z4+~$gQB-eru(4J8PLrrfpg`jV60MNvRDs$W-;hW&)9SXyN2Tu(i8f1gu|%SdAjkQ_ z*V?#MqB|tIN+Qv)t6LjIw+84ux%XU&L?ed1q6@2TX%x2>ptnT2mPT=tf$tpYn=O&( z^kDBy;cIRbH&k_V;|AetYJ5#1(Kf1^8efsVmn9PI1@^uueJ@D#yhP7R^o&IJNF>@g z97VKAK%x@>gc7{XEr8CJIa(xICeX4*aW7OaYZUhapxfkL(Y;hRHr_9Mjg8`70N?G> zw@ILe#&;yTL?Y4AR5vs>3txTX;}Sh4(Bj4iB)U(aMU5*ZnjuhKqv#{5>l&|+zJNsH zPOh$P)Z2Y+<5^;FZR2{0)(Nz*QQWoF3mc!7zHJhTJ_q(bDSb~!B<}9&1&wzK--5<1 z0@XC$4Btg7pcZNxZ;-xA1%P*zCEB4Q|44}j>nLB;L0xOUXg7dFUjb;MOjoL-+^=<%^PNPZ zp6gn3@}w_OqF9M~=_vbvL?1{b`n z=qrhK>nQD8iDdaw#l2Y9nmSeAn_4K5JX`7*>FcAT5%M~Z*e-pty^IijKwayIbLIR0 zS3GBUM!ElVZ-w{&X|A7Kx49O(lASx9o1L?rUdJc!E56L3s;{VP)B^iq`&N6leP_DMG|v=c`~vj<#u;6PcMazl#u@D7MRE=) zRsL39#P|Ps9V|{7#xTQ2`QHZ}sNnJzrvDZ?cA1_>(!C@-mZY=2IUOuMy4$hK_k#4D z(192qNgG4bve5E@m<|yb9X{muF3THfAf_)#ODAb5Xjz)P4i+TcEr)j)hqk(!)`eXL z#nbXgnwO--k~FqAr-KDYcgx}JAbqndhtx47HH$DSIEbj|a1L*=ypcJirjyhZ!Yt>& zBBZGBeDpyf`bT# z4(ISX%Nv=)h;%X{g)qxGlttq3S}>-mIZ)FIa^azEX+$0w;Uyzt$q2SLr-KDVcgx|` zAbmNM!x)lMLQ)FQ3JxL;I-J8REN>(Z14&9YNug+2nz9ZS6Akqc9u@R5gwR#%aV+5q zDI}$gqpOEHE0#gpY;4z{s$$e)dD7hKY)u(7c9?CBwXA*Z?w&rOWAHq0!y4c|J&=4P}#0 zhK?mei_r=;A|g7R&2uboBsPP|&@p6aCR&zeTnCGe1~y?TR`glM2HrqOGF%Z;EE!Tvm=%0PTy!{}r&->}e1?o6Lox}ooDYkU z?v~HC6Zy0SY68o<+&V+Xks)3(B$*81d{~@xw|t%o(kDXsXk>668JvSw@DYL0;e4KC zc_Z=ZM+T21gGZocY5W~5NE-Nr%T_+Y_^@{>Cn)le!G1E>O9uBPgW3L^4i+BWEsMv4 z^wCfjW5}QqGN=HpU?GB{!&yAW@|hbnKqmYZ#lwP3H$0LHNwSwD_an)i2aAsGmd8Uu`amd;LNahX8CZr^@DM@K;XEE> zc_Z-{Mh51SfjMYdnu#4OKpJ?A2@42*fbn1*S%^$pn5q~VIFStWl7U0WK;E0NIO%RF z-5;d)hEmEV0}9E2JhXz6h>s4ZbRWwbiBb|7Fp3PwK+Dn;cd%G#pcEd1bT6X>()P`* z;c~TPKrtEMB?A)30G1}FgGEYr%jBLQy{jve{)MD}9${865mC|MOzviRBQxngiuBJQ z%yK3yLb_WfcQGb)E4ydXznJv*lKu&#KTDI-!Q!L4WpZbb-Vw?qha?q|q-U(X5|ZR4Nr@zhH!l_=-7S^d zgY?#}R1%9wVm@J3P!W;Q;Z$y8c_ULv%p{2;3A3CEi<0h^%B_qFJS@9imXIWtkVG#@ zOeBf?=4V0D-BP(FNN*0MGKwVRlZ4S|1r-q&9ZqF4%NvPGJW248gjBRFO+iN@rxG5= zdh_u+1?FdjKJF6=NP?Fn#E}Gknxt(Q%;Db_>QpRM0mcfbmJuUNNP zAF^(--T)&5=UdlW1F*8*eCrHYTd&BPZB4T#Tl-pjSS_%^-T_OeWw+&H%Udve;Bm`+ zmRl{?ST2Tfgw>!*S7(`HK4zI>DYN8Se3qe>1WPZAdcwQthdpxx{l0C>WgP zS?oF0GtD#3lMkXgLp|}Ho*pZ_i{9_}>lfFzuFqZXyIyrY?RwaCr|U-76|M_hXS$ZVmbz+O zGhLHh#jYGzx@(Xt&gFGkoPRm@J3E}aV9kU#ozFWTbKdK`#d)>!BInu8RnBH-o%0mu zRA-rUjQODX2lH<8N9H%2KIbrJlC!td4Kpl`IDU2f==j>P!|}f3HJESlsN>%MGtm>~ zx6Ln_pMW(SZZltNzQlZv`E>JX=Edey&C|@|%zpDISi`WtxwqM6Hk$r4?KOQ5>pXmD zdfoJ_=@D4V@MhD0Oc$EgnU=%Mj|HYVrb^RzQ;})3$!AJ24S*Pg9ww{tsPQ-B&$zbX zd&ZZIPa5wx-fDQ-c#ZL5;|AkuV~cT-ajvn_SZ>S*dAt;3k}<~U1W}hi40{aU8NM)l zV0cZ$0I(PKZA+``l#6GvF|M|y4K1|?C9>(L2FD@U-kPhV4@d3Lhp)#NI;BD1I~(6! zG2iqI-8UUaJ(;fx$LkT{C?z6%e}V|#R4_CR#~c}|+^Zj@5=Wz%Z^}~LH)V-LIKqj0 zCvacgibYo|iuoB%v+_9OiN|5`ahM?Ch41hKRM(CF&<3kRwk=gIq&i5`!7v>R5@7vL zI#{8DTDF)^+tQ*-#df3Ef|3dPL5T#npfG~l)A+UrD1NceJ*<4|`2x$bEEHNZF)2E{q4@t__Dz(O0JXTI4xe(xlHJ zkyS^{KS|Un5e^Nr<2B=OJ45yJ^}V&cV!^lYO5HdA4vBDxmgT7CO^~7G`rc}My}|a* z;|+zOr}VvZ$4iu_qf_hx;dQKE9#Ae#JPwT#Uh>0nxZ^l{3LykeDwk}<1HlS2YXdrJ z=Jx^kX5OXyW}0SyR^)+C8!x;&Y8_%Hh2;rJ#8&d~;6 zGg$8eDCISYR_SOkztLc?oi_$RM&2A5`b$q|?3Acoq9-NdJqgRPUi!|INUxDLW2^L4 zNu<|98^L!6P|{Xkf3dgK$9p00jl?%3Z0|^X7s1eQy*^q~f_jc&<8d5@JsKOTI zq6?10o)Vs`AE;#pzEFaLx8!7r>@CB2YX;x&jnc>OHt?nF)_p0JI`W(?QGt%!_|lOb z+0A$8lq!naq--pd@PfMIkaw=|qeMA>i1eO!*Ks&p!gIEW z!#16%*Jab0-%6i;DVolVM<2w#&Ks(uQ;$h>RH9EM`b45zB-$)dqeP;US=>~xQuopM zI`ZLLEEaPceMt9tMVGd?$;0m+*z4hy!O#Rfou^bs?m;?o>3f&8Jt2I{+8&pPx7~)t z%i125KHhejPjqvDPM3T6-2;2e@l7n0bXhsS7Z{R9E|@q2-x7JYAT ze%FGpH*YKq@g9UB(Y-EiT+Z+0hQ*D|yx(hBT)*sAag_RHSL&!SMn_8zN%WgU2POJd zqR(~IV}n4o%gzyK;WGYhqhawv%S_?R48EkJ<@^q9Se&_hr`;H3gzKW5-C{FF82|z7UF1fzBwL)AEKm)|y*51)NikZz(uY@FI&WX^8^l?Cy>+&}-s0NU_~+C97e6?xNY{g3B3M~)RV?2d2rfHUM>$3vW#6x(p?lfy{}j_)<%D0= z|NlgI|6_c&n02tu6?8Sa7Pw})DqJP5(XI^FU{^m^PnXSk)OpbPqw_20r_OhrFFBud zKA;{_e^$Rycc||{EW$SRA$5y-gL=7ozPeTos7uuO>I`+FTBK&HX=<|CSM8x%>__Ye z?49=A_K)pv*rM=vq58~}9F!m8+ciIiMKWuw! z-`T#fePDad_Ka<-?JnC*wkvHLZR>17Tcd4(ZI-RVR$?1%%dic$^|SS~*{nyc2dzI^ zzp{R6eFxS*uZ)=Ob!#8zvSHPaevU1P1c&Vx9K0_zCt0IS<-f)x|@S=uc- zE!!<`SRS=pWm##N1EU?e=5P2&hea_TGXD&#D&Aw+Y}sTv%hF`2g|QGA2{G?5zh{2M zyv_WOd5if5^X2CA&1=m8^AhuX^9=JubCEgQoMuio_cix0TTDkliJ{Z9+w`&NEz=98 z$4&Q{ZZ%zFy4bYAwA$2ST4b8*yxn=7^HS%z&Na?fXT5Wtv&uQ%S>Vicj&Kfe#=_`? z$#K}R&(ZGK>Dcag!|@!9P2A(y?6}IY$#IrrrK8DF>zL!10`Vca4xeMFBf-(jp*j?I zCH(p?H|2xaeTpf`6k~Fl48}iQni;QdP$-eC3=CQr&aAa ziJq0{8IGP%wQUkTCDD@{J)&xlOZ1pTk8<>&s%_<{*`c)xq-v*0)WXp+m)6A55{I@- zAXRIWXemeaF0Fy1I)_#-kg6?~Xc0#XU0N+i^BvkkfmCgQL^T|p>e8wun#a*84((Kd zRBbLtvs~I7iDq*&!=cR*NY!R?G|i<=m#B)PsSa(LK&n>BQH4vJBGF`yCOWhVfmCf0 zN8?@E1dhrb+IWFfZ5&5sE^RDFB@V4jAXO{nC{5KeBueMVW`!>xc+c2uT9QPG5+z6! zFHt{<;y8*`wZ0Pd5qqs#EJrb_)?4~wB#P#!r>gamC`#__$&p9Zyb|@0dp#UERn0At zOYU_Fl&(3XPnF1yh#pflgG59kg`>Y!dX%HXDm^06UmX1uLl1NGyGs9*=nuK~ca9FK z^pHfq$-M_T+ON`IB|0GY?&oN)O7}_MUWxWd^ovA4bM&1`zvpPTN_h`Q0r4J=eyLL4 zuQ9Zfr`w^@FC_Y$qfb=Idov1%_hxjvN=>Toz=mC{JB+-K$-K*03CAyEJyHt9QM0ay^ zhf431XbVTTs`Pe=ZsX`?mEI!JW{z%9=}i*d$kDYbyveD`vCD4!F;?$XxFP6ZxIaf7QxUBJjd0l##@92=vwLHZ9}_4 z)vn?`K)h`*A8#AlrK-kTgtp19@fN`lZxIY##Pe=cHQpk$^Hq(v2<==|JCE<(plZAw zXlJ=J-VU^N4vn`1ZJnyE=jqnEG~N!hH4bep_pMPi-XgTsF70&gTj|hvi_li88gCI= z(53Mfp#>ZoZxLER)t2)dtu9Tpi1{jAfIgVVPHQ+iRi)Ju&Esf}O6N*+3P&?lI$NSy z995}whD6gjnyS)i5>;|kq0%W5P3CBVN+(G)k)v{zj+ba0N2MwqD-nNUgTO5<;XXjc z9QjpRC{Y1Nxhl<HJk4n7~_29^ibioKR7z5`VL9-8%O(9->(uK;AoHP+b7Xp zj($>ozew~mN1dwgM~Qym=zG=IAyK<(?nQQ*EDFruF7p(4Mtd}v!#&h9z|+qY1M|35 zkI8-1{RhnD{@LB`{>uFY%;$d3{f7G`_cJi3`yux|?%Ulr!MyIv-J9I!y4S(n?tr_= zUGH81^Sfubr?|(vOJI(7w%g|(;T{b0y!*O)x!rCX%=JFvI^^01>kNG7+U?rm+U|M> z=6t{4+U9!H^?>UxSbg9I*Hx}dL6KmCYprXgs};rv7P;oT=D4b0jG)|A9T-k!C@FL*yHR3-GZGkX7GXYEzmA_4#o|(I`0Ghg3a(d_e$r*pkZ(p z{MHRRTR_L47Jl!}a#n(tK^gq!9qrUW&tNG0?(OG{0ZjuHe)}GE`~kWKKf~|euN+^1 zw!wSw8~7#1GoWwq5d03l-Ek9W99#~+h0k@Y1D%5a{2s1%EC8*88StBUyrTs44zl5Q z@d(FY&^+i1zm44v8|WS!fsu@T>W`p(up34*wyW=e{=o|{qVcHu0B9iG3ZoiVsh5Hd z!Uh=GSgE#x7Q!MJ-I$|RfgVCRjBwk*Q_r<)X1YSa&njTR)`$A3Pw*hS~o!S$VwPPX|yha2$DH4mQrCYhbWR< z7*olxra&Y~0*tNnv^uR8s{$h`2Q7ObqU0MGRr%EN0YsI&0^=u7TDC%D$rczzxz2JW zM3|f?J#XOy<>U}#%H#f9yL7x zGiPo!-C(-Pbg5}0jMJ<&tu(co8eyzvKEza1!5GgJ^LTTKIUmM(eC846!R90w>*?h= z>^bP!jFwj!C4(%Ce*PuNe?P|0u(XK$d9BnJwCbW%c8_+IB`y$#G&_0j$IkeBB-G=rF zw2z^E6zwBux1xO*?R{wPL3L%YFKsU#PEjQAt8AEJF9?R#k7Mf(ogx6!_Z_D!^}p?w)`E!rBi^U=;jdn(#F zXlJ3Ffwl@QuaT*Ur=YDsI|=PXv=h*dM>`H}Ioh#k%g~mhEkRq1wh(OrT0h!+w0UTA z(T+ho8f^~RY_wTuGtrJhtD&W6eP~Cb%|M%uHVy3vw8PP+pdE^KFxo+A2cYebHXdyp z+E}zPXnUdcqIIK%NF->zDq1^Q8(IrmGg^>7fiy<62DAjN!fe4Yv`5kYjrK6w-_agK zdjRczwENKRMf)?_AJDd={TA(4Xm_FAiS~1}pP~I2?RK;uqWu6ZwyOecR|VLv3b0)j zV7n@K1Jk^U_7$|)#tL3S{36;H(Bd6efOlNMv*>vS?bB$tp?wPNlW3nn`#4&>9}6Bv z{1Dm)(LR9oezf0E&2--tv51{=SEw*9*SBSqr zi|y9G12Oi8{`U}L`}AX*^uLB4Y>j?wb^dMW!4~Dmw&cf_6yv&@M!~04>&_{}jZt(9T3V z11;93e;VScXe-c8L^~cW)~~-D@mREFXp7NeUHkJ9V~zXAAjW$4XCux;I|{9amZHU0 z;U9uH9<33r0WGgbh2eax&HST?ccaDn%E$W3$NI|u4E>*?{RHjDXt5siw%(c-<6zX>tkJNX+CUx4;}v{-BT=OR8E?U`s#M|&Dtte1Se!ugfx z!Rwqq1u@=1`FOSS@#^K{)yp4^d+{3P<2B45&OCX@Jr8;1A+J1ab$M9wyhkt%mOl^M zVctXN!9FeT0mRrc^X@}@FIsGwc{d}z3GIz&v90D^kN7&Y*P^`!E%r-!S0VlnT5QjG zS0KI|?PX{$MT`AX9=7&8yta9GZS(M|=HZph!z-D04yNCL7O!gFI>dNw^VTB9E1ZXS zN8T#*EJxdlwi#^`+NEgm9?8SH$XkS-g=puatwuW+?QFEO(BhqvHyv>mTCB%Btie32 z!91+Nyb9cl^_YkEOCH`Yd1KL!_e)+eV(cOF3K18e%|nZ|pNF-d7mXepS}R%$S~FS` zS|eJ#Q}Xam$y1mo_ZZrvX#YlwcS`Q_h@V6IEZS$#K8#m;1S^Sc?|@+PZ4fI8nSbqM^*d^yHxwKCkPh+y36KFwJDmJv z{_}M*QF#L)9$55^|Hn8ec8}&-sX0~iqO#>p3)y_)BodX{5C0bBbaEMaHjyPXlM<~t zSHfcL=C+0Pb+yYI>w?V00R=dxoBWoB4@5;3QYOc|Dvk;3+7buvMDpa3%hPbiIwrCD1%O_Zk<$}+U)Q1ejF z(6tNO7G`#GDS0+;?S!0m%-JR55bqH45cd$sSD)U=bmVPz(%)q#cFc-b4K9FfrSW*K zWS)E)5-Z(NW zyD22QUL7o_E8fL&j_za%@HRpy=44kxzZk}q{f$NAs){F%tEiqlyMn zA1wIT7|8Er;_on}%>(Nnh91GA5q5+{$E#!XXuWYIk%3Lw_-9x&s#EB`dxmv60Ner! zJ3!m<10T2rQ)C#Uy9Zcb! z6}S0>v(cj~=-+C9%~A>^VI_|q&8unj=(bgDfx2a&s{=~Pqeru4WvW|XiL5}<;3P66 zb_V_h$~u_vI}~VO)`~L_G#>U0P4vK|2_sz3AgbIB0 z!Y*Yb(e%g)dRT3&0dZ=6d;XgOCafO6dMx}iuza&Sm@+(@f!Ouf_GtPSJNBZ6){{DT z|5X*M#=}3Bub_hq#v2DE!UcdHLAFGCcm@3_25vK$t2T9c-SWC|O^e`Sz-$3%PKH&= z*}YaJ!g^4F)BGJmH$JRA(mz+w-@9***?|dx0{CZO?J=)|DaMDlN4tmq!Hy82JthT4 z;oqX%4z3kXhJ-b%-x&!5>qS}TS_)dzt3>+>tmqj?2(Uf=4j~sGPTc6ecWr(i`s)h1U;Wo@kI?z2;GY3%g(=5(OX>hSW&~1k^E2>oQC0^RjfY3xiTBq2 zE~EsT`HOqb?=zpV(K=d0gYVOY4K(Tr>4_wN!Q5S*q~2aGZ*MPqj%poD0UpZQKP=zRnD2NGN(?TK%N66or)bAg$Yvup z_7o-f92E}^`qK(}JP*hx!~ZPDhz_Ro4$ru_6CYCa#}(`;x;)STiw3T8^mH&pI~sWM zVPVOCz~tD8r7vh`!Uw6^M`e!G4kq6YCy5Ws)rq-k+TdaZ((3I|b_O##m}EP2yFRMZuw**4+XZ0dk z7Lw&9S@6gMRS~Ae4*B6$JR$$r?9?@_EHA&K3?#D$$+VD67s&+8mDZdNroYafK7BZU zXpijcEg!Pc z@cHk%gE1{ND_1lG>Y)o*A*&LKsud8;OSCwmu>?6COnALp8oPoJs1!m&BQ%fD9JGRl zkXjF?v6JPEM57;}BMBXWmZkA`FxhpW5iSq&CDI6Akd#nAprxdX^T@~?!mJ=MBNB;ES>8w_`jL?%$;c6Cc~wm3 zB*LrW6HWr8df+w=ZBQfqWTcmj>`O*+7FCg0d>n*0wh$IRk}-y4WT6!-rbS}$5z8Bi zMPHJUPBK!^vNU-em7GPmblvvjRT0V|BadWwNk%Nm;2fq#;_zV*qV2kHNFPJevk0?- z!<0xIK45txb4X7o=_!O+mPU2YC548kAX@vM)!0uyTK|7fWcmL!a{%r)JmvWf<^fy} zDhL-?*I8Fso2+%#xz=eg3!u=N1u6xaHPt%M+Q;hgBv{RszbyML9hO~|k1TImp0_+^ zxz}=wUtcH zrmWA>)6U@Y6d~>Omv!I2J0=|cB0WdtWQq9XBRJmFuXNuOK6ep(6`$$8icclV(b1$W z67k7VkYkeETmFf@xBN^WZOEgxZG9BfAB#}IFKA%1Y$IG3e?;S0Vmm~9LPtx~h^Qm}{Lqm;H_Dgs$ORJFbfkR7#NJuW6bo0~nIGurjQ4c3 z@|cbq^@dY7{%zeiKA@xWIvtfR(^1J=I?C4zP&Zm{LUkkfOv*rQooA_@j{G1{Z5^LV zAE>Qec%AO6c}hpsRvpcIP)BpqC35I!_M*QN}!rWxjH&UudJHc zkLbRFD{*>mpjKJOr_2UwS6OjlUZ8dbpG^zk4&hlgNr1-f0*o~YP;LkSS%{F zCa`F;zIV~h65Xhy+NX6?vq2)!H`WB^i#7*HR3#wMN&$%`1jwW3t^Q7;S0s8|qOB5% zd#olfPc#TX7wUWGzAlk0)!ehCkIzMihsIpdU;&*X_s*7RmPB?Pog#XYn!p^%a!#wh zcTS;>X3HG2p4EM`M9)+cn6*jzF3{0TnRljN_sx*ZXNX>?CNP6fyoJ)wXwlP67f*$n zz;toD0h%KBj?+<9PaRDgs-wysI+}V&qE{u_sG}+Jx=ayWL``5y4}EXNuM)`?Rv~WW znm|R3zIWm?5;B{>AoacmZT!xmvDB`zNef4jHJBi;eS+xYVQ-Ag;gv}A>@|US*$c$Ws}?Ws?s!@Hc&nbb-vbiK z(#PGe`{M4DNZxsIS4p32*>Upzh&z6iB{H4t1>)vQpS%WfbEI#Oj{3@)>3fItT`G}m zr+wE+pS-*Kys7*8$X+G(C*2qOzC_VF>MgH$Z&}mPx9NMMW%=B)m8b{wy{hbsAre=# z1AB*#Or<(9%4=YFNB0?C6R36V5FIU5b+kmkds>%l(S3FAN~B-O*4kTjU#;F}x7J=S zeR>_W)~?Wf3-vy+b^bZJuUceec|{Iyyzax~->7(|vQkmFRu=mi`hO z!y)o_-;`ZCs*pS?8l`W6M0$VKI%%iw zo21{Xt&<9L-^5CZ@E+t3+}axDl9vUnQ!Y7MfB0X#L^>}zraL#~NauxIbP2xNDCd64 z4_wD+7CU}Bkaz2dpoQ}3bfeeMS#hCd6`@1A$9ab-Kdgw_5mjt3ldj(ByKdZRi| z^{H0-7qI5uSr9Wm1mePKN6qpl)$PQ*}$Al^?8%y;e2k7kT}C z{A?HP*<;cUgJ*2 zTq2Jn+lzmJft`G*gKjQJ#cFM$BRf7D{?F|ciyC;cPP`zKAe9>I_EJRW48y-*W+z|E zz>wJI#7i-;%cbBKAv@QR6P3d*!pP1Ef=>Sv&pTnYHr`bgSOqIJ)v!0WYHAez0VBS6 zK{t%Xuhz;Psl8I+|IE&Dyo#d+c0F>GHV#s$Ac-GRFEMHT(-Pqyc(Xd$ngmd-{lmDF zGcFaylPjiGRZpp^HAz-G7e*H@uOC|V8gyV%;Iaqc*4oGT9AcC}`8vSkC{MO1i5 zM&WAqwu`^MYHnfSIdB6&NJgLdKFq0g@`VD7!%uv_q!onZtZ8knS;ex&_KjuPhIg`6 z0pNsv!m{}>8^7aYyfF-n=w#~vboVk&%g5B>Wn6U6XogZdx!iyFYc(wolk-lS%q_TbSIC^ikd@mO8bQiTFe6u$Ok)7?B!Az~QA`�d4=lPIMF4o^oJkDsI zzAoT(dqEy;NGFrxha-na?&M%f8M!m8lL_xb%IL7mmyIczthvYIVVmKdTwK4KOPwXs zE^7$1xxMbjhGkG%CZykO88R_-Lvx$U?E;(H$z=1py$+)=rT+5L8RcX!t&_{+8xzCI ztnu`XibYE=W+*U4n?;caJl)1s>f8esXg7WkRK-Z#`V!7I|fcIFw~$@K3b zQ+SAwZ*@qBP-*43!ijJPRhL`gdo(Qn%0h%_Cl|dZeLT<|;Gcfqja=2+2rp=w0*i=Q z*;1rz0jnxom@B0-15ODKG8ew-lL1$-mVCx4ElmwpG}qR(4N`7QQEoJh=@h#5y%W2f z!XB-qv&1b;khqxTV2`Ta%8dh*8xzp7J!3k#nmt><;e-OFt%@-eO`Z(BV%g-%(!%0$ zVz4VW+LhbEMk_b6n=Y}FiPythaO~#{vY?7fOI@YqK*G#UCQ;AY6@<0$|MUwmVioIn zN(yIBgNwj}qq2r&#bou#s;ybomex6(U-q!q%-Zl(0}VCshB*KN)op3@T8zd%Wppz6 z`R-n2YblUnVLgN@@K+&e^}bji`|Rr+#t!^k}f-%(`Gb`Yd(Xlj5CV}y4E11X(M1RjnX7J8s1Lt4C+Y4yW<4rgd+ z=Rlq~oZmo5+*Ak0P3e)sw!=EPuzNRU7ywC^!4*%dALbp#KyD{jZ#VSs`V|Ml4*Ros zMMG3uee?3hTK4)KnifQq7|c^zYcJ zwFFl21DGfGo~%xenT#*)JDG4hgn5MLPn7u~5Mg;81gq7G{1v?`)QXr2mcO)qwe#QR( zQJ{riRnxX~((*vvN_LY$An7uOA#!x$;E8=F4w?ul0@FL0ggX#Q?fPXGE=WIKAbyx> zA|8WrVuylnG_?)vp$qE*wKmi&XoN3e<_YN&5+|fhV8>nF85fJkOF!hWy@I`u4&2DkB>2$k)!@b=wXa35_bIL@nz#H#ExR5BrI-E>$_5mRm~?E zxYuWF>DVIphk<)@I+;*BT&%FbJ*^KO{A45d`jnNG6~RB2udtKL$3x`ai5DyuE|`@l z=58bR%w?0tI?H;OvCzGOPA(%)AhtvNhqnoI;=NaDF{(Kv(#lhmP}Hj^wkR)YQB7l8 zT_5YLTmm-x*vo9>T8lQ|mo+G|v|vc4f|s z%~SKD^H|_jL1!<1-V^9U6l|}RT2Cl?cVV!}Sy@>l;2%cq`8uQcA;Q06N8uqt0=Z+e z`s3fC{LY>{(~z)o_vGakEk88Y(43W%rNT3YMJW|@dLtFwyHfK+DEQ!voQyR1Ckoyp zQo(!RAwmk?H)A0FEh^~r@Jz$Q3hwDr@UAh2=8Q2JYDR1ZD|%(8Tb%dAC_~MSk?;RL z%rG%^EdCh+tk(OHyA@-x;aNkj=WLJ7eVN%*lu5}!AG^zX5mG*u1M%yp82AHiq zAKp(dG5=x?fbRP###hMQWT3JIf35#-HLKUhss@wQYCA37Hc7c=&bHz2`d3YP^1SyB zuJpG|e>Kbgm8E#}-09OwE2qt^Dle_7oL(_u?zG9%D~n6#R+dhgJZ1 zel?!F?f0uUeMR^9N8dPMQB2>5PUhs}CRUA`RLV}Tqkk&Edc*n{b-ibOlmoB9dh!8MgVm-r0EV$(3VTRb?ss1TGm@F?Jd+Pgl=BmFvvaDq)qfVxVo( zYAnvCDW8n1`Q{@3S#!3Y`+#e}zb_8d9RDJnRvrTXsQ~MZt9S`cA7Y!d3QG`F&tF%$ zbBDip@LvnRZ0L0|C8#JVgkb-wwBjjKrj>?#_@`2wx$^jBSjh|V`qT0EE=l(n)c1KN zGoklM6hfbJ0GHu7{HFq}k6PbTG!6SGXd0JeAGyi;YSIEgP!jrG=V=neLt+5_lGkMv`oV>hnS~=s*xBqnV;Cg4s zCEvvBzekjFk?}$Qq+b*MyJP2%CvozMlF4vtwEuMC^_KMxerCK0F2pmh7~ZyP)(!Lh zRUON7-PfOX5@#M)J+7jvw6d(Qm_0$deEO%7tXZ$}g0v+q2{Ooa|T)?Yf+krL13;Xyho?2bH{p=Yhe}2~f zL<#;y6I`?27IF#B$095@9C+`_0h#`>AFfQz9@~7fMeymD0KmVv1lEvCa2}q2%|~NL zZcE$hpZC$6^jl_4|M%ywnl-6((v-=QC#IE$z<(@*X}yJ)fju*obFmEPR|T&5;EGB9 zg&7a`%}hK0f29m?^^ce0UsOeKy_pvS`@nOs7%P5RSM>M0d;BxsCL2#(H|=DKQBuUN z0<-^g0amX!@e|`$$qjhoGoK#tYV?ym{j(;{`)$jJvXeY9QioIj3)b*W&dATcY7kug zv+?Z9pQ--x_tQK4x$DY){AkO?Cvo=4mGAz!_0DY2ymje5wv#=B!W|r(f z@1r^XhTz{fU1Yl9f2kDgN*pi8zq=kJzx1Ug=r2m#_uRX#lXx=9v$D$2OYm>1!n~H3fwhUXScc`B zzqvRi`6d5U-z)p>d!y(iu0c5r9hXciEGw;=4cDQ|r+>N@%g^A&VEw`wSd3Mz_kYks z+2x=8dGC%nhX(%pVoaM|Q4C+C(f-qESFPcvWxc{0Jnb1d505hs{L??_lD*cxn;tyL z)4~Q55Xp z&R{o-Vn;;9t`QV0QNe<3(^g{)F-2mUX~q~6O=1#F@3Gg|dvA#fq?q2#cjlbg71-r{ z^ZmZ>&-Ze<&$)Bw+&kx)xp#N(oH_G%!r-3s|6g1he$l1%haYqD`#TE%o82=0|0Bi* z%>9S^NAS-6%6%3hhwXRobZ>Hh?0yI0hP~`w;eN_p;(h?4hTY*Va!+$laF2zUVFTTL z-QC@t-2&nTCb~WDIGAbA4$%VtasBH0-gV7&5n=@%c75sE=K9?A0YnOX)wRm?tm|=@ zb#Jlj9@jkA?XK|d zU|9%rFcw*+SteMJECVV=h05L0iLX|w4Qn6Kash^Y4h%+~m*X$g!_xYINn<|mkF$}x?A zXnOrj=`cBXDsnxah(lMy26{bsxlvmahEo`yJjdts!)7sd~b8z73_OE8PU z6UIl3_rrLF`No;XDaJgQad4<{fU&nR4Mr_^AGTug;@-mI2yn#i%|}%LudaB-fDdd zu^i9COp6EYyX{*blH+^e;j#uITs#eN93QkVvfpK&V=sg#j=3ZjAwG2*!N&hd*gYbjC4CX*Qqd%(Or{AI9sQ(CNLwH@kTK~NMNybci zP3ISV2znFrBIrrbgCLy%!fi-}ZUkurK7v~bx)O9D=uFUwpd&#Cg7yUM2vP|I0VnVh zv?WL(NG51Q(3+qXK}&)b1kDMW5hM{L5;P@fLXbevn4l3sJb{OxAwdIz`ULd|ZXu{k z5JwP8P=}y4K@34Hf@p%82>ckqQGz1`hY1c593(hEu%BQb!Crzd3HA`|CfG%=lVAtI zc7kmLTM4!hY$n)5u#w;kg3k#)Blwiy6M~NkJ|g&#-~)p93Em@km*5?Ow+S{7tS5Mj z;7x)z2-Xq2PVgGRs|0Ha))2fx@G`+_f|m$Z5xhvSlHdh`6$H-{JV)>>!7~I;6D%iq zir`6tCkP%Vc#L2f!J`Bv1WO4XA$XYJA%X`9mJmEZP)u+?!D52@2o@3COR$h&0YQM^ z9)i0G?jpF8;0^*m!F+;w1ak@I5X>ehBA7)mlVAqHbb>;H0)lA-QwgRJ+)gl=U=qPZ zf(Zoq1bGDG3C0oR666q!CAf`X48drEQ3N9iMi2}q7)CIZU$D@dO@%h6D`= z>J!u>xP_oDK^#FWK^=nH1Th4)2%-sU64W4wB5)J92%H2C0y}|?z)D~tFcX*vj06S( zy@a`3N1zcf1n<8DHwgYA_?zG_fdMTHX4 z6o_m>duYmBFPbvfi>5$G5ITmY%=MxvbG>NFTrZk3*Ndji@uDdZ;X*3R@uDenylBcC zFPbvPi>A!+qA3uEfpVfLbG&E@L^Ys9G-Zw#O@SZ*l!&Ix@gAeSqXb6?4ig+AI7o1S zU_Ze=g1rP^66_(^O|Xk#C&3Pa?F8Ehwi0Y1*i5jAU?ag71fLUpM)0Wwzrg!_j`tHv z{FvY)f)5EkAb6kPJ%V=$-XVCKU<1K=g0~3XBzS{h9l`4auMxaTu$EvA!7BtW6Rak9 ziC`7Miv%kPULaUO@I1kD1kVyYL+~`ga)PG_o+NmJ;BkV-2$m5%N>D z!dQSMF)iN50#Q-$9>KsY4AuZM7&I==6U8i=!N-Ps*o({;rLjejCkj%HQ2`dEV~s3q zW58F-2dePLJS@uM(E^%|=@`@5;+aKW$5+E+VIE5?TtMc7T(ZC*W$OZvP3J4I1eh-X zN1$M=8(Yb;Jg~D6cHuugz)Zg0-2zZF%VL>fC9@<)-MP)t$e0W{Jdd(@DN)8n8k_-+ zdU9CH6N_vCmabdL5*KDfz2STpeyzz z^wworS(Fy=0nb44l17j@)?zup66aN4vjC|5wIV>xVLEjS3L@BpO-X3+T<>z1I0 zBv{~@3j*?x27@x9wn9oayT9NLXb4M3-vJDHJdotWx&U4RtQORmFHPfn?ESxtIq;)=iobfFstZbhsX5Z^ASdRg*;}7(DV47FL4=Jb_q? z=7SU9qSI}ZSC3)Lp1CK#?r0QL{&SLtQdsNx;fpx;IM~fJ2%gzD=(Ndw!q@4yQs#2x4tZH0_mQODZYe-Sy60pEy$+zg5U+rWO$ZYY8s*} zENvx3n}1X*3Pi=i)zUXEvO%>40?aClbO_W9P*|uPuyrLQLHV=*ON)k58YEk=q~VtN zio1D$C!HYxTn2nB9?-);*9QieKG`4r0pQdFSBUb+J;(;_x5xtpU^xM{5dfB&4EDhZnVCGygDTVI z*+DWE%PY$~R%U}HAe*GeQ_^FBOae(W26`;q@2MrTtY-_82CW?#5BG`(%DHx!=K%+c z(ldCrSX^xzHcI>J;RG-{kX*0CcX4BlbZs-&*`f|W^;ulY^zy{OOrzdV_7|b_9`?Yd zwLW9bbjC{L0UwmnXYpBdaLclUs2q3{$_1a7i-0j7+>?f=L6{g7Ffbk17+{`8aNd=c zcnwJLFqRY#k5d+aB*>>@i(mt7&`<(<9+?g&f#Y(KXNP}_j^ z0Oy4iT>x{!Lk%AZHhB??d_urdb7#QE7P6&7{cyv-(9$o{pj_fDA@G{ zpbWGGQReYck_RLZ(`XN}-wP!`rr-#mrZJDqPK$vx3V`I3dj=?mykX#(1~x&7eXtFH zj@;V_|2kQ2Sb&3oJQIjf3G$o)29C9iErNyxXMrO?2%IQD`QZ>=P*R2hU~s{TVKoEr zn5=M2Rvw-nvcb9FDCGxj_=NDuqC!eCBpTq~CocnnI=6w9$X!T~cb05qu%t5J=qS71BkL;w zJ3eGUlQ%Ft4ty-iXW0ljHTi4#J+}ZZ40+(RmWGE9PcRsObLLx+G`d5ZRZOc1A9OyJ z9hkg)Bi!)J(A&4OQSGwa*S2|TL4B;(cKSAKS!S?7HAO)k*3>eNuGE8$2MV@+Ba^4r zWIF?bJZ7H-8me48u+OxOAjuDJ%XBCYoV-?m0M~S%@`%HYw42v@DBfT#2VR)>_M^dEiTjk1bf4)+0GB2TA}>)dZ8l zk}Xe8ma>HwL%arokOEM$mCON|EHED$&?2i63&FZ+Q7j!aWFyTn02MmMZpKy%>_OhJ#x>(U?kE) zA4o(WoJ7;2pi~dYeVH!*Wih1S2_!|a9C+S)YA%4B8{vRlpk2tL0f3r-P!6V(rqL-u zfCUnP4}3=Yd@^aeOodZ|TuXjX!4lB%qN4i~IIA}}lHlf$9{|h~*palLQMJ=V9H7 z;g0e!lWna*=ZTUn1F}a20-&j5v9jedy$e1jK=3T6JDtm2%g5@y-xTh3T0i(&AWgz4e;r?m~* z-C8pH6PoYyjF#k58XjbIM#C5v9BGIG42gWk4^yGSK&$p_b7!`>izm4g3i`xS8uU{^ z1qZf(%F{~4%Qg$PS?4XK5j<9ReR*>EhdE*R{c@QThOZU1m(jMHvdyi6Yi_?%Ic5h& zVYg~gC6+6H%3oWj>y=*wgTW@}PK8k2gWdRJVVe`!W*7l9E4h@0?^Gyl z(7-4CFo!D|xT!PSga%3h45X1e6;y%-KA}{+Y?EM{bSb4YM#t)|96A;Zd|c+th0%~R zrFolL1XnOm4$6sW-edp8yiNVsrWm#XZ<*MqR`ynX_Ev6Q-q^;aG+xIV?UW-ak|ZphKw|l+)N*sR@AEQa?!PdcEl8PNl)dUvd z7kxOSnAszH*nmNxyQ&de1zR^;MY?hx3q`24!qD3o{*d3GA3Jt-fsC+_H#Wau_O!9d z$?bB-rmz>-%kqFIrFkr@Fy5*nN6;J|^z$XQ`Lm(5dE3es--tchBDl`)St@6%fF=Rc zv+9UltN|ctiEI+GTtU^su@j~iLg+BL@xbT!qwGl+d(^`om6=4T6;320b%Yh*0Y6MS zj0K<}!3pfaR>5_C?^2w*Leq(cRSQsDu>exFaBN=TY#821TUmq$S&5rH*oZwSi_o@I zPHG{Ga7$GV?)SrN$MaOlo3Q&@1lM_eN@;!z9n51}g@DDu>!Y5$JTVdELl)pZwxkBT zuQ9t%7NAY3oby5!pnj!scTfrU`S~K-ykNnb-qQ;I=JhHy5dESt#N&XGem8?SEDBzo zl!BK}SWZC??Tg-1i9}T-E=e3Av*gbxJcer7*VrNCeKN@z8 zX19o7*xi1Z!+KWSELc;n$%!hc=_>B%DdgsNL9R-M&FY4KvwYX&oD>layR)ic-nJE5 z%&d7WX0?|Q+sAgeMpI8jsIfczFqw8(jZKT477hPon4d@qk4ED6^Lh4ZanoQ;xi-H# z!{$S-N`_7AhJRq#yy^^_SJkkTRB2dBD$ZIlZDxyU?Wd7pbE$CQO>wRt<^c~gY+~%h zX!s|?=2U0c96!t)J~3`0tSQ%KS7+F4$W_s>_7i>hH>>NlA~Gy7zG_n}s%lt!X%~Jy z&`q4$d}8WEGHX_KX3g^Rnc-%QiyapY|76z8>dczy=Y{rhapPc3y*7i)imrTzL8PG> zkV}3X-n{v{jq5+IAN=beHRalLQVbt$J6$SPxHa32yA}Utb-7juI?#f{=EdNJK|ba} zsEvHOH`OrXaT5~9iE%_n0httD%LRTuEu4-qv16j)pXi{O9U|P9)BOB)`fu%=$4 zc^s_abWDX@K|1JDt=pLXWBS2A(IIDYhkhe?W(v;UQw{$Pc3-DV*{}e$?PRsz84UZsp8)^k3i1n?3e-NUIreTQCjK=u+D0|=f zePQi(O-;BE9#U;ISv5;@_N(*J!o{-7R4u)kaA|AmC2bfNFg+YxJwrPag1I z8%c(R2UHvB=ff+~kzOyoF8mW6BdVig1ZoB8NUwo^K*w-W2yaHi{d}lBy?#2Zov#hU zT-NY_YQrE`H38M4dnDrD9DZ#ms6)%RrApkc7(TQD5fp(ey|=wbjUGh75Gq?Z1w;IN za77Bb*6Ugq{)vKY(h6@8*{Btyplc2MD}wjcTE5`~bN}wX4l{>eaG!vA!*{wj!hC@1 z-D_da@a5q9U+fOJ=fQm8liWGr`Jd(P?e@9byOZ5X;P)Tvj&fVv%=J6O4!q{N;5y+t z;M(ch2=fT8cdd1;bS-z4xQbl?@c5tZn&irH4R>Y1Oanewdsnh6$>njyx}w0}pE-Yb zUUyz|UT~fOZ~vXnjm{69>z!+zE5X;l#98bNIOjR1J12ps|8Qp(yp!-b+dGrN&)?&W zbw)YiC!yna@bbUrxZpV9H~>EWNp_Dt)*fZI*co{EU$uqao zE8+b`33&GhZ1Zf>ZIf&{Ft1^jt+&l*Yi~=oCD}aS*&k)IKqSxKA^yQN@asQeJz(8w z-Dv&Lx*ojxS6Y`_ORUA#fOQ`D^iQ(pSchA)ti7#1@aRvrCRsh!SZkEk0{;BJTdrHK zSuVi)kptk(ztQrcWxZvsWu;{~`0^LS+==rn(=C%MIpE2kW$6vQgzYWKmL%}wkF`X> zuU%&T-FzLq_%E1Gm=BnDnm3w11Rwsj=9T8<<`Q!;%qlR?Jl#CWoMRqt&NBA~|NZvn zWOI_)12gwTf%iT${cgH$x@NjyIsv}>J53u+ADY&i)|ys==YEN)*c33$Gfg*50>Ay? zrYuu$lh4%Nlnh?`9#gC-%49Jym|5Vu@tX01@dV5*u+z8^JoeYa>;fxc*837;G5G7x zGfsyY?{i>=fh_RW_raX>$;Kp@kvO%XzxgNBsn~eSn$`kIGFu+`*r&@`vvgUKVaW!-)R5P zzTUnTeD#;xOYFt=fPJ2QI(X{m*oWJ*?7i(idwatH!%o9Sn9pFnVXa}MVL8lbP;3Yo z<{74gSALFRxFO5X8)h|V4?g)x1`o_@5M{7{f57iBv%xj}1^o&A0hrrhqy9tvdi`3M z-C()CL|?2A!2AZ&^^^2D`r$CcL2o_0w4}wX*XhJ`F&(i`6e1Rg0>o)z8sbzj6>*A~ zf_S^Q9dWXlj5tY5LYycjB2Ew!5c5SoVxGuD952Qr!uKo0T#<{IBXSVOim`~diQ5q2 ziwELpF&c4{7=<`ej6@tEMj*l`GU6~X3~{I!ia10JLChA}h=avo#6e;Z;y^JFF-v42 z4iEznGest1f6*T?Lu4TK6a5hTioS?_L?6W7qBmkM(F?Js=!w`v^gv7(>4@D$cf@X@ z8)BMBL-YwBA_Vh9>?*n<+Jp_!Dy)bwL<@hCrvc!VE8Jj@Rx9^!`(5AuVE2lxTR{d_;-KE4leFW-y!CI1p} z58s2ho9{;4#djg@i6cz7=r`--5WAZ${k2Hz9818xg-ajv*ZJ#+ukqIqU*)eNuH|bH*YGunukcq8U*<0( zuI8%|U*azzuHvf@U*s<$uH-8bU*InwuHY*WpXbjbKF6O!e3n0p_zZsr@oD}v;&Q$m z@hSck;*!Ef5g+4^Aui*~5Fh1_B9`zH#HD;G;v@VK#E1FAh!63H5Fg|Z zA}--e5Fg+VAQtmt#QXXEh>Q7R#QXSth>Q3l#C!R@hzt2b#07i-Vt@w_@8S0#-p%hu zyo=w3cqhLT@eY0mBD|wPoX_VY&g1hC=kmFTbNC#@*?cx)5idfV#b+VTG%;2k(KH&eIXQ^X`b9A#M+`ZVvLAEtR-q8MvG{~nxZCR4N(IzN<<;T zU}Hp=a3MN{6VV|Yh<0I@$h-2ch+R0=5AV#eet0L2^}{=ItRLQiWBu^<9P5X-<5)jD zm1F%twP5{lSnzyaj`hRaa;zVo!m)mMGROMiZ8+8sZ_TlOcq@+e!&`E!AKrpv{qW`- z>xVbvSU)_8WBu?%j`hQva;zWTgk$~i1djE?8*{85-iTxU@OX~(!#y19hd1O{KfD3Q z`r-9C)(@}8v3~e19P5YI>u{_eh^>nC!(%ws53j|set0y;`r$P> z)(@}2v3__I$NJ%Jj`hP`9P5WWIo1z%aI7D0=Ttv1cpCY%ax0<*A{EMdGjlVdiJK6O z+=yu421GsABkH&gQR5mS<4mIWU+=$&H@r6x|MC8V__z0O#J{|MA^z$86Y&r4ABewu ze@Fby`y1k~-d_=a@&1DNv-fAjpS(XI{^5x@6-kNBPUJH&6j-y(kF z{RXkzTaH-fEki8zmLgvBUPHXI}XA z?>irYarJf>Z~dBMuA`a#2m22DEl6O2s_R}F6&<{J7N>cVfW^)LrO2N(--9OeM< z>pE(GX{3dv>trv9d>aOT)HxHwFZ%g~@E3{fU@SWrja&IL zF|ky>x`S6V@D>PA{!lV9-j({^?+jvd5Jaw)x~tI+oz?5;l#Ic0bKKz48lI|$wN z*(ewiOX(F|1rQCDjDoxCOfE4Ev0vJRl7$uH$N+L=HBc{>C6uH2(G$ZQ5t+* zSH*reKO+?@ysk`P2Rj7US)EJO8@h&7r={hm<%_AoK|codwvrv3!44*}gKgMBcx5@c zOR0KC7f$;rKR+3P_5-o(Ks1wEqFueM3#a|0pC7Ta199LAA~(sU^qQ^$he6s;Ku)6l zzz}u-X_o@fuHM<*^c)G&eq5IP7Q@VlB3-iwGKzeYM ztke6ss?`NOxksg5CDspgU}^={wiS_**m|B5#IVna& z*7rtaegAZ}KauTk1FRwIa#9R9K{)GQ`uUy+tnZ6u`=XiL66!rBG$TfYw!Ry366^bhuzkq76o7R#J;u$73bMXSsbsKynQWh)m&*AtWLvN7@&s*t zr_330dFssebq}tRbeaq!LQ~%%)hdy`uLDynkS-_0h)DYOh@|hE&h{m;eQkg=B%Nl; zh(P)_Ki?XG^u4icZ#0uzB0ZfdEu8eNe*T4>?Tur5ag$uyop`y)V6drgft*D8-XUx+ zk}d@xUCxXFRNhnxlD=7~WU#%NY_Gm;X&U9M;)VsJZ<0Bc8&+qwH!ZkI%6&>HtetO^ zN|h+z+kvSSD8Ci-B2xZEM9TM0XL}Rb-ZnrPP@Y`cwW?J?B0l%?Pb3lT*`Cg94-nA_ z1@K4fQdK2L#Aiyy%k~Ji2ORD?E1N2}K6qk&Ds$$Bd|%j}R>2iK(mIhv;SP77NdK4r z&EalOKei`^?MYyJ$l1sh>)MvK zR|bZ87kwym<|^-^rfhf1;0pG&tIoa;{)>IP`?1|IYF2Q!`L@8JHg*D1|Wlnr(liyKOwyRBW1rxp1nfT6sF>zNv zwkwA1N?^Ol#I{w-8#M84KYxo%+}WA!L=&X|CZ<$X37WV;sd(8=!FK9+X|gi0^0xtK zqw8f(`GgEwxU)4=D_Gd3It$F2MLg*!U49cZBx zz(P4EN5sd`8%o8?b_liuDpAhOAwL7cDsi36iIqqW6HVEUHo+B4q^UU~IKICAUrgN5 zkL`$II}+FqGEvUkQK`H^6JPW5HDu!U&TKoHC6a*UFr-5`z|QZ_U&S7ShBW5iDHuUo70-k8O`(+Y{J!vQSRzQK`5=3t#c`m&n3x zo!K_DPzqq7oZX|6O3=cWm5P^b6Koq)VuG?TtP)qtoE3g6G-cb`1XnPzG3dd^L-@n= zrT=2$wtj3|4BM8#wvmZ)CXh|NpQ5|Nr{`|3CKs9}&mo`!sPx97Q}N4kPXt2NfPb+$;7W?h<M&d{^N+3g1S2Q><6`7UDYb2I6btGld^0+@SDHh3gc)j<{C5inv;= zRk%jsD+*smTqRyYTp?B|d{N;_#4*ZGVvO>W7^D0o#wb6DG0IP3gz}FVq5LC8DF29I z$}eJ&@{1Ux{2~S^zlcG~FJh4Li^x*`5dD-tL_g&Z(NFn9^i%#2{ggjMALR#;uKXa< zl^;a9@`FfMeh}%(52Bm$f9Rt8AG#?2hc3$hp^Nf==%V}|I;noCRMjt)s`{l;RliiK z>X%AY{Zd@@N3~J?QEgOzR2$VF)kgJ4wNd?1tyDi$lIn*_QvFa#svjyz^+P48eyFCZ z|0!PeKgFy5r+C%>6tDW9;#L1sL)Gt8SM@v9RsBwNRlieR)$deS^*hC?{-$Wv-xRI- zo1#^JQ?%-DidOwiHB>*7L-jK`R6mnL^)oqCKa)fCGufzrNf?!1iBb8L7?od%QTde^ zm0yXT{7Lu?@+SeLev2FAPXhbcZ^3UUf0DnIAIWdZkK{MyNAjEUBl%7Fk^H9oNPbcN zBiEJx$aUpEa$Wh4Tvz@h*OmXscgk<1RQZjRD!-9ZL{WgtdzD|v9_0_RUHOA-SN&n05b>-i&M)`HDQGOk3lwZe7%AeyU<-x5!iNzb5DzL`f_T4pKw&ZBBC%NEeTWOiy@&y^0P!wykHWhV{o*c#cPhLC zah{luI7iG=I2W-<%to9kiWJU5oGxY{PE&r9)0E%jH03urMfpokR(_Is%1<&+`AOy} zKgm4hCz+@GB*&3|B+plVE#s9xOOEnq$x;3+Im(}9jPhd{qx@J#DLA)l z{8Q4Ee@eRYPid|E3|cEcgILv%AFKNDYpeeInySCPrs}VEtA2X7>Zf<8{&|P$pSLJK z0*mq^uqZzQi}E9|C_e&=@*}V)KLU&L8?Y#U0gLh%uqgiki}DAssQ!P8>i@T>{(lSg z|9k(X{(L}9whKV~T=f2<`tko%{r7*W{`=olzx{8j-~MOSU;ne}um3^y)Bm9Q>AzR~ z^X01Fzg+e6m#cpLa@CJtuKMrGRsVgt>c1~n{r6v~{`hmMzx|x*Z$GX2*-xu}_7kdq z{e<@<+H=%!;S2t&c!N{Tyo_tJm7ZTE}w3^0nm@#LWK~V&#`WjQj}@ z8^1He#IJ2}Saje=|DE|Oh=qT^yxsh%`EBr_Ujb3@mw*TT9P?E0S?F)>Vs2)Rfq3`d znogRwnKqc7H!U{J03U{4rnaW~CX4YW<7MMX<9_2d<44BVjZYgNG|o1THD(+87`sA* z`XpnV(PsDsJl*#g-Z#8xcnBiF=RySdb`bg9ssCAjTEAKUs{RT60{t}o2z?LmerTnS zhvr_UI{{G;-qqgJ4rv=98p1ug+jQx=mbzNn-`ZF1YZZMUYUms5GYg9*Pnh3rYT@`P zFtj-=rFmFNqdNLFN-KM2Zo#bF@p2|uR#LN?bVua$rJq)lzB*3tRp%dElv^}=R`*G{ z1rzi0*n*!tFs&q&H*@y1?u7*fFbg|eJD8*EAOA~+#0R7G&D0st;_S)OyZ#eqp|xtt z(vQPZR@Kp`s57O>X{1#lyZ+fg-$j)^EiZ3o{;XNu3Ja$MO?V*Hu8&h{TKY|y{aZo) zIa;46Pm!NBRlb$XpI5{lz7`?vYJ{{)5z;nBNc$pIpMuxuQ80ey{OOX#){~}BXAj?~ z?!cky4&+yJ;K7x(^v$YVgFVtcQewwQiOG=?qar1`V)U&fsrl*oXiVYE{<+hmqJvpg zs%)f>42zUFG*aS#NQrGDB{q(f81K^8N8^dscPj6Wx9MZ>D0}$aP4VPS@yJc_lbhnl z%21eeIe*sJiTMTjvnJ1q`My$W{#3Xr^7CS@JN5M?DVVp8u7QQK;ndDK`Hm~kW>_ua=s2qV=siHZ6WE6pmf{wL21-aL22mJpp+dtOZJvf z+7ltk6_f^U3QAd%LQ;BAGCmlkZ>-DAp9|BX_k_8wi-vwqmdzaoqrK(q;XNl$&7T+_ zAu<0#q(o|6`IXf3Mn%Xu>WxT=?II+Om=GZ`>kXT}jx2cgyopP0irr)NUQC@^n2|px ze`=qi{F%AX>~mLFci>sP*Wf&pr{&LVn^JMl*%0quInO!}5j<7)Ol-pWa|g@W-hD1yrwI*_MO2p(5Im)O(xdnNJ)6&L|hmSNY%c<%Pq*ZeuZ+JBa zM!i2wP)nosvCjBRuzM(u* z|NLn^3g(PhT6uSg+NGyp{@KdA`IUC_?y9sqYG38u;gxnr+^g=Ej6p-XgELS5xTmWm zj9eWBU-Y14{qpB$6&6lq#Yd_n+}BsB1dYtqS4qhEy=nrS18>rxO3sd|37=L?NT`x< z+s9QCUa68W`k5*TBX3km7;>O$!aG$GvYS^)82m?-gn=(tNf=PI90Pn+a>O-K4XO`( z;hI^H8@j0nY^?4;s(K>y$s6}nNF4b=O?{$lHS!jLFRA15XAZkl-QhiE&Mcf6q<8Fl zky1xnf~nJ{7tIgleK%6-XtTOhdbeQ4th>XLW~#EKcgr<~!~t7xiq87_F0#b%eR_Ou zQGP*gQH8r>*wFv!=+HTFdLeb;%XHy1Fd4YZDx5lb{QTTst2;94Yl}Ww>I``TzjNfz z1||3U3i54q$)dT1GpF>)lM~o?FPt_F9zPkA3-V2U|Hq@L^cW}I^ua|l!4~5WbcbUi zRsyBBD2<%n{GV#l|DwkUo~OkJ6?ZyT+;LRcX}-4NPJ;?NrY=;e6M^%=lP3c0vuEZH zzKg!)wSSQ4f*0#?QkKRgiMO4N5tIpft8!P#SeMD2?13l=_#3q~js! z>5xQUEa1!;_F!7Se}YomWcb;bmTEK@#1Va`sXnN+RdM(Jf|I|bKSUCX2g5%|e8uId^ulB65ukOJu~i9!B? z&hckwu(OHmYzjLIA^-Bblu2JAI7OJlut@ZarV)Hs&&0Ab(M)d9ceRYXhr-7sh^BrK zZ)a!X*csd;mxVbEDHj#d1ae9jm4WQc5OxM!RI*VpB$g@fp)lW7k)TvE*qKarM&GVX z`U^=W5RZ!B|$oN$o&GrgEvCG*NRD4h95QnM2CXF4&p0`t;AC?fOm)i8f%20N3; z&ZMw2#60;8MPT0J7Y!pYe>#?(j%IR8%u5F%C_swQR>S=1>FjhOJDtK#6Z3JzTzH$0^NZLB%%6&7r=pqM67#Xu zF(2y}(ROw!j-A3ya#gq=d>r2x#=uBxKkvP5mAlEF@8vQzrh zvKY!)g+I+LVq{L)=Hq%SrdCOOt%!-~hWHggoBA#MwMriUiV6rMZI~m7L;wHIF#@USI z@h74nClP;g2s??yO96 zlUt(QM%5Pnq_M%2Uv_ppjvdEMa+$R{+O3e2Xg@xL9Y@-w0JK}Gss!7+MX6-4_D6<#%Ssy9ZZEyGf~qJ!VW&tpe>S?0ARZI;%^W5%kmu1)Xe6YP4O9 zFiP47SN&i;&hBT&6WQ@Lz#1IuQf9#GMqu3lQ=>&-{a7qJ7R}_AScg{xk)Q8+m^aPN zj>WNKxJfS4k%i$;86D&#){hNg$B=a?0P9*+l_2YyQpsS)GTAY`w~SHFDv?OxDZ^yW z;8=mq>{z$p3Z$3bqqM4$&i|EKl}JC>+3?rTY1v!cI zqeIwHBwY$H6vtmxMUl?`R4N(lXeK)fLoDZ0&ag*2|3l`)4^?vS@63+&2(FU%c@Y(1 zSitX6u@dh`J217vaGbfIr+Al5J=ECwZxMMvI)fceWJlWoZAkkZyle#8e}zf3u*>iVJO4?k zWUwQd>A=(qtjk!J z5m~<;k@X`p*pWnbqz$l!tjn;MaDuS!G5mW!|1JXShhy2{XePJBx(a(4&iZ$LUTSBD zAhcnq>XzVvbTw=>p zZ4X#4mpQSq(=dq6>~N3ZDrvu6Rae+Urc5eUqWy3OrdFVRa&@$qMx_1l40bq?9c}}( zA?=f@qy3tnUyVTfp;&e(n#nEEK9TgpX}{{{m+b6N96N-Y=4o}1)x2@s!EXdua!y$JCw-|L1WLOoZ*fAE16R^_8{wr(wSN%>*JMP80(j%UM1EK zbzo`**2jTf#KwLpBI}1{utSOLP#a(kSeI7xg0I!?WA2yS^W7bwkAI_Uv1_!ene$)g z7tXt#Js|?XMaP?tMUHfb-oD5FsC^=Yaj@BT+a9nDwAF^5_>Zhhtplu1%TdeomRS(L zuD1CY^sA3HH#YrY+HQId`p;d)QxG%mF6bpU!My2f3`K^%@cVz4{!#r%eKO1ea9H=4 zuA5G;eGZc+q-%AdIR8H^UCQX`5q=ws8GbQ6LVNlrmi-gWwPEc^O!tdv zcJ@yk`v*5&%IJY%ty8(`v=~tcIc)_v5kTl6*O=W%W;a^mR#z}b;aKMDS(BKU%bj z-H2f~Wcc3BW$KYqrTEquG1V`oR4smU_DehVix;=D^qFPyIRj-7Fe5_cGE51MM}bQZ zm{6e{@bwwqpylUzfD{=c{TKFE4ErUC{UV2?bSb0fPlSrQ-7h9bsJN@K>}oWVTdFwu z9Ewyk&aTF>tGG!nqeo8o^H)rQobo}C!LDYptMDKgfC7BOqo+&-74;wx6O~FY zcC`{(R4coRaoF>`H%j1!&Je0cg*usuH9%Pax42CzRUkcuUFi^9XLT+c1A37jzG6(ohwqiy z>`EfL(grAlhi`J(=&Du)i5Tq{BP0=C_H{e;F{a7OvdDp&y%XNn}`v?dl|}I?d&FB-_E{{VP7Y(ujxjn zxE&E%)NsET7NJF5j%AmlncPx~q97g-p1{NWVvwC(j$@Z`lU$~Pc!YhTi=mK{KG81^ zVVCg}T?){mRQ!&cDnTNLD3uI$Ig?$67eX>(NB9dh_^FmHa|VAP+{%~XNAl%Fb~%Mzrh9oH7C8d*1N|Z^ z0`r$**`;VEx5RuF>4$&zW%)%vJG&IeF5xD*YygpSlg3~Z9soIs`Ab9CC1hR-zQm+#6mpU=E0`dJo zFCy{%sv-Uo{7}A>$S$R@OGJEMymAEM`}#$n2*h8EWf!BF+!FD9NI#tTK7NsIXBXqx zMcgEp^(Gs`iSG?LiTH~{*hM5>3P60XswzR^dnuI+b}^G()VD9|Njby2Tzbl!H-9K2 z_ZNFJwMy=LDAh3Tdq~wv++Xa()C!+p>7b{$hr12_uy8C!q*ufJ#To2kBDIJG&6aF5o7)ER9SIr#=mG67?5`unS1N z6o7hPRh1z1KBbbuE@ZL`@Z$eg${F6}a;wZ4`mv16U+BfuDw*%9G{czhDm5!Hf1wjo zD=^;$^dd6fr5ffh%wQK1*@YB#ftc@%7mmPuXTRtaf%)^X?0htnTVlQw>4!7l$uCmv z?0g(MkDKJO>cV%3j*yd>KR<+>N9Lsf%vTq_Lv&Co8SH!}I}eRM7``K{pRv8ndGiM| zQh&ZTQ>&z22Js00h=5oB?WAfY>d$v#Y6a?LxQ>X_r&dG#`5EkdB0HbL&J*<%ydwhj z!Y_CP>d(cpbJ0w0iFyj@5#b}2`$Zc&I~NCiv2v4KCWClHeD&{zoJ9S(A?zGdF9o1J zEK*0X(YIA98SGppI|q$EMe!Hb+m#}7hJG|7^XGaowMyobt7AS{YF1+YTqmYhV7^Ut z%(tnA`ExVaxkPp@g`FejTjPZzFyGoQT18;~Y%Dt)&E%GtZ${_b%71N_!=-~5|KB;k0>6R-&h5@m zoo_>Y{}s;1ol9WEz#QjP=QxP%pXp3@c7(|OO`Y|eHJuj64ad)pGKlJb%<-jTGsKR6 z)Ap>v^*6QDv(&U$%s0$Go68_d z|1tBI=FJeJ|4s91^D_{kf3f*a^Gt}(f15em+!vzrH!>Schae9B=cac}ubCb)WtmgW zEg@FF3%n(+o35D7KxFWk_m4Qi46Txsq(D%|cRANJl044T#v!RuNQx)v7JI5kNw(C6A*n$~svnZ-kyP86S~n!cg{0V!REMM}dunYZ z*-~RdQmv2_9g=E>q#7hSoT=`R}I2Dpkl61@|j+1o6E{-Y5CXSMH$R!Sw z^o3my#V&Rz z$tJdkq-`N-D@mZcg``b3u{o5sNl6y5k)+R@;&YN-vy0D2`ot+dCFujZ_(VxI@o`A{ zC?tJI(rae%0ZH#U#rq^}u#5MUWE1a(q<2En+a!VR29n;iiS;4rteyBFeEJ@>3+L-KuI=HOwuBoSR9h>BWa;c+)GlxCKix%ms8vm zlI|wSZx?qd$tLa$Nq3Mm&nf1UG{-LHDaj`0l2qgrvq_q17ez|4iCH8~cZwM#O|y&X zO0tQJ*72#oI+wCD}xikdzRT8i%AtBsFvj4@q_HFc+-+1_1tS zqCrTaPd}MfFO+r*NwH25M^dz1#45=q>Y$WrvZdNXk}V`zLy{#VnMu++Q;i|XfRgyv zo~l=pEmaqiw2;I|`pYS9grt8$(%&TgY8QVg$tL~`Nq>Z--$T-GB>m(Rzl5ZpN&3z% zeo~T6{1}pc2uasN()T2lJH@vl=^K)+*hRULY@#eAm4>8iA?Yefm!0D4kn|Nv=j`IL zl5FBqNV*u3E`+4>B%N`Jvm~9ci!(~HiPI!S+eGb<6cdtakyOJeYLeuziyBI@iKvj| z4oR+%i-Oi~UfNun+b|58c z2U4PTASG%C;LO0O_Q5TIe@AC2wQ*_((ACeW9Y~4Vft08nK#x49+K0Y%PPGr+)cgvb zCDmk4b7$VJ zAxZDp`1>L0y^!>-d@azEeZpYAzq{Sp?piQ+-&3w>F5&#e`HAxZ=U8V$#}$~dZHZ&3 zBia75eV_exdm)U^x7+r>ukJCn2G)z#)z z$!}50?wiuQe#u{4a|J8q?e^5V6Ur+ayZkcY9u8a03c>X`BP0?;;|3YE@ z+mcpJFWsQWlinBKd}I89U%Y0vnTLe+c^b9%jM|4b?fqKX`}h{8T)u#VS8!pzKH`19 zcrWZNj!Ro#Pg`FHxAHAcvvT$R%~@p@c&B*JFE-eX+WPw1dfFzH)4Mk9=6jsrOPO~e zugwTAauT!+O|=dBq;h)M79s09!K@9n4e{CrU1~YKWYfa?i{Hkq72bf=(l*o!uCsjQ z^v+G+FpRzpl0MC59vtlJQ+@+rhf#aSrfsOHZIJz!N#*qNEkZHZ`^B4RQIfWlT7CYDQQ?v-B@DjND$RCXsYYU_;J zn>Dp{@!C4s4=Kv&Rht%Fr_vd%(c%riSZ6a9^eN~gd*YqiYc;jkqHtRBZt*&(TI_T| zqqf$nt+n74&%9wSKW0+VAuAwdZM@Ql40~3WHsJYalPyc2jLdb8Q8@h-`)e zG~}jLb%JgFm7q?%wxY4N0vd7?${OB~U&gEz8ggxIMT6ivE3G^M6(c+cR{O<6)jS8l zs26S8idxzVdJZ(kb3}L!yyO?FBJlWBJ?*JFn%okPjYvP7$5no@0(g9?zV;MtQ_AHK zmrA!nkjEDxuX+wFPtukHkBOQTfJYkDQuX%HoML5Ar=hkyURw@4(g2nS4}=#mYXu%_ zY0K*cS9l=Mc$NqcgcXv%XR(0);mNSfs6A0rTNbY^lTU`U zayjNjr|F}sJZqxGGwO`_1$pBkVo8x_{G{BOp61}KWYkJpY9%$al4z|2j&>}kVJ|wE zWm=vK{;>QkT0AY!p)<=<+*Drb(U#h^rA}=rq^FnDm=}GWDg}rU%T)o!<-_Rbup&H? ztUXdgdn87CL>})_UI*>a)u~d381WR9fzEQX6b~n858Jhe-P*(QNW1dds4u6Vu4sc6 zEuQp?$16-W9IM^$(e7`6TRGuy+wvIFtm4NGJzr0trkZfrt=%6JT#K5O*CM6xyXA4e zSO#~?{qfrUv`s6I#=IKLzFe_raDm4lugy4TR#9HZj&mT0M&ZoP*)6lvrgnu#d8}64 zGPus^R9+L$p>G)WAYUfw@!8DXdrr+QO3y9ImGujke#oU2*Vc;1Pneq9rMw1}Ag=Pf z1>oNIs9!9#8K*-<_9?*6NN67owZ+Y~#Z7RllZU#NN0EO0%KG46S3>$&IXBPX))v>( z7RTUrIvnd*?#2`7!i&F@YPVA97vH8WHfoEV+G1Jyj^!@8dQ9c3!-v=-plq?rA_kkM zQCsBJ7TL8$E^U!a?_BPTXgVlAOv;tol~KF5hIX%AyEjU^R~Ec&xdYTKR;^*!C)z`P z{mnuLv{hy;;MM}Nz^UbSyr!kf=K#3dJm?n>IQtaMhoZsAR*!azHYFjr>fk1@kz)9F zxg}C@FnnLjopw{(rcH^}rbOdbKEo5st)w5`Blmz`+;7*WG=XoZa?`Hdf;l5NY!*XK z+vEz5SeG`njyAP6ZYR&`P;LfI==%n{1-gR9e%^^1k-3Mu6} zx`Zvs7x+a$o!MJ1$IVzYt$x^<190Y^ z8EM(+Y1wJo{DInht2RGMn-5K@D7B2n%|vKZ_drm?%57?7f~HnzQ)P1C3|uh0P2DXO z!`sxzSZ!pqCb!t8%GAJ_@HTaqU-<3X$R^rI+_Wj9Au?7sePRYbMxfc>2{~=>g;8su zjq(InT|v9DJE$tc-G=Xw8Wr7!Yigrz(MHw9Z6SEr$`Lcl?V$2EO@GL3n3|#b<`0FO zY|=(WX``gauqdN(G*#(@XYzc%m{*Zbo7O)%xK2(iqhT}=ybb30#T>iVzn0b?H?7O& zl5JJkfGf;}oXAEKEi*B=7W65bLngHd^Fp2@`}5^b2J}KEv*0^lMF(WK>hKsXv$2*b zzZG;Tn~fKbQ0cS%q9{V8$HZze(VE;+r5BNYc%>Kl#Z0>v^Z&5-9#B$LUEgn4b?)i_ z3=BgC0SO{W>NGhgCFdN5p5zX*Uy_un@K^ z(~(rwQtN7|*Wf&>u*V+-P!pQ)y1G|(Bn4JS5(MOAHw_o8KE8!@OR0jDAMIx7Bwq z{QAGad(OMTJKsA5y#M!k7I=nw>bTFlw?jm|p00DQPh5|<@?6c}t@TFdTxSdT{r{C? zy_+5wo*IMPCGF` zJ0VXPQOqYy;wAfR)I1&N5^Jec?RYI~g3&w0e5PDc5%%eftXQUrkEdunK@-z?lcb4H zN6kMC?RahNIL_J@%kxAwG2A|uZQ@g~B{#9!KfDpTHmV(m);{iNS3H9%%hrxNvZjSmUcXXb8hQAsv1gY>*KQO)!VvSezhylO1MsyM$O_tw^&tS1q1S^%Hy5;;8w%p&hHQ9m84k;%T^L690lfU`sh* zYO;1LQ#%GfLZ_l|G$>WPjHN@Owf*{Ysc)pirHr*rCnK@NHLGfE#a%;DL5&; zFe_sMEI~k<_TA)Z*j+m|Ry#Ht=Q^wi7qcr#V&{JZ|7P4>WNYnM7wuSQoM#nwES9b% zeEp8IOSmonUAF76gy){xv1!_|CfYHf9RpjBh+=XwNz#bFMa^HzHsaBG8c(tjrI!i( z?Zig>RaP95aF2a7O*@*R$vNyY++(woNn#`Z5;YGQ+R^&jQJgg|CU=s!7O@^B{0v*l zM$FWXW@|^G5vQYoMoho5-K|FaiK}F2MrE4zva5D< zqIPsV&Z#Nc=_Ii!f0UmWe=8=mqn)&)9dVvl*uGeLo&? zL_69Fjwf`}X0dcYfe%RRK!1pu-^VwkPdk!gO&JY}$5Oq-cKAMO9yGKg6}2NcYhFC& z%7bdP!*{TyY=_a>k@1@Jks61>-k^B&l~t^E_?D{-(~gYLj_7@hN70s7v;+KJ`Ip@C zziWq9+L6K9k%2geZTl3DgpY%RndrW9Fj;@6x_!Lj>e`Ws+L5~2k(SyK+0&WDBk;>5 zIkpF)<~L>Ua(_tCc*<%}Je=w!9@}rC=2wRHLq+WeoHZ{VM!SE-Q)0OMeGOa6yIklu zDr<+TT2pSf;-R#QbsEr(yY;lGk_qW!rN>`-KHcK-^Wye5c9g#)e=xN}e(g{t?at)y)&k8}AGutD+QtL@(xQFFVY zZB5m-;;cpSAlx$U(Vk^HpGVEl_;KKYCYlUfah)awJPsUqWgWWB37Gq>I(4-J^|b>7 ziU;79NgfA&2H(T2{RfW&4>+}ND`*GmXa{7AcPQ>pdzRR{eHu0QCG>7V?X&9IXO(d- zd$&f#{iuH8bFF<*b1yvC`mBcb8O>W1_q}pItz+{EY|Br9_czpJR^tYm6z~+d&y{to z6YFEEPAzSJ9c@261-^+kP3#yx!cF5YE)})?)vXDh0+ReSJ8*VT5zVU%7e@T@-ZFz&`p;|^o0w!5Y^ z!INe3MoIEgVwXIO$zM*wPVMt)yDMtD{F?pnDRmwgbhO_j&sJYYUgo6cl7kIlt zQg#<9+Rpmg&e}Mar5%gA;4bJ55*~i;l;1>mYKL6a=R@({l^4d;$zIQ7o z-<2!B2Hb7zfDiB(Nxz0u+n%Ovub^$OtZkPYgo~wL3%uQGknk*UJG|X0`yIAw-?_DI zDcUyq_swGRYe~`%zZ*5*DccXPP0@IQeoFeaz~4;lhu?vBaE7+FqP7-i9g5r2mWk*6 zwy3!^iNS8Hu5GNW$vNyBocHalzXX2||3`ze108#Ob+k=&wM}5Bt!dLlJKchtma)@KH8q|JeMU8{6%4C3${TLq zCEsb^G2f5Aui@?fPTywV%f4rPk3i)8CBC`78NR9Ti+_mkMqekN>ATKX$5+`G@Y%ip z_8#~C=Kaq5x%WfwJKi_EFL-ooX z)>G{H$#Vdn8SL`B<$2Y!*0UN$*Wcy2Ep*mD$rJVDL*)Lkp242po{pYYp2nWqi4pvb zV&iAyePf&P20WGc)Of*o(s008S?eFWF3;FP-K-7Z4uHLSWu2!zbuG+3tm*1s3FF5~n z{tB@S_B%gtZgalwT<3foM&2)V&U4OiPH~QL4uVk*9Uv1xBWEpVB_}kyX`2+bYwXuz}Wc#j$sfHu?u7hxZY9MQN&HgTsMIZz62n>Ks0_`9+d;6gm*v7upqiEA(pU+0bL5dqYb@^FxK9tk8teuuz{+mryu# zeW-4zN+<-+el7-229E@P2!0vd8{8h;7<@7K6pRPCJ9ukwPB7PK>VFloGqed#4vr2E z0Iz{Z{44yo`fK|u`F+MekPV_;utl&zutqQ?=!NJJX9LB7p8^L0`vSYbm*BdhY;kA1JjO zRnhFM8h2T$$_!EkbK3l@)RRhK+|MZx{JTw|DjTNMU{>ia{*=rDttXX%>Sih1IZ}~A zS1PK)Ik{D~DOF3Us!El!RN8l>X6B@HWtGt=l@8X-Nw!<-kt`~(EnY?Iiwfpns}x2O zodR9jT#Q00)$B^v+UE0FrFZ^@)Qp)a%ao!$E`+jtRW_VdetOsON{u3wS5TYUt1vs# z&_-p`vqFz4HHcJJ?)(x~Q(gQGvZlHw(2iuzv@Px*lT~QT%)Ba_NJR>|^tM#zt*mkz z@ph5i8eEo9P}4_iGYYCwD;8#?r!3*J^pwd;4J4JG+u=u41^HQysjMQSZ0b_*g|HI`dt)zo%X$o>iIB%qpw!hf-t@u(rZzRc5!8hb*HYGC3ue%OAOg^#adfC%Tm?pRDiYB z=;Y5Yh*Y8Pl3$SSc!jphySWE-Uio>270G%*mBai5Q=~df+hyf8YUPFyz*F)&L+(<^ zG{}J_Sq^e1A@|{d%bOLkEiS-HkN~3@_2HmulL6-y6tu2GYe7*TnOBgrfQ%Z{{N}ti zXL?ObO`#otwUIZhvPeryWzaPN){eQ;DjPM*QvI*9RM&J%b-Ab%9T2G7Wuq#apcEMZ ztnGZ>Dr-k46O^^1(^RU7YAyAKvaF9PBU_baLY0|Hsr_izM3t%U+^&%-vyNI$yV|Nu z9ly38TV-wcDD}Ql>Zr9PqlNF%md;J7$SkE=s%k8>l)tH^47!rScHUR5G6*UyujR6g z%vY+1R2g-6Q0Ad40w}jS1}>`=rZ@eQYeYs^?G_n6kIOQKbW@6YpuB>N0Yj~_>aQ9R zn+H<1T#x1lS3=ueXHi1>72C3RN#=umJtkkEZSy0xrQgKl=l-{C&8J4DO~@M}KONOz z8B`tAtQ)Cl!kj#8;;E4dv-7-gCpTqAOL*|El+98rE_>|dVXbY&F-sh^#P4dOca+*@ zt=w#hP58}bw47jD@gjZoLioNLWAcrdd@UwlMR{|2k!|Ucn7j>TQC5y^X%uBaWSVVh zA<9Cy<5(I%nV&w#cKcx}g`2k9e^lGvPM3t4@Ew+H$5NE<#3Wq?vGgq}g`>X21vi1k zQ`2*DD&LGpa6(~LH*EN+psxLj$_nyZyg({HJ#vf79@3{4E<+UDNtj6(hZxqK&;`+Z z7hxfy#|p$X8H5RhQHZpfh|22-bd`V?<>TI#e|*Z#S^4b`DMcN)EW2No(X|lDsyMB( zv;(9vvl^ARR73uh%&dkBRGAkQyj#3}6RGsBykGo1mm(zDzDWtFu*uhff5t+P~> z=PVThJCyg+(P*Q(mTJ(LRME`tH(5%j^KE9)O#NBaYPV3w0j<_>4sBQ%X+V}I&!5}q zvIFvlakM%&W6C#5QJ*;z$~IVKkx!N4kIv1AP|pk7MaEleC)2G6luf3dNUD`;?QErH zT57^mmKu-e=M<Mx|C9vajLwMWD0+5}~TE?ISZ4!2Yn z>f>N-E5j;l*;Xm)zhP|)_1CV?wbs_!YpJvpOI7^9QUSWsK;6I?RYtwLEUS#IBu~lP z9+m$8E1WfLp?`-?!LP+%Lq9+yz|TT^ARoZnp*KP=!EeSVLJx=Tf$RW_LvtY(Ku%~1 z{Bj%#xdLtqbqlo*nGg}6L8vzTeyk8OLXP02;JM&&hzsyj@LTv5`AP8o;Jd-i!41I| zAUeQf!3W^Cp`a(I1^x=04wM9b z3mk%9koyCB1Mh)9!kdAY1J4DX46F*=3sD1Z4a^J74CDr;1||kZ1qKKDK&^0)V__fPK;?_ux1ykB@f_U?wKA)DZWw$A&M_fhZt-n+a@ybIu&NWM4A zJIOo7JJj3H+tb_0+ZvvXH1^i@R`*u&2EA^t>>1DR@5etLF#LH;~J4k7p<3GknAI z667>|!t*fXHN3;K7;+mHd2-+>$pnZ*FvxS0ryJxsG(Alr*I{i>6^KV*cpUCa?sM+r z?xXIXAm`zi5S8G4_q*=R?hWo2+)uk7g9wdxLu`VD?%D1c?rH7}h}SsG-QV2{A{4Z7 zw{&0UuIH}dPIZUe9>|CI7d$U1asB2x1Cw*MqT^(G))eIsR)NxgHrNHwOr}MJ&yz_+f7(_1k&iR#dA3R0b z?%d*h&AHzBjB~Z~LFWp1ma@n>$64T+5jc+J1w{|w}&co3dLEcGw)&w=;_(;-vEIPg{(;P3740y!&gfG7s_{WblS z{pI{#ziwOvFP2h>W$+_BH~QT8$k+wXkTx2x7|%mQgGY?}j603njQPeac-D|(m_=9cLV+j^7|H}pYN&6r6U+mx8zqWr0Pj`0M--2ie zFWT4IAGbebv$^b=9u)@(2MFH~z9xJ{_>%Ai;d8=%!e@j}3Hu125I!b+MA%E%L->&J z0pWeZZUS5qQZu$}NO;T^&@!dAlDgtrJ=2%8C;2pb7+65b%ZPI!&5f$%Ef z6~fDemk2Ks))QVJz~xzf`R57G5uPQiB|JlTn(!1MLYPc|8vyw!lL+aAi3GSSkn6@1 z;HE+@jU|jBj3&U1gIqU~FoH0gFpMyiFoZCeFo-aaFo4jX(2vlU(1&mn;YLDlLN7v3 zLJvZBLN`KJ0^AD8@7bBqiO`YIfzY1Nj?k9ShR~W2CJ2H_Xhpbz(2~%C(45eW(3EgJ zp$XwSLSsTBLPJ6W!nK6@gnER!glh0m3(guL)lfz9f7>_?)nx@EPG#!al+$gpUay5%v=H5I!V) zKzN_9o3M-U9$_b82VpzmUBWwrZG^3aw+U|%wh%TGHW4-w-Xy$1c%ASXVFTe+!YhQA z2`>>|B&;XAKv+k3p70#uS;AVvGlZuJPZ8D-o+La$c$~1B@EGAy!Xt!Lgoggw}*GK@dzrE5Z$gmV_3B=7eU1 zriAMWO$gT!8WS238WI{1t|inb)Fad-Ttlcss7YG{UzJ~VWhvo|4+pF`@b5Ou7Ob<#yGfq7kwvuzxlrPeFpIZ-}1czBOF%w z?)EMA-3-6*(;<3bA75t}-_RI-*;n*=y_dbGA$H&o@QeOK?>6si-silJdGCQ=@=TOkqk4~{{v?{{~by(J2l{HYRzEamHRavQ^ zr6xS26h5q!pEn+!)6;huj}LUQ>^oKVnWe_Qr_{SjJ*X5u)Rc9{)>CDvmKqaN_<&Gu zH~JrI?Pz>ti)9y7*;%DdDpjo1_exb%s+^@psZSZD>W;$K_VRCxQu{kf?e8djye-#` zz(>5O3a!r@{)1BZVo9zYzF3t-mActd!wxI;jZ&X0wNEL0w<$kw*qf^CB})xmpcKA@ zliLl&S4UC}`p8;4=tZUQaXGHVhwiBG!Lw8Y@liD@d|-YkixjwaO;@*09R@sN>gXrz%tDV4nx9vRQ5l+_Q>R)&pNF%5Ts` zwMS=V&z(K#i5J@Yr%F<>im2Ih1?x_kQsSm5NL6)lYhf>Fs;BMU0_RAoJsVp}MPq^R#)?!2|O+&QJ#0tzAywpvhp7JzC`+hs>mza^D5xe~sx z$;$`DJprgWYV9ngM$n;@m!)zs8B%h^#hAPhlQ;$hFJUV(Vx<$6y!(ujcYPO=U&rK! zF^R8f@x$(VIac~`OwNnRSuvTVbHe57Cw_rRdI4+F)v3<`%H$hMo)S=D9BgtB(3O#O{H+$X|X z?rlLeQ`>RB3uW9pg5q-=6u!R2zg9=psHs#nrTDHTQZSp(Vo*n|wX=U$iqB$L%jYhr ze_3mDzfkIVrPeCNJ$0lYcfKl{YpEQ*9z_ar)E?zDR%;t7rS>g{uQO1is#=RL(dGW; z*j1UPlxo53%T`(T-%9Gqv z_p?%ml{%yp_m+`@X&tSyX{x2CsiQGX9fN7*t?jZdDW&!;>!d3CQ7QE|vQ%4U@pT$J z&E8epZB=TsQqL*HcP&tZ?}tE*R%SrH-`S(eGJhqtv-DVmp+nzGx*5vyt1{R_4V@BQZHCCizA| zZrdYP+Eu>)k2nt6LKi|OLPtY~Ap^jEc>BKt;sI_5tqZLQt%7&|%R-AnvqSlzOvnQ; zGBhyMJJcC60W=Rag!lewkPE;QvO(U!6Y$pmaPVMoKg1B+5!?dr{MQB7Kt_Ojg3E%7 z;EjKNFf%wYI5Id8o)vTswhlHAHiXOoX~A;vzTXD90Zs&t1`Y=f!rT5mfgOP@fenx! zU=6(MzbCK^G6c*HH~P)J4Iz_28vOG2!2A3Qo)hrf|FGvEWE0o}zy7y)Hb6ds zHSqiY9?vq!C@>rR9Wp%=;Z6QP@ObF#X$@Hg8p3=0G*3AQNMLhcaG!v;_=nvG-TU2p z+&dt*zy|j^_Zs&q$S$x9o(9Zz=Rmaplo(^1qclJk}havaCe&-(N4tQg~0X!epI9ECEfvf|IoU@(z&P?Y-=Sb&3cw65Y zo)a{8Hgwi@romftkJIM3;5Y%#3JyCC`u9L2i7gOKa-DyTe-&gLSO)LxXZ!OZ=fFh& zNdG{1W8c}|+TYyY5PS;K;C;QvZ!<1H=7FQeVR&1=A94@uFt!*QjCJs?ewA^LvCLQm z`3LghP5ne;BxE4yZFDwTJN7&FK#qegjt!1=@LqnE;~vK{$0EmU$aRqEnCKYk7zkMj zIy+j!JNbr?mmtki&f#&`;EntV`%(L0`$5P}um|49Z?SKH>;!AUt(ZSM?cDgNiS>$>-kXY)8H;-bKD6-a&2?+mKtuR^;2_ZRA_xE#wxl1-V&lMs5EDJpT8u`H5~GkK#Yp4` zF#YTC_%nMHnfBK$^ltwh}OQ9L}E`#0|)nq9wA0Xn|}lnj@QuX2_xp{Ex}q-f8gUJ>j;MpI zEoviciCV~-q9(G2sDZ35sw1n3YRIahDzb{Gf=m->$jYKJGF7A^D~U?TilQPiMWi4r zhziK^qCB#kD2EJ*5Hcu&NEjrC1h*`tAq=EX_>f-VMS6q>2`OrjFrW+R6i%c=IFNQ> zN9saHYC=QWgiX@?$NUF**}ROrWL`r4ZT^kCXkJAAW&VZyxA|}61@i*(ym=mZ&OC=a zYo0}(G0z}Ro2QYd%u~pd=1JrU^91s^c^vtt`6sf}EJc=>CCFm482N|!2lAMC40+T% ziacT-LH=(3j{MF14f(72EAkif7v#_8&&Z$5pOA;m!^j`aACZU5L&zV@ACTXh-y^>> zze9d&evAB<`7h)_^C0qoc>wv1`3>@G^K0Z+=2yrs%`cH(m|q}2H$O-2H}@kyGe1Lq zYJQ5`XYNCOVt#`B*!&pzk@*pFuelew$J~Sb(EJejf%yUQee-?fZgV$sm$?i1p7|bf zr@0fk!`y+~4sOQM4&F82MZROcgWP6rLvA&d7 z$T!V5k#Cr9AYV6MN4{phhTLFoK)!0eihRX<1^Kf1GV&$!CFG0di^%m5)K`Ab7t9xs z>&$h?=gsGl&za95pEaMA6wiofkWY)Jkxz-IkZZ&m1;#TBhu^4%axCOaL zEJ7|63y}-N0_1!#A30CVL(Ua*kx>yv&JlBvv&C%W&EjU{EHMi?Q_Msbi6Ug7C`1;B z0^|%aL(*Jpu0=j$V*8j+o7g_)Qzo{LxyHoyF`qQCeat6JY#;M+6WhmJZDRYFkD1s$ z=A$OIkNJp+?PIPov3<;kO>7_YArsrje9*-9F&{9oea!n!Y#;MJ6WhnU*TnWQ?=i7` z%#|j#kGaCc_A&1^v3<sfq1l-fm+1m`hA- zAM-X7+sC}s#P%^4o7g_)Ehe^)xyZ!!F&CQHKIQ@w+sB-5V*8l$Ol%)>u8HkqLNr1A zK66ZLA9J>e?PK0-V*8l0Ol%)>ritxi7Ma*SW}%7gV-}d$KIROQ+9%)4$Ir_%^N_h_ zE;7f=L1vrT$m!;EZR0p&eI(9KsK#=1Z6&Gnk_ZhISyNN?-@2ga8_09o#; zxqfy%=1Oa?i=g|J@v3`-k?s>^Ird^gs1i^qG2l-41d8mufvUpY0>~ z5=s7RP{P3<5`s90j#1IZ(9XBe&f}~@359z|49zDxz?Nl$wawPfLukJ9^9T+M%~wJ} zAQD6KiS}4ug=@>v&d=1&&%n7|hUV*3Lh&EGp&QD?f6zjroveCAh++)NH$po<&6@OC z;S!1pkr+`{w3VL_A5pfCc7CXKehAL93Okj^AQ2o3tV}#V(FOuvCW{4j-nK+L-$^@v zBkX|;23A6`BRp5cj(~69Ix1QPhQ}hh-JqRoZ%vL_q9lw#Cz4bQ%ZhPf{~BoLnp=}S zU6hEcRTQ#fT-d*A+PQkxq!)E4F{xrgpblZmibE2@kDW`?&ZTH_4jz1w1|_YiexfzC zii)O&cCLeV4rk3uZon-QLqm!iV9U7BkoRckY!7SaoSjNqQjHpwAR_;)*zEs!!YB(cC2_zB7aZ`RH&)XvStIa?rQVn||v&1KbO7MQM`E3zhO zfs~*ji3K*3pAc_>!?bhbwR7Weo>kbrL?&#IQMamH5m8b!y&@VN29vZRnVqveqMhrm zog1Q^BQvBd4N0u&`lx7J)|$>X*LafFL}?n5RBR$Ema(R@^)#NOHBpj=#5hIbI$1H% zn$D(aXHzseCu@=k85sjmwo}ry>p`FE9yAn#%08uEVVZ;R*6^&ra}opfn07V~=WJJ$zafcT zT`Q|5v#Vj+*-UGac139&lGs&!`3doMb)$B6uy%G3&ZS+|yP93q`>*WkEZEiA*4o)# z+F7!zy3|UE-CNzLs9n~s&NSC}l6J*89TF>EBP*7%t26a9o}^vXp}&~eOVyDT6Yc6u znsz2dlXJ2wO7@T#xJcBFifV>-riFF}XB|r@*8^LIv@NU8sRdh>wTyY%8QW6$w}{B5 zQS)l1Q4>EvnZ^w5%pC2^Oq`=>^eBOj4y@mMMT}CoY}AlduO6dxn06-DnxuhLr_V`< zohYiy&xwznc%yb^uy$q;&LNC-Nj0d+u@lQ)`l`uGUqbA}GqyXlGo7?Ez2G>*iziW1 z75{RQj-zT+q?Wz#oo=u3Brkkbu2!*%tXSs4ce=U8lQgNct5r;s70Z~^>3SMZ(xfU= z#YB^;EGs6O)af+sbc!bDWKyYAKk>qs8WrUX?Q{q2G|rlpRKhKjT=*)%mT?!p2ei|+ z$F$RM;j2hB5-)reWsNf36I}34+wO&b%ZX@(ZA((<6J!TfCaSVX!B0?DI2UT&s-0d) zU^}cpl@sl-f~l9r6D6d13%b!oyE@NL&sI){owSd5V9OZRLa$Dua`pUZUv{N_3zTup0 zixWL0+LlLFy}E4;(N1Msle8^2*=S-P=a!!nZ(F^zQvFOD26tYFndPBk?E5_NDPdk}nO+^h# z>{l}ldld3yYA0($(04g&S0Xb-z*Qt6#J133%d(A|tDT&qoh-mPh1f39sCMF=jfS;V z(`INVr)wvt;+#Tkm&imCiI*?fHJhw@^``Bmot$V*v-%Xv%o6hE7s9E-$HD&;`md7t zkGux;iWCij7D&&AV5&({m1!sEYA1zu5@O)X0HmUL0e-2(hB7b9koR#v#jep#TxU)8 zS)zFU)hb?+72~c*soIHJ)}*J)FWbfTpe?im;==WZ_xL-(KfgD`Z~H8;GB7ld3bEN< z0-x#@#(D6QUSJG0D*8TvvGVOBzXm1p zpu%BIyjm@UXN89DZ>9Tj)}e$BSdzYB0c=^;d}ix@+pW5P9)bG?I&Mk&hWS`u8BmVy zpQ-z2;2isgo+b0}OF}eGYIkmVt&*50t7a8Nawg^F6&AH^n_f_mJ_m9W^_OA5hv@!k zx_>Ipb-7WvWG;PBV&^ayKPWDCV=vu5Q1=hOx%}-Pg_>Y|brUW;GLJ`+-~O=cOLTub z-QNRt1b+LsDVak@I@F--PK3mqsF)S(Pr*ew5^w|ExWSt2xuRq?*R6A9-Puq#zH_Li z8}+P7UU(>zL6Qs4&9Y*`g-18ibRz}lbm5UH43e71tf-h_=te7@W*ti?F+r018~0Xe9;m4v;|v?-xH2A)J4$&ZTMD{LfH_g!O6dahYQi43mn(4d#igSzoH;?sR8 z)&v(2nYkco6X!<7G(-2*)u95++Lcf~f+QD^9N4mK6X)u_Il8X^=X?Rl#=n!KeY3H) zYTpdqH(mEl#W`L;`jk*Uf-BqCTS-ipRsZYu?WX%C>b`L}ms|EJkvR*JT}Q+;*+~D* zbwu~g)qO2>Ul;g_@;XvN=?tzs?C{$xD=MbOANFdxvz|4{Q+ci^mD z$#^y8;X=LQ}}wG;2`#$j#Mz>{>xG~F=;=h(pgO2$&vO5Lt( z;IXo5!iib7nY-$a3A$q}&bgV#(B~yK^BDPg@jb859i4PXN1Q`)hmz4ylY8E>%{)43 z&+CZljwZUJ6&!2mc+HYg_=m4-WavCcLFkb9M)v98*TNHYo+GJV;_cJOs2FPK_KLb4 zXYEQT#X*wJa|CQzwv8s}_G!931Lxd%Qlf(-C*g3ct=ed)ZXc`LN8%hi&%Py``QVB+ zg3fc8toq-yQ7hd(NVoULIrW~L6(Qj+TnznBdQW?{Zm+A`Tk3Y%dv++{>k#Gs+PVk26mOV#8Vt}kVtJ{!_f~@=^8Bo5pcDai+ z$)B>6BO%FSlK!%0{PWx<+GSI_+zRKi)05c|l6HFil6QLA<+0l3+S=vD+GW}4btvge zcAeNReWRjJl6JY2rd>+WmF?17R^?x%ajhe?OFgVf zwoWfRL`hnwm#iP(S2fly-Jo4+iF4Uk$wUfC`>LMF`YP?xMD0>-?NUQHw$N9#E1{eU zNsd^LsOVbuh~1?9Jxu$%KhC))=}uoevA6Gzwbc>pr2XAX`@0*?u_tL?(v7NKam1jL z>?W%w9lxyM29vkkv zxjq`5XUJ2ahwtm z$0>!!hH;z{5XUJ2ahwtm$0-4EoDvYnDTPOdaeNXG$0q@Cd{TID7{@08aeNXG$0q@C zd=e1HCjoJMQn-H@$0Y%AToMq+C53Mc zM*`w_q;SVDjzM*`w_Bp{AQ0(O$)lEQ7n9hmKz?U1d)ZJBMDt(jq_V49NR zocK5M0`olbj5v!tA|;Naee8#_kNr^g zu^-Al_Cwjj{wI6b|6~vQpX_1(lU?k8vWxvscCr7-F7`j!#r`MT+3#dK`<-lOzmu)( zce0iJPPVe&$yW9|*~tDT8`~FGx{Y^HozsUynH`&1cCL7q_WIg+t ztY<%y_3US|p8ZVLv!BVc>}T>U`V<9_ewalb2hyzfdL@4J%6 z`!474zRP*M?{XgRyPU`SF6Z&SOL?5{QXc1fE06QNmB;zs%Hw=*<#E0Xd3^6e9^bo= z$M;5gd~cM;_eObqZ z@#L}}&ouVqnZ|xR)7Xz^8vF4~W&fS2?7uUK{dXp@|IQ@#-kMUoouTZnGnD;x2D6_|Klan<$9_8f*iWY) z`|0#!Kb=18pVO25b9%CWPEYpF>B;^%J=s5}EBobiWxt%R?3dG#{c$?7KTb#X$7#d< zIBnP;rw#k#v|)doHtdhniv4g}u^&z=_QPq#emG6p52q>n;WTAGoTluD)0F*inzA2G zWA?vk%>Flx+5e^<``^@K|C@U3e^ZbBZ|brCO+EI%sm*>jwb}2cHv8RFW51hf>~~X* z{cftU-%U04yGdn#n^g9^>7_#ZDuWIO=b;bm2fp?Rb<6* z6=oWP(Gk zBZ_~J7sVy!-^g>~BJ(d~Irf7p$9_Hr*rJ@bdLR<&auDKIreut z&3;a&+0W@u_H+7^{ha<}Kc_$0&*@M0b1G*4regMQ`knooerNxt-`T(EclK}ko&B4B zVZWwd*stjj`!yY6zotX%*K~;enhvpF)A#Jpbddd-4zfSfLH1`l$o@>+-_mF7x3rJ_mG-i~(q8sg+ROe*d)Z&ruH1jF>`#;_Bg3UF|)z8%fVz!&E>s|F-HC&Zk0f^Xs z$$8dU>io_5gY#>M*Z#iq9p^^p%g$#Z@7;sWyPZp%^PMxDInD^gY9Hq8=j;L5?@Z_Q z5UITe^PA^;81eBDWF^=F znH!(;JPw%~?*#vkIS|EQs%N}sn5QpfBWUYs0Wl0}LEgpyWFoleKIJ|J5eyEvKZPs= z+uU!s*SnvB_ysE=1HpWEk$bv(l6w?HFX-j&=r-L=+;!bmAy1>n^^fbEtJL+Y>pRyM zkab`Oj4OG?^{i{P>wd^Ma0|pO$b&qM;~=ZzR>$j(7aWg51peiY#g3?>z%k7+3F7Y$ zcHHFX>S*g|>1Yhm_p3T8ID8J>{+Im}#NPke{;mBB`$zWo>~BNl{q^>z?T^~;voE(V zwnyy+_G$J>Fj8eO_^NcZx3#x~p(!4RN3*BeZr$Jpp;rz*z+B9{g*k(HBeOTNBeMgu zJ+l?_24+iU3u53C=EuyBn0GLjG8ZuyG8ZuCF{8|Dne~||M1OZ?7iL?ckIQ}Cc$vSy z_hnl4zQlZyxt^Irbn*9gZR6zu%>GQ?Ul;GM>v}G4#N_Ykw2ps~C1zM6+Y(t=C3Wtr zO!|tcb6?=)Cz-364>PGLQ|I2t%l9yEV^R~R&ZR?~I+qS@>fE`!zKBUppE}q29#gn{ zICCg-FmoWYAF~g$7qbVmE3+N54KvI%nRF;q=hooms?5s7=tbsf<|*b$=5b~z^AF|` z=3(X!%mIztGZwa3z+?LQ;EWT)ozbtXV66Y;(#u6ti@s%Y$x5Pe6d}N6aEwS4Y zJ1p^zCEm8gW=mMddGYI3$p%ZjY>D-jSZ9f~mRMtnCoJ(ei(8giVu>YgwZtMzOti!p zOANQfAQp>uTH;AdSf8_Ku~o9r67wt(wM3yMGA%L565}i}z!H`LEUICZSO&1Dyj5Z~ z_o4uq>cTzD_nEtxJDFRV)VrlFe4dxrGM{2T!F-IliuoXuyO@P5X?ekU=2<46nhW@p zT)?N~0zM@d6!Uh+n7=W9V*beFQ*;5Jq6_}TH_X+7x3{}@GP%?hRMfi0UxIYbhS!dFrU}YWzJ#V%;YY1K>;u4Gjo{JnVHPV z%$u0pr7qwubwOt?r>k7*f`+`@fLWhelj&o+iSsWpFEURsxt->7*E#EDzhT90<#=5!1OR( z#Cd-)FEIJMn#bqWJZ`6X+)nfOe45AYH1Bt=_bZdzYu-1!{1tN_^F1cr-K5TYo0s`g zIFB!d^WNlgZkKu7kIdutn8)ogkK1D&x5vCkxE{C5ya#xh+hyJgUgq|gw~Uu>V=iLO zWzJ^KWEL>8Y>#ta_xV?9E`6L0@~18I&-73AkMj5Ncknm!*YT(LoiOVEi1CB*S+Ex5N!x6^ zU_55rZ7eiq7#YSeqnFXfxX!3ygbdAh8e-~y1KIPoKqkM&5LJJz?@@@Zce`(%uK;4} zjrR?K$a)=p^?W{vruQ>M()$$hTr*8)6K+2~qRcdRD{l&AT9O{yfNlm+hJC8S5Dezc{-?{<~J5CZ2kp z>Yj=ozejTyyMJ_l=6=upD#Xoy#J$2Dbx(1Ra1Z$3`;F-u>gvUD@v1{qJUisEI|e!I zzJMnpTbwUCpK#vmyv=#Da~eDc8Q|>hYy*+~eZBsq{(ydmzCbV3Gxc$0vkpMi#>YeVfj7sz&1Te32F^rEcJwCHu!dtl#&lv>!x(=4yQ&Q?mQtO4fQRCM`=WC^BaG?bYNl$nq5B#KJQp zg%vyd?N#iB1sRjG3T%rokUlKT?T=rjAR~X1CGNCDfh9(D-S+ryiE*%A!qO7IpnB(yXsh z`DrexG}3KP(co{v@EoKM56_Hj7@K@U)69{xQ|yiO!u;&?!py>qf=DE{Y38)vv9g|7 zxmksok;&6mqb21>a*HYrQ_{FrNnfQ3_WJfh*kCgBLb9*0ExL%!CyR#8o<9<7sl0=YkRe`%6bk^3gc?awLP1uvRanv zu`Fn>0mo!=*36uynYQIe%PcM~F0;636?Wph@q&@@OY?t-Uy9xlzclrm_@$dZieI|1 zMf_6FA@NH+`ou4FA05AR{n+@WCgtLnYJCvDROQC_rOLJAmr|OOd1OqF6kWS9PQQ*@ z<>nV;7S@%{&k!IAz$Ujkgs@kA-?DoB;bvsuSsR>C?@Rkgu zbr%S7MyzytOiqr;^q3qMlOtksP)x>tLe%UQE3F!nsWDkTCOt~lu zhFg_Ze8stN@K_x4P$Z&;5{tz5(Q# z-vpWII=U{qc0(?B;XLE~$hq7($eHH&7sO#7@2F@0&b}Jnsy5e8=$qlUYbV{MZPs$N z8*Ha-du{i!`@dP5+!F%)Id(+F_CTMaIdHR+o)f99`Se;T)-=6ADLXfwp$ZjiT zeY&^)Ck}75Y`5#RI_kCh>9x>rrIf-CCUHM`J1RED`>k}R}DS5Syqg* zl4^R@de)>*?@-F22NQkBHpz+!{xW*iG`(sH&gCz;2BjQ(I>RohDV zcP9~j$$FM@K*CTvY3K4k`T`;Gx~!gqW|otl4`wzr&d{dAXWSP1r{{!AIWA$M1MF+^ zgW_HOCg@c&^{P{G4go4kWmrNm)5HK38>Oj?SeNmN1EBz8V$l z%UWiYJ~~g*GG$c4q?Y-LtaznmR_UZyX|KyUTjo`x5xy*|m$A$$&2^rnWj3L|dqv0` zZ~=QsRxD$gRqE+HNz1%yG{P5U#YD@jlBQQl(dC>h^QzGZ*GI*(hF+zwUIk~JN;w)~ zqGi4STV7$A59w8GPr<)OiENo1kucFR*Wo9`Eb~sNc0c@ENkq%+TiO7RkvG)qO3Qp+ zR*&xn6YVn#K51F(pR`X7QkZC;&&iLAcX}MBSDB($iQpVUW0ck>`%Dat@oX}uNBFDH z=v9X3RmQ+E2d_s_Dnk^4ktH_v+Nf9)Z=Eglw6@md0PCzv6%+f-XJo~))_IMd)>Kcs z4(E32H?O(c-+fwEkF(BHJ*}2C=|yH~oun1v0`!!u7-yY6JuStW;ObhN>Lqr2YocPc zp{KRe({R?Qv=(leq}zKEw!Ff)mg#9=9ci|^h0zW|+*Lr!==F*`-`HPT`}nVqBwD(^KkMlk8GBPGRE3?h#or zu}euw(^FD(Ij1g#!xbjB`l_h7-_TQ9=&&`++Lc02Adh-tu!o0X%d)Lrpr_2&Q)c0u z9HvVtI$;ur>4&hkYVoOhN}irF9p~7UbSvd>g_W*wn64xqlvQPP0KCrSr)L$&3!RMQ zF;GvLtf!>ooI*U5atOo39^?W1l(nppM4qr{LkcV@$iyKQRIH9)^-2B9~3qy+Q=%Y#kiFFwr{hl%ExUed(%K=%ZJ-3Fq?qB10E~btGP2mM6WwRDb|w6Vme^@TzgCTZh4qGD;hair?yYgv=*=P7XEl@*~ETqY~V8HZ0VpJGkW&%4Ps65DoZ zRNQLl1}02;#@`NGmTlWiy?miwJ{#x!8_G$w6MsW3!P=^2$LZxGdiivm za|cf`39oEf2pw{ptomQHY-hdvXubRhoXgGnl)}$rtAmd-5;%Ep{ZBgh@-y}F&Ghme z_42ZRZ&Rw%u}h4TwHQ3*u85P>K=FdppQ6jTJelSA|Hh87w$QmyN$6+D{`YBUcj#@%{r6mGHM~V$7FrN0 z3QdE&f5St4LtP>3UsHIGTorQuxq^QOPeI1NL&2|tA3?sqO~IFfPeZo96~WtrQONZ- zB{&x12zCs%3O0r;f2l!#P=_3Ue+GUHddyqTs72i2uiSK8~<@c#?x9@Gp+hag_zN07a5llLX>(=h5_ zh4(gZ6f*Zs@s5RY2fe)=y{){BA!}c%*YDLKXWySN_TXE{*!Ka9Ja`@Q^*sUO4wgf< zzF9EpU=rl&>knfN+CrwjYhlDe1&_yl*?q?S2aIw5#{CJ5I@scV1;!mb3K{xtch7Sd zKz_dQkQw17$j&EVeET(!n=j~gxc-97e80QChtchOT<^NxbghT1d=I(qaxI3j?YXYW zuF;T@ucxcMt0m;)tLduf@D#n>uIz%T0-WM@L617=2&ck?Qcn*!v6iKVh81 zw~%A+1N$}@cfZd5g#7{ga>%bY%bpEm?nm1D+q=Vv`{wp*?bYoS>>mBHen$U8KMZ3Z zKGEOPxA0RUo7VxIPx$UYc%@P+NG&tMceC<^?^5bcrIsso2dUcw;iaS&8{yko`NB(- zx=pEDNi7P5Zy`0;2rpvg3ole^fl~98nn!9*ARHxCWQ6Ci@`YzBb+b~ll$uE@-xn@a zsz9k3q_P9yJf(7#${{t?2xqhMg{LbuO{pxUGD%Gegr_JKQEIYM8KlM<;YqA~;dG@Y zlDgg(Zc3_AAlyW$>y&Cts-6*U#L5?Ls8j=`u2rf&sXBphU8SxeRow{JVdV?gR;rd# zHI=GCs!AYSO{uD+DjMM`tbE}#r7A0xs#GOX1l%lgoT=t27sO(}uTvF<9Qs)eD zk(E#UrPRNbx}el~QfC6(PAhdvsgtBi0^+z*e=1c<>WCpqSouV;Qhz9Q zOsS)!ehG-*mHJJoUr8M@#4oIT;%B9PQtGf$Ka%<`AbwEldr}7s@f|Cl_*SWZDRq$4 z7Xk5&QeP|el~P}l+GmI_Soy@~O6^zbGo?NywI?7xQR-u*K2mBgsa=NH!^$TDuN+CgfoA-1#fiFcKHN2zV3HU`AoO1-7j7Ns^TwTaXQLu_Q_6K^W@ zhElI9^%|-50r9F*uPF7hQZFg>BB^H$v7VJryr9%NrJh&nIZ|r^Vy#loDD|{bPmx+} zh&8Ny;z^~RQ0j3~s{-ONr5;u45mNUXVihZ&cvz{2lzLF92S}|9i2IbfSE+kQEjPqU zRz9&psk@cBOQ}0aEe(h}lv+mWRzoahN~9Q5F-nbAY80u#MtCGEUwDL4!<8DQ)KH~{km?@@4^nENQUgfcXoUN- z@`d{;)mN!LO5H@Ndm!9fsa{I;RH_H5jz+jUD_^*qQeBnmqEu(4I+1D{2zOAby;AK+ zwKBqOS^2_klxnS1SSg{DNvcI4e1lRgNnLM*Td?wln=91}6~xvRIZ9_w`vYAsm~#OM@cFA#N8 zki9@~OF{M`71@haWG@h1QjnEEoJcX4KChooki9^7MM3r=71@haWG@f_QIM5DEJHz7 z0wMndS&39P(&vF9dy!>iFAykCkd;V9Rw5Ny3B-{TWE)bEZAeA70a@5YNBZP8KEYN3 zXA~bRC?k7;G-iVAMJlov$k`>xN~9tyk&3KDDzXyD%_UmV-)QO+WG|4EN|3!sMfM^U z*^5+cFO37@da4VmiBi{*s%MDCtbC%8QVo@ApwzWW)hAUuAnGc0jZ$?;RWro@V(&e` zvnbm4(PZ}R6$pVqC;>D2z zvn9sA6TbCx{661q@c*CfYYSiL55X7tg`TfHPkPEc-QC}U_WDYg^Y3sSbY1Nl$DD;9@wfld>!^DrvWuCs0KChF$bfK`IgDkdV~Aae z1L~-Q#o4+|Sbrdo#oV&Psk~z0oTS)pEHjN|_QnwV68qFqAB)ou0}?^qM6rGzBl8v& zN;j!pSZ1oRu_9i(0{dm6IO6EymO-DPlr&I1%A_fQ0~pXL^(QDw zu!-OaRS8NM4%;(WwwGnLW|`EXd}UKzN&gM#zlU}u4NPWglU+$9Xb`1e_z#&evMXs| z0vi~|WJvwOq+<}pz3T4){k)qE?7{|OkX|cw3!?TN{st*St1_LXk6`ITF{G-jCC!4! zs?>kQ+>KS)i=_*eo`xY-C9fsTf+&7(f022M$Rj^i=mjjjyRpd%y}YRk{aNM=?gVbl z(vw(vM+_?#rPoTi0@Vo|TA}Ar6>2Nfc|4}b-Gwu zoUv7>)RJ;Rl-l?)pf|W#T1%FOL3-_?rfTCHqztW%A*_Ec>pu)b?8zNat8@t>ZY=!= z%-vWUeOdo>)}LdDUAcO#R3?yPb)jB}p_lr5nK!sLy0ZSgjIC%?t&}8yODes#hF;PJ zc}Yk9z3K`ST*R~f$*ez(%SG2HfD!xpfc{fgp+_<8NeE8k8$9TT~6Y zC^)}qJWDMyHaVtGLIhFT&$BXraQm6fQpd8?F&N4bxjAGTa?VLmYYpw^*G-JbrCz~O z1xp>qQmFwYWrFZK4(#EpfPOmE9#VQUwMly@#mf~X9w<{MkB{*zkrmX_OOVhT*Xo@$57cr z5#^4whf|o_w1>GYrIMwTV~F;URXdZi%E?GUwE`FQq|6#TEFWwYc`T*W*rZj=ptD4d z#CmBTWf-cFI1(9%a*rRw+-99#%(~8ET`$EDo9|(@q%+_Qt5Yc2QJJ-= zI?Z5RCmS1#!A+)$iFCmI@jn@Z>srOS_F`R!u&&gWlO#d-)dn;BD4@R|TunObG}PGS zgd7qih%%A!LzyvjLQV?n)Q@%QjiH*5Q`nSwd?2$2jkhMUPRYh52jdGUW90bV5t%Xa z*6)j*=(yia5*1-D#eZQM^%3z%^7+Py;4X9Z)YC2%Nei%}Qnh6X;cZ#_c{$EXq zxBtM}AiaUm;rv5*2GdlQLavpp(-j2R0A$u0iUVP?D}Mc;%uEl2MPZX(XRuC-jZNPE zO==Gukmm?~C={?x(^;o!7|Mx=LD~bM^JVup@lfa#vzB!l$vRDdzb{p?YnAvwvXX`}wMokwO*I@j)$3iEG2F6}`mv4ba|zzRS&$GFTD@Lu*H338PH;dK*%PS=MTn1hZX} zV5%x2T2^|k6dzD88lh9Z_TU*z%en$`T?_xOBt+91Sv#C^hs~;noBl1CJGdPRH?T`s z(lTR{29`}{ihRE8mS+lnzD!_A7qg_P7|Q2M7UYcjeAyNC`H~cKCrcX1lE%T+#^=j0 z{L4|Q`As?PJxIW>3+vd^*fcON`0#^E7p39aDKmzeS1Z=BGwTTR;2~skCZQ|#mzYhl zpU1!~{?{B^9P43aeI=}^&w;V+3mqLCaWJy|U;Eeg_wBo3cK>D=(Z1P!mAw-DwH4Y& z*oFNfdpo-qX8eC|J8s)$d(!rh?JnC5wkvIy*-C9w!J}ZNEzOonbe~zozKk&cff8GBStX`k#AK>o*tJTl?_WQQ@ zR{Kg|W%@8*ADBzv_x|av^?vGo*ZZ>fG4BTNYM4Dx3R;C(-oD;W-e#V^JawMWV7|aB zo-LlcJvE-oJ+nO%J=vaqFq+-m6XULTpK$L7HN%bWweA3nU5|5Txx2cZu3ubVgAaq9 zt|wqd!Oh^eV2Uf<8tY21oN)f`{MLEQ`HpkDbBps{=k?CZVDMW-$hb(Vcp0eC;x!F<;Dv0AOLt)K-M~fd; z{MT!rYX`MAw5MSl{2}l^cZYT}to^@AyIiZ(%3w5nnpUWBSXt}SH1-RtWnZw5VHA8P zdyzfP9%Og18`%obQ7mJZvI3UF2D85Kme-CohblGxC1`!LiIpX=7Nn%Gs%YV&qGGu) zJm$K|F)?iB} z)BJ4mh@S|)BzT|TU4q>N&k@{9a67?G1gj8+|3UCE!5eZN-=xy2MNo+arPY(a2-|-x zZ2z*b{mQWYim?6E(EUlDgzfJP+aDCRZ!`DfwQh#t4U=973d<^E*3?FgJtmiuOp1g|c((Iz@qL`aH$OY#U7s@lo+!WV@mEVxmSsSi?Mc(4_^0L`w zrB(7AV~Z*$gHwmXr7<=4%bKJ+Bs@t>&3!?CrDl0c@Ww%ZGPArqtDlh)-Jf)q>J;uu8Ch z=bQ9bDZ;r!dNY^^tBwmRGU4ye?b}~x*F=e15g8YIM*2FLSU6)YxJQ^#T{Nq_G-E|% z)D@9Y<#;lcac^YpoB9d}d}3 zXd=FA^!UV9(OQD*Vz7GXiEK2C*?P3d1nEP9eg`z3iTy)&FU0#8&r=9aWs)8Z-S7Ar z))yWxfTf^|CTE02OuD|EmafhZ?})QYtKe-gyW(=Zz1qC}Ken9L{`NO5=e55|p8@pa z$5t!>XBC;?e*muTqB*xUc|6UZRA~!ac72D~g z?68Oq{;-I)S2bP@td`6rMP=nhv&z7Q$Fg=0{>{NQC$WXXD?Q^~{51=!p&crQcP?z8 zhHs*qPrl`&4ET()1(oG|deqqbXt8?FsIkddhQ`sLp{>IrhHMFo5b7>Ae+vISECoLi z99kJuj`u{Av6j_`;;c*Lym2zY$U2e4Td zeLz@5|F6O$c7;d06dv(NctlBfM1FY0=Y^ z()@o+lJ%E#bk+EW@+wM73(Dqze($38_cwW{O+)CRoWjEKIruE8@_y3vp`Bf|aY26z zo`_M(wJ1C7pCya?XUSr*MU=0R!=a5?HWB@4;cMlrGI~_Qp;3Zy`godNNC zMmEKI-C*j{is)+Pg9ChEa9>yoThZItU;wU;+$%(OqVYj8W6)SjB3qGcY%l;)#fa3!LJk8Bk^ntD#84Rc+hY3zEc7q37(f~-Q zED1WCq2VemNh+ROR3)uyWf@xuRz=ga|c<~ z%HeEfCX=DEDsr0OjI=6UX8k*>S~-xZOPl#ew{pEQ=t!iZlwz55wp|q;BrmQNh zX{%bnuCuX~acm`7RllaJs$YQj3AUDXJm5VKnGq&oK zI&zy3rFrQS;62=IX%btCL3*8ZlMrnLkN1X@p%pupEt|rYO~8;w@ao7#LX_sB7v?rA zb{JbWiY*&~A&%f>*O8Ni@QQ_^^^{qguGp?@*-&F!GOA8GOMrVmVmb!z@lU2>EM-^3 zvt`L_84lsqHRV8ocMtFjy_2fV1+kr3MK@#9mgsfenyTP#GGkB|dMj4Z(b!}KE6)jG z?G0Roi)6--3a*G_YJ&dXqkt%`0c~prTE03G}o!p4aibqs$vt(eoy;dE=N2RYeDRN}&Aow2$WWmL0Qt7K?gQnXVcR#1Xs0HyiR#Uh#14<@%T4`d>OQ0 z(-YbBwiv?9)4G;m$k2?-nNy*!ZY^bH27M?S?`_lAEE}8Nj7^7|w^Xl-i+ZcUJlVJa zZys881<6cpvg(u%gvhFEAu|@BL*2%ThdGl8tRN0UC~;{@opOZ`S#`|=+~Z~iU0{Sv z1}Syq`yfiyHG`D0>V~nxY*q+WM_vx1r1YzlgIVEFR;Z1wQ(g|@z?)6*T^PrGG9~;% z`aWo)0^6~|fviwqNEN8O9z<54SDr8UEvXqRY{Lo@Foc<=b<*hpRG@S>5L$trkhdhG z`U==o8!Pm&LivK!zs?=C`k+a02e>P^`dn;moUs+B)JZ1?@OLAxzAM0OZZ@_h8;e0o z9l0}za!s9(QeOSxEN>*s(^Bfle?gR#4wW*4Z^<`T7wq;&>G7o_*hH%($5Am2de42J-(0;!H9 zM}ngnJX&Jxzt|h>XTh_;QTrkLUi%L4EwB}4Vmt`?d28)8_LcUfFdt*CeWra1DCp&Y zhXG;lZBMl)fscV^c85L2_6v9!IBPp;J8C-weg<~fw%NAYHiM^u4Yswm8rw?nHBf1r zYnurxHpbg>Y#B=DAjy^hN(T<`IPir!i_buM@wm|`7o&4C#n!rI%K3i<~L;C;Yhjj{YLe+G!v*dEWrH;rt=BZ z8x~%Hdc(paJQ(j5s5>mc{fFG=AMuY6Kjh#O9QHrpA0Qs#M-boV?;{@OhY=5Pa7Ya4 z4)TMD2lxTR{d_;-dmMa-!|`|dyNLVvKE!u8_%w(3y?ig?+x%_BJ$w)1Tl_7=-F!FV zF1`!#P5vh0PQDXy2j7AC27d$bb^bcyYy36DSNW@mukcq8U*<0(Zs*`j9sd3{z76pu z{u1Jg{6)kU_zQ^7^XCztJ%b!JjhChS2m2X9Snm>*B6n_fwN&Y0_6Z{Fp$NA%k zTlf~l$2jZ${k2Hz9818xbGnk0L(8A3^*#|2N{p9Cc{?j_yB(Z z@n8I3i1+jR5%1&Ra~}TAz5HIpd-y$wck{auH}DOJ>-l=bb$lJ-UHmS@JNcc6cknw9 zZ|Aoo-o|f3T+7!YuHkDCZ{@cl-okG|yqVvOcoV+~@kV|l;tl);#2Q|MxSFp@Fh%Z8{;#G*3@yie^c_m^6uRvVL7a}g;3lPhBIpTai zA8{U^hginT5a;r_h;#TH#Myi{Vks|0Ea4@H#k?4C7N3P!#ETGT@|lP;_zc8L`K5@L z@JkS<^XZ7w_%y_e`NfD+`BcOydP&)RVd1u`3q;%|)coOb+N+v0v3 zrDvbO6L7yZZ;jZBw?d5P@rW&XOT;*(Yu|#m!2RY**S;BVhWmc*NAz(YqL+ISJ=}xn zCVhM16i&G>;FS##UcC_E6$%kvg%IIo15pziA`=WTR>UI4h!~0dFa8(epZrh6|MLGL z{=xr1{GI=f_#6KX@mKyU;xGIc#Gm=ki0Aov#Gm+2h(Gcl5zp~+h(GWj5WnZ&BR22` z#Cl$jSjX!SYk4i=clZsAxz946ahKE|L5`qBT?v3~Ub z>R3PeA3D~L{=1I#qyMI3{pi2ySU>tNI@XW=vySznpVzT|^q+LBAN@xi>qkGQWBuqq z=vY7c_d3>(-k@Xs==D0*k6x!^{phti){p+3j`gGeN5}fnztypR^lx;mAN{P3^`n2S zWBuq~=~zGdmpayuen!Xo(NF7GKl&Fs){lNl$NJGv>R3Pe=Q`GpenQ9k(Ld9%e)Lau ztRMXo9qUIwu4Db^$8@Y8{iu%hqkpVp{pcU*AIa;if2eZi0|p|A-=1>i?~nUhxm^E4&q*YFXG$!+lYJgJ&14VZz1m1 zcO&l7cOky1zlpe0--)8~Nas=tc(iv9}X%lgZR+x6{;+w^US zFX=BKzNo*5_=5fd;`93Rh|lTIAwH`=i};NG4B}ROE8^4o(}+*$Pa!_3KZ*E+{siLV z`s0XO^eu>w>5n09);A+=(l;S))HfnNsy{0Gi-*N*jq$(jztum{-`e*XsKH(AYv=s| z{PQjIW_W)0>;z@NY>&;o4}8AObf>uLT#vabTs^?6-t*u??_y_L9R06w^s@g1%I-_; z1MSV=OLM*LQd@IS$XjonYE6V$@DG8fxm4{>?RA*no~^mqL3SIP!%||8$KDh>KDGs{ z|KDnSQ~e$Gucz*wD1&jU1N{2nE)^F$7H4eLDfO~nCu%3v^#Q)h&5pHX$1q5*r%szF zqpa6K%Fr(PQSA6cc03P5>XNUgo|`Cxao1vQvrB#`J3f*f&%zM9cFM<& zw`a#?PuAf2*rqz9t`6{(Q97g!B(MWu>|h2vH~>R6$Ss{GsD(s;@Siavauwz_FaJgCU|)8yCx$r4&Fjc-Lil2I z=&ZX^W?hn1P+V13SuK4%bYKTlj7<(}ljDRa!`fHKoWaY|TCjtO>|k3AWskdbnGm(d zeR&f-?g!ZWHg>QXJ1BeH2iK7!g(&kD0s+1(O111wV0+`345^=xTq#7UmSq86?Ph!1 zu)P?h*D1#dk=3#kQifK`0QOEcduK3)s#=uugvb%e%Q3fEEj`&gI(w%thFC3w>!kMt zs8N5IgJ(ZqBD1Q2s-Vhg$KL5?Y_f95e?pYXSuFF1_NKqnhP{)(WGH*ntEqA#d(*3< z_NMP;@7dTpKK736O;4|D%Buoj6yTMi7c7hI%454mVyH&;46h1dE=S^d73MZCm|(jy z*sehsVly(R&Ty&_dcmL@|1z01@`80`yZRd&jO91wT7g#vTCs?s+wczXU2IQ0+m+0A zQ3rTat`&GifR_i4+NQ8=y^T%I%+ETkY3l6YXv?ZQifLW2)2C!+dc|Ibw@PiT7l2Q+-3!* zv+Y@I`%nz=ju={JxK`*#Eu7KD`FWYlx+Kc%t}bl5FgAHlH04}@&y{BgZm`<0?VZ{7 zP8iAtYfe)Q)|@7s(`;j}dfE2YYR&c?er{P7Kq?Cb!a6+F44AKN&{*eo!)qqM1v zr7~mCbRG18JYCa{fhOon7hvnYS$ zu-L2spYCQG2eXYB^r$Pslu>3E7D39!*&+FC(^R$z=7A|+3XyH`Oqo7p(m*!bG>&b` z!BAPA@}Usf7SF)krsWM_n=;v^!5AvblTH+5TO46|m&&ZsEbjugNjElWdE`bRN^5+H zJVUVMwPu@=*rtvcmMt1qC;ceM*O`d1&FNu}%8;3b8`+CCwke)%BJ)#D6~bovfcZ@e z@F}5Iw5~T(o3tYGu@J>>FP0fYtY}>_Q=7D+sbmF_Ry0*+jI^S432a>)lOb6V`B;eZ zgq{-M`EItZ4_k-9fI8_&0V*eQX5nN=8GRZ`K3iYP)`LZn+k`0Zypv?!FpFA0j;+sO zGE^2tz7wLn^G?LvK^C<>ldT`jWT-5P{3b-Ps6v@Fx<#$mncAd9kpqP&7F8h65Nc8D zli2!>Ooq~;r0ayJ7M1^Z7PXE&Vq@#$*?O`l@~RNUFeU_eUZ_Q_>CMz8EsC5eM9DZ_ zW(={YHOWkE(xS+bLX>yDaWZ41MXgC-YvPy;$)d=KLKKV23-DYwThoWF!63a(I!yqJ zifm`bLdsC97{%63WNY&AzH=oI&zs1J}nV$)6p_( z)02}fU~2~%o3st`oe;$~M#=L8zx%ajYm?a8ju^^!Kj}OHY$NjBFE^^st~KlqFIyYW z*3wi{e}7N}Nbx6uwtNe}+iw8{!SlX)Shau3cieXbH0Iy(z3zL- zx7GI;r~};VyVG|I_!nH^Tk4zVD+YytiM~AFNM8mh4)*nR^CkP*gHnLs=kUdPfAgO6 ze&_wtdjgaQ4|(75zUh6%`@Hu_??&$fu;%|ZPz|`odxdwgccFKVccyo$H{UxNv;ziv zb#E_kD)<3t>y7hzyjD;U_}SCo`NloQJ=_frP+@Msh3?MoMDS7X1uetBVAcQku5VqZ zU7xx>1WkdrLEUh>>si<1u18$=yVkkZfU>~Vu7GQitK3!Uy3{q?2|R zzyNz+dpCQsy}iAa-48PeVnL_iob5Z?m$nnOkD+Jh9ow6>S3s@cN!v!-12Bu=HrtK1 zYiw75=Ho)!9GFKi)s}A?ZOgU|w&}KBpj^<&*47qh^VqDg8suk~OYjZo7kpyy<@bK_&&wZY|JhysQdscdufqub!PYLK%PV$WNjUt1RwW7A^UaxsTsHbE&t2|+QzEP^6}nFKQkE+x2xU^>Axf{O{J5=yWAeSJA09NA4VvZmfPLNHIB_SY&5o8i% z5DX<4LNJ(M5J5V@K!O1Tf`Aj~1pNup2>KE9CFn!Y8-f2waE{;yg6|0$2~6#<3jX9!Lcd_i!E;3UE41SbeSBlwiy6N2Le#|VxRfFB9@ z7d|5Rkl+J?BLwdg940tKaFE~t!G41G2*9U>Jm)@wcL??pyiKr&;4OmP1iJ{{B-lx? zgWwH<*9l%Dc$MH4f|m)l6Ko@RiQq+o7YLpwc#hy%f@cV}5U(ug3Ae(5G*FBCRjvJMQ|BGB|!zjLV^VZAb)?)`8WIT)pl#!8+HEv_ciJKpGQ-r`#(rO&}#bwzRSP0or0PD2W@+7ufaF@ ztzHU{?Q7_!jSBOSUE2TG*U0r~hYbo%KuWr`99Zec+36 zoAqhX5xn1er}ZZ5D)|1cw9c_!YMls5f?4qG-3Mm#ceJ*$daV}t0{+4B4b0{L*mA(~ z7JU6aXW0TXJ2qI>SgwaJ-)hTz%Ph-Om|;H>v?Fiuuk>H;U+6FOPxlumQ#zDQN@|Jnk>a&How7Q z+bTB8_pre%F2#xh$4&N>!7?8**}qJ7ugNx;>@I_4)Ed8P&0&+hV;s$FA_xBZqKt2i zbQxcp?2O648)7_^x1=oQrqw3BvAuD;_Xv}5gTd-6x-vy6XHE9D!Mv+YcAd$(8%#6v zY9E_%`%Si3Rm1FQ2AN`z5eCUpByWZyV-gh^R%nn32FWwX7=w&5$S{KpHi$4tKZEo% z$VCR}YLH}uI1FM_B=c8;oHxihgM4q0dV_pxkS`5#(jcE0+*2AQZx z#!-WOXpjSn3^{C&g9f?BAVrFZ6^igy2Jsohu1Np01~Gnf|6?j9;bDVZZV;m`;!;&i zTo;3MHb{a&j6d39hl*+OtU(G4lB7uU9}V)ALAEO5GfcvluVS?A2H9wke;LHMblPwu z#;^@mtzuYjMPmOlNP|I)Du`7L2Dk=PH#o3+$jB?I=C}3puU_~#Q>_LOg_}OGHnaunfGt9h~eqMODE8BQF14lc~o*MOA*D5jTFR!Ny%< zu(9S<8>=2B6;)%+YdZRMBVB9rnzlBtee3b&(NPAA%TcUyo_d&6R8INTh?`>6W#xqH zjkvrDgAFn)ta6ZQ@GC0QjO$#P*3n3p*2-Z0>P>dqV0})S?1;%W8mwnCgQc!AS!aWF zG_G1@$08%n`=QB<`>4`8*o+%!vVI0*`%Jc;Sb6!(+f87zL*C z0$WGvfT@RZY2_4kua;I$IAk0hp{_=0wC{O3Fu87;)L=UmM!rh)Z8?u%ssq)_e;uSr>LW4E7W~nQg+pEM%-1(>LAYeYh_odmImU~{Z>+T_h;xmH< zW}8giWhG_HREtznw)8UN=;g}lO3IdeYQ!xu>aA=EH{-e*Y_V!pO3JElG~yN+*RO0* zx)E2EYOu>x+gVa}S*95mXRwORCNqy#^flrZ-eR!wT!YR3)?@`HOElO#^$aK}E1Pe` z%{5Ct=a>;U`(=~eZ8GyZ&o=73Z1x26sA?xm%4Vx}1DM}9TKcEKN(@UZEB@MuE56rc zhSil7FEHcm2AieY$&#`n^Y_g#>vDzzW}!Re3%2p%z6$Pg`ovhZ)ntzwY^CvfyW)g; ztyp2a2Cgt(=vI8B4qf$#L5#Pp#z6S?7P~x#5dnJ6Grq$`G)$^d>wr*?@!({-VeRI zyw9+gypMYC_TJ*X8b<8Pyq9>#gJ(hA>4lN{wqA$lyyvv%FpTJKfsx#mFoJujX9BD^ z;GT;-?P1hbbN}EzE~b){>GYbuP{_jYx0wRQPj7U!=pR)5-g)VbgJrt>A| z6EH@<&Uuq_rE{@!o^u9_&F4CYIQzlMh94cDIQBctE?u?3e{3?t>k@V5Hq| z|I_}h{X_dJ_Gj#y?DyO6u-^b9>Wl63?UU?T_B2?7@3x(X@AHGU-L@BD&HX*Lo8h~> z(l*Oh2+9aO;cMIhU*ca`KeX<)J_e)Ti(n1?P-|DK7si=Cv+S`v4PVwPEhUyopq<#= z(%QnbZ(w!$P8cbE7*?fUrIl+JgIQ?sMf^G2|97h<{*OB*eJg_>eDLTFes*CI#OTsx zF>9`r-qWSqYw1H;dI6tyO+?HU5i!dnV!DUNOr0dXq)#dBFeSS`^Dyp1RRF%81y8j2#5A@`Us`(QZmo6^#&I#QuO3?b@ z(Og&oB6C%iR*kQ!C@#IKi326yNtea)d_g%%!Pk9cWFSgp$=A^$(IdHWPH$x*bl`x$ z{e`8A7D?~>SrrQwlvOV%U05Ac^F(W{mvJm}Ve#CGD)jHa@>A)(eRA2tetm=Mv-JMx z(f37;#1 z#>l9Y$f!=zGd!Ma_`)Tnr$hE$2-zDHvX>sRH!x(cXUHD<)HnYE>50htEIEd^Pf>O8 z+;I!bmw`e?v*u`@MT@e^ON**9tI==n;KNemU~*A;d1-aw(!z>S1>^E!uK77yq&-ec zQ7K217F92P2$ z%ecI8g#|LA4DA9U#uki}N+<48Y+fKDH*Zqr822o!2HY*och5FXnVUC0f85CY;ROY5 zboDJynK>pOe$rHTFVpwxO=W$YtAN*&uAh25KkVLpItDwD@Ntbfpw*D zX!M-VrKHE?+`>FK=Zvh(teoK_u5$fZ`~|sr+2bb97+HC5$lg6cdzqDY?sj>vDn*~+@S#^&x~O{6 zFexb!6geKe{ei3W{ATj@42qu=5rMh}K`ADl3(GR@wy=oNd!!@XnjTJM)5f z<^=Dg1@EK;?Mx~P+8MW2m9%X3GW5zW8`A|3M2oyFN@O`UYVb3Iv(NuXw)ZL$7iX6D z2#=Y6vW3<~-PQS}ix!tx$E+ICm}vasS@1&VUl$RRD;pC!b@s3hHwW*vV?hnYwMTnWaMqYMj5Z4=dk6w+u`{_pRSr^3d9T#2&!63$zE}T<6x0p&C6f>({ zHrl9KBd6GpMS%j`EkL)C50AJo zEaI{y;Sr1QCkz`mZp;b?{;tgY{1sNTl}vcj7WQ9-+BV~6A@JD*IRxDibRkzqXU04o zk?`qQ($DN$aPq6 z%ZzXrlol_)fRhuaDLbgY^30O|6=F3sQ!z zn#s`8Mr&!=7}Bbl`fSP_xjJt*<~CQ&^w-h`YiR>8#8op{^;wiPK6K%4Y&_p3vr4A` zxHPn~sH|$x=po5myS4-=KA(JV1{V+O9r1#M`@hrjaW3{wIEv+qvur{<_$`(Xj z%)T>hJ(co53Rg_nH24@v!=+U9q+Q^MTs5;Jz+Veq!;+$P?`>>awO&tR1yM4-Au|R` zq-x!hjZGSb)GC1A9BCA<%Z!mm(LF)y9;eBWj6w+&L>k3w0lv+xb?>8f#~{6)lnJ6N zrFs=oh8jh-)?=L3BL_oe6eLd&WhvDwnAu(Rw6c2+OJJrE)>kC~G1g!xM$H?}>?8Vp~myvVBh_JBf4;zPX9^y{(pH(-NC$iL!kkP@h6q zInp#X1^6QorqQCGrZ#CBT~*#rp~d&}jgU9gG+HEUYLlkXg)&Aq@sG-kk*3iiL2D7G z$&gGVnes=P#v=j#fLm*krnSHzz5W7B8O1dI4JkuSW26?Buf>hVP?<(&${qRKe;9L{ zrZGs1%huvDFhtWBQ%_0-&iKsGYZK2Ol35#@f@lWPPKz6$#pxI-15t7YkuLxb%F~6m z@^Ni6kYAOdY~`hxLDW|MfvBx~3oXH>#rd>2*~$;7CozL4EyuqC{Jt>rXr(zi8yj2L zzn;_#!dnh#=tx1=o09#Iz<0|e>!qYY)aUb^kTSH|ve>yic5Wnw z>ZT+?gDBN@2j(`bO|Wwr?A#y>@unPEPm%^uP2o4??J{dndmZY=s{=dNpPlQAp}HSQ z+#pJWeH)%BxWQ)U64|-77|I4)iXA{@M>g1Nqc_;>2QAjd&NXA_=!Kjl5TexYngG8g zw0=(~GquV3B}IfN^?R$#7+Jrk6WHlECPS)UQb34OzqbTN3t{d?96BkRsE9UL6rKv33HqEJBXdhW@j=m#QGguPof9m&f4H(>qeP1;6Z;cW+4u(2~fc1E_k z^!@*a^#2#|_wxPddlAO+3w??3{r_)oska+^|3BiH4d4HNz)I;G-J{(tT<^O!xbj`C zVV(Qa&I+gQ_^;!2$8`y{Ok5wJq$ zJ@BPI7SwpZWRJ3P)+6@E*iEssVpC$iiFxB6egB6iN@<|W7HKKM84%DJvN{RolFJ~y zL0+b4mLeRGGSpJCwVH8SO%8_CfH&AFcf{ja*fFn%11Rwr-aekZDIWwMsaoH!#W` z@qsU3sdr59=UAdvoosCIo!-!t_dyXWGe)#0T6Ka}9fu*dCk;(`9~3bG{<~YN&d{nc zNUv|w``}-YGSo_jX^Y2di$`Fn+LI=|5B`a{O)KHr;-T8&bPTaQ$*ecL4~9K2{QSQ% zEA`wgDy@c&8+n<#XVTmK;xtWd47zTb^h5ZEJV&rAoEF;RL~U_f4CRxeNk4?YM}Jbl z^;&7u7B|xt)00B^A&jV5{#$^b54EWBp_1hKFtXj@=L7tEw^p73 zKT!th^~(QXq!XQ=AZ4gUjnEcM&=!osP+64pK?to@M7zU(#N4JurE3eav;{*kRBs^4 z0iiz&PJsUzU*hLv*5GcRaJy=!EfB^g?MgW#jC?lzAkP%?Y|<9A(H10ND4$Kz7h%*d zg72d}o8X#N*|Y^dZ2|TBNLPfAKhmli0=zcZs=8>!J&jERt5R+UBibomFEfT(RV%Hy zvsT;@Lnhm){`JwF55m_(oy;C&RW7YK&e)*aNckR&{8p?D@Ne8&aWAbHgY)NlJ;5&eMro0s-n*Z`03z^9;S^SZERMk=sA=z zvZBA18AB_&pEiD|HhvI>7Fp4H{p_ax?pHEX=0}X{DfN@KL+$^WRPAz3sXihu`eKH zsEG~NCXCl6TO6NX@j?M_y`@=h4`z5`!{CuLT8k}W8z zltU09&$0mw@}L+i=i?`<()9n7(c??rZEoDaz|*n!!Sf+%&k|h3H@Q( ze186+%o^O@MVe$gEjQiRq)94Yg^?!tfjn2}V=%XkmYbl-P(B8wkHV;r!6Q*0gE?BB zP0RIZx%3#6ehQ;L2Hy|x1HlH_M;kiO*yPKV@=X}oIv$o8Lk+UCHngWUv>S%%<*G>! zg@lE^TO>vBC4RNza4_z`u}N8=9^S#UQ=D zNza7)A!VpNjnOhDYZ>D)RL{>QJrll%xlMb@)G~6ljNurnVHd+QVW>Sp(cYC=|K6TD zY8gX}4W6LVIbpOWpt()i$UAa)JE*Qww0^yfO{;dfMQo{- z69c+upnnExXuUxpO=_jpDD^bbQbYYVspST$ZmA$^B9-1Ypbi{q!l6PO>BZSnz0JH1 zZ;a;`@Vj@`bJBCvbI4GBvnBZtfp5Vb{%!uPu;%|k{|4|ZSOe?Cm-;LHbNw^Hui$up z4y+Ux{@(snf091|Rvb9|F}`1X4d7Gor0=NjkZ-SV2dq2T>f7vl(6_<2)>q?O3H}5t zeRE;;!4%(kU(Wxh_5XU?6Kubr3ScU%KWK&ufDM1E|2G#j{}Mpu?^7FTg|Yz3v_EZSJk^&EN@egL|#J#=X+L)LjXF z0B5?VxW~J5+!=1+KPi3fwOf3lx^CCAPUnnk9 zSgDSq&WKndmf`*qu~gyZh*e^-!fM2PfjT21Ag;jufLN~LQD=mwk^U3>F4P%;eIbtn za+MBsM&LN=i~yp}2q5Z=K)L}c9qNogJnD=<{6H0tIwKH|IwOFnGXjV@BYYs~RKfnE zD*Yo8A%3vJK`QAC^b@VQ{|d)$!{T zUaRmLg{u@^t#GBn6%u(K>5{>DuEhO(rC*j$`ehIwQ1O!$PEt5gA{<|W`%{!o+7zXe zmQOlqaJ&kSPggo?)0NKJ6w+6N;|uY4xzd4~PP%NOOw7mgmx+0Z`JxQ5M8MQ;_`4-y zj>6drOA+%$31X2bRya$=7b%>naE8K56<(rny25D+FIG5J;S_~d7_^#C-kN1-}i zfS4xGzC?yV`w~M0+1C&;R2?6Jm@d#>LEn??HBIS!3Z?TYl+I_G()mnNI-hAu=QB;| zeD+cLo_&K~{P3e24DqYW1rR&*Q>3Vinx}Ketu4iYZ z>)Bc9dUjU2o=Hm2vxCy{Y^(G;+baFewo1PwnEB(%RrQaE^^gH8~erI!~+u2;{ zb~abKogSsz=~23!9;MsqQM#QTrQ7LLdYw+v>l9X{r)E`pYF4GEW>tD>F-k`*M(L=< zC>^yJ(oy5TD;>4pm5$o)N=NN?rK9${(os9F^wZ8O{j~E+KkdBIPy1f!r+u&V)4o^w zY2PdTwC|OETCLJet5v#bwMsYb8>O4}jnYl~M(L(~qjb|wE4{SSN-ym+|4P~!KdtoA zPAk2%6G|`bgwjhpq4d&DD7~~3N-yoG(n&k2bkdG0owTD$C+(=xNjsu+(vB#dv?EF% z^@!3(J)-nc4=7#K145QP3fR+Q#z>Iln&}PrGxr{(m#Dc z>7PEM^iQ8r`lrt*{nKZZ{^^rS_w-4nd-|l(J>9HyPd6*w)6GivbTi-LKN-7J)DMWk z_Mu+C^ zaR&EK3Dk3g{V#C;Q*lz^=L%uH4Yb#viq8-~7N00QuJD+`qlh1fj}(50ctq4H{6^uI z3QsBgRN==8KR`Sr-dBkFZsLGAi2Lt}{fPU-yNG+mK85cf?h$WGz$aZ{kUT`fg&2cpT#& z6&n#B68~2CFyaH^LBxB-zZBlD@IJ)#;vR)}E8Kv1hghfZE`@g@t`)Z{ybbXdaVz3Y z;%3Af#Epp8iyDQi5w8?iNd*1h#}FS;`oE7T{ohBF{_g`y|Mvl<|N8*Pa_|R~{_g`y z|Mxzn`+J|#{oSB+e>W)I-wjIlcZ1UXy-Vr+-lg<@*DAf=wMy@ItHO9xo!=Uz^IM~IeruG@@AXRGca_rjU8VGWS1EnpRZ8D?rPB3Xu5^8u zD_!5^O4oO}()C@gbbXg8J>P1j=Uc7xe5;k7Z?)3%tyX%zl}g9AQt9|sDjnZ)((i@$ zo&)}d7zead4C^Uhyaxm5&0yb(`}G4fmpdl*BKBsCR;QiOj$1qyX1NGFmghqcz-;hv ze%5jVzWr>LKj53cr!^T=-Y0=qxZ6SZ{VHoUtXh8=`T#aszwnHLZz~-W z{tdpXzOo**b+EOxxxnAtdH8xi;rqb155C=B^gRJS12*_>^&;j_zeg*%} z@!x0r%C^_G#kR_B0ss09woh&E+g=9`eh=E#*>1LeXFUKO@#k5GS=)lgy$?Xo{zc0Z zmWRO~z^&k8K46&+8un@M<=qNA$sf`-gFbz^mIu0uy`ni7 z{-gev{a5)Xfl`AFeDs%qPr&iMAK>eJgl&+muPv2*3zOUiYO_Gweu?%k?N04RZIAY< z_AGp5FY%UpXTdji9%w5JgfHx_-ge#=;IZLP&ySvOp>O9S&wHLX!4v;ek^UOppSs_N zZ|c|G&%3w47xg;#&F)q3J-yIf63s88?+<^nzb*9kjPVbH-k)m!Jm?MD>fh+U4?GFh z_z(DZ`@is?XWNVkAWjQ(iHc8M;xl6TcJZvqo-x^0lRd3iFEQPWd(vc2m`5)$59#C_Yx~}iFsza zxh9)qrdy8;bgDSz1;r^&e+^`oc#)az4l^D7HJPKtJi69oYs_@&_rVpvh2rM8xcUVU zcas@cX6C)YjGJ#V_3I(W^=7*3Om?lwt})pvlU;4Hl_pz(3>4aUxfypQ#g%*cLX#~p zj|M2N(#5MxcA1&3!c4b>;;LP|ku5fJEHcxnvsAnJGBd|glU;76Q@>@oi(f@YfvH~# z>MJ1Y9Ayk{|)f>1u%BCZ}rv(wUsD0q9I}x&|@_)ga6>qgjl*u3^v&y^JqFT;SvK)Ho!b86mtk}GTmhTiS_Y{ekSWn zteac(QOqTJo2-|~dYY_<$+{Cu^@@v3b|JCOZjq{(OQe{rtI4{UEZJli5KFR)PQ*Ic zMMq+7y`sIz+L&Ym@L6$txeX7SaYvvX|gzzwIJqki{^^CL^G55P3AM1 zmzdKl+$M7ov$};-F_&tZYmRH{BX-2ik1FQk zADiqWlYMBi4~QM`^7l=4*kp%Hc97UUH$R}5i|;qtdnS9A*d8x`$7Fj=_BOGdZoWq` z7k|rSyG^#sWN-TZi20O>y)HrL6MMXZ&LVcZ1)W9gb_qI*c+)E=uh`)hZ{k_R4wu+T z>~*hrgV@V%@w#Fz@tVnAHQ6h~UUG@;Cfi2r1($e{*t0J2yvd#;_M}TZMQn>pJWlLU zm)J<`A(!~K$sQ*5fJ;1xOg;^6BX*0IuQA!J#A@997R6lrW|Q4yvKviy1F`G9d^NFE zZhpODE`A*{aj#4K%VhVP>^@@aUE&^--EFcB#O`p3btb#ZWOou<>k_w{j7lVKaS1Ai zxXC5x*NYomf_}5O-X&@%2Qd20;!2meisAw;afQj26IlouG; z6)bY(FHsyYvMX4?$X}qiXIz{t3|0(svM|Y>rK3;!_*TWd{ArVs{lT(0{v^e1cJU`n zMm7m6()boL?lEGI`1mHpyqqi+R$%c*DeeI`e?&1CCo6{4Mx3lzvWLv0%AW7@ak4O2 z;ls(oV9gFE3xlOG{9eidjBHKDDO<~T!?$s>7#H08Zm|#3$@ixB{350U69>G4S|stF zOHex`_Ibs-X1cxpnKIoGyZC_O4!H!iZ~_>$aPoY+{WU5bwZJmRr<4O2wVg8E4*%|$ zzD#`J64Z)HMy;qg(p=Pu6)>TGa63wm|~9N&O{ycLcS4y%2?{Vw~(_I9>?@D)4LmI6NJw^|p&{QvWo z?J%dH7xXba4P(Ha*?IOlyNYGS{vNw8_U_oS*rBn_W4?wT@xS^nr9sZdaKvhHUT17< ztONex6xWzIF?#t0u`vwhwKn%PhcKmqCR;>FISNz4NCyOP-u4ma9f>K67Qtkn>Yj5!w@}ia z4btHNr0*D!egvg2pHl(8?&dD=wDc4K@7W;z4me_CFNnx6eE9`%Dby0)o^xHTTyk%C zgLE|j874$z$d(xvS5{V3RrdlnSry=9ucB&EuRv*4MbT{VL^Hdpw6y13XAh@LBpRgO z0XR=DJP%YvEY(81$Xeb>1NRnL<8t$6fG3UNnPUrPkCy838fGZPkt?XvZi_Zy@giv2hoKq;o%V zLl7HxVMul;%OK2NxhOzoDV|$Ym2^>3Y+LO}s&=F+hH!9119>7~ts{z)E{ntLmxE1~ zMk~k>tM+kA?MQ-lL?#*1Kz<2gJB16}i-7?lpdjElXAyXI%w34f%#*akJ+#Bg7&34x zS2eJKoDsw(hMvF~F9y&F?UOU_x!-dt$Du*;ke+2MfO7oEG0JQ>>DP%E1 zN+9du@GR{xgw3_X#c(0h8^|R=Y}kZGI01(fIPAvH#~*Li4mQ`oRqerM+Cll-MFaUI zhz*<22)T92ZO%ZmY6pB8__{ve)egvCp58#N3BnBkvi6r*-5~~G)!uEcz3b7yUFEy7 z{`CgwuE61pP4POJ6R&`AtEL6CkTPp~H5feF8>j7+<<%R=Q$hHR7V8)N0-{gwjh3jr zoNR2c6tIE(6htnx5PfCF$T_AjCulFnX)?q)rVY|L0sQ8O3D2TWKy-6!FL%*i#$a3n zc^+_f3SDOfw?=PBDVw|*Ma9xtXjVaKRVK2Duq<6Qi%GE~v{y>CSEgfVm8sJk$R9!E z6l&2+o-w43h4xC8_R1g(Y1V23IVFf(x*>XEZnKViXs`6wUg?7&&RXr?K>i4vaiO*y z8z*|mtkAAtThm2*7)@e&xu%(BdhfmWsxiIX+;q+{H;K8qH@|0|XU}q)_jBLRTmE_B z?0%n}-I<-4eRg(t=6SvYf%*M9J3(x7I1#IWYFo4{LzPEHhkjip{W(G{m^?OmZgnk3 zpY3>|uc1j$ar#2kEe|V?yOc*#l}DhaI%o7}(^ZN(F{nrOR&7G0dfc0-=s%$zSrjqG z9$w255o6Wk-c;q@L`AGgJtiDYJtl0`Mmv;y$13;YYJNYl57;xJ9ITSH@o;2Z^#DB~ z+KY5nt=!k5+_xInx^fUBK^)~6C(?^hjuPd*D&@X1TKTr|D zPY_o{MjuT@?o}RiDfgu+_X!m#=_i%~Ad`r0ax=DS>EcljY?(sMfTf@nAANUaDR-&L zU4xXnn%g@&XZ8zT0(i|Rh-tghx606X#kr~BeG{f1xnsC;M>L~Y-PWy>>s4;7g;Fo7Ze4Mh1{4djEu;Fp*S$5@9j3_)}hL+A_Ft}w+6hMD&cQ!dR6{lxu6v;}dR-(ezR?EQ6Vs&Z+f zBGz<&5phAB=6C2;E!m-5I!(D0SB3pLPeIfZ5t`pLI5P5nC{`|;t6Wx!YyEx@yae(5 z+_Y4TZQKvjmCL-!WixP%_d{_%u@KljQM6YcZHS24ii|Vip0y*D%cg{Wa%(|9krBlD z*J~*vex#?#Wy6%qhALtWo+kZ*h5+t~82@@L`6!+ymnty-+GT^3%h1!LpU4T~JXDjm zY6+3*uxqNK|AaaaFF~A$i6UZzI_%0+^q)`%VkL;94ueI+SasNys_aTs#G2HBxCr8? zL&8?g=}>k}17dQqD(n~B199E02f>k%>QJieu2yze;#yY+VjhUoJbEy;p$;>Y-6hIy zFRoD?%KM3Xz#ij%q`5`Zqq$oTS9a%yenKgTfgp}jxI`+Ez8<^Nl-;R{Sc9)ezhEQ) zrHFCI*PL;EJ$5MEG(OenSa#UYb^ubzvnF{St^0k{w3i3D+jBA7fhWdP5GDd zv~spmE&nAyBKOJ#>%-=Jssq02+IcH&o&{`O+-S=^)cczQ&j77(uW@KhKQ z6ZLcv6&_5!4ISNELXV}5OE#(--5W(%QGgujmE^I}XFW}iDl!|EVcFb$T(_rtaJLB4 z0_09F!;@V9qqp%y?NrLNuMH?+>FZED5xb7*a(4~tg3y@(a-~-ir$k3RC6wv5Cj6AE z4^N@ zwp~9zMvu)w$C8euj?@mZx2T_-?G^YMjVk|1dLq#15MdZHmx?-AYd#@iZQ@$kQQA-5 z_RKRgB06ZwHa~Rln%B^$Ywm#THHI&opW z{p5QeC%aqxT2D-N=hZB&sf7i7s0#YY^FBJeP}a>9IV`&+HFImqU_lqEh5h7u&xX`R z7jzTG>}gzA)kc>NuYHfNQS^?$6O(A?MAw8MKS-`AtSNv6jt5mDe|$M7AtF(@jy+Tf z<&jzdnp9&x)?AZV)3~Og%iB**`f;jaqhITcsfx0y+N#;G=v6^J`f;kFn<9r*MSj)H zDh>-)MO8n!=(8cE5xItI-i0xbQWZuGR86m%3=7o&IqAo#fzG4VKo!_>RV7wY4G2$t zP`_B+J<+eV#neDiMODQtSo9hoNBuZ8&_R*IYG6tQugHZ3YoMZ^JoVX-g6JA($CzO? zKzcwezqtGr6DuabLWL)f{WyhhJ6ho@%yY~Yi4|0Ma@>zo_zixoC8qFmOBR<@!-DTB z1^wj9AE)rG6gjN$g(a0GGhxx+T-Q^bCr7q_a1X7=m>tkg(~S`7j>{_1O7dZm#jcY6 z6DWRKWPDJc6Da;b8=M|WA-QB+Nd_#U1up6rPW-<_%OtsZ$%fTdZxu#bex$eiQwzU*FtlCPod0HhbSZy==oAqj&6rnRvZOs_dsJ5_2 z-$ZckD1-$oZdO0J@3XYX6rkdKl)^y8g{6_KWoenPP}Pwmf1IjoI$G6f=0dZUs8Q9C zAAg*xYxHXkF;$n7tL09CMSoO~YkzdrLH5^BhUCz?-cP*5qS)pU~1Xays4#AMfk#gK@b2< z-H7?oCs>6i2)*;fPdc<05}i^sC2vaM6cKVJMSbGqr7{x9_sbr75)r#vSw zrz}V8SkzAp261wJJf6aM^^Tu&V>cw5U7VelU6d_?R`nCHK^zraipd&dV*e%Mk;lLZ zvdXgZvP!c=ctJn$A&B7v{g2-KleHyqg6QFc@d@MY;|GlwLkD^N#DyS+4x(ZnM==+{ zJx8MscDeOwyQyF^OX!yrN$aAiym*CMPm(vQ`Iir#QkQ8hvM? zAdt%FaifQg9y?kbF{58FA=vD44vaLy@CE#Zs%@d)rj$pvT_f3K>!{>WqT$Nv7fc9o z2X&9d!Bjf`kc1&ZnAk6f58&uwF$1Fu@aT=*Ev+rxTT%w62x(HkpgVxWV@Gyt@o@N7 zfqBCwuS-r$7Gh4npgD+}nVPWUlM<4|(G&Xx)j{0M%-4@@YH6RmE^%-oye+p(>KEJw zaWhkG9Nq@Q%!3nw-?j<)|4O85CC^iy(>=8w6IkeH{@M%lbp%kVS8ZYf130eoczE36$Zq(HeBqe{%#nv ze9jNHSyAJ!8En`@HY^+0&=p=25QE(Cbq^nS0^vWTGS7nMMUB5kDiDppvY}>{p2CKW zV#CBoUVcD~c0(0Mb;ZJ0=QDmV5DV*QaWfdd(SO}p0UGLtuCvIDxU{GJU`}RciK#4+ z)`bBY){ax;r{LJ=B9CE7lUdS4Tw{@Ga2xo%BhQqqJt>N;TIc+CMsLW3nWYY9Nf|6j zkV_N?Xaqb?ui+DZ?eUmiLpO5_XO1Db1{L;Y1!xRBPSGFtYY#)w9V3{&E(+)a+_Bxr zkHN76FGkotWiw|!b56!Jeu?maKENF{vI_5pk5Y7_c^t)@x_=1bT)~ZG-k@fHI3^BXgoX4xc-9}y`ym*z5*DZ0mGRoo0%ry8g|YN(0H~y zB<41GKolV~t{?XXF`1b?g_(vjlNj080`Uj8;qCN(zjmKq6uf*Rq`+7ykb!H_tydMG z!EHG$CKvZnE}#dXz0()f(9?Y?1E{&b<231GaZFi&2ESokHu_G!i&DZN+2hDkBBWZCy*w=>w1S0pz-ST0jhpgA&E&`c}Vo zODNZarT0@pzqaB4jfKmx1D&@RxfZ81vi$xO>3vmte~|P(WVyRIKttm4h?p$jOz~UV z>Kl3*;1vYtUocDW=1T9{rFREO?}|Nh12iNa=T^Rn;&(Q!+1MPde_-na#eXMXdM8DC zXQ=d!IEV*m%v?!~x&VpVK9Q8@8gFk7b&N}IYtq}Q^tMxa8$t^LG(Il+@kJHFKR$Tj zg5T)ZZh)!_d-+a~o*NeWwG{=7rRO}-bDglG zI6&j$aq9niiY_dyz!Jo$|0m4SGYQfYL!>7fVNY>@M#xzVYnFDMU)!siTVYPcfsepU z>DH;zt&?yqi(SP5F;XrXo=B2hX#cLo_{}ZQr#+BBl5}f^bn6IQi(NAVG*B)&=A(+g zm+}t-0$sj=1mLpWYL*^zOScY|ZWa5qfEX!<9K;ZnX@B!;*Qn-}h|^y_Qo4MEB-Sn6 zGXpe49_QrO9PQ+no28rG(&dAt%f-n{17eIEP7a+~;n{~L@YQ}W3dib;d=^cUcFdA? z6ysVERah3FadI{!CXK5w4Xnb*L`F(GCQCcAaV?AeT7bsP{?n1~h1gS-M1(c6g*6V#mS&4Vts$$R2K}g3JBdB~%6BUEA27 z>-A!RjJ}g}HfLMwwiZ~hPU-?Qz8>9e4vAidiDI4n52=paRim66a(zapShQiX)%>y*%PQz_*u?IfHE{Rt`+sxA0>Nd|dQ9A_z8gFNw$WKwQ zWw_X{U8tHjhh13c=gsLYz<*_PUO|NNa_Ii3n5z7NK%pO+65m>t(?E=5HE2fB}{rUdM z@L!CtXA`ofz_tvQ?tw5mpeOk$3UcqW_UDC2BkU;GkjdXzvPZ^M`I3 zw-13!Sy-l)t%c3owEvZ|?hgm^D47`JO#GZbKAG|`M zPM^Mc;^u5v;Pi6?H0UmDbi*?a51ezw=`#if0hh0&n=~R5n-^_P-aK-%$V6^{hT)@C z6rOtL_`xA1;;A=y({TK6;{iKnT|Ba)GH^E4ISf?$I(v*)hD~*w)J=mniO`~eO}{CO zx=X|~Jla_}UfvkqvpBLRrzZ>ki_@oOgD5wulEi$b1Cn4h1J1V3z*qeL1BSl;C;8rD z*#`fA&Hp#cs#&L61@~X7&i?m1unYXd@|op;vRiiUig`!5In6fyf^jVuAdBm!S_>3W>AwPMyJW7jRi_M@~z@ zTe#F&!VHxMfKLG!34zCOfT8d#;8)nJbO5j6YT!s%0Hn6FLS0sZ zM}uF>k;jDZ<$H1aZyb49_%-|*+`gJ4KMTK#BR>njk|RG0zk*+Z`!DCn)50&~$kW0v z<;c^*FX5Nq{);*CweUS0`C9lz9Qj)Kg&cY8_yrt!Tlj8{ye)heM;<$VK1UuqzLO)5 z3qOyahw1I$$mhb(<>%t|IUIRi_}Tny+&+sVzY9N;BfkqjgP(!nr}NVhPvgjA$4}*_ z;`S;06vUJH$%xzecEpqTNr>Ax^26{x-iO=0ycf~W{fJxnR>UoQ3*u(J8F3TegxJG- z5I6FTh~2y!v5R*hcJfZd6ZwgV9lQgvh!-Ii@$Y z<9Ud=JQr~~pN=?-faRQ%!IG&G3 z9LL8Yj^$$!GkGTB7(NDZG#`za!7~ukc{<`KJ_>OpABi}Ek3byGha(Q-!w`q^p@?Zb z4KbCcA`an05L0*xVlq!gOyWt1i98W;FdvMVz!MM$@j-|l?m={OH=>KX5S`qK=->`S zm8*z$Zb!6n8={q45iP`{$<4%1!%ZAIj^X}NxPmAXj}2#>;kKmnZ~dk7Z~aI6j|kWP zt^FJEPwh{{e`)_h{6qT#@rZT=@ptWa#NV{v5P#KvMf|7sPsCreUl0##hY^EX5HX+y z5c{=$#GkdF5r5M8x_;Dov3}5byS~@H$Nk@F-ywdheT(=HoxkfF?HkGd|n@EAK~^Po!9F_?L*u?s2xN+ zpdCQ`K>GmkeVyOyJ?%Z*eph=J@f~nm6!rSH&fE2t_7-lxslAE#hR)yhy7oG5zozqe zy{f&6+pp++UN7r>UN31cVfc$WU+N3Q>!m%f^KCt+^KCt=J&VUZqw{V(t@Ca@rSon* zsXdANpV0ZY9@qJ|9@8Gf@JF>r5g*YWL3~)}OMOV^;d)Se5W^qP9zeWb=i|DM_)@id zbzZJ}w0m&>-P+xVcjB6_)@hSb)K&qbiUNvZ0)Yc+h%XnVE282&e%|LYp!OVzH{dBCpHuEPCS zYF8p&L42v&Z8{9$KnXJh=cbRMxYHGIx!XXt#Xr)&6} z(N5D&!{biX@HwNMqTzE!J6Ss!!?$broY79w@HwMxBOWrXkN8rxUY!@$uk+$=CB9T` zi_WjRS?AZ?q;10VdWbJo+o<#Gc5B@j-lg;Pb`oEzb|Ufi@^;=X_VYI0hPZ)mKy2l$ zi0k=!#1r@lh%LMYaUEZWxR$R)Z05~~KJG(o;!TK+yb*B?UxV1d8xU9X)rj@H9&r_4 zg}9QhL|nmFATH<25ts30h{yBe5ts6%h)ehq#N+sJh>Q7R#6^4&VjZtTT*wz99?OqK zT)-C~*791!8eW4qpU+3E=GBPv_&mg8_%VoJ`Gz=`&qbWW=OE7Jvk@zKB_dddA(r!U z#4=unSjtNgXYpBxGx%!>tT9a;xsyUxShMm)CK2Az+&Rm1C}t=D;MPtbX6 zTXY`VbvlpjTAjzXS;On2`82#fz;BD!M{Cr1Y}aUbeY6G*uaCA`!|S8fYj}OMRT^F& zZKa0SM_Zxc^#M~TygtGf74v(%hSx`1s^Rs~mS}i=wBvLh+r>JM?II1Yk5;GQ^#P+Q zygu5o8eSi5fri&dtJU!OXf+yMA8o#d*GH??@cMv36<#0h7!9wFR;A(f(dKG+eY80m zULS3?hSvv7u<-h56&hY2tz5(Fqm}7Ax}`dg?kt^0cc#vx3kGXgzG9t6w@ByFE!25* zy*iIB*Lid`okzDo=h2;^^XTU5Ji2+{qA9L37(^jX*ZFj(>3q6Vbw1rGI-l-jolkd? z&Zj$3=hMy6axi|j&a0cH^Xg8}d3DF@yt?CbUfr=euWqK!t2;*L)g7&k#&j}te%*BN zXA=1vrSt5L1m_~LJwoT(9j^234%7K|hw6O0X*%C-s?N7NMCaR0(fM|hwPZ{uN$1^7 z)OmLY>%6-OI`8fvop%?A)bMy9S4RYrbVQ&*M|5Zo(L+-r-6nb71*Wxmo<#RI?mOJ; z-PvxF>nYb3S3Yp~Kjhp3^Z)(J@u*{?V~QG3?^I7zC))pEzs25S&$fMP+iP2G%doy> zy%5I#6D<#0dM$vU4v)n2rUH(+wE3c8$*%$0unE7wA z^fR3NfBc&j)a~VC#)G)xhgUEehFL?SP@(=QcHVS$p32TkWar^{P>}5AW5T!)Vbv2&-e zb5(ZkAa*W|2kBPwvBM#MiTE%GQ`J?ov9&cc4#UpyvNKe6hKHTe($%)HFhFMVN@A3c zeWLasJwB9qc2#wy@b{L@?3AhO6bC!S#ZG}D&kT@(ybSga;obSrH}-GJeWwrl{8;n{~?^FRFBZ*al%QA^#hK8H1F ztZ53a(V(C(pc~0YxtT)(M<@Yt>GaqmSGxd3XyGz z;tZiPn^}X0H8@yC2=!hmiOA7zIDk^hO2LluXEkY-k&!0PR+eh{li2ls$(5+7xT z0kMCf*v36(W~EvP2Y=zvk~^l?MkiY&Hb zPJry+l~IvnMsUiYsH$`+L3GdxqJ`qH$f)rva@dMNY(*+tK^8u`DST`W0)DMOP7XY5 z`AD{$2Xrg=*o)OKa*$x0R_N*SbhaGUF1B1;tLXt@2M><!5w`|Z*pGf- zow1qABdtA>*;Fr^I-E_-W>bYxT}ePUe2=}ie(-DG#@t(TSotDWJ`dOWy`|f~$KG4t zQvzZ4mY0=Ru<{aI( zVokL{w(@dpZG0WKHXuKxW;V;iW>IaBoqU`I_$$Bmc}#6+thkaD7vWm34c$^cR!P33 z1j1?~hZX0u;wiYs+L#;AP36JAB&s&Pz}R865oUubEQ%6X@dQ?!iEF9|GM(RKfVMjL*e2I!qJ>bi4T2iujZg2&;$!#!DG5 z#5Foilm>L8_t;_iPcXLOG+~&Cjb%KK@oBh5w~4ZVZsQLACQ+67F{Lr!HesZa!1!p! zN8lPACjw;89;X^Vid&7mjCswBdl;u`)NR#ctMQN@SgxY0@feoBgyq-ZTCYakDm}Iu zKcoc0s!Tk4o^&=yNY^Zz5`Fpu&7hnY%80Z01qvQRu&K@1X45t6lsC%;Zh98LRjCTNWExKVre;lTc z95pf#78q7;850l&>5v3)>_8G?!6blp^>rA2c8p9P3BQtnFhm!Ho(60DrxSU!*Zjbf zXKspo-w>ruVcFwCzoycFFinU5SVP2DX_OnjLrUA4%ERpoShkr>QdxEq%Z9I!hWx-h z%4)2Q?kj$v=!>wv9zBHVKd`<&CRD_T%tH}h_5%f=nT<|mqiLNVsG@>KvG0KC=Sy%b zT3;jmP6it@j*ZF0HQHUz#dvW{&0iGd3#0lfDJhRt4S17)985@IV@9zt^ddUvXoY>j z4@{*Ig&jJC=|3p!?4uR-d9av=!VXOpR_$Uf#{YMkM@sfZ_WAbN_L+9gKFywOA7dYG zPqw@5R=Z?7Vhh^7w|!;%*!I5d4cm*hr)&>{=l^ZC8*EqGF0t*hoozeC=C^g*HrSeN z^|qz9V{OOS%56oqd>9+vV(v7rH#eDA!n^^sFlS(?*=x=$TP^tQT3&vz}o+$-3EkqV)u8qjiOK zv9-oJ2WGkB*6G$9Yo>LCHO1;U4PZNb3OMoa@!aOQ!E?3e5}1YXY|kkkKk&|P@HBhsVIIO`J;wkWLXjsQ zSo6ojOoVBk!5#FykNrh9}t#qEI^?wIQj*J0NWuCHC6xITb6?p|^| z?Rvy@uWP^SM%Ohk%iV6*Ij&QIfpMd&&9xThxjWvq&@~TO_={aLTvK4CyA0P*U-@rb$oa1GHRtorCxDUvF6S-I>zr3Q_c(U~f8%!O!|8OccQ!d!I*)VK z!d!TzPOmc;W^5Si9O)bav*FpDGW7BM;`q_=cVK!v;CRdNvf~-(^SRG)yJH{l_h06? zz;UkQG)JGK$I%XR;xzz^f1RV+QRygg6oAD=mSePIm?O#Ia#+;A)Zd|>=sWdG^&|B? z^>y_H^-1+1^=|c6^?LOx^&yXM!-&zqlsSrG3s-(tQF=3m%j-U+=}Bh5p=lEH44P5(0eV*1hachje) z1E#lNc8q6CkDBf?-EP`v`kU!8(*>q;VQz*#Q;(?~W=L!>Ei=`bs!f$Jn??c5s+naP zZ5n1uGPz6^Hyp9H@U z93}`71PJ;GekS;d;75WV2)-xyj^JB@e-L~_@OOf*1@!T+2)-ovg5Yz4&j>yx_=MnN zf{zFe5qwB+kl+Bp2L$gEyhrdZ!8-(R6TC(6Cczs7uM@mR@G8M81TPc3MDQZP3k1&- zJV)>>!7~I;6Ff!mB*7B|j|=c?>j>5oG!ys;ng|*R)(|uhtR|=@SVgds0Op+*NiP@B z#~&kjl;9D9hY21cc#z-$g8K>XBe<8~9)i0G?jpF8;0}V@3HB4*MsO>^Ed)0c+(fXC z;6{QQ2(Bl%j^J8?y##+FxQ5_rf~yFwB)Ed$a)QeUE+x2x0GM$^z3d^lNPu6%q`{7v zwlHbGhDrN1Od70vX&)x-*Dz_nhDn1_EA7Li{Te3i*Yu<>q?YVna6Z9Kg7XM= z5S&YJ4#C+3XAzu9a0bEY1g8<4N^lCn$pqU8P9oSw&_~cq;3wEhu!UeV!6t$pf{g^- z1YHE31Sb-75VRAt5o{o6C0I{z0znJGGJ@j?mJ%!>IF4X3!6Je>f`tUf5-cF7C8!~o zPf$%TkKh=BDuTHLa|mV=R1#DWlndCZl@XK@%p#acP(n~lP()Bj;3eP$8bJZU41#=u zJc3+;=>*dR^l?)yGk#`Z%go zA4iqyf@+VV2ec=M3w5}s8YQgRjQYx zO7(J7sa}pM)yq+(dO508FGrQ?<)~7<99629qe}I1RHgA|X zy&P4lm!nGc@^vChy?iY}Gl7qwiJ*~S4M79JYJz%#RRk*uRuC*FK&9>FsIA<*2m19F?}0qtf_d}V+ckQWDukij3O9GFoIw>!7zfM1Zf1R1Vac?2$Bhs2oebf6C@A} zBJdEn30wqD0tbOgU?;Ez9skv!8ZhdC-|D+D}pZxz99IV;4^|x z2|gkCnBXIVLj)fZ93(hE@BzX51n&{NOYjcC+XQbByh-o|!RrLC5xh$93c)TbxUrm0-p>&6(xQaHcsE;5(5yjyM92ZyldI4#HRBOOB@;55cVI z`{bKFzd5deuf(%q-t-QbGkv~ehGV!xR=-!@R3BFVrkTnRr}BO5A2WH zueYCUUvFP*pKJHpC)!i&cH5t}pKYJpUbj7ByUDf(dKTJkE8IhD3v3lO%{CEw3=(ZF zo5lK<^>=H)`knPl>qpl2tgl;Nus&&h$a=T+R_pcFtE?AW&$pgsJ=wa|+GTCE`mC$0 zORNj5RlreLXw9=uvW~Nk0_*q$@Pt<^e_H-&`N{GP*vB7)8TekYJZpK(a=+ycu#n$t zx!iK0WryW-%QnjgGJEm7n&zT-KJz%=ibTiEVcZKO9;8QrmbQ0LJ zpJ+P4)Ce;HE;iMe=9p%IvFvnHjw#bL!jxk2m~1Ad{Gl9Heo($vK2bgZtM-?Ghw%|$ zL*B34s9XcAt-E2Kzf+Z7WuwxjtOd*V_8F zwb0|?aa&z~xqfr~481B#fMH^eXQrnB`cy`Hl08=U5$H?#+I`6VtowGDcf#*(av$fO z>&{g?a@VGOi-4{R0l+}SrX(nx-O_n`t%^tKlD7MG1WPO228$|0u$)2!OE5%e+#!{d zPA2F>=z}&F0{fsH2k3?N10ei-aN1%F?8-)HhXw!+Sr3hh0B9-%Km#BE?rwk+Gy-_+ zz*Y-1uL7X;5&*ZgfGY_oOD*tFfWURo^a_AB5TF^FPyx`~3D}L$1Pvo>tvQVVo?2o{ zMQHFN)Wai`72nq=}!g6TRAl`B+%Cc{8Yw1@6mm@5p#1>zQTZ`8d zv=FRCSd>d3Bh>v1VFA@(Ei~tFhFWNP1Bk=zKF%X=^Y-$*ly?*us$|GZBiYL`77hB6#b7eT9^zLduf%2nK2s3FydtIwb#D z49tI!03Hz#J)h2ye+_N<2@*3f-Hj31XS95(%pP2biM`m<^4tQ zJ3)ZpJAy9>J|dtiokzD*-U}2+cTOJNe|dcrxP@RNK?eb8R$eo0H4xBEGKmU3X)Fd# z8ig{bJmh8CdKw{d8^YkN2nnQF2~<8Osg#4_ zIVgey-WQ;l4pK!2)u2j6QP07B_G1a=BbezBb0%(?C@-uXw-~7#qgzIT_Y6o{y4kFF zSXYfxNmDvEHMcgbl}@d2C}}cnq^=E<*9^!ho5SQq19Fl!SQ#&OZfxsr+2E@O2Ke^Q zEw-4T)^}opN>7amO8qt_$TT4)hy@2LV-;~mUsrd%uws(7pX5@8g@UB*y-sDA$P$oE ztQ~b-_{N&B4VN!jnIsNt*wnD4a&x1vL(Cd+!pSaWgb1zQ)Yj14b9rd1>qKw_KShsT z4_iHbdi46Pbq&+=XVi=AboCr-gf=#`HgxKtzR}7YOtiDPaRx8o_3Jh?G)6{TJVcpB zhcvV`wQs2J*tllBZ%bFt3qzFx4DVGdDZopeYDbk@L7|w>f z{Q3ogD)Qjnc)-)5+Lyu!7i00)9Uv<#7{RbW2Lv`tB1b(N4DGACL zr4wY~qTD%oopj14F(Kzihiu2H3lHjhID#JQm>&bHv1aeJGP{5#w{q&npWS2;jfCuyeoHl{n~C{;ufLkV#9Z0 zVvo2tK~7vF?t-rA3E&n6IBngzI)a(M*iHa9F~F(o&eCxN)!mM#bOiS)QQtejy+`1= zj}o5aB|ID4f<*Y);N~Il%+GYZT1P$Jnc#kb`!fm8_&4FHpA(*ZxsF*ng4w?~e*5F0 zW@JCv|L>DLuX@h$%=R$%WA0Pj<*t9bo^Wk-apxb-n_<*=rqc=|!P^`Q9YfVO)JxR$ zYOehc`@=BuI@R`z?I9TbpJn}z^$}~2HP7;$Wxu7>G6}|1uZQp4v8FFg*TZONI(&uR zs5B~>^4IcBa*I3x`2S90)hu25hqUj1F#j(J5+j~GBAOG3m-@lW6()~?$3@u|V}2sD zyv!`GQRQU`^0H>wl^-NhJX?(62%iNVs}Z&oGMEVIzwWG{&V3g{+s9`@7p%i9FHDse z(mFp#Ja>Zg4-H*Hlt+oY1dbgr92q6oWy*D(VH_o7-%jTmx6kms4@1*$wR zL7oS046Q{$BFT%URf1f3p}#shS01@|m|UESYjJ*WkO=Yw%YAs=O39pu&hJ}qoV(a8 z&r#)Kmt5TC^Q|um>hyR6HKN-{aSeLMqtBfnPaPpo9g1sl?xLVhju+#B!3#p??uI%w z&OX&F7pn49k31Dh-Z3jkgm{9GB`WJPC_30ZLG)0~<0Z{8%ah!4PNJLxW=|bOK_bSB zC9~uC(1i~L2&V_kl#`~&NjbPCGP|J8g%?9+$MZ0H7@1v~oRlFajlwkqR|bg(Pfm`s z`ht4TrOXqVU93_jndJ#dGEna%i6eM$IvGdBP>J#BBArMoG1+656I9vbls!NtRut4} z@M7zK8s#CJXw@Uo)qx%pIzzOB40EdSz;Vqon7>%lVH*0^S4 zNs#F8VvU&j6hF^~>W}mySxF>_|1P zO~O>NEJ!?fY*Zwp7{s1Lv563^s%=1p^4O6|cBB~B3efj%Dh(179vcyp$V5s6>Og4G zKpGkB$TW5&8`p9haK;q{bvnGXNRJY@hjTCu@y%7$7V;@cWJgA_BWbu6drE@Yr~|RH zF7j-;5Yg9x9Wk@N%*-jG%RNJSql5i%|1(JpNS-928k;#PDwH;iMr0ls1!a;W}mv*r%CM7 zwyw@bEvU2QMKvu_A|Hb(z%e0xFtbnG>=Ot3#Kk^=;KJZ&REO9(H2G*cxqesaE=C_E zu#fEQqe1K=bTJANOOt{d|<+ z-~-wq_{sGr?MQZT8ap^INCbHbnC(V2=A+=Wk#0tj381Ud!CZDQi5(oy4vI%L59(xj zu{jy(=Od1ilSFo496L}P)JgJU<}l?WL{1W7Zl(hh*a0&;kiZUzn`uT+@Z*62bqu%yNT>w5ivhV?09irrH1)=#AI}C_RNsb4_>8+7B7|tm=E>yR4_|@ zCY3!y>-?b3b{G39l?KNSyh;sY&!)3yN8%b@rRD~S&rZpRbWwnNA{D*B2BzBu8{ClJ zAiYM3bH6f(J)6d!MeExjaooiz<`6$miFjjV4-El!ai}Oz9@pD(yJJoo0^K^FeWLy*F zaxlbp7pZCXMDE7u;++a6SLil8VN%%5ne67#xQ3l&K_b1Aqew16Rb8S$Avpr5 z-8qQeoWyPx{`&vY_)V zN9ExPGutbTP9@5zbIqZV*xYl1ziTo~>X_?zGdf3Zp zGP_^|yI>fuA-FV1+;?)6QxoLhM)}8=)2Q5EU}l#MVizQ`3&h^CpcQi;%dyO@ltw&` zWwxt;?NZsUWVQ=AmV*{bB*wLYTPTr*u^h|n`~r5q%Fa(>=ZlQY44Ns87>;FbrZnI) zA^eF5{sKGm*-ks#IhgGPjqaHiG|`2KVJqe)KUd&F;NvivotGB+wW*$D=`D7jzd?B2a9xz^N8~Y=cmrMozH<4`mN5Zox7ce@s(!7$t3Cs^;(OII)eUMr%r#K1=BwjX7tA~O zn*DD3CHAfMM(|dswCCF=*i-E`+wZo2*xmtqf$MDNLr+A9&1YL|E459sW!O?|s`Wpf z`QTab8SoQ4ZM_Gq19n-rfla_N>s;#$@EaHehoC&PGzfnF^UW19MZ&$8WE>uoZT7gHd0>;_LDycBO9+W?q zUy<*Wua?h-84}ma%jIK$>MBPbA$w#7jEv8~*!qRjr1R7Co)R(4AxMmY|FO&0G)L@- z4N8d$nl9~xuEL0j5cHzx`KqWauU>Tgg36gC5nDwOTRdWGhUl%Vs4QDNr@nk{W%<0G zAEE=k7hT;IW%Y}eR@GEgE-hLy2rLT3c5Q8aP302loGGH4O$1cdEoyKjDLG}2 zKfAhgPEkXGGFAlEEUvDG`PM2I79BrS$rp*hM0Di~s}@z2msZzTE?iinI*8hQaWdve%9*R(u(@pdD1x(MIAs27%;oEs#-c{s^}XPL8Wzz>dUHY%jXs0 za1aDxHdgCtl-Dj?xOl-L>6}Se6=n71wN*8BMbJ;1C8A@@dMfP7h%oU2TvxPQKTR2w zS3k|F&|xB|w5EJ+?ZTpZw=zm3r*AG5{f`x8i(rId!INR~y_8zr78q*iY;S`Px1|TE zLhHI4x_wLk6TWc|UYs(hs|9sc)wMMV`zfU=n7L?yFHBw?Ci5^kUzay@v@YlilM@Ey z+Ka;E3&UjlfLs%BD&%x3{A7_`1A_!<9mi7L}Hj)>YP{YQTkBRJriD(&`ai z5j$sBFRq(Au(MnAm{v$T4(fQ9j$2ceT)BK>C(OCjExwv7fzo>e)cdNhj<(}1ajo?j zwK$^Kwcr_{^?De5y83EhuB?S8#0xAGS5QB)qNQ_5)5qfW8VG3mNYoo`H*Q%Bo$X!b zpF|IPdFPgnZeLTKa7?A%`uPnVgG%ve+65i>B4}2MGD#_iCsDWWxQ5o2rn1)d#`V&< z(}sXC5Ct!S9{MgIPKUuz>8xjjno@WjyanV(ZcdEc91*$ch}hh4H)Tegc|i+)ZI$-L z2Dzy;;;0(b2;Qnhg3TU&JS0)s;v#aKffNREeP|y6S-LvvDxH{ z*j)ZV{o$xavRRg#980gUVs{bvkaLucN&aF2b?F z$Z+VT=xTxCo5~8jeT?I=sabU$Whs=%ipI$8x^a=)3*V32KK2*Un(CRDZ=#(YTk3FP zr|O|tt1ym)EpPMH5t}Pc7Q<7}!a+A+cXj*PMeU0kAe)QYMXNIqj5Ve2>sr)?T1$h= z8yi~7*ZCUPSG9F)?Cu(AIqI&VJ4Y#{B1thM9g2nb$y|87^mUG0{@?cxJ4Xz7$BRF* zUOez{4-CC8T@b#t;N8#`jK6m+9vQy1XlMAA`D{J?u8kXf6~0DjFI#IiZdl{%Y;HK} zo@#9O2A&TMwy1#B|B4Pc6dmwtbif_a0k_j71M2p+u8m!lYQ$#xj)={X`t{Wh9(pF; z#O-jaV#`=wR(J{N2Zs2X>ZKdpN(O`46Gy-{HI<=F={0;{(B>j|ly6+S4hAAOZ^^FL zue69(2d$m2TipJQ-K|@)Yr^8tuCguS*^%?bQFdgn#|D+oLNRhajtRzj!H;#mFycNFjX86V%;Tz9{Z-i%Oith$!yhR7;ibQHg>0?4Ppwy_XO+8AuCF&bunzZwo*r2CLw;FUskhA7gy__3H9?!m)6%+Evp>SASx%cue7>y;i9?`P2#GCzToOh z>*}iJ)XXf87dR{GWboaH{{Pvg6_V!%&lm8e`MT#>@Qc6Gb0e?;Uf?;)vkg4rPw=ev z9OtR_lmVUKWKX7NsAmxL7X0ZBLVv+0?ss9vz$e}JyKe*k_e;Q77~ zEV)bEdB7!@4nFTr=r#D=^^@x>*N5Qk{=Dl^*WIq0Tvxj;0zdcdt{zvbYmIBEs|GyW zy{@UQajxO6!7dy4w*TV%&iR@1ednvrr=dULcIYAaLH$BK0AA(Kf>*(v>W%7^>IL9W zzD?~`Pf%B@$EnreNv^4r)l7A$Itb<{ECD_PS+#&Kc@S6&KY^JGU$#F9UgWpgueD!l z-)TP$dK5bB&Gr@Gg^*`Y2QLIC^eOxVj0Ydu-UN<=i)`oEw%dAat+wZFkJ|1Azl1fw za!>;v30~V&+c?{B;4rX({lhQdkMNoGePAzm+WH{$G~8~z9C{nhu=ZLzt?R%CVUhJ1 zU@VwnooF2m-Un{03AhUSEq}Ls1bzoES{}FDVmZaK415cwgNORPmXW~Fe=&F;Yz80p zCSc|-vLsnl@G|(-`~!HaA27dezR`RE@b7OkKMVa6cY?S2YT#I?HkW}nL8jSa`V%}2 zP5>_cq2@uRAb1meVtN-m)}J)pZ@LZq2rf141Yh;7&|A@LTH(CjdAW0!^9*M%a0IM# zu5vDN9^;(loB`|rqn)Wvx6|bK!_g1C03SKtcD(3#+;Okt7GMOp*s;TLies~*&Cvv0 z01F(m9Yv1mjtP#DzyhE;B+suf@8ewXe$O*y1J8bn$!U_IC*&vPE9eV(Q+Zx_6g=K< z0#?Y2zz<=&(gS@WYoJ%82Kq(3%2Z{XGF%y~*ueMT7x_E+Gx>e_Rq#7_Fk~xYH$l(0 z_e`hvd_&r)OAhb3x@7g9MbfEm?-{z}@}6!;r;)T>^`2r#CzEuN!+WYOS-smy>UDej zNb)_UMwsyOE?5o!%~8a(FvQYIk`%NZK&P z+onqnZ#zjRxV)`~w4S79)w`CYCe`aBX^qX>NYZMXw}GU3hxY_svUyu{$?9EaNX>@S zq)W1QjUlZjX;q4Mzb?t%8x84ihIFYR?Iy{kdfg_}Ro`pn)Q0gMl~d~@q%E`;q|Ju3iKI4_Q|rS)qSi-9CmMUH z9TH*f6t+&~)Piu3s0HCZl{eGgH7ciegM-vaVXIV5?FI*_p2Fta_)Q>F{H_cG|7-A8d45Pqg0+w z(g>B0Bx$&fPcWqMhBVHQ#u`$lA&oJl(T0?vOIBWBNHYv6*N~yBzpZ0=8TI_{^wz(8mrh3asnyGq8cfBBy?s^Ly z-Z`|l(B>uG^@2pYDjadPz^c!&L8ZN;ysS(lz%EQN5`YmaKZ|N_!JkZxV$is9w6hUXSV> zgkdm}$xS3lDrYDGm9zGTAssQK-$@Fp+F_FVRV_f$&o=E>L;9y7{h~`&PPu}Scusi{ z66HWhF5@_dA=wPcYDgACG8>X&NU|YGAxZnokp5#x|2CvQ4e4Ko^qV0C4XK}`AD!Ay zBz>!DKN!;YhV>U#r?b4Cxy~`a4OVtJ+tF^razvLDEO6_L(7lYDk|L(#IryplXK< z=|e+0Xh;W0dRNunH>CGSdM82qQJ1XRw}$k!A$@L09~sgIhV(8;Z>rkchV&Lmue-E2 zNP1P(UL)ycm-Y%tFFLfBbxGA;BI$XT_5w-II<)6?N!6Ys>1mht3`tKqw5N4R)t(~h zahLW4Ne?@;$8|~7sEvU6&9z63FlsGe@^9@S3IpjulI~Nr`$@W6)$TPUYE@u1W$ktf zyG7M*CFurLyOE^5s&*Ypq76G!*g?+{{Qoa`uJW7+6FI5wx7?Sxk8>xx-f>;&YIbEg zzk%<=R_AnJhT8{z{gc#h)&1&x7?0m?ud`2wFXiiPeYUwaxAkF|0brFi%WAW{X4wKW z$yv=`n)iVZK!)iM@T09YO;o;D_9-isRPZ6cL|!G2V?nl$wXhuN%l~Z-fV{(kecxu6 zvw){kuvCV4DwFxieKw`Et*u=QeKyT++1%1LWA31W5d{qpR(V(u@Y|R&AL%U(b3d>W z+1@vXNix`NcXdzcUI#-#O;ezUbz^5&OOLO919ZJ@p1iK31H9P9A%#If#1HAfy$`1j zPv@lAbd1=*)JL%e4S(F&+hSvj(XB3VZeU#yvF8Q_4L`)Li#c~+Z0yE%80! zMGQBHq#TnSBB^OX!N+f7Ow?jzF?##P$W#qo4b4CnI(eNv%`O7+gMx(Lh!bA({=N*Q ztZI=M3a_s_zNWl>E_80#fsS!aOLyapAkpvJ6Cw?USpwe*d_rnt7tYfF^A0SO_8l+n zTZ(H_W0w{r+I@Qzfjrn0Z4nXMs$1H~xO0xQuU6VO57$Z?I1QEuiF4mREYdIwqHY#Z zJG!=t!4{~aFx#x@(!L65UkR>dIHI{MNX+}useobCCOs9=;U1aF2x;FGXA}b%zkpyq?|^xfHB7#F$Xy`nljBSq0-Zoox-R`pgyJ7IV8r+BZzv z*8qo=1_d2Iq%eEQ zTcqIwpRRJ~Qf>kN)KDfam#(tl)Xu=k+M@-Dn%|xrIWsxbY!|RRsm+Tzw}6JVrn5R} z&vI$cQe2yxyF0hc2zJ7`Wfn&fIz`k0MW~YYERgop;u;l!$oS(Z!igf{fFhJgduB^} z%5beK0`c)jUqZ-khlmmUTHb+mWXi%T53 zY&)e3UDD1ZX{Xqc5fnWAHbL(zG;pBZa`D#QJhOBz{7Qm?ir>cUY2(E);vYR^KvUQE zrfh5zi8p~KuxJv~Cksnv>D(0QT(@*?qI9me&N-N#CbY!zL6ZEs$ey>EK3Sufxek*-ldyNfsX!e?+h3_Hwk*s=yjHXE8m zS)CojJEjK(c|J7TX(B`T7phiYZ;DA`;@OG&h*r%?$|+ zqW-1_1v|cIpgej(bq?ud-q1Tlfq`!ruxjgWX6Dt|tIexjt6SUGc4P*L6F*K#SNB4f zLD%$>+L^UbQewW3Q_^~I*#BJ8+QQoG+8MP}Qo)BGQk963u8LFAT3|4)O{gVJ5iIy| zHDzUQUa7fuNl-A{i>g>oFDV0BxT1GRxzG)~4@6?!UN1dx>$^H&M7+7BvA(0bv#1)5 z0b>Gav(s5gLCNHj86_gx%Ag>>hm}Grb~zJgD>L17p4Z7rLF60{@;Zv8#P!XQR(} zH!v3@7T6007l`1}Ad%&>jPcQNmxRSdJB;oouQ&7%HP09}BVoqS86u5YL7g#wR7@Jj zVH#K^;&FhbGLpz2nxBxLmM`|^1$EARc!ow5VX;WUI`9xR=el#%Tvx7mewGIpLCu1x zKg@0u6>Skj6Yg{KMcW*6ZrMDoU|Pbov}xkxWkJE252=iZNu^FtWl=kg|3(x*2FC6w z2@_K%f`4~+K@fanMdO+lSps;hE(9(_)htR-)doreF9LHj7iP|f#Uu)mAJl2{;iWFT z5D@cNj5+WyFV3vYEQJLhB;YAt z8%iSfF`k$?Hggm#;t}o*5=p*rUJK6zJRxgD-O1Jn&4ngC)0}P2Ovn_iO>R(d=fjNw zzBW-`F7tb3B_ie+%{C@!jEI#NB*J|0?h}4WsIO|Elni_KsTfo}Xf7;RT{DBkkuTm@ zqN2?c(c;$DltHC~3Sq(8DhVEg6&{@e)YdV23bB<6se$H7h76^r5`D!=lSu z1+6PS3PfvAE{v6cAO@_Xpm~DVia|-1L8*f};8Bqu6m0tN=$sVunKHLG`m0TR-nfS0 zch-!cAkBw(Q)1%H35(a<4qtnX>+ln6IDTSH49=#A!(t-N#)xoBw6srNrw&$ylpn05 zB2J4rys~$Uys^8b74Cl^0%;d!m+&oT8(|ZHS-}d5mlhMRLXS6j9dOgpvE@fQwj7S_ z0^8ro>&yveA>;+i;8?gx5+YyD?FqaLctlk*xTCCV=oJ3m%hKd!skm-jC)&?q=?clS zA4d5n0VCThz+`_WjNhAF*SqGs207nwo(GKa8NdmDtz(U2xOzyvOkJZ+0#^3@z}%N- z`^)y2ZJTYjZ8R|VUj{sT>6Y(-J8!LJtobJxmu@rX!RYfHrcEZU{07`}z4A-)W$bHq zFUt*){9A!ZynmqAle3e=H8>|zgtHiF_!{qob=ir29aEXjp>xV@OvUPEdusN@vy||`)QB`ft zw)Aq$wzxqiWZ}E^C1&Z0MCpji{o;z7zp<xst}=Ko$1L1oWbC!MxU zI!zQY|8U5wKc;=ZuaDoYCWJi?w^nW~g@vAnhx6!Gk8R-Z#dvXB_z7FRTk~L{=iy;; z>yPt1yeE`IY!jcjb?nwru!ttU@Gv>_3qpvfZ>_trwiDq31pi+^lYJ3+pjo z)nVO}KRNQF7hWRvLrhyDJoN>Mh4?Pm*w%95Mjw9G7vZf3@51KwW7dyaKYG15Y}#Sr z&=0+#8PI+~=Mwyda&a5c+XS z&>O{Ja@>!8AAnlFMMR5R=~Eg@8w+8fH;TjLxgVVZRQk<&3bA!Qv~gnNI9NoT&pIr; z_o0JAyiw3!sI)irr5yc*qOqpY(wGVyN-b^E50l%z=z|JR0y-o2^?^yiKp)iVRclu@ z!vg(Jd56d0y%wj&ZWNIQYHabUm8*`2MXxdP&5tfG)YuIoTHG3&wQAw2YFP9d%cK*> zs_FH53b8eov#NMi0W6}%Dh~_Kd>h!m#MIbzeb5>5Uwa={tzVV2Dr=SKj>tGXnlh5$ z5>FcOhcyo`7T5Oiy-;n9UHONFGd{fUQJ=D?-O$z93;n~9r&_&WwS9HUYLRx)Vd04n zd4ztk@Jj;s!{0<6K=;?F(-@CZy(l!=nmj(OpzR$n8>8R6NV1)M zGKG6<;N+2$hr*kBORC>D+*jzW+eNlUd#mf@ev^B{n|ezs;x{Y-dh0eSA+onxOztwd z9lS+v^$iH^d^qPs&Y)W>6Y3w-4es7go-)}wx!GiKjOPY~mOhjMx9;l>I~?P;R3?Zo zd5zq;pOiGoJt=;YIM4HdP|b(@k#po`$lu6a`-$-rtrKG=${8Z{^Bb8VH-X2AIx}Q! z!K{Lb1yc%WhD?JX%@C=z-^iHXC`t&=kii9`3P!>k$6PAwH!|kyMW*nW_bwPv&5IN>?1!)C7c#ART0il)OXm78r zOlWL=6ciU&3t|ey{1_Jy+W2r9%lw0=QEA# zJ}z}!*0@=)ZCXI6=|i!(gBuomy(qSzsH8$X80p@tFu5g8-$M$DSEu%u-`==jT@ za_~zlbPZu{eKq`)>o+JlAT;?YL7ltnkYE)g$g|`n2ZWw}qbaV16x_n~fE7|enkFeU z&*Vi2#=aK3q_{`rkLf?6j?X-2k0w3h;4L%x z^=g2ryaG~1TVxd}Jv;SGhqowrNC0%-#Ltlqof>Aj2C_u{`onLH@_~!|@t0@m6PuTk zC!$6L%(AeYb`1+#E(`mcUvXHdIGM;Ixg|H6x8>qDh~~^T6)Q^_tjs>6oP_n-el;7s zm8HXq?Ig7ttjw2z^}ZRP(f*#g2Ud^o1UvLw;A#E_bv^h*vs;*YK|KSj%a2(yEa?`X zYl~~6YXht$Uj-iLmb%JdHTewJMAs=KLu-2%TS z+mqo*2kn9+PZW66W1wGf#(mO#47|~$JAKY1XOz?KWZ;YLjCN8x208=pX?wsE-A>RN z*aH3tHfZZXZ=hORs+DPTL33atc%d7l`9XIeLrd3u;Datovun(8!Epxk297xnJKl5b z0nLG(j;-K-ZX@Uptaq$(R6CY}_P|`n497&rD9|AAg9pV7uuR|s+XPV#JNQq$U_S$T z1Y7MJ!B^rc&?Go%KW0A+eiV1xcY-d#2K!R5Suoc=19S>T!8!^*_&Lb1r-P@1D3~V9 zo&=r_&VXmcW46P#_rS}+PTNM?2HPI+jkpE03s%{x!7E}J=oieeO#~kYgFwR|+m>NV zxB1{Pd=z*@WY!CyWpEPw8yp6IhJo$CNGBD9}haV>xDd z5BweMw%Wm7!b#9g*a`Xw8!a2a=Rvh)sbwx`CXBN9ErXPe;B{cVvId0j zr?OSGs|>73yyxEI-tFG$-U?bF8^QnKdiN^O3t8$ebI%3uhZEhS+=JYHcQ)vTq=TJ_ zBzKhC?q;qF;Q8<*=!YBzuN8Y-yFo)_t1BI>OeBFvL%WMPFM!^{N#`-}XZRjyF6?&h z1Wy%PKzCt-bG>sF_^DV5D_Z7)uZoGFzc9$@cV>gmOSN|?_=nu>-3fXyTf7^+8@$Ir zGvRJ>qQGVR z8X}nQh49t95_uJ`B7&J-h@Z|MM_$XpuqcGD;kCq-#1+VDzMNQtoX$53X79~@2e~JE zFY#^Mel1@|1Vg4+&qmySF#9v&$HWhj?`3~Ld>?rr`(5O|?EQk!&J7s;F#8bkBjmyC z(?n3+hxQ!IK28LKrI-&4qeA?b*iugV9c=k!+x5N|3FSEZPek}<3mtpv)>@&#I*bB=X09L^ zHwo&0>VF}B*TDcUgfHs9Aus5^BG2o;AcOijl=Uf-*~gYj?acwW)p()VEab^T4^8^~An*N`vj zyO59RFA`rMK9Ag~KS$x6$Y=CtDf|rbDSZd=Y2tR;{uJ^FeH(Er@k!eL1o3g?7X4A; zBgBW159ejo8(;yuK>iFYAy)$br~Al^>A4Y^joiFhM%J@E$O zI^;^d7FnaOB(5M{LtKtrtmAn}U#wq2;iW`8FX^RvIfhI1g~ZE=WyA%@xjLR-^tn2o zU-V*q4#v;aXA@^3r|Wp$(5LH#7#^XIA&w@FB9253*C!GSh!cq8iQ|Z4i6fAMbv)nb zgY}^l9)ir*`ylglJdfzPdLD*zbv%#gIeIS)>pDmF)U%P@^zOtgWP7~}u`{s~u_LjA zcPYD&(F~5Mh3V<9y_YInG0Vh<}XnA99?3{C)lb zhWGOW$US@?5$6}*!}n4c=NaG4-@@>2{w5LU8N|O%VVrLeewD(nAb0VXi7z2v;5ZNY za~$U%-_CLV0e9l|?fhB6?4NWS(Mq%s6{4BQB(wh_{z?3U_&f18;xEMW#B;h<$ z1Nxiq7*K#~>@N4-EBCIFtc>L)t^p+TIuICeT zi8(}_*pt|U*p1kgm`ThawkNhDrW4x|ah~YS^)?j7`2k^^A3&TxK%76oWJ-tgMQ^G% z!*G(`l-LBBpeG{Z^aNr&GDeR@M(HucXrx>B5`8(30K`E4cBJ81Mj0V@DTdpf}yfZd=2Fwva_diW261;6&rADmA)7df-E zU$hsst2B;Y0G2qi!DruN_7Z!V?I^ARNVFceJ_f%nCsw0Wzd?Uc+=+o(R(bgFUfd0# z2M%1VN>N6PEF3oomU;Fo9GgF&|F}tDOf7%dq_Km?rVLMUq@<*jE-0+%7?gKr9H|YS zYs7P`C|r-Eri$NqFzC9?*(e?8BwDdY8*QV?k@GiXXj(V`rPR8gCXcE z@Hu=feBcIXVaK4*U4Wbak+qqsIBQs2UQp^Rm~ta(V^CZD+dSb4lcyy+l6}eI#!kn8 z&{k-yLjA8QP_b^Xd))(4J)w~&IDbNgVokuL74iU9ngjyObv1mTDxubbvb8%0tW8jLvtLN7${X)ZfdIyAd0o0Qd zQO^aahYo{rV7G;P&X9tuKvpwX^8SEUCVR+$qZJ%R2KRR+VmSa1KDjBny-(!7b>KT;Bi+`mAT zezsv{y#qoqpwa$3TW|mB)t59S$&r+tBzKM!1S0GExk^9Nu)ZDvp%l>QadHOg%kL{^ zZegGPVx4&6&_sBIkyteA@7kg1IOo&fjJ0gr!nz8;~nt{@nzsKD>)z*`8PTbf2h(=;XIT} z{BaFp{dst*e#w0%#pT2~;^N~(!CeDlVLxvv$qmSb`zERDB^qd) zw2ng#L*YqYWat_*2=2K$Y%NjoDK9V^hog~YW8YNjA2+sa%oJlW#am1<(WV%&Y%D)8 z3rjF}itt+TwJ5=CtLi(p7}j{tg_Vp0!7`)JA~3lvrYQJ~Gr6n49oK-sOf16`R@jl= zQ{wfnD)nP>sV+Phf`z(mO_rV}OGlHXi^)Qd05dVlELQIN17dYQtTAa|Xc-=@e2E2> zLrcQV5%$#MO_tUsOA3C9t^R;q>u>H5u|LP;{)F>~cE@5dfeCR-tjPj_}pLClIhBpI7QfHOnQUCmXax>`pYhn8q%)!cUQ= zS3qb1z+a?KlB2RM!xtDWGHL9hmtC9>8~g#GBLIIX5$$P#tFb-NY>(K)19CNgBej1h3lNz@wZCj( zZ))siH+xw`_YBBI{HFK@UZ&#pgO&ORnxzDczlznCrYN>6k?o4ZPZ60DkSq7iDG^if z16ggj&%`>`UG3N|`1G({qRX-a;nn+i+=SP$z7M&K;LC2m8dvc0{oqq9;-UVl_Wp zYa>@g?XT4L;fkpIfLOZ^mmIi&G-&QVSP?a>e?F|V4VkbW+aFi{f+JS8-NBx0$(|I8 zH&Oz$kUz4XcPjP0RL_vVt7k9N0}s6WkBO}3VJmyw!5(hO9u~_M(gI?&KI~6?{qOLw z?BeZ8{VlB&mi3y&M@m4f$!~PW_lSgIDOk6FTz@aFwGDRsEocyYO~oHc>>r@<>tO$g zV*d~`qIEzlzK4=y8#EzSf3s459ZK$MhIeW}EV_?O22K~=kjXM7C*tJ)wT()T_ z+vH%ITx^plwIGl$bF>@Wurpq%yRxE>NE}|V*{g4Zr5v!Df<2hU9!z5oc4H5U6%{D~ zKbG8xQs-{5I38Av-<}f4`@1wRi!`v{dW~j&p1ontWnh2)C9q!T)n;kqwSii1ElX<; z&%hHjmu7ODcbtOf-yeb9yq6u@91l9~aNOXy#<2v}{}+M{fPs!2M;Aw`BhldmZGf}( z2-yz5G>-k&AH}6 zbB*~C^DWlPtz*p>!Pop@gC=s)DUySv-DTezd$7Vv9u z+V!RDBiGxmU9N4`m#t5MU4+|R*SRWTox?QOK=5wR%w=)@3U(5{bbjP~+quiR&AG{W zhjXp72JV@ZIHx&BJNr9zXD4ThGv4X22Eg{;C)R!1S@3x9toDd@53EO6p)Iy91bcrI z;7L3OU5V$x8en_yM$pt61J?h{mW!6Na7X1U%Mr^5;FsW4wEVXjZ2#S8Sz%dXDX~nk z42Q)snU+*byv3&erT(J+1bzy>P(N1RRo_xyR-Xl3jDM*2skf^)sMmtGf+gw#u*^`X z7N{fDfoh)ef%1jgS&dVzupZ=;uy9(k0Q}aLlvS;=zQN*3$_tkWB@%v>Fu_?;4(As$ zUTuoz6)u=F2b|p%!ZILGK?KLUSAsL*v6=tZ6zDV8Crnmp-XDnTjohwNtZ-%jeFn8z>ZZYs0A*PW!B3#6t}u%9Ib7DlEo>=dSX&N9vX~ zS6Hns5%!mzxnVIUB!aO?BZ1a2B-*0FqD_im&bxeQNE~=wSX>wqdsBjW#ifaNHE85? z-Y}wj!w4s1=9-dnw7I&hkFefdQr-u?;xEg?Ju2@%zpUa472Q6Rl!G!VIFL|0ayVtk z{H-wL3)_lH!L0z;0_bmez^+6Oy|`so@w|D(v(0cj(b}`5JR5GmMnjgKa62FQ1rZ)M zU>I(vBX1;LO`J=dMjT6o+qfcq4|r^VJV}JdAsF69gxlm8zKS@DID*KDaQhR}!R=?k z?%xtu5zDay$`<#?pFMkFhuiCh+V8Fx0)OIg#1q7Ch@TM;OQtU%mPodJkqCE~MR{#Cu#wxV1irC>9^L%P&vEx; zsD+ZFgr{C1m{S2`DzFx=Xg*lao%?TXU3aLJ(jW5*C+E;rl&ugf0Dxy;;gNnF8rj9U zSkBhoDlG0AfsQgD6zW;+qPl@ObpxI22BKu3qyn5Puc%E|#u_IL<9s%+2wch2Nll*O z;IuaC-%o0mE3oEAZIcbN+(ulNN} zG_T)+C2)hYXf~RUZ}HOKZE5!M4FlNZz(*X2j*2G-XJR9}bZM<}@S z+^hD6<;zBg*9}c=t|{?w{LfjyYBIwjT#bxaxEdK^Tu7{bCM<3bi`!(C za~AZv&5%;thol%o0^0+4k%UUu+Ld^dsJ=C|O61v? zZFSEwO~`7z=XfTfy{!3>I5eIDcdayD4}sexu#Bh$2xLqST5LDN2Y!k zc_&;9$4{U!7V$%xhvSFDhvk+J)RFJ0Bgcg0rZ?7+udgH5){*P9xoLZOvWI#L!BL2? z&RIG1fEk>;UZp zw?rlD>V?+S3uV*`g};PX4U*rcp@^#dkT@$fEc(J?i?FDM#F>AD#q%MtaCKO`A}mf1 zi<3g)^pRnazR^Q-rVk9oPCF46zY2?=hsBz(SQ!!v-VTZ5{|t-2g~XA^!y;T1=!XmM z6B1*mg~guY#)xV=!rZ?&e{>uN;a{(R^}xS+;9ouPuO9eU5B#eK{vYmv6}B2?F*{bd zST(Hq^DD3`uJG=pGnN8(3PTaqcK9B^d?poQd{K;O4bPP7FY z0U3o1C8$Dzf7Q>J1tp(|_eU`&tJa_rv0sc;&oe`!D3w+F&8(W49niig)<@*@Rma&O z>rHkjy0x9Ps>TeEg|SunqD=WR-w!%{*dhyC51BLU8&wRdQ6{@6#~KW345^yDAbgKkoGk>oSW8j)Y|_3dY0-Z5DmfM}>{%xy&rG znyTRgHkg@au2z}dWQC@%B(XDodsG`$4C5$^_#X5>m2pW(JS)eECtZC;n=as+y^}ejl_;)Da8s zYR2-Rx&4^k-Wn=2sW24B7H@oUuj*sVMWU-eX}^9&^u~T{E$io>y1|v-4@@Sp8LL&3 ze^ADj>)ZD+nU@dd>Ry8ol@N@3M%wfL!~~|51(*g zz#dk^pou7P>_oBZrlVGwSv#hwE6iqfeXwhqpIOC0XEv{DlIBQJ>@hHGkiN|ZYZHf= z-8nakWjY+uN=@o=mz}Bo4*UFvJD67aeCwe!e{1uDj@G-Q?9e1jR8-d)>wRn^#Ix4^ zR#CpFYR3F5V_EkfK%e=x`g$F_vY{!Gj1LKP?zkLv6Go%a!iGLUZlb$hJ)CYF3J-!WRHsSVLBDUCTJpKlObHq?0yhM zln?5&*T9?k)5RyeV&Dy9F9OvNW${B;oSQ&XSIUN$>%b616V+?a8*{dO|3jOF; zp@;oUP4_`!kx9%k@rtTh4kr;1RQoFEZa6F%o`#_jviBL(>WbRvgG^?V70QK@9Iaui z=nPRvHMk*{=RLFC=kl`^)=E4ODxpGuD^{)Ir9m`6W$Ca_KFH?xLq_N7_Cc7%iEgTa zpm;$+rnspL)~v80{`IgQYPBVWvA!_zSvF>XC^3R&QGvgjRa;m(oDov0O>5vR+An)X zM~!8OE@%0Jies`?n4m{h2K!L$?*q)puigV;JF9-GPh2!iI`fS~Qk<O!HTZ_!N^FdSUm8ej-q9 zvJYwn{bgRw>?_2f4%_;~+{*?tcH1D9&sNy&-8QP420N^7-ECfVe{_w{;fIW>X~@Q# z{TdT8W4FLN4j!08k*?jMyVr|-7G2&4RK%GmrYlq7VISsYrcrD;R23yYVINW$6w^nX zjiRCc)-duga;(~JzXtZt2a$cCq1DW#GR-sBG)M8Xe~!-l|6OgLze%-@5$`9dpS=;!~}HS<@2KK@eB$T#%!2Zc5Btx2GF zZwJl$3!r;{6149ROZ|J)yWc{Z_p2;I_r46Z?kp$EScZraTKm#w1lR$nqsMv7HA?GXKBQI6HLtdi51AN$CtiXeJ;4B56 zJ_Bbe$B{(}JcWkv6y{oyOGx^cOh3RcOvI0cOWlOHX!>bwZ4ftc*h*QpO@bRK_6RS4JcEE2EGl%1GoCWdyQ78IByK z3`2HNh9WyELy)R67-?1pA(=8zQ2$dIfc#zQkG!b#Ltaq&BF`&*kU=G1FymFljeJFM zA$KcIbkWZWcLT)$z ziG0fZ2XdSFcjQ*{Z^$Rj7m-hxe?>lSzJPqp{0s6?^LgYW=5xr0%|YZAa{&1d^I7C( z^UuhK%x91fntwt*VEz$#zxgzBqxlEqedbfhd(Gb??=gReTxULsTxrVYA56dwIlK}wFB}}wLP*(ZHFvW(~*>vwJ9=HZG!ZvNywIJBC@%ffNZM9 zBa_rPWP%!tj8kKfF={k2N{vE#R4>w{dXSom^F%+Z_(fPhqu}`HKPosr`e_BnM?aASnPbfG(`aT86N8hX9_~>sbI6nI83XYHds)FOA->=~K=tT;S zPxloHj!*aH3XV_rY6Zt9>m~)qCu_Zeg5#4}so?lzUZvppWG+;2d@?UraC|ZsC^$Zu^A#MQ z%y|lqPv&I`j!$Nhg5#4pUBU6m?4;oMWTq=PKA9~Q9G}eQ3XV_49tFoI<1GcpC*w^8 z$0y?r1;;1jbp^*K<2A(tKkwJ~%~BVNap{|>UXJXdmLWT-3y>YuQe>JsADODoLnf=2 zA)Bk0B9qh-WV|{T8LeJ|^r&-?np%vssk4!aIt$6vnSyvz|F*J{^f zR}<&=u%>;vbEvbO_OtdX*v=cR#W=nOTXj-OX zTv60J2>LLhh_(?$43NrN1N;s-$i6c{czaVJJKr*EX`k@kqW7#a84-mH3t|7zh09{F1-f8iuW_J3Vz%U4`o-lp$rqb@20@cX6caX`Y!uT!R1B=Xhy4>d zds*@vyxK5i#9@pko6$O^LDf zaysI9U&z@jrW~T3hFRus*X57cUv=a;cV1TB;{i#Pte- z`i-ctZT$*O@jM^0=8>)(XfGHQr!~)No(^wVQdLrs8w4F2ksY*N=_Q9Tp8I8X(I1OS z%S$dPEuM`Y4otDlQ=9wXEwZr(J+Il z`Uv+oJO}PdD)o9Hw!aN#gy@0JLGYXb*&GpS+nlrNz9Ym`p1siRb=%w?w^#w%F{q0S zFgH-oJ8Wh)p6jeS74G5720EjiLg*aKmdR!Lb(3eym4$1yk{)~cg>~poHe#+e%ZY6 zsV}V)@6;LI=2BSTo)hc_I%7h`FSA||j%eOZ6j4$JdXwNd)98Jn8y(XrwNop2my~4( zg;NMeFA@uy{{T~u0JnuzQh6doWTU;l>Y z0C<;Wjdbzw{E1*kX85RK{l|7_*TK=DbqCSec|qX?0!k4Vn)E@<Fn0&YJqs50hYM(^kO&I#ZKIn+r$vioJ%a7Aq)3-by!|pU z>rf-NOC6U>?&j#Lse7=UY(j(&CEjjXV?LCeEu82VDVQ$vMb7hd$_H~cS`%qAgKcRy zBc@ZQ$HHr)U;9$pv?}BBEU|?eEG@gFMpjl0DikgpR>BGHv7(Zv$!JtTYpJ z@WG{1oK47`f~{q8Y4@V;Ij1!whjA$ui*muOQ@lk4{J~V2KGM)pDj1^pTSG@#sacM! zlq_lJs1+0eQ#!(O32#*e4%-`8F6k9aku^pdI!X~%HX1W@)U9gek0iUweUVTBQqgWXy+ye$$LYDNfX|@3LM*mp`)Pi&LF09#I7`>l0$}$ zGMZ*MGU78t!5xFbCqtvd)3k~=Y1sZA!6ven2t!A_3DnZS&{3C`T^wB!yP%&p*HXA7nX zLq|Lw>I)wT4GkT2YS+mDmmhg32v-Y@c4b@@k8N0GPB2#PVuYb19vj|8aYTfCb9GGZ z=;+wIquf7otq{3?F;zUeVP(C8!jD3u{TW?v|LWD(Aq}oK$sOd*kxzxl`l711w_$xf zg2I;q)E9Z2c%i-qhK|~|Z0~5F*k0K6=olmy3X%1As<^vhJ>7%SVM3(gFz&8f4;ngZ z2aZMCCA1UObPtlRgvfd5f_(K29i=CwJJJ)<(a=#)I75Ijj+}?iDz4!?)a0H=&O@z! z$$ciZZQ9n+Hoh$yItn^uwg^K<+yU9@7&=OePjjTjrlFyup#AS!W3S>iVdyAmlf_0D zI^woE#rB!hCb5m9O-vg!bQHA8JdtB(g**)m9kp)K+R-|(H5xh!T4ct^Z_F0RC=M-Q z=m>sWIZ~ri#n}f|44I16!whV_{}Y~?{&SxH|8v$d{A-l~+|&6FtupxMJpcdatYt86 zPKo@*F>h4Dui{zyrv${4DZk{xk9nKZE><|AhRJ z|A;)zPa}WeKOj%>Q^@c6_sH+~cgU0cB=TGSE%F3EfjrKSBfsI_Aiw5cBfsKbA;08b zB9HN7$S?R8$j|xb$fNuy@-zM!@>8;#e1spt@F!$H`7l3>;g89V@*#c*!w-<1-uwCe z7~aS?BJU%6y!Y~ZF?-Ed+#Lsy?2nE-VM^P0l%H>_1;GIdT%BBytk0u z-kZs8?@jzBEdNG+BXT|2<-I}L<>l+h@4{NL=evfl!F1R2>yg)yUEkGwHHKG_--m0Z zUjtrC{vTHImAHKcUxB=a{7Eb)KM*y%2IH%FHFBBsYrw0>zeFYZo4A@^joYu{S0TY$ zB=QRKYp|3r#qbio1i6^}8Z6?AFkHbakmcmpU?Io*{ov;S@AvaE@@uew{2G*Uyx-5~ zbG+Zr=aFB7%Q)We=a-USgA$JS`}tgs_xt%JI;CR2E4<|ng!-N$FI1dcv zc)y&RgZDso=iQN6lv?}p*7yel%3 z{4-?m3=DVSU67r5XC&NwLU!aGksWvkWP9Eo*^akErt@@UTizC##?z2(cpD^m`$nen zRAeji2a&>4Fzh405Xn3l!!5}_L<`;m!_CQ0L^IwD!%fLwL=)Zw!%5^fB9SLzIDz~} z#PfIz$B`e2SRRYv81g3(&7(0KMSdl~I1z@y{1DR3-AEUAA)VxJLgN~S9o&Jmlm7`D z$LkEYa=gxf?<)&#SGkH*$UlXd<8_9cq@N1TI1}6TzsO(3pE_P=^gqaN#qav>xcxWs zUvW{th~Zz!kHrNYuQU2D-~j@KFe9Qm~f>Uf>e1LWW0tbP{r|4e=^&ggiZ(SIU; z7eDGh;`Y-zUT5?l$p6JD{S?N3uj6$_|Bn1&oYe6;qkpU8bw)p-<8?+qt{=zr-;lqI zugPD=SL83_OY)a-jQnMMLH;s6Cx017$zR52@|SUh{AGMX{xS}ezl@K;{-&58 zACbNO5BY}}KFALuKOp=4@ALOD{2qS~`7VDKd4TNt@8|n5ypQbrzr)|b@Lsa-|2BUc z!+ZE1?F`7`-|{F%H@{!HG}aeVZ5bsQh?b8kWReu%3ujn{F`feS^M}Jv=8RK8l zaeVY$PyKmjF>q5Z`r}dZlk$lE2!Kl>wksp-6i8tM%2$Rr)IAwfeQlTJq1blKiu*&{tsmHTpHk<@$1D4LAT4 z{aUS8BbVvRkX3pWvQn=^Uaen^yh^_cc_sOExq|$c>WA^Cf`T)$jX?ljFZpJ3L@tTU~Xzz^I&Yj10JYe#D;JX4AWk8Xci&Rb4fzOj4? z7U$l!?6y2>dBU;@EY96*xz78G_ebw>@EmZ^yVv^)_z!r}yBRF;-QvC8yWD#P`1-p9 zJPM5W4)gYf3tlF8`b+jEc->yr^PA_a=R5H8_p#@I=MB$`p6#ATJokf_zZ*QYo=Q)J z=Q8C+@DjI7S**-gW-C*`?%!a=uk=(pD{YkKO01%R=YR|5pUfvLHL%8gfn|()zi!q>v4J%_iyfi`;_}@_orYZ@E!MS?ibwK z-H*B-bl>H^*?qnH8uwN1a`$EKS?($BvF@SnzU~}%H+Khjs=Jvx*6nmFuHRe%*D2T6 zu1{SDUGKPFbG_i&?t0YqpzAKz&93WR*SM~7mAfu;&2mj~jdcxm^>yXAy16>IQo){J ztjpou4`nI^S`==6u1q-T8>~e(+*8x;G=A7xA1U~ErI(s|2 zJ3Bg4olW5(r(OF?JFlJAzR^C_KG5C<--pj?PiUL9d$rrNby}@fr7hMN& z*0uR)2Cs)dI=*on0iTC&I$m@<1s)IYb==~(4*VT1cFc3k1aF5U9R1*nNrofM(cBT^ zu-pH%2kqa3Z^J|OefC$ux8W1^hwOKPCPl6NYWqU)a5&vQ&OQW`S9;hx+FRL^>>j%c zD@D%OPS`%PeE=Q}U$Q-Idjzy6ZnLeiEeEfLrMB6&$>7s)fUTFUD|j?)36D@T@Mn15 z`h)c=@Md_x`nvUb@MXB!dbjl^@LyPEtx&!PZG=P0KIK*LEck@-kaDN|oo)x^Cnby3 zE;WQDhH$wdlp4Z(Lzrg>ml;BdA5PT$DekU1=xfB}8A1<3Fotr4(}+9S=$0Na8#+9RdcHTGsmdP7RPHTGIa zdNm}yBBd9>XnII`DJ1QZ($gAyCM4~U(o=4*zb($T>b zF~=4sdyFKFJsOf82}uu2X_E$quQ3Nmo2B%i#vYQ=MvdJsrF%7YpOo&>*gYZXZYkZa zu{%T39U*Chly1@3Z6WDaDcz{Cn?uq~Qo2E7>!q|tW9veayw0%I8oOS`fpndeR%&cj zNV+y8)k80H=Hz^PnL-Un{K57BWN2M0V1;5IZB=X&s3j zi0zSSS~{^UGF59sY>o73t%xbemRd5hnbv~X9GR#!B{m@@A>*_JVmvZ7A)DBp*p1kg zm_h7BY)4EZrV@R`mc(YnL}DB=T8lw?wJ4-h^AO!c7t*e2LG7q5KN5Z*9^SHyzJzU*PzE&LuCKmUCP5+r->-SIdOXdmYIMauw z^`_ybR_r@y#^1kk&%rtqScq(oPk|pp_=k%QA%&zWCQXIXs$JJO0BNybkz zY^vyS4%VB9{IDj!Zhlx_x(4&t$*i#>vBrNz`Z-u|A~M3de8?!?a+Rr@Uk@3tb+RL= z>bIG!DB&kkm>gSkF% zG*Bl+uW=p4;P&QR^iXjROsa?kx#wWLi>N2^pjavDi8v?@wqgg9nfRoGLY4U=4~i9- zzurM{FqY9j928(!Q&b#zP+S8UmpR$N3G5(#bUA0nq$YQ==z`FSPm`N3hose-C3HM= zVTXFKL*{PhOq2s1BZYD}+`LBSsDA(?u|uudq1cM3)f8?kygZ$IY_C`kiAp6+PK1^aCic!xFf)7d2DJgDa)bY3h{f;Uq;VKt8k0`8| zQaUY#9ca%E$WIZQ8LX69y$zfid3hydz1ky|fBV1^%>j?`Uz#2S$C8bY!PTNVCp+L} z2k@h35S&RuQZuZJf=}^h9MMqb_NOrMDYj(>!M~&^Aac*HfC83=_H4h0(Ld}NIGJpG&z6cxoov6C?Z=Ov zL2xJ8_?|6kxM%yb*#0E8Kbh?pd)6xmo+U*k?IQMUG32bMzh~{6vwiK@KKUv3D?JEK zB^z(!B9Yz6_GxS%e)J52L&?V5Sb=R!3itlLPHbN++t-xs6K(7fESHtEh-hOuY+P_>qL9rjhk025145 zilkj^;OpxOc{-NPSqhk?&lTBiqvsc0Ry;0~ zPTQH{3Jit-ceG+Vnz9|qY=_v~C3uM}#ErdF_Z)r+6f#GPrtDpPX{qe#4(#c^!8tNV zO8tI?YUjvm!BJLUdEG2uG;3BdsGNy+JI56+TBME3M7C}O7F zHhaNm&IZaUbuG`1~@ZA)O= zL{x6Dh-$?vYTdJW5oDZEuhuDDrzNtjt=ZP*Y^#rL6%}_2&XD=zBPyODD;B%!U|ZAJ z)+n|$mTeW`Uco}lWrhXI4Zal>LN0NAgy{jJYJ9PQqw!5Udn}$kCgQsV!Ske;$e^>* zAp3O4J}pL>4Jtt;^Vk-X&&jq#u`MFpJva?=!7Ax;`Z(F9IJQZ| zRb8a z`j2HdcV#z6v70m4&7!>YAo!q!QE@b>?{^NqvP^_gDbT>XP5FXS@!2Z~-X=xWog%6( zXi#$7r%!L_2@GL2E$S*pf=?}GxlQ|5RJ#2L>TP*@z zf@A-#lCd(&EUDGVR>iPYLe30=AIZjdWsJ-rG#OE=kzE_dt`(uq!O@ThI=W3nM~{Y% z9z`8J7QM`f?#>Q^&q%05bT?@t8b|P`#=5&|M3ti|sY-Np*WgH*HFC-Q$oi9JapGd< z;<&{kQ*IDkL5lh!)t*K)sBci=;1PX?jqlgLUqy0-qoPHH$gc;7%N`)E0>EK!{_07|UbRE(e-e#eS*DE+o=8aUk9EN!t)w&##I;0i6OUm@%P;9zGXkE&e z(N#l1Up+rU>vBle5bKbrAw{5eDH5icS}^Yi-a9N-^i;R1O_YV^7feAY?Ef#X znz6OzU_$wtHvCuPVxQ()oY~Q5T)QFEH5BRwp>Cm27KE}wq3#gs9t!n

)ckCxm*2 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�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%0DjNoze7J9-=QClA@sxXO<|bFe}n!v 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 TcWl&wy0Y; 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

    +`S_Y(8hKiV-0{hFTOPV|KW*7V{ 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

      `1mhTObnPK|FKtZs>Ky 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%0Diz0pNN;(pp2C3~5Rla}=x-1eSj_=BRY!YLHPO^M z4ks|7Afc$(D}pOdL>Eff*8{}th+_^cr4(IADLA4+uK3*m4r>tkTyzsKlGOW1_kmJS zx=ImS);QM#=-Cke6_!siA>a%Hb9qqJfV*cNn0}3*S**uHkH?hE+MEJT_2TFU(E+E= zNhd{gz}69dF~V#%Hm7iON3elloC`LKwIv(|$60ow1LhfUyUeR%D-v=ZOCC7o3muV= zpP(*-R8Qpdp%kFsc>oqLW#HE|)GW~J5Km4SoYRF`g~(^%P__%12apbPW9p(T zu+xRjYF4TgaKb>x1OQi@tbvk~xn1m!K`F)Z2+p1xblL&|P!=5NVVNH1mv9=G^_Lk2 zOmrF^Y%~&6@G~mtmxyLKY7OZ|9Q46YC!nvSPOCz)pr2&{VnZMD2CFu)k*B+mZs3Ze z|G2c4g+~ag*xh5n0@4vgGZy6W^CbE)5mgh1_;EgpHO@W`b6|Wj`5;^>kW&zV^lqRq zPk1;&Lx)kw6~_ypnWU}^(MZFvr?$W`j3UBQx@Divp|I|VBtIQL6oV^%gT!p|Ro@hbS-s zv7*m}(65-RFv7&B;`bgzCJGl&&q@%4*7UGE0=I|4QG2;T}kKaZNx)j&_Zb%4$lMP%rzE0R>k61Qqa@0KB$0S z4M4BW6lSp_T+MV6{?zz#ZXaf}2xL7z;c5NkVbAQmT=pmL={UK9-qTFi+w zx-q$^7?C{7LGc4h5czy`Q%p!iR2;*?fqPc9Kp9#za84YqP)a~^!J?muAJbLD@FI@Y zpd(Sq>=GtK=;i_O!!c|gv%Z*ql7?U8Q7u4c4SO6M0D2t@3LA<>3O{j30jeXY8~I!T zj{ein(>P-~Wbd-p1#1xWq^#S(&z|TQ9`zEeQ{Z@5OAl>+!S{K;1KL~6uBpk!x#F>SbLI7~??U{?WxFA)j@ zNTodlKpbYkgvshO3)2r&eLTzAP^dvYiU0*Lb%ly502*K)Z3I`y!cYY8ITM`oQ*a=M z2t~i~gU*U4{(=sbo6riNiLlkcvmClkS^NqI+ASJVj%f$K0cCwL&PL*gsH{W75H-s< z!GkO;Ofb-m5~1)D85L&~sG7RX+z}HBT2L29tl$d$0lEQiQD~$I2MfmXe=PEbl=)lg z?c{5*cK|>8`-}pgQQ-dy1-930n+*YaM>;f{s+5;PQX(u#5hK>*zRBt;{Ojzb9eML?S` z#zV+{M*`QXglikaJ6pmDL9m|Pq0j|Ht5n{;IpV%AFGpTk0OW)#i{ zO|CL*NosDEqMJ^6aL#_;J0OU)B@(CxBu*xhQQo+|vVmL&M;+ksi>5=Iu>mr(b+zQ;&3cZ_gb)(wpDd9Y*sY zbA)_y+Xa5#tY!sCPVf?g-n-}1%g`>;?&j@FkG$*Mos%qdk=?^XwO1T*T+cUO508^V ziO13jJe+eyer}=$h3w2%$^Xs?zS7zLU>eurglTvr-zoXxBLp9o>?a6zQSfT8z-Elx_0-L~p)! zUIY*8NM0zK54TN_9%*XM_q0gprP4^0DRDENNeVTBUQ+(D=4L9cmXKl?!rQ}={B&(t z8XT(Kk+=%Q?%4r4OFi2|Q<^{*P_9>sOCWw2anR*Jj#^B!&CXOndzEdi+Bv6nL7X%KyQV+!enjk{uDLbjTM|=a( z0eJ3g20*mnlSc{g70ES`*(0Gdaa?3Vp<2kbnG*n+>C1NVz+awCHV7`2w)IA7u0e9W z$+6LVyb-e>rvl%_l&6G#LetDGwav9HmjQwfAqhPxv<Q$au`Jki_a)zpXlpEo@lcm8XReqs9v0Kg$s0hs+U$zn#!M zUgU}~)k9t3pno855R4P8hN3E>!ujfVUN!J#Z=fg@xTWfkK}_X@L3P3(I&`H*pkWww zLQR_K!7?;$VyvV@mCFbt8~Cjq8?F=N+6TG6z-9B4T4h-zEMvIr9ce&LwCi(g*zc7 zW&|c+7Q(E_DPdHGmQrs*pQ0+EE94ne$V-8c?mmB%BnGntB9QAiGU$&ZAUMUKzvjLD zmcRE@>(GPBNl}_UDu3t-MbQ*28Z=l)!8b~e|3WmsR7idorKBxH5QMIkwl%}JA^#6?2FoJsR` z(Gw6eFU5DEaA=2+bO!=cM-Au~<*tDGCBM^*Knc(<&s{-9Ov*Am5BK&Fn^yUsK=;F( zB;A7i4oOIji5;RVU`ES79SS`}M5RA;1t~O+A&dliRFu+Po!~l_M`iZjN+D4vWa) z=fXFIyTUEu#?Ws=w}#FM%@3udr%@d7hs$f}2FmIsh!{_m8_%U7?kAyH^%1)FaINQz z44;~?s~4c-1mya=*pM%%Cv!zdmeC!m`p5wHKni+>B^1s5+i4r`=Xs2klViCE+N z<@OQ9qI+Ivk};!gXv0tfh2Fj{5oKDxD1W6W6>`k%T8rmHX0$a7Zy*<3v|G7Kvj0W9 zAMP8?Z$E2B+mOZ~6sf7VPuwOM5f2>fy-jkE`vD?>XX*002WJPv#A68Sxm*$4)r}_F z8+M5Mz6k62XKwHZ)ea&XR|R*7;G_Ble@_J8(7qa%v(9L%A5>59klwy_5rZy1-amtP zMT~Ad4>O|;H@6c&jn|3r{b~D`O5xAxn%Ry0|E?KrwGFjh_=ek+*NRBup3Z%1@y z_wvqYOAkuZ6}^bjHc*T|R%3W;S35J>QiD<;_S)&aeXB%_5&ek#hakr4ju~xoJzwCA z9$Xd?#`KHumWZ&vyA5yrp&^rllZ26nKTsaO7g5S?d-q!0_gtSKgb3b15q>8k_??~Y zC{#^-4I$Lq6%qPV>bD|-x0;S!%xH@biW9^$5)NWua-pkT#pSLvD@vGT-VBx8H*mG< zg7&jc=(N}4JV+>f+Uc3ohMu++g9QWM=9mY$+4T*?{Apotywl{<@E?)R#x>6?Iacz3 zYjyD^!t03jicAk59B?=BoR(u+j>0EGehYg0T15&&i!>$DAD0*@yv8Y%>F!-|s%77V za8dI3mRT((K4A)i3FUN=(4hTqImX5FuW~{tFzP_JJr8Tiw~WRIF1XG7G>#UUKITA* zy+ZYF2;&JTkKQ3#(XpKSC7x&L-q4i~gL z6QLj==qVzh{sjFEC$#sGiQtapro*kn4Se{O3DDu>f#~oOr?8g}qYs~W_;`Haazt<6 zNrDc=esp+I(BT9;WmI|KXhjDRWcfMmZa|E~=OqpwdHC4~17e&w5HVgrQqTPl#27wX zojo0&DltwNh#0@-gbqTC3A6NBDn3$P@)kWNR(T6F12+N36Y zqT~ZYE*J6pkBwh({DFJb_=&S7n)p-+xlAO~zgPW|6FLYXr%#wOVHQ4BLLMhl=s&ui z;S}}~a{Pp;6PoZLm)^dm94%DnN64oU?WYa%S~~jot12lcSh)#fCwLuacTVc z!1G6;jQbQ4dR(3{V}>$98xg@97E46PVN=9(vUfsxl0%j|I@j6V`(N}ua>VozP56Y# z6YX}4NTUBkEl+R~tJ}*R#BwcWu8XD=dBm_0_4tqv=F-KY)`JeXgny9xIM+Iih?UFL zM~sV)NQ^*QVA+lqvBvb9yMKXLk74enQMVZUS}5E&EY&!uaVs7*!&-k7$4iJ+f@b~d zoc|c*R;b2mOf=#@qTqh*z9U6mBl_j_bHsTRd5OA(!b2L8Lvlm5qJ&tF7Kxk$>#}c7 zk8(~T&XD*J{6~aUR&U=CBA?0q^65j2J;;ZepU&S=DMR7HCB3q+nX`{nsF#CrsJF2e&`9qZ=eD1TR%$TwFzC^tU0wbO1# znOj7@f_2_E-$yv#17qiEbNG*_9-d#AFY=z&FYkvD_aWrHoY=?q?$!2Mk#jmzmmZVe z+U1{#)q9@ESuo%G=KK)nynozuHjV#?xB=|TT#@gPe)&F#n7fhhg7&jQ;UwM&PbO)> zpW55kEHV>J@!re^xw|a(N`oj?#96m8r6n1YX`)Q~YNG~-jQ#Exp6;Ayy z5u-n+{y?a-m%*ph+hUC|iUiuv;X);cjNv@0*5XMQRM-Qb0z z7mmOuOs-h?4z0u;x?fzplyHAFuFFpY$P4QhX7NEZ7yR{XQO+U54y@UIA*&(0&c@Ri z{Ghe`m%2+euNlz%i^(|lv!(1In05| z@k0(w7aOlD#;4e)gPf zN7m1tl07baM0QTLke!kplO3E*Mm9#)MV!b9k;Rd@cz1qUR?2*wc_;H`=7r3YnMX4B zW^T{in7Jl%S>}SwmP}`+EpvKiMdqkXbH>aZk{Oq2%w#js^uN*{rQc4!k$xflWc0{r zefp8~z3DsBH>a;nUyiZktxwA97JKNF= zp@b5uKmci>NN-X?s5S!3-H^bN#3TezDJvF4QS9)sf%;MG*s+2IP0){GLBWb0J9g~P zx#ygnB)j-|J+IgEd!Exq*&>+(3%EAM9ZGhyOeGTK90b zNB_hBh5sY}JO2Itm;BHBcl#gl-{-%>f3yEO|5g4={OkQO{~7*Tf7BoG&-2gm7yBpr zNBN8Vef?eiZT%U3%kKj1$5+;e)&c7!>sjkjYln4l!8 zS-q@IRx2w7dXPVS-}?^x-t)cg+w0rydkA()^}w1$>(KXYZHZL$JT%UhgjN1K!)b*LyGbuJ^8TFLRf=XS%z(+vwlHdX2aBefl2v z75bz4J^Ic17H^GvvA5hi&pXpQ$vaZNSYPKI=rK;o0W7+OyHK&a=`}<%xJs@l5xO_YCv&^K|pH^JIGb9?ks4{M!7;JZQdb?lB)T z?=^2VuQM+GEOsQ7!!>XjQ&OsqrH)B1P$H&tNUB`C+@f1uehIgKjFULeVh9R zQUd+|=G%geP3mDode_D~o9G=)bZZm6p@|M`q63;}w^n7S1!-j92&<#7A=mUz@FRxqS+VHO?dNtCz73HoCS2dlR(?l`e z`sE9vt_yy1#4dQv5xd}3=iCdLQg%TVh1OKME;zpFgnlTd(r`g8RJ3n7Y?o8*9KNux z+94Oiw#3l}8r!-hI+h{K8;cD%!SJFJ((x;U)8!!jL~;jnmV^os>Gz2jI$B(67T1qL}6vMnU@ojb*s0=*$U3DtQ+@zJZ#(%hdt%6T@K@z zL1MiV7Iv87Fixqg8~a;4Y^-yQv7b9(pE>LUhrR8v{SNz&!}d7r8HYXLutywrU!0Ay z<80)gaW>q^d9NGeVX5cGnf4Ph*fYEHLk_#2nOzwVvn!Xz!*}Q4{^JiDHKd-C@)fyUYoVUFy)aO^IB4c~j_R zR3g#nYN{}ZU^U&iz*bT513Qx{Td}9(5@#M4XUku57&T-#Z%M0o*pl2hTYR&_W;kqe zoK1StVN{C{%fyf3VPj552P0ao~R{Jh?Dt3z1t-A-7KIBQ3@ z930Jct`X`GKN@P!%$`d()q;w;d7N`#91Ae&0^#UsbQ>!6I>`dN!C{NzY*u-k4R+2m zZ;OYSbQ3@_iEGh<$dxGA{OSqW$IzEynYKp?S%-{PZHcia0kIH1ltI1 zK$!3x!Px};5XSvP@Cm`I1TPRgOK?BIH3XLt(ACFLWMlupz_D)<>_TWiU$sDd=$|`M z<*6PPOLoJOR;){&SI^Yy>+5RpCa$lqjJVdKL_Iw3&%+L-9%vChvg%<1Wz9txi(sBl~p(`C-QJa4$vx?!KI2%SOs9RCdZg4!TU0kA~T_-0DTN}hz(avbU0W5c zyx(EiVb-fKY)OhO{hp3S>gHgZs)yOIIrHLSv-dgdMP@Z!;u4iz|KhMn=Xc}G#Cxc| zrrPfF28IFaZDIw~L~31UPi&&tqt@3%PVe^#of$d358ihW7VV0U4aGV?$4BjMR01^- zyBj`4;i%p9Gpuh=!<>aNtI_S+x0~o&C=8($RB4KBa>CAW*gA({m#;?26*W#6b}AUw z*9q(Fu!1<7gg2QwZ&F()EXQHll&qSF>pbiu>Z@xaC-8|?wXNRA+N>_$M%eL7JiTgJ zoooFxhn|n)*m@Ou?m~Wsl zaOY?rhfxz&=TR;d!;Tsy@DZR``pvto3sIM%9p~Mu;1EmU2KiDQhW`*4Zah7ncg?NS9|Ar^F1GV{_R=h>1MtQ?}k&& zbmKMSYNN!+g7>-g?&10$`hEH$y_I-NY!*{tu5Gur3g-G_Tqt=(@QLe!JB%h=NorT5dbqa@g7ZS@xqS;LckXt)rPE zP@wg7-89^F(_sA8)v*Dw23ESj&gjkeE!M)aFGb<(=HAtHQ}6hHQ3)6CL+YB`_AMlR znX(T_R+W`OpQ6@f4>(?J2cPY_slatpK7OlX!($DF7=;enzvdTrWy(T`qCoAus%GPy zNhjTPlkU1J&2>|z>n1f1HzC&08)HygbSA{m8)Fb%Ru?OSi787LRI8|(G|#&0dfm0n z@47zUb^U5Esu&k*=tUXI>(L@EEmQV_xVrQ1t&tiP*W`+&FgpfnNtj)9Z8^@hr89oJ z)dsJSubx~q35A*|dvZ*X%0+eM@r}7paBV)(wRs$VgI!4FqM@;d<0yuteZA#z6vM&= zwX~rxq@bT`^HA63!T2rIfr+t(9wZMlNzKazDyIj@|MOH*u4{9lYx8mVt{g(RyHUE@v@Bz&@op+AZ#wRf8>uNxC}iDr zMULx=6xS87zcrU}SBfd&_JNqXa!gpprSU@6U6-f2F1K8lr?@UxWejQQLNWAcSxXQ@ z7m5Mw7+~I9mexcTRa8}$;tUQHx9++u$90*{by>FSGIh$>SVL!usa=;Ar42E4rkKq4*V!W7qq>KG)T!#^dU14PpPmAzB+Ancy;P( z2nXprDww>MmKKnbJSrGZNhBJHcSukxEA%tHD?%$^3%~W!{QV#R3Q&9BarWX=o4p$CI5hm!(@a2wRWncF#1@KXmf*_tn;?OlUPcuA7 zvOqj7`N=-LbFnsWd-Z$2eLE`X4Zy_F*86@8H zL@(}*|3oERG@UQnzJ(M#Fw#jX>1keEP@E4R6%Li0hT`f;-u$A_MAASURPl*V@?!nu zwBpQS^%NfyYe+@uJu5ss5??Q`Hl^Pplz@GLhPHMo>$YDG*P{ zGRh>}9`L}NJZSPj_=qwvnYMN;nM!pX zltGAcL66B}WMXo`6n%2`WYv8`{RJsK=`Aw>_i9i@<4rG?eul*w{3;TB{Is0(mHwv3Ph$GVo#KI6S(SFUTP;dO zx1<}#f(ZUhHCoPSx9(KfsUv*UoOZuhgO7xv>u#O}Us(De3tr2pY&Mo0299*#UnN}A zi((?V>3P*PJ)+BuB^A|8W5{9psI+03!)hTAn!SgvnS85y;F|8FTeYy)&|U-JqpJZp zh?^vye5;xyo^Y$S@71$cSNI4O4(-+89JjnxA;$)ZJGW|fueSJ4<=6dB`E_%CTaKA~ z=|j?bW%g2c+NfBAPQv|@+NjRLG+u65PjH_d*Y7z0acz%N_Zc)%am;kXOM`%PyWl<> zH*xYRlgEJ{l&mn~fwsi7_}e?~ z4j&312=5Cwgm;H`hIfRwhqs0|hc|`Shu6Z|fa-90cz$?pxHvo^JR&?OTo~>e&JX8+ z8IL#Y3LOP&fWx6fp#!0Pp$4!A*csXp+8){(+8o*xS|3^qT7~LRd1!uUZm2jkAv7X1 zC{!5g8p;plgi=CYumm_7JQ6${JOs7?`+^O@-NBu~9l`Cvt-;M;53oMC7PJx7U=c7s zI5$`voB%cfgMx*@uEBh;3P=fhgRa2Qz>&b=z#*^;*yk^VnfiQxjz7ikg}M5p))DKl zbqHqb_gM|rZfhsZ*KfDBTAQs+Fk`>gT47aNDwv;CJAFHR+kIPM_I{IZy>G2=g|FII?wjwM>nrw6@Qr{u{6b$> zn2^cwrTDx)m-ndmi1#qe`>dp7&cvIlL!{s^ZIpR6&IpjG2D=Qj2yFEKSJ3QMxTRodSn>_11YdtGG z)t++Ce9v4@v1fv3glCYa(9_kE@5%9`cwm95dDJ{&9ySk|2h4qDgSp$>Y3?w$n_JDz z<|cE!xz=1^R-5JKd~>c@Y)&von1jqhv#SXU?aUO@Yr2f1#u4MNamYAe>@ymS-NsI1 zhq2w*YHT((8S9O;#tNg_C^zOCbB$tSf-%AvWE2`*jeIaqN-?~!DD38ft)}}z#DM+kNS`J z5Bm@K5BT@_8^Bg$r+Hvwsst5lmc9*;7yXV3Z>j|*XbCA0bY$)>GIqnp-+EzcRAJGr%hhS~W zKD|NTt?$%#=-c(J`euC-c*9%^!|`gpT%WJc)r<8B`iQvN%A*S*|B!zm{w{w<{7wFb z_^bRC@u)nC_>24n@n`un;!pA?#2@94h(E|55Wkl&%K-6yC%;2HB99<`E5AkjMt+0% zwfq|KEBO`Tm-0)*FXR`9pUck?56i=dpUKYuew@k99`;s^2r z#6$8B;`zk%6Adpk?$bBE#F3bOTLA8P{J$;oPR(bKzviaiTH+m1989H zkNCQL9q~2!8se++Rm4~1D~S8#KE#*h%ZM+@mk|FW|AY9Vd=c>l`2ylzxfk&&c@^T7 z@=C-jmA}>L_SYC{{QEo)MNM3|^p}Y`rgWQ04fxG~5 zy*PAbv*p={F&RT#E7u~fk!uiF%hiah!7b%?dH7O_UwAf7HyN353Bh*h!*u~Jqd zE|p6WqcV!PL@q&GEEgkI$O^=AS&q0!E*B3f;d@DMm$lTh&V}3LYyckB2JJK5XZ~$h~wlq#IbTL z;utvwakLzbI7*H}94SX4j*ue|Pmm`d4wu6bhsj}xL*-D!A#w;}kt{-l-JKC(hb+W_ zav&mjh(d&2kr2VpHzMq4jR=k)5y7byB5bmN*jx5S>?M04_LMylkCVqC_K-agyUXr~ z-DEe!uCgm)7uf}|v+Rsm0QybU4|I~95If3_h#h1H#P+g1V!q5rY$w|xwv}xW+sHPE ztz~P(Jeh~sO147GmAQyHpj=be$(GrOSuzVTQ)VJ&$PC1EnU0ty(-2c-Dq@OEK@7_< zVn~J%gEEL1kO4$Lyo{^sSkgiS^F2hb^dfqs2ho%!q9F}Lw{#=wQb!b0AZk)WgvI^} z?Z5565&yFPLi`inz*P7j_8*A9+rK0JX8(rxtNknDQTr(3FZM5pKifYe{$&4z_@n(J z;t%!@h~L}aBYtOphj_$3g7~fdE#f!!H;7-`Un72He}(v^{UzcT_7{ks+n*yIwhtqI zW`BnGsr@P9C-x_ZAKM=zeq?`y_@VtF;s^Ezh==S$i0|9)Bfe+9hxo4jF5)}(JBV-F zZzH~CzlC_vK8Se0K7jb9{U+iY_8W-%?frHW|`4HlR@h} zLHw8e7vdJV1#z?7jCi%YTA{ty-iz31WBu3-Hr9{*yp8o^KWAh8*n4cOANyGw>&Je^ z#`>|Jwy}Qfr);brd$*1CWAC!De(Wc0tRMRc8|%k@+{XH`AG5K3>_=^^ANvs->&M<{ zWBu3<+gLyLLpIir{h*EYV?SVH{n+>0SU>iCHr9`QuZ{I%@366c?0amiANy__>&L#! z#`>}Ew6T8dJ8Y~U`*s`a$G*+R`mwj$SU>iyHr9`Qi;eYT|J%m;v2V7qe(alUtRMSE z8|%m3W@G)>TWzc#`vx29$G+ai`mwLGv3~4pZLA;r8XN1!{+EsQV{fsse(cRQ){lL) zP4#n?eHGTvmG+g0SJ+n|UT$BGc$s|};-&Vbh@0$9h?m%xAYN==jJVO>h;*CU>9pO1K+eIDYu_PL1X*ykXwv)3V>ZJ&)8vtx*B?X`$&>@|q1 z?bV2@>{WZ3VQ|Oa(g*qy!^b`9d` z_UVY#b~R#^U4>X_S0XO8mm)^(DB==(3F2aVF=B;Xfe6#zh>Pq+h-G#eV#JPEp%w7{ z-{6YBJ^f$S162RN&;cCl{XhP$8rK8Bo4X6%zgH;R1=9;}wOju`(hO`y-N2@1dI6;m z@H*N7)(o&#KxqV;^Z`moup4y(q!A!}Kp|)Zx{@{kGyw-d1F!?${nx{Le>uGI4}v%S z6nMu!gm3ri&3-e!(>J}*J8$!-OE?Uggngh#*oiuXO`t!h_RI&}!35A86oTF$2XzKV zKx1$Kbp=~dOHhq^0i_F2dH|&lP`Uup1Z?K_|3UE9p8{|D2iy&gE}#(g0AA1nC>_8) z_aUX9`M;|NP`al7x9|Uvj7V#BKLO@3wqnd-%x26)Oo^l-1|mU3U&KPxBOXSR(O`5V zYLPU?6vi-Ph%vzEXY?_88FfaXQ2r_ZLj0BW6+f~*;t1;@j<6o$2a)-^f21 z|6u%`@mI#9jK47c%=jbY5yo#3zhXVcXRNRIjP(_tvOeQe)@OXm`in!Xmw1o$5eFlm zU_5v7c2SpU1L< z^&};%Cn;e)NeSyoN?1>_k@X}SSx-{JdXf^>la#QYq=fY(C9EeopYq%Czo@5p4NlI8xQo?$YGgwbj!g`YBtS4E{dXf^>lhm=E zq>l9@C9Ef@VLeF+>q)9uPg2Etk`mUFL|IP~Wj#p=>q#nDPg22pk`mUFEMh%L3F}EB ztS2d9Jqc_9kL|gH^(6CIPconNBqgjTna6sP64sNP!g`WZSWi;IdXl-UCz;E7k`mUF z%wj#sEY_2hu%4uZ^&};vCxLcRg6Sz{J;{lzCz;B6k`q}^aw6+VP9!}E$eoCC<5^EK zp7kW-NlyaD$K&xatS1>mdJ+g9gW&^MPcne@Bm-DaGJy3Y16WTojP)b~SWhy5^(2E? zPcoSGBm-Da0^Yhg{(%bNdIRux0qaR%mj(P?$a)gk7lVKI;qwX^dn0ydJxO=glXPc2 zNq5$h6tJG8fb}E=tS2d8JxKxSNgy2s7+*)$ljN|Tq&@3N+Od8lhxH{ntS8A~JxLDh zNpe_ElEZqE9M+TMu%0B1^&)Ak7fEBiNE+)!LaYY~u^zFwOZ==a@w0x!&-xKR z>qoq-4{@^|#LapTH|s%MtoHzCiz>hNpQJ|t#OD+sKJNhWc?IaA^H?wPC+kIiV|~bP ztPlB>^gmFJ`24efWxdI-tS33jdXf)V@9-|`8{TDo!@I0+ILLa2gREyb$a;qTtY6sA z`h_|6Tuj$Ydp6@N#Od}7h4Nqo`*lEkKLWgj!}0wBe&hQEAiiG!;(G-kzCQrs`vc$# zmc#c3_>J!ifcU-ui0=!4ReT=455Vss{JV&e+UvncFaF)0F@rIk5$gryvE1cBo^LqF z^9%=h{@@_b9~|WQgM&POaFFK@4)VOgL7p!-$nymUdA{Hv&leoz`GNzHFYx*YBA+uJ zX8eqh=M!G%`GePa{@_{Gw>-=GmZw zdswe<7waePVtvG2tbe$R^$mBizTr;RH*9CU!Y!;%xRLb-H?scVde$3U&w7LFS#NM1 z>mjbQZ-M!<6lh-$V!a-W+>PaV9qS{mWBtQ*tY^5E^$eG?p5Ri}6I{xAf=gIGuz~dj z8(2@Uf%OC%SWmEl^#mJOPjCV23D)rY{aO58e-^*jujKdnmHa+m&-#FR)&tb@dw)H@ z=hyRlem%eEFXQ+8T7JK;VSPgl>lOo4zvtTv5Kps98RsFMY@f<_3gR65BxMLV2%OZ0p9r57?iczYbZ4kE zR1ka@*5S_#rop?~*@2M(;ok*wtta|J*6Y?K)=Vo4R#SZ(7d{1)mU7=k@K_LNsQ$XCatd{uD1z|Ivj1=nttv5mTRb(*%ZwYCw=T+6`BRrz{T8B4NMFNb&* zfz{VPS>LtR&h4w6+Z(^tNnqWiyud-4+9joF5vOSkn55Q4VBflCDLPlzE=<$TZKa(n z;V7g?xrRGtipn6C$bU`Is=nH)-kSR66e*u^$4pU#Q#2Y3vl3IZO4rtpgRmNd9oXgePAvG-Ad*w!1>f9T5_-?+pv@kj&F+KWSlo~~@?v+4 z%z>YM71ckts}9<%!P>0;_^r-@+lD;Zi5^Ke-zl8AsgdQ)Q`M~0XX)DfG;LPCHmfqS zeEEs72J&gA<+f}G(A%91am|hAG0_wi^9f5XhHFKG@jISR_H~!s@ts7`{c}D$YlDYr zg9qccI%{&QfxO*`eo6V9+mz45lr_uiU|pM$rVZ|-4TikdKqZjVJ1rNNYp6O!3wOxt z9EfjLJg+S+0WqhYv|dG8um1QQ&nfx8J4TJprpW#|r=7H(L$sa)@mrlWDb_$<@kH;W zoX%>>Y0Gpq%V$qr8! zYLsjz5%6f8LK+%bLfw!TykivSbhv2of4f1#THDTA+Yb1xiW97>$v2+JOrzF~R@d5lwYEX6Z4DfN)R0fSW29ypL@@Qgr>0eBtyKq2eRFEaZQe0b zGnG>_v9dN&Q|I(Ut#qx8S8Em2T2;V-8LrAwq&RR~cmQ$eRsPkd%T-=vl!dj|yIhmqOTB@RDr)k+?Ejv}qrsXQ= zSI?(h8YfitiA|NQ-0IC#s{yr4t%FC)%+NAbQ-K9U*L1=Ks(YsDHHJ zC0$OSNF4KjEo5mSj~4Q2Aqayz1by%MG;qL{knizL`HrVv3uq}GEs(ASRJK8wobUNE zb6Z>%dZBS}*)f)?9BK++o!?E}2mDs91L2k=2YhPnK=Xt{8y=;^VQ}8U>8bAeL3jO?=K3Mi^@DQa z30)-l;X6hbIg%pqs0d)ZIk9ZYg35|Aa9h^YMY;~?uJ0_@fmW^qDmG~Q!JSf|Dp`~TXOn$jQ+NWCDko^%<*WZ>!IUZ4|TMPN_Rb^?o(JF$xZ{alNPNGQqd$XTX5YU za^3H9-5+$_ulguhgh4I@wdAF$1DoWJ(NDSV%W>TocHNilx=%#}w+^}&^l815dYb`F zy-oAnz-|P8dt5uRT{~1xpoy^CL0Dv$aPReploT9ek)7+3<6V~&;CBrywEG|X|NpW7 z{~!DR|1qA4aRlQDjKdj+F%D(Kc?5_D=Mex0b2!eU!Ec;L z1H^eW!2Wz3=h5JIKmLvLXz&~7(ExEC4G`xg0C8RduqU5?9Agj0?u^|SyE1lR?97Ps zXxdP+TL3&l;k14Net*Nizh?Z3@k>UWhk)~N9s&^OApmh60`OBl?-Rz489!qDknsb? zLyYe;zQ_13<2#IRGrq-mknsTHn~ZNT?q__R@ioR*8DC-C$M`biON{?ve39`5#=VR< z-vRk;;NLj!p$(z=7Qj6iK7{OB;rBEA`)S6f7@FUBp5n;EZWyo&Kk#w!>vXS|H@QpQb;moQ$;xRLQ9 z#tRuYFkZm8p7DIf^BB)%Jcn@|D6=N=A4r4ZB7Gox324gy78e=MB z3S*ct#291@F!~uSMjxY>(Zgsm8jNm6ol!7qj4nd58-(Y`U;O(|#y=Q;XZ(%vSH`1^ zzcBvH_!Hxgj6X1bkEr}9sqt75+0g(}{S=WM4g9A1DI$9s_)YawM0Paro9d^C>}cRO z)lU)G(ZFx2ALY!4u0!=xM0PcBoa(2D>}udQ)erbB;q$3}ipb6ej#K@BdksEL^;1Ol zG;o~ir-7%rY~_cmrntM;Sr)e)qrJC%eP?tNLa7G+h(VigUzh z?R)J(twQVR`b_QZ{J;4(BG!l=y1g(787W%;KKe={&URH| zc8-`G6fl!BTOAw~Yh;IBnLQKZxS8Ups-fb-IElr5gVnRraZYM_9!byW;jqKqoAsyh~W*emA2CoOM7#G&Xh=3U36C?a$ z1O!isHL`oJE-fcNL9e)#gqOjbMQPcxO1lnRwy9{kLVmh+r3ky};)HhM1WTNdB~DOh z4vRIC(=WAeVuI5A28i%_p*PE!(wauZa52&=KuJ1WWoKxtu`Q_=$z_}4Z4FX%y(*f2 zaA6^aiBZaj1r!Il`AV!7EnQv*3Am{CfG?^lza<17+>C zDEvf@zcQHwwcS5X@{Cr_srIr?NtJgqmS7wQ3Wq}2%2{B1bPZ5(^ ziAh`<9ufRV62f{fVD|YEQhN|z8G|%G+QY`BGoTKX(FWbqQ}P? z$^Dnw-U<2(^@-QQm8wDYi%W`-7ev*UlIs&|WWQhO3HsD@c?DduB-McV%`~l3p4KTB zzoEl{B4f8-9h0W4E>}X{bmb7O6rD1*aLK6Y!rw~x!@{2{{OX*su|{$Mrsei*(H7xG zxQwDwGd8uQn0z&{GgHmJ!3?0Va)gy8z;hH%G7XP4k~gqKuci>ur4$itsI)9nI%@oM zg(?Pbs_^=SH$`~WA-FBr4_IEy+X7`Of^m_iWU9}Zve_<8~^EhFulc0T*k1#E{^ShYhf`&|e z6}Tr9W@};Q3Nufb5Zpi3$ezJ+6KXh9ZdBP4kS&!7U6=!fX$dnd%!P|8>c+(y**RG6 zmXmvsgNu})H(lMlbud?}ZbIcKs+6YsbfM=8-7EAQp{r9y#~RT?n5MN$a&LGc#pJ{g ze;&c32*zVsLIj1#6ha+`B4s~e?ULHchIll!6^kktL`&n*z$}YYk2PIrc|uDQS}UO~ zTvS^DPe*nemfrHNhv&%!6qlMX=4{~(xD<^mOSsa7D^s}OI8+RI5lgHXcsj0!SkAXn zn^jD{_Ip?D_s;kY!H^yDB6bYZm-AH;JYq(?+e>^n>e}zR_E(Dbdt2>yRW#80*`-*U zBrAdQFs{^iRNV9E+HYyvZ(i-Uu=bmZVMwfzy^7_woQ;L4+;bs@byg}_X5oZt7w!8( z?fV}1jV2^ep5$Ll%kI|VK89ZO91@Q%SQv@YtXJGOafbGNC++)u{8on{7Irk&F)17C zs7TU_sZK_Nhe{_a-|N~hUhVrd?R!;YMX^S9G?tJRNXyv}OUyFBs!=ds+D_Yl<28i;3A+~9{c z*F!^}0oprbw0BOx@3^7QY8rMVn>4MaNYt$3vF9dRYwz^a-sz3s>MWS^MOS3UvYT8L z&sk(Sr3Z!pv>U3fy`yWNq-pQ8(%u0BpD5&uJd%lod_gaB7R53iOzP??WQ)StuWN6m zYx{Gw{pujh`jTTZEjMZU`Amr9jCkQRGbL05){ffq{k7){@msZSn7bvnWTI!%RQeg5 zC9waS3DfZ~H;>kdE1Tu)d0l%gO?$q*_Pk0Ic(-IXWeL4DjL}v?WXmn1S?4fV+cQ$z za{_*=VF?(st)Qw(9;B@x>3@2DfONOk+MWU0o{rj{?%E!89u)I(iZ1!iT8=p@fQ-b) z;!a!MGg{k|qU~v=?NR+WN?MMl;LbiBqNz$u2_&Vzwr#YwZ3KR!F%7ibYKkQJ&aS3N z{`t<%)3){1w)Mhqbrz(kiZa$F={Bh1jH#hmLbkT)+JkA@wp?wSDjjIRm6W1nYs^ZB zBx)JZq~Jz5rXfUsZOasG%LM!u>O3&=T}sg<8~HA!=xS^1W5(4++tOFtQi$Jhjuo!c zdgw0;_pR>h+?TsAaIb;=<(9Y?xaYuX?zTpTVZqw%pWR=%KXe~3hQj*vm%Ptj;ke zzwv+Ue+zuMJ?DQMcHP_Vzutd^e*^e&tB3ve7J?VIss1tkqQGA86!%cz&cKa<&B0dS z;m?G9|Go$Re(%BB{?7i^{xrYW`pf#!`U2MTzhS*-Jq=#{?zV2W{slh$&a=+4YQUr4 zJXonP3Hp3gn|Jui5k@;nSHB5v|*0e^*c!NtMZ;CC<63>YUF#qO8gQ{7|1%iPPJ zY|ka0b3KbZGdw4F`g?kqZ-*C$Cx?55JB3??&CvJYP4S`7jltEPGd-t=HhbEK-V0qE z3V<)fPJ!107kf_gO!Ndn>jIiC^H=i~^GWjo^CIx&R|!ssPB#0R){6uG9DEkLma7x9ZpF zm+KekYxHIM5`6*e4mm|1tq<0F>jioq>@DRHe~KT(=i+^_U%Vim5)WGu&>Q*O@Jbhn zT9Kv1Dy+z2Vi7B{$YEu~Y%3y(&9@>89kzhjX;!4vVe^QcVnt3RHrI-r?68xF&9WkM z95$O+i4~dYuo=XPt;lp@Q?1A}Vw0`N6k-#t$cYY{L~OhjnLuoe6&dHSvBXANklIQeW;_8IaY6+U z(NZInok)rmq3lF7PlO63qIn}!D2j0w16G6zMV&{5qL`nq@3SHnF$nWH%u7tSA|8jC z4l^9)CI+&)!$dsETAa{rCcjCQf8$y5PfPwq>>H2#lbKik;jrI{{c6eIob!Hl*inc5 z;;^5I{b9kJvO4*T9=-#O=&S86qJ!Q#f9QHJ^JG10d#CBP7w-dID*kfM#q{E(Y z*yDVjkdG1DX~{<&_6Q%%k~@h#Xvv2i_Kg6_H@0ozLK zdLeHhR^XA{iCtsK>l}71u`9FWH4gh1v8ye)#bKMBqgOlZDq9m2BgZ-%)D}t!v-?*$Waa(>97$FJHcVYh!uEcSBG_RSZ8J) zS?I9d#18h0aJNz7kx>c*R^hNk4vRRQjPSmBF9l!7b`;b5b0z^3Mj07YNRJKZ=^di z3HiK)SV5}n&&(@1$3r}ki6jARyu-#gjM@Y^o`_HzQ;b@IVngY?fmVcCR^)gqLf26F z?T1HI3b?mBm>uCe4$6q{xbBvuGM5mxnj|2sm%}JWu-BNRoU8b_u0ewPM_?;RqR^65 zYAQbNDItu?UWIX+0LFbLFm4@i9+f?8H7Db#&x&x18Q_tWUs#zSsRmViQFwp3NJNID zMyN+si@z2l>ZX{0)KDo2kQyg z>3)Re^}XS{*;nHm<}+cJ`s=+F-T|J!VQ2ZPJhrDV>>R((ywR*ON10*cOL+6V)R<@V zaDU|9;x2)A%cu32K3M!Bc8Eoyv-Y-jgI21walH#kasFUpnHSq)EN?WENb5!S19pJ+$pyl*hkEDGzK2urn7;~y> zmZ%vgp4HHVF>2r_V^sR6)UHD`-?{^13~Q-j*nk&|f^Nk5yDzpa?Er zuqZME{1n7DixWdLhkA#m4F#>1n%T55Exs;25+nF19>L@VwRNz~#f&rNpk{hGY{^0idq#xL{XSMqc!usf^LZseV7zca}Bp92Imb94$c{@qJf&FRr0>fo}3>l z8>rb2Aeuu~^#a&iuuc{g#ghS>cC;GUV_;YKsADjdL963^?UPFP5GG_wm8>XRS$vFm z#K4{d!vk{$E`>9oXlZr44;G6xFIq^+`w-82O)25>fP~}@=r*7;d{jc9MCMV^w(pr( zBJUk5Ax+VU0X+tU24oLV>3|xdHSv1Kq=J1{MU$<$Mvq=r11tTNx<8?cjvst{-th&; z+i)DxLo4F-_FWRw^G|rol#)^^vGt*jZoX@0{9M{Q?^VwU*th`PzdB z{l%~HrZ%(#Ip0vq<_@VHyzo(;B-+Os!O{sV9)01UvYt_YCGCy5@X`ec)MI|+peu2;389W|F&5M5LS>q^U)W@lt8-aXc+ z7LbETW|GJ&BvMh;t2`^5rJ!f5QLPY%vsH;}TJsC+qqAZ2o=P|~Gc8jw5Kt?^k16mn z2|$ZbQD>xOCRV7#QOzOmG!HHQDmE{81S%48Bl)KikWw}Fl@FYk- z2Fv}IEiJ8CRtd!j4OiK&j7uBm8J9Xvg+rUCCDLl4fAd6x-O3Xr4x81J*jQ_Mr^bQ$dj8sErsOzN2Mn3OR~mqEeuO6Y88#j04F3idITU9@$q zi;N!c9UT}A)5LYqebEYNUl4cxbeb?!_oE=O(<)h33Cr47W^`=TQB^f9aXv;>KZ0ks zsOpZX9YKOuGbdN|PL-l~Rd*cO(cMv1HMCkqK84^L6xG3OP5Au1(<3^ zS7x+s-&!SX0JqwtHuw+7)0-G&28{_x<+yvd;lcww_wj% zY(sGWX6CfX$%79Bfu&$Sx>8Y1U;NM(KXfLLQ6&SKK8uJLCE7+=C?g zBt1Fq(1!4nO*NqM1vQoU81=UC;^QvX*qtPkA5*t0$!3o!PnL%tQ{6};`7w2y5{W+$ zp)h)t!yaeqH@s(d1tI9h^4cVts&0qr_*=8Y7_v}@LRC#ch?B&resNN&I7wNj7seX9 zpu9KP?(|k=o!$@ROmUJ|oJ8MnaTsQIrfYUfvWmY&$-t(8l@)bO*X7Pv%o!@?1jU?I z0tTxUb!z>8Z+Df;_}lmi-qJrX-ZcJWJYzg!+++OPxCY+Y&o@>XwMKU$9%ST`)7~ z4{ESq;J1NK0&fRi0dMqA1|A694tvsF9k@7fZs5$o>9FddG%!0bB`_v1B+xg|4eS@P z1EGN7|K0zc|1^k_f?Fz>b6G`&Rpw`Jz7Ccam?KZ>(>KuaB>buZ=Im z=l5yeU%X#?Kk^>*zUQ^gL$QSp&2umn@dgG zJjtA9jx~pveatRq8#CSXxg+jV+|%9T-NW4d+}+&m+?j5_Tho8hzt%s}59%)`*aEE8 z>-DI<5cb-es*ll&^g_L}-bT;R{a^%pRD2^o7H^4t;(75TP7qc3%+raOW;N=#Dvt`2 zba0iw2(yyHeir6ZVm}F!w91v=3UdjHR(@?RCi10OLF5awoXBC5^v#vmfB`ba@GoJK zcCK=ZFloM{@@ip{p04s#Fd4@4mVN?8$HWc^lXQ1W-xns$fh>JbnDg)wOIMnt&RaTH zm^2v@eN&jE*o(d>Oqv#nz97t#FuLeoVUn^h+9*t#Ac-~zlO{-_&kK_jfYIlKIg=#z z2$QBAqR$GGl!DP`gh|s5(Wiw;>cQw!!kk7DyM;-L!ssqx(o{tBNnuW=qfZF)L}HH% za}u$~gh|Tb=%d1%Kw*yvlhnk~ox&W4VRKgrgOuEJ&k{x^g=GjM1KI48g^^C|Bw?fx zn=6b|WV5~(Mhda-gb^loL>M7r-wGp0>>FVOh6=6NUR5WYLSkT%OoQFqtQIkuX~kyAUktiER*O4zUY_ znN4iHFsW9f=L?f+HF};fsaB)s3X^IzdX6xuR-@~LNwpe1TbNX<(HNNAQ+#WMNwpeX zBTTB*=xSk7twvV~lWH}37TD>N#F@gRT8*9|OsduBN?}s1Mpp=vYBjoCm{hCLdSOzn zMwbbbYBgFXOsdsrtuU!pqcy^$T8*AA464;=wJ@kwqgBG7T8&l;gK9OpR2WpN(Wo$} zR-;RVLA4rP48~ZL<_cj@twzg*LA4rPBn+z6XqhmmR-+MNP_0I#FsN3ewlJtxqYH&W zwHjR@464=Wd|_~{mI~u*y4pNpd`0XuVSGvKRAGEU>=a>qP7LnB!^Geo{EQgfgP#(c zBaBao%@)ST#AXTOBVusRd`N7nFg_qQMHq*O31PfX3^d*E5pxOSU1UrC7REco{u0L9 z#Qqe--Pidv0sJp2C<{U*iY_=g|O6&(=yh056 zl6}|}FS)>YnaKIZOLT0MF#bbqh%jCxRw#@Yi1if4USgeu(THsE7s6;D_PH>g$LJQn zZ#+ljJ!21%ca3L>ykk5=?U?V7`y1;n+84i7QbOUK_UB%$BDdd zJVxX-<54278jlcp#n?#^?Gwhs#9kK0L&RPZ#)HIO6vhK2u-CYsg8B*LK4L*(+)E6M z33m`PgmDkDiWS1R8(BF-au=}|gmEWESAL6e2a#^Z?L@j7w-M=VY^SrcgmEjeOkvzY z44w=BCYCOYn~9|f<0fLM!nl!GiZHej3kzc_v5+usAOhW7HFQ(^!UAE$b_cI$}`2wRkY{vr$9j8-vDkk*|zuJSp;- zFsg{fgi(o1zAKES#NH7`6eZ>B#u5s;OBjoZLCIAhv!OI;L}y=REW-2cD~&QbcCj!b z#5M{;61zwkHn9tZv5?r=!dQT8AzWcTvDLyTCALZ!^N=lo-it$k)6gkBKI0&iQHq1 zA#%4dn#di-C?dBTBZ+J`Mi9BsIDygu52fK0lw%Adk_{H-%7FE>EQ1VKPs=ol@a$8e zn;%RJ3S|(nGlVga*h*mxAO@XKe`3ppaXhhlVe}&gCDoT0G`l{?PJUY$g~Z+xMsH$E zh0%*xR2V&xodn(BameOESKNcxo5JW$>Mox?m!HB~=m7&LU73yqY9Zgb&oX+=lZ z3L}@;8e!xRgNB=}biBh|TU_C%!Yji=;0^rY(3zoeArHJsUlg1b%nrO0xE^NzQ~fW( zTkaUY1@Ev|TeGb&yq8|)JJr|5`yT9MAAvmpzV!UtbE>Bu>>788Im65_-ZQp=&L9hP z16R6dxU=9b?>fCyZzbLqTSb}ZqJ6I2t}WKOx;}-AAM0;oY%l9nlGboUx`KzWE>`M4 zui;2{t?TYu*BQUnS;J#{Nx`CZN%R~U=>n0p_oU*~U3`HH3{70?j&rSp?^M@1HIoN1 zu(~B_O<|-n#ZWpr8d*>|tC|%phU@GM*V&fq>{Qp;rFImQM0*QJVUyq})t4D5fEYSi zscJfRa`EUnGiH|LYbmZ+o-3Av-|E1S*j{#Fke#^7C(?;ipfov+dfgWof7q?mzJwb78OkxId#nB zv0yy1JY#uidHV9w^0JDNvAyh-0Ni}?U%bHDl6V;is}+Lmn3&;_uWkz!7@(G@Ajq0A&8P&Pf z%Iob3vAyhg0KDENNN1z8L2b3UV^z3eDswB1%B)J&UdP7vvhM-te40lAS;&GYGXI;K z@a(0%mUf2^cRb{YKm(Vx%_D-GWKvr2wn<3J(!!<2(#)mm27szSp9JV6w&jddB%|rp zX&%Ai6`sY}iDYcp#~QnzsOkBdXcQCT`)SfH;mn#o_zO) zRYYFRm5y%J)eYRj=EEq9eze+?La#P=6tehWikw2Z^Lb0+G~+>Omkg z>}(*p6$L>!@ZTO`d9ttU1s~OlM#c8B^MQd$r4pc0!Fo(AQ7965yfkF4RMiT16+0eC z?u+~sOX4HU&af>z)mD!$s8!2(d^K+ra7$Pq?Mr-oEzDb(10VJ1f==8=vhe6?E(@jT z<106RbS-SN&{`N;$d4`WKRvd*D4NuP&d-={%}<@rk1Y>L=e4XpEi>W)X&tuwv1=C8 z*|0+(=RXE%TCW$BXLm+OFIJp6sp{yg6`0=G9N{7HlSK)B?86*yF zvzupI3r7qRuZ$bZbuaCM|Aczfvh#q1#}*W{o207B%3$)cX$g34X_wLt@KNDV%Q{|E zPkv_TAg*~dS3wE5r*M|w8l|&KGfJ~dmCp*eZP;7D;G~wO{M%|Ce$F4Gsm&{x7o68& zp6Wk`#rC4x0G|dPeG)n?t*O&WjO65U&&hcwtF{V7hmHb{)p5C6c3hKNO-`GfJ6TDA z2MTrz&@Hj!l7EBLH>pO;oi^G`>@%?wd}<@7FN0}Db_Wpbrz)#iw? zpG_l{Mqc=z)aS|HSv)>uY1!k=YBei$R_-j-<3VO<)xYxC-n`L*Da>yW$*=#d)5@J$ zIP*C8s7`A{tdUpz_e*R_@>eRAIjW{xmM3&sGyBdoW@gV+6$*3Q@pb=+9fv$haU^zG zGcsmaGg4=$E(`1ec$t4vwE_)|Not8z5-Oo?r;!);C-s%`XB189c8W8Kt>V;T z)$M>e5ijl!w{Ka7VfhnC{|MV(HM@JKb-;fx+-u}@{7JX2{1Go&Fk?wYb<>SIt<$uO zY1z|iArP7lui#JW>EsU}dnBo+>pOM$)Ispksi$kC)%%GfE-;?@p2QP+x{gzOPwfsL zbfp0%CA?}sp{E1W!tY4j>FIK(=How=U0$W1oZTao-Io2-)DcrNre;r7{nW@8~Gmx40GMfpChUt%vMzkx{jt)yiX6X$v+=1%0sNsI7( z3D)Isr+f|KUs=_o$+~=U@$6|6$K-1r#utw72A^s$E(fdBDCWS|uT7#M#aHU$SqX;S z#b6gWX3n${h)0a?J3cf%f4s8thDl1NAe^ci15JjzI(lMy$aF~+2i@sCLxqmrTC zXa>3NcZL5Kdv5|>MUlOYS9jmFZ*Fb~ArRIZ0uls5fUpM0%?1es2#~N#5|U~_*#;0n zL~p_(pkfpqQ9%(m#0^mtaYM!h6Hr`1MMWJIcVt|car;i4I@MWjkQwKDe$V%R{=bIw z`*w9#^{J)%c2{-1=b6BgKv(ep_hj^%=#kN;|Db=hKM&^JKMiyIlYHO$9`#)U@BeP| zC74~`)BBNkqjwmLHs9wd@x*~Y`IYX$u2Zfpu8A(w`8>=n?*)1RH^WSKr|}HT>pn;S zNWWe$)J^S0ZMD{qorV+s`2}9gJ-T~jtb@j5x zlGtN0?6H>YF)83tBfq^CZ;3GMDE_He&GRTnG|9p4TmWwtdt%w63G7kvfj+$R$d9fY z`!obuC)lKc6_Qdq6z&DCwnA?Jrc(rX~!Os z`W-d$V{5HNWBm?31yTXGV+{>~ho=5)S1#L?g=^C9s8L^9H}qWwxtS~z5x+1^EAzBt zyVBUMR9ws7p&IcGHuO0}=y&i*GG7Ia*% zZX9+|41>;yx*rbqU=rII#~y6Q9)$1t%iu*teDw|4>(JOUCNF|i#=+|@#4iyKtM=~} zRNNqTe*wEc2iLkd0y^!)x8RUaWT)MDO6ZIg7i9PMXZQEPwWv6F78T!$Lt+u`G5I)| zH<$u|8LRId)5-21&F+t5_qS*F!)N;z)SdW#9Fl1h(U`_UGT?x$V)nu_TGgK2+n?Rr z3)kW}xci6?%tcu>mV@Di(kl6hK1`CRSK#*!WcS9gd)u;m#rOJP)0i{aGzJm@H)MZo z(>?v!J-wJ%lTG52^d@Z@Ep3YQkm+Ri3}pAjv3uIGd!&cV8u6JrBobM7qacxjKkD=7 z!0ztH?(U6iQFqWT#Ru$=Sme#5pnfSeYL|BpV0Xu{yW6q5MKO)7tP$U|Ln;vtGWkeI zCBK1^RnrbKz3k3pc4rc<@mXb9Wz7hgXoPkSA0ZQkGKHVUMT>*=pORtPO_1Hum)+3^ z*KiCpQ1KN!m>1bV^JONXfkybpbh10nWp~E0JKD25#Jm!?XvCNCO%{9}Bs2Vv3celN zmd3WF;+pPu;){7v@DV>H!=+84$Q!uFbh2&z*tS@gR2!iK!b59^y~RJk%KVRh4Y@=om5barchT#KW?F7dfN zru;&`iEL)ctcdyx!#BPaWTh3uyAgkaU zvqpZ|AL$&EhakD3Dyt2jb19=YcVIWSW@4=}N}u~j-Xt<)VrS0iIqaq(?52UZ7Ds_) z^!0y)b4)(e&S*ok>Sgn$M0Rr=yQveq39>2rJ!mdKgl|kfL?$NR2%xhQUNYH@t=Nrz zc4G^6qj(j7emE=4@O0BY5;a}Gd$XE1+>{R*+6AKMViHndGa56Ci0e(jO_=-~h8t4wuy3sWt z8jg4~XwTN1%hteEAZ8&ztjMdNn>g7YUj=Krvo%h(rY&0|t^#=AK366d;X;s~D-wgN zK$t3i8tXrUzy+|nHCx?`txjO8#Su_xV!8rY1>+NqDy=Iegkzlc_yk)O%T`6PRn6Ec z(Pt=LGY7IqSm2?+qCl7E52H6nkAb)Uzxglp_xJ0d!nZi88+`G8lW!b+$-c*&YbJww z-e0{VJ->OL@vQI+aR1=G2fh;T=sM=Q5yt)9&V9}*=Lo0A@q%M5y#GfVuNv1F1%^Z4 zqtDlSYF}%QXbZJe_76DapI*`{Yvll=7dnpWXBw{h8zIx1aLTkjklsnF?x|IG$F&%Z z7+6_Lql+yY3#{`^5dG?Sy`)~ZpjNHj+)k@b)T%|t;LyriIk@PBezyAOh9Q9)Ao51D z(SX88t#YDPITqJAr~oO*u|;nqzn+l7UonM7J#9m@%6zRd2iG{R(6_Qy4k~&h+;Q^j zF$KG`ElsOTSO4{SaB3V&)V$EYT;F&oxa%-tMQ+{#)SS{&F|)SX|8@pXBVY5aHt=3b&*)=Imi zhjxj$+2mE$%0WhNumU;i8e=D*hZVvQJW(=y`gohLC1*JeHF#8-@2!3=eNYt=1l1Z2aS~ zUY@x@-?uheo7hep9n?mP-fw8wa)7akt8yL0Ueoxh9IR#KX<1pg#tv{uL5?#vaaFFx z6dGNXJ+!QWT2>ma@zFS~vQ~~YHohvo0e(5AU|*FZbM2 z()tg@wYZ$JDr@Bkq}C_Gq?OVnybc;Z*h6#a4^yVK{>fT@aUEn-*2WO{KkpsS`V$aN9z%*^?-MLXrMK6WKxV3)Hen0yq7_lTpBr6 zpe3bhNnLR*I_mQ(YiM{9#tRxfU0o{8_=5oh5clpDttElTw-_^k-eNgm+1MKR30eWx zEH~kV4P!tHT^h~Q+C*z+Yt4i@o&((zG*}7JG>sBl8ktyw=Q^GJsDWa~kFD5` zA}Q!TlOvZxo~BWAxd;koNu4N6eR&%8bvO2PGOopg4m24W!~}_&Mg}dB2K|9X4f~pX zA7Ed%VqXh+7^rVKq$y--8d-E9ShTp#qB?z<1om-P_VGEm76w5H(Euk%)ig3_agzqs zrKPiv*_YAmn~7J^G!KaP(KamTTEexLhMjFu5pk6 z+NK;H^|lVj)=Sg5jw#!EX#JQd8B87!JVx@_UX z`4<&JMbRrFJH%dfu|v(+p~drYlmLfI;pwqqqlApj1B2$&&saTMy0I6BvKI&98gmAv zO#`Qq&u()up~g9@YX;5Oi^=T8PPi6F!7W4%qYC|rMm0A_Wo+W?3SK{3FS1$}dojRX zTs;3GaQah21E>*`ulWUFO}cdY!>(_`u1~-<%)W+K?epoqtD%DsxSyX7k!CmWs?mi# zm&%^&hHK$f0~+sa89TzO2A?fX2_u+icBCoR~R)jWLgo9BlrwRtF*z;b2{6b&Gu&EnueasWbDYH=Q0`lkA|Mxv%Le@ z-p*`qceYm?C+7ci$59qI9XJ^{5jYN7?S}&g0{a4cK&^dyU~6Dgpc?er!-1uN1%X*G zYkyLpFpw7r!My#{Kyn}$Xa#!zo&bwJ9eolM>yJktjXoTGAbMZ)p6H#?+oQKeZ-V*z zYoo)_OF(8>=*8G+Za24@o4{AVS~F}eH5Y)lfKqdk zS!m{gs^I`L)l4>n;4vV^^uSE~)8I4Ug!j1jsP{0;#oy=M;ZoQ+hNwk zCQmhZPz-yPdKP$Qc}hK#JcXV-PslUClj=$K1U;=hG0-)|+^5|q-6!0~-ACa&iv#X` z?mh0E?(Oca?oIA$_gZ(@z0|$HJ_3_b%ExMsOZU6a5|K%Oh)8sJI=ZvjD9D_4xm z<6_`7;H2|}^SJXU_z5@w{X2V{JHdy*R_7*XwR0_a5m@S6;GE?wbxv{?I`f<%=KyCa z_>KsIHb#uo1KuM}J5D-IIF37xg3`jis6A0Tqqc+A!ltO|sI^hysHO0I$*ic-s7XD2j5z5#;XCd-3O*wa`1bks_;!NVh^@X&zG~lE@Eftz zx4<{cR|=jZ3VnILkZ*wFu;YMZpJR_>r(?Tgt7DU+8hWC_j-`$Tj#-XU$0SFgBhL|X z3~;16k{v-uD@TmO<6y>VX(VB=j!J2?rY!xFGSw)EBt?`KCtZ|5At+9xORw3dTYYgIOYc%30YZPLERe(6s z8i_c<8iAN^^`BL#?5R zL#!c)gRQ}c=~g=8AZrlfKx-i40BZnZf2%)YKdT>NU#l--nw5sw$LfRF+v<(j%j$)g zYNZO~zwloWf9B}Fmj8?Y3%CEt|A}~-pGN$N|AhD>NB_e72af)0`S%?C3-f<)^k2(Q z@l$x*cO3oK@{{}|ZhymVe37e=YxlqyJj|IsY7wJHgR^ zE&q(8|62Yj{}jVN;po4X|DB`%TK+Ld|F!%h{t@o~kbj7HoTL9*{sBk-wfudK{%iSr z9R1hwWBeE%_bx~Owfr6a4sO5A-$p#jk0Ku7M-boQ=)ab~$5`NN32_%6hU_(O<0`A)3laaq|AM%HFF>5n=OfPJ z^AP9qxrlT49K;Lw1&HVK^ATtB*@(0FEX0|7CZfeHM9w*41+PFX=jDhq_zc7{UWQo8 zOA$+W3F34<9q~MV9^y1U4RI=;ia3Q&L7dDdBTnLz5GV49h!gk(#A05ISj3AE$Mf-s zM z{=7e8Ki&_qFYk+(#?uh{@IHvWd2hsCyq7?$r_~cN#Y#c!Vf8@lZgofOW_3e6*E$!m ztJM`T*-A$2Vs$}0$2teGv(*`~lhp|^$x1@(XmvzPv=R}6RuHj+)d8`+)gG~()ef<( z)fTah)dsP()fzFuN9P5WCajYNSkz@VvL>L7Y=L>SIAKrmu{qXi2>xZ}FSU}E{tvJ>XZ^^NKcs$4Y;V@?q(~pCBqvAZxIo1zMIm7yaX=hkJ zJceWa@Bqj9;n5uHhl3Ov#*5-uKitQ$e!yiG)(`h`tRD^&y74$S$NJ$ej`hQx9P5XJ zoEPplIMxr>Io1!?V1AIWi*c-;+KkF#BmirSNx3luZn*m z{n7Wh~HLxi}(#p z!4c>Cy5eiZuPVMm{IcRp#4jqoK>WPobHo!BClEiY_zdw=&}kR(KdJZx@$VIXNBp?r zW5katK0^Gk;zPva6~_@jsQ3W!{fhSy->Y~J@mR$%#CI#+MSQ2?9mKaQ-bOrHaTM`L z#Sz4}D&9hTv*Jy}H!9vhe7)jz#MdfbLwvR3Rm8&;hY???cm?t0ikA@&RUAS*SaA@s zwxU+N|Hm7ju)t4&ZvvkLjs;#1)PNSip1_0Pt8Gi*y1*5IDo_Sk5SSU59w-LIzU;uD zKreXn?+}O&_ydmUpFy+lb9nDR68&=Y^Dukh;piRFx4~Qg)i94>#aUGQz6LLH@A_Z! zzXb35kNF?)-|64%-{@cOuY|Y#`EWBi&tK#p0q^?#{N4Q>;Y~l7JZuG42EQ0=kQP2~R>fQH$@&6+wU>Yq9n0K;> zUHw@deT(Q4cEt&zh)sTE_?SI^MQb9dFaWj<^0a#z=xr-Gyb#3iv$m zJHGU$#sSxxFqV!-44Z4y+}rEuZ8pv7VAHsN)zOVMZ60OQ*t_azZXIoBQ}6UTT9>Z3 zMO~<7Q_rt;^kg0VsE)3wqbqIde!Px8SVwQJqc_yi^>y@;Iy$3{mekQ{UZXj*_k}FH z&|@?grFY3}S*{Dpdd{B5L6p9Gu817Xn}E;98qlk6*jwEvGWhu>=DH*zhdB{ky0st z%4QcRHse*BwO6d{xXnrxD;cHOc>$X_6`TB!&6+7T=|!7eXtOBACgdqryh^e0PbxO< zHk)0k*w_yg8*SS>y1xn=b*atzDK_$c#qxerEYngf<{q2fWwUa{9GBQ^naw8Itk`B* z#1>tet=RInZT5g-Wi1u!J6R6c*b&DJP( zzAFCm^B-1WmMZ@8isw~WxhnMX^7B>LjKel-r&yUP{_?UC6;@K9*m==51Ls=UXv-(> zv{{T|lT>3YpS0Kx^C>oAxMIaC6&wGAV&k^jOkD)!W8YU{qivf=x3`I&6 znXbq*MW!e+i3op1k%Nk;ba)AcRP0kk6-&i!DrAcyH!8A0k+q5}Q$*#x>~0DvyG4075H&>!7-sN*? z&YzrLL+`=c&R3kzfp>@poVUaH|5f@y=St@?=X~fGoa!9w9PS+A?Bnd}?BHzS^f@)h zPmZs_-{aekR~*kfo^U+mxZAM>dJ)z+E^}PyxWG~7nCKYg$aV~L^mKG~v~e_pPQ_o1 zQ^se;F_<;-f{|gQ8C~H?-eWvrJY?Jr`jH!rb;f1-m->hL5e9ed=EenF;WD-!f2}Xz z%NDTp7X^;7<`=;HnF4$&K_-u1#x^(=yK14$;N7YPq_%7kTYt2UzDYENt*@yIeX)){ zS4a2O9ScvGnAlvlen%aJpEF@F7Pws5tXKg)>x=V_=%vDX z&9T`9HY-ys^&`b%hAS3$imC=0@M4>;Q>|$MTlc6Py7q0Gt{!94Rjnwk1tEL{1B(`9 z;6o}hd}>E_jXEwv)!u?WUP@*@t2|yu;S#|Togb5=Sl|@xhW3449i42`b=&GFyv@_K zuZvl|boXIED-pR)mD^TrXPC<$trfi)ve1i%bUTL!>Hk++j zNL?FqLh?$7vxUyJ_o^Jv$vCaTGE|P|WY|_^sPdSTam+qWmFk=fb!E@VSZ(huQ7pwS zgZP6gti@+G`+$mVHe0j3j&7-=8|l#5^DecS$_lu*v%}P-HG7`AJZ2aDruG)$TL2XG z?4BR0uxNFW%{Ej;%r@{jAC9Y7flv3yhLJJlY^BOed8xdE@@3_v?@@x~rK)Voi_Syfy;l@aSnm}h6`Q8+%Dq;Mps-#m@)etguPBh;)D?LY zmbzj%6(IbuCD?S$^Rz$Z(s4G!z6OY$vO-l!%8GVs?PTiyG)f# z%CfO4Y^i;=rRpx5GWRaEcf=Elr6nsCP_>y7P^Fa;P<4|M-CP}KT%~?r*Fj5=zq#w) zw%Kipt%c?$_pXI&lGqxXfz1>)-)3`cHp^zkHiJ@=F;>G%BQZP1YPbVX7*}i+fK;HxH(<$dUwC5IK+PGk|j zQ^7Hd@U=}4eAN`Bkd9d}LXlyLWGj-P$Y4eKDw3o~2SwT{(n^sQibNBczf+N|M9RZN zX6#kuQAHk6L>2Fh>r_a!B3CG~T#*YES)hn2=Nb6&33;C}TJ6eJMCEkGAQhr=TJ}4I zl>I}I&lJJeNJy}(HHDO_U8QfSkcSn)w@^5^6koFiS)q2RCQ;f;g>)xU@{uC@6?sq* z>=uD^N|IHGD)15~g-riNkq;GlLy?<_O#4QWFBSPzk&hL5P7&3#reQww5 zc#1mdlpkr=lv9elriiNLDXK|KQMEip8mfr8WF}!>0~j`` zJ?)zKy&^X#qFVSwb*_m$XxD_zip*1_1B^~~f&`22ppas9(&E7?WRRE-If&iO;EVro zAOlA8AB;Xf`dt4f{=57${avFzkGd~vPE^qM0gRcK`;yF$;mi5+%_Q&N;S2Z~-g7)( zd3JcFdlKNw^h?~Su79{51n+O{ov%69JBK-bg;C?Vjzr@<<3?j5jAFf{U#aJ7KWk6J zZ0DZr3pnY&zrbuz5*F(aF$wc^nDwwbUXN6`GIYZiYv`>FUFciEJWi4m>yXrVrqF9L ziKeE>=%49d$LXK7)jyMyWNM|DSQFFWUWG&sM@)l*$t0chV`=)aUbq&MNrqL{l7v`~ zh|C<8mYi`iiGED~BvwC`s2>wkNnoCMnBwAKfDNbz;tpc4d!jpP*D%&hrI;x z512w$P$`TE<>>bMOWpLBl5s8eg(_=F6)Z8LksOc~G$F?b7un0P`b%x}mxLH2q#?z? zypdvzFG3p6H?jiE=%+uPqd%UBYt&){p#>=h*2K*47ch-8Pv~l^Ki)@wyeF>3QBW$R z2G%YjPtVId3BeUnEVj;*{Jc3KtYrKS7c@Fmlp~9rzR}&SsPo^UVLYpk1 z4tjMzy}CE90^zUoUb>ec$zSiQQfUJW-X3k;GnUriYFG$iuW zA7~4-*H`w{SN6iSFbE2oRK6k$`YCCUR9|e^hF0nuV)d16^p!$Y5N&u%EF?aJx zNaG1p%+Z{`2t5~{qp#?xuQ(UiA{a7*T3?#hH{v$;gf!p}rf%vh^l*&6B1vB%CT_d;5GOsP46a}%3ZH|(dE73*b%xW);X(4?g@SQAb9aZK|};)d<@ zvOaoQFI>Yh@N-E@VUbn8M`jeNK0@43FVmOD>Sb;9GN^i(S6wTm!i=58eA3-w zuCUZ+0i8DRvg}7+%di$o5(6r0r9PN9Qr+tjIQK5Ip14;Jy+uF0MPFQlxEH8UNM$f@ zq`23^7`G{HuLQltxq6GvxEA}t0+I-85z+2;K`IZ#>o6}@X?y7{^oh;&7V&zEIS>eX zNu&$bIYMUPAsM%!vX>svn@8(`1U(?MK|o?8Ro*2dMb>sg^astRHP&>qyKW}qT4=0+ z&I!tcfsRIm6%R@)CPGp7meY&DMYgH?qjj^DZi*V{Us;O^VVXyXi#62Nd7!TDWMtj+ zL2R)SQQ@~-$%I7|-TiRlyW;gmqBh{x)dQ}=+Jfsi5Ve8$q!$+XEO4KU-&m37cW@K0 z{oYplT`2NE@k`~fCgiH_h4?!f%2l=1PIb{vb;7lHT7=sbX@y0~RqdeD*BA6TrTyAM zJC&fF5`sQMDr-p}tZPJ}-yjP`Xq?Q0T-Nv6t=P|w{C3Ece$ zS8xaIlYZJKy>TtBU?|8ga_VxI2xIP+#$XGmXUiwrmoeHWZM9ECMM6oOgYiA!o4rvR zxT~%W*wH`nYoBOhMXjK-Jb7d--U%n)9MKB2>Y%+OJTk$(JQ1Te@z!!1MBi!(uS@cYK)NykL5hyrzTVotp12mfq4t8( zhJ=VLY?U@Na>}Ib(_U<&?F(xAgj*&sqJxazE28#qmGNa$tS{CG&2g{xbey)gv$mI- zV|$sCNPU4@AdxM9&>YXvb_~&W48*l)j_@qeP8!rR!k{hEAZ(6}?Af91iPLs;(sqbe z1=m+wOvBSNqDgM9YmyC;*wGAJ--#79%Qn)8$Yyyn7$L;y8p(Za)3&$Mwsq3BiJJ@5 zO6xPlze&b#baT_TXj|K9TRLf5M6))d55WBYJ?w0=tp6|R1MK^s&;@8bBm93z4?w5^ zC@p|ZpbJolS^z=`AP*D)VuTWa*MnLBM?nW*Cnx|^!`%N;7||a9v;93d&;K~|r0jvY z{cFXXe$WdLY608f8vvmbAXEZ`MnDMl0fagL16_cls0knx0fZhv7}NkJ{YUfvm*U+2 zLY(;@1|@(=_2&P38qNJzGyh@UKWGCm&;r;5^Z#eTy#El)`4>6>LIofX6aeh`|1kIe zD9p#-gE|2FU~WDr0oXbPrJm!Uk}&B^Iu3tMFF*e z3+E#N;(R3QD+}i#0pdI)>vId|9|7Y0BkNNO=N$p!yd&#l3+EdF;(R0PxP|kK0CAp? z^}dDki>zZ7&MUHxSU7(O5a$nBuUj~82oUED0ph$N>s1Tq3t2B)I8O)==LuOg7S0O- ztQGTvtmiG9PXvhbhX8T@5MT}Me~It_;fsVXAUv`IKj__}U`w{n9&m!)! zb`w5A_%P!A)=t6)2_HZ#BE5wvq@z$odJ9uXU!jQf7D`Bu;XKk|C?dUuiKMqMk@Oad zNN=Ht^cIRpZ=rzn6ADN_A(QkIMv#6&Cg~^Sk$yrZ=_llpenPG_4DHP%{e&#iPsk$u zgiO*;NFx1%B+@_VNBRdzq<@e^`Ugp*e~?7_2faxDAc^!3lBE8Dl|=JXlW2Zw63tId zqWP&wG(WW~%}-6D`KeuKergiUPfeovsYx_HHHqe@cBJ{K&1oKLbDD?RoaUjnp?Rpy zX&!2Gnupqo=AkyHd8qL;54AbXLv2p;P@B^{)L5E_>ZAFkKAKzJJ%`<-=kN~c zIlM!94!cRu;RxwD93ef2-K6L6Ch0lsCOwDONzY+7={f8sJ%_`j=dhdO{eT}LJ%>Z2 z=dhdf9BN3q}NbQ`V3c- z?!(oj`*1bsJzPzC4p)<&!_}nYu%2`p){s8K8q#N2L;4IWNspn5bRMcm=b?&p9;!&+ zp^9`Isz}G7iu4;UC7p)lq|dON^cgNDeTF5Z!?2k27v_`B!hF(MfDihxJm+v(FSAKc zfs=j$C;fzS(oHBOy@XQIOE`~o63!!?gsG&DFo|>#CXp^eG3g-`lODo2(m@zUItYcN ze=wSK4+=={AfI#&@=51lIO!YYkgh=v=^A88J%fsGXrA*oG|%}Pn&_K2GzI-=}%VZ%bX7inpb{iFL2_s7M!Z z7vX(~JFI&Vw_3LoZX>)6@fPb=#4Xkxgj)%3LELO@LA=4*gm}I6SHz9hb%@p0HHaIm z8wjr_+(>vWVKw2^h*wz~5HGjZ5w1mCX{{z)g&4Nh6JAcZhHxce6=5afWmXvRB5Nt) z66+$w`PKqNaOI0Q+d5w$&mlXNk9k{(7+sei$HlFmXm(o^U{x(S^~Cn1sa77|Hk zA(3HC^=}|XFY`V zbf0xU;=R@$!pA6HJ3^_y5J&n8aiqTxN4g7fq`MGDdJ8e6s}M!{30~4mFi0Q4AbkXb z^briwN6<)@K_fi|jr15a(qqs_he0D9295L=G}2$tNMAvd`U;?*AaxY}NqPz2lODoJ z(m^;$ItV982jLsiU-*V}7rr6gg>OiA;T!Pg`M>&qOaE8@?|=3G{u}*2ZKU;-xUT>{ zN%#ceUc$!_N67n;Hp0UD5g`8l0^)lwAinnk;(IS3{w@RJeGPCYrGxLmu#NA*fOx+H z#NTf~{QU;pLC4=ixSjBB!n+9XM9i1J=UTq}-3P?qeL(!(2gKibK>Ym&#NT^B{JjU< zOzGTAcoX4`hh|d9l_#6O;&kKO~JOGH#1AzEE0C*Lp ze`vH?@La;Kgvo?m2+twxOxTGqiLfJKB4H3QQ}!!pnX+F25P!b`@%J0B z4IS5-FoCcYVM{`MZh+%k&~_YQbHZ4{W`r?>0m5j+knDfZLbCq>&`04Wp_kA@=q7X# zItd+!8M1#u%aHvOfEtA}iTrm${N2|wq`np4FBm>l_Frg2W&Z`>KPmh);ZKA=68=E= zJ>fqPhsb^oZHVmW06a(v_G2usq z9}*rX{DAO%!uJS|5xz_K4&mE`M+uJ*zD4*Z;Twdn6TU|HD&b+mR|sDwJVbbqu$Hif z@Fl_ngf9}lK=?f2bA*2*+)wx{;XcA=2%jc=ittIoCkXcvK2C_wy-;6|(e|T+y9pm5 ze3)<-;X{Nw2_GbUfbf38`v~tP+(CE`;da8i3GX7jlkg70+X=T3-bT2U@K(ZG2)7V! zCcK&OCc+yDHxb@I_*cT~39lpENO&#bHH6iKR}*d^yo&Hj#NqNiQyVVdM*-JT_~nFa z2v-xXB3wyWMOaA~CcKRBQopKu=GT*5ho7Z9FLIGb=5;Y>n{kP}uQ=E#0h_&uIM+hv5Mge8R23C|;(MmUvl z3gKkJNr;1GKNhtA^|ZZ?P}a|2*`EdbW&I46{Zz0m>j(VZ(DAZ<21~tB*e~m6uekqKZ9kz8XT|cXCm#NKv+yzL^z&s9N}2PLc%eG zqX|b577&gk96^{*m`6CAa2R1OVGdz7VHRN~VTdq;a46vr!oh^;go6kN5)L5jPuP#J zFJT&CAHv>*y$DkYdlIG)_8{y|*p2X9!mfnLgk1>F5#RrZ*uyNaD=teY`i|`OtH_r^3_Q{V(@Z?kn6A z+)1vFT@Se~boGUi;lDYTJM*0_9iKSv0mZm9<0s=eV?Ai6chP^)YxQgNX?kbvbM0|$ ztyZkHgSh|?|NBz`Sf9#+(g&TVgI}YC+&Wp!;TbQsPaZhgoIi76+1%);_$cu=3j%sp z9u%(UJm3f1@73V@Ay`zjSS>Twn8TOwITbTZc7@MuW{Rz}%7enm97O2>Q8dl=6v)`&rg}~|;@)Kl0|7A+gZ^|r90RNQj>Ue-)& zmKF_vWeaDP_o_T7yum^7wMc*x$C#?bec*jepIZi>sLca^sCrsIXPPHXZ1<}?C>_Ch z{e46XyUaDeWx}~U=J?q&=kbbS@TMj(f6<}~c~n&UDE*wugX9Fx-=aZGuix@w%)HF; zd9EmLR7&MR>FiBw(M%X7OjCw=;7C`zUX(k&NYlX=fg@@$xZs59LFaB>tp%30NMFTp zix`GT+l)5drfJS9TQmz!A-uY&)+Ua(Be=AX-P%08eV%3>(byp4!jl`s=oL|+PAx=@ zO&Bw)Y~ehKzywNQXZ|1Vg<_*KESm9WAmc1uPvS+n(-{13mGd4qs6ol+M_^ zExI;{1Z_yeNOj+!DF?UlfzE-B@F(^_`;~6kye*PsQ>rUa25&^a$LB$@*IBHCkCJAA zxPYvTTH$@IsmkELYZ-QB_?!9s&HSP=QYveOw>7xB+BL2W{+pJeF2{Lr0sET!#PtX< zgip05WBh8zsNh!0EVH=@F)HALf8jz6tjcZNruZ*fMxrskXw10G;khLRxf5~=ayrNq zBinVE7@Lg$L|xWOw`q}e$^VIwBI_~`+dj4p{K>kkB~NLhE*sn!_-Tm$Q@q}&GGlw0 zvHn=9OW_)=$-4YW8*0~OOqwsIS&XPluvWN1gBX1y%K1laXreJJv!I|TZ`_#T;dv$b zql*@YF@c5gZr3V z=&r<1iMRQ9{ZjZEb}?UAIDgLU@@4SZbfPx^Vl$Uov*&=nO6jM}(;00P38={5i7tRX z^`m;Dyzn2QEe10e$h_h2D4tctJE;w^E5PmZxtqB~1;E#~Kx5&TtD{rwfiG``-!X{Z6~D0*pYE#@exnUeG+-V=(d_aIvgcnoZ*jjg z{fkce7he5~c>N2Qg0T49%35+Z*3K`gK`a;>W@3E}Po!U&MavfO(J&)sF(7;sD%^>| zxrRivm9NCPa`MMRYZ)`KBzsKZx3eOan3XOE+d1pcXo#nK1+I4`r#9wbHkkC(D1CawR4v z@ik25gh-}kwy+RPFM*Si`9?`Aqr`8Nv@}Y@PMGgNe#BbzXq?7pGL8B3%DH&x88m1N zFj4+N&6wWPnBLNu-rAThcEdz3=}64mCgQvEPoWS$F=37he8hXEc}(99(7)}ii?uio zZnfk|tZT%#%b$QvZ^viZ(?|2?&EpH}rk{Oluz>z;Tm4%xhZJUER6z59XU7f^pA7#U ztb%E%@*8F-8mQI@#$=x{p}8?Ze7X!X7|Lbbb`fzumT~cOV;OaFd=V3 zgy*>rAffjtdvbCIW~{%_FW2Z7!nMlSbeTrvhvDyI8fVT}JELEk(JvL(;wYHPdY;T! zax_&$ci=kwKn<*uXE6Rr%{#~HeaZ*W01rWlr7?4vM)G7Mxd_)P zb5qZhxpy(OGiR=gkv!B$9)xRgRDNac6q&g`5w-S?ow>$#)nzl;NQ*U+I~mE4O)(p8 zGG((* z%?W0KnFZebQp`^91^&6-D9<;ZzniVWtDnpJi}w`x^n2g?hPMVh`aSBs&$|u$`EBs7 z@?H$y{4DP@?>O&JZyJ2NAMe${gWo&wE&dChCq291Yy4Y0*Ll{%_xMXZb38LVlRaZR zxt?@SFHaXwJ5=QR64m%ni_g;>^!YvnWxmbs827dCRsW^##qLsf0qFL>532q9+*$4c z?i6$>@O3-L{3UvLiaNHAhFls;e=X)UPj;Nc!JKvh9OQIHnZ@%eK zMNuQbGhe@`?x3mI3OZCAzJI}dkxzZ^`Cj+E#aDjK3L=8xIj77$5 zqr@mSMjDw$f1`(y1e)^!!>RwQe+MEA@9D3@wt%onKAJ*n|U1I^mS&; z%yu#;5IZwQG8ZT_+RSS+kImeY8Rkr<%^b+A-_4o2%`}_I(^|j9&veN!V1{DW?~?r* zYyBqKY18_b&HgFb52p2#&3=^Zlxcl$vwukTt!aH{vy+m2Wm@0Z>}$zBH?1#i_Jw4h zn$`)MeJ0t*ruB)<{w~>Z)B4C}A4>MVX?-BsG1GcavLmMTw#|-8_PS}kWwSSJ_J(Ay zn$~NQy=+>Ck%4z$K2L^ia9cM>R&83>*kRX8w$Ze%v%@yp>{`jLH?6m|F~wAR^dE$ww%m)mTOWGhW;war%9dsh%ORkALo zm28J~vDrB`>uj@5vY0zsNiwK;yw$;G?QJISd{!INYHNqJu~}=$TA5aY9o9;+c++ZW zhsE2h1+kV^oMf?mtmcyWOi;BKw_fNi1}Sr79&qkuGkKqd{!_~%jfa^Sawjt_!)Ch8 zJ(}i|`1~kI67#@7jCc zk?e@c-?rIN$=)=%ylKKS8ke_95Den4%Dsn7{))|BmaN9)2W?g>*#VQkB-!&Of6-}T-Cv3LIW{*m?%jA#P>|x0sH2F@+9*F0=Z1#}N z9+Yf{$?uiyZj*19?5=ozzs>Hm*$$iC6Oc6B%?oWtw?Fu`lT~Qdn3k+K!DPi*&wDIc zae~Q05KLB~V6qBfuAC*CgkZ8E2queCFjJBHgxPm!sI@QF zlI_6SWm>ys7%*9WB21Q_b-%}w?WI$^{{uN9d@nFswG=*@+%};WAb%2TWhn+C0l9o zRgzW3^9?q;%4S#EY`x9a*le}UR!VlM$uE;^xye`9>=MZ?j_1oITVnEyBwK9q3niOx z^1s+@fn@MlI9IaSCO=;?@JBe)W|m~-Ca;jJ)Z{a4RwmhbCNHtsbjhZge41pFOg_bC zlO-!Q`9zydkZhdEi)=PtvO<%Om29-h$4FLS@==oIn|!3rMo2c?hoo@LSSL;7Q7l2G!+*tP1X#I}a(gtfZmZi!w#59Mp08(Hq2a*W`f-!QDXMkg5fC@$% zl)d7}kXX?o%Y=*%i$HmHX#zBbp|U9q4Z<#QCXpdn06f8992$B*}VS%Qwm0_B} zupSI$$43pNFpFcSWQVcwXq4vekMV=4(%ZKEoPn@snJ_;^-PJi)NY z6#SP9mTXWq1xHwf*$ok_fTl1+HiaQ#SG@(&Z0fEcj)3A5%b&O_$cV5G+Dv2@7P~}b zCFaObu@2Qy!Gd+0fI4pRmAP%t#ij`cV5HQaUY~_g%B?y5KBQsie$oL^~lvX7odx9a@sulq< zF(wRvC4_4h4rB5T7`TN4G!IrcP)N{&Cl70o)LJ|^27eS-7&a)MP*spQtN~3VMT>|i zFCYe~hr|(VA4EwOC7~8aFjY`Z94JnxIrP$?2!SZLKqLs);$RI8CM*LXjLt2II8|&| zoB)<^5LO{Ni5`LtT!PZxu-sDX5RovVh$zDa^|yfs!%zft2HX`AIVl91;{ggAVX=mLSV(8D2AjzZIAM?&fXJ)Z z_K4Lg++xfr0>Og1Yc|NjSt1Z3Zw(@efu9C(U)02whF5b~ZY7Ek$XSl~H4VcVTCHWF zhc@M^Q(c!lte-0=wqk;l*7h~pX<@vZ#ssUGaaYXt%B_wnNU1u;nE70xi?!Mxu7+dH zP*n@pIff_9*zvqhaDXEbuIXmM5SVlviy~8GBB-wl8&K^bFcq3#Fa%}bVNfQaAlnIR z_$N(fU}HzPob(tC!jf1xE?mjjm7cDvU=J*hz`b0D`+5-eLM4Xa*9e~7b3}cb5C#6h zJy~brak@Af&H@cO2rTRfi&}vthE*~AJpdkJ8l(#mAX1F90Dkl|k+LWVv4n9Q#5GF@ z3DiXiLR?UuQj0hm&L~cr1rLfL42KlMq6%>Vb4v}u;HNVzVl!3oaIHZ+2*X7rAs6uz z7nBqN;YQN%bRpa&Y|TnV8iX~LfUr*55=O>4LI_wGl3Tb2p6|FY)M=F_8cfKe)hsEj z0w&Ip7mSbY4#x+>g<3dxS2%A41+;(ff9rw4>HyZw&8H*sw*ov4=mMU1&i3Jvrw`#N){TF z4+MqqKcr3v#s;@S2$+x@h9D6R2L&sks2sWoUd2+K!8~z85_cw%CM=pbN!^cv0}4sp zCv?%&7~2Y~{SZ}_J`0CLx=<9jWQiTZiwudycS3{DmkRGEV(`=CC0AgGIdm z#~XWDU}^Nm zTl)+9n3ah%{&2ahYKo~l+-}dZ4xUlklqq|=9m=@u)65e`H%DiTwN^bhVqr%1plQY9 zbH|OJR+N`pG_H8`$Z6xp6pzc!oi;AFaLo8=Bgc#ylQU-8_;K0O#uiP34>ZS(Ny#oO zv`JRq+<{p+eR}uH>64q5)i-Bg@4mSMGSm8G^&dE(cWPEzrCBxEhbB}SUBQOQXv6ZE z^T&M4?#ameu+#N=mz(}08-^F>XO9^@z9@5a(fE|ShFfQ~Cbnu4S>x*k)=ZMtWDPmd zN_!)tSKfs7A53!mN7iKJ7iEvh2Xn^dj~+f=6ipK$XDcJ4YND*B6-i*!L^P`EyIa5b zYT@dP(sL%TW(Ris8Kdf1gY;}>#8ge7!fDn8?3jRdTw1*UMps~a27l_e==N8B`|sOP zI4*xweo_8}TxeS3GDnZk%r43wGdd-&!NyrDEUv1UY--UBY$`^ZE`D?BTazb_&M1C2 z;kDXMPyN?6L9NxdN>t+6%F0nyM0PpbfL%ps*M-M=RPO2*l`-Lh4b?B5_sXBLE305k z_Q;ex1!uFvQ#GFK@QO=(ytHF{_AQ^LZO<4qX2QTd~VMfLev4brL#$sjEO z3@Su}!XNDaGQnJ*G2y-;ue{&f{Idp0Q=sjfrO~XY8Y6Ev%Y_MJ(1goYbiVh+qE|9z zeG|u)^*;Kam{5?PJ$c%&++4UD%k|mLU#V4%mIhqb4h$HL2CROSFZPa_n^AmC&5uvc zGX9(a&`QySf2XxZRgF@uH4&^Bg;p&3B>T-{tM+B&-c$MM1;1?l_pP95BGbe)k!fQ7 zk|1!iv)Ne-CAzAB>}e)`1q#rfCHaBTdv>16==btd6Yl!<^8ePJ>}=bh?Ci5z6k9ct zENUUH=aFd9Qt#S0U#Ei^MH{ET`(p8=|H7iY%yFZ0$3v?THrX3zwJNS^1X-X}sv1Ui1;ia-m@K2D_q*Nr;nNwZ-t;4nj{dWEfH8&QVMkP19XqQ%(N(!*58eTC z(VmNrg`OLGbzw&4fBLxI;Ept^xF~m$e6pxV&uWobl|vR`o6bRt7WEqR%BWjQG72Uy zsk-0&A3WtWut?MyJTj-`+2pL&L{(+iudi&hW?8|k#Wz0NDr4yCCvW(1!t_7cj+7DE z*>&u!_C!}@)vvECSzjZ1jCkUcA2LR~d0vlGxqtbS_T=Tm{KMhnGT}0-N6%_eOjRaX z)LcC7WTHivJfEH4XJvLqPC>sn;-~)dUt5%&U1!q2abJw73e~qMByIBCbmxx0mS?1I zcqw`D@mv3_O=3Ex`1OG645wxiKWjNTsxrtXw|E4~kTuu!&2K;7dpaY1{}qXExNrL} zY=TMy%g+8FCf@(u+QZEMgYOIP2ktkVFBwn6=Kn7L@0I`z%ng$RbHf@M>3~ir(M^~t z`;@|RFLeIEe=Uex_P`wU7K#4Gh(+`wL4>LXJD_(7mLRS}uuewCbO~YE_r!AKrdWsS zs9?dmO+n$jVd%A%fjBTHx?(96(aA6RtHc7?fuk{9Gy%iWLL8Wr_J{FMh>ZhtiLe!f zfw>SE7eX#N#sn*bKe5CG5y$|MBpe_1Y*nR^1>N+}lP@=64M#u#jL`yt?_^?FE7A8T zcZXn%7L5$bb7+pO;!s$ExWS!4Ub_F&25Rn^C6vF_F0;`ZBK_X(W_zN=#$q~a* zg2Mt$Ay+nqT(Mbifn#J-kS7(V!K^Sic}!5GpqfHh?7<~Sh#+G?*D2;f?x8TIr&fvz zfTdG%2-Y|_CN^QgV{(vsG&m>(0YMcJDDHs{V?m+s+!G9|FE?n6Ru?4>5t6|~Ehdg) zgrL2IVlr76OCkn3Q(=LlU@v$@$@1H zmk}a2B1t$t9NwBr$3aVg(Z66bECTo{0Gg=_HbQHmJGoPs4TxFmFd-!egQm9+hJRoL z0UJh$X_;4uY78?l2TBRj13O@Wqj7=rg)!ATL{Z3n;%K#>4h!a~wgUkg1!A&rtY`{i z9R>?RqABFarjP>xkP%G`;fV#(q`Lxah>VH_3M+)eBXVOctHxnbk(sbk!-W7rn zkp*>E$8c;&P;ovd5_@Ggh1ME`t%U=EY+Lodt7*gz5BkXiQv4D+i2lexR*n98zII63Ce9HDR zv(l;;YgWZt*|MzSURSbYOYRjLQ)JoN8Oc_&iY*%qD`T*+*u@Zv3C;8lh6F-@fCCjRO@&BCh3x0j;O6&CQWumD6MA14zEi3weSk=OxZ zh~-a*!*Re|f5Zv+iv;FjUdFpZh`!}Pbz;{j6|zEC5Hy5n5G586MRWz$`*2%2`S*MT zP$BpW{-J|uyAp-6COja@4+z!qQs6VCBqC7=XSF405t3>nxMU_pc+P3;e!wFp?Pzg-KqXLg%AF~jpiAaURAsidi z6(}M^fB7HeFAW8uFjt0U#HtIuAjs=?I1%zUM=mx((*uH$;)g~lNd*lg6f2VWfJmm| zvQnUCs>{nM$A}QZ(<0=nWjxh5xgNDlA?gaCKxTx+;22uOBWz-WZ(KPI5x67;NqfQU z3h0aAW;Kn(5p!uDHo~yJAW>6NfgQn!jmbZN5BU(|(?)cK1M3PA5f{|u9redpS76^QDGAF6nutO`!&Ut7VQF8;3~2SJc?ls@ zZ~QR3!d_ZFP!1}@U{qkKkgZR|nmhBLD~))eg1~ed*%czffxt@5Qh7jVCMiNhtFI0w zL8lOg%aGuZg_X4^l2pf-F)a?cYpZ2EtfBv6q=C#s5yVK6W1q-oDNK<~7!@?ud{9e6 zx0HMle2I>CWQ*kpONC?#ZYX5Ly8`A4AnwKUjk3&hc=z$9y|D}WH-oiHTfnhvHOEg89uf*Or}P>i~Qgi^9}5s1}LMH;)p z!G71_prS=sDJ%=1$K zA)!NQEH&&>8wv;c)o>y0#qgJ zIs{chheGU9WR<}brw4>~0HJzDhba0>4+y#vg(H&09}oy@@!=bnadl~sVJTf9keEnK zkcLJDBx8@6kzD~KQT%jhR2a437gCuFA>I|tIwTU4JK`9M)95PSj3R#ALU9F!kQqU! z(O=?-u$n>t9XeP)2?-Af>Lcn7Sj@62CzQ*uU*G0^)B6qYVz0&X9nXHxI*;c5o%=p_ zhkKgq->&Ce{jLh89B~u-|Xj?G?6# z)oppzau7SgZSpJfK6$n*N>54sQn~n<_>8z+42g>HHWc{Z4;b)U1H%Wf%`?UhlfFi* zO|Ys5Lj%mf420f~ z{eoe*m7HU&-M*E>9I)HxP9{5Hiv~`t;H6kH+QN{&LahB7t6%X~f-wB$EO9!W#ZGSc z>%?-1f)O`=5t(7aAG+^FzrLIqDR=E?YGW4BrcHqjHy9ckUtU>Wj#C01HvN`yX1Fwt zAH?iT(w7l)YX|oQ3dZd6g7SQvt+1qXVkxmP|JRA8yY!`Ct4@;^bawRgwTElNTUy(j z+LrgVZw_~F?(A&SM5%nCtvs`wIU1ceaAFD1K7C?h_Nn?3$XQIf#|_a8`6SJnFmXaL zPFAi311A=9O^QlJYqFSYQrEMksSB>;Sqr1FX3gS_4MirDc_(B{2qPY5_Zqk&{y?H4 ze!T%=>Rlau?L(C)<`fne7U2Z3Zs0^cSD<8!0`*)0Uih`0XHuas=q=1*ayHK&II-xA zbpd01iy)}(jCE0#Ha~4PPS%)xvj69;=21%Y(Bq_>5iMf8WJ$R zj4^DcSBndV44WzSZY4=!mdS7rg*eB=(T2_RkhoyjuvrhRuZ1yYWO*1H>?h9WY-6m$ z>GMajg*$d&+{kb{j9O3Tn4rF0ZwzI3sffLN-J?a>?+;F>L zp&Yly28*h*z`!l4wsjf?w{w?C)+#Y(a;Nt4V<>*c_hT&J12t_*i?33tGH;E0S1 z3JY8X{(>$gE{Z$>+4 zc#}gS5jM>o`iuMyzsKJW8Vt&E z&-P+^Vxz$zZ4j)*E-QPo4&98NIs9MnykvI zN4*Hh%&n1=zI8yTf`!rf5-)_i%0(KFue zQOVRc9wf|N{TZL6`6A5Zu?HG6wH-7qZDXR&Jk;YY?^tWr0kLLyq7Gxpc-Xf#44h!j z=#j$;dX5ZrAE>2?HD5D}9{OmEd9-b!&1oxvDecbgnt>DCGd;RA%7~F<$P%ia2ZQ4N zG(23-+@)KE%QIT@T3L_A9E!W9$3tp#O^q|9eEmaei{al=u!TLMFcIQ@>G6mfEhyI% zH2M*Bev|+F%=6g;s(j!CcS%3mqAwm$IbhFr4LzU6H5AdmE=-=d7kWIOMrWCAW_gC^ zQ^UFbhMWfWbec7Ag8QMz(`mGXEK|a$r&HY`e_ci$dp4m3GHDEVrjHp7GQpkU`ntg& zeOBqLAWjxPb>Kt>Nx|JUT89kMK^i$2%vz8%D|Hqd3UGg<$FmYG7myUX$P&EC<2A)doVPYj83JtO!&j50)WN(ArN)iF?l;*We_U zqU8jLQ?dq25vXeU0Sip5s*L}iGLZ%BgA<{e+H!YAaBu>yR<)F@U$MG&O>q5kZIV_w zp|)XB!&>Y^S))zVR%3Y-yDS+$Sc0U>T7n~zo-tv@U=Rr_TE+*1n_GK(Afu|HM4PNt zRhGC0i%G>aXf>m9a6AHAT2c`RE@vyA>efu;u(ED-&C=>6b(1PeCMQx-28+N{+>!#O ziaB#k?NSB{iR=e?&C(TYH^w4xy9WzEPHjnMsi$QP<|9%AiKVRUT!=qz>kRT+*U|Z0a$wVq!(g;5bUo+7T+&tXr^z333hQ zqFPd0JToU(OtBBam}!;70k`pINWCC` z#ghEe{N}zcyqak04Qs6(&EbAffOuEYqjmQ6YMr{)+1(uO2DziNV|Tc_Q|s^S&fk+W zh&3?cbmR9BlvuYD)-RttLmf;w zprC|9iYtRDpl2KJa{BruDT99KUt;_QJ!^7sIVD_EQsNm*207DsC%Ase#0r!$iIvj$ z^-SlW4_AKUZM^Dq4XP04H|}HEdIl8)(v5qWJ5#{RxGbO z+dJq%M5b{!MN~|454sUfHSS{J^5j7mLIuX12o14#$P`n$aR;$XcMm#<<96b3585eo z8$xBc2Vv9!Dji{Q?m;U>-O8e-dIquo5(?hJLNlhi2W5)98Nte_X@e3%6O9WHs;ygC zy>98+#@f0C)le6^i=l28GHbx30= z`yE`O&C zCgUD$&uooe`6i}?!G*z7-e5dy{f-{Kqb4Kn!|a1QAz`Qf z_J1c~#kOFur=(==!5!efK>y``#~loADM63hQZi6-un)J<-c|Zfd&BKrZET2~!*8e! zr5e9Dd!EL-#dwW%(I9_Uv0=Q{j}-LY;_UI-E_Tbb>RK?M1^czmE)W={r>9YyGe^tU z^d|PgZx*f)>}P+1`3MvsC9s4McFop0w>4^Wk+!WTJX_nNb%%TVx;wN9z4(cau;*Ye z8#(k!i~$u>ryK|#?7>KXXqnC)aTipSR+d(kPAQ#QI<0hi>5S5ur4{9+6_uqGQ%WnQ zl~&9stt>CCoLX8{URpJ^bV_;Yl&Pgt%S)$~mrgG)ol#yo6N$?i15U(NAff_f46on< z53mY21vmvb6*vv&beuDA&cq3R{9zoBfIloAGDrwXAu%L}1d${XMY2d3Nh5LKg*^Oa zAG1gz{z4@FLM9i=rE;-cE*H!tbJ1Kj7tW<~@sI;CW(M&b;#tJ=h-VVdC7w+@pLj;` zoZ?x<^NME{&n=#vnIDjq$Se~>Rw{<9TtFUe=4xhZ=4)nb=4@td=51zf=5A&`l>d+d zxIjBmmT?t^bQn@%NQ)sghV&RxWJr@CRfcpKQf5e-A$5lJ8CGamBV6%X8LpS%nqgPy zfLwL-O!I1p7B3dkp|8ec&5L2(hLs!EZdkn$`i)RbxC#WB(@2IEM zV^{}pL_MSqsN2;hb(LDJR;U3rN%>0ov+@h&RpmR%-O4q}URd@&UsywOSn|Kmd!6?ZZGf>!toBsHuUa0g z4E)Faq5Bu^AGn`}{rDR(&)V&7b#HVpcF%H8aA&#Qt}kHW{}--TUEhIi|7%^BxVFQp z{|eV!*F;yQ%kKP#^F8OA&gWpe{|4t}&OYZB=PKuXXPGnC>2`eP_=Dreju#w{I&O7D z9TzxS9qSzn9aG^k%kPlvAKTxtzivNfKWe`XR{10L4*R+G#jwOb-kxHYu!7-j+X>rK zw)<_@!}9)i+xfPowwbmGwk(^=`lo)5~_&JB_jG^t2Rk!102;%~&$Xr|GJ5^J^7`%1B`Pf{CF8kAUz zN$8c7dVjqVGfYB{+;e?%mDu?vVXNex z>QI|NbZ@wnM!PiDldxHGO;M*Pv2`Y)Npe-GRZ48FN!TR0D%DCQ zw#FnhO0EjELW!+53Fk|$am8oS)Y=ucUM@pKMHc5#s zHwhahUukNo5?f{x&X$rVrcYF2OHINCDS1Nr1SPh_B&?T`OVUe}*kY4#mZSvzK_%8; z64ptsVzpR_)tiJBQd#zlY$dkHBrKQm(}U?sY@tb5CRL?OPf=racFD=yyR_AKg^zQE zkJVVMNvXC8zs?YTt;QCZl#osMNuKZ%HCAI%<|)Fn1;VpxtlFf^QG~k-gu9hk$jnNT ziq}`HS7P%`f+&q!9bB!%=9vURn!IG@5+yb_PT2O9lviDXjyA_6d@1G4DnTciZ4&+? znuO1#-11_y)(n&IZz*?DG1_9fN%&044HlywrYp#%FD}BVpB}QKctj#Y2%bwl}Y$SO3qEmRbrJU;qOvXjz33a6sYHWg;By1D*mkRs6u@XkXv8~y5VZnvoSkMe_vF#YY z!xJlJB3S(9?M2&tvGGiKCb32;7PUE|rpAg)nKdb*HeS?xu|hM^Y(}kb(lp_D7!Rwmr$jcKMnUpVQbe2ZYO3(68cR1Rf=##~SGYlqrNt>*zj6xKj2Es^W2q+P zKQ`gg9N|(mhDQ$FTwA|z3Xwb^;)(e|VfDQA^L}r?CzfmmKWq22dt*r~J&XO9ZC=hi zPt0dV|6^u821J$B8;kxx3Z~9Tg)bhH@JC5YnUtc$ye8piQlPj9BZ9{yyd{+smKG{8 zw@ElH6{$g0iMdR|>(Y47M2`}4nuJqQ5muxrF$WQx($*8wB)2$UjoF!+=p9>MvWmYg z6o0G6Y$oLeoA~x*@ohC`H7U>A#J7sYx73)$q&#O6Zz~aRQ)9A8dDbQ#42lO;m>!Bt z{+>;|WP*5!8WT;*Gd8iKQ0!1+f=PMGCN@tLo7L#WCgn++cutXcjvBqlq)Nzb?dx9_=tG=Q)MbCBkVn+HO+LbqY@hgs0VLn@QQI3Xc>C zk0{Y?ps*Ti-5}hTCETY(x0;0Y!aZ5SJ!%v)7U~(TXW4|?bA{X0D5fl&veqfwTqxYE zL@{UKQdSGs2ZigEDCR7juu8ZtC|svTF=ydCE4;#0Il@(H6q6QCS?(0BNEfb9qL{UC zrX|8PaHU*lzQA|{L__?%IrK`MA%u{&yd(Py% zWN#GH6dr!s>CN>jQFE5kk|t%<=hQ1vbC!Y^=2;7C7b;P6mV%eznYBf=O4OXCwD_g$ zn&KKIYR*#d0z4y>9a5s^ECuhtGv`g3r$o(J3f_BX&6zMqiJG&N7FEib9mGvz&QkE6 zI~!kXm8dyOY4J+gGm2*@QFE4pchhOXvx7?1oTcC$b5?#?z7jQODR`?K2m}L4)SRUl zzm>AIfTlz-OQCL$cgpE`g?UO8lN3&PSIQZeKh77$9EEN&ybuluKPeD?;)`OE!b$gn z^ur?IhrTFgDV%f<7T2Gw6i)i0G)+OL#!KOR;Y6`;!WX593M1VG(hrJ+ANZm)Rbiw% zA?vk?!fU=LO;#A`4v=0g5?=L1X}ZElw}W)NP&n?3(u9SPZj*|ImnH}=`JyysVWcA< zeZNHbzAs9X7Dl=iIX+h;Jm-tjw1tswk&1+8ON3{AQJT0g(#=wt@N|Xnv=TL^E_ivI zyj|O_M9rxSUK$rH3@%ion7YudV}xzeI87R-MlpBclr1(XJs_p4QA}PqrO6>FWs;&s zF?->ZMwcW^lmsGHK#Ae5}P==P@JqrY5KxSzR)K6b49-z zr3nn9EKo#ezUWk=Yzo7MSp)Od*D{6I)F@^#oHE}gJf9^z?~T$V1|7$k>1Yh%Hpdi( z?kZ!3ZEeX~Zxr(v9-eAjn7z;&#pH#DtCSg~GrUpETzI&`RvIYvM$Ku9QEF526mOKK zEs(F@=`GAD^hDXDg)!(y{EFWjr5Otg-r{xVx;;@gU!mxJj}M~=CM$?UbfuJrRdC)Y z%~cp7&x@5P-YCsfSa_TR3rf6Eny0XEt^+GXyiuB^uyD2mYd2i3g<`Yxrr=gwU$_^# z-*KOCKjFUHeT{oRJh`=c((!A%N_x|CtLIwJIi6LXfXD0pm->n4K2O+F=Mi1wJu^HL z;Zsj>NuJ9+dpz5npF2Ns{@M9^=dYb_Ip2VHy%(I%I3IUD?7YW$1i#a-b`HYF-X7-; zXQ#8p+2q{lT;p7dT?F%-)1Bp*NaVvgaf;LHv^l=Q+JlcBA2{A~{1U(9PdQ$39CLgZ z{`Vem-08U4ah>Bz>^c~5>~{3P3t!lAK7QY?bTl|>;E8XFV-mb$=Q%R4R>*7vbW;^)>MT2EMC zvOa75j`b+^OWba~(RvNuEL>*2*xGO1Zry6#Vm;To&br*X$QrWFv{qUtS_|Dx?n-x_ zHOHD_by`KNs(8=xGt29imn=`ir{4pXJ1jR^zG2yKxfovkIxU8!(X!UkV5zpuvQ$}0 zEk%}bmUN5H0v8bS=kh1=pXJ}cd6a#Hnmwj4?ZPVsP%ZyG)t{gOX2H%oSF{L zk`7f+K33jU-cX)X9#F1>KgsRzB)L#2Rg%2_^8OOTUO)i#JWvyaBvv`oi;j z&neI2`B5icr|j(Q7xsN_lT~R~PY(x?p!-7(k8$`WhrJxOa#%xf?n(~J2p0c>pq}&9 zKg>fN95~;i2Pm}Y9u9YKxRt|=1XBh%TuzYxAcrUiP7J6N3U~;#uQ+_c;WG~ZV$~b&ap&nExM+fkSb$ z#Zh$1sZxJ?Q&&rbuG+#K8GFsE)GqVN|A;CFq<-c)o@v+9vd=5$@-XAQn54C|TtQ0f zeQj+mD~MF(zmc%ge*-IN{{`bXWOK+M*zr3K?{a7%=)0H0T?9SUy!|~99=eFbg&cNs zfH!aC(9_L9;o#sP5On{E!*@75%Hd`XT*2-E9%|)4&D7sLiH9Z-Y~RVDm!NY7!THqK z{pV7H_Mf|yi09T5tUbZu6@tar64XD<;kz8TO7)NP5ZA2!As*uS)%Wob-HHA6+j*#+ z16Q}cnulB*B!Wf%=I}QTA8_Dxz3AsW^d^VbIDDT2*KE;I9=e|c_5S`vxAV{~9KK0V z7v`{;19kiUI_mcQb=2+qYpcWAKjLs3hbuVn90I(S0yh#da6N}>IPjVXaE8F;oOl_BeH?g?4Djw2;QczlORIfJ zNwm*7e9GY;9C(9kf8`-w291|Ndw~<5=I|uJxE~T^&LPO)*=B6wp~W1W97KZj&p3R{ z;g1}C!{KKf-r&GNeH{30pU&^_^xd4;&w=0Q>AXVHw{s#r zMf%gX@{rD93kP0?^z(RVBZu`I)^b?IVL68-9Eu21J2^}w@ITCfj~X7Xr~8mwPG`@{ z)@EVfha;{(7;*gv4_xsg&GPV0;gTZr0egwVA^Rnex8>op#1lJvDtotdwRU00(keE@ z?(A;Giiw`a6`yvOocjXp1^K`q|Q4IRQ@o=H8phOT;ggoA=fyZnj~o#4R9 zk%5v3g}l45 z4J(B@vG$xcd$l(A2>UKdmn)>P5mm=h<%w|yEWXAro}MsLpPM32jHe!=R^6q_c}UvY z(bb2IP{M$ef|)MD?QA>o&Zf4uaIdiUDb^ViiB%7<-el6Yg?9;i-(bCN1f}ZMba^t8 z7~$UD&fccB%}s4h9b3Y}zBbm6$Iz?3ohQ%d$%jhGR%G?{G&U?-xm4KK|3Am?{Ui$? z7fI|WeqmpCraYDBI4Y{@sj*C`ufDckVPEH1CLUGwJzl>kSVwqgye@@(XY=|^pjO?^ zZWU5$sQ9gHNEk_~dX!gsxPN4&zrrhhB(dsVUg?}hmHs1M=|hyNn-n=$-o2u)mo=ym zc`q?|H=E<_uJYeRSn2;J8zOi2&~UxGhsNpM-P?#*|1A#moZVedL+kE(9=GU0id#f8 zzuk-O4?zVc-83z_o*VO1)VPs|D}^aG$bC33%W3 zUh6%_o8o!XbI`NKlLkNU*SXiZ3tWG3U5>BtNzT`u*E-L0<~V+f-{m(swm6FIf5R8` zsC~WN4iENszy`p4d@p|sKIy|&4ZlzywzOI%;v4uwa<4pJ`iJy_bd}U71;qEoN5yWj zT=-J>KGYD(22RHJQ>f{9NkIqgH^T0f>%@BfT9>s011xrdO-ZJI9Ww?_^1T$&*gaL( zf+J>^>?=CL4IS}4=<<|`DUKLMCRbuBoHe+Gkg{M5Zybm$62Tmq)38`ZwTpgFNJlx;Q z_MDsSnerr0rkdFSa@D}eB))Y-4J0Ul3c3pHhg{a4VOGB%-x=|*XX?O7AKy5VIc5vk zA<8u**;lizqwP@FFK2lCN&aqxXAPWGd4B1M`Jup9GDe5LCyX_n!+FX{N!YXIOJZbH zu)?^VBHPzRuf_N_KXAvu9hG^W>Kr@vs6e3PzsuUxwWEn1aGF?>Q<+nN zQ)=p(KXB3!&#fdOH>_$sz!_P`YwG2z54W^5bu+UMsX60w0ytUR^nsIh5+S9I+PRpj z?`I0zrDABj!`y+GBcJC(2ZGu=&=YK&wP;Kix-8Cm(aO%A)_z`O^rK8U+nt$~c~Mtq zPxZh_Yh3q43k5K8a4EPiaaq}ev9+0XBxbN82+d1^B^enLGYT?-84`;{bz8WQv74{= zaUnWepvy|FW~9_oNEzG8(@Uqa#}{3l9rOjVlhOCT*#=crVui~h3HrXN^6Um>T;@*>P+>fG9vDGf$=)Y z>Pg}q6anwW@(A7i=i71HGQF_{^J1`_@iw|xTr_kWC2ex!c8yylxQKI%wMuZ2xMDZ9Yt#0z=)0Nr^bH)~(W)A#J^nap{- zsa_U6m(btR!BaMAC(=25$%~A?e3Z3297T6DY7#FgWMvr^_;zE6AnzVxd z{t+clmJ4t8*{>QXzLU5dyrfKddibHA>;%`2syLI!?!kY?f_C1)6(4J~Vu!eJsGVK8 z=5UD}y?vZxY&-Xf3rDpx-lDU1#_r=@&NOvQmG+Kg+S1wH)r2W|XE$s<(XpzX)@(Z?AGo= z8Z?G?G8;CBI-S$2cZqd+rz?pMn9H!g3WL{{ZQA(cf;zwnT@#Y{ z1iG_(t~p{B6cjiLd|1C7?ncHPUzc$Q1hk(aV{d*=K8zu>bH1_rwc9DVrfkL@6bA7qva{D^kI*SHQY>ig|4Zb7m zek;Vax~%Pe^D{%4O#>%ddA_q7c&@|ww#M_V+pu8ix;60U19ST$@*mDUu~_YWq)n!r zQ=B@CQ|kcVWY7pAA@rMII_af=yXI^$4kh;>7^n0vh2okX@; z&~bFmF@H>t*TuTHrK;YR?r>9cV^c>5ehtQZzO&HD%7B3&%ms`!brl{Gz*1sPljdL- z*b(2%S;p>&Zx-vmW&|6u#Gkk$e&)c5Ef97_%Tim!TD^%jM8_Z0tOHFdo>@E{XWX*X zX3jindIQT+n~8aZWvTq)3B@Hi$+A=vXJeM7_+fUuCa|qdTY$mgYYa;j&o1^BYsKs~ z#x1ak%Nc7~Y7^u%p3$08AW#`7!^!q^!!|`Dm%uDbC2G=0ntZ)sslb##N+2%~w=8u& z7cKRqM<)33AJ^*f7B4Fw0Ws zp0O@4={gsJHlDFAre-b7s=;YmmO3Y1io_Ac>DSL85o66V6=YRrmE%MVin5WjGs{wm zMcGJ2`JW6+W!1yhNgyk3S?cV#9)Y+VJ}$ws)Y%ZUKCw2-(q^Vj#~HUQwc+cEuz^^| z7GZ>OEOe;#oSj*gN-Vo_PaV~G%Di)ptXE6y*XVIA1#aT?kddx+dV612% zCVYOs-|kQLvlo+?`K;r7>0|iTF+MVkmh4HkC%coGjVTOOYr$~Fp=zyIJ2X`JO5DCA zAA82KJM91L|Bqf)|NnFt);pJR>z&J(flm#}a{G}U*ybeboe_}9jH##zBE@Mi`xt_C zOw*<>8G~e&b=kqWnT1R+Met|HdZ#uZFdL;Xa0(-tTHKtd0OQvoBnmMzl5uaGLc}!h zEWn&XAr1{EYao#CtNGEMW-$s$qNFWCWGnlSh7W42BYNlBtchFmS4pf7H{)3O&Pa*uyQ zdijV2GBm+a!z%q4>_;=(x$JN-ug(IBf!A7Ot(z)6B3NMr8g%GLic3-kVIlrHs3al8 z(!oL!Y=<)WBA6n=ZE^F?B-zIdxh~~hVJTzKaK`fnP*>n>Ms;S!i7Xicj$^EF5FY0t z+E9S0&JGxIJw_J;_{$RGFl|`lGDrkLqO!5;T9&FdUfVvg@|ea-p-F-z#9}o3iy!O) zUEvt(3M>up3Wp*Jt}UoGL0C#{f;7A(_=1xgLxB9-Rx~Sy#XxbOowJpAbSTN(Yc9Z2AfohtDU) zZThkix1m6MIl^nwQNx@D!{9x{z&N2HLeA3?y9C#&Wy_grK zFvxUc281C7_iIE*vBI=8jO9iohZIT{TwNB3w)hSlz)gF#uu_W%QV6DokAe^H3EqH8 zDZ&JJbw+-UfUmqT`L-GF!dmUiq89Nryik#BvHC;Eu2;wycrl|k1^rvpLLnHe56Dsq zs^iFk4e-?**yKW~Bg})j&k}r5Oky_N9Rma1(u!a(KM;(dZXm@H5>ZcB=qb=qo3CkX zTr2qUbcS4e0F7`&m==i~{kCLbvP7Gt`TUEHXG+4+h!0iiSe$a1Xl1S-P+2c#OwkUK zRb5$#XrW_C;+y5daS`5xrJ9iF4YJBbE+;mHBECxoFq&$XTGksm3Dtq*tlvZ=R6IW%n@}z6VD}NKu>duL&>>P& z>X1srNa#aD4~UQtw-QNVF(LLxV}JNxcDXV%+Pw4O2i~mNRJ~1VT`=HY0>C z$D*0yLbb~hz$LqBH)_m8G;2OOumvxfiC}{ex~;^i8W)QIMtnLf8t>7L*)v( z@pxFt?hX+_bOnpU&U%H&9}tYlx&o8V<_fG2BBjP25HhYo*W$5wtHTlrQVMk?cA14+ z5w&AQ8XI>7p@9cR-;tAq2R#m!4KhVvjCTbG8tEX@l^@kf!etS52S(5pf>?ws9MM>w zq!7jj3G|gbDgI(06^IpS5Yku&!{MNTggvd|M~ET%6Hb=Bc|?R`?6Od1e{0wuHY(Kf zu29bkgPfVFxG+bB3Q9(Ta7ClS5y}-Ke`r8>5#5_h!gB~tG7j+M5Wt3{0TyyfC>&#< zJDdte0|f7^j-ZAZmL+NiLoL;|DAks;FOY)l6C=kghgfxBu0VTwG@IrErK($(zjMPf|}7BQ#2^P(3U2yf&UiF z0*>bk<;Wo-@WUoUVbm&h1x>3Vt$ke)rUTa-=`_KTas*hT39{=LybE}sm?o@_z(LIT zdhrmrYZUE3f#iUDAfLtaeU1W%Nyiq5{vfrMm{B7NPG>To zB?zGwJhLPpx&l1mNJ4%D9ZX|dfZ}r$vKb(<#Ss#ude+(z7N}-_7>zY0RR%&941H{* zTgei!Q2`YrRPVJg0q6>gcvo12Sj`0{q-IP`)P*+mfB;K`gd$1{ux1m)df^h`SUpS3 z;_x3)#2jLm{6Hq?3j7H9@y zqDDd*Le(e+)GNeaRw&e@i(1GL5VaJH3Q&&<8LAg&qsy>603EZ%7fQn9L%{EL0Y%72 zPub4~-w2x`Y;)KO(ex1{MmCN+MR8@wBS>QPV;B`Q+&dV!1thLz3C!-0Ob%j1mi1!c zDpuu!6cCb+9Qi#cxR!((NeJ$h4y=+wpy0pL5wS53XXpxnePVg$;R99~Ka-g31OHeh zV`jnfVNbLH+meV+!^|-Qu5Hkf_M%-hOhMTncBBXq)ERQrJR(YmmJ)>e2z4G`L}E`x zO%RUk6+)yQ7&Opm$be!fv=#vkV-))v((p%OtdcW|# z;=R(l!t3=M_ryHsdrIA(x?gZ#<=*7ZcYW+S>gt3KfDfGaJGVMZ9Di~=gjM*HvBLfl z*a%!|Pq)2edjQq|7up=wSF8uE8>|7#+m^d5O_mb*FY?p!UU`w6BK=6Z7JJ-Nu&;ek zY!Fj~51_{XpQB*lWc)68H4aGlf&J*@65%$#y`|5>#GK<5fMta)=2_>T? z{Fo##77H27 z(E?-?WwWh(Lq$RPe+U`Rr;Rkz6kk>$>{}-6^9uViu(}9Fobb_=d0xOb7d7!S0+uPf z2^nu-nF7}WCQ-4bi5d3w)s3TnJy;^a+%O>Hu}dW00P{;&($UbfVjH)nhqSDer^uC#N+{Wj&cyvIi2g*=u7Y2G zmGNQyNKfMk*93SM8*XaHNASrRlT#8&Um*oN1YcLM;c!$ zvj)p*sG!pLjPaiFspHwInYjZe7f_dVW{&w{@B%TfZSSgOD``i1!3gBwV?}15x4nxk z^Wp9joCRZY|31&XucNxHjcMJ(vmci^&I3CK-F+QRC@piHfIB7?FRC$Sn0FlN`FU_3 zOO{y?eZqdXPw}x!bl$k@1p02Bz;R4mGW4ce6%M%7BwA~LVfky_COjuDiTe&&z>wvjFxCJmg7`%f6V zP~jOc;Uz~8@7=Cs7rR2W#oZ^2bvN^LoS~Qdba48yuAsRMS#bXe^4Kh%8scDUAsorf zLqqG5fs-@QGI*A)8S@F@yLgt#aPqvmdJ(>;)}2+iw6>;k-P(qwl7OI7;lcI}HC2sbF9(jY|W7y;1er)s;dU{4}#=MN` z40<}_4x19^E*Z`JZQ>sLbS}!6l2L(^p3HbEai0n7$viT9Jej{m0>(a>{TcZgc{o`N z_~RZD@KhdE_{ZXfA7MQ){#ee)w`C+{uqX0@fs=7R3F%XL)eX;T9tHn{>2!~xUt);Z zfpznp-E-L8J`bOFQ!`Uju$qe9xTwXryM$4-h+F+A#60A%kDBPnSd!%Od;N@zS~NW+ zBvt~rAK~0%t5JsCeKk2bnZ-bW=`Uf7fQPw&vDGLi`C&;vIf=#K4l=zau%U_?!tB8h zv1*WLWcH;vd~O=4P~f<)gz3aEG`)n%4}#%=WO-8)%%kpV@9gWD#B}WGYT6PmR?`?6 z*>QIXd}K_>?g4P$&qqe@Qny#}viilCz#Jpsh8?@0=YDbV(7@77crPTa~B8PhJQjm-zhfeH-Ehi|H6h;?89az{4s|wK=y3%ocOI9 zBg7pLa>Rw%VP$;UiqEZKHuao@Dc~%eGK<4a$~+&ig%hJB`1RXO38MsL`zQE=IN8(_ zvn=KZfoYI9+rS`k8}V=HYz{BLiRrRG!=H+iQSfYJ{t)mO%^b7d><%@A@^731&g@xp-`J6Xo)iOk2r8E=xC#D<}p#JR-n zOmebEJSvuXH~`0_F+J->e7qT+2T*2Myp~Oi*Dz0Eeht7k_U8H~16O3wr|g zyZgy%-xBv6_ayf?x9S$~e&Ai#4_z<19*5n&>s<$2yIfmc=eU-_mOz;+&*gK8&cDHS z-;bOxIiG-CfWywqox7deoaZ{1!4AM=r-ohS1-4DtJzrz1vK87=Z8qz_tnbTF`6BE@ z-z2Y+YaAaseg!)KdmY`5&5qUB^T0990k#wus|(aQ>QuE%EmU*V6s&i*C|@X_C?6`nQC?TR ztK6$x58sOyz_wyo*{G~gYL%HvnNpx+C|*VK{!4mWdei$S@6Wx*y^niu_g?MY>+SRE z-u2#k?@VurH{YA>P4RlYHqTd{Pdy)dKJdKf`K9N_*c1PX=a}cap2s{7c<%Jv3@eOR zdJcF7Ji9$To;FxmF5I=Lj ziFZ7A!_HO$&)b@Gyv+OJE_4aD} zEPIu`)LvvCXHU2L?65Uu``q@4?a#K~v+ZDAJGKc|?lP}pzhoP>y83!r8aFp>*(O|3 z$#%DF?+f>Zg~3lpTz}$)xq`0v4z7bYB!sR_2z^75^Q0k(70$$_?n~e+ zo0Aw65`tQ0LNK>1A(*o(A(-`7wlAL*cF9>6pFiUIoDtU>MqIBOalLx@+EY8?x_ZPl z_V=Zd{5>0a#+$K;3lo9Kr$?3af}f8f?EK;A+EFS-B~c4T5tK^Gg!h4lj@snJpf54V z>&;BO;7hiPHD34H5en?s(y}_-+diL}4#0kmww|<>;mb|Km&=DQ7Ytpd{B-Ej_wmrB zWd_vS4M=9&;ENxg>M=azF}1Ox>4b4MwVm$j*(jLw~a^( ztuK8vF}&}qQQ?1$u7!PXQi`GRa-WzOz69H`M~Ah@aa+E zlcT~Hlg6fgjeSBSl$atik8VC1lzJ}yYcn7mVsKt!F!5e5FHDRLBm^hl zk{G-(F?cvJcx__v>crrciNPxpgO?`;FG~z2jzE(yPK>=EG1#9NOnm%J?oN#DNDQ_m z2E&QLO^Lzt5`$+a2G2?iCbm&oVn$_&ouO=10&iL3tf6d4Vr=3xp{y=3wk9!1_C~t% z$&yBQ{%N-5w>$p?hvOVx;y}BUyYsK&p#vQDa@fOR7l%F$WUrz-znzC#Ign|J?))V@ zG>-$BIqA-y#zW&d1UQh>qkIFPZM?!Xrm3XoBd?!e!9=mQSF=kP9vw>g~R zK(;!%1H60zGTG4`_#TfV%N^YTvfR-fc#IQii*z3H>KV9Zy^dPN4F z1}q~M*1N;uj6=zCaXcLEAbQ57!=&agCtc2FL!7HQ3>yXEj4RmWhf}t+VXt$>)ofUc zC%KAEIOsa_!=cNJ>xVC|8NM7&n-LwR9vr^hKYY1w=rVoE(53g<;mhWsOB-2SA|0ep zftE+%wNMiZE9jMaX%ESqa(RyB6=2d*GY{P8{)WZ)-PI!wBlu9?Gx>Kg(0L zvTg9&y9)jp$Nh1P#IYxi=f!aY$G|E!CEMPk``wMS=n{U9-L57d-SM4%8F3 z=aWg8?fEN+m|w}EjKc&DWTItzzQ#k@9DD?Uzi{|Dho5kGlfy{@?ROmL2H5VupF;jQ z=DwBhG$j7i<}Ba&Caf#Cm7QIRlmqgHFwv;q*BjP62idKXSb9 zc*pUUf|H$`*;KKmix5(xciv zSvFW!TIww!_@6Ad1TC5+18=pk{6_v1wkh71-+?8>)ADionEa%CRK6E>5D&|T%OSSDgdKLcZZM7;#|d9CULkzhc$x4e<0ZlujTZ@DFkT@1zVUs+ z=Z)tHj~T}ZpEI5#eAalD@O#Gh2%j;YA$;0+n(!&(DZ=j>-z9v~c#`lt#&-yxFrFZM z+<2Vu+s3yEzh!)j@G;{t!bgoq36B~_2_G>YA$-_)nD8M3W{gn22aN{_A21#uyx+K= z@IK={!h4N-3GXrPA-vmwT@~=%W!y!0r*S9Y9mXAmw;Q(;-e%lJc*HnDc&h>9f8e{t zxP|a$<7UE}4A^G@{YC>e`GDUvzDan4aRcFD<1pd%#`T2P8P^eRHZ~JB8BK(nj7@}% zMkC?*#`%Qj85r{+_gv##!gGvs2sauV3C}jpCfs1)nSgZbjrD|Q8D|l$Gu9EVHP#ZY zG1d^SHdYg^GFB0;G*%L>FkoX4a+Vv*36~km2$vc#rwIBIV+rA6V=-Za(Lh*l)Dtc; z77;Eq782GOb%eD>E#U%V0bz|%Ls)H86NZcs;e2C0;XDH-W02omV=mzwV-DeLV>aO| zV;12|V;n9V;bR9V=CbkV+vuF0fUc_TWP?EBe24#AS^dvJqzK<#$>`W zql|EpF^RC$C?%X|OeCCOOdu>VN(h5Skg(V&CLC{!CoD3G2n&ru!UCg!FyF{03>X1I z&Cm$*j6A||#yG-UBbPA8$RW%&vI(<{EW%79lQ6@`AWS#X3Db-;!c-%bFvUnA^c#M{ zWFwg{$w(sf89qYQPze=7A@mwvLXY7gbQ^9$m*FCG8ZhaDdc*5hLc3unv>7%+xY#Ac zi+e)ZkO?J2A`}ggP%s3B`d9i_gkS1k68=a358)U37lfbdpA-ID|2N@h`e%fn>Yoz+ zOaB+)KlOhS{zLx<;V1ehgn!rnPWU(dZ-gJ~9}|A0e?<6K{jY?7(f>mDXZ_EFAL<_x z{z?B6;RpH$gn!ikNcg_~KH(qqKM?+2|2^UF^xqNwR{t&Gd-{8X@9OUo{zm@|;XC>} zgum8*P58F{HsP=IUlION|0Urs^j{GET>m-Y&-9-WzNNoK_*4C-gg?=LLil6-$Amx9 ze?<60{fC5a>TeRhp}#?RT0c$ry8b%hDg6}TN&O_@3H=1&5A+`pzNWuM_^SRY;c@*q z;Vb$pgfHta6TXBMajacm)L$fgL4Sep`}+3@pVyx!Jf_=-(lHLVtqras6?^Z|mPC{FeSL!pHQ-2p`oSB|NGh zC45AGgz#bgVZw*>hX^0kA0&K0e}M3Q{eHsx^!o_!)$b*|N56;gZvAe;yY#yV@6_)k zyhFc(@OJ%n!rS!Q2#@GT2yfMICA>wyh45zmX2P5Fn+R{zZzTMt{!PLg^cx5d>xT)i z*RN-2Tx(oQc#Uxl;WvzL5MFIuO?Z`Y72zS{5aE@^m4q=PMi@1sgjX0>5DprHga?g- zgqIta6CN-Q5bihj6JBOqMtG@lDd9e2AK@j&C4_s8y@UhC0Aa+45MFFtOn8xT5#b(V z58;Kzg@hLv7ZC0?b`$P0b`ka){e(M>orF7#9fW;GA7QW2OW0%d5Oy2ggxihngk44# zVW-ha*kN=Kwj1q)ZAKg6He(y%R%0t6Y$+197%hZ`VG!zuP8c@Agv~}X;TB^HL;X7a zI>KvpY9IX?o!UqLhEDCHU#(O7=vV2~KKdb@+DE@qr}oif_-@MNM0IK({R*AhM<3Lw zee{DmwU2(ePVJ)~(5Zd&{W`Ueewj|~qhG31`{?_0Y9IX)o!Up=t5f^v13I;j9)Z~< zmfyuXwU2(0PVJ-b(W!m(3w3HA{Q{lZN8hbe`{=uLY9GB{r}oiz>eN2^4xQRZ@6)M$ z^j@9XNAJ<8ee`af+DG56Q~T&$I<=49sZ;yt9Xhp--mX*o=xsW+kG@T(_R+WM)IK_X zVv^o1I<*g)h1y5QLG-Xr?V~sA)IRzaowv_seKW;3=}m;2^i70~dL!Za`uT+C>E{ui ztDj4Fj(!f|MtvjU+4|Xp8}to?>-F`7XX$4VuG7~MuGQBPuF=;JuGUu*uF_W#uGCi& zuFzKyF4vb6F4LD0F4dP3F430|F4h+lHs}q6^?E(wB7G6zLVY1&onA*+tJe}P&=(Na z=rx4ZdNpB44-wAS=M&D;=Mm1;=Mv7*=Mc`;XA{oSXA#cSXA;iPXAn-;rxQ-orx8xo zrxH%lrw~@@RfLs#C1HhL!InNP7QQX0Kftg3?dmc$17D<{Q*KmtDAh_XewDxAz16$h zTjveH!ul(oJ3JTRTX7M7mz{Lq=iZ0kT%~Ti>nE-UT?4Mgu2g*0f6TcZw){n`7}(=j z;PB#`?-lkMyVLfnZ4Z83CRu-Jz2CaaI>YiMex)6-)LL9vO%R1;d8c$*IwYMd`NfyT zE5usib13yS$AW=Ve3_1zN%nl$Vjo(<1uxA7;xZ%PvU0$4Y0u@vP4r)XslymO6SYG>p^kWV&CGp^h| zP8r7(nlo^Ut?W6|0xBa1JQ=QLEI=NyikTUo$)1xv3#SE9QwL75bv}$gH=!-yb32>( zVJDuM31)T~1KAU@gE(c-77mD|seK>h5Uft7Mt!oIuvZtP-3cqGR)gK+cL>zA|xW ziKdYOP9IF*a2;Ba?HcNgWC8>oDQjM~l9iXm6sR0H#TNxR{fWH+b&w7*sVI1E;tdPG`}Wrb-%7=EO!ys!39kGLu+=Ck>q9206zr3^jZZ zpvD)5Rt_%=J;e-ho@vdSp^D3f*1UPDh8KpOV#YVYF=i3Fp@_>yEttpqPQGCNRNVgN zm<98Omobf6Fz?Kw^>q~kr??T$GvwtN$wmw2<5uPB2TsN9a4w@odF*b9uf;Xo;x|FQSp@ljN5`}mpJ-I?9VmUIFEvPr0+gx-Y> zp#%a1LTDm})ZLKYC}P<~P{f9)*cE&%h}hd>2fL^QyN|t#<-tcpMHKv9=iFx}WfR}` z`+0xg?_Y0V=ep+1Irph^=FH4J_pNm@fQF<`N}qtAoH)oRXD1VfL!`$5GAEAojPwEc z$%%uEa&|It*hRv>n>f;Drj5ogJaLe1&Q3<7E+n-Zjj3sa(gxy(KujEDnp5EuM?0lv zzoyJ7Kbfd@J#(ZDbEl=G$%%t(barwQ*-!wBIdSxf&xjv@pFD}IvgIS@JF7_5uGrn; zQ{z+cLm(y&yobU}sql%TeX%W6>@H@G_!L)sLcE+f)UNtng^a&C>Gurhc;{IBZzlqwv3U;FnNJ+;>RkR;+d8+O zIbh=n)-7q`cQpX1wClPS!9xMncX1Eh35B zx!uc7bN``j?$c`*)H-ToYGv+Z>awF?wP%w5=`jObA0eh7lUmbr7=labwn+`kc#MDEhsWMs>K-8T2>)eEW})iKpF zcWz-aQZRD=3WC3oxtDet3AukMB8l8fx~lsZZE~MCy=p;~qbjCK=3d;XVC4Qe1b-@X zFX}WBa{o+361lJJD)&#@0G(|~CbQzd#Orbz59v6sZ25|btNkl0;flEiKj6D1}{jF%WEF;-%X#At~g ziEfE5iB5@85)FwCiFS#)L`|YiqE(_rqAF35$O!#^37qdgDe;8FKPCPl@wmj_B_5Ob zo5Wuw{vz?H#GfS|k@%CqJkp;~@<@LI__z#zOyZ*w|0(eii4RMBNaBMMACP#z#QP-P zEAbwQcT2oW;vR{2O582+4vD)Y-Y)SriML9;MdCjs-Yjva#2pfEl6a%U8zf#Y@j8ju zO1wtm)e^6gxLx9v60eYWxx{S}FO#@c;-wNVk$ADhizHqsaf`$YByN^?zQpq+Zj!iB z;<*wxNDN5~N<2s6*%Hr^c&5bl63>vhPU2dLYb36g*etP0Vxz5 z5*JHcB(Xr^LW%hj7f75hF;C(=iE|~+k(euSw!~Qyb0p4`DBho--s1fUaGDIymN->n zmPDV#DH113JVoLpi4!GGkT_oAIEiB=j*&Q8;wXtDC616dT;ec^nG%Oe93pYB#6c1> zBo34~Kw^K1{Ur7kIG6NV@Ki8e?x#simFSh2BC)r`UJ`psOqSR~Vt0v261z!El$anf zUSgcYScx$bqa}JIx+S_KIweL4oI`pocsAsa`*w-CL`|YiqE(_rqAF35$OuWVg+E1+ z`zIv+De(`1xun;E75VRS|Cq$zB>pP#7l}tD{w(o`!1@0FNc>UaVTu2i_=CjnC4MLI zTZxAxek1W~iC;Odd|KjD z0&_{<2>na_gU1*$ocbr1^o?+w`X`t4jj&JsgIj+YpZX`4^o?+w`X`t4jj&JsgWF{p zpZX`4^o?+w`X`t4jj&JslS}$W*r)!Xz zV2?7-i=J(sVow^pu0I8h{l)Gi*9)$*U0Kdwoew)}oas^DN8J}y8#M<0|86rXjC98b z(0|W!#M)nl7JIH;(;tK7zf-g$+RfTxyybu0w#_!%dffV;wZ=N!^1bC&=uY=m52%~e zDay~v&C2OYEHeF{{4EL{kk49@bGd;!{!czP_OHN-VYyLOgBPTDU)#o>O?JWBxnyf{yJF-L4wo&+zY_yZa|8SC5L3?I}2P7{J_rdHLKROXab_ybMN zcqinqDJ%7g_o*4m3saRB#)@rCaaAo|aPX%#c>c^S>5(lx`K;c*9I|F7s&x&uB`Bm2 zDLqF(1L9;a<%I#t3;f{R&;kBf2j%HDrDH`;g^Z=5qU%UYp+g0^rov2RXR)&Lbg>Or za9LLsTqXo|UBSW1&S}cd@nXv>I5l)&DOC`@F*;OmX=DWp)`qLNQ+ckJvNJ>3$*TyB zgC$g=A>BJxaS5a>GRm`?8ye6%(;ML$4Aw-*y3stPvRJ8HD7I>ONpr)T&;eV|SRBq~}R1Q@tc@@Wp z4oJI<&`W4HT;u!&kd$xKHB^Mv39^*p*-CMa*kXWGpp~UT#<=0_5<{b4p-5a_CJn4) z&nPR)M+5PmAFLElR*ENyEh0dQG|3p*SNT+#ipKd371N5Eissj1JWCT&O0iPWODWD! ziYprH8c-3k&B))AcBse#NXctok!7=$WjPAp%8HO>Mn_~t=8ME#RAkv?W!WT!Z>b{E zK4WA>^1>BCJ494unX8y$T+G-`r>9;D1Q3acw>^2@4<)R9!73NZ@vc*|GzZRy0*2$4v+ki&&DNB+R-(ba8 zf>UZ@=m42@bR?v-YhaAwIgpcU1n`j@_mVhb^cb(wPstpvWDXTuegN;mrHRL05koeY ziqTM3UAwxh^<2zUCihY@`zV?GKvw9$Y*fRp*vGosWe@G2*~+|;oz_89GJ7bQwB>cc z97;wX9qH}oP-tk)LLp`t#myy^Wla?|rDbc|PoYbcxEdv{RBSCg7W#>dKRO0Q$jTA2 zYNp~19?T-vbT%cASKo{ddqJlFgjvv6eB#cA~Wu*@1(sZQH=I)uolfo3mk)t?f zh%NWbgf^Z=lV;>~YMMyg^)%i`aZFMi!^M_Q+s|F8VS@8f0g@vM;6vIeq5!qcP3=n1lkFSA z_VpKAUIKK=6xkLLC741b;F^48;Uer~FD0^lJ=i|3@`fwfWGVtWMgE0XC6keOywP>1 zWE4#;8jGKe_sEpcfm2A(!1hXbID<|Rf*SDYZ$(4dOw=6TchX!vZRO&Xv+%R>gP4#e zk%-I)jkZZbL}PP_SbIQ3rI_)}dS$GUI>qL?>C_>IeDW@DCn^xeIC|J9= zb;M36%qz^oPi<^2hZoiZ6G%#Gdp!$`jtN2vrr7d=q6RojrL|Py*utUs@nBSCyhyBM zra)<;?fZQHcqGP&7G4?5g>}@Tnl`0S3)$02g#!vPM^r%0IFiGC%(YX#@Q))oi|R_z zo^xwgL(wy9HN4CF%Nk`@7o3(@FtDH*5ujx_mMVi&xm`EM`Nu-e=(Z>Bh#3=SjK`0k zw39;z$bzL~P(&+?5ed=vu=i3>n~iE$G~l`dJ;h!#GH0aX$B#ixkE~cK-6N_nnyQeG zt5rkz6q%8qI3syR1A<0{4oC}@9SV(A#3-a3*|yL_$Bi8~8b6d76DAq1R0egl^5!2& zInKaDK2^-$dHNK`;WMhX2j!kv@3h;9>ajvjY>a zv}GA#3)4TGij-YdR@5L@jk5m+k4YSyI=BP}P$e>A=@`_%T{&=e4MY0DMj=K)Q2|UQ zk{V7sy~Wv{QqN-itUMCNHCeQDbnh?}68xD`R9Q*Uy6~wr(KFLC6+cU1X;}%{gREKd zYf;trgvz#fX9iWnvHLI;M>cpNysogB355Fw|uth}hXs);(O z-8~T%jNb~Sy0hJ5@Z)hOgbqlnm#GoMY%nC^jGI+c(Ns}X1zlR%zV3mE?i6HA7^7j?_iS=V97Q!ebzS6G4J|?6-VgM+q5e?o4 z&y9P<*q}7Nq=9=4fh2HVYPy`hS^hWE;Nb`$eFg75n?-CwzH!AFUyuCMUr{c_hJ z=W*DNyAk*Q6P*rxe|>ROL6pO|AD<=ma6E%=-qY-F+Apxr)qmCR&`;CTwNLOp`9#}s z+nunqmt=j`1T56IK|;N5>-w5#W4l(eJDhA+PqvF+7-xrCNS#?3 zo!n8_WhCrxE{ryIotIr_u-gmnMU%SCk<0(Bkan?QqxF9$SBp4yRR+7tE4E_& zKR49E^`3Ffk6iy>O2Yp324D!=p2N0J5L$~aOGsdscK~s0dj{L? z6XaCk_L zWS383mroE|zMeo!a}8>wj=TxDkWzQO;7nqd4`Y}26eLEWNNo#& z-q}p4J6j^fu&wEAYl7JFnW1BPC=00M}8y2$<=~d$~V8_C2qQZ2tT(Pmu!`WtoZBAgD`JyE^ z)IxgJ%E0!wH&`regp{CR`OO$OT($2RfB46dzGV>@!)d=6xs z-EKUmtsk_0Ab#THJRmi-2etpE1(}~sng9L5*|vVj`q=f}^?d1!PrSGmH$T&dw_D;t z*jZedJ+8K@bWx4CYOHOy!oxkpWUpddo3=J_ZR%RYYF-#Rz!kh9EG4(2uro;*jJ5Oo zvG$VMK1=6Px!Bc1R`*#wcr}lYn|H1P4zUe$<+S%syfLscr zQk8uwyH}=HB3?0Wf4MF>Dizm3T%3O`i7Q&|?_5kp&x-C9$rU)hICOv%%$2?oExx9G zp|a8LZN;_a;YKeTR@SF1vy7LoAasDV(v{=|9jm)qN`}O&_GN4jYqEDb;F{Z)7|VJ3CQrHzkOQtTtuV1LwU8GQH(aFRt|WJ8!~}m632TCo4ux#( zj}_h(-B+Znz#T#p#x5zscQSSxNfa$E<`&h7T2>d;O(IEy+ulO)>Mk9!w9nGPOL=^h zkn7H)x{)PpXe+kesnuG-CEg|7m!vG=qA+1_oqD@N8OXnTgvi#rpL!+F(*EveA$wR~ z7{8F;{NSMv*RzMY{QeOimDMSE-4vERZTgI?MRN)Yr%lh!T1L5hl^FwPB;Wx7pYV{k zP{VgP=qrr2dDkj=9o`ScB*y452{9$OF&Y{=z*X_>4oAd?3;r4;luy2+J<&Q`xRl`T z12(-3mSxHv(4uA$$V z{{Vj_#m6lgp48xekdpzS16)}j@#8wkkMpmh_!tdQ?kH?=BiK%9zwM1+1>&mm5j$?= z;vJl$FkE3DTK?2RZ4(4|f(|!wcpl1i_Yr@JC`{X~@GE(#mZ`G}vh!xmE1aJOBOj`k<37Bsvxll_YVQ$h?;&C2`ES8 z8`IMvW_cHHOcy9GmMJeT7F!E{W6JgaXTa^F=7E*{6Skwa?`)sJ(p!t|1>2Lh2l1`` zPS|<76!!DavNhQ%ZN;`_u<|y;Hpw=^HV`)65^YYK3JY(CtzTL{u)bk^8J5=`vEB_| zf7e?tw{Ee9JimJW?fJsHfg|hWlk$6MV#dxBFK2_3q2vTihYo60CKXyH~gi+_~~NL(uO!-L=Ry z$Cd4x;2I7Kf+?;)(jO5JwnMa~VdQCH(Eb)E_f zbu*lkoFibLuD3HD7V=rtuTeileGc1n2cn*fdJLB7Zi~7;Y8&j*ogLK_RT)(rwG0*# zW=5S7H8LtADisz9JyDu*!Z>Pt4-X0df<3|)ji=xxVUO_-<67e~SR*{gSZ!1rrN*hS zML5HlWQ;Hd!V+OOe932X{OR}^9v44@9l{pJ3yvop4?6C2-0ZltV0I0`>-% z==1bxu+=|I@2B_FV|BZB5?1=ZgQdZD;8)=p*crTAyG6SeRtC@0&eR%UWAJpXK${H< zgJZP88vGJj*I28qCDvu|H8I^f(K_7P-`dL>XLVRUhE0h5u)+7RWsl`%Sm3+Fve9w| z?C+IZPP630`rc%?m&>qtEr}K<)R2y;ht)6D_hCOmQL7wQzI{&B|4HmwReyxoGphbD zv3;uk5V5_g{vffZRs8{CPpSI-#GX|3`-nZE>h}_RT-EO(_L!>QP3%!szl+#ERecY! zM^ybzVh^kOZekCq`W?g`RP|lN9#Hk$iQTX2w-LKf)o&$sud3fd>>gGB2eG?V{bpi! zsrpW0dsKY~u{%}$CSto){YGMUsQL}WcB%UH#BNvh>xkW^>eqtN&Y7xSM{K>S*AhEJ z)oX~YQ}t?MYgJt~^%_;Lq_EYhzKU40s#g$eQuP3_MpgF{Yf$xaV)d$CW=Ga)>2=y- zBG+n*h+L%=5ZSIR6r|*HEuY9M+5#dkYx9Y`sO1rPUYkecS#2(necBw6S;?)cmP_ms zRhv!hVpW?(>>^dmA$Fmv%_O!#)n<^8CT+SP#ZPF{#IfSLR4tp>*{U{`*jcKUMbXaC zd_rvRxY_Vpr9vdMUA5 zRWBh{qw2-Ps#U#+Se2@;Bvz^Fg~V2=`su_fRDA`pfU2KH43_DZ6DwEsQ;C(S`Z8jr zs=kz1iK;IlR;=oai502(B4R65y?|ID{M-;bUDfl6tx)v^#7pl)l{8EOI4OW zO*CkgPtPVYS)WQ|lAc9bs;cfIrl|T9VocR13s(7;s-Hsaq^eIMc0$!B68lrtClLEX z)yES%uIl56{jTaXXey7X`WOoPRnX2>LZB#r0O(sDnHhTi4s@7 zuhYP(d`G8&Q(2|cz^PoN)4-|p>w_qAnVvzUR3AvBL?1w;Snp4HOjY%M6f{-uOF!a$al%TinCF0Ukh(zhVi5Pk>A`ZPL5xbsDMAv%|vFY83D0&hR zrgsx$)n9rdkrR3Xkw5i#B7f*{M1I#}iTtL=5cx%q7DZh3ovM3?eXHtjV*gTg7qRzL z-AU}Asz(uPQFVjZ0abSpdsWr#B=~t@`!el$ivzRA`fYQ61iXdgUG$waU%C}yqf ziP%@F_9C$_RqX|0U#Qyi#6DNG=ZM{*YR?kerE1R*yIs}x5xY&*_7cN&^=V?asM=G+ z{-J7561!Q|o*=eU)gC9dL)9K5c9W_-O6*2eqZOO~23326!q%%At=Rl^s`ij*K7X0^ zAdwR70U|}({X`12`-m*p?j^ERyNAdk?QSCZ+FeBQv^_-TYIhRJ)piq^q1{0wTiZn> zOS_%O6zw)5-pDA##_tn#dllnaFOfiO3yVBaz#+1|qj=^+ayb>WKV9t0i)?RzqZmR!!t4 zt%}GES|yR|v{gi|)hdWwtp$i&uK9^<)5?i#)yjxmqLmW4SSulNkycD(i&jMBJZ&YB zODx{PQYa9!C^4b}&vP#+cWaD)LsX4DJOGfIl=(2(ZECo{GD$AanNd zVK?YS)+jA=ry*NY1Q8yL;ztCt0%QAQRVprVUVOP^x(GUnZY z;TE0N$Lq6CgCr}9pN5S$E9hle!60Z1`XvXoWzjy>n{-P|bhLc~^9@I#6ww_F0;0EU zP?Lf&UVDC@Su8q|zc5~y) zL!2w4+2-h^=Z3ER<=ojkL*4hB*V+d!nQftH%P-OG#$KJebtA@YG%HdSZ|n}7Q?Wts46hHhiuQSZJJ?nf z(Fgw_EEsK18^;U1lug@&LCG7$i%!FN=(Asjs;An$NxY4``0ry*7LC_1sxO2PB#y&q z5Bg#lTgh0wkDot$oTOT{%lPnM3bR^=K@?9NWbpQ3$LPawQ!(UU;@yE5zNt8jQP29Q z8dF!Ym%JH$aDe4NVD#o_t8cHmgAK5X5sldV0K=OCB)S5LynJx(3qrmVdrY-PFU9PF zcE*TBardHV%o{VGUBrSGJD+oG3Pj;By7DFb)Qw^X9gKKaJd?lE%IF2Y3hb)MriMStcPmg z+*hvHa!U|JSG|{cRhYTW8AfH@g~}9cv&L;jVRJGl;~kz?-c`BbgZHxW5~zp zbpeJ+5`4R0zQcTg6A5j@>_Ho24lhQxqM{3U%jlG$h07iXCWbr;Z1`g!Dt&F8hj)KxgeBdAn#k6!m*301u?S->BD?pgaq;9MTk~; zbOvcLG#&EY7#bclOCW+*#Gr^gKRd=Um%t0_3;J*rxnr19L{8XB{P4Gu*{uf^ACHPZ z)rSqzAp0O^JkZL5R_k66h)}bbkB3^-Ai^<0BAAEZFUQLn!dWl}yFif|VbiE_5Ep&J zOTZ^D`t!x~K@g6JlJN%MLioNHzn}mW4Cf$*AL=i9o$>T(D4A$dY6>v{`h1M-MCBB= z3s(UlK=Cr{qbK>_4lX+g!q0I~`U`HB0elw|nOAhNG8GX-17m98MaOk2$YWUSQ&A+v zCw6#%9fEii1f=5XWo0{<>fe~v<+Oc-B&U3?sc2> z42)?@8uLDK`_@mVDbZGBzk9yd?l`bb=flOhLG?bL^I&ijt|s|3tSM$ zOUA50RF&5qB2XX)YUX7$6tU|Ay_)TaMRK&XJ&PlP5Kb+~<%&PMG9X4}A*YY2kS_kb zXfiQ{h-DTR6-*t6OA=EDusD=(Dn$!RK%Iho#%EbPT=a&*2ZdL(HBuuze!ifW7XjJQ ze*`J`@wL=^oP>P%*)j2ZIY#g0rxa)qdqS?&huW^hwUq~a8suC2@j+`{=|kZiUS{PX zd}iXJ@Q2J8bFx%y#oWVp=`YazGanevYSqVr&%E*;c2qV1!>y0I`z<&z6z1E(d<94A z|2SJnO=aqloiX-4?l?Y01wXfJT{W;<;rVq6vkXL&e>VGvo{7A;%GA@&W2;WPHkQ5A z!(xdKV#(rV8$@|9-h7cS~v-P7(N!e*NYGzehSj@ zYJqzJs1g1`JTj&spAY52@n9C8An<2rTd=iS6|Zj^t`C@8kz_|K=6g16DZiFj_MtpG zuxnsP@mhI*1u3nMFCtZ>=DmOm7{aG%d-){@rRO=3xcP{o_z;8=c)b{};-4a~11d_! z5AltFpddWJ$6ErkvlnT-s2Gx9hQyX%cIaFb?r5AU8y!)+e>(vjQ0?AKc4!i_% zAAw1HZ7940z6Z~M|Abe-p!5bf;J@MjZ>wqd?`r7>aQ^?;|DO-u{|4Bip%L<_b+2^? zeD4L}S+CBr(vsu(kMNxr=*-XF|DQe~|L=Pk^c=I`Ork$-M8^5Np9K5DK1ul==`U$dxv*1Geka*M36ur= zB7Iq)Twqb4RAPz5Vu7azR!S@sxIC~z;%Nex22K^26F8e=`Sa2b)$`I1)$`Kt)bnHq z2FHaR7@)Az1AIZG+b8{8?UVke_DTO!`=tM=ePj=&e6RFBb-(lzb-(lzbwBxuLc3MV zatOOM*sm1(`^hd1_AA8x0qH;Mfb^fWpX}G*c$qlqR@j{*<*e~|dSL}3@of5?dZ+X&x?B1cy-xc1te1X1uaSN}>!qL1djHiTzirab z=Qio*bDQ+TwoUqB+a~?6)k{BY_0kX9#nKPk#r{i$oQwUJ2(0&CEO3keB8eBu@GSz* zmwwpJmwwplr60CU(hpm`^urdEe%ON24_i?BVGBw>Z1vI)+u70&TfOwdRxkaq)k{BY z_0kVpz4XIYFa5C9OFwM&(hpm`^uty!{jk+bKWz2V4_m$T!&WB!rInB!Nq>=FTqpd6 z(jV$_=?8VW^nul+Fb++`gI$Qcxoh|*S&X#^tXG?#nv!$QZ8PY%M4Cx<@_f1t{hh zAYCW-2gLk>eKEfP#ry&k^9xYSFF-NB1oj1lJw4#FLjJyhm@fiP2gE!Pcrx&m2!A3V z=9j<|0WpsN#ry$$QXGFQ@VLMS0^Vq?-qD_;7*CVCEg)X*jEee z2<#O5HwJDJcunAXiPuTIR^U|uasCIc2y7SoR|Kx)SpJLjNBT>-nD5JvNI#@Uq#x2B zrT@_%$sS<&57O`G57O`Gx6t_f>m{y}xJF`=#72n?66+<_NvxGvBd{`1C9oo}N?=(a zz!83bM+h7&{r(P?et!o`zrTZ}-`_#fkMSVsw|J2BS3F4iDIO&K4-b<5hX+Z2!-J%s z;X%^B@F3|wI92-pO_lzCdr7~*y`&%DUeXV6FX;!km-GXiB>n#;N&mk|(*JLg^#7Y6 z{r)CMzrQik-*1fc_ZuVq{YFcF!qL)SaJ2Lf94-9-d!!#=P5SrMq<>%N2#EI5q<>$F z^y_OOzrN*vkw0Ic!s7v%z?0+$xcnsf{VhK!{rjGf{(X;0KfcGv-YM3nSK;o(j``~& z1CJI4Sr_8rk?mL854O*t`+vapob56Ac)!hdJ*@a`ww(>l|5fnszSuU$HWl}GLv4NF zyCvGDS^u;iu^zI1Y<mV!^KH<9GwF~cglv;D!FFs0X8V!w3ELsEeXDzyp0v zRB6AL8Vc&vRGpnK9Uu<7$pJ$(D zpMWO@{p>yMv39$DQa`GHhi47%=&$O};JLxw`Yrmk`d0ls{Y>cg2lUhR0)4jb)5qw8 z^)$HmaqCv?xb`3IYwbhr4ecfEDeXaRx3)vuu3e;U(AH`-TB&xbHeZ{eP0~idA6IWJ zUNfvKVEtj1b&7Sgb&xgH+Rf^+S}ea?ezbgL`M~nJ?$L0HL)vN@N$Yd81J3BM5!DJ!H?19ZDJKtpInQW8EHk#~QlLbw7j%0e^5|dqQvMnaN zfY^E?aF)r=B(}~7oIz}j5m-yC$q1}ASu?R}d!W%|4JNBMS)IvhO;#hB9#}6J{1^HY zOco=wk^Gn|DaaG+CnZ|AYV(syEN7$=%bA_xf$797hTmo~t6*^Vct0BDKbh=5#C|Z! z51Z`Y#J)Akzc<-;#J)Dl51H&6VqX~LUzzMnVxJo2pPTG6VjmmjpAh@dDF2AqyGHrH zO!gkJH;wXlO!l_Pq*iLR9#|*B@JJ@G#$-*zDvdxDu?i!widdNu2$;-ovT|ZYMxfMW zB_=B-cDfN*X|h6M%ZMxcOLjy;fXvIQoaZ?Zg- z%`@3tlg%+%uE}PbY?fqt;3|_{VY16iMjDlY96eBJhERTG^RqJ&1L)2a+Vy18F8pHJR6BDJDxcS$Dzwe;WRiCObjwxZ(eU*l&jacat3>cEs@0 z%-{$6#SA-YGMXd&hYdf?5uDK+!P$=#?~ud)gUM))@FR@o2+qExqxF9yR=ro9r=Sj~M=c5_{0_KWwsx zh}~!SA28Yd#O^Zu_nPb;lif}1PQ$;4*lxT3ZIiuavNuikhRI$x*+G-FnCxYfy=1Z% zCDZ-So9tPW?K9caCVRqUkDBZelRap%`%HG1$?lX)_3tNko#DTp*foa#T4LJ_Kg}gD zWaZy(hFxhgnqTJJV$AO?HOK)|qUr$<~-`waJ=I)?~6qlhJYmrds^h$uQl2 zjmfSy**25WT+CBkY=&(y+4&~hWU`>i&L&o7_~{CU58VB91;cmd{$e^>X!utWTWm{`8yFEH6cVtIytfyw3*n``*z5z96FbBN7O^wTv3 zpYi+Y3d>oMd9=`E%T2b_WQ$CeZ?Zg-%{5sru^EPcmdSEVMpqmdto2W)FtBOFvJC%J zVp9yikJxy_KiOobm~4{CCYo#lvC)QqtjWd@8)^7Q5gTs!M-Urq_=lM+(_}+UHiX!q zL_b{{Vad=>*GA5=%%f9GHr{08Og7qNBTY8kWP^#N8vb;Xr4j2DSpWOfd7X2yGbZYls7+B*jN|xHy}=lO@6We6rrW=_@3b$oJ7M>~M(?G) zsa>Wm&>XgBY#VKptiQkpK#g^<S!71Lqjf6CdR5BeCV)D#^9-Xcsfr^} zad;I6HzqbC)FN$acWZAd9I{>^S&iI~WqZRe+_^hGzwfQsyDRoyik(M+Z8UCO8+xGW z5!SW$L(*N7_7j0g|3KY}}?u z2TRf(g{3I0huHGNXlgR94WlO=%kw-hk8W#Y^u(sHRD~G|b196QJ%JgzY1C1XW>20& z>Sw789gRsxvlFT8M6%fOLQD*`gbiy)6yjMbL|eNjHg+PNoiNx5H#@;CpTN8znbhvY zO5`(0zR$3AFn!XC9nWCLQ^l4a!f7DwX%C6861k5G(52}U8#_Lj9e1+h$?Q0fgwl|G z?M_Ow7qXs?C`}LcTYvUjZ?Wa2nI3A9wzbpKJNC)b?Mu^cgh2c1w}I?8H~TG#{l<%e z&LunBo!A(B3WA<6Y_Po=wvRNF9UaS#juu;Pt`(h2#K!kS4k#$J2f7swyn;ncgUD?9c*s$Y6)Mu|vF?=uI-!-AQlW3psan)ti&qSNZI# zY_S!ljuwYn$Wpfw=`rXYlEfSAzjhhajeRwdeKlHa!wpAfygO;QyGe4_4cCo*naRHF zBev35DB1Gv#8~KEkqswpZ`;_H1?($>eVM?%E5*%N=AVZ+`x)!iDp*vS-bk z8NLdzclxk*64*N_>>XSK3L%6Hfp;Qg7YUg$eR_nDH~X`hFXg;=VPad1oD zh?3k+LT1gIQHavy<|)8uCr zOgAgEe=ysh!1kxG{k%dDlHQe&f3#MpqmY;Tv6mCr%PH(-ULOca>q^MYt@Y_BnyG%NM|AohF$d%iDwo}2ZC zC~sGyc0`CmvD%7yCWAebz@F*Lp5da8Ez zoxq;;5;S~Z z$Mfk1DG1|l>YTjn+`{akB?xFC$q-~v&ZFF>7GzNV`s z{5`4co@B9=?Rf8X`#~R|iHI)xKIJhXtXs zrnz1DdBFU+XA;{J%l4$OJ@AcE4O8vis5~7kQ{%dS6$HX0e%BY98SIYJ*&PeTR`{7Q zteUb`J;pp%_woPkn|I5fmLrx!!b;nJ!$KP@0dBLlSf8_=Z#@%Q0p-@^*7>maHo=-{ z?PLAIo$5|{|!54rZZZgySmy2Q27bq4JAmAg)J<-2lR zlU<`+8Ti5=(dBfh&STEQ&M%$sI}bt~;+XRV*zLRDxeFc(u5fN~2CcVQ_FKDK-PT7v zzj(g$eByb_^RnkD*dW~HxdD0z=X=id)O*T3%VB?Tx@UqX6Iuw}J#Ob}XO(5Iv)H*D zS^#rl@o$QAoO8G{!V@hV8#UjU&b(<74A3<5lPcJYhTt+kdzG-_;7R{%$=iGy@*8-)+Ag z-zHoG+kY3@H`>pFen2h0C@6yczlHWW_UZP?_OZ|s7-&y}4ZwK23tk=n!Z!&&L08}l z{X7h2 z+5<7Vp+wO_Qu+BdKc_%G-XyrMm)J*hpc-J|W&cEU#B<SlHpgVMO_pP_877-1 z*cl~7XZI9rO;Od^$>F1CHJGfL7z{e4~~26ck6P`~;L2!)V7lNM% z4ikJ&@D0J21fLPSMeqi}L4pGWuM+Gh*hjF7;2#8A3Dyy;6j1v$!LtNU3kY0Eu#I3f zK@~wcK{3H;1j`6U3-JFcVEKat_YmwMxI@5#`vlCtpMav|M2Wo|i-4KbSTld7J!+Sk zU(ntM1aA_&LO^wx`MB7dP8s?7ioHH=0_u+RKgC}95dv!Y^iOH;LxQ&nS_obuc%I-H zf~N=`BY2pAYLrg7r{79}I|-;g(RBiKx^f#56x>i)E5+N&q1Ca54-L6A!@nSe^2Hiq{45u_6IBybYg39JN6 zKq@tPDh>Tq>eSTl=opQ`)X!<}V*(o2sV~zW)i0ICb?TE8_$a|c1l01WG?r4gQ{d$U zjRL%%2f+kUWr8(VG%XVIFh9dfFQc%s=I%e3?B*~_y2@nR zO?HLJwwcV7lC;$f6ITMBN76-R*o7wBVzLWNcD~6rnQUX2b(>(aF(w;jvf(Bh8fLC5 zO(w2Dyeyho7WJ4s+AvuQvs1ib*7FI$nwlC`HJVIZC+gw6YE>bH)m2qChuJD>Q<%qI zC9ZAtO@W40E9j`dYSqic%GOqjt6Y5(*phJAs$$6+E1LvsY^++fl2~m+{3>E)O{=~! z*=d3`l=&+c>y{X`zAha)-2$O2EfBiT0->WUaD~LBgsBUJgxca&l~hBpRsRWxt)jlD zuCI&RDZ;AD8dn`MnYd=x6a0s!vSzvB^F%nOJeu^LV$LVbpeoXl-$QuIJ1zj&er*U07aQxtyN_ z^?eip>0;`wPZzUneY&{p)TfIRvOeuD5hX2;UW5-)q*8P)Y}F{bOVR`K+qu#zIT7~OouvF1$?1~x6$ zWYH#LVU~R|%)C3o%#$8w?h%5mE(ugm3A5hrFzX@C^*VTFNeoaJm>7*BOpH9iXdTAm zWryP>Si&s+-7t&(Da@?n1Z!?uU6N?BxG*dJ)?{BuR#nnH%!rT(ct2aSMywU_d(@{j^wQA#|t0&d_hp43Jwb4MnObd2_M72qh8Jp?I^kniR!$JqSqc$Xo@YND9 zcoJSZUbBpT8IFwT46ZbRG~6p&r)eBKO+Flu@HGA6`Z@YV_iMmw*5RRp+!q_tBt*2K zU0IN6DMHhU)=P^?bEQS6@%_o6gWU5PPc*z^r|IED!ZA-#Q*Cuc$t0e}t9W~Rdw6?! zxrD)?gWUHT+CRceOh8i>a4#{GG$kg5lTo3A+`Srdj7x2wV_d+-b8H?niaT%_GpZ2I zbbBWBjO`iU6Jbba?JAvBq#HhlryD+or%O&qj!lkFZXP~nXy_pKoW{pT2QM=T0gEhO zV`EuE)6hWoxb8)u=wrAv;VH;fP8-)T0hLnJVOa&egQ0<>_$1De33rIrX(kFKK_g;) zGBnUFt{bOALI=68Go+xg*ESPorl_bL8c2*yM1qP@p%(7g4DB|gV?F$TA%R*~y9O>z zYpd%rxsT1EfrR7)9<(IXLVnF0aYc&!6KW$$od2XUA9}NJC`9i>OB&YIHPsgS%WBFR zDoXhK-NNFkqRO%n#f4lQri|;z^jR@)#T@)pq{1_Q@^a=#9@0)UUR#|IqTvdy0#2*N zs9QciKQC{_!da(IU*TMlx*~c-;tGCvWT=IEH$%O;cZVvEkP}vG`BRyn2p>ZY73J&D zvtC7AQEXdbtl%L?M&8RDamnrTj`RP4ypJ1o4dr;ZR$J~>ocZzjvG^eb$++V(7Iesx9Yb?%7_6@K{J)44 zLK6VPqJfWt*&_=^F2K*iL(x3sFwBwMzBBNY`>06UW*{K(q>(d6X5pvuV7%!i7hxR- zC_G*NEE4}84N%X>@gv9LheTsSE!;~O8ZRZH@s6|(t%kA^YQB-Vwvn!pd~~5PxKl8A z?1^lQpHQa5M!UwCmN73Q7eCP$BSJ0QFBsCsb!hrH|9?cjF^~_l`#cB6#-}k z?h1^jDr(pKXoVj|s{f-_aA%Cm7=s@YjSjU4Utt(R5kvkkZv~w1yf*UPbOxT_Ix~0} zlskmWFr1k~+RxMp{(md;yIIN_8sNuE&K+`GEMGC;)B&ymu><%)=*n;pVtBDMD8kY4 z52zGw<>u!tDV&!#@6_q}d4)^!@=xiX+n@h1a}`1zi~AEp>LC%Szi&;Qx2T{nZ$@EW z{5iAAStOoO>PPmy(Vbe*f3#CoH^jvKHo`orI9I%(U3F zq%_{;$eOzvL&|{>DZgq>Iep>$>G@OVWaZMjEp=dOY-&m>7l5owyUO}Y5-^YFJ)M?q z-ZXElH_6L~8ybuI7(><(s}=tjlyYj;Ldr0uZ%S-RLP~K_V;MS?dly5ph()IVb4q4j zW<+g!r}vKS-J>^eCv+-zEXJpUi2nIZnV)KzHf!cAv8w8s+SAc9re|q|zalf#!hMMG z2{f{!e(4CAmqiBuA2ww5Aeqxofaa z<9;mS&WrcNJK~M_H8oJyT0wEU4eEG4e#8e#GoPHzH@#w}Ry;jD-8{)2ehAl+( zemDj91PDj(aZ%hCAW|&rD#gFTDN0c|czTb6r+2Y#SW2}a--&G&Q2zIjLR=Y(nlj7K zB}Fwu1NI(veqqF0bSX|Tq9is-gZcl^j_BEM#E zr;P%|_ETbeE3ti*STqjz^FF^TQ3uTe{f(%2B{o@!Mco>ghg$MTRR7$LrD`Ej@I^Vd zta^TJZB^LYE7#gtDIUbC#&kPRh*#4i)Upmh{C*uC zl3EqY71g0c%}}DSjZ>nyO1a@$&vq*3sjl;&oqw$>0N;31U77e!-r@Y!`GxwM>we`t zd?kM`JmH<`EW+FHLC)?@J?fXJFQQ(I+7q=kYIW3#sA*9{qLPf?jrZ|J`vxOuR2mD6 ziAIW{I(~4xgYVdPIWBfIIF>jjIR-g;I2`t)_D}5l?GIU^Trc2T_4Do3_C>C1?5EiK z+hg=U)aUTF`BnWP{YL$Ky-r`I?$J-t`|2+3nD#loGk8vWK-;OFt8MWd($=bVcvn2f z^SU-xOH;RN(dr7@G0#73U)c8B?z3HMJJ(i)_rKF@!)(d0R&dz*q4g!}1J)a@7g(#{ zb8dt+$#T;2Equ*AWx36AnPs*5fn~YHXGv8j;mO2FYho;d`)`>n~U!_^_ll{OlshGBVcEU#+aIt}U&_`QBJoQJOR( zA}Hk#Gbj$9yUXZs;@UVgz%Km2JXl*uVF_+J>gWil(xLqNa-4 zn)uiL{_vH5d)T`A?+@3sJKWHS2L`yK<0>=U3v>KV*ZNpX-*B}mS2tGp*|{a{f^dSc za|_!Al~mWUb5BjM3~H0Gtf-+Rz|PI@X2}ePRy5*fxeD(jARs5vGNd)Uu%fZCxvYVm zJ2lxdHXK}A*HG5f+)&e4(oj*?#Lk@%+2H36Y?CR@y)ym)gq^GYZ6%{W?_n9++Wu|Z zAo|^|553anQ2U}K)x=u{g$0HW#b49SGCUkuQ`=P3u&$9iCQmq?U>VXr9L*QwY9oST z4-G``?uCWmWdH*3Y)p-?XpC*(}RJs3V)y}^VPpO zm}u`tnv$M~vGfgxRX5|kRQ#W9+OfK}rfgkf zb6s84x`YvJL_!}9E9lb3p*M9B7_+fWJ~HOu0g++e`pB@DGZQVDW_gO%7FAW%t|==` zoY-k_{I8t`TfLZE!a}NQYy23bScg^AWWLhHf%sqA)T44WbyUKkHZ37eO}deYd#O#E ziSW4R+9huk=i<ERZrT#cc9&}~U+4M=>x-EKm^w)t0=7B`hNHJ2I@!^a`{L(`6lx^Fqt&^2kZBxtE;P@k* z2FKjoF1WC<4v!Uzss^WZ8l3WTr@=9s+m*hMW`w4-F~w~frlL_!n<*zc3r))DEY#ZE zR$_jeLrQ?@2yT$@QHJi`{kYjb1FrEQBYC80xJ>O6Q!o6ZZ%86Mq9;Lweo z1SXu)Nnp(OHlvEqt%;rv0rB5;4EUtYERLs6{K6;a!T5dc50$MQQP*6Ivti`ONq2R5 zXz-ve55?5AX;PX_ak0f*U(=>z{8hEZMO9clL_gbU=%UU-t%KXl%6`n@Yl_xky-`=& zSkcs&ap?t6F2jUT8uwi<%PHa0&paGH0ptGDSz&oPRt%4jkfJiN<8-t}D` ziaDokD^!)0G?kT-yo8^+Iuf(4ZAFV3YRdjU_TD=_ifaEKJ~OjrcDAM`Kwv`+AP|bE z)J=oXLK;oPB#^K(k_1Qs1Z=xB12$||y((hIda+zZbmuc z-d_kv2UPc=R{2Ft!L;_QPh#4Lbh}QwE+Kj%Sx6t(SVs4bkwe%KGzqpsn3(`0DOpir9 z`s`i;)7xWS!w_*}ZS$(soSql1#GTrbn%(n48km~dGx56mhWgg})ZCa3jVK}b(_G)c zzP8er_pC3xtfZFojCVzC!;18kJxgo8GYt6YC@0eA$F^i`8^+D2W4cGo`y1KP5c4r) zzJ!r2M$ETU^zDjl32JUHxkoySxPEngGpfIz1pSP z4((KJwYF57uT9d1XkN!Jj!zx0!+-sL$1RR4VcG6f$8yI!#~9BD_xxz^2_N z_Q&m4!$bW>`zr5u@KC=1R_vxj5`DP6FZ|Ox?8NpnWYFJ+clrlxH$h5ayX{O^uUl(7 z#kK+x3v*$;Zlo>4rdj{69=5(@eaL!?^?d6pSUntTO|pCp8;5sTF0$yB0PNX$l`oYS zln3FRz8!Y!%9M#pABD(=^>gYs&VXgZgfOhR;uM_{BJHnvUQ(RVDQ6VmETs~Nt6XB-83rZ{Vt7cWsm{nX< z9f_f_k&X&6ybDU_l+IsNS`CKz6^%<`GQguK$e){ET8J2+8dNl^YS#SH{JD**=zS6s zNo7?&l!xeAZDTck=*OO#HM6>G0hSX==Pqen8<%(`PL?j1JGW@Tym?C+TjFEI*^*f^ zOR6gyn|q0sE)-NPDJyPlqVG>}Nn&xQaW#F?#Dy2mUr<`rSVNyQv1fRdvjUtH$3-*G zi?%E-6J-ku<`koaSd_JKndc{2{#xT=oL^R5QCzj4qO@@-9TZ~nfipa|lj&#^dty%G zV){}O6I8ljUUB(?{JFeOG_K51ihGae5?4#bh_QM` z{@lvq#uMYR$2z2_jt%kWVhX+@F7={Wm8ipt{F%ko3(96zjx>bVq<2f=Pj6v+t0kF zE-vYE_#i3fY>RrKu!7v(oJRAE}AW#yys0ryg2MqIH(5yayCf~Z<5h|)_0 z0n@Qcwp_6qulU7Hbu)g|Ao9bGTJDaLVUsL55GC896!V)Hg3Woi<(tn zcm_Ty>op#_HzA+SXBz_dL9+=ixti>00oqwR|Q&g&DbgeClty-Kk`-$6qVi zJUNE8u$rP1cgt0ita;5OPkuK_LURa>L9Z>l+9XRph>|Zw$vsi>!YElAB_Z@FA}bjZ zCDTpP^>mc%pbsaSa8unP%-_|w#+YenDH_2m7NSzk^;jHgs;h0Tvwlj)?+VCIp-awV z^GTIhoNNlZcd|Ymd&2z*>vH(`ZpQR;<%rm$ikEvF-5YyU{tJ(a^3AJnX{im?R~Ga3 zq(Mc^tJhTg7l%D$s8)fR7Fr{3@ zQOHu?f1|b0shfo zwm)g#;8g}7l&*x~IYYK@>v_DbBJR^9<}+m5yuVFw+cCW*xb+Fo5wfwexUdW>*>lEL z=U3oeets!^onJkMz3TLOs^8I1r5^oMa?GpuLJWVgCEYQn=W+X6n0y%~8hUxN*(NRZ z%NNERoOoxCIN8UR`7N^QkC<-?@g;`B6|XuH^ByR|W8R}z{T1^3cO0L`Yq-QN}P$lr8Y=CUPI2N(qsX$i+G>JO7{Y9AJ6-q zn>>xMurIlvb)WBE;?8z`;JOJm@rOg-{dVUjX94U0KCNA?8QOTqUyer|>m0C|sNScp zRY%%CuwQOJ$)02TFTSqV+QwPGw_Xdc0U4GzESFeHEiR=KtL$@>RQYxJD)|)ICA}b> zEzN;I+w;hP_?-~$6!H=o8FBIw`h2NeFH!AnE7vtNFi9+hyy7CS*vTtS@(K-|67J;E z5K?vmb17$T;$qfZepn$dd&$do^0J4#OixS-cMAK18Cmg(&lCJDs~cLVkh)(|$V+bW zl1g53k(ZhfjMRn2!8prTBu$^oxhXT3Acn}QLb^SqTO-|W(oIiH4|fVHgIV!nF#4QG z>dk)NLLe77f=9UUN9xj+FOb~n@6Fy*5V&)k1Hs9r-yVp zNvE51BJjj;r!X%#pgg|#vp6>s-ma!{qyLj&HzI#=6nSwldGQ$XB4vXNJT*25xwN!+ zyFYq~R4yx2#+v6&tSYlLYnb9$TKOC|Jw24PHH(2IZesxX`v`ZFP6&FWvu)%E}1+-p0ko? z?Bp2)6@)vf$w06{xD}QZ>7NkR)QhM(0dF_nd6q^rNS2X<{mDTOIhaBY(hDYsI}2I9 zrKGqrC+UUAcfMwA*~A58Sswb4j$x!@DBH^|n^0v1oIS3}Q0xNE-W0>_B^_Cj|0ZZ| zG|M29>PSd=R_pZWrcJoOazG&utK>imIY3Y6hda5MKshHNn(46_=^4pQ3VBc^HzkpqXbKofxQRfy zZ@g%fK21a-?gR-1xn3bRV(%c=(?GO>un^ccVI-MKnN?mB^>wTf6mp%1TxTcOxyf}j z?UHb(und?rKK@Rc!r58Y$8vL~W9hxTbkQ9D82`9s3b{6uTAl06WLFQvgeuXSG&p8D!JN4uBPnc!kyGUAnp=KzsmeRiQFZ} z(_uig3E54aRLO1+*-Zn`t+`b|N8Dq#?H?|6`5HGnrgIu1%_B0fOBDDvI z6d|)8m*PZvJ5#aa4R{gb4+WWAPOh+$%iZL1dIIAJw*lD8IC3mfo}dYFb=DC)^-p&?aCp$lE|)fvWrH9@r_#aqb)ZwK1XBO z_y#qz`qr^jg>EeRb1Bu$t6WCT?N842l5^9@xwMBO7HZG0*I4qRvE9!7w&xnUk1uud`f8|)*VeS1$yNk4Y zNjtp)?KE0Mmhjjg%_FOY!aTiq=ri*y7dcBMXF17PG!%Mu)Lb9RlabJ$N74Sws)KAN zJ5;jWMYhvJrt&4Hz6z8{9d4b_%IPJwRF zej94GgHU&gj4MNF{H*a$A9lLqboc4>ZZ8UVQgeCeLK(;QP>;du+7LuN2*#$_n8Kyr zm(m+`^~zk_tHYNmoBD2YY;td+7eI@U8qA|zv8Qql;u*~2p~gm#+}oXn+@LJ)|Do^?$#+chJ9-NPKMHBLfZZaH-7{fys)xTs|4+} zo?03Tc53miSM~uBc9=KAd}uvaWs;SXl^XlWo|9=PMqz5|4wa0zqS)4zlJx#y?~Avh zu`%y8Ln`tr#$Z!g#)6d^x9gQPTd?NEux3;YtjNJ8x8&ieBdpk^^i0)}qW9yh%Z<7i zUR9_CA{70d+pd$-l6vGA-J&lmuxzIz3TnARS*BFjD(DeX6gKM;Q|tq-EX@kduGkdk zr_N8thESx)4b}CMVph)-=PTvPeA|4QA_hNhpH3Q((0wy07j6TiuDT_!x`p>CWu9-I zeV%t74ILToq_*fV_~D&Ct`BF>;e)0ycfC5-IhRrs!=35u@FJ)J97!_H;p{JC7W zrzE>1xg@g$_5@qNnRYbJw1`SJUBKj=Gm2*<&&ZrX&8Z$6?o8#JS@8-eK<^a{3CWx_BO%RX&boL8 zCP5fqpkE+4kRG7lugGiC(ej!k^2#2njB(oNY01+vrqS;{RF97{Cg^MFzL>mL7BJ2! zBc~)!$(%y7O8x)UTMiNL5$`wN!`}Dct*_I2(A(kN4}X1oy?eZud3V8MU&!0$UE|du z3BMTD@=Ck`c7szHesfIq%GEm!kvnefP`YQ%BG z@eO?Py$8PsosNUhX4vo82aSe3@XNQ$(e4O2+TfW_choo*JIdgjFW@-dk>|*TcfL%A z&!IX9_pxUAChrNWokY>0{-KDm}OJAG123GiL;HR$)QVjw1c-Y{} zRsCwF>ci8HzyjYl_QUYjcgWspKM4DK`|bPed+mGdm%(FSyFFxYgO-F2X@|wIy;lOS zeaGAL?74P7Ebsa3Dr6pxz;oYW*xfs1>xA#V4%>d)K3Lt`1Nnztwsu7_ zyF#uu*BZ<&)wmYB${=qNfUU(mNSyfLbHrwiXw||6++V;5^>a2`!Hf%YMr~%U;VK_@mrqX}5$dZI(5V-KeoF zhV{u3$Z#BQ$+P5I{FY3M&!Sq0azyzCHZ9*%4q=w+pwgl2SN17;l|9O3$}Y%wgp@XA z4IYOz%3?@+lqiA7d=>S-X^b{TGaO}%Vt9;k48xJeNQNVf5e$bL!x`opxeSLH!x#=V zhB6#t3}HCfVE)sMLB=3=@^e?s^-eq8uNeoXj7epL8F zenj{^?ht;F9~Sr~EIS`%}I{zk`L}uHVk^HvKk+w+jEtx9GR9 zfBHB<@)99{AI#l^QHQw?D!wTZ}TPGZ!`QjU(CWU5`L90 z6n>R2&@W)&yM%w`^Y!!D@p;0p^0~sV@;Soq^4Y@g@=oDrd57?`+%EhqpQWG0__yoZ z8E(_JG2E(iKg(Nm?q_+kzL|xGb?#?5q{G%2`q!B{_p^M4eg-=}UHDr*P3QiWPZj=@ zHwnMX8+GnixlQj!te4beHA-CMfhJfbb}r1+z+!J)PwAJrM{A3yHs%NdsGWen%*^BI=vr3~lk^BB(6=Q5n5&tW)Q zpUrTVK8s-q+$YlXX6iE;&d_HtEY^z|7U@L{3-v;V1$qI)d_A9GKo2mSu1{w;O`pba zsy>zB6nzTA$@*l5lk`apPtZ?bcs!;|Y5K?M$1$9!Ph@zkek{WY`UHmK_3;eH>C9iY zK2{&gj`Q?9hGXt5Hp6~;KZbpE_MFlC=zZ96 zmY&5hQ)kZ^Jp*5+v>wuR_MFkv^fY#ys;4qc(Nh>E>+CtBC+SJ-*r&7SjE)yic8nKD zhEP*wh!+QjcmZID*EoiF9b<^sDu#GHVu;rqhIn0Jh!+Bec(5~+b(x{0OALulCAXm;GYct2>!v&|EB-O@K^m;hQH{)Fg&6kVfeHDGsB)$i{ zPXCVKxB9mXztO*8__h8u!>{zO7=EdL$?yyP3x=QTpELYS|BT_M`lk#J>xUVBqJP5h zWBp@>AL$=4{80ap;eYl2GW-Azm1+CDufNamJ^ej~@9OU|d`EwW;oJJ#4ByhgRFgmKLlC(1iufm_6dF$WbG6DHptp1_)U+9&u)khM?n;~;CF;738$KEV%ztbKz2 z4YKwLeh_5s6MR3&+9&v4khM?n-5_h9;5$LqKEbzxtbKxS1zGz9-wd+$3BD0z?Gt=G z$l51(D9G9;_*#&)Pw>?sYoFjNLDoLOmxHW*f-ePG`vkj#tbKxALDoLO&LC@_;EO@l zKEW4)tbKyd2U+_Bp9`|~2|gQS?GtV&-wf{w-oxgZI7 zFyUpD&a+BaY0`N<={$O7O1O&})&pgSft8|uCI#-jZd*IDUSgzSBcr&T($zjUTkIx|f=vk6z75blzBWO2)jn5^AQBO7C9xq|UO zTC~&CrPGt7)6=BWY3Sr|mn4`Ix==WlnJ*+*rBgGdQ&XfI3!)Y0_b zZJ?DjCEUp^`ccDHad|ic@s!B+6_ETiS|FiD?E@%Mvm)K0NzLgJRzDkHd!>_`?UUjh zWJ+oJ>EJ(=JAD%~^fX6oRSx}RnAA8~YCMkZ*+T4$a3?k1ha$yAg%zLEqEU$%``D;_ zQsZE$(a-iYd}_Fp+w)TrZ_HB>QzKn1ftX2cgL!8+TBX&R)aa2KX*i@AsAWHzm7ZM; zS=odLHo`9-?Ol92o>FWfKSin;EYt(vu&jnJ9W%zlx7xf#>x+!&yg)YIS)2IzI1 zt$r;P`k|wTN1B-?%}izc`n6cN;;y@UR+ekouD3SSZiF{Z_#2aETBQo?UD8Y% z3T|!;P|E6=U)U7Mz2GkL zN<|K-$RiceU~qGzf4!u=mUGw9JAq3cSfxU*ROpZjJyIbJh8PSt`zH-c$oZOR&Lj6g zB$9%3slXu>q)7#|0EmQJ0qiA`)zJdPN0Of|364`4nloBCXM+=}FRb8iqBk2F@DS*&xo; z0M=EJ&Xyt#$%y zhzJrz8BgL7#EM=ek?;FP{+l67yOft9@jYH(R7g5DXy}#xnui43KPV(Avgo0UED@MqstTlLamlc#^=S0#6jUMBrk9iv$i5I8b1Y zK)=8N0{aWh7T8Ze0zVY^Ux6P8d|%*u0^b$* zj=;ACz9sNYfo}+WUEm>suL*or;41=O7Wk6DZh>6_I|aTd@CAX-3w%!CvjU$H__V-- z0-qB2B*RKB*CJJNxfbAKBK%Q-j|l7#_^`l-1pY_h0f7$+d_ds+0{08NPvE@*|IM(1 z%e6=qT&@Lpmk7U8;68!>5_pHe+Xdbx@K%Ah2)tR~UV%3Wyiwo{0pB;6DXkF7PsemkRucz)J*PEbtR;@Kk}D1a1`ACUAqm^#a!k zY!%oduvy?*folY=7T6@PQDB3>RRT{DXb98=1_iDZSTC?n;0l4u1=b3z5m+toWP!^B zo+NOoz!L>75xAJ)0%M`T1p=!CRtl^TST3+k;Cz9l0_O>wD{zj$*#c(?ED<$qFEAi*y1;1yrwW`RaI(Nj0#6WlyujlGP84{ozzG7!3mhkKtiU{hV+4*C zI7;9#0!IoQA#k|BT!F&`4iz{=;9!R3T;2%xId7kGE^mZm-ahy^6xZ?g5%NYj&)cV* z%NyaCw@*2jH^MP*pK>m5gk#=5Gn72m5g!8<8%DKD|j(Pi(b9o~i^Y$s{@|9FE5vn;etXpVYh6P3lxgr(a<&xBUg5?(1wLtsh&jv@W+!fb92^@cg&PlA(O0 zT%}Yin%pJtkV~Z>r3a;T(irkJIY7=fm;XnFyQum(lt~huq&+QF4U&aR1bFyJby9jv zxJzi1bMH8&av0{v4pIi#*n_=f%!$IqN4iFjuvkwu%8|y@cwZg*QY1`lYe8OKRs~lh-%a zW09|mYoEtExx$>>qby>!&V(GnAc$WYR6DwMBsLmY6z<~6=hB#*cvYfDSe?j)di{!3 zu^AH`0@YI6lvJBjy8;(Lf`qG}$JYw7(1Ca!j;)o^<;Rte!$vEmJlw^V&Xtjq<1_Fu z%K#c>W<4w{MQf(FIzevAtNWK9Q;r$f#!2BWu7vK$&hAmu$jw8D^gr6ldF!a#1nwXX zi#R#SqmzeWTM3i(s1vS*u8d5mlmA4rRItuysNY{>32&N>2iDw8)`8KGXIF<3a#TZ$I(P%=mJh9Pk@2!@onRVW1X~V5)nQ1h`OTt}L)f~NV%shH$ z&|gF?`ZlQouHfQVCs5PtR6wCk|QZ8iH2gJrmE+7_+i;X{31EKg)_6(A#+xIIO?8oiq4DbInu`^ximC8iMvrknP-S$Q_L%r6_VOs0$B;-I z?0`k$=>sojSsoeyxi6}lj;fuEG0xFr(78#fkd>oUp~IC-&lHEdgu?pFgjb0hrHUM- ztg57<7zRKK@+&H46<1VO!rCuPq4H2@C^}$InPw1g6I78M`8X~?+w_KBnwWQ7R;`YK z4!0x6L1V$&7gb}YF8>k+!t139>XHrq7n|Tc7N(Rbg|{!Rzut>a+v_-ks6Gs6sWwXE zX-M_gkyAbt(yEU%`L(?jxun|C&*HH3u~2Rdq+Ea9ktjiQ4Zbb*XzSOoWk%eR9(hHY zydstD*RMgkRCgWeW(|n90J4V~;($K>D%fLQZPd~GS(aDGTkY}+m%M_WC<%9Q)pbY4 zaXnTDF$`agba%6Hua{*$mXD=F-P3y-cMR2IM^4~5GtL&tZkiJ@IEdv^d8u4$ zlb5uE!cgPFmCG;FRhERTwGqwbww9An2rBvOXkN#|h-78P)BTvg>dzL)a ze#fG5R)UbvrQoJwM$AgfoXG08JWY`+RC$_Po<>h#1flxysJpo2A?^GRL~wCj@&jaT zgscr`dzlJIbWx>vuqO&gT*BF7WebvJtzYE78O=u3;*s}60i}y$^G;nxnAz79d5S7) zK3NmlryBCTX8$6@aY0=6`%AA5mtM_fd!Bu&CEsiIFXZg8*-w&Q?Hl=rd`B16l?Chbm_cGL58__ZqU6PH_)?LS+;0QtYa|E+=lt%3i) z)WBBz<^@*S(e9EK34{?Vk^C;dAD8-ksbru^{DXZy z1p5LI5A5)VWI`Nj87U)}9#DKNN}3&NmH}5S&JB^Ake^0_lw^|cQ-}rDFj5gD5y;t+ z3EdM^2}gmNP+>`uY~7acE2EL(=XxWsGn-sSLWq1nxpLtc-y?)5s#HVN95qiOIeET- z&yrk{uaitfS3$xdoTpg|`6iHnKa&hB*)uQ@7#u(zLxI_Z_=y8FQ71q1fJR(|O!9>a zNJnelxByB^q`*L>oya?K1|rdi$hfU))#85MlE9z~HDumDfjkvTk!`XX8c2vmT}#52 z%lsh~?_XL-A`aqnl%ckZd>uYt!SyQn(2}!eXR<{NT#S@_M0NR96iY_k_+-oVVOmE4 zl*H$ksln9H78nolse@&bMhNogBca@i2{kmgavt#&C>GQkQAi*}9!)1|fS@Z>@vczi zC!xT=5N&SCiIyUAZYaqQ%-@qEhgC9|os&ZTB%2Qx`*0P0zC7YjrYw|0lffeyLD+rmO5l-Ngk3&`>^ z#$L7;QCdL`3SdV_Ian;DMBOUk0NsjMjt@;40VJd*Y%OV-=s8!S;1k+4U~lv6|K&zo^^=$^dIc{0Lth^(lA8BgPRiW1`2?ptiP_9KpeswCf* zqh>7+SuP2O+so&eIRNp6hLlpD1Jy22gps0rv^dnI(0EJl$=LU+m_HkKOr4x z3J0kg+>S<3YkeUa7m_4_#g+iB3hV)A7~2N~iK1;vEW{Sdb!?R!KEI#r@%tz28oYBb z8(cz?Y7BL3EvMI!BL5z(WRB~I8d`&{usq~gqbhxUg~U&!v`+g@RIy|sK1)c&-BMHI zLM?9&peq#R%Cvp_$ORdT%(MTkH7pOZugp)bkHKMp?DwY< zOHM$B&6pVu$iVy5M}2ZiQu0+PSxJQa6L%pQo|$&`u1>)}hux ze7lnJQqdL2laB*kEyKq;ziqP6>VC&!-FcUf8 ztHR!o+eyvyxqM(mD1P!_G>#;dkfp8Ba`T*KHm1q{)6)JdFs2~}QD(zyPOFx8lbxjT{^W1Cbc~ z<^_nHa>^m}=MYir=!p>B^~}3WYFQvZ;pa4sjgcVGJJ3g?+2L2v(=_{vIOHXd)QW|t z6q9p$ZHQlsP&#y(zYb9kxTGTz9Zt%jeC+eE#Y7Wf!mvbgBL@P(?~eqbc}12(G5nzU zFAyOj=;y>)t2dXUE1VDMdX#JsYYS-)ff*=zJ~bZ+(2lgn=f@a*e24@(ST~~m%z+UG zBQ+feB@E-amJWJXOBSCk09I9()mG;#DXVCKuv7-k!+jkdnzR zCQ<$$#G9{8aIG~ZSst5h@=_v(YNUN^%2z5Nb*tNl2;+xDXET-$t9@m16jrwx>c4)yIXqg$}tl zr{@&4*B~MyUUPmd+2@em!z2GKSg+zL~H zlgRD?WH*(qm=o?2O5|B5^vpz>{wHGk14`g*!Iw{{@{J9*e8=qR$#swGo)0RTy;pp6O1$eE>$T# z`7vDHWG5G=EP5BQ*2ln#ySQ2MHVZ5L;4>iS!0XfD<4>%fsL+W&kT2Q#c{}Y z^r#8UiT_Gj?Gmx}F5h7#J9Eg+B(gJ;?4&{-m?GxND-8kO>>COdSp zV+GqYNskl5T|#dhk{*~XrGKmtU_Zjy|IbA|CXgK`ksW1h&%`|-CBW6mr8tilSQ+`5 z$4(o^6c89nc8n!EMzcLVF+1EPRLRHm?6#<_{a$2BXN3{J?~+ z&@hiv)kbc9L~K9wsHzd9eLQI&&GuCMV^O$^E15(5qeo34FF&xnpw0fz#6PU0eKKk9 zL)vpmI~4*!F@*+tUsLs+DfA&@-y`bpG%MBws1ibvfFAtE^LVD&iNpX})36$rw%G9IT;1Ov_svt<74a zuMygSa6r+;b=B1YIX$@1TfYYPmu_~3cy>vV{Vy{F_zo1vfKREQo zI#fn=_RzpWCRb07U-<^}=Yl!<(9mb=GqAA-2G*^GPC6bKamjwhIeUL#=+pIy*x17Y zGB#W{UBbg6HWDbde<~u0d00?ua`-J|M7a$o13ZtON_&AF~YM0m1q$I%ze`5mjr| zbaV!v&`?k0`zW68MC&r^iQ0*j53(X$C0!ZRGwY~;4=JDOBX%*GRzVW0ci}MW;!%qS zE46_>-xvQSY^DeO@hBt`!(i_yNGuH`}iPzc@?#<&Wb2APHh0~ZWfkh1_+Vf~&e ztm9Efg_3&86n;P-b*v`J$=UXD7kfw*hP$|~x-ulEXX0u4`$+s5JC=|lcRuwZiFcTZ z6X^1-Y@KbL=boK8o8IxbXSuGr(l;TR_jojH+$@QG5Xjb&ekJabloG@MtM*-7VO_ye zn)pS=jCUg$nbktajL0HZp>>8<=q)r_n%03^XsaiVIPWm-gc0XBYrb}z?>I5ya3%F# zMx3|7{bsKt&WN!ihGUD2I9yA;ml5YJ7DK{_Ga`FLCN?qRa6R>2Mw~an{i@SCV%!M2 zVZ;&Y=!qlF8}!Qf5ohG$k>%JTBaYBQkCU~*i1WH&j*d7ZXOEnLEi&S89ds#i#5u${ zdmnK|PKU79^pTMfN9ds^jySK0NMc5uk;B;^9dU$ydE$ukD%hSm`iL{adTi3j0VC;% zgAO88%wgFhu6w=0Vu=hB{PBkFJ;*xLI>xHjtMOdNEzT6kUXFXvd7?#XqqQ*cL{EKv&V4vPwDUJpWGiJ zT#a}q7pmq%5^~#EakBbONix#Xe?zg!ovo>Xe536^mX^m>PsWR`|CU&Np?ac z&x^{4e*THd?332V-6ypV{rbZy{9MMbj7;Evj`2%mX5oU0isDk{ti2Mhu%oS#H8QJD zR&Ew`XpDND!y_8hQ%o3-mS-aol|UGbih;p}I<@n`S~hcHW>)5)O!_z+7w(#kIPd_V zlB`_TFEWfiV?F?QA5Sf{rzWS;{!Onqj$B0GqyALybkDb*J3OmAsqSas`)`I@bv@;} z+_lJ+}ybAz#b z(+X70q)BDXt5>f?|7F3nVAj$hrTwwV^jcI7m3&5wiIsC4&s%SmW1W{VFBu!Hoa4jY zR1g}Klhrq_%NY|RmBTWyQ9QZlE=!x+XD&@1RYS$1k$lSZ9&IC~7{`J)R}0qj5q0Id zCgvJ-3R*cA+i(o0?kU5j48aCr^CnE<2r=m)Jw4N)Y9_FlAT16Lt@W%vct+flvnMBG zbJ0^%!rfFln$~U4+ZYjyXA!JN6I3_VZz#-fq_V6?e^S3mY1o|f4ETj$bRz$_DF5n) zx+wn%{Z2^329d>e%a?__sW>#!A5h)1D$}Bx@caMajDJ?C z8U4g56OYBFQpW0Vw-BNpup&PCF@KYPddJW=%A=HELSVx2*zB|fs3IX%on0HB#OR}! zpqCV4$}oP~_~WqIXc>axZYpezHt4${K7mm&WoYTq0?~VIcIAB5Mn@^j*pjgY*sQcH zb>VI*l8vOYTH=#BCR&!Gr^F_^ViJleQeJUh0GovtsUY0VrL!Gb3FGKUmJU_!SsjtF zi;ki0F*#%UVN>XN+^1YjyO+^;1d9bd_-LcCd-Rae{jfzwV=lMd%YZYS$JE<^;~q6& zR3B_~z$pxO3%Tu_QSk##E~4n4E?2;E+UiC;AM0jU7S*?`fTTHnH^W!UF|+$0Gwc{> zG(m2(n@Vn@1rkS$VTfh`^ac_}jFjw@WNfM!F{tb|B1pXBhq4F~M~vit$!XZ^V#J^# z+r9D+iSqXtF_QWvrD3yC{-$vE;7rEfH>||>p}{Ny+SA~bnm-`_pLJSasjmbZ>$InY zyQ#D{?X+jcCpd^DNW0wsnBL!XUGE(43~Z6EO9jPgY6)F;AWQ9NUDuQ2>4z=Sb%nrq z;)_HMi{r2^zMKM5}qejZbAUAI4c*^I;{o|RmRTpE@X-*pEd3Uu8b z9afTEBYduYu2Wj->c@w>xzxBi46k-n*T9^lGx|#l#`j=!xn20DY!k!XLS8&U^T^1S z7W}PNR5z6ehhTMrR+Q0?a#A&@1g)rUDhLjq1g$8eFXf?c+@@9(o|#nS8&@YNVj6wu z)iGL8Jrpr*gP3j@5XX{Ctk&e8mbV{b@ObB@j{)aX4l$Sh3XG0JJ z7YR=^XKkdh7!qbf$fH*Bghn3qkw@u_2%Z{TFr3ba#O47nL#c=%xz`yH^59tV;BdBQ zvm(ex3TvKT7V=V9ED5tB z`5U=TqF2Yyj*tV3$$@gVk1XT~Y4A8BYKXumB8bkAkOQ;Hff;NcS;*tk;B=NGuF|}m zyZ2cVa$q_+Fp=#e3wc~BoX*Y0Mugtz5fR1Al#m0%BmY>)>*gZii3@p#8?5TlXG>@; zb|jGl1IPh7V^SIJcJX_wZ_h;|tirkwlT)*zeWl$OaK%kbRyn&$=26P^Q}yFIsfu7Tga z^F7-=r+Zp4AF$lB1YY}QdZu}f^^C;RHN)ffDDGd}U%NkYzv=FBKV@~g|Kq;feY5*& z_a*ML-C_3zccXiSdx?9#yV!D;d$N11dl)o>Q``>MU#=gm#PzxBefSo5-u0O4e%HTT zH^9rl1+KGPr@LCUp2aa=%at(52xx6l`^Ec?R?nzZ|AMf zYn+#2PGXC5BkU5?JC{1koim+No#UOuodcX{)^y9e$|G=oTIY0P*5YUFOYOhf>)MOj z6WW8?o!U*>RoX?`4rP`yO&PD`D%nc1V%NgjMtA~Tshy-%zz^UwZGtueUI5cImo>+t zc<+*OtfEvH%5T2@+? z!qZ%_Ws+r#Ww0g7;(>>`FO?6J*Ocd!dzD)u5pjvK)3Fo&1J^qm9LwQ7u+&lHm;~Q} z!{p!PZ{bC6l=nyPXWnd<}nt@2hX9FR9O|PpA*6_rc@f&FZ!473#(6x$1WHO!ypJtDd5+ zP)|}9sHN&m$j6?bj#EdfgVk&`UG+kdO0xe7sg5t~AKBlrzXs2PPum~0KWM+le!Klf z`_=G0c!7PVeT)4x`#O7*JqYiEOY9Z)Irbv^RQp8x82BH|vG=j3*j;w3?N8g!@Id$} zd_%kmFA$rQlawmkOSWfikJ%oy-EF(ocAf1C+eNmsZCh-o+FCG!w8FO3R%x4KE3{3v zjkk@&1HZ2=#pbjr*59n(TR*q{7c)#RS)a8&W_{3lxAj)*Mb@*eTdb#I)@c|)kaM1mlFx{r8;)C|Se zi#V=5DDZ&5y9M4N5GH--^=n~zhapTGvE*6j&5M#S!GrVTS}*3f_Gy9t5qOWlTLr?T z6TN;dOfNBnX�!tpgm}#`7_D9ZcoW%F_-}!?34}=^b{?jK7{W9Y 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

      Utc2N#y86Yj@27+gRZYYY%F05c(Yp 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

      DGoQxbPk3=TPN$~w&IAL8c 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%0AE7^!_yR%igIc{;Or9PbGN%b2GCwVEWDQ-sC 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

    d0s?N?`46uqP+feLf9xI5foQVf;#|YU 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�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¬gfGf-lVQDnhTTsyKE=3`@kz!Vj872ml;@2?`^om%DbE`Pw``xC z^1M-S%l6qR&l`m!BV_wLDbE|lBP1xkC*^sg;Fj(4q&#mF+_HV1l;@3t)pprFJLGwz z;Fj&PL!LJZZrMI?VgbdwL!LJZa@js`UI5Ew`|ObCje@^ypB?hNQEzGCsg~ zKjVFj_cGo?__#c8RC`>WHwt(s%kN;ko$)rtTN!U*yqWMZdETh@m^^P3@CKG&&v+f< zwT#;suVK8J@hZkE8LwcxobfWot&Ep4Ucz`W<3)@YGG4%VKI3_eTNpPpp38U+zM3&z z+o}a`g7g0>gZY7v0=Ea&2Py(V|MULy;rn(7zE$51-_vS*L%rX?cdw(oQ@z4^!P;uA zu*xi#=QYnYo<(3eP`K}LALpLtcDi11UE(^-wI5jbd(L@|bDndI`JH*Axs2ZYzYV^H z6+8ZLJmfgqG1>Ul*lC;!hYV-wFX`v$OY~CMnD8QGChaQf+9F@<+0EO)+u(+9ll?w$ z`^t9FjxV5$?%IMc_uxxc^ftbF%L`5!y9P9_vg%rz7nQZO^;tm*p;lOvx8}c9W^A(lfQJZJAgmU)0%xFZV#EGG9`@ z5;U&hmxqT=8Aku$4ahC>%^rQ=z+Q(sB(4C3%ljG?E3hCPYgV)_f;Ug5EbTXC@RUU> zR>7+;TjV=F?lJxzFGRy@s+VK#N_rP*O70XV{53;KAzggs$Iu=9`}KY~`Z84Rr)!br zkrk`k;cNJvvz>@#uT#O3gc6SRqZ;YZJ`;Y&dMV#}28foF}+ zrGM>EPxzLP0lPNjwhepR1=Q2UpmCPV>{-Q*@qNd;#|Oq^C5OAV$X9#xem#%xfIS-* zf${~G*@l}4%Uh0| z*0n{RrD=@K?x~-b*uwh9_UfOI=OK7PJJM4y}$~TInPU+ZRZ@{CTr?Z|BhhaU@({$T(qFQ8OArA$LY~= z2a6oxb`)np6q_8q>drsG<9~I+O9s1ww5(5ZHpGb0kPg}FFK&6 z@n}xiXp^~J=1gsu+y*ob=SQ+OxYRSigJe?I7CfMHxBGL>=%EH@;k3gm_OP>Oup2cY zK|ZWAGr`kQle0LEDjBx*3~-^OxN8fZ*9i%Z$k;=48mcW?Fb;Y^D;!D(XMXi_q7!uR z)Xv@NY)nsT(E>R7tDlMKjP2Tjr+4ml6*v{2X7DQD1G}yG54Ngo!P7e-5!|ZMv&v7= zp6_dQXPf0i(KUi|bf3Q_$i%X`1TUC0db26uswpYb%nqJzf z0%Ot1`5Pm(x;x}a+VlM!E1Op}AJ%bDBo5nL>fvO;PU_M{jsWakLBGoa09a%_(&}Y;Fk3VqIH=ETVrl4g;kKtNaQ0fX9OIvv7G+=i1gqO|VI( zX(=37*VMcUh6aw0g^-^G%^fX$`oWv+`*dw_a9jmF;(~jC<0&qR1^a1-vtO_ugg0cS zGmeu>tk<5i?@0O;^b`G135KoC@ke{a4|(l^_>cP!^V$avTEr}Bd&**pqDadkoLmHZ zh>qJ+7LV)BB8+U|$1K8|s>jOknOowH)t=kkhCLo~@J8`5QnP=?*g3}5gpro*;_ZD$ z%g~wI`;Mm2u-r^2odm-y*NKZ3yy1M*o)nHk1+^d0%r$vG;5w<0xgT&HDcJAZ!`8XJ z0^h!e4Pi%0mCRY=NL1;ytIsjOff6`YdaYDDAfx1KQ7vs7A)I;H-XYJrgl#U;3trei zg7kN@Z|exq-|fDwDP5b_fD+!_PVL>7*5HFiD_&pG(y?$=E3H9tTOF+Qi*mf9yav=J zo&<^7bi1HN4fOQYq}|Y+QKvV{3;l=>g3Rpdo!YZ@R|jj=!i)U~62KE6cRRy%Kmx0H z=E?E&qkk~NZN}3dVXJB8X1rC9K>7sd=?|94vpsT#+ssElX5P3Q4(Y7qbaLJK^ba@V z$s-^=nVa!e%5=IXIM}l21C!>E&^l;jc@(6lf5r^ALVLE~ZYMa`Kvy0tEpmd}%tu3x z%jhKS+OzfqR|eI9ny0To*Czn!}+0D1FrP?!gpLAI+;le%% zWm>|WepK%vvjh@ou{vOFZf|PABi4cBI6@B0)nZo4$kk#}O3#%e%K^D+*;B4sx^v|) z9m2u6T14S@Gx`^4&+NXYtGhNY)Rb z97x!)q7A0v746t%DN z1b=820-l`!Sl|RZ6lB{$8hSuKEd;)Jp@obSP!dApMR>{2Fme1y;Rl$(=)Uxj2t!>#%g+iyR|tVuYQ0-4&(=-~v3-{E6bRvx9RpNDsT3%Jr5cptl`A1dUBM6` zU6+=wHqfX9lT4%=!djE5Lu6D6_yCec1x?AW0Ab*Qu23tx!Y**7is8fOgpUx68iTq5 z^+|{gZ0tb2g;H*JNDs*nZm7ADP|@JhYC|b)D|SwFLULJQsL+&_uL+M6v#?duJR$Hg zDjV1 zL|hAgLbIp>9Qg(MgxuS@9ANWK7@wz7dwn%3lnoZ#R)S(#cn%qh`G~HPUhhRB8#nACZR<;&`F68t>KivS82wgDivTZZ4&GfLg zL3>2kH-`jN(ju*{JQYc4&IuuiaAYo|m<9He)@$X?Fl7?OP!0{+E2V|{%!hmw=0ROJ zH8&i`1!9QPfI5XsFV}LR<=_GZ9SoMGfI{XVkfvMM74&>82-FvJg&Nrvo(K28ai#u^ zF#k>v$nk&rg(b|mGKJj|Fa!vd&`TwZ9fdCn8nRsy4T5k_AvBki_Y#vcEkbI+-Gu>J zn%^Gcf+=SYJ{V;fKmPw;&=sm>S9mVeo#QY^80wDL7NNwhOKDOHdNo{Wr9s65lOY7`E=ra?J4+CN@G>sFGdb zSx}S_hJaCqj1UE*PpT+zrr-}|IQXOs?^Lw;l6QX^WW5j;O%PeI0P~dvMiM2306<{s zCMSKOwL-U+f`9VL=YrUUlzjx|-3sX+;&2)nP79+;-+)=eSZPiSYhibmQ3f)soe<>R zof0X$6G?$2OY?Ihf_XYp^#yOv6A+I?6~0um84<#G&B>mp@K<5A6@Vn!g%Bb#I1!@{|;*+ z6y|PfP$1|EN!b;iv334^45egPV>c=)P4L@|f2fDbZUXf1-<>1XElf|VTl#Oaw3zm+ zv->nas`u8x!q}k+(?X`)>x$3LFJz=`{qx<}>Eqfqeo41D5{>I79Ch|C9dv{a5)n`Pch9;SK&q z^KyUGKZ(xG%ki7=-u@@P*L+XII|f(zPWK(*n{RILC4E!O!+fKBgMHaXf5YirDf z|9;AQm-k9IAMaFij`wJ9t9Q0H4weY_GQ-|Hugm(o^#PoTcb9dIb-s0?7%7ewE6mZ> z5n`crnEtSJ2%L&H$r@q#Jb(9m1SjD==DE{zmD$g84xEB_m}ibB;n~l#5B&V(bN}N0 zNWTf}7(VR2-F=PwA~^BzNO!Ayo;%^5D*kkj(tmRgbO#-#@q_WE@uYF1vDsK_EQYfW zzj3_|rykzyI@fiaYnkg{SCz;TU${zLLtP$Yt}(;;lk;=uTh3k1$Be1QXy73Wsx zna*|2C1Si7B%F>P93MKKgH!RgInH$)>u7Z}I3kV`_~EpV{)PUU{05eNm*gR=>2rqtqyiL~0tV z8!D@3r1@OpcMLY7v!c}yGNzv&a11pf$!J-1eH5JMWjTf^C&se{1+lXFn4R*8UPpft zK)9V3hxbv2E(w(s#i$3Q6o@Ac?Cy)v4tu)VtmI}Tt;>73FDO_kLR<0nkEeN$Kz z8D9FzvK}|Uv2VJ#tiHE{^FfyWomnJ~!?c{J9cjGN>T^eD_LiNLWA zM#&$^ni);gYoI0@ielQwSTi7*0o4ZqDuRvz<%~r1NS0%So~*2@Y=~A=mDLu-YH}T8 zj3iWSvZB1Hs;siQC=$^=%5{v@Svb3{thP2loi#2z6c6$1zGz)Kt|})HF3V zR3@Q$lBmw2`i8p32)0=QQ)Xdp*_@(SJjXG{7F5?Xl-12Gid6<3!)#e%R#7aL7AD?U zRi1==%*b<$<1kojGosbey0V67ZCPDemFz{|`9@tVr&`r2e=19h)&v0GrT zi`GMqpr3q`F2IiSHTDzep~&B(PF6R!wgHQ;ze}Bro#_8gfg@^^)z7Vt)YV36ppMEK zDr>5n>Z8?Awbf7>{q13n%Kst7!kYlP*R#({&Yifk-!mn~^Dwku2C`&?S%NlCx(mXE1td%9Bbq#64 ztyrJ2sw-f}y2{ z(2C%0My#V_#HKl!sQx~X{6x!eetZwCo zS?YbP%IVQ4E(kSL8st!By&9_>M@mywCCm=sKNBOf#|}hxogG3}Gt|?y7#oIw(6to0 zdREhHnh*8;G3h9{?N*#h>L94Csjr-aWtd{YuksKCv`vZ$D2Vr?WvjZPvaA|Xy%eXn zXhcn^ zzxD8_p9xcZv;;kVr3|qK3f{opRZ%WGx60P*G9h~aXs<~%H3YO*@z^Q4R{^^|gN+Dl zYOi3gj?_g;CfK5gKAA$0460;bxo%(xNMD~MXWhEG##&k*xDRPBJRe_SxxB!x*Dq7W8Up52ke3aiYRLUxAiee)%<2X4)tLqzKC}>yVLTk_R zHBje!%Y@{#4+4mGFPv_8l8BAK-a!sn!B9ara0X11Kq*S8h&5GJHQ152c^v~mA6AT_ z*l?L0DZ+1fP7cjl~ssD;@1b^ zaDyOlUtkL%%7It}l0se^(j5aRdl(+Ok6zCypfjRFC69-@ga+zr4Rz36I1P^p#X9ns4f&ks1gI!WC31 z62jd@w63}grYF6f3W8E7)nPcMuosk0E{X*Mjsn{ODF^5Vq_Lrf2317fZD3>V!gyiS zRaHh{Eup9(D#+*<-M+KrF6_r%*i!}(`>+?Z{_KdPRSbtSd9E$}e5#(|oY%1x1rW%9AFRQ|DZbdN{7M~pulM~lHy3K<12u2jF zkOQT=C?>Fjksme@%(dW>-wTUkM!+%5W4kc#=C#@meX9%JNy;%yu}U<1KJYxE|7>nF z*O&{<26LMEmO0jZ+PvL!v*#jspZ_T53Nafj`q%j8Iv;nnxN6)-!}sHvt^?c$xJSBk zT)(@%aJ}Jr+;xZRQvV2l!1piT$G(?*kNWQLUG6*6cZ{zMmbX6~-#b2XyzYyF{r~$N z*Z7JYo8c7rBOFWN4EX7eiSVtrufuKp=Iam7BR&ki;&XWa=9~b}BpwRh9K6i?GMrtX z@+|e#2G0qeVhuOGH$F6;Gydu!K^EGDx zo?^6k&-6r`6|i4nM6e+k4NeM<@~#dJ2>Rg{m&b!z;2ZBjfwuxr1?~u39yr^|38Vrm z1I>Y|z|=qi?1=c&(!4XgWBuR5o1eEB7aJ!UtBiw;8UFYD&s%?(15Lm63E15G$a>1U z!Z^`%-J7E9E{@oGVT= zzjv*2-t4dRPj+1-4imH8pSxeiu~Z9d6pm)P?YgkgF~g{VZ!tU)o2ubE(yVBGG*SyU z)`{`Zi#GqSf<*Llv1?VreJ=KpN!UYT4Gp#MrK>1bf<4Q2f$s$Dv-XX8>G%mS|J{UB zLwAZ1eG`VMkCY|L>g?O0GjX0_(d0Ss#eyGLoRJn3<&fXg(}GT%1K(FT=xJ#|Q4T>j z;sBAcg6mYAc;V}gt#As?M(CbVr5;3Vz{!whpmH+aRLXBiC*hFcyV*Hd1(HLNXOk-m zvttB?)-0@$Dt3WyBQ8f((Yi!3%F}NHP5|i=2t~6l$YxNhjlf*63r6;E9L(LfA9Yv` za5mseQc%Bt!}?WjnA5(*f`K6IhFSX)t3t{^L@RG({9=g~-G9WIs^VOG+5Bt)uT(6c|p^fr&9 zpH4T*`{A;Jy{SH0hx2}{6mOl<1fV|=i;v&LD$43AAcq0_%~*)hRMyuwM#t|fzfa=|8^ET3b*HWdYg|7FtCW@@ct}8Z?0OTfhv^~= zcPKU)4awNPs8Ulur>VTGuC9_gP@VHZ&BFWK#s(ZMb}pdh_*s%Z4D)NtA^$Fwxe3L^ zYPo?`bSTzs1Kij`UMsQ4bx`v)_-z}W4ME%D_pc^=-bD$|z-VjeKASYAQ{QZCh|ZxK zjF=vE;*hGXn+_5Dg8dp7B)I8?&N3AnUpb+WQ*g*(zW_cN7jV4Mq`WoFibg;QhMRT| zJ|@ZZ02S?SYM}|^m#TZc!8Fr_O;761x>I;!}A$Gi3Wy#74dhAG5GQA9%2IH@-tEqu54g>YK zZYM;d|B6kB-5(wQ!odlTUZZdai_Z$_n-<7_-i;i?{}X!yhNqbSp0)Zd3V4urV`p3TDC-%ys6%MgC8rzn5evo~sgj}gMMKN}w9Md@Zh{}9Iti0}yn zmFWYl?&_MR>PEOh2c6exxlV5s`3+(xKDL5Mx&|KI!YwNeYw7bOK7s+CUQbzf;Ew?E zfgs+*_j-i-1kMkzYE(jl93;QF$=DvJP9Z0BoDrq;F>E}Z(rYL1<3Z{5D8)nycq7oQ z^N93_MJpQNfn}PUfPZQmS z9SiR*umNzOerDf(;G-E_Y_v~N3xlu(0)1i!QqPtCNBkaxWq}`Js^M8G4hro`yk!JI z6n`;^9YvFTtW4f6-$nD4bYa*#*;hUYzk_|zg}%4by-utQ?&P)GIOKTpxfO3j)rcsH zt;6*Pe;ZNX^^T+v@Kl33bWsc*azY5@hUn=bCqLniX;)x)=+XAg89emdJIxK@SL3%{ z2vJuyy8-SK>dPWDr-2VV0j01oG2)kScr4X{>j8vS5(u>l?+8E!{SnJ>I44+DSr1QE zYHL?=B+%3F!4*hWa0vNiswmdZA=nKe4#PzjqAbT75PG(RdTlgqRn|tUD#lMLhPt~2 z`x4ysu>gW-H&a~QW3ni=9G7NV_rQM{IrwI%l`<|J;I|b0Y8%V(<|VcS{n!D1i^-{~ zp#|@H((7Om-VMX3E{ZM0`yXVWMR%M06I)EX8t?w9Yw%flGbTk8Le0m1#e=yh)`XQ~ zyTJEQj2WvoHVtL*=M7yLZwm5%UEASg zfm>YLTw7h|!Px>ETq)OD*Gkt?*L>F;SFJ1N3jg13{V(|Qe`MQlcfHiH%kgAydw<+Zrd?A8K3e zbdbE$X%Kceb;4CnEs)Y{+uBUBE7Z2!{1?fWnPk7Ft=0S|xtE$`zou=8`4hPpn`FPH zt;Hn!LT!sovR~7-(EL8IP1oAym}GCJZMI4FX4+<%WDlsV(fo+?YfQ2?(^hSgy_vQu z^L>&VCfS>5(@nAm)TWtaZ)W+QCfS=={)b8SW|seMl0Bg1znNrjX8Ers*_&DZi%Iro zmjBBndqB&7Hp$-1@_(2w2Y%L;E_>Z1doIgfGs&LIvR6&A=d$b-lkB-Hd)Xv=F3Vmr z$)3xy7frI~vg`$u?71x4W!{bXT=u+q7vXaz*>hR;j7j!fmOW*XJ(re$n5)pgBYUT2mOZZpG#8_fd= zo6Kp1`Q`zH{mlId` zUW6~2BM4tGhZF8HhY>z+77{*Z77(6nh6qnGhZ3G>4k0|j987q;If!t*Igqf+96*>d z`x72#<`W)k_9HyT>`QpGnMasw<|58I$jl*}YxW_WV`d{Z{$OSies2Z|zcT}b-LgeQsD5aZ{FR}m|J7OxQgC|)M~PP~K|drQ1XxJA4`c#zmdI72*7 zI9)tP7!}VFR)}W^hlr;UXKWNt5q5~3gmcA{gcV{3;XdLC!cpRJ!o9>}gu}$6gdy<= z;b8GF;Q+Cnu%CE{FjxGQFk3uG7!(f>2E_e@esLdSbZ>Dl;a=h%!V%(b!r|gB!eQc0 z!a{KeVS%`vFeGjxbctIDo#GZkhq#&05H}I(;zmME+<;i|r?{T5Qd~zE6W0>X5Zef+ zi)#><=9*U#=9pI!_A##@%r-A4%rY+{44PXB1LmcKe)AGSpLsE%*Sv_(GA|_bm=_=} z`Pw|6@Kf_V!cWXCgddxm2|qH=CH&AlhwuaQFNE)#XA{0>o<;bsxry*v^Gw2R<{5<7 zn5Pq7ZJtJWmAR4dO7m30E6h^}FE=+3US^(5xYay~@KWRpD}vf5vP)3=M4l1UK9QY*+9&dup!SJu7t}tH`vtX6Im-_GYRh%wS;$x8p7K}HQ}wIits#66J_X^USMp|9?a~TMIrNyePONSRD8fzP)b@ z%nA(gf8xK@f3&~cpXJ--I~nZ%xxxB+mv@@=ll7pr(VA@y@qFibz;lwP#uIcu;XcDX z!}TY8KRw13cjY@jb>8gka31Ki;LU-v%sFNV&YinS93l2|{N{MTah#*f_yf*zJI**j z|3iORKUq)eeY95~8*qWO95g{;=z7k0v~hr!v{03k_?z}p;!C${Rm;lymcv)WN$YTO z>h#t&GL%&?Y0{*UNu`s(6D+%-K?*RNB#mx#N0FEKQhUj8uo)<@_i*@PP;cs-GRRxokW#FB}n6J=S^P{nS``e}NiwsEq~iIXR~ zC+1JYWWjtK8m+*(Ces+*InGIZ0?B?%$?WdQ9QcBemK(u9%;r4t~1 zFh8|GmVMuh^gm2be-%WalAkbnf_uWC379Wt{@9m z1>+};FBxAt9`XPsm@o4nEhlwXVP4|>^gO_k(4^ngIes#j5$r!6GXOoci8C+)HSw}L z`+Jaqce@*)yt#AX(vV(IJgK;(xU?9O28(ou%A`v(ivMnU(p3EmP`|0Ocyh73cwjLn zK5tKnzXOTCO^H`_wybLIT(Jr*cNL7AG_GV^={Q;LL-thex6>1cmM8tD&T*5+xySV% zhe?BBvx7P53>$oJLDFwh($WTBLD8h5lA_WgNEEDf9wZZ$=A*i+D=+b8dZL|0lZ)I% zSw&pTxl&2?5@qxVY>d63z0_?Kj;g7N>ZxdHb|@Q_!7|z$sXR8r4A1N7%3zJLb2V6^ z%Nm%4dSKXWw$#hC`}1159(T*4rNKc#RD|hgmQ>8N#Pw>rqFt{=O9O)gs0o9)QEE=j z$m%QUnlR--n>4Ll0ahuGEL!R>^rJe|ZG%+bJ45~DboG|@HAPF|d=69sD|q!%DbsS^ zOX*5z1<%`$tO8E%+EOQVWVcOkj~CN*7NXTv>N`bCt)UjC2mNNI)Xg;2^+FHbX0ZQO zgcb!+4NMo-lA2?1M%i|O8tl|v-QEgD6Ty;TjvFax)a*&)d8q-x+ghPmt{fNAaa~)g zW!5qck3H8TYhVwsFWCcx>8A=*z*<(`SQ`5F=m#UB&w};q9oAtjoz1wwRRLBscQ)f7 z957_ekdg4`L{Dh+BuCM60)Z%=p(wDQq>teNgZCah9R5u7sOZ{~km|#FE&!nZG^uws zFMtJ-R;&i3YT+9&sCdv`@Fy@tq-#rD#xrnS?~*)4@o+zvbE!RlxkA*)B0#oV?8BxK|-YeP;h-iD?^3|S@G>bff>+A;JFn{TF}_ z^v~(2@A1e^fSHl=d0yfP)SuO|ssn5?0m+1}Em5gfK>aga?QvA2 z1gYw?v$I{^ZKQWje=eNFl;g)cD#%)yR76{$^0MpUVN&ES;0wYj zKLH;$J`A}q=)j#!rhU=v+KbA*s1@>B*)$tKcR5gMWKPZxX)kuq?DpggdpB`9fbKF) z>dnZ=-CwmA3mo|V61;TTWbfj`?Gp0+?xt9ib8n}|Il|ciYa$Hb17tBX2k?V%tjpcI z9l$w#hxaXjKYIZ0&rxIy;0GuQY&N?kvE%3Dh4Kc&pFM!5O7+YEd_SpoVqe|e0M5xB zl{*yv>;XJQ#*;aK@1uCIiB`0CWDMY(oRK+&@MjO;{bV$m1NdHw21lzLz&U*e^vQ=m z9>9~OUgiM4hxGn~0i2UPCVMaV;{m)cMWo{ZmR-;8cy~iYcl9-PGlH{cxnW%40ESKo z7D0F43Gc!;`?3Fkk=x)LZ!p_luuG*z=7N2v_Cj|j#CF6RDOhm_+bixwshPRr-jS{e zb(X&3mPn<{75DaZrL+|nhVcZclX)|88|r{TTbzcVeVbZfW`gB*kcBcBVB@7?<^a2u z6+6587p%7fJ)j3B_qG&Ez08u`!g`AqEMBqdux3aMEHt7;T~HdgC#9QN3Fj7^$YIsZ z2P@6v7Q;kSB$YC&<0e+Zc3sp0^$uouL1zKnfQ$tlTy}eY!-GZdMzDc=z16&G$(n^= zTsSlu##?UZkj{bdXP^`&_&vpWOu2WktUY-40L^D+$V zUa#%yYaG@L=K0W|y3x7D>~wdcdra4s(K0RnU`$KhD1qJB>maRdWXV3(+_t!1`;c}t zWj~68XPC0TmV);(?d)vNZMV!^{cYjYg2~`?_+5WWaAL3se%UXCyV1Vz+rAYPfj{8a z{T~8f1wMt}_umY>9C!|X;eRCXK;SO;jsLp9m4Qp(SN^jDrv*-e-}%=CIs@(SOaFqv zA@B^LHV}uC1g62S{S&|g9He4LV&Ob zkbUcfu-UgEvM59#dk7Mem;?-N(~XD`5pfw!)KOdq7ZhA^53ab3GU9^EIJl$ZDDI5g zd~cmwx6?@{{^t8X|L=Le=X<6J=RLP>EvM>K)$P7@st#8C70)l8AF$^CIZg<853ByK zdS3E8i*^5pJ@ zhu^tP?z7z+;Cb#ecZGWue9tYynFDj+eQt{T1otTTpUZOhbN7M=I;UH8{RSU&-?+YT zeF86ZZ@XS|y$nBePr4q(X#{&*x8p>D>)?y-GS@cO7I>pO)76BtP^(>Kt`)A6U4=NI zpujc5HOV#BHNrL6<#+XQrMMDYnoDv1;{3sR%=x+VBjh~mE^#h!&U5BFr{O$A2Og({VLUJlO7Nacpv&?bzU` zcbo>_4Xbee!6Jw5nBxdIreJ5pC`XPX%hAu#%i(i4;n(3e?YQ=h_J#I|c0_wydrf;; zJD@$OJ*qvR?a^-6Zq}~TTD8lxZQ2$stevSfX|-ClR;I1cPSy&w6SV^PgqWm_)kbK8 zH9rnkP0Rpk-K2uaHIWN`<1Y8*lOQw zKNmI*4fYy)6|5YJ>`UwmVCRr;pJtx`KZnEY+4laJ3X<$@yUosQKiR&seTkD6KCr!O zdjqE}ykL9U_PA}I?H=2mwp(%H!qwQpvfb8V+hjZ2w!v0!JIz*sy)4Uc)`f1H1K)>J zY$w=8*>Y@Iwtlu=HlNLDQ?0*Qk6XX7eqsH@dc^v+^)>6u@PhcH^-=2s);-qStv6e* zv$k3JREM^>g(j^*!~l`l|Yp`mEZnKCIq{H)Xrj8`W#oE8)9vtGXFySu|s3PK{ax|Aj^B z66?vGyh=LPT6-p66fbC35< z@2#-rxf(lWw!@xhllN@z23Yi*=B@Cqf=$mNE4JH|e@PT;ci_Ju`VXR?6a9?nQKFv` z{eA<-uUt)v_(4hz2GO`@+6Jw)_XqJJfNkmxH!Uncq&qAwABk?0FVpC@{N z=yOD$CVD5)JBZ#+^fp1uj}!fo=nq7{C;A=HZ;5_G^lPHWh<@c=#Ih^@E%?gci2h3S z7owCKEDOY4%B_-etEAj2DTm6h=&sS8j|;y15uzk#Imua0a+Y69;nxtonrIu*R-#uC zy^`o3iC##wh3ExDw-9Y0dOFd1qIE=TiLN7BLv#(%`9$XtolDeB)J4=u)In4uYA0$F zw2U-ZMj9+5t(9F*;nxxU6H%&H8P%(7Fog^vnoV>d(JZ2wMEyhu5bY;uDYbbiwR!2! z6!H_%e-S0kmQt@PrCwM10foO$^gW_)5Ph8}^}SM(yp(iN`Y?q*M06j~2Z=sFlyp=| zIx4-5LT)5_1JRvCtB6(-tsq)Xw2Wve(N%($oJI6Zq8o`e6Fr0I2BPbUHW6(kN;)ke zotBVJOGu|Bq|*}8X$k4HWG%(dBN`w&ljsbh(}_+aI+f@YqLYbEB07=i1frz<64HJN zX}^TDUqae1u~HnBsD-FPloMrw7Sq@%CLI<3NFmhn#nfktY19`Vq;Tp##nk@A)c(cP zbBeE_yQdLdL$sRcYNFKg#nke})bhnkD10%|MMO^`T1a#u(FH_ZxKCA^i87F zS6976{EI|iAo@Jf14N%A`Yh3Vi0&o2hv?lz?;?6OQR;Q8sMoEcUbm{5!p|T|y>1ot zx>eNcRy9(11JToo))TEGO1*9s^}1Em>sC>(TSeMgMS5998d*i7U={WMRV9?RnCMEP zrxIOG^c12e6J1I)nP?KxM4~>TUZM#^Nf)a~7b~f4S5n)q{7T$i`6bbR68(Z`JJBbI zK1TFWqK^=LnCL@9sUNPSez@`h3b~)?eMIjiN-e*VT7D(9{7P#1mDKVpcT=1@iQYl< zcA~ct-9_}zL~kW}3(-r7?jU*z(d|SpCc2I2MMS9$SFRwQT5@F(@zkCxml02`x{_LT zCAI2G8XYSa)7?cxPa;}KbRp3NL_s(qVEu;v9p47w1RZBf^@WkbhLtW zw1Qe`#a4=cA<-71)FvyaO;%8wte`eoF_!L*A(~5cG|^E+M-ru;w!%d`jrvnR7yPN8 z5j{%uQ=)GXJxugXqHho#Omq;@Y@!2+W)aOK>L=QlXdj}ag;Pljr}h>hMU;OLH}^bGM&6Qw6t(GA4!BziqjdR`a(iTG=Xwh?V5dL_{-h*JM7qMlhq zJ+p|~xro}f=zNNE9??xi!$i*|+Dvo<(bI|65?xEQnrJ1_GNLqB6j2W^T23J+6Q$l; zL_M~MdTGh4>eY@!83XA+%CbUe{8^t)J^PmbCivw)V+s4Nsw%-(QN60@2~|b?t%_<my2XRwWQmeYlFoW0jRc zRPk9G$E2OE5YV@4!^x;y7#-A+#_9Ix$bpsaE*0-?A+@-+d0